如何自动执行从information_schema生成的MySQL语句?

时间:2011-05-23 14:23:13

标签: mysql bash

我有一个MySQL服务器,其中包含许多具有类似表结构的数据库。当一个遗留软件进入错误状态时,它会将一行写入几个表以及通过电子邮件发送给我。我正在尝试编写一个简单的SQL查询来清除这些表(TRUNCATE)。

在我的bash脚本中,我目前有:

mysql -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') 
          FROM information_schema.TABLES 
          WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | 
grep -v 'CONCAT(' |
mysql

添加行返回以帮助提供易读性。

但是这似乎不起作用,只执行上面选择生成的第一个TRUNCATE TABLE查询。

以上代码的选择部分的输出:

mysql -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') 
          FROM information_schema.TABLES 
          WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | 
grep -v 'CONCAT('

是:

TRUNCATE TABLE db1.errorLog;
TRUNCATE TABLE db1.errorLogBacktrace;
TRUNCATE TABLE db1.errorLogUrl;
TRUNCATE TABLE db2.errorLog;
TRUNCATE TABLE db2.errorLogBacktrace;
TRUNCATE TABLE db2.errorLogUrl;
TRUNCATE TABLE db3.errorLog;
TRUNCATE TABLE db3.errorLogBacktrace;
TRUNCATE TABLE db3.errorLogUrl;

我怎样才能让它发挥作用?我是否需要逐行循环并逐个执行,如果是这样的话?

1 个答案:

答案 0 :(得分:2)

看起来我过于复杂了。经过一些搜索服务器故障后,我发现:https://serverfault.com/questions/124797/alter-table-for-all-tables-in-a-database

所以我的命令现在看起来像:

mysql --batch --skip-column-names -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | mysql

通过适当的MySQL转义,它应该是:

mysql --batch --skip-column-names -e "SELECT CONCAT('TRUNCATE TABLE \`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\`;') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | mysql

反引号转义MySQL数据库中的关键字和列名,而附加的反斜杠是为了逃避bash的反引号,因为字符串被传送到第二个MySQL进程。