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數據庫的一個備份與恢復的過程。如果可以將導出的數據集遠程傳輸到異地,之後再由異地回傳回本地,即可完成一個異地容災數據庫備份的功能。這也是一個異地數據庫容災備份的一個最基本實現的核心思想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章