参考
mysqldump常用参数用法
mysqldump一致性热备原理剖析
常用参数
-
-A/–all-databases 备份所有数据库
-
-B/–databases 备份多个库
mysqldump -uxx -pxxx -B 库名1 库名2 >xxx.sql -
–single-transaction 只用于innodb引擎,用于保证备份数据时的一致性
-
–master-data=1/2
该选项将binlog的位置和文件名写入到输出中。该选项要求有RELOAD权限,而且必须启用binlog日志。
如果选项值为1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始
如果选项值为2,CHANGE MASTER语句被写成SQL注释 -
–dump-slave=1/2 该参数用在从库端备份数据,在线搭建新的从库使用
-
–no-data/-d 只备份表结构,不备份数据
-
–complete-insert/-c 使用完整的插入语句,可以提高插入效率
不使用此参数时,插入语句类似 insert into values (?,?,?)
使用此参数时,插入语句类似 insert into (key1
,key2
) values (?,?) -
-t 只导出insert 语句
-
–where=/w 导出条件,可以限制想要导出的数据范围
-
–default-character-set 设置字符集
-
-F/–flush-logs 刷新2进制日志
-
–lock-all-tables/-x 提交请求锁定数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并自动关闭single-transaction 和–lock-tables 选项
主要操作
- 连接server
- 两次关闭所有表,第二次关闭所有表的时候加读锁
- 设置事务隔离级别为可重复读
- 获取当前binlog位置
- 解锁所有表
- 对指定的库和表进行dump
操作原理
1. 连接server
首先与服务器建立链接,初始化session以及一些session级别的参数
2. 两次关闭所有表,第二次关表同时加读锁
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
在源码中可以看到只有三种情况会进行关表操作
- 通过–lock-all-tables选项显式要求给所有的表加锁
- 通过–master-data选项要求dump出来的结果中包含binlog位置
- 通过–single-transaction指定了进行单事务的一致性备份,同时通过–flush-logs要求刷新log文件
在只有–single-transaction选项时不需要加锁,因为–single-transaction所保证的一致性备份依赖于支持事务的存储引擎比如Innodb。通过创建快照和事务id来过滤掉该事务之后所进行的数据更新。 这种方式的优势在于在进行一致性备份的同时不会影响其他事务的正常进行。但是需要依赖于事务型存储引擎。
第一次关闭所有表:
关闭所有打开的表,强制关闭所有正在使用的表,并且将所有更新的数据刷新到磁盘,这个时候不会加锁
第二次关闭所有表:
执行flush table操作,并且加一个全局读锁。
执行两次关闭所有表的原因是为了避免较长的事务导致加锁操作迟迟得不到锁,但是同时又阻塞了其他客户端操作。第一次的flush操作也是为了尽量减少第二次flush持有锁的时间。
3. 设置事务隔离级别为可重复读,开始事务并创建快照
可重复读隔离级别可以避免不可重复读和幻读。MVCC会保证在后续整个事务期间查询到的数据都是相同的,不会受到其他事务的影响。
4. 获取当前binlog位置
只有在指定–master-data选项时才会取获取binlog的信息。
获取binlog信息的方式是mysqldump执行一个show master status的查询。
5. 解锁所有表
当指定了–single-transaction指令时,在正式开始dump之前,mysqldump会把前面操作中加了锁的表全部解锁。
因为通过MVCC可以保证数据的一致性,没有必要再对这些表加锁,因此执行解锁操作,以避免其他事务的进行。
6. 对指定的库和表进行dump
dump一个表时先获取表的结构信息,获得表的创建语句,然后获取表中每行的实际数据并生成对应的insert语句。
先dump每个指定的数据库中所有的表,之后如果存在视图,则将对应视图也进行dump。