SQL-基本学习III-数据库备份恢复

最近在一个小项目中,遇到一个需求,客户希望能够提供数据库的备份与恢复的功能,发现当前的一些解决方案还是比较简单易行的,主要是通过现有的一些工具完成数据集的一个导入与导出。

注意数据库与数据表的导入导出的方式还是有一定的区别的。数据表的导入导出可以利用SQL就可以完成。如下:

//导出
select * from table_name into outfile 'yourpath';
//导入
load data local infile 'dump.txt' into table table_name;

但是如果想完成整个库的导入导出的话,需要通过命令行的形式,向mysql输入相关的指令。

1备份

核心思想

将选定的数据库利用mysqldump导出即可

mysqldump -u root -p123456 -R --default-character-set=utf8 db_ls > C:\Users\lenovo\Desktop\db_ls.sql
  • -u 用户名 -p后紧跟密码
  • db_ls 需要备份的数据库名称
  • C:\Users\lenovo\Desktop\db_ls.sql 导出的路径与备份集的名称
  • .sql 导出的数据集形式

C++代码实现

/**
**功能:主要是调用cmd.exe /c mysqldump -u root -p123456 -R --default-character-set=utf8 db_ls > C:\\Users\\lenovo\\Desktop\\lss.sql
***@param :backupPath:C:\\Users\\lenovo\\Desktop
***@param :backupName:不能出现“不能出现在文件命名中的特殊符号”
*/
bool LMysql::backup(string username,string password,string dbName,string backupPath,string backupName)
{
	string time = getTimeBackup();
	string str1 = "cmd.exe /c mysqldump -u" + username + " -p" + password + " " + dbName + " > " + backupPath + "\\" + backupName + time + ".sql";
	//将字符转换成宽字符指针
	const char * str1c = str1.c_str();
	TCHAR comLine[MAX_PATH];
	int iLength;
	iLength = MultiByteToWideChar(CP_ACP, 0, str1c, strlen(str1c) + 1, NULL, 0);
	MultiByteToWideChar(CP_ACP, 0, str1c, strlen(str1c) + 1, comLine, iLength);
	//构造相关的信息
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(si));  //用零来填充一个区域,完成一个初始化。
	ZeroMemory(&pi, sizeof(pi));
	si.cb = sizeof(si);
	si.dwFlags = STARTF_USESHOWWINDOW;   //指定wShowWindow成员有效
	si.wShowWindow = SW_HIDE;            //不显示窗口
	bool flag = CreateProcess(NULL, comLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
	if (flag)
	{
		WaitForSingleObject(pi.hProcess, INFINITE);
		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
		return true;
	}
	else
	{
		return false;
	}

}

将数据库拷贝至其他主机

mysqldump -u root -p123456 database_name \
|mysql -h other-host.com database_name

2恢复

核心思想

将选定的数据库利用mysql导入即可
####方式一

mysql -u root -p123456 db_ls < C:\Users\lenovo\db_ls.sql
  • -u 用户名 -p 密码 密码需要紧跟在p后面,中间不能有空格;否则需要单独输入密码
  • db_ls 数据库名称
  • C:\Users\lenovo\db_ls.sql 数据集来源

####方式二

mysql -u root -p123456
mysql>use db_ls
source C:\Users\lenovo\db_ls.sql    
  • mysql -u root -p123456 登录mysql
  • use db_ls 切换数据库
  • source 指定数据集

C++代码实现—采用第一种方法的原理

/**
**功能:mysql -u root -pls123456 wwj<C:\Users\lenovo\db_ls.sql
**@param :backupPath:C:\\Users\\lenovo\\db_ls.sql
**调用:如果数据库比较大的话,建议前台sleep一个时间间隔循环等待这个函数的值,给前端界面一个等待的标识。
*/
bool LMysql::recover(string username, string password, string dbName, string backupPath)
{
	string str1 = "cmd.exe /c mysql -u" + username + " -p" + password + " " + dbName + " < " + backupPath;
	//将字符转换成宽字符指针
	const char * str1c = str1.c_str();
	TCHAR comLine[MAX_PATH];
	int iLength;
	iLength = MultiByteToWideChar(CP_ACP, 0, str1c, strlen(str1c) + 1, NULL, 0);
	MultiByteToWideChar(CP_ACP, 0, str1c, strlen(str1c) + 1, comLine, iLength);
	//构造相关的信息
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(si));  //用零来填充一个区域,完成一个初始化。
	ZeroMemory(&pi, sizeof(pi));
	si.cb = sizeof(si);
	si.dwFlags = STARTF_USESHOWWINDOW;   //指定wShowWindow成员有效
	si.wShowWindow = SW_HIDE;            //不显示窗口
	bool flag = CreateProcess(NULL, comLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
	if (flag)
	{
		WaitForSingleObject(pi.hProcess, INFINITE);
		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
		return true;
	}
	else
	{
		return false;
	}
}

至此就已经完成了MySQL数据库的一个备份与恢复的过程。如果可以将导出的数据集远程传输到异地,之后再由异地回传回本地,即可完成一个异地容灾数据库备份的功能。这也是一个异地数据库容灾备份的一个最基本实现的核心思想。

猜你喜欢

转载自blog.csdn.net/BigBrick/article/details/85312544
今日推荐