之前我的网站出了一次事故,就是帖子被大量灌水,总共有5000多条。我用的是MySQL数据库,虽然第一时间就发现了,并且进入 phpMyAdmin 利用SQL语句全部进行了删除清理,但毕竟还是给数据库造成了一定的破坏。我在想,要是那会有数据库的备份就好了,可以直接还原恢复。请问 MySQL 数据库的定时备份怎么做比较好?
有多种方法可以定时备份 MySQL 数据库,以下列举几种常见的方法:
1. 使用 crontab 定时任务:在 Linux 系统中可以使用 crontab 来设置定时任务,例如每天凌晨 2 点备份 MySQL 数据库。可以编写脚本来实现备份操作,然后将脚本添加到定时任务中。
2. 使用 MySQL 自带的 mysqldump 工具:mysqldump 是 MySQL 自带的备份工具,可以使用它来备份数据库。可以编写脚本来实现备份操作,然后将脚本添加到定时任务中。
3. 使用第三方备份工具:还有一些第三方备份工具可以用来备份 MySQL 数据库,例如 Percona XtraBackup、Mariabackup 等。这些工具可以通过脚本或命令来实现备份操作,然后将脚本添加到定时任务中。
以下是使用 crontab 定时任务配合 mysqldump 命令来定时备份 MySQL 数据库:
1. 编写备份脚本
使用 mysqldump 命令备份 MySQL 数据库,可以将备份脚本命名为 backup_mysql.sh,并保存到指定目录下,例如 /home/mysql_backup/backup_mysql.sh。备份脚本内容如下:
#!/bin/bash
# 备份目录
BACKUP_DIR=/home/mysql_backup
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PASSWD=123456
# 数据库名称
DB_NAME=my_db
# 备份文件名
BACKUP_FILE=mysql_$(date +%Y%m%d%H%M%S).sql
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u $DB_USER -p$DB_PASSWD $DB_NAME > $BACKUP_DIR/$BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_DIR/$BACKUP_FILE
2. 添加定时任务
使用 crontab 命令添加定时任务,例如每天凌晨 2 点备份 MySQL 数据库。在终端中执行以下命令:
crontab -e
在打开的文件中添加以下内容:
0 2 * * * /bin/bash /home/mysql_backup/backup_mysql.sh
这表示每天凌晨 2 点执行 /home/mysql_backup/backup_mysql.sh 脚本。
3. 保存并退出
保存并退出 crontab 文件即可。
以上就是使用 crontab 定时任务备份 MySQL 数据库的具体操作步骤。需要根据实际情况修改备份脚本中的参数,例如数据库用户名、密码、数据库名、备份目录等。
需要注意的是,备份 MySQL 数据库时应该选择合适的备份策略,包括全量备份、增量备份、差异备份等,以及备份的存储位置、备份文件的命名规则等。同时,备份的频率也要根据业务需求和数据量来确定。
全量备份脚本dbback.sh:
#!/bin/bash
##备份数据库脚
#MySQL User Information
HOST=127.0.0.1
USERNAME=root
PASSWORD=*****
#Date Format
DATE=date +%Y%m%d
#Back directory
DAYS=20
#备份文件存放位置
BACKUP_DIR=/data/db-backup/
#MySQL directory
MYSQL_DIR=/usr/bin/
#Go to the backup directory
if [ -d ${BACKUP_DIR} ];then
cd ${BACKUP_DIR}
else
mkdir -p ${BACKUP_DIR}
fi
#The first instance of the backup
while read dbname
do
if [ -f ${dbname}${DATE}.gz ]; then
echo "MySQL Database ${dbname}${DATE}.gz already exists."
else
${MYSQL_DIR}/mysqldump -u${USERNAME} -p${PASSWORD} -h${HOST} --default-character-set=utf8 --master-data=2 --single-transaction ${dbname} | /bin/gzip > ${BACKUP_DIR}/${dbname}_${DATE}.gz
fi
done < /opt/ly-traffic/db-backup/dbs.txt
##删除旧备份文件
find ${BACKUP_DIR} -name "*.gz" -type f -mtime +22|tee -a ${BACKUP_DIR}/del.log|xargs rm -r 2>>${BACKUP_DIR}/err.lo
exit 0
数据备份可用行测试:
gzid -d 文件名
mysql -uroot -p -h127.0.0.1 数据库 < 文件名
对于自建的数据库,没有使用云数据库的时候,就需要自己保证数据的可用性,需要及时对数据进行备份。
这里讲一下如何通过脚本,每天定时对数据库进行全量备份,并对数据文件保存14天(当然天数可以自己随意设置,根据服务器容量大小和具体要求设置)。
1、创建一个备份脚本文件,例如 backup_mysql.sh,并将以下代码复制到文件中:
#!/bin/bash
设置 MySQL 登录信息
MYSQL_USER=“your_mysql_username”
MYSQL_PASSWORD=“your_mysql_password”
MYSQL_DATABASE=“your_database_name”
BACKUP_DIR=“/path/to/backup/directory”
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H-%M-%S)
创建备份目录和文件名
mkdir -p $BACKUP_DIR/$DATE
FILENAME=$BACKUP_DIR/$DATE/$MYSQL_DATABASE-$TIME.sql.gz
使用 mysqldump 命令备份数据库
mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --databases $MYSQL_DATABASE | gzip > $FILENAME
输出备份完成信息
echo “Backup completed on $(date +%Y-%m-%d %H:%M:%S) for database $MYSQL_DATABASE to $FILENAME.”
删除超过14天的备份文件
find $BACKUP_DIR/* -mtime +14 -exec rm {} ;
2、为脚本文件添加可执行权限:
chmod +x backup_mysql.sh
3、将脚本文件添加到 crontab 中,以每天凌晨 2 点执行备份任务:
crontab -e
4、在打开的编辑器中,新增以下行:
0 2 * * * /path/to/backup_mysql.sh >/dev/null 2>&1
保存并退出编辑器。现在,脚本将在每天凌晨 2 点执行,并输出一条备份计划信息。
上面的shell脚本做了以下事情:
1.获取当前日期和时间。
2.使用 mkdir 命令创建备份目录和文件名。
3.使用 mysqldump 命令备份数据库,并将结果压缩成 gzip 格式。
4.输出一条备份完成信息。
5.使用 find 命令查找超过14天的备份文件,并将其删除。
自己做备份时,记得修改mysql的登录账号、密码,数据库,备份文件夹等信息。也可以修改备份文件保存时间。是不是很简单啊?