mysql - 如何自动执行从 information_schema 生成的 MySQL 语句?

标签 mysql bash

我有一个 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/

相关文章:

linux - 特定设备的 BASH 特定 IP 地址

linux - 我可以从终端输出中 grep (或过滤)特定颜色的行吗?

mysql - 如何从一张表中选择用户尚未选择的所有记录?

mysql - #1064 - 您的 SQL 语法有错误 : What is wrong with this query?

php - 未找到列 : 1054 Unknown column '0' in 'field list' - Laravel - I don't have a 0 column anywhere in my code

bash - Bash 中的 Perl : How to read from pipe and pass arguments to perl at the same time?

linux - 如何在Linux上通过bash检查整个Firefox浏览器或FF浏览器选项卡是否崩溃或卡住

json - 删除存在于同级对象中并具有特定值的键

mysql - 如何从 SQL 中的表中选择唯一行?

c++ - 我需要原始的 mysql 库来运行 MySQL C++ 连接器吗