MySQL 数据库定时自动备份的最佳方法

之前我的网站出了一次事故,就是帖子被大量灌水,总共有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的登录账号、密码,数据库,备份文件夹等信息。也可以修改备份文件保存时间。是不是很简单啊?