我需要执行一些脚本操作,这可能需要一段时间(比如可能一分钟).在这些操作开始时,我从MySQL数据库中采取了一些措施,重要的是它们在操作完成之前不会更改.数据库有几十个表,因为它属于一个非常老式但却很庞大的CMS,CMS用户有十几个选项来修改它.
我自己甚至不想在我的脚本在DB中运行时更改任何内容,它只是被冻结.这不是转储或更新.但是表格应该保持开放以供所有人阅读,以防止所连接主页的访问者收到错误.
如果数据库更改操作(同时可能由其他CMS用户执行)将在DB再次解锁后触发,那将是完美的,但如果它们失败,我不介意.
所以我想在脚本的开头我把表锁定了
lock first_table write;
lock second_table write;
...
Run Code Online (Sandbox Code Playgroud)
在我做完之后
unlock tables
Run Code Online (Sandbox Code Playgroud)
我认为这应该完全符合我的要求.但是我可以为db的所有表存档这些而不明确命名它们,以使其更具未来性吗?
这不能确定:
lock tables (select TABLE_NAME from information_schema.tables
where table_schema='whatever') write;
Run Code Online (Sandbox Code Playgroud)
另一个问题是,如果有人可以动态回答这个问题,那么我是否必须使用另一个MYSQL用户来锁定/解锁,而不是CMS使用的用户.如果我理解这一点,那么是的.
Bil*_*win 10
下面是锁定所有表的语句(实际上它创建了一个全局锁):
FLUSH TABLES WITH READ LOCK;
然后释放它:
UNLOCK TABLES;
例如,除非您只备份事务表并使用--single-transaction选项,否则Mysqldump会执行此操作.
有关详细信息,请阅读http://dev.mysql.com/doc/refman/5.7/en/flush.htmlFLUSH TABLES.
你的评论:
是的,这会在所有表上进行全局READ LOCK.即使是你自己的会话也无法写.我很抱歉忽略了你的要求.
没有等效的全局语句可以为您提供写锁定.您必须明确地按名称锁定表.
通配符表名没有语法,也没有将子查询放在LOCK TABLES语句中的语法.
您必须获取表名列表并构建动态SQL查询.