我有一个带有许多数据库的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添加行回车符,希望有助于易读性。
但是这似乎不起作用,并且只执行由上面的select生成的第一个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;我怎么才能让它工作呢?我是否需要遍历这些行并逐个执行它们,如果是这样的话,如何执行?
发布于 2011-05-23 22:39:16
看起来我把事情复杂化了。在对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 \`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\`;') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | mysqlBackticks转义MySQL数据库中的关键字和列名,附加的反斜杠是为了转义bash的反引号,因为字符串正在被输送到第二个MySQL进程。
https://stackoverflow.com/questions/6098532
复制相似问题