【问题标题】:Running mysql command in a while loop在while循环中运行mysql命令
【发布时间】:2016-07-01 06:13:58
【问题描述】:

我有一个 mysql 数据库列表,我希望使用 linux 脚本从名称以“_abc”结尾的数据库中导出几个表。但是,我不断收到“文件意外结束”错误。

这是我的脚本,其中DB_FILE 是一个文本文件,其中包含以“_abc”结尾的数据库名称。

while read db_name;
do
    OUT_FILENAME="${db_name}_table.csv"
    mysql -u$MYSQLUSER -p$MYSQLPASS -h $MYSQLHOST $db_name << EOFMYSQL
    SELECT * FROM table_abc INTO OUTFILE '$OUT_FILENAME' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    EOFMYSQL
done < $DB_FILE

rm -f $DB_FILE

如果我删除 3 条 MYSQL 行,则脚本运行时不会出错。

另一个问题,如果我有 2 个 SELECT 查询,我是否必须单独运行每个查询,即每个查询都包含在 EOFMYSQL 语句中,或者我可以在一个 EOFMYSQL 块中同时有两个查询?

【问题讨论】:

  • Heredoc 不是这里最好的方法.. 稍后更新
  • 对不起,我不太明白你的意思。

标签: mysql shell


【解决方案1】:

我认为EOFMYSQL 前面必须没有空格:不要只缩进那个。

while read db_name;
do
    OUT_FILENAME="${db_name}_table.csv"
    mysql -u$MYSQLUSER -p$MYSQLPASS -h $MYSQLHOST $db_name << EOFMYSQL
    SELECT * FROM table_abc INTO OUTFILE '$OUT_FILENAME' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
EOFMYSQL
done < $DB_FILE

rm -f $DB_FILE

在一些合适的文本编辑器中,它会很容易显示出来,这里是notepad++:

右缩进:

错误的缩进:

【讨论】:

    【解决方案2】:

    $OUT_FILENAME 不会在单引号内展开。

    我猜你可以将查询放在一个数组中,如下所示:

    MYQUERY=( SELECT \* FROM table_abc INTO OUTFILE "$OUT_FILENAME" FIELDS TERMINATED BY \",\" LINES TERMINATED BY \"\\n\"\; )
    

    然后将mysql命令改为:

    mysql -u"$MYSQLUSER" -p"$MYSQLPASS" -h "$MYSQLHOST" -e "${MYQUERY[@]}" "$db_name"
    

    旁注

    1. 我已将所有变量双引号以避免分词。
    2. 请注意,我们希望在此处重新创建实际查询。所以你需要转义那些在这里有特殊含义的字符,比如\*,\"等等。

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2021-12-09
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多