如果任一mysql脚本执行失败,则中止后续的mysql脚本执行

时间:2020-07-15 13:02:56

标签: mysql shell

我有3个sql脚本(11.sql,12.sql和13.sql),其中包含存储过程(或)DML语句,并且必须按升序依次执行。我可以通过bash脚本来做到这一点。

for sql_file in `ls *.sql`
do
    echo "Output of the $sql_file as below..."
    mysql --defaults-file=/home/sri/myfile.txt -v --safe-updates=1 << EOFMYSQL
    USE sampledb;
    SOURCE $sql_file;
EOFMYSQL

但是,只要有一个.sql文件由于如下所示的不同原因而失败,则必须中止执行,并且进一步的.sql不应该执行。

  • 错误代码:1146。表'sampledb.table_one'不存在0.360秒
  • 访问被拒绝的错误(或)特权不足

但是不管是否失败,所有3个sql脚本都一个接一个地执行。我尝试了各种选择,但无法找出确切的步骤来实现这种在任何错误情况下中止sql脚本执行的要求。

谢谢。

2 个答案:

答案 0 :(得分:0)

一种方法是将您的Heredoc内容(即EOFMYSQL之间的行)放入相应的* .sql文件中。 然后,如果mysql的退出状态do不为零(因为sql因错误而失败),则使用此基本结构执行并退出$?循环:

for sql_file in *.sql
do
  mysql --defaults-file=...  < sql_file
  [ $? -ne 0 ] && exit
done

答案 1 :(得分:0)

通过使用以下脚本,我可以检查SQL脚本(带有DML语句的存储过程)是否成功执行。如果失败,则返回相应的MySQL错误代码/声明。

for sql_file in `ls *.sql`
do
mysql --defaults-file=input.txt --safe-updates=1 sampledb < $sql_file
if [ $? -eq 0 ]; then
echo "$sql_file was executed"
else
echo "Aborting MySQL execution due to previous script error. Please investigate"
exit 1
fi
done

但是我需要在下面使用bash脚本显示消息,该消息解释了对DML语句执行影响的记录数。 (通过存储过程脚本)

{0个受影响的行,已匹配的行:1已更改:0警告:0}

请让我知道如何执行此操作。