遇到这么一个场景:服务器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命令的批处理脚本