SQL-基本學習III-資料庫備份恢復
阿新 • • 發佈:2018-12-28
目錄
最近在一個小專案中,遇到一個需求,客戶希望能夠提供資料庫的備份與恢復的功能,發現當前的一些解決方案還是比較簡單易行的,主要是通過現有的一些工具完成資料集的一個匯入與匯出。
注意資料庫與資料表的匯入匯出的方式還是有一定的區別的。資料表的匯入匯出可以利用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資料庫的一個備份與恢復的過程。如果可以將匯出的資料集遠端傳輸到異地,之後再由異地回傳回本地,即可完成一個異地容災資料庫備份的功能。這也是一個異地資料庫容災備份的一個最基本實現的核心思想。