我确实找到了与此类似的其他帖子,但想要有关 mysqldump 的这些选项的一些额外信息。我知道 --single-transaction 和 --lock-tables 是互斥的操作。以下是我对这些选项的疑问。
a) 假设我选择使用 --lock-tables 选项。在这种情况下,mysqldump 获取所有表上的读锁。因此,尝试写入表的任何其他进程都将进入阻塞(等待)状态。但是如果 mysqldump 需要很长时间,正在等待的进程会继续无限期地等待吗?
例如,我尝试了这个实验 - 我有一个 Java (JDBC) 程序写入名为 MY_TEST 的 mysql 数据库表。我登录到 mysql 控制台并发出“LOCK TABLES MY_TEST READ;”手动命令。因此,Java 进程被阻塞,等待锁被释放。我的问题是,如果读锁长时间没有释放,是否会出现连接超时或任何此类问题?我等了两分钟,没有注意到任何错误,一旦使用“UNLOCK table”命令释放锁,java 进程就会正常继续。这种行为是 java mysql 驱动程序特有的吗?还是我可以期望使用 mysql 驱动程序的 C 程序也能得到同样的结果?b) 我的第二个问题是关于 --single-transaction 选项。假设我有 10 个 InnoDB 表,其中 3 个表相互关联(使用 FK),其他表独立但仍然使用 InnoDB 引擎。单个事务是否仅适用于使用 FK 相互关联的 3 个表?或者我可以期望 7 个独立表的状态与转储 3 个相互依赖的表时的状态完全相同吗?
最佳答案
a.) 我相信答案是肯定的,在 mysql 级别,连接将无限期地等待 mysqldump 释放表锁。您可以在应用程序级别对此进行一些控制,方法是使用带有验证查询的连接池,该查询针对锁定的表进行查询,并将检索超时设置为您想要的任何值。例如,在 c3p0 中这很容易做到。但是,在没有其他信息的情况下,我不会推荐这种方法;看起来很笨拙。我没有使用过 mysql C 驱动程序,所以我不能肯定,但我会假设与 Java 类似的行为。所有这些就是为什么 mysqldump 对于具有大量数据和 Activity 的系统的实时备份来说不是一个好的选择。
b.所有转储的表都将作为单个事务的一部分转储,从而为参与转储的所有表生成一致的快照。主外键关系不会对事务产生影响。使用单事务是热备份的可行选择。
关于java - --single-transaction --mysqldump 的lock-tables 选项- 内部发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513179/