内容简介:只备份innodb,用不了几个参数,记住下面几个即可,其他的没什么卵用tips:①--set-gtid-purged=OFF 如果实例开了gtid最好加上这个参数,不然备份时候会报warning,且备份出来的数据恢复到其他版本的实例上会报错:A partial dump from a server that has GTIDs is not allowed.另外,若实例开启gtid使用mysqldump时不加这个参数,备份文件中会设置不记录binlog
Ⅰ、mysqldump的简单使用与注意点
1.1 基本参数
只备份innodb,用不了几个参数,记住下面几个即可,其他的没什么卵用
-A 备份所有的database -B 备份哪几个数据库 -R 备份存储过程(-- routines) -E 备份定时任务(-- events) -d 只备份表结构 -w 备份过滤数据 -t 只备份数据 -q 直接读数据,绕过缓冲池,默认已加,防止污染缓冲池 --triggers 备份触发器 --master-data=2 在备份文件中以注释的形式记录备份开始时binlog的position,默认值是1,不注释
tips:
①--set-gtid-purged=OFF 如果实例开了gtid最好加上这个参数,不然备份时候会报warning,且备份出来的数据恢复到其他版本的实例上会报错:A partial dump from a server that has GTIDs is not allowed.另外,若实例开启gtid使用mysqldump时不加这个参数,备份文件中会设置不记录binlog
②--dump-slave,该参数可以用作在从库做备份获取主库的位置点,来做一个新从库,避免在主库做备份影响业务,带该参数备份时,从上 sql 线程会被kill,备份完再拉起
常见用法:
mysqldump --single-transaction -B test a > backup.sql 备份test库和a库 mysqldump --single-transaction test a > backup.sql 备份test库下的a表 mysqldump --single-transaction test a -w "c=12"> backup.sql
1.2 其他参数
--lock-tables(-l) 在备份中依次锁住所有表,一般用于myisam备份,备份时数据库只能提供读操作,以此来保证数据一致性,该参数和--single-transaction是互斥的,所以实例中既存在myisam又存在innodb则,只能使用该参数 --lock-all-tables(-x) 比上面的参数力度更大,备份时将整个实例锁住
1.3 重点
--single-transaction 必须加(一个事务中导出数据,确保产生一致性的备份数据)
my.cnf中配上下面配置
[mysqldump] single-transaction master-data=2
Ⅱ、
Ⅱ、实现原理剖析
2.1 开glog嗖哈一把( ^__^ )
session 1: (root@localhost) [(none)]> truncate mysql.general_log; Query OK, 0 rows affected (0.02 sec) (root@localhost) [(none)]> set global general_log = 1; Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> set global log_output = 'table'; Query OK, 0 rows affected (0.00 sec) session 2: [root@VM_0_5_centos src]# mysqldump --single-transaction --master-data=2 -B dump_test > /tmp/back.sql session 1: (root@localhost) [(none)]> set global general_log = 0; Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> set global log_output = 'file'; Query OK, 0 rows affected (0.00 sec) #拿到mysqldump线程对应操作的线程id (root@localhost) [(none)]> select thread_id,left(argument,64) from mysql.general_log; (root@localhost) [(none)]> select argument from mysql.general_log where thread_id=239 order by event_time; FLUSH /*!40101 LOCAL */ TABLES # 先把表刷一把,减少ftwrl锁的等待时间 FLUSH TABLES WITH READ LOCK # 把当前整个实例锁成只读 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ # 设置备份线程事务隔离级别为rr START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ # 开启事务 SHOW VARIABLES LIKE 'gtid\_mode' SHOW MASTER STATUS # 获得当前二进制日志位置 UNLOCK TABLES # 释放实例级别的只读锁 SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME SHOW VARIABLES LIKE 'ndbinfo\_version' dump_test SHOW CREATE DATABASE IF NOT EXISTS `dump_test` SAVEPOINT sp # 使用savepoint sp,便于回滚,用于快速释放metadata数据共享锁 show tables show table status like 'dump\_inno' SET SQL_QUOTE_SHOW_CREATE=1 SET SESSION character_set_results = 'binary' show create table `dump_inno` SET SESSION character_set_results = 'utf8' show fields from `dump_inno` show fields from `dump_inno` SELECT /*!40001 SQL_NO_CACHE */ * FROM `dump_inno` SET SESSION character_set_results = 'binary' use `dump_test` select @@collation_database SHOW TRIGGERS LIKE 'dump\_inno' SET SESSION character_set_results = 'utf8' # 以上部分备份数据 ROLLBACK TO SAVEPOINT sp RELEASE SAVEPOINT sp # 回到savepoint sp,释放metadata的锁 # 每取一张表的数据,就rollback to savepoint sp(一个savepoint就够了) root@localhost on using Socket /*!40100 SET @@SQL_MODE='' */ /*!40103 SET TIME_ZONE='+00:00' */
2.2 mysqldump流程小结
- | 操作 | 解析 |
---|---|---|
step1 | FLUSH TABLES/FLUSH TABLES WITH READ LOCK | 将实例锁成只读 |
step2 | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ/START TRANSACTION | 开启rr隔离级别的事务 |
step3 | SHOW MASTER STATUS/UNLOCK TABLES | 获取二进制日志位置并释放全局读锁 |
step4 | SAVEPOINT sp | 设置回滚点 |
step5 | SELECT xxx | 备份数据 |
step6 | ROLLBACK TO SAVEPOINT sp/RELEASE SAVEPOINT sp | 结束一张表备份,回到sp |
2.3 关键点细说
- start transaction with consistent snapshot
位置点问题:事务隔离级别是rr,开始事务,并且马上创建一个read_view,所以mysqldump备份的数据是备份开始时候的数据而不是备份结束时的数据(备份了30min,整个过程实例一直可读可写,备份的是30min之前的数据而不是30min之后的数据)
执行start transaction同时(而不是等到执行第一条sql)建立与本事务一致性读的snapshot
- --single-transaction
所有的数据都是在一个事务里面读出来,而且事务隔离级别是如rr的,所以读到的数据是一致的
一致性备份:整个备份从start transaction开始,备份所有的表,所有的表的数据都是在一个事务里面,通过select导出来
- savepoint保存点(4.1还是5.0加进来的)
savepoint很少用,真正用的最多就是备份的时候,一张表备份完,会回滚到对应保存点,此时对应备份的表上面的元数据锁都释放,这时候可以这个表可以做ddl操作
否则在一个事务里,持有元数据锁,要做ddl(比如其他线程想对这里一个表创建索引),即使备份完了也做不了,要等所有备份结束才能动
没有savepoint时,只读锁要持有整个事务时间,而不是表备份的时间
Ⅲ、实战
①备份并且压缩
mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest | pv | gzip -c > sbtest.backup.tgz
压缩过的备份恢复
gunzip < sbtest.backup.tgz |mysql
②备份并且压缩到远程服务器
mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest |gzip -c |ssh root@test-3 'cat > /tmp/sbtest.sql.gz'
备份校验,另行考虑
③备份文件使用
mysql < xxx.sql;
tips:
备份占用带宽很大,需要调度算法确保同一个集群中同时只有一个机器做备份,或者不每天做备份从而错开备份时间
以上所述就是小编给大家介绍的《浅谈mysqldump》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTTPS权威指南
[英] Ivan Risti? / 杨洋、李振宇、蒋锷、周辉、陈传文 / 人民邮电出版社 / 2016-9 / 99.00元
本书是集理论、协议细节、漏洞分析、部署建议于一体的详尽Web应用安全指南。书中具体内容包括:密码学基础,TLS协议,PKI体系及其安全性,HTTP和浏览器问题,协议漏洞;最新的攻击形式,如BEAST、CRIME、BREACH、Lucky 13等;详尽的部署建议;如何使用OpenSSL生成密钥和确认信息;如何使用Apache httpd、IIS、Nginx等进行安全配置。一起来看看 《HTTPS权威指南》 这本书的介绍吧!