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秘钥免密码连接,通常不存在泄露问题
备份效果参数解释
–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
定时任务# 修改定时任务,第一次运行会提示使用哪一个编辑器,我选择2使用vimcrontab -e
编辑定时任务参数解释:
* * * * * 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