一、不同引擎保证备份一致性内部实现不一样
1、对支持事务的引擎如InnoDB,加上--single-transaction保证数据一致性
--single-transaction参数使备份过程中,该session读到的数据都是启动备份时间点的数据。
可以理解为备份过程中的提交的事务时是看不到的,也不会备份进去。
2、对不支持事务的引擎如MyISAM,只能通过--lock-all-tables/--lock-tables锁表来保证数据一致性
(1)在刚开始的时候还会加一个数据库的读锁(FLUSH TABLES WITH READ LOCK),等开启事务后,
(2)再记录下数据库此时 binlog 的位置(showmaster status),马上解锁,再读取表的数据。
(3)等所有的数据都已经导完,就可以结束事务
二、mysqldump的--lock-tables一次性锁定当前库的所有表
使用show open tables where in_use >0命令,你会看到MyDB里面的所有表的In_use的值都为1,意味着是一次性锁定当前库的所有表。而不是锁定当前导出表。
准备一个稍微大一点的库,如果数据库太小,那么可能mysqldum命令一下子就导出了所有库,很难清晰的看到实验结果。
执行下面命令做逻辑备份
# mysqldump -u root -p --default-character-set=utf8 --opt --extended-insert=false --lock-tables MyDB > db_backup_MyDB.sql
Enter password:
同时立即执行下面命令
mysql> show open tables where in_use >0;
+----------+--------------------------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+--------------------------------+--------+-------------+
| MyDB | AO_60DB71_VERSION | 1 | 0 |
....................................................................
三、mysqldump实现导出的sql文件一行一个insert....value()
# mysqldump -uroot -p zcs0237 --skip-extended-insert
......
INSERT INTO `zcs0237` VALUES (1,32,37,38,'2016-10-18 06:19:24','susususususususususususu');
INSERT INTO `zcs0237` VALUES (2,37,46,21,'2016-10-18 06:19:24','susususususu');
INSERT INTO `zcs0237` VALUES (3,21,5,14,'2016-10-18 06:19:24','susu');
四、恢复全备后可通过之后的binlog增量恢复
1、--master-data获取在dump时候的master 的binlog文件名和position的位置(1=显示;2=注释)
当等于1时dump出来的数据,恢复在slave上是非常方便的。
# MySQLdump -u root -p --single-transaction --master-data --flush-log --database test > test.sql
--> --flush-log 表示备份开始之后的更行都切到下一个二进制日志
2、可以在备份的test.sql文件中前几行看到记录着备份当时的二进制日志信息
# vim test.sql
--CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=436263492;
---- Current Database: `test`
.....
3、通过之后的二进制日志进行恢复
# mysqlbinlog --start-position=436263492 mysql-bin.000004 > 00004.sql
五、案例:mysqldump脚本
1、vi /tmp/backup.sh
#!/bin/bash
backupdir=/backup
#备份文件后缀时间
time=_` date +%Y_%m_%d_%H_%M_%S `
/usr/local/mysql/bin/mysqldump -uroot --socket=/data/mysql/mysql.sock --port=3306 -proot --single-transaction --master-data=1 -A | gzip > $backupdir/backup$time.sql.gz
#删除7天之前的备份文件
find $backupdir -name backup*.sql.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
2、crontab -e
0 0 * * * /bin/sh /tmp/backup.sh >> "/backup/backup.log" 2>&1
六、mysqlpump支持并行
mysqlpump是MySQL5.7的官方工具,用于取代mysqldump,其参数与mysqldump基本一样。有以下提升:
1、并行备份数据库和数据库中的对象的,加快备份过程。
2、更好的控制数据库和数据库对象(表,存储过程,用户帐户)的备份。
3、备份用户账号作为帐户管理语句(CREATE USER,GRANT),而不是直接插入到MySQL的系统数据库。
4、备份出来直接生成压缩后的备份文件。
5、备份进度指示(估计值)。
6、重新加载(还原)备份文件,先建表后插入数据后建立索引,减少了索引维护开销,加快了还原速度。
7、备份可以排除或则指定数据库。
七、mydumper-myloader支持多线程
1、mydumper是针对mysql数据库备份的一个轻量级第三方的开源工具,备份速度远高于原生态的mysqldump以及众多优异特性。
2、多线程逻辑备份,导出的文件形式是每个表一个文件,对于开发测试环境的误操作恢复十分有效
3、与mysqldump相同,备份时对 MyISAM 表施加FTWRL (FLUSH TABLES WITH READ LOCK), 会阻塞DML 语句
4、保证备份数据的一致性
5、支持文件压缩,支持导出binlog,支持多线程恢复,支持将备份文件切块
6、支持以守护进程模式工作,定时快照和连续二进制日志
7、案例
(1)开启16个备份进程,备份出所有的库以及二进制日志文件
mydumper -u root -p root123 --threads=16 -o /docker/mydumper/all_backup
(2)从全备的文件夹中恢复sampson库到samp库中去:
myloader -u root -p root123 --database=samp --source-db=sampson -d /docker/mydumper/all_backup -v 3
动力小刚于2019年4月 个人邮箱:zcs0237#163.com