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

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


咨詢
建站咨詢
