检测日志文件触发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文件,然后添加计划任务,定期执行即可。

服务器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%
rem 以上两条命令可以简化为如下单条命令
rem (echo flush hosts;)|%mysql_bin%mysql -h%dbhost% -u%dbuser% -p%dbpwd%
exit
:2
exit

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

%mysql_bin%mysql -u%dbuser% -p%dbpwd% < %sqlcmd%
rem 操作特定库
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的执行时间稍晚几分钟即可。

原创文章禁止转载:技术学堂 » 检测日志文件触发SQL命令的批处理脚本

精彩评论

4+5=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏