2

我确实找到了与此类似的其他帖子,但想了解有关 mysqldump 的这些选项的一些额外信息。我知道 --single-transaction 和 --lock-tables 是互斥的操作。以下是我关于这些选项的问题。

a) 假设我选择使用 --lock-tables 选项。在这种情况下,mysqldump 获取所有表的读锁。因此,任何其他尝试写入表的进程都将进入阻塞(等待)状态。但是如果 mysqldump 需要很长时间,正在等待的进程会继续无限期地等待吗?

例如,我尝试了这个实验——我有一个 Java (JDBC) 程序写入一个名为 MY_TEST 的 mysql 数据库表。我登录到 mysql 控制台并发出“LOCK TABLES MY_TEST READ;” 手动命令。所以Java进程被阻塞等待锁被释放。我的问题是,如果长时间没有释放读锁,是否会出现连接超时或任何此类问题?我等了两分钟,没有发现任何错误,一旦使用“UNLOCK tables”命令释放锁,java进程就会正常继续。这种行为是 java mysql 驱动程序特有的,还是我可以从使用 mysql 驱动程序的 C 程序中得到同样的结果?

b)我的第二个问题是关于 --single-transaction 选项。假设我有 10 个 InnoDB 表,其中 3 个表相互关联(使用 FK),其他表相互独立但仍在使用 InnoDB 引擎。单个事务是否仅适用于使用 FK 相互关联的 3 个表?或者我可以期望 7 个独立表的状态与 3 个相互依赖的表被转储时的状态完全相同。

4

1 回答 1

3

a.) 我相信答案是肯定的,在 mysql 级别,连接将无限期地等待 mysqldump 释放表锁。您可以通过使用带有验证查询的连接池在应用程序级别控制这一点,该查询查询锁定的表并将检索超时设置为您想要的任何内容。例如,这在 c3p0 中很容易做到。但是,在没有其他信息的情况下,我不会推荐这种方法;看起来很笨拙。我没有使用过 mysql C 驱动程序,所以我不能肯定,但我会假设与 Java 类似的行为。这就是为什么 mysqldump 对于具有大量数据和活动的系统的实时备份不是一个好的选择。

湾。所有转储的表都将作为单个事务的一部分转储,从而为参与转储的所有表生成一致的快照。主外键关系不会影响交易。使用单事务是热备份的可行选项。

于 2009-10-05T16:39:34.997 回答