我有一个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;
我怎样才能让它发挥作用?我是否需要逐行循环并逐个执行,如果是这样的话?
答案 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进程。