概念描述

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

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命令行

  1. mysql> select now();
  2. +---------------------+
  3. | now() |
  4. +---------------------+
  5. | 2018-07-30 14:53:58 |
  6. +---------------------+
  7. 1 row in set (0.04 sec)
  8.  
  9. mysql> update sbtest10 set pad='wa ka ka' where id=11;
  10.  
  11. Query OK, 1 row affected (33.98 sec)
  12. Rows matched: 1 Changed: 1 Warnings: 0
  13.  
  14. mysql> select now();
  15. +---------------------+
  16. | now() |
  17. +---------------------+
  18. | 2018-07-30 14:54:32 |
  19. +---------------------+
  20. 1 row in set (0.00 sec)
  21.  
  22. mysql> update sbtest10 set pad='' where id=12;
  23. Query OK, 1 row affected (0.17 sec)
  24. Rows matched: 1 Changed: 1 Warnings: 0
  25.  
  26. mysql> select now();
  27. +---------------------+
  28. | now() |
  29. +---------------------+
  30. | 2018-07-30 14:54:32 |
  31. +---------------------+
  32. 1 row in set (0.00 sec)
  33.  
  34. mysql> update sbtest10 set pad='wa ka ka' where id=13;
  35. Query OK, 1 row affected (0.14 sec)
  36. Rows matched: 1 Changed: 1 Warnings: 0
  37.  
  38. mysql> select now();
  39. +---------------------+
  40. | now() |
  41. +---------------------+
  42. | 2018-07-30 14:54:32 |
  43. +---------------------+
  44. 1 row in set (0.00 sec)
  45.  
  46. mysql> update sbtest10 set pad='' where id=14;
  47. Query OK, 1 row affected (0.11 sec)
  48. Rows matched: 1 Changed: 1 Warnings: 0
  49.  
  50. mysql> select now();
  51. +---------------------+
  52. | now() |
  53. +---------------------+
  54. | 2018-07-30 14:54:32 |
  55. +---------------------+
  56. 1 row in set (0.00 sec)
  57.  
  58. mysql>
  59. mysql>
  60. mysql> show warnings;
  61. 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命令行

  1. mysql> select now();
  2. +---------------------+
  3. | now() |
  4. +---------------------+
  5. | 2018-07-30 15:20:37 |
  6. +---------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> update sbtest21 set pad='wa ka ka' where id=21;
  10. Query OK, 1 row affected (0.35 sec)
  11. Rows matched: 1 Changed: 1 Warnings: 0
  12.  
  13. mysql> select now();
  14. +---------------------+
  15. | now() |
  16. +---------------------+
  17. | 2018-07-30 15:20:38 |
  18. +---------------------+
  19. 1 row in set (0.00 sec)
  20.  
  21. mysql> update sbtest31 set pad='' where id=22;
  22. Query OK, 1 row affected (0.09 sec)
  23. Rows matched: 1 Changed: 1 Warnings: 0
  24.  
  25. mysql> select now();
  26. +---------------------+
  27. | now() |
  28. +---------------------+
  29. | 2018-07-30 15:20:38 |
  30. +---------------------+
  31. 1 row in set (0.01 sec)
  32.  
  33. mysql> update sbtest41 set pad='wa ka ka' where id=23;
  34. Query OK, 1 row affected (0.07 sec)
  35. Rows matched: 1 Changed: 1 Warnings: 0
  36.  
  37. mysql> select now();
  38. +---------------------+
  39. | now() |
  40. +---------------------+
  41. | 2018-07-30 15:20:38 |
  42. +---------------------+
  43. 1 row in set (0.00 sec)
  44.  
  45. mysql> update sbtest41 set pad='' where id=24;
  46. Query OK, 1 row affected (0.01 sec)
  47. Rows matched: 1 Changed: 1 Warnings: 0
  48.  
  49. mysql> select now();
  50. +---------------------+
  51. | now() |
  52. +---------------------+
  53. | 2018-07-30 15:20:38 |
  54. +---------------------+
  55. 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. iOS  地图(自定义地位图标)

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  2. Gearman 分布式的异步任务分发框架

    What is Gearman? Gearman provides a generic application framework to farm out work to other machines ...

  3. Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList

    Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...

  4. Luogu 3267 [JLOI2016/SHOI2016]侦察守卫

    以后要记得复习鸭 BZOJ 4557 大佬的博客 状态十分好想,设$f_{x, i}$表示以覆盖完$x$为根的子树后还能向上覆盖$i$层的最小代价,$g_{x, i}$表示以$x$为根的子树下深度为$ ...

  5. PartyLocation的Post请求问题---debug

    这里,遇到了一个debug: @Override public void setPrimaryPartyLocation(PartyLocation partyLocation) { if (!get ...

  6. Python-第三方库requests详解(附requests中文官方教程)

    转自http://blog.csdn.net/cyjs1988/article/details/73294774 Python+requests中文官方教程: http://www.python-re ...

  7. 依赖注入(DI)与控制反转(IOC)

    DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,Inversion of Control )是一个意思. DI是一种通过接口实现松耦合的设计模式.初学者可能会好奇 ...

  8. passing parameter to an event handler [stackoverflow]

    Q: i want to pass my List<string> as parameter using my event public event EventHandler _newFi ...

  9. atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)

    题目链接:http://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_c 题意:给出一个含 n ...

  10. vue_cli下开发一个简单的模块权限系统之实现登录

    因为我们需要和后端数据交互,所以我们需要安装axios,安装好以后在main.js引入 v-model是标识空间,v-on:click="doLogin"是登录事件 doLogin ...