我需要执行一些脚本操作,这可能需要一段时间(比如一分钟)。在这些操作开始时,我从MySQL数据库中采取了一些措施,重要的是它们在操作完成之前不会更改。数据库有几十个表,因为它属于一个非常老式但很庞大的CMS,CMS用户有十几个选项可以修改它。
我自己甚至不想在我的脚本在DB中运行时更改任何内容,它只是被冻结。它不是转储或更新。但是表格应该保持开放以供所有人阅读,以防止所连接主页的访问者收到错误。
如果在数据库再次解锁后会触发可能由其他CMS用户执行的数据库更改操作,那将是完美的,但如果它们失败,我不介意。
所以我想在脚本的开头我用
锁定表格 $res=Get-Content C:\temp\test2.csv
$newres=@()
for ($i = 0; $i -lt $res.Count; $i++)
{
if ($i -eq 0)
{
$newres+=$res[$i]
}
else
{
$newres+=$res[$i] -replace '\w', 'x'
}
}
Set-Content C:\temp\test2.csv -Value $newres
在我做完之后
lock first_table write;
lock second_table write;
...
我认为这应该完全符合我的要求。 但是我可以为数据库的所有表存档这些而不明确命名它们,以使其更具未来性吗?
这不能确定:
unlock tables
另一个问题是,如果有人可以动态回答这个问题,我是否必须使用另一个MYSQL用户来锁定/解锁,而不是CMS使用的用户。如果我理解这一点,那么是的。
答案 0 :(得分:7)
下面是锁定所有表的语句(实际上它创建了一个全局锁):
FLUSH TABLES WITH READ LOCK;
然后发布:
UNLOCK TABLES;
阅读http://dev.mysql.com/doc/refman/5.7/en/flush.html了解有关FLUSH TABLES
。
重新评论:
是的,这会在所有表上进行全局READ LOCK。即使是你自己的会话也无法写。我很抱歉忽略了你的要求。
没有等效的全局语句可以为您提供写锁定。您必须明确地按名称锁定表。
没有通配符表名的语法,也没有将子查询放在LOCK TABLES语句中的语法。
您必须获取表名列表并构建动态SQL查询。