mysqldump的几个主要选项探究
0、前言
本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump的一些差异,为备份方式的选择提供更多的帮助。
1、mysqldump
首先来看下 mysqldump 的几个主要参数的实际工作方式。
mysqldump 几个主要选项
1. -q
很简单,什么都不做,只是导出时加了一个SQL_NO_CACHE 来确保不会读取缓存里的数据。
081022 17:39:33 7 Connect root@localhost on
7 Query /*!40100 SET @@SQL_MODE='' */
7 Init DB yejr
7 Query SHOW TABLES LIKE 'yejr'
7 Query LOCK TABLES `yejr` READ /*!32311 LOCAL */
7 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
7 Query show create table `yejr`
7 Query show fields from `yejr`
7 Query show table status like 'yejr'
7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
7 Query UNLOCK TABLES
7 Quit
7 Query /*!40100 SET @@SQL_MODE='' */
7 Init DB yejr
7 Query SHOW TABLES LIKE 'yejr'
7 Query LOCK TABLES `yejr` READ /*!32311 LOCAL */
7 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
7 Query show create table `yejr`
7 Query show fields from `yejr`
7 Query show table status like 'yejr'
7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
7 Query UNLOCK TABLES
7 Quit
2. --lock-tables
跟上面类似,不过多加了一个 READ LOCAL LOCK,该锁不会阻止读,也不会阻止新的数据插入。
081022 17:36:21 5 Connect root@localhost on
5 Query /*!40100 SET @@SQL_MODE='' */
5 Init DB yejr
5 Query SHOW TABLES LIKE 'yejr'
5 Query LOCK TABLES `yejr` READ /*!32311 LOCAL */
5 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
5 Query show create table `yejr`
5 Query show fields from `yejr`
5 Query show table status like 'yejr'
5 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
5 Query UNLOCK TABLES
5 Quit
3. --lock-all-tables
这个就有点不太一样了,它请求发起一个全局的读锁,会阻止对所有表的写入操作,以此来确保数据的一致性。备份完成后,该会话断开,会自动解锁。
081022 17:36:55 6 Connect root@localhost on
6 Query /*!40100 SET @@SQL_MODE='' */
6 Query FLUSH TABLES
6 Query FLUSH TABLES WITH READ LOCK
6 Init DB yejr
6 Query SHOW TABLES LIKE 'yejr'
6 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
6 Query show create table `yejr`
6 Query show fields from `yejr`
6 Query show table status like 'yejr'
6 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
6 Quit
4. --master-data
除了和刚才的 --lock-all-tables 多了个 SHOW MASTER STATUS 之外,没有别的变化。
081022 17:59:02 1 Connect root@localhost on
1 Query /*!40100 SET @@SQL_MODE='' */
1 Query FLUSH TABLES
1 Query FLUSH TABLES WITH READ LOCK
1 Query SHOW MASTER STATUS
1 Init DB yejr
1 Query SHOW TABLES LIKE 'yejr'
1 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
1 Query show create table `yejr`
1 Query show fields from `yejr`
1 Query show table status like 'yejr'
1 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
1 Quit
5. --single-transaction
InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。
081022 17:23:35 1 Connect root@localhost on
1 Query /*!40100 SET @@SQL_MODE='' */
1 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
1 Query BEGIN
1 Query UNLOCK TABLES
1 Init DB yejr
1 Query SHOW TABLES LIKE 'yejr'
1 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
1 Query show create table `yejr`
1 Query show fields from `yejr`
1 Query show table status like 'yejr'
1 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
1 Quit
6. --single-transaction and --master-data
本例中,由于增加了选项 --master-data,因此还需要提交一个快速的全局读锁。在这里,可以看到和上面的不同之处在于少了发起 BEGIN 来显式声明事务的开始。这里采用 START TRANSACTION WITH CONSISTENT SNAPSHOT 来代替 BEGIN的做法的缘故不是太了解,可以看看源代码来分析下。
081022 17:27:07 2 Connect root@localhost on
2 Query /*!40100 SET @@SQL_MODE='' */
2 Query FLUSH TABLES
2 Query FLUSH TABLES WITH READ LOCK
2 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2 Query START TRANSACTION WITH CONSISTENT SNAPSHOT
2 Query SHOW MASTER STATUS
2 Query UNLOCK TABLES
2 Init DB yejr
2 Query SHOW TABLES LIKE 'yejr'
2 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
2 Query show create table `yejr`
2 Query show fields from `yejr`
2 Query show table status like 'yejr'
2 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
2 Quit
关于隔离级别可以看手册 13.2.10.3. InnoDB and TRANSACTION ISOLATION LEVEL,或者本站之前的文章:[InnoDB系列]
- 实例解析Innodb的隔离级别以及锁模式。
关于 START TRANSACTION WITH CONSISTENT SNAPSHOT 的说明可以看下手册描述:
The WITH CONSISTENT SNAPSHOT clause starts a consistent read for storage engines that are capable of it. This applies only to InnoDB. The effect is the same as issuing a START TRANSACTION followed by a SELECT from any InnoDB table. See Section 13.2.10.4, “Consistent Non-Locking Read”. The WITH CONSISTENT SNAPSHOT clause does not change the current transaction isolation level, so it provides a consistent snapshot only if the current isolation level is one that allows consistent read (REPEATABLE READ or SERIALIZABLE).
12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax
2. mysqldump 和 mk-parralel-dump 的比较
mk-parralel-dump 是开源项目 Maatkit 中的一个工具,主要由 Baron Schwartz 维护。
mk-parralel-dump 是由 perl 开发的,可以实现并发的导出数据表。具体的功能不细说,自己去看相关文档吧。这里只列出在我的环境下和 mysqldump 的对比数据。
2.1 mysqldump 常规使用
#导出耗时
time mysqldump -f --single-transaction -B yejr --tables yejr | gzip > /home/databak/yejr.sql.gz
real 10m15.319s
user 6m47.946s
sys 0m38.496s
#文件大小
608M /home/databak/yejr.sql.gz
#导出期间系统负载
05:00:01 PM all 0.71 0.00 0.61 7.33 91.36
05:10:02 PM all 13.93 0.00 2.21 4.64 79.22
2.2 mysqldump + gzip --fast
#导出耗时
time mysqldump -f --single-transaction -B yejr --tables yejr | gzip --fast > /home/databak/yejr_fast.sql.gz
real 9m6.248s
user 4m21.467s
sys 0m37.604s
#文件大小
815M Oct 21 17:33 /home/databak/yejr_fast.sql.gz
#导出期间系统负载
05:20:01 PM all 11.94 0.00 2.43 5.69 79.94
05:30:01 PM all 6.46 0.00 1.57 3.95 88.02
2.3 mk-parallel-dump 常规使用
time ./mk-parallel-dump --database yejr --tables yejr --basedir /home/databak/
default: 25 tables, 25 chunks, 25 successes, 0 failures, 404.93 wall-clock time, 613.25 dump time
real 6m48.763s
user 4m20.724s
sys 0m38.125s
#文件大小
819M /home/databak/default/yejr/
#导出期间系统负载
05:10:02 PM all 13.93 0.00 2.21 4.64 79.22
05:20:01 PM all 11.94 0.00 2.43 5.69 79.94
可以看到,mk-parallel-dump 尽快确实实现了并发导出,速度相对快多了,却有个致命伤:那就是它不支持InnoDB的一致性备份,目前已经有人提交相关代码了,不过还没实现,期待中。
mysqldump的几个主要选项探究的更多相关文章
- mysqldump备份时,--master-data选项的作用是什么?
需求描述: 今天在研究mysql的备份和恢复,使用mysqldump备份数据库时,用到--master-data选项, 在此,测试并记录选项的作用 测试过程: 1.不使用--master-data进行 ...
- /dev/mem同步写不能使用msync的MS_SYNC选项探究
问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性:铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用m ...
- MySQL--当mysqldump --single-transaction遇到alter table
部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢? 在mysq ...
- MySQL--当mysqldump --single-transaction遇到alter table(1)
部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢? ##=== ...
- MySQL mysqldump数据导出详解
介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明 ...
- MySQL数据库备份--mysqldump用法
导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将被导出. ...
- PHP定时备份MySQL,mysqldump语法大全
几个常用操作: 1.备份 # 只导出表结构 d:/PHP/xampp/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p123456 snsgou_sns ...
- 【摘】Mysql备份还原数据库之mysqldump实例及参数详细说明
原文http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html 我们在运营项目的过程中肯定会遇到备份数据库,还原数据库的情况,我们一 ...
- mysqldump 逻辑备份的正确姿势
在上一篇文章 MySQL 命令行工具之 mysqldump 深入研究 中,我们搞定了mysqldump的参数和基本原理.那么我们该怎么样最好的使用它的?它有哪些坑呢? 1. 利用mysqldump进行 ...
随机推荐
- hdu 1130 How Many Trees?(Catalan数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- NOIWC颓废记
NOIWC大概就干了3件事情:吃.睡.浪. 吃: 目测绍兴一中的饭比二中的好吃多了,每天都有挺多的肉菜,还有一些甜品,而且是自助,不错的,但是一个不好的是排队时间太长了,于是我这么珍惜时间急着回宿舍的 ...
- LCT模板(BZOJ2631)
用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和. #include <cstdio> #include <algorithm> #define l(x) ...
- [ Java学习基础 ] Java构造函数
构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...
- Python中模块之xml的讲解
xml模块的功能介绍 这里主要讲解xml模块下的etree.ElementTree类. 1. 创建 具体代码如下 import xml.etree.ElementTree as XM namelist ...
- Tinychain 是比特币的一个简易口袋实现
Putting the rough in "rough consensus" Tinychain is a pocket-sized implementation of Bitco ...
- Database Design Guidelines
Database Design Guidelines Principles Support popular databases Name Style Table Name Style: Pascal ...
- RabbitMQ日志无法禁用问题
最近使用spring+rabbitmq发现其Debug日志非常多,几天就把服务器磁盘弄爆了. 原来rabbitmq依赖logback.xml输出日志. 在和log4j.properties同目录下加一 ...
- Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)
Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyze ...
- markdowm写博客测试
markdowm测试文档 #include <bits/stdc++.h> using namespace std; int main() { printf("Hello Wor ...