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

问题描述

| 我有一台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
添加了行退回以帮助提高可读性。 但这似乎不起作用,仅执行由上述选择生成的第一个“ 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的反引号。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...