定时自动备份 mysql 数据库


Linux 自动备份 mysql 数据库(含 docker 部署的)

此处以 docker 部署的 mysql 为例

创建备份脚本

脚本内容

首先使用 bash 命令创建一个 sh 脚本文件并赋予执行权限

touch Auto_backup.sh && chmod +x Auto_backup.sh

使用编辑器打开这个脚本,并添加以下内容:

#!/bin/bash
# 自动备份 docker mysql 数据库

# 定义备份路径
backup_dir=/Users/zdy/Desktop/mysql

# 定义备份时间
backup_time=`date +%Y_%m_%d_%H 时 %M 分 %S 秒 `

# 使用进入 mysql 容器执行 mysqldump 命令并备份数据库并将文件名更改为当前时间,此处 --databases 参数为备份多个数据库,若只有一个数据库备份,可以省略改参数
docker exec mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo | gzip > $backup_dir/backup_$backup_time.sql.gz

# 非 docker 部署时使用
# mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo | gzip > $backup_dir/backup_$backup_time.sql.gz

# 删除 7 天前的备份
find /www/mysql_backup -name "*.sql.gz" -mtime +7 | xargs rm -f
# 备用删除命令
# find $backup_dir -mtime +7 -name "*.sql.gz" -exec rm -rf {} \;

# 如果不需要压缩使用(直接备份为 SQL 文件)
# docker exec mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo  > $backup_dir/backup_$backup_time.sql
# find /www/mysql_backup -name "*.sql.gz" -mtime +7 | xargs rm -f

此时这个脚本就手动运行可以进行数据备份了,此处会提示在命令行界面上使用密码可能不安全。请注意哦!不过我一般使用 RSA 秘钥免密码连接,通常不存在泄露问题

![备份效果](定时自动备份 mysql 数据库 /backup_sql.png)

参数解释

–all-databases, -A: 备份所有数据库
–databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump 把第一个名字参数作为数据库名,后面的作为表名。使用该选项,mysqldum 把每个名字都当作为数据库名。

–force, -f:即使发现 sql 错误,仍然继续备份
–host=host_name, -h host_name:备份主机名,默认为 localhost
–no-data, -d:只导出表结构
–password[=password], -p[password]:密码
–port=port_num, -P port_num:制定 TCP/IP 连接时的端口号
–quick, -q:快速导出
–tables:覆盖 –databases or -B 选项,后面所跟参数被视作表名
–user=user_name, -u user_name:用户名
–xml, -X:导出为 xml 文件

添加定时器

定时任务命令

这时候我们再添加一个定时任务,在每天凌晨 2 时自动对数据库进行一次备份,这里会用到 Linux 的 crontab 命令了

# 查看定时任务
crontab -l

![定时任务](定时自动备份 mysql 数据库 /timer.png)

# 修改定时任务,第一次运行会提示使用哪一个编辑器,我选择 2 使用 vim
crontab -e

![编辑定时任务](定时自动备份 mysql 数据库 /edit_mission.png)

参数解释:

* * * * * commad
分 时 日 月 周 命令

1 列表示分钟 1~59, 每分钟用 * 或者 */1 表示
2 列表示小时 1~23 (0 表示 0 点)
3 列表示日期 1~31
4 列表示月份 1~12
5 列表示星期 0~6 (0 表示星期日)
6 列是要运行的命令

还原数据库命令

# 使用 mysql 命令还原数据库格式如下:
mysql -u 用户名 -p 数据库名 < 数据库名.sql

扩展操作

备份到远程服务器

将数据库备份文件再备份到另一台服务器上,如果这一台服务器出现问题,文件丢失,另一台服务器还有备份

此处主要用到 scp 命令

# 将当前备份文件复制到远程服务器
scp $backup_dir/backup_$backup_time.sql 用户名 @远程服务器: 路径 /backup_$backup_time.sql

完整配置

#!/bin/bash
# 自动备份 docker mysql 数据库

# 定义备份路径
backup_dir=/Users/zdy/Desktop/mysql

# 定义备份时间
backup_time=`date +%Y_%m_%d_%H 时 %M 分 %S 秒 `

# 使用进入 mysql 容器执行 mysqldump 命令并备份数据库并将文件名更改为当前时间,此处 --databases 参数为备份多个数据库,若只有一个数据库备份,可以省略改参数
docker exec mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo | gzip > $backup_dir/backup_$backup_time.sql.gz

# 非 docker 部署时使用
# mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo | gzip > $backup_dir/backup_$backup_time.sql.gz

# 删除 7 天前的备份
find /www/mysql_backup -name "*.sql.gz" -mtime +7 | xargs rm -f
# 备用删除命令
# find $backup_dir -mtime +7 -name "*.sql.gz" -exec rm -rf {} \;

# 如果不需要压缩使用(直接备份为 SQL 文件)
# docker exec mysql mysqldump -u 数据库用户名 -p 数据库密码 --databases waline matomo  > $backup_dir/backup_$backup_time.sql
# find /www/mysql_backup -name "*.sql" -mtime +7 | xargs rm -f

# 拷贝到远程服务器
scp $backup_dir/backup_$backup_time.sql 用户名 @远程服务器: 路径 /backup_$backup_time.sql

文章作者: 张登友
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张登友 !
  目录