在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据。
线上数据库备份场景:
每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份.
下面对这种备份方案详细说明下:
MySQLdump增量备份配置
执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中加入
1 | log-bin=/opt/Data/MySQL-bin |
“log-bin=”后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘上。
1 | ----------------------------------------------------------------------------------- |
MySQLdump增量备份
假定星期日下午1点执行全量备份,适用于MyISAM存储引擎。
1 | mysqldump --lock-all-tables --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql |
对于InnoDB将–lock-all-tables替换为–single-transaction
–flush-logs为结束当前日志,生成新日志文件;
–master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称
用于日后恢复时参考,例如输出的备份SQL文件中含有:
1 | CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106; |
MySQLdump增量备份其他说明:
如果MySQLdump加上–delete-master-logs 则清除以前的日志,以释放空间。但是如果服务器配置为镜像的复制主服务器,用MySQLdump –delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容,在这种情况下,使用 PURGE MASTER LOGS更为安全。
每日定时使用 MySQLadmin flush-logs来创建新日志,并结束前一日志写入过程。并把前一日志备份,例如上例中开始保存数据目录下的日志文件 MySQL-bin.000002 , …
恢复完全备份
1 | mysql -u root -p < backup_sunday_1_PM.sql |
恢复增量备份
1 | mysqlbinlog MySQL-bin.000002 … | mysql -u root -p |
注意此次恢复过程亦会写入日志文件,如果数据量很大,建议先关闭日志功能
参数解释:
1 | --compatible=name |
跨主机备份
使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库:
1 | mysqldump --host=host1 --opt sourceDb| mysql --host=host2 -C targetDb |
-C 指示主机间的数据传输使用数据压缩
结合Linux的cron命令实现定时备份
比如需要在每天凌晨1:30备份某个主机上的所有数据库并压缩dump文件为gz格式:
1 | 30 1 * * * mysqldump -u root -pPASSWORD --all-databases | gzip > /mnt/disk2/database_`date '+%m-%d-%Y'`.sql.gz |
一个完整的Shell脚本备份MySQL数据库示例。
比如备份数据库opspc:
1 | [root@loacalhost ~]# vim /root/backup.sh |
mysqldump全量备份+mysqlbinlog二进制日志增量备份
1)从mysqldump备份文件恢复数据会丢失掉从备份点开始的更新数据,所以还需要结合mysqlbinlog二进制日志增量备份。
首先确保已开启binlog日志功能。在my.cnf中包含下面的配置以启用二进制日志:
1 | [mysqld] |
2)mysqldump命令必须带上–flush-logs选项以生成新的二进制日志文件:
1 | mysqldump --single-transaction --flush-logs --master-data=2 > backup.sql |
其中参数–master-data=[0|1|2]
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句
mysqldump全量+增量备份方案的具体操作可参考下面两篇文档:
数据库误删除后的数据恢复操作说明
解说mysql之binlog日志以及利用binlog日志恢复数据
-———————————————————————————————————————————————————-
shell脚本
下面分享一下自己用过的mysqldump全量和增量备份脚本
应用场景
1)增量备份在周一到周六凌晨3点,会复制mysql-bin.00000到指定目录;
2)全量备份则使用mysqldump将所有的数据库导出,每周日凌晨3点执行,并会删除上周留下的mysq-bin.00000,然后对mysql的备份操作会保留在bak.log文件中。
脚本实现:
全量备份脚本
(假设mysql登录密码为123456;注意脚本中的命令路径):
1 | vim /root/Mysql-FullyBak.sh |
1 | #!/bin/bash |
增量备份脚本
(脚本中mysql的数据存放路径是/home/mysql/data,具体根据自己的实际情况进行调整)
1 | vim /root/Mysql-DailyBak.sh |
1 |
|
设置crontab任务
执行备份脚本,先执行的是增量备份脚本,然后执行的是全量备份脚本:
1 | [root@localhost ~] |
手动执行上面两个脚本,测试下备份效果
1 | [root@localhost backup]# pwd |
先执行增量备份脚本
1 | [root@localhost backup]# sh /root/Mysql-DailyBak.sh |
然后执行全量备份脚本
1 | [root@localhost backup]# sh /root/Mysql-FullyBak.sh |