写一下mysql中的所有表

时间:2016-10-14 14:52:00

标签: mysql

我需要执行一些脚本操作,这可能需要一段时间(比如一分钟)。在这些操作开始时,我从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使用的用户。如果我理解这一点,那么是的。

1 个答案:

答案 0 :(得分:7)

下面是锁定所有表的语句(实际上它创建了一个全局锁):

FLUSH TABLES WITH READ LOCK;

然后发布:

UNLOCK TABLES;

例如,除非您只备份事务表并使用--single-transaction选项,否则Mysqldump会执行此操作。

阅读http://dev.mysql.com/doc/refman/5.7/en/flush.html了解有关FLUSH TABLES

的更多详情

重新评论:

是的,这会在所有表上进行全局READ LOCK。即使是你自己的会话也无法写。我很抱歉忽略了你的要求。

没有等效的全局语句可以为您提供写锁定。您必须明确地按名称锁定表。

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

您必须获取表名列表并构建动态SQL查询。