在MySQL中,写锁定所有表片刻间。

9
我需要执行一些脚本操作,可能需要一段时间(比如一分钟)。在这些操作开始之前,我会从MySQL数据库中获取一些措施,并且很重要的是在操作完成之前它们不会被改变。由于它属于一个相当老式但巨大的CMS,所以该数据库有几十个表格,而CMS用户有数十个选项来修改它。
我甚至不想在我的脚本运行期间更改任何东西,只需将其冻结即可。这不是转储或更新操作。但是应该为所有人保持表格的打开状态以供阅读,以防止连接主页的访问者出现错误。
如果在解锁数据库后触发了可能由其他CMS用户执行的数据库更改操作,那就太完美了,但如果它们失败了,我也不介意。
因此,我想在脚本开始时使用以下命令锁定表格:
lock first_table write;
lock second_table write;
...

当我完成之后

unlock tables

我认为这应该能够完美实现我的目标。但是,我能不能不明确命名所有数据库中的表格,以使其更具有未来性?

以下肯定行不通:

lock tables (select TABLE_NAME from information_schema.tables
where table_schema='whatever') write;

另一个问题是,如果有人能够随时回答这个问题,我是否需要使用与CMS使用的MYSQL用户不同的用户来执行锁定/解锁操作。如果我理解正确的话,那么是的。
1个回答

13
以下是锁定所有表的语句(实际上它创建了一个全局锁):
FLUSH TABLES WITH READ LOCK;
然后使用以下语句释放它:
UNLOCK TABLES;
例如,Mysqldump会执行此操作,除非您仅备份事务表并使用--single-transaction选项。
有关FLUSH TABLES的更多详细信息,请阅读http://dev.mysql.com/doc/refman/5.7/en/flush.html

关于您的评论:

是的,这需要对所有表进行全局读锁定。即使您自己的会话也无法写入。很抱歉忽视了您的要求。

没有等效的全局语句可以给您提供写锁定。您需要显式地按名称锁定表格。

没有通配符表名的语法,也没有将子查询放入LOCK TABLES语句的语法。

您需要获取表名列表并构建动态SQL查询。


2
是的,我知道,但它是读锁 - 据我所知,您不能将其与写锁一起使用。 - Paflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接