【问题标题】:Script which searches for tables matching a pattern and then truncates them搜索与模式匹配的表然后截断它们的脚本
【发布时间】:2016-08-09 15:19:09
【问题描述】:

我想创建一个脚本来搜索匹配模式的表,然后截断它们。

我已经登录到 mysql 并运行以下给出正确的表:

SELECT concat('TRUNCATE TABLE `', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'weather%';

但是我不确定如何将它嵌入到一个 shell 脚本中,它会像这样输出 SQL:

TRUNCATE TABLE `weather`;
TRUNCATE TABLE `weathermonth`;
TRUNCATE TABLE `weathermonthlp`;

然后执行语句。

谢谢

【问题讨论】:

  • 您不想在 shell 脚本中解析 mysql 输出。只需在 mysql 中编写一个存储过程来进行选择/截断,那么你的 shell 脚本只需要mysql -u user -p pw -e 'call your_function();'
  • 问题是我们不想写单独的truncate语句,是否可以使用select concat输出要执行的语句,然后在sp中执行?

标签: mysql linux bash shell


【解决方案1】:

您可以从这样的内容开始,如果需要,可以添加更多代码,例如数据库参数。在使用空格调用搜索时,请务必使用引号。

./truncate.sh "如果表名中甚至可能有空格,则使用空格进行一些搜索"

#!/bin/bash
searchpattern="$1"

table_list=$(mysql -BN -e "SELECT CONCAT(TABLE_SCHEMA,'.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '$searchpattern%';")
echo $table_list;
IFS=" "

while read i; do

    echo "TRUNCATE TABLE $i;"

done < <(echo $table_list)

该脚本应该输出 sql,但您需要在运行前对其进行验证

【讨论】:

    【解决方案2】:

    要从 shell 运行 MySQL 命令,您可以通过管道连接到 mysql 的标准输入,例如:

    mysql << 'EOF'
    SELECT concat('TRUNCATE TABLE `', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'weather%';
    EOF
    

    现在,您的 MySQL 命令会生成更多 MySQL 命令... 如果你想执行它们,你可以再次管道到mysql, 还使用-s标志来抑制MySQL自身在进程中产生的非查询输出,像这样:

    mysql -s << 'EOF' | mysql
    SELECT concat('TRUNCATE TABLE `', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'weather%';
    EOF
    

    注意&lt;&lt; 'EOF' 是一个here-document,其内容是按字面意思理解的,因此您不需要在 MySQL 命令中转义任何特殊字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多