# mysqldump 备份数据库的时候的添加 --single-transaction参数避免锁表

**URL:** <https://www.shiqidu.com/t/topic/431>\
**Category:** 开发调优\
**Tags:** MySQL\
**Created:** [2018 年5 月 29 日 09:33 UTC](https://www.shiqidu.com/t/topic/431 "2018-05-29T09:33:24Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![Eureka](https://www.shiqidu.com/user_avatar/www.shiqidu.com/eureka/32/5_2.png) [@Eureka](https://www.shiqidu.com/u/Eureka)\
发布日期： [2018 年5 月 29 日 09:33 UTC](https://www.shiqidu.com/t/topic/431/1 "2018-05-29T09:33:24Z")

</div>

在使用`mysqldump`备份数据库的时候发现数据无法查询了，查询资料后得知可以在执行`mysqldump`的时候会执行`FLUSH TABLES WITH READ LOCK`，这会关闭所有打开的表，同时对于所有数据库中的表都加一个读锁，直到显示地执行unlock tables，该操作常常用于数据备份的时候。

**FTWRL做了什么操作？**

FTWRL主要包括3个步骤：

1. 上全局读锁(lock\_global\_read\_lock)
2. 清理表缓存(close\_cached\_tables)
3. 上全局COMMIT锁(make\_global\_read\_lock\_block\_commit)

第一步的作用是堵塞更新，备份时，我们期望获取此时数据库的一致状态，不希望有更多的更新操作进来。对于innodb引擎而言，其自身的MVCC机制，可以保证读到老版本数据，因此第一步对它使多余的。

第二步，清理表缓存，这个操作对于myisam有意义，关闭myisam表时，会强制要求表的缓存落盘，这对于物理备份myisam表是有意义的，因为物理备份是直接拷贝物理文件。对于innodb表，则无需这样，因为innodb有自己的redolog，只要记录当时LSN，然后备份LSN以后的redolog即可。

第三步，主要是保证能获取一致性的binlog位点，这点对于myisam和innodb作用是一样的。

所以总的来说，FTWRL对于innodb引擎而言，最重要的是获取一致性位点，前面两个步骤是可有可无的，因此如果业务表全部是innodb表，这把大锁从原理上来讲是可以拆的。

所以如果你的表引擎是innodb的话，你不想在备份的时候全局读锁导致数据查询失败。你可以加上 `--single-transaction`。
