概念描述

************************************************************

mysqldump进行逻辑备份时(innodb),为保证事务的一致性,会进行加锁,通常使用以下两个参数,

锁定一个schema对象中的所有表,默认开启,可保证一个库中所有表的状态一致
-l, --lock-tables Lock all tables for read.(Defaults to on; use --skip-lock-tables to disable.)

必须是innodb存储引擎,备份过程中不能出现DDL语句,使用该参数则自动关闭lock-tables参数

--single-transaction
Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to beconsistent for other storage engines. While a
--single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log position), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off --lock-tables.

补充说明:因为single-transaction 使用了“ a consistent snapshot”一致性快照,它除了在开始生成一致性快照时锁定所有表外(很小的一段时间,几秒或者更小),在后续备份到某个表时才会锁定某个表,因此它对线上业务影响小,为在线备份推荐选项

测试准备

*********************************************************************

就是设计一套测试方案,来验证一下以上的观点

两台虚拟机,分别做时间校准,red6是mysql数据库(5.7.22版本),red4是备份恢复机
[root@red6 network-scripts]# /sbin/ntpdate 182.92.12.11
30 Jul 14:40:52 ntpdate[7592]: step time server 182.92.12.11 offset 182.635092 sec
[root@red4 ~]# /sbin/ntpdate 182.92.12.11
30 Jul 14:38:04 ntpdate[10222]: adjust time server 182.92.12.11 offset 0.002791 sec

创建测试用户
create database txdb character set utf8;
create user 'automng'@'%' identified by 'Automng_123';
ALTER USER 'automng'@'%' IDENTIFIED WITH mysql_native_password BY 'Automng_123';
GRANT ALL PRIVILEGES ON *.* TO 'automng'@'%' WITH GRANT OPTION;

sysbench初始化数据,50张表,每张5万数据
sysbench --test=/opt/soft/sysbench/sysbench/tests/db/parallel_prepare.lua --oltp-tables-count=50 --oltp-table-size=50000 --num-threads=2 --mysql-table-engine=innodb --mysql-user=automng --mysql-password=Automng_123 --mysql-port=3318 --mysql-host=192.168.56.201 --mysql-db=txdb run
sysbench --test=/opt/soft/sysbench/sysbench/tests/db/parallel_prepare.lua --oltp-tables-count=50 --oltp-table-size=50000 --num-threads=2 --mysql-table-engine=innodb --mysql-user=automng --mysql-password=Automng_123 --mysql-port=3318 --mysql-host=192.168.56.201 --mysql-db=txdb cleanup

lock-tables备份语句
/usr/local/mysql/bin/mysqldump -h$host -uautomng -pAutomng_123 -P$port --log-error=$bkdir/$today_bklog --set-gtid-purged=OFF --add-drop-database --add-drop-table --flush-logs --lock-tables --triggers --routines --events --flush-privileges --master-data=2 --default-character-set=$charset $db_name > $bkdir/$today_bkfile

准备好的更新测试语句
select now();
update sbtest10 set pad='wa ka ka' where id=11;
select now();
update sbtest10 set pad='1234567' where id=12;
select now();
update sbtest10 set pad='wa ka ka' where id=13;
select now();
update sbtest10 set pad='1234567' where id=14;
select now();

single-transaction备份语句
/usr/local/mysql/bin/mysqldump -h$host -uautomng -pAutomng_123 -P$port --log-error=$bkdir/$today_bklog --set-gtid-purged=OFF --add-drop-database --add-drop-table --flush-logs --single-transaction --triggers --routines --events --flush-privileges --master-data=2 --default-character-set=$charset $db_name > $bkdir/$today_bkfile
准备好的更新测试语句
select now();
update sbtest21 set pad='wa ka ka' where id=21;
select now();
update sbtest31 set pad='1234567' where id=22;
select now();
update sbtest41 set pad='wa ka ka' where id=23;
select now();
update sbtest41 set pad='1234567' where id=24;
select now();

备份过程在脚本中进行,会自动打印出备份的起始时间

lock-tables参数测试

********************************************************

备份的起始时间
start backup txdb 2018-07-30 14:53:53
end backup 2018-07-30 14:54:32

DML语句的执行,手工复制所有语句,一次性粘贴到SQL命令行

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 14:53:58 |
+---------------------+
1 row in set (0.04 sec) mysql> update sbtest10 set pad='wa ka ka' where id=11; Query OK, 1 row affected (33.98 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 14:54:32 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest10 set pad='' where id=12;
Query OK, 1 row affected (0.17 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 14:54:32 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest10 set pad='wa ka ka' where id=13;
Query OK, 1 row affected (0.14 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 14:54:32 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest10 set pad='' where id=14;
Query OK, 1 row affected (0.11 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 14:54:32 |
+---------------------+
1 row in set (0.00 sec) mysql>
mysql>
mysql> show warnings;
Empty set (0.03 sec)

由于DML每条语句的执行几乎不耗时,而第一条语句的结束时间与备份的结束时间完全吻合。印证了以上lock-tables锁全表的观点完全。

single-transaction参数测试

*******************************************************************

备份的起止时间

start backup txdb 2018-07-30 15:20:33
end backup 2018-07-30 15:21:22

DML语句的执行,手工复制所有语句,一次性粘贴到SQL命令行

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 15:20:37 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest21 set pad='wa ka ka' where id=21;
Query OK, 1 row affected (0.35 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 15:20:38 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest31 set pad='' where id=22;
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 15:20:38 |
+---------------------+
1 row in set (0.01 sec) mysql> update sbtest41 set pad='wa ka ka' where id=23;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 15:20:38 |
+---------------------+
1 row in set (0.00 sec) mysql> update sbtest41 set pad='' where id=24;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-07-30 15:20:38 |
+---------------------+
1 row in set (0.00 sec)

33秒开始备份,37秒开始执行DML,38秒时执行完毕,DML没有被事务锁阻塞。印证了single-transaction不是锁定所有表的观点。

补充说明,该验证方法是以抽样的形式(随机测试了其中一张表),从“结论的角度(lock-tables 会锁一个schema的所有表,另外一个则不会)”验证,并不严谨,但有一定参考价值。

my07_lock-tables与single-transaction的区别的更多相关文章

  1. First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  2. java transient关键字和transaction的区别

    transient:表示临时的,不会被持久化,保存进数据库 transaction:表示事务 <div style="background: #fff; color: #0ff;&qu ...

  3. List中函数用法 First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  4. EntityFramework First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  5. [转]Wrapping multiple calls to SaveChanges() in a single transaction

    本文转自:http://www.binaryintellect.net/articles/165bb877-27ee-4efa-9fa3-40cd0cf69e49.aspx When you make ...

  6. loadrunner 中Error和failed transaction 的区别

    Down:没有运行 Pending:挂起 Init:初始化 Ready:准备就绪 Run:正在运行 Rendezvous:正在集结 Passed:运行通过 Failed:运行失败 Error:出现故障 ...

  7. sql server中index的REBUILD和REORGANIZE的区别及工作方式

    sql server中index的REBUILD和REORGANIZE 转自:https://www.cnblogs.com/flysun0311/archive/2013/12/05/3459451 ...

  8. MySQL 5.6 Reference Manual-14.3 InnoDB Transaction Model and Locking

    14.3 InnoDB Transaction Model and Locking 14.3.1 InnoDB Lock Modes 14.3.2 InnoDB Record, Gap, and Ne ...

  9. .Net系列 Transaction 事务

    Transactions 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在计算机术语中,事务通常就是指数 ...

随机推荐

  1. Unity3d 脚本与C#Socket服务器传输数据

    Test.cs脚本 ------------------------------------------------------------------------------------------ ...

  2. Zbar 大图像分析

    博客转载自:https://blog.csdn.net/sunflower_boy/article/details/50429252 为了减少处理时间,可以设定更大的扫描间距,减少不必要的解码类型,去 ...

  3. 10、R常用命令

    转载:http://www.bio-info-trainee.com/579.html 关于R语言包的一些操作,挺重要的!!! R的包(package)通常有两种:1 binary package:这 ...

  4. bzoj4391 [Usaco2015 dec]High Card Low Card

    传送门 分析 神奇的贪心,令f[i]表示前i个每次都出比对方稍微大一点的牌最多能赢几次 g[i]表示从i-n中每次出比对方稍微小一点的牌最多赢几次 ans=max(f[i]+g[i+1]) 0< ...

  5. 100725B Banal Tickets

    传送门 题目大意 有2*n个位置,这些位置有的已经填上了数,有的还没有(用?表示),现在让你在还没有填上数的填0~9中的任意数,使得前n个数的乘积等于后n个数的乘积,问有多少种方案. 分析 首先这个题 ...

  6. Python程序设计9——数据库编程

    1 数据持久化 持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件.XML数据文件中.实现数据持久化至少需要实现以下3个接口 void Save(object o):把一个对象保存到外 ...

  7. undefined reference to `clock_gettime

    下面这个错误通常是因为链接选项里漏了-lrt,但有时发现即使加了-lrt仍出现这个问题,使用nm命令一直,会发现-lrt最终指向的文件没有包含任何symbol,这个时候,可以找相应的静态库版本libr ...

  8. Sublime Text3注册码供研究使用

    文章介绍 看到文章时候感觉不错,一直用的Notepad++.文章属于转载,文末有文章来源,转载注明出处. 一. Sublime 下载地址: Sublime 3: http://www.sublimet ...

  9. oracle 逻辑体系结构详解

    以前对数据库的了解大多数是集中在mysql,最近工作里面一直使用的是oracle,虽然说在互联网行业mysql大行其道,但是一些传统行业或者是金融领域还是更加倾向于使用oracle,sqlserver ...

  10. vue入门(三)----使用vue-cli搭建一个单页富应用

    上面两节我们说了vue的一些概念,其实说的知识一点基础,这部分知识我觉得更希望大家到官网进行学习,因为在这里说的太多我觉得也只是对官网的照搬照抄而已.今天我们来学习一下vue-cli的一些基础知识,并 ...