博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
my07_lock-tables与single-transaction的区别
阅读量:5923 次
发布时间:2019-06-19

本文共 6885 字,大约阅读时间需要 22 分钟。

概念描述

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

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: 0mysql> select now();+---------------------+| now()               |+---------------------+| 2018-07-30 14:54:32 |+---------------------+1 row in set (0.00 sec)mysql> update sbtest10 set pad='1234567' where id=12;Query OK, 1 row affected (0.17 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> 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: 0mysql> select now();+---------------------+| now()               |+---------------------+| 2018-07-30 14:54:32 |+---------------------+1 row in set (0.00 sec)mysql> update sbtest10 set pad='1234567' where id=14;Query OK, 1 row affected (0.11 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> 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: 0mysql> select now();+---------------------+| now()               |+---------------------+| 2018-07-30 15:20:38 |+---------------------+1 row in set (0.00 sec)mysql> update sbtest31 set pad='1234567' where id=22;Query OK, 1 row affected (0.09 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> 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: 0mysql> select now();+---------------------+| now()               |+---------------------+| 2018-07-30 15:20:38 |+---------------------+1 row in set (0.00 sec)mysql> update sbtest41 set pad='1234567' where id=24;Query OK, 1 row affected (0.01 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> 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的所有表,另外一个则不会)”验证,并不严谨,但有一定参考价值。

 

转载于:https://www.cnblogs.com/perfei/p/9390685.html

你可能感兴趣的文章
(转)DOTA新版地图6.78发布:大幅改动 增两位新英雄
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
快速排序——Java
查看>>
unity游戏与我
查看>>
187. Repeated DNA Sequences
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
$resource in AngularJS
查看>>
初探django-使用uwsgi+supervisor+nginx来部署服务
查看>>
java虚拟机学习笔记 【1】
查看>>
DUBBO笔记
查看>>