vc编程实现对MYSQL数据库的备份与恢复

xuchen 2008-12-04 10:03:43
vc编程实现对MYSQL数据库的备份与恢复,在网上找了一些资料,但是很少,不知道有没有人做过,有这方经验的,能来给点信息,我自己也做了下,感觉mysql的备份语句在ADO中总是出错,很是郁闷,现在把一些代码贴出来,大家帮忙找找错误和提一些有意思建议,本人不胜感激
以下是ADO的操作:
m_pConnection->Open("DSN=info;", /*数据源名称*/
"root", /*用户*/
"123456",0); /*密码*/
_bstr_t vSQL;
//执行时出错,说语法错误,但是在命令行模式下运行可以
//vSQL = "mysqldump -uroot -p123456 "+DB_DateBase+" > "+dataDir+" ";
//执行时出错,说语法错误,在DATABASE这个地方就开始出错了
vSQL = "BACKUP DATABASE info TO DISK = 'c:\\info.bak'";
//执行时成功,为什么这个可以成功呢,而其他的不可以
//vSQL = "SELECT * INTO OUTFILE 'c:\\info.txt' FROM info";
m_pConnection->Execute(vSQL,NULL,adCmdText);

以下是用CDatabase的操作:
//出错跟ADO的差不多
CDatabase m_db1;
m_db1.Open(_T( "info" ),FALSE,FALSE,_T("ODBC;UID=root;PWD=123456"));
m_db1.ExecuteSQL(vSQL);

用WinExec执行:
CString filecontent = " -uroot -p123456 "+DB_DateBase+" > "+dataDir+"";
CString sqlpath = "D:\\Program Files\\MySQL\\MySQL Server 5.0\\bin\\mysqldump";
filecontent = sqlpath +filecontent; // mysqldump路径文件及备份参数设置
UINT rlt;
rlt=WinExec (filecontent ,0); // 通过API 函数调用mysqldump并执行备份
//调试时rlt = 33,只要大于32就执行成功,可是没有文件输出
switch (rlt)
{
case 0:
MessageBox("The system is out of memory or resources.");break;
case ERROR_BAD_FORMAT:
MessageBox("The .exe file is invalid.");break;
case ERROR_FILE_NOT_FOUND:
MessageBox("The specified file was not found.");break;
case ERROR_PATH_NOT_FOUND:
MessageBox("The specified path was not found.");break;
default:
MessageBox("success");
}

请大家给点意见,看看是什么地方出了问题,还是我的方法不正确呢
...全文
1037 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuchen 2008-12-05
  • 打赏
  • 举报
回复
那得保存表结构,如果表不存在,用MYSQL恢复还是不行,还有就是能不能实现增量备份和差异备份呢
xuchen 2008-12-05
  • 打赏
  • 举报
回复
C API函数好像不能执行MYSQLDUMP这类的备份语句吧
oyljerry 2008-12-04
  • 打赏
  • 举报
回复
ShellExecute等调用CMD.exe来执行命令行
xuchen 2008-12-04
  • 打赏
  • 举报
回复
你这个语句是用什么函数执行的呢
oyljerry 2008-12-04
  • 打赏
  • 举报
回复
CMD.EXE /S /C "mysqldump --user=root --password=123456 stu>E:\114.dmp"
xuchen 2008-12-04
  • 打赏
  • 举报
回复
请高手们能否解释的详细些,我对MYSQL不是很熟悉
oyljerry 2008-12-04
  • 打赏
  • 举报
回复
需要对应的sql语句支持
一条晚起的虫 2008-12-04
  • 打赏
  • 举报
回复
在MySQL的备份中没有看到对BACKUP DATABASE的描述,估计是不支持。
mysqldump是一个程序,可以用WinExec,CreateProcess等执行
http://dev.mysql.com/doc/refman/5.0/en/backup.html
oyljerry 2008-12-04
  • 打赏
  • 举报
回复
可以先判断,如果不存在,先创建一下
xuchen 2008-12-04
  • 打赏
  • 举报
回复
还有就是用mysql 恢复数据库时,数据库和表必须存在,才能备份,如果数据库和表不存在,应该使用什么备份呢
xuchen 2008-12-04
  • 打赏
  • 举报
回复
我也看到过,但是用MYSQL的C API可以执行备份语句吗,具体的是用哪个函数
猞猁狲 2008-12-04
  • 打赏
  • 举报
回复
操作MySql用ADO效率高吗? 为什么不用MySql的C-API

关于恢复、备份操作,MySql的文档里有,这是相关段落
===============================================================
5.9.1. 数据库备份
因为MySQL表保存为文件方式,很容易备份。要想保持备份的一致性,对相关表执行LOCK TABLES操作,然后对表执行FLUSH TABLES。参见13.4.5节,“LOCK TABLES和UNLOCK TABLES语法”和13.5.5.2节,“FLUSH语法”。你只需要读锁定;这样当你复制数据库目录中的文件时,允许其它客户继续查询表。需要FLUSH TABLES语句来确保开始备份前将所有激活的索引页写入硬盘。

如果你想要进行SQL级别的表备份,你可以使用SELECT INTO ...OUTFILE或BACKUP TABLE。对于SELECT INTO ...OUTFILE, 输出的文件不能先存在。对于BACKUP TABLE也如此,因为覆盖完整的文件会有安全风险。参见13.2.7节,“SELECT语法”和13.5.2.2节,“BACKUP TABLE语法”。

备份数据库的另一个技术是使用mysqldump程序或mysqlhotcopy脚本。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。

1. 完全备份数据库:

2. shell> mysqldump --tab=/path/to/some/dir --opt db_name
或:

shell> mysqlhotcopy db_name /path/to/some/dir
只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。

3. 如果mysqld在运行则停止,然后用--log-bin[=file_name]选项来启动。参见5.11.3节,“二进制日志”。二进制日志文件中提供了 执行mysqldump之后对数据库的更改进行复制所需要的信息。

对于InnoDB表,可以进行在线备份,不需要对表进行锁定;参见8.8节,“mysqldump:数据库备份程序”。

MySQL支持增量备份:需要用--log-bin选项来启动服务器以便启用二进制日志;参见5.11.3节,“二进制日志”。当想要进行增量备份时(包含上一次完全备份或增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制到备份位置。这些二进制日志为增量备份;恢复时,按照下面的解释应用。下次进行完全备份时,还应使用FLUSH LOGS或mysqlhotcopy --flushlogs回滚二进制日志。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。

如果MySQL服务器为从复制服务器,则无论选择什么备份方法,当备份从机数据时,还应备份master.info和relay-log.info文件。恢复了从机数据后,需要这些文件来继续复制。如果从机执行复制LOAD DATA INFILE命令,你应还备份用--slave-load-tmpdir选项指定的目录中的SQL_LOAD-*文件。(如果未指定,该位置默认为tmpdir变量值)。从机需要这些文件来继续复制中断的LOAD DATA INFILE操作。

如果必须恢复MyISAM表,先使用REPAIR TABLE或myisamchk -r来恢复。99.9%的情况下该方法可以工作。如果myisamchk失败,试试下面的方法。请注意只有用--log-bin选项启动了MySQL从而启用二进制日志它才工作;参见5.11.3节,“二进制日志”。

1. 恢复原mysqldump备份,或二进制备份。

2. 执行下面的命令重新更新二进制日志:

3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些情况下,你可能只想要从某个位置重新运行某些二进制日志。(通常你想要从恢复备份的日期重新运行所有二进制日志,查询不正确时例外)。关于mysqlbinlog工具和如何使用它的详细信息参见8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。

还可以对具体文件进行选择备份:

· 要想复制表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。

· 要想重载表,使用LOAD DATA INFILE 'file_name' REPLACE ...并恢复。要避免复制记录,表必须有PRIMARY KEY或一个UNIQUE索引。当新记录复制唯一键值的旧记录时,REPLACE关键字可以将旧记录替换为新记录。

如果备份时遇到服务器性能问题,可以有帮助的一个策略是在从服务器而不是主服务器上建立复制并执行备份。参见6.1节,“复制介绍”。

如果使用Veritas文件系统,可以这样备份:

1. 从客户端程序执行FLUSH TABLES WITH READ LOCK。

2. 从另一个shell执行mount vxfs snapshot。

3. 从第一个客户端执行UNLOCK TABLES。

4. 从快照复制文件。

5. 卸载快照。

xuchen 2008-12-04
  • 打赏
  • 举报
回复
用mysql我把数据库文件夹删掉,用这个恢复好象不行,如果文件夹存在,它也会出错,究竟是什么原因呢
oyljerry 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xuchen 的回复:]
改了下,可以生成备份文件了
CString filecontent = "/c mysql -u root -p123456 "+DB_DateBase+" <  "+dataDir+"";
CString sqlpath = "cmd.exe";
ShellExecute(this->m_hWnd,"open",sqlpath,filecontent,NULL,0);
但是恢复的时候却不成功
CString filecontent = "/c mysql -u root -pxu1234 "+DB_DateBase+" <  "+dataDir+"";
CString sqlpath = "cmd.exe";
ShellExecute(this->m_hWnd,"open",sqlpath,filecontent,NU…
[/Quote]

mysql -h hostname -uusername -ppassword databasename < backupfile.sql

还原压缩的MySQL数据库
xuchen 2008-12-04
  • 打赏
  • 举报
回复
改了下,可以生成备份文件了
CString filecontent = "/c mysql -u root -p123456 "+DB_DateBase+" < "+dataDir+"";
CString sqlpath = "cmd.exe";
ShellExecute(this->m_hWnd,"open",sqlpath,filecontent,NULL,0);
但是恢复的时候却不成功
CString filecontent = "/c mysql -u root -pxu1234 "+DB_DateBase+" < "+dataDir+"";
CString sqlpath = "cmd.exe";
ShellExecute(this->m_hWnd,"open",sqlpath,filecontent,NULL,0);

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧