通过批处理文件连接到MySQL

3
我已经配置了一个批处理文件,每隔30秒左右检查一次Web托管的数据库,以查看一个字段中的值是否已设置为1。我对这个工作方式和结果感到满意。
但是,我遇到的一个问题是有时候脚本无法连接到SQL服务器。当这种情况发生时,我的脚本会出现错误并停止批处理文件的运行。
我使用的连接语句是:
mysql --host=xxx.xxx.xxx --port=3306 --force --user=wmc --password=xxxxxxxxx --database=xxx < xxx.sql

最后的SQL文件包含我要运行的命令。我读了一些文档,说--force应该让脚本在出现错误后继续执行,但当它无法连接到SQL服务器时仍然会出错。有没有办法捕获这个错误?


如何在批处理中检查错误代码并执行循环? - Drew
我认为我已经找到了sql命令中“--force”参数无法工作的原因。我在“--”和“force”之间加入了一个空格。 - Andy Davenport
force是做什么的,只是阻止吗?哦,顺便说一下,欢迎来到The Stack,并感谢您的分享! - Drew
根据文档,force 可使 MySQL 应用程序在无法连接到 SQL 时忽略产生的错误消息。虽然对于某些人来说这不是理想的选择,但在我的情况下这很好,因为我正在 SQL 服务器上创建日志条目,同时也记录到本地文本文件中。感谢欢迎。 - Andy Davenport
1个回答

0

你的主要问题似乎是错误处理。我个人会更改我的脚本,以便能够检测失败并重试直到成功。

快速测试

我在自己的系统上进行了一个粗略的测试,以检查错误级别伪环境变量:

Test.bat

 D:\xampp\mysql\bin\mysql --host=127.0.0.1 --port=3306 --force --user=root2 --password= --database=saasplex < test.sql
    echo Exit Code is %errorlevel%

    D:\xampp\mysql\bin\mysql --host=127.0.0.1 --port=3306 --force --user=root --password= --database=saasplex < test.sql
    echo Exit Code is %errorlevel%

控制台结果

F:\_MBAK_DOCUMENTS\_OTHER_PROJECTS\STACKEXCHANGE\August6>mysqlErrorDetect.bat

F:\_MBAK_DOCUMENTS\_OTHER_PROJECTS\STACKEXCHANGE\August6>D:\xampp\mysql\bin\mysql --host=127.0.0.1 --port=3306 --force --user=root2 --password= --database=saasplex  0<test.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'saasplex'

F:\_MBAK_DOCUMENTS\_OTHER_PROJECTS\STACKEXCHANGE\August6>echo Exit Code is 1
Exit Code is 1

F:\_MBAK_DOCUMENTS\_OTHER_PROJECTS\STACKEXCHANGE\August6>D:\xampp\mysql\bin\mysql --host=127.0.0.1 --port=3306 --force --user=root --password= --database=saasplex  0<test.sql
Warning: Using a password on the command line interface can be insecure.
1
1

F:\_MBAK_DOCUMENTS\_OTHER_PROJECTS\STACKEXCHANGE\August6>echo Exit Code is 0

带有重试的批处理脚本

set tries=10
:loop

    D:\xampp\mysql\bin\mysql --host=127.0.0.1 --port=3306 --force --user=root --password= --database=saasplex < test.sql

if errorlevel 1 (
   set /a tries=tries-1
   if %tries%==0 goto exitloop
   goto loop
)

:exitloop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接