zoukankan      html  css  js  c++  java
  • my07_lock-tables与single-transaction的区别

    概念描述

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

    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='1234567' 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='1234567' 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='1234567' 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='1234567' 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的所有表,另外一个则不会)”验证,并不严谨,但有一定参考价值。

  • 相关阅读:
    QT 图形视图框架
    QSting, QChar, char等的转换
    ucosii(2.89)mbox 应用要点
    ucosii(2.89)semaphore 应用要点
    ucosii(2.89)mutex 应用要点
    ucosii(2.89) 在Lpc1765移植中定时器的使用。
    c++中虚函数的需要性,虚析构函数的必要性
    转 在Qt中用QAxObject来操作Excel
    关于 QObject 类
    关于sigleton模式
  • 原文地址:https://www.cnblogs.com/perfei/p/9390685.html
Copyright © 2011-2022 走看看