Windows通过检测文件从而触发SQL命令的脚本

有这么一个场景:服务器A需要远程访问服务器B上的数据库,当连接失败时会生成错误日志,此时,服务器B需要执行SQL语句才能解决无法访问的问题。

因为暂时无法解决网络层问题,对此,本人想出通过检测日志文件来判断是否触发SQL命令的方法来临时解决问题,思路如下:

服务器A每隔5分钟检测是否产生了无法访问的告警日志文件,随即复制到服务器C上的共享目录(为了服务器A和B的安全),服务器B每隔5分钟检测共享目录上是否产生了日志文件,如果有则马上执行SQL语句。

系统环境

  • 三台服务器A、B、C均为 Windows Server 2008
  • A和B均挂载C的共享目录,盘符为Z
  • 数据库为Mysql5.7

服务器A上的脚本文件

@echo off
set h=%time:~0,2%
set h=%h: =0%
set etime=%date:~0,4%%date:~5,2%%date:~8,2%%h%%time:~3,2%%time:~6,2%
set ddate=%date:~8,2%

set sfile=D:\error.log
set nfile=error_%etime%.log
set npath=Z:\
set elog=D:\elog.log

if exist "%sfile%" goto 1
goto 2
:1
copy "%sfile%" %npath% /y
ren %sfile% %nfile%
rem 或者删除 del /f %elog%
echo %etime% error>>%elog%
exit
:2
echo %etime% fine>>%elog%
if %ddate%=="01" goto 3
exit
:3
ren %elog% %elog%_%etime%
exit

将以上脚本保存为bat文件,然后添加计划任务,定期执行即可。

Windows的计划任务

Windows执行计划任务的结果

服务器B上的脚本文件

@echo off
set sfile=Z:\error.log
set slog=D:\sqllog.log
set dbhost=192.168.1.100
set mysql_home="D:\mysql5"
set mysql_bin=%mysql_home%\bin\
set dbname=mysql
set dbuser=root
set dbpwd=myspwd
set sqlcmd=D:\mysql5\sqlcmds\update4user.sql

if exist "%sfile%" goto 1
goto 2
:1
%mysql_bin%mysql -h%dbhost% -u%dbuser% -p%dbpwd% "flush hosts;"
echo %etime% excuse sql>>%slog%
exit
:2
exit

以上的SQL语句也可以采用以下方式:

(echo flush hosts;)|%mysql_bin%mysql -h%dbhost% -u%dbuser% -p%dbpwd%

如果是较复杂的sql语句,可以将SQL语句调整为如下脚本:

%mysql_bin%mysql -u%dbuser% -p%dbpwd% < %sqlcmd%
rem 操作特定库 %mysql_bin%mysql -u%dbuser% -p%dbpwd% %dbname% < %sqlcmd%

将sqlcmd.sql保存在%mysql_bin%中,其内容就是SQL语句,比如:

update user set host='%' where user='root';
flush privileges;

将以上bat文件,同样加入计划任务,视网络情况,比A的执行时间稍晚几分钟即可。

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

感谢您的支持与帮助

支付宝扫一扫打赏

微信扫一扫打赏