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

问题描述

| 我有一台MysqL服务器,其中有许多数据库具有相似的表结构。当某个旧版软件进入错误状态时,它会在几张表中写一行并向我发送电子邮件。我正在尝试编写一个简单的SQL查询来清除这些表(
TruncATE
)。 在我的bash脚本中,我目前有:
MysqL -e \"SELECT CONCAT(\'TruncATE TABLE \',TABLE_SCHEMA,\'.\',TABLE_NAME,\';\') 
          FROM @R_496_4045@ion_schema.TABLES 
          WHERE TABLE_NAME IN (\'errorLog\',\'errorLogBacktrace\',\'errorLogUrl\');\" | 
grep -v \'CONCAT(\' |
MysqL
添加了行退回以帮助提高可读性。 但这似乎不起作用,仅执行由上述选择生成的第一个“ 2”查询。 上面代码的select部分的输出
MysqL -e \"SELECT CONCAT(\'TruncATE TABLE \',\'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;
我该如何工作?我是否需要遍历这些行并逐一执行它们,如果可以的话,该如何做?     

解决方法

看起来我太复杂了。经过对serverfault的一些搜索后,我发现: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 \\`\',\'\\`.\\`\',\'\\`;\') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN (\'errorLog\',\'errorLogUrl\');\" | mysql
反引号在MySQL数据库和列名称中转义关键字,附加的反斜杠用于将字符串换行到第二个MySQL进程中,从而避免bash的反引号。