我用下面的方法调用cmd执行备份恢复
STARTUPINFO   si;   
  PROCESS_INFORMATION   pi;   
  si.cb=sizeof(STARTUPINFO);   
  si.lpReserved=NULL;   
  si.lpDesktop=NULL;   
  si.lpTitle=NULL;   
  si.dwFlags=STARTF_USESHOWWINDOW;   
  si.wShowWindow=SW_SHOW;   
  si.cbReserved2=0;   
  si.lpReserved2=NULL;   
  CString   strProcess;   
  strProcess.Format("cmd.exe /k \H:\\HI_IMAGE-ACCESS\\Debug\\mysqlrestore.bat");  ////<H:\\HI_IMAGE-ACCESS\\HIWorkstation_Mysql20080920165845.sql");   
    
  if(!::CreateProcess(NULL,(LPSTR)(LPCTSTR)strProcess,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) 
{
        AfxMessageBox( "CreateProcess failed.请重新选择恢复路径" );
    }    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );其中的批处理文件mysqlrestore.bat是我自己写的,如下:cd  ..
c:
cd C:\Program Files\MySQL\MySQL Server 5.0\bin
mysql -u root -pzxy>>H:\HI_IMAGE-ACCESS\HIWorkstation_Mysql20080920170038.sql;
程序的执行结果是cmd进程也产生了,但是没有达到我想要的效果,
H:\HI_IMAGE-ACCESS>cd  ..H:\>c:C:\>cd C:\Program Files\MySQL\MySQL Server 5.0\binC:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -u root -pzxy 1>>H:\HI_IMAGE-A
CCESS\HIWorkstation_Mysql20080920170038.sql光标停在了这个地方,怎么回事啊?
还有怎样才能断定数据库已经是恢复好的?(从程序里判断)

解决方案 »

  1.   

    你的备份批处理本身的问题,请用:
    mysqldump --all-databases -u root -p密码 > /mysqldata/bak.sql 
    来备份的你数据库
    你在cmd下执行
    mysql -u root -pzxy>>H:\HI_IMAGE-ACCESS\HIWorkstation_Mysql20080920170038.sql; 
    会有同样的问题
      

  2.   

    上面的那个批处理是我的恢复批处理,我的备份批处理是这样的,
    cd ..
    c:
    cd c:\Program Files\MySQL\MySQL Server 5.0\bin
    mysqldump -uroot -pzxy --add-drop-table test>>路径的程序中给出的
    并且备份已经成功,只是想利用上面的备份.sql执行数据库的恢复。应该怎么解决
      

  3.   

    恢复的批处理要这样写:
    cd  .. 
    c: 
    cd C:\Program Files\MySQL\MySQL Server 5.0\bin 
    mysql -u root -pzxy < H:\HI_IMAGE-ACCESS\HIWorkstation_Mysql20080920170038.sql
    exit
      

  4.   

    但是我怎么判断是否执行成功了呢?
    还有我的那个批处理执行的时候总是显示这样H:\HI_IMAGE-ACCESS>cd  ..H:\>c:C:\>cd C:\Program Files\MySQL\MySQL Server 5.0\binC:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -u root -pzxy; 1>H:\HIWorkstat
    ion_Mysql20080922104455.sql
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y
    ES)这里为什么总是多歌东西呢
    批处理文件如下cd  ..
    c:
    cd C:\Program Files\MySQL\MySQL Server 5.0\bin
    mysql -u root -pzxy>H:\HIWorkstation_Mysql20080922104455.sql;
      

  5.   

    但是我怎么判断是否执行成功了呢?
    --->CreateProcess执行是成功的(CreateProcess只要能执行就可也功)
    这里为什么总是多东西呢 
    --->可能的问题是执行的批处理位置不对
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y 
    ES) 
    --->用户名/口令出错mysql -u root -pzxy>H:\HIWorkstation_Mysql20080922104455.sql; 
    ---> 1.管道方向不对,要用"<"而非">",这样你的H:\HIWorkstation_Mysql20080922104455.sql文件会被清空,且后面不能有";"号
    -----------------
    你要先在cmd方式下执行一次批处理,正常后再由程序调用
      

  6.   

    我估计是没会说清,我不是判断那个进程有没有执行完成,我是像判断我的数据库备份是否完成,也就是说执行了备份程序后我的当前数据库是原来的呢还是备份后的呢?直接在cmd执行下面的语句会报错
    C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -hlocalhost -uroot -pzxy<H:\HI
    Workstation_Mysql20080922104455.sql;
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y
    ES)
    我的用户名是root,密码是zxy,可为什么还说错误呢批处理的位置在H:\HI_IMAGE-ACCESS\Debug这个目录下放着,在调用批处理的时候我也明确的指定了他的路径
     strProcess.Format("cmd.exe /k H:\\HI_IMAGE-ACCESS\\Debug\\mysqlrestore.bat");      
      if(!::CreateProcess(NULL,(LPSTR)(LPCTSTR)strProcess,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) 
    怎么会有问题呢?
      

  7.   

    谢六楼的,解决一个问题,
    C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -hlocalhost -uroot -pzxy <H:\HI 
    Workstation_Mysql20080922104455.sql; 
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y 
    ES) 
    用户名密码的问题是因为后恢复那句后面加了;号,但是执行很快的,一闪而过,不过本身数据库备份出来也就25k,但是前几天我试了一次,是有过程的,就是0 query什么的。但是执行批处理的时候还是莫名其妙的添加点东西,这个是怎么回事啊
      

  8.   

    C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -hlocalhost -uroot -pzxy <H:\HI 
    Workstation_Mysql20080922104455.sql;你上面没有指明要恢复的目标库名称啊..
    看看这个:http://hi.baidu.com/itwoody/blog/item/099425fd64ae3d1208244d78.html
      

  9.   

    如果是全库恢复,是需要目标库名称的。(在sql中指名)
      

  10.   

    我晕,应该是
    如果是全库恢复,是不需要目标库名称的。因为备份出来的SQL中.有connect 数据库名.