当前位置:网站首页>mysqldump原理
mysqldump原理
2022-06-30 02:51:00 【PentaQwQ】
参考
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。
边栏推荐
- unity的text首列有标点符号咋办
- Global and Chinese markets for wireless security in LTE networks 2022-2028: Research Report on technology, participants, trends, market size and share
- Raki's notes on reading paper: neighborhood matching network for entity alignment
- Unity timeline data binding
- CMake教程系列-02-使用cmake代码生成二进制
- Lua 基础知识
- The rigorous judgment of ID number is accurate to the last place in the team
- Cmake tutorial series -05- options and variables
- [NPM] solve the problem of error reporting when installing typeorm with NPM
- 在php中字符串的概念是什么
猜你喜欢
Three solutions to forced hibernation of corporate computers
Implementation of Sanzi chess with C language
CMake教程系列-02-使用cmake代碼生成二進制
FAQs for code signature and driver signature
Jupyter notebook显示k线图集合
Linear algebra Chapter 3 summary of vector and vector space knowledge points (Jeff's self perception)
学术汇报(academic presentation)/PPT应该怎么做?
打造创客教育中精湛技艺
Unity TimeLine 数据绑定
Precautions for purchasing wildcard SSL certificate
随机推荐
What about punctuation in the first column of unity text
Raii memory management
Five cheapest wildcard SSL certificate brands
c#控制台格式化代码
Time complexity analysis
Sitelock nine FAQs
CMake教程系列-05-选项及变量
Redis+AOP怎么自定义注解实现限流
LeetCode 3. 无重复字符的最长子串
LeetCode 3. Longest substring without duplicate characters
How vscode debugs into standard library files / third-party package source code
自定义JvxeTable的按钮及备注下$set的用法
Precautions for purchasing wildcard SSL certificate
002 color classification
Which is a good foreign exchange trading platform? Is it safe to have regulated funds?
Unity3d ugui force refresh of layout components
FAQs for code signature and driver signature
Cmake tutorial series -05- options and variables
重看《Redis设计与实现》后记录几个要点
Jvxetable增加自定义按钮