新聞中心
隨著信息化和互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,人們對于數(shù)據(jù)的重視程度越來越高。在企業(yè)運營和管理中,數(shù)據(jù)庫作為數(shù)據(jù)管理的主要工具,其重要性不言而喻。但是,即使是最完善的系統(tǒng)也難以避免數(shù)據(jù)丟失、損壞等情況,這時備份和還原數(shù)據(jù)庫就顯得尤為重要。本文將介紹如何用的過程。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都建筑動畫等網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷推廣解決方案、網(wǎng)站設(shè)計等建站排名服務(wù)。
一、數(shù)據(jù)庫備份
1. 創(chuàng)建備份文件
需要創(chuàng)建一個備份文件,將需要備份的數(shù)據(jù)庫信息存儲到備份文件中。在C語言中,可以使用fopen函數(shù)創(chuàng)建一個備份文件。有兩種方式可以打開文件,一種是文本文件,一種是二進制文件。
“`
/* 打開備份文件 */
FILE *fp;
fp = fopen(“backup.dat”, “wb”);
if(format == TEXT) {
fp = fopen(“backup.txt”, “w”);
}
“`
其中,format是備份文件的格式,可以通過傳參控制。如果是文本格式,就使用“w”打開文件,如果是二進制格式,就使用“wb”。
2. 遍歷數(shù)據(jù)庫
接下來,需要遍歷數(shù)據(jù)庫中的所有表格和數(shù)據(jù),并將其寫入備份文件中??梢允褂肕ySQL提供的API函數(shù)進行遍歷。
“`
/* 遍歷數(shù)據(jù)庫 */
MYSQL_RES *result;
MYSQL_ROW row;
mysql_query(conn, “show tables”);
result = mysql_use_result(conn);
while((row = mysql_fetch_row(result))) {
// 獲取表名
char table[100];
sprintf(table, “%s”, row[0]);
// 獲取表數(shù)據(jù)
int rows = getRows(conn, table);
mysql_query(conn, “set names utf8”);
sprintf(sql, “select * from %s”, table);
mysql_query(conn,sql);
result = mysql_store_result(conn);
// 寫入表格信息到備份文件中
createTable(fp, rows, result, table);
}
“`
上述代碼中,conn是MySQL連接句柄,getRows函數(shù)是獲取表格的行數(shù)函數(shù),sql是SQL語句,createTable是將表格信息寫入備份文件中的函數(shù)。
3. 關(guān)閉文件
完成備份之后,需要關(guān)閉備份文件,釋放內(nèi)存。
“`
/* 關(guān)閉備份文件 */
fclose(fp);
mysql_free_result(result);
mysql_close(conn);
“`
二、數(shù)據(jù)庫還原
1. 獲取備份文件
在數(shù)據(jù)庫還原的過程中,需要獲取備份文件中的數(shù)據(jù)。同樣,可以使用fopen函數(shù)打開備份文件并讀取備份文件的數(shù)據(jù)。根據(jù)之前備份時選擇的格式,可以通過“r”或“rb”方式打開備份文件。
“`
/* 獲取備份文件 */
FILE *fp;
fp = fopen(“backup.dat”, “rb”);
if(format == TEXT) {
fp = fopen(“backup.txt”, “r”);
}
“`
2. 連接數(shù)據(jù)庫
在獲取備份文件之后,需要連接數(shù)據(jù)庫。同樣,可以使用MySQL提供的API函數(shù)進行連接。
“`
/* 連接數(shù)據(jù)庫 */
MYSQL *conn;
conn = mysql_init(NULL);
mysql_real_connect(conn,”localhost”,”root”,””,”test”, 0, NULL, 0);
“`
3. 讀取備份文件
接下來,需要從備份文件中讀取數(shù)據(jù),并還原到數(shù)據(jù)庫中。具體操作是,讀取備份文件中的表格信息,然后通過SQL語句將表格信息寫入數(shù)據(jù)庫中。
“`
/* 讀取備份文件并還原到數(shù)據(jù)庫中 */
while(fscanf(fp, “%s”, table) != EOF) {
// 獲取表格信息
int rows;
fscanf(fp, “%d”, &rows);
char types[100][100], fields[100][100];
for(int i = 0; i
fscanf(fp, “%s %s”, types[i], fields[i]);
}
// 利用SQL語句將表格信息寫入數(shù)據(jù)庫中
char sql[1000];
sprintf(sql, “create table %s(“, table);
for(int i = 0; i
strcat(sql, fields[i]);
strcat(sql, ” “);
strcat(sql, types[i]);
strcat(sql, “,”);
}
sprintf(sql+strlen(sql)-1, “)”);
mysql_query(conn,sql);
}
“`
上述代碼中,fscanf函數(shù)用于從備份文件中讀取數(shù)據(jù),而sprintf和strcat函數(shù)用于拼接SQL語句。
4. 關(guān)閉文件
還原完成之后,需要關(guān)閉備份文件,并釋放內(nèi)存。
“`
/* 關(guān)閉備份文件 */
fclose(fp);
mysql_close(conn);
“`
三、
本文介紹了如何用的過程。通過遍歷數(shù)據(jù)庫、創(chuàng)建備份文件、讀取備份文件等操作,實現(xiàn)了備份和還原的功能。實際應(yīng)用中,可以根據(jù)需要修改代碼,適應(yīng)不同的數(shù)據(jù)庫系統(tǒng)、備份方式等情況。本文的代碼示例同樣適用于其他編程語言,讀者可以參照代碼實現(xiàn)自己的數(shù)據(jù)庫備份和還原功能。
相關(guān)問題拓展閱讀:
- windows mysql幾種備份和 恢復(fù)
- MySQL數(shù)據(jù)庫備份和還原的常用命令?
windows mysql幾種備份和 恢復(fù)
1、復(fù)制date文件夾備份
============================
假想環(huán)境:
MySQL 安裝位置:C:\MySQL
論壇數(shù)據(jù)庫名稱為:bbs
數(shù)據(jù)庫備份目的地:C:\db_bak\
============================
新建db_bak.bat,寫入以下代碼
*******************************Code Start*****************************
net stop mysql
xcopy c:\mysql\data\bbs\*.* c:\db_bak\bbs\%date:~0,10%\ /S /I
net start mysql
*******************************Code End *****************************
然后使用Windows的“計劃任務(wù)”定時執(zhí)行該批處理腳本即可。(例肢擾做如:每天凌晨3點執(zhí)行back_db.bat)
解釋:備份和恢復(fù)的操作都比較簡單,完整性比較高,控制備份周期比較靈活,例如,用%date:~0,10%。此方法適合有獨立主機但對mysql沒有管理經(jīng)驗的用戶。缺點是占用空間比較多,備份期間mysql會短時間斷李掘開(例如:針對30M左右的數(shù)據(jù)庫耗時5s左右),針對%date:~0,10%的用法參考。
2、mysqldump備份成sql文件
==============
假想環(huán)境:
MySQL 安裝位置:C:\MySQL
論壇數(shù)據(jù)庫名稱為:bbs
MySQL root 密碼:123456
數(shù)據(jù)庫備份目的地:D:\db_backup\
腳本:
rem *******************************Code Start*****************************
@echo off
set “Ymd=%date:~,4%%date:~5,2%%date:~8,2%”
C:\MySQL\bin\mysqldump –opt -u root –password=bbs > D:\db_backup\bbs_%Ymd%.sql
@echo on
rem *******************************Code End*****************************
將以上代碼保存為backup_db.bat
然后使用Windows的“計劃任務(wù)”定時執(zhí)行該腳本即可。(例如:每天凌晨5點執(zhí)行back_db.bat)
說明:此方法可以不用關(guān)閉數(shù)據(jù)庫,并且可以按歷衡每一天的時間來名稱備份文件。
通過%date:~5,2%來組合得出當前日期,組合的效果為yyyymmdd,date命令得到的日期格式默認為yyyy-mm-dd(如果不是此格式可以通過pause命令來暫停命令行窗口看通過%date:~,20%得到的當前計算機日期格式),所以通過%date:~5,2%即可得到日期中的第五個字符開始的兩個字符,例如今天為,通過%date:~5,2%則可以得到02。(日期的字符串的下標是從0開始的)
3、利用WinRAR對MySQL數(shù)據(jù)庫進行定時備份。
對于MySQL的備份,更好的方法就是直接備份MySQL數(shù)據(jù)庫的Data目錄。下面提供了一個利用WinRAR來對Data目錄進行定時備份的方法。
首先當然要把WinRAR安裝到計算機上。
將下面的命令寫入到一個文本文件里
*******************************Code Start*****************************
net stop mysql
c:\progra~1\winrar\winrar a -ag -k -r -s d:\mysql.rar d:\mysql\data
net start mysql
*******************************Code End*****************************
保存,然后將文本文件的擴展名修改成CMD。進入控制面版,打開計劃任務(wù),雙擊“添加計劃任務(wù)”。在計劃任務(wù)向?qū)е姓业絼偛诺腃MD文件,接著為這個任務(wù)指定一個運行時間和運行時使用的賬號密碼就可以了。
這種方法缺點是占用時間比較多,備份期間壓縮需要時間,mysql斷開比之一種方法更多的時間,但是對于文件命名很好。
設(shè)mysql 安裝在c:盤,mysql數(shù)據(jù)庫的用戶名是root,密碼是123456,數(shù)據(jù)庫名是database_name,在d:盤根目錄下面存放備份數(shù)據(jù)庫,備份數(shù)據(jù)庫名槐檔字為database_name_backup_.sql(.sql為備份咐梁日期)
備份數(shù)據(jù)庫:
mysqldump -uroot -pdatabase_name>d:/database_name_backup_.sql
恢復(fù)數(shù)據(jù)庫:
刪除原有數(shù)據(jù)庫,建立數(shù)據(jù)庫,把備份數(shù)據(jù)庫導(dǎo)入。
mysqladmin -uroot -pdrop database_name
衡明運mysqladmin -uroot -pcreate database_name
mysql -uroot -pdatabase_name
注:在導(dǎo)入備份數(shù)據(jù)庫前,database_name如果沒有,是需要創(chuàng)建的;而且與database_name_backup_.sql中數(shù)據(jù)庫名是一樣的才能導(dǎo)入。
注:環(huán)境Windows命令行。
前言
MySQL 5.6引入了GTID,每個事務(wù)都會產(chǎn)生一個GTID,我們可以通過驗證主從GTID來驗證主從數(shù)據(jù)的一致性。
為了敘述簡便,定義一個量ALL_GTID: 表示某個數(shù)據(jù)庫實例上 所有存在過的 或 將要存在的事務(wù) 的GTID(包括已經(jīng)被purge掉的事務(wù))。
在討論數(shù)據(jù)庫可用性的場景中, 當發(fā)生主備切換時, 需要進行數(shù)據(jù)補償。通過比較主備的ALL_GTID,可以確定需要補償多少數(shù)據(jù):
在實例存活的情況,可以在實例狀態(tài)中查詢ALL_GTID。
在實例崩潰的情況,無法在實例狀態(tài)中查詢ALL_GTID。可以通過查詢BINLOG中的Previous-GTIDs計算來獲得ALL_GTID。
下面列舉與ALL_GTID相關(guān)的變量。
與ALL_GTID相關(guān)的變量
Previous-GTIDs
Previous-GTIDs格式如下(環(huán)境為MySQL5.7,日志手動flush binary logs獲得):
查看新輪轉(zhuǎn)出的BINLOG:
下面為mysql-bin.00001中包含的GTID:
請點擊輸入圖片描述
然后再次flush binary logs:
請點擊輸入圖片描述
mysql-bin.00002中是沒有任何GTID的。
請點擊輸入圖片描述
綜上Previous-GTIDs是本身這個BINLOG文件前面的所有BINLOG的。
請點擊輸入圖片描述
全局變量中的GTID相關(guān)的變量
請點擊輸入圖片描述
變量解釋:
gtid_executed 代表著server上所有事務(wù)執(zhí)行產(chǎn)生的GTID(包含已經(jīng)被purge的BINLOG中的GTID或者是手動set gtid_purged的GTID)。
gtid_purged 代表著已經(jīng)被purge到的GTID。gtid_purged是gtid_executed的子集。
gtid_retrieved 是從機上relay_log中的GTID。
ALL_GTID 的計算
了解了GTID相關(guān)的變量之后,可以得到獲得實例的All_GTID的的方法:
對象
方法
存活的Master實例 gtid_executed
存活的Slave實例 gtid_executed和gtid_retrieved的并集
非存活Master實例 最后一個BINLOG文件的Previous-GTIDs + 最后一個BINLOG文件中所有的GTID
非存活Slave實例 最后一個BINLOG文戚虧件的Previous-GTIDs + 最后一個BINLOG文件中所有的GTID
在獲得非存活實例中的ALL_GTID時,最后一個BINLOG文件中的GTID可能不連續(xù)(比如事務(wù)同時來自于本實例客戶端和復(fù)制回放),所以需要掃描最后一個BINLOG文件。
生產(chǎn)中我們使用Xtrabackup來產(chǎn)生一個 從實例 的流程如下:
拉取備份,進行還原
change master to
set @@global.gtid_purged=’xxx’;
set @@global.gtid_purged=’xxx’; 的影響:
將 從實例 的ALL_GTID手工置為xxx, 在通過GTID方式建立復(fù)制時不會出錯.
將更新Binlog中記錄的Previous-GTIDs (由于Binlog不可改變, 將產(chǎn)生新的Binlog, 記錄新的Previous-GTIDs).
MySQL 5.7中set gtid_purged的行為變更
問題描述
回顧一下備份恢復(fù)的流歷渣程:
拉取備份,進行還原
change master to
set @@global.gtid_purged=’xxx’;
現(xiàn)象: 發(fā)現(xiàn)有一臺MySQL 5.7的Slave服務(wù)器恢復(fù)后沒有產(chǎn)生 正確的Previous-GTIDs。
分析
分析整個過程,解決問題高爛神應(yīng)該分階段進行手動模擬發(fā)現(xiàn)問題。以下為詳細步驟:
手工還原備份
環(huán)境
BINLOG數(shù)量,Previous-GTIDs狀態(tài)
Xtrabackup 2.4.2 & MySQL 5.6 1,空
Xtrabackup 2.4.2 & MySQL 5.7 1,空
Xtrabackup 2.2.9 & MySQL 5.6 1,空
Xtrabackup 2.2.9 & MySQL 5.7 1,空
可見: 恢復(fù)過程不會輪轉(zhuǎn)BINLOG。
驗證change master和set gtid_purged在不同的MySQL版本中執(zhí)行的差異
環(huán)境
BINLOG數(shù)量,Previous-GTIDs狀態(tài)
change master & MySQL 5.6 1,空
change master & MySQL 5.7 1,空
set gtid_purged & MySQL 5.6 2,正常
set gtid_purged & MySQL 5.7 1,空
可見: 執(zhí)行set gtid_purged時不同版本的MySQL產(chǎn)生了差異
驗證
對不同版本MySQL單獨執(zhí)行set @@global.gtid_purged=”;語句。檢查結(jié)果
環(huán)境
進行的操作
BINLOG數(shù)量,Previous-GTIDs狀態(tài)
MySQL 5.7 reset master; set @@global.gtid_purged=”; 1,空
MySQL 5.6 reset master; set @@global.gtid_purged=”; 2,正常
結(jié)論
參考:
官方解釋: 在5.7版本中,執(zhí)行SET GTID_PURGED語句后binlog_simple_gtid_recovery會給GTID_PURGED計算出一個錯誤的值。
由于5.7中新增了存儲GTID的表。所以5.7版本中set @@global.gtid_purged=”;語句被改成只修改存放GTID的表。
而5.6版本中會進行BINLOG輪轉(zhuǎn)和向Previous_gtids_log_event中添加GTID。如果5.7需要產(chǎn)生和5.6相同結(jié)果的話,可以在SET GTID_PURGED語句后手動執(zhí)行flush binary logs語句。
MySQL數(shù)據(jù)庫備份和還原的常用命令?
1.備份MySQL數(shù)據(jù)庫的命令
mysqldump-hhostname-uusername-ppassworddatabasename>backupfile.sql
2.備份MySQL數(shù)據(jù)庫為帶刪除表的格式,能夠讓該備份覆蓋已有數(shù)據(jù)庫而不需要手動刪除原有數(shù)據(jù)庫。
mysqldump-_add-drop-table-uusername-ppassworddatabasename>backupfile.sql
3.直接將MySQL數(shù)據(jù)庫壓縮備份
mysqldump-hhostname-uusername-ppassworddatabasename|gzip>backupfile.sql.gz
4.備份MySQL數(shù)據(jù)庫某個(些)表
mysqldump-hhostname-uusername-ppassworddatabasenamespecific_table1specific_table2>backupfile.sql
5.同時備份多個MySQL數(shù)據(jù)庫
mysqldump-hhostname-uusername-ppassword_databasesdatabasename1databasename2databasename3>multibackupfile.sql
6.僅僅備份灶此數(shù)據(jù)庫結(jié)構(gòu)
mysqldump_no-data_databasesdatabasename1databasename2databasename3>structurebackupfile.sql
7.備份服務(wù)器上所有數(shù)據(jù)庫
mysqldump_all-databases>allbackupfile.sql
8.還原MySQL數(shù)據(jù)庫的命令
mysql-hhostname-uusername-ppassworddatabasename
9.還隱碰迅原壓縮的MySQL數(shù)據(jù)庫
gunzip
10.將數(shù)據(jù)庫轉(zhuǎn)移到新服吵缺務(wù)器
mysqldump-uusername-ppassworddatabasename|mysql_host=*.*.*.*-Cdatabasename
c 實現(xiàn)數(shù)據(jù)庫的備份和還原的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于c 實現(xiàn)數(shù)據(jù)庫的備份和還原,C語言實現(xiàn)數(shù)據(jù)庫備份和還原,windows mysql幾種備份和 恢復(fù),MySQL數(shù)據(jù)庫備份和還原的常用命令?的信息別忘了在本站進行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
當前文章:C語言實現(xiàn)數(shù)據(jù)庫備份和還原(c實現(xiàn)數(shù)據(jù)庫的備份和還原)
URL分享:http://m.5511xx.com/article/ccoppss.html


咨詢
建站咨詢
