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

  • 相关阅读:
    Android开发 使用 adb logcat 显示 Android 日志
    【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    C语言 结构体相关 函数 指针 数组
    C语言 命令行参数 函数指针 gdb调试
    C语言 指针数组 多维数组
    Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
    C语言 内存分配 地址 指针 数组 参数 实例解析
    CRT 环境变量注意事项
    hadoop 输出文件 key val 分隔符
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
  • 原文地址:https://www.cnblogs.com/perfei/p/9390685.html
Copyright © 2011-2022 走看看