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救命呀!!!

解决方案 »

  1.   

    mysqldump" -uroot -p*** --add-drop-database -B -R astar > d:\astar_%Ymd%.sqlmysqldump后边那个"造成MYSQLDUMP没有执行...
    所以直接执行CALL CLEARDAYA()了
    没备份的话有无日志?
    要是都没有,估计只有帮哭了。
      

  2.   

    能这么清理数据 说明这些数据也不需要用户使用不知道你的call ClearData怎么执行的,如果binlog没有的话基本找不回来了
      

  3.   

    首先,你应当在后面判断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 backUpFailureECHO %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 restoreFailureECHO %DATE% %TIME% >> %LOG_FILE%
    ECHO 恢复成功,开始压缩数据 >> %LOG_FILE%7z a -aoa -mx=9 -m0=PPMd:mem=256M "%BKUP_ZIP%" "%BKUP_FILE%"
    IF ERRORLEVEL 1 GOTO archiveFailureECHO %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
      

  4.   

    1、
    这个执行顺序是不是先备份后,然后再清除数据?是,前提是正确执行
    你的BAT中,没有判断执行是否成功(ERRORLEVEL),如成功则执行下一步,否则停止执行BAT( OR 
    做其它处理);
    2、没有备份、二进制日志没有打开的话,没有希望了,就当累计经验了。
      

  5.   

    BAT按顺序执行,不会判断(等待)命令正确运行(命令运行完毕),所以要在BAT中加入判断是否正确运行的代码
      

  6.   

    在BAT中确实会等待上1个程序运行完毕,记成在DELPHI中运行其它程序,不会等待上1个程序运行完毕,要用程序阻塞,等待上1个程序运行完毕
      

  7.   

    WWWWA,但是有ERROR的话,就不会生成SQL备份文件呀。
      

  8.   

    你的备份文件是否生成?在系统命令行下运行
    "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump" -uroot -p*** --add-drop-database -B -R astar > d:\astar_%Ymd%.sql
    是否 正确
      

  9.   

    是正确的,没有一点ERROR的信息,所以是正确执行了备份命令。
    我还原回这个SQL文件发现明明有1年半的数据,我备份后只剩下2011年的数据了,2010的数据全部没了。
    所以我担心是不是在备份过程中执行了CLEARDATA的存储过程,导致只备份2011年的数据了。然后今天我在OFFICE测试,就没有发现问题,备份的数据是有2010年和2011年,所以我感到很纳闷呀。
      

  10.   

    所以我担心是不是在备份过程中执行了CLEARDATA的存储过程,导致只备份2011年的数据了。不会,除非执行了CLEARDATA的存储过程后再备份从你的测试 结果来看,也没有问题,估计是源数据就有问题,比如执行了CLEARDATA
      

  11.   

    哈,我在做CLEARDATA之前还特地在MYSQL QUERY BROWSER看了一下有2010的数据,
    不然我也不会这么担心呀,哎,我就不应该去这个客户那。失败呀!!
      

  12.   

    呵呵,一般顺序
    备份->检查备份结果->删除->检查删除结果->导入->检查导入结果,虽然烦琐,比较放心
      

  13.   

    以后还是别用批处理了。
    一个个操作来做,中间出了啥情况还能够及时发现。在DBA中有一个潜规则:在对数据库进行任何操作前,都备份数据库。小心使得万年船,能不能优化另说,首先不能搞砸了。
      

  14.   

    呵呵,客户才买的新硬盘500G的,所以不存在磁盘满的问题。
    现在我想想昨天我在MYSQL QUERY BROSWER中查看一个表的数据,估计有将近100W条吧,
    但是在工具FETCHED过程中,MYSQL出现了一个什么内存错误的.DLL,后来我就没管他了,然后我就执行BAT了,才4分钟就执行完了,我就感觉有问题了。
      

  15.   

    本帖最后由 apple_8180 于 2011-04-27 09:24:35 编辑
      

  16.   

    没什么好办法。1. 停止这个MYSQL机器。然后取出磁盘进行文件恢复
    2. 看看有没有以前的备份进行恢复。
      

  17.   

         不要担心,一般这种情况,那些数据如果对他们真的非常重要的话,他们应该也都有备份的,他们不至于这么幼稚。为了省几个硬盘的钱,而不做备份,只是他们的备份时间可能只有1个月或者一周才进行一次。很久以前在某个论坛上见过一个写一键还原值入MBR的高手(网名叫蛙哥),直接用DOS下16进制编辑器修复过硬格的硬盘!这不是传说,是事实!
      

  18.   

    能这么清理数据 说明这些数据也不需要用户使用不知道你的call ClearData怎么执行的,如果binlog没有的话基本找不回来了
      

  19.   

    BAT是DOS年代的了,现在很少用了
      

  20.   

    BAT 调用 EXE会等待;
    BAT 调用 BAT则不等待。
      

  21.   

    1 MYSQL出现了一个什么内存错误的.DLL-----------它坑了你!!!!!!
    你的mysql岁岁便便就崩溃或出错?啥原因呢,win应用程序日志有记录的。
    为了避免下次出现这个问题,我建议你:1升级到5.0最新版的mysql,扫描那台机子的所有磁盘,加大那台机子的虚拟内存。2 存储过程贴出来
      假如是清空表命令,估计没戏,假如是删除表,删除库命令,估计很容易找回来。3 ntfs分区中恢复myi,myd文件===简单,4 mysql是有恢复myisam,innodb的恢复软件的,支持mysql5.5,StellarPhoenixDatabaseRecoveryforMySQL,只可惜要美元没破的,搞这个的人强烈需要这个软件啊,难道没人关注过么?5 这种部分备份成功的情况下,备份返回值不会是0么?我总觉得判断errorlevel不可靠,或者说不信任mysql的错误抛出,很可能没抛,或抛丢了,c不如java和.net严谨健壮,所以说最好手动删表,或者删表用单独的脚本。
      

  22.   

    这个我也XH  xiexie 楼主