日期:2014-05-16  浏览次数:20789 次

BAT执行顺序
SQL code
set hh=%Time:~0,2%%time:~3,2%
if "%Time:~0,1%"==" " set hh=0%Time:~1,1%%time:~3,2%
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%%hh%"
cd C:\Program Files\MySQL\MySQL Server 5.0\bin
"C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump" -uroot -p*** --add-drop-database -B -R astar > d:\astar_%Ymd%.sql
"C:\Program Files\MySQL\MySQL Server 5.0\bin\mysql" -uroot -p*** astar  -e  "Call ClearData("""2011-01-01""");"


这个执行顺序是不是先备份后,然后再清除数据?
我在我的机器上和一台2GB的测试机器上也是正常执行,
但是昨天我去给客户更新的时候(1GB的机器),然后执行上面的命令,先把数据给清除了,然后再备份。
我那是叫一个汗呀,他妈的一整年的数据就这样被我清除了,因为客户数据比较大,其中4个表的数据都是在百万以上。
所以我没有先备份,如何解救?
狼头和WWWWA救命呀!!!

------解决方案--------------------
mysqldump" -uroot -p*** --add-drop-database -B -R astar > d:\astar_%Ymd%.sql

mysqldump后边那个"造成MYSQLDUMP没有执行...
所以直接执行CALL CLEARDAYA()了
没备份的话有无日志?
要是都没有,估计只有帮哭了。
------解决方案--------------------
能这么清理数据 说明这些数据也不需要用户使用

不知道你的call ClearData怎么执行的,如果binlog没有的话基本找不回来了
------解决方案--------------------
首先,你应当在后面判断mysqldump的errorlevel,也就是运行状态是不是0(进程退出码一般0表示正常,非零异常或警告),配合以goto 标签的方式,当前面的任务异常退出的时候,后续任务不会执行。

比如我的一个异地服务器,每晚异地备份生产机器的BAT(SET什么就不贴了)
[code=BAT]
ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 开始备份数据 >> %LOG_FILE%

mysqldump --opt --compress --routines --databases %DB_DATABASE% "--host=%DB_HOST%" "--password=%DB_PWD%" "--user=%DB_USR%" > %BKUP_FILE%
IF ERRORLEVEL 1 GOTO backUpFailure

ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 备份成功,开始恢复数据 >> %LOG_FILE%

REM 这行的地址LOCALHOST绝对不能写错了,否则生产环境就完蛋了!!!!!
mysql "--host=localhost" "--password=%LOCAL_PWD%" "--user=%LOCAL_USR%" "--execute=source %BKUP_FILE%"
IF ERRORLEVEL 1 GOTO restoreFailure

ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 恢复成功,开始压缩数据 >> %LOG_FILE%

7z a -aoa -mx=9 -m0=PPMd:mem=256M "%BKUP_ZIP%" "%BKUP_FILE%"
IF ERRORLEVEL 1 GOTO archiveFailure

ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 压缩成功,清除旧数据 >> %LOG_FILE%

DEL /F /Q %BKUP_FILE%

ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 清除成功,任务结束 >> %LOG_FILE%

GOTO end

:backUpFailure
ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 备份失败 >> %LOG_FILE%
GOTO end

:restoreFailure
ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 恢复失败 >> %LOG_FILE%
GOTO end

:archiveFailure
ECHO %DATE% %TIME% >> %LOG_FILE%
ECHO 压缩失败 >> %LOG_FILE%
GOTO end

:end[/code]

这里有更加完整的bat例子:http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
------解决方案--------------------
1、
这个执行顺序是不是先备份后,然后再清除数据?

是,前提是正确执行
你的BAT中,没有判断执行是否成功(ERRORLEVEL),如成功则执行下一步,否则停止执行BAT( OR 
做其它处理);
2、没有备份、二进制日志没有打开的话,没有希望了,就当累计经验了。
------解决方案--------------------
BAT按顺序执行,不会判断(等待)命令正确运行(命令运行完毕),所以要在BAT中加入判断是否正确运行的代码
------解决方案--------------------
以后还是别用批处理了。
一个个操作来做,中间出了啥情况还能够及时发现。

在DBA中有一个潜规则:在对数据库进行任何操作前,都备份数据库。

小心使得万年船,能不能优化另说,首先不能搞砸了。
------解决方案--------------------
尤其到客户那边,不能一味求速度多快,特别是数据处理时