Mysql 定时备份 (基于 Dokcer 运行)

脚本编写

  • vim mysql_bak.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh

# 数据库相关配置
host=1.2.3.4
port=3306
user=root
password=123456
db_name=db

# 存放目录 (绝对路径)
backupdir=/mysqlbackup

# 保留天数
time=1

echo "开始备份数据库";

# 生成脚本
echo "mysqldump --host=$host --port=$port -u$user -p$password --extended-insert $db_name | gzip > /mysqlbackup/$db_name`date +%Y-%m-%d_%H%M%S`.sql.gz" > $backupdir/run.sh

# 赋权
sudo chmod 744 $backupdir/run.sh

# 启动 docker 运行脚本
docker run --rm -v $backupdir:/mysqlbackup mysql:5.7 /mysqlbackup/run.sh

# 删除 time 天前的备份文件, 若要改为分钟, 使用 -mmin
find $backupdir -name $db_name"*.sql.gz" -type f -mtime +$time -exec rm -rf {} \;

echo "备份完成";
  • 赋权
    • sudo chmod 744 mysql_bak.sh
  • 执行测试是否成功
    • sudo ./mysql_bak.sh
    • 查看对应目录下是否生成备份文件

配置定时任务

  • 用 crontab 定时执行备份脚本代码
    • sudo crontab -u root -eroot 身份打开编辑 crontab 的工作内容
    • 加入内容, 若要每小时 30 分时备份, 输入以下内容
      • 30 * * * * /(脚本所在路径)/mysql_bak.sh >> /(脚本所在路径)/mysql_bak.log
  • Ubuntu 系统默认是不打开 cron 日志, 需要配置:
    • 打开文件 sudo vi /etc/rsyslog.d/50-default.conf
      • 在文件中找到 cron.*,把前面的 # 去掉
      • 保存退出
    • 重新加载配置 sudo service rsyslog restart
    • 查看日志 tail -f /var/log/cron.log

其他

  • 恢复数据时, 可能会因为 sql 文件过大报错, 需要修改 max_allowed_packet 的值, 默认为 4MB

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看当前max_allowed_packet的值
    mysql> show variables like 'max_allowed_packet';

    # 数据库中临时修改(重启数据库后失效), 最大可以设置为 1G
    mysql> set global max_allowed_packet = 1 * 1024 * 1024 * 1024;

    # 需要退出保存
    mysql> exit