我有一个 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;
我怎样才能让它发挥作用?我是否需要遍历这些行并一条一条地执行它们,如果需要的话如何?
最佳答案
看来我把事情复杂化了。通过 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');" | mysql
MySQL 数据库中的反引号转义关键字和列名以及额外的反斜杠是为了在字符串被输送到第二个 MySQL 进程时转义 bash 的反引号。
关于mysql - 如何自动执行从 information_schema 生成的 MySQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098532/