mysqldump 参数--lock-tables浅析

本文通过实验证明了mysqldump命令中--lock-tables参数的效果,即在进行逻辑备份时一次性锁定整个数据库的所有表而非仅锁定当前导出的表。通过展示实验过程及结果,帮助读者理解这一参数的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysqldump有一个参数--lock-tables,以前对这个参数也没有详细了解过,直到上次有个网友问参数lock-tables 是一次性锁定当前库的所有表,还是锁定当前导出表? ,之前一直以为只是锁定当前导出表,后面看了参数说明后,

 

 

-l, --lock-tables   Lock all tables for read.

                      (Defaults to on; use --skip-lock-tables to disable.)

 

 

自己也不怎么确认了,当时就测试了一下。准备一个稍微大一点的库,如果数据库太小,那么可能mysqldum命令一下子就导出了所有库,很难清晰的看到实验结果。

 

 

 

执行下面命令做逻辑备份

 

 

[root@DB-Server ~]# mysqldump -u root -p --default-character-set=utf8  --opt --extended-insert=false --lock-tables MyDB > db_backup_MyDB.sql

Enter password:

 

 

同时立即执行下面命令 

 

mysql> show open tables where in_use >0;
+----------+--------------------------------+--------+-------------+
| Database | Table                          | In_use | Name_locked |
+----------+--------------------------------+--------+-------------+
| MyDB     | AO_60DB71_VERSION              |      1 |           0 |
| MyDB     | AO_AEFED0_TEAM_TO_MEMBER       |      1 |           0 |
| MyDB     | AO_4B00E6_STASH_SETTINGS       |      1 |           0 |
| MyDB     | AO_2D3BEA_FOLIOCF              |      1 |           0 |
| MyDB     | AO_AEFED0_TEAM_ROLE            |      1 |           0 |
| MyDB     | AO_60DB71_DETAILVIEWFIELD      |      1 |           0 |
| MyDB     | AO_60DB71_LEXORANK             |      1 |           0 |
| MyDB     | AO_6714C7_REPORT_SCHEDULE      |      1 |           0 |
| MyDB     | AO_E8B6CC_SYNC_AUDIT_LOG       |      1 |           0 |
| MyDB     | cwd_application                |      1 |           0 |
| MyDB     | clusternode                    |      1 |           0 |
| MyDB     | AO_86ED1B_GRACE_PERIOD         |      1 |           0 |
| MyDB     | AO_60DB71_WORKINGDAYS          |      1 |           0 |
| MyDB     | cwd_directory                  |      1 |           0 |
| MyDB     | AO_2D3BEA_BASELINE             |      1 |           0 |
| MyDB     | fieldlayoutitem                |      1 |           0 |
| MyDB     | JQUARTZ_BLOB_TRIGGERS          |      1 |           0 |
| MyDB     | AO_013613_HD_SCHEME_MEMBER     |      1 |           0 |
| MyDB     | AO_2D3BEA_ALLOCATION           |      1 |           0 |
| MyDB     | AO_013613_WL_SCHEME            |      1 |           0 |
| MyDB     | AO_7DEABF_EXEC_CLUSTER_MESSAGE |      1 |           0 |
....................................................................

 

clip_image001

 

如上截图,执行mysqldump命令的时候,使用show open tables where in_use >0命令,你会看到MyDB里面的所有表的In_use的值都为1,意味着是当执行mysqldump命令时,是一次性锁定当前库的所有表。而不是锁定当前导出表。

 

 

In_use

 

The number of table locks or lock requests there are for the table. For example, if one client acquires a lock for a table using LOCK TABLE t1 WRITE, In_use will be 1. If another client issues LOCK TABLE t1 WRITE while the table remains locked, the client will block waiting for the lock, but the lock request causes In_use to be 2. If the count is zero, the table is open but not currently being used. In_use is also increased by the HANDLER ... OPEN statement and decreased by HANDLER ... CLOSE.

 

 

参考资料:

 

https://dev.mysql.com/doc/refman/5.7/en/show-open-tables.html

https://oracle-base.com/articles/mysql/mysql-identify-locked-tables

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值