mysqldump主要参数探究
在数据库的日常维护中,对于数据量小的备份,我们常常采用的是逻辑备份,也就是使用mysqldump导出。数据量比较大的备份会使用percona的xtrabackup,关于xtrabackup工具的使用以及原理请参考我前面的文章xtrabackup详解,当然还有其他的方法。现在我们主要来深入看看mysqldump几个比较常用参数的原理。要需要了解mysqldump各种参数做了什么,我们需要打开查询日志来分析,打开查询日志很简单,在[mysqld]段落添加如下参数:
general_log=
general_log_file=/data/mysql/general.log
重启mysql服务器,然后我们所有的操作都会记录日志了(线上繁忙的服务器不建议开启)
两张表结构如下,一个是MyISAM,一个是InnoDB的
mysql> show create table tb1\G
*************************** 1. row ***************************
Table: tb1
Create Table: CREATE TABLE `tb1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec) mysql> show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec) mysql>
1.不加参数备份tb2表,该表是MyISAM引擎
[root@MySQL-01 mysql]# mysqldump test tb2 > /tmp/a.sql
5 Init DB test
5 Query SHOW TABLES LIKE 'tb2'
5 Query LOCK TABLES `tb2` READ /*!32311 LOCAL */
5 Query show table status like 'tb2'
5 Query SET SQL_QUOTE_SHOW_CREATE=1
5 Query SET SESSION character_set_results = 'binary'
5 Query show create table `tb2`
5 Query SET SESSION character_set_results = 'utf8'
5 Query show fields from `tb2`
5 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb2`
5 Query SET SESSION character_set_results = 'binary'
5 Query use `test`
5 Query select @@collation_database
5 Query SHOW TRIGGERS LIKE 'tb2'
5 Query SET SESSION character_set_results = 'utf8'
5 Query UNLOCK TABLES
5 Quit
可以看见不加任何参数,自动加上了LOCK TABLES READ LOCAL锁,,该锁不会阻止读,也不会阻止新的数据插入。所以不加参数的dump是非常danger。
2.--lock tables
[root@MySQL-01 mysql]# mysqldump --lock-tables test tb2 > /tmp/a.sql
6 Query SHOW TABLES LIKE 'tb2'
6 Query LOCK TABLES `tb2` READ /*!32311 LOCAL */
6 Query show table status like 'tb2'
6 Query SET SQL_QUOTE_SHOW_CREATE=1
6 Query SET SESSION character_set_results = 'binary'
6 Query show create table `tb2`
6 Query SET SESSION character_set_results = 'utf8'
6 Query show fields from `tb2`
6 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb2`
6 Query SET SESSION character_set_results = 'binary'
6 Query use `test`
6 Query select @@collation_database
6 Query SHOW TRIGGERS LIKE 'tb2'
6 Query SET SESSION character_set_results = 'utf8'
6 Query UNLOCK TABLES
6 Quit
跟默认不加参数是一样的,了LOCK TABLES READ LOCAL锁,,该锁不会阻止读,也不会阻止新的数据插入。
3.--lock-all-tables
[root@MySQL-01 mysql]# mysqldump --lock-all-tables test tb2 > /tmp/a.sql
7 Query FLUSH TABLES
7 Query FLUSH TABLES WITH READ LOCK
7 Init DB test
7 Query SHOW TABLES LIKE 'tb2'
7 Query show table status like 'tb2'
7 Query SET SQL_QUOTE_SHOW_CREATE=1
7 Query SET SESSION character_set_results = 'binary'
7 Query show create table `tb2`
7 Query SET SESSION character_set_results = 'utf8'
7 Query show fields from `tb2`
7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb2`
7 Query SET SESSION character_set_results = 'binary'
7 Query use `test`
7 Query select @@collation_database
7 Query SHOW TRIGGERS LIKE 'tb2'
7 Query SET SESSION character_set_results = 'utf8'
7 Quit
可以发现执行了flush tables(关闭所有已打开的表),它请求发起一个全局的读锁(FLUSH TABLES WITH READ LOCK)会阻止对所有表的写入操作,以此来确保数据的一致性。备份完成后,该会话断开,会自动解锁。
4.--local-all-tables --master-data=2 这里master-data=2是比较常用的,当然也可以使用1,使用1后,备份记录里面日志偏移相关的提示没有注释。
[root@MySQL-01 mysql]# mysqldump --lock-all-tables --master-data=2 test tb2 > /tmp/a.sql
10 Query /*!40100 SET @@SQL_MODE='' */
10 Query /*!40103 SET TIME_ZONE='+00:00' */
10 Query FLUSH /*!40101 LOCAL */ TABLES
10 Query FLUSH TABLES WITH READ LOCK
10 Query SHOW MASTER STATUS
10 Init DB test
10 Query SHOW TABLES LIKE 'tb2'
10 Query show table status like 'tb2'
10 Query SET SQL_QUOTE_SHOW_CREATE=1
10 Query SET SESSION character_set_results = 'binary'
10 Query show create table `tb2`
10 Query SET SESSION character_set_results = 'utf8'
10 Query show fields from `tb2`
10 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb2`
10 Query SET SESSION character_set_results = 'binary'
10 Query use `test`
10 Query select @@collation_database
10 Query SHOW TRIGGERS LIKE 'tb2'
10 Query SET SESSION character_set_results = 'utf8'
10 Quit
可以发现没什么变化,只是多执行了SHOW MASTER STATUS,我们看看备份出来的sql
[root@MySQL-01 mysql]# grep 'CHANGE MASTER TO' /tmp/a.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=959;
[root@MySQL-01 mysql]#
可以看见有记录二进制,以及日志的偏移量,这种用法在做主从的时候很实用。
5.--local-all-tables --master-data=2 --flush-logs
[root@MySQL-01 mysql]# mysqldump --lock-all-tables --master-data=2 --flush-logs test tb2 > /tmp/a.sql
17 Connect root@localhost on
17 Query /*!40100 SET @@SQL_MODE='' */
17 Query /*!40103 SET TIME_ZONE='+00:00' */
17 Query FLUSH /*!40101 LOCAL */ TABLES
17 Query FLUSH TABLES WITH READ LOCK
17 Refresh
Id Command Argument
17 Query SHOW MASTER STATUS 17 Init DB test
17 Query SHOW TABLES LIKE 'tb2'
17 Query show table status like 'tb2'
17 Query SET SQL_QUOTE_SHOW_CREATE=1
17 Query SET SESSION character_set_results = 'binary'
17 Query show create table `tb2`
17 Query SET SESSION character_set_results = 'utf8'
17 Query show fields from `tb2`
17 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb2`
17 Query SET SESSION character_set_results = 'binary'
17 Query use `test`
17 Query select @@collation_database
17 Query SHOW TRIGGERS LIKE 'tb2'
可以看见添加多一个参数flush-logs日志里面并没有明显变化,但是该命令会刷新binlog,从新产生一个新的binlog。
下面我们看看备份表tb1,该表是innodb引擎的,众所周知,innodb实现了mvcc,多版本并发控制,那么我们看看一个非常重要的参数
6. --single-transaction
mysqldump --single-transaction test tb1 > /tmp/a.sql
19 Connect root@localhost on
19 Query /*!40100 SET @@SQL_MODE='' */
19 Query /*!40103 SET TIME_ZONE='+00:00' */
19 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
19 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
19 Query UNLOCK TABLES19 Init DB test
19 Query SHOW TABLES LIKE 'tb1'
19 Query show table status like 'tb1'
19 Query SET SQL_QUOTE_SHOW_CREATE=1
19 Query SET SESSION character_set_results = 'binary'
19 Query show create table `tb1`
19 Query SET SESSION character_set_results = 'utf8'
19 Query show fields from `tb1`
19 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb1`
19 Query SET SESSION character_set_results = 'binary'
19 Query use `test`
19 Query select @@collation_database
19 Query SHOW TRIGGERS LIKE 'tb1'
19 Query SET SESSION character_set_results = 'utf8'
19 Quit
InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,可以实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ。然后启动了一个快照,实现一致性非锁定读。下面是官方给出的解释:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
The WITH CONSISTENT SNAPSHOT option 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 anyInnoDB table. See Section 14.2.7.2, “Consistent Nonlocking Reads”. The WITH CONSISTENT SNAPSHOT option does not change the current transaction isolation level, so it provides a consistent snapshot only if the current isolation level is one that permits consistent read (REPEATABLE READ or SERIALIZABLE).
7. --single-transaction and --master-data
[root@MySQL-01 mysql]# mysqldump --single-transaction --master-data=2 test tb1 > /tmp/a.sql
22 Connect root@localhost on
22 Query /*!40100 SET @@SQL_MODE='' */
22 Query /*!40103 SET TIME_ZONE='+00:00' */
22 Query FLUSH /*!40101 LOCAL */ TABLES
22 Query FLUSH TABLES WITH READ LOCK
22 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
22 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
22 Query SHOW MASTER STATUS
22 Query UNLOCK TABLES22 Init DB test
22 Query SHOW TABLES LIKE 'tb1'
22 Query show table status like 'tb1'
22 Query SET SQL_QUOTE_SHOW_CREATE=1
22 Query SET SESSION character_set_results = 'binary'
22 Query show create table `tb1`
22 Query SET SESSION character_set_results = 'utf8'
22 Query show fields from `tb1`
22 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb1`
22 Query SET SESSION character_set_results = 'binary'
22 Query use `test`
22 Query select @@collation_database
22 Query SHOW TRIGGERS LIKE 'tb1'
22 Query SET SESSION character_set_results = 'utf8
由于增加了选项 --master-data,因此看见提交一个快速的全局读锁。难道这里是为了正确的记录日志偏移量?(知道的童鞋请告知一声)
总结一下:
备份MyISAM表的参数推荐如下:
mysqldump --lock-all-tables --master-data= --flush-logs db table > /data/backup/table.sql
备份InnoDB表的参数推荐如下:
mysqldump --single-transaction --master-data= --flush-log db table > /data/backup/table.sql
当然还有很多参数,比如设置字符集等,童鞋们自行help,你懂的!
参考资料:
https://dev.mysql.com/doc/refman/5.0/en/commit.html
http://dev.mysql.com/doc/refman/5.0/en/flush.html
mysqldump主要参数探究的更多相关文章
- 【main()的参数探究】
恩...今天研究信安的课件的时候看到一段对于main(int argc,char *argv[])的编程 所以探究探究main()函数的参数 探究程序如下: #include <cstdio&g ...
- mysqldump默认参数add-drop-table
mysqldump默认参数add-drop-table 原创 2014年01月28日 11:35:18 9214 接到一个同事电话,说UAT环境上的一张表被删了,要恢复一下.原来是新项目UAT,从测试 ...
- mysqldump常用参数
mysqldump常用参数说明 --all-databases 或 -A 导出全部数据库.--all-tablespaces 或 -Y 导出全部表空间--no-tablespaces 或 -y ...
- mysqldump 一些参数体验
mysqldump -uroot -p'xxx' -R --single-transaction --master-data=2 zjzc>$TODAY_DIR/zjzc/zjzc_${TODA ...
- 关于字符串replace方法第二个参数探究
网上有关replace的文章很多了,这里主要聊聊它的第二个参数.阅读本文需要对replace方法有一定了解.W3school=>replace 我们要把一段字符串中的某些指定字符替换掉,第一时间 ...
- 数据库备份工具mysqldump重要参数详解
1. --single-transaction InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:RE ...
- mysqldump 逻辑备份的正确姿势
在上一篇文章 MySQL 命令行工具之 mysqldump 深入研究 中,我们搞定了mysqldump的参数和基本原理.那么我们该怎么样最好的使用它的?它有哪些坑呢? 1. 利用mysqldump进行 ...
- Mysqldump源码分析
版权声明:本文由王珏原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/261 来源:腾云阁 https://www.qclou ...
- Mysql导入导出工具Mysqldump和Source命令用法详解
Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...
随机推荐
- WebGIS博客文本分析(词频分析)手动扒取 去除格式 词语分割 统计分析
1. [置顶](一)开篇—杂谈WebGIS 摘要: 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 ...
- ubuntu 开机自启(2B的经历)
上午写了很细致的开机自启说明文档(需打开terminal进行输出认证).睡了一下午,回来楼主说,联想PM要用Ubuntu Server 当服务器,必须用命令行实现.. 连续各种百度谷歌,看了N多文档, ...
- 微软新一代Surface发布,参数曝光
在沉寂许久之后,Surface 2及Surface Pro 2又有猛料爆出,这一次不单单是新品展示,伴随的还有更多的详细的参数和全新配件. 从外观来看,新一代的Surface外形上沿袭了上一代,但颜色 ...
- Pyenv 安装部署
Pyenv Pyenv是个多版本Python管理器,可以同时管理多个Python版本共存, 区别于virtualenv. 安装 git clone git://github.com/yyuu/pyen ...
- 《mysql必知必会》学习_第13章_20180803_欢
第13章:分组过滤. P83 select count(*) as num_prods from products where vend_id=1003; #返回vend_id=1003的产品数目总值 ...
- SRM464
250pt 对于一个字符串,当他为colorful时满足其所有的子串的值不一样, 值的定义如下,如“236”,定义其值为2 * 3 * 6 = 36. 现题目给定字符串长度n(1 < ...
- poj 2777 线段树的区间更新
Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- CentOS使用vsftpd开启FTP服务以及配置用户
1.安装服务 #yum install vsftpd 2.配置 #vi /etc/vsftpd/vsftpd.conf # 禁止匿名访问 anonymous_enable=NO # 允许本地用户登录F ...
- 一个简单的用python 实现系统登录的http接口服务实例
用python 开发一个登录的http接口: 用户登录数据存在缓存redis里,登录时根据session判断用户是否已登录,session有效,则直接返回用户已登录,否则进mysql查询用户名及密码, ...
- 魔方Newlife.Cube权限系统的使用及模版覆盖详解
讲人:大石头 时间:2018-11-14 晚上20:00 地点:钉钉群(组织代码BKMV7685)QQ群:1600800 内容:魔方Newlife.Cube权限系统的使用及模版覆盖详解 准备 源码地址 ...