如何解决如何执行从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的反引号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。