我确实找到了与此相似的其他帖子,但想要了解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个相互依赖的表被转储时的状态完全相同。
答案 0 :(得分:3)
a。)我相信答案是肯定的,在mysql级别,连接将无限期地等待mysqldump释放表锁。您可以在应用程序级别对此进行一些控制,方法是使用一个带有验证查询的连接池,该查询会查询被锁定的表并将检索超时设置为您想要的任何值。例如,在c3p0中这很容易做到。但是,在没有其他信息的情况下,我不会推荐这种方法;它看起来很笨拙。我没有使用mysql C驱动程序,所以我不能确定,但我会假设与Java类似的行为。所有这一切都是为什么mysqldump对于具有非常重要数据和活动的系统的实时备份来说不是一个好的选择。
湾转储的所有表将作为单个事务的一部分进行转储,从而为参与转储的所有表生成一致的快照。主 - 外键关系与交易无关。使用单一事务是热备份的可行选择。