问题描述
|
我有一台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的反引号。