最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

細(xì)聊MySQL的備份與恢復(fù)

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 16:15:42
文檔

細(xì)聊MySQL的備份與恢復(fù)

細(xì)聊MySQL的備份與恢復(fù):備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果數(shù)據(jù)庫在使用過程中出現(xiàn)了問題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫恢復(fù)工作,并使我們的數(shù)據(jù)損失到最 備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果
推薦度:
導(dǎo)讀細(xì)聊MySQL的備份與恢復(fù):備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果數(shù)據(jù)庫在使用過程中出現(xiàn)了問題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫恢復(fù)工作,并使我們的數(shù)據(jù)損失到最 備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果

備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果數(shù)據(jù)庫在使用過程中出現(xiàn)了問題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫恢復(fù)工作,并使我們的數(shù)據(jù)損失到最

備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果數(shù)據(jù)庫在使用過程中出現(xiàn)了問題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫恢復(fù)工作,并使我們的數(shù)據(jù)損失到最小。下面,我從備份類型、備份方法及一些常用的例子來和大家詳細(xì)探討下數(shù)據(jù)庫的備份與恢復(fù)。

一、備份類別

1、物理備份與邏輯備份

物理備份用人話來形容就是復(fù)制數(shù)據(jù)庫的數(shù)據(jù)文件。如果我們需要備份名為test的數(shù)據(jù)庫,則我們可以將數(shù)據(jù)目錄下的test目錄復(fù)制到備份設(shè)備中。如果我們需要備份test庫下名為user的表,則可以根據(jù)不同的存儲(chǔ)引擎選取不同的數(shù)據(jù)文件來復(fù)制。如user是myisam,則可以復(fù)制user.frm,user.MYD,user.MYI文件。如user是innodb,則可以復(fù)制user.frm,user.ibd。其中.frm是包含數(shù)據(jù)結(jié)構(gòu)的文件。.MYD是myisam引擎中包含具體數(shù)據(jù)的文件。.MYI是myisam引擎中包含索引內(nèi)容的文件。.ibd是innodb引擎中包含具體數(shù)據(jù)的文件。

邏輯備份是將數(shù)據(jù)庫的結(jié)構(gòu)對(duì)象及數(shù)據(jù)對(duì)象(所有的事件、觸發(fā)器、存儲(chǔ)過程等)轉(zhuǎn)化為SQL語句后再保存到備份文件中。所以邏輯備份與具體的操作平臺(tái)無關(guān)。

物理備份的特征:

1、它是直接復(fù)制二進(jìn)制數(shù)據(jù)文件的,所以我們?cè)诨謴?fù)數(shù)據(jù)時(shí)只能原樣恢復(fù),不能自定義修改數(shù)據(jù)文件再恢復(fù)。

2、物理備份比邏輯備份速度更快,因?yàn)闆]有轉(zhuǎn)化SQL這一過程。

3、物理備份不支持細(xì)粒度的備份,如果你只是想備份某個(gè)表中的某一范圍的行,可能會(huì)難以辦到。

4、物理備份可能會(huì)丟失最新寫入到數(shù)據(jù)庫的數(shù)據(jù)。因?yàn)樵谖锢韨浞輹r(shí),可能會(huì)有新增的數(shù)據(jù)還駐留在內(nèi)存中,沒有寫入硬盤。

5、物理備份對(duì)平臺(tái)有一定的要求,如果兩個(gè)操作系統(tǒng)的文件系統(tǒng)不一樣,有可能會(huì)不能恢復(fù)數(shù)據(jù)。所以要求盡可能在相同的操作系統(tǒng)及文件系統(tǒng)上實(shí)現(xiàn)數(shù)據(jù)的備份與恢復(fù)。

6、最好在服務(wù)器停止運(yùn)行時(shí)執(zhí)行物理備份,否則可能需要正確的加鎖策略來確保數(shù)據(jù)一致。

邏輯備份的特征:

1、通過將需備份的數(shù)據(jù)轉(zhuǎn)換成SQL來完成備份,所以在恢復(fù)數(shù)據(jù)時(shí),我們可以通過修改SQL的方式來自定義恢復(fù)的內(nèi)容,有更大的靈活性。

2、因?yàn)樘卣?的原因,所以在速度方面會(huì)比物理備份慢,因此不太適合大量數(shù)據(jù)的備份。

3、備份力度方面比物理備份更細(xì),可以到行級(jí)。

4、不依賴具體的操作系統(tǒng)平臺(tái)。

5、備份時(shí)無需停止服務(wù)器。


2、在線備份與離線備份

在線備份是通過遠(yuǎn)程客戶端連到服務(wù)器進(jìn)行備份,如在客戶端使用導(dǎo)出工具導(dǎo)出SQL備份文件。在備份時(shí)應(yīng)該在SQL上加合適的鎖防止數(shù)據(jù)不一致的情況。比如寫數(shù)據(jù)時(shí)應(yīng)加寫鎖以防止導(dǎo)出數(shù)據(jù)集時(shí)發(fā)生數(shù)據(jù)不一致。

離線備份是在服務(wù)器停運(yùn)的狀態(tài)下進(jìn)行備份,因?yàn)榇藭r(shí)不會(huì)有數(shù)據(jù)操作,所以它在實(shí)現(xiàn)上更簡單。


3、完全備份與增量備份

完全備份就是備份到目前為止的所有數(shù)據(jù)。增量備份只備份自上一次完全備份或增量備份到至今,期間有所變化的數(shù)據(jù)。實(shí)現(xiàn)完全備份的方法有很多,如使用邏輯備份或者物理備份都可以實(shí)現(xiàn)完全備份。完全備份在恢復(fù)時(shí)是最方便的,但在備份時(shí)通常需要耗費(fèi)很長的時(shí)間,所以如果數(shù)據(jù)庫的數(shù)據(jù)量非常大,每天都執(zhí)行完全備份是不現(xiàn)實(shí)的。應(yīng)采用完全備份與增量備份相結(jié)合的策略。如在每個(gè)星期天執(zhí)行一次完全備份,禮拜一到禮拜五實(shí)行增量備份。增量備份的特性與完全備份剛好相反,在備份時(shí)會(huì)非常的快捷方便,但在還原時(shí)會(huì)比較繁瑣。而且要實(shí)現(xiàn)增量備份,我們必須在服務(wù)器運(yùn)行時(shí)開啟二進(jìn)制日志。這樣我們?cè)诨謴?fù)時(shí)才能根據(jù)二進(jìn)制日志來進(jìn)行實(shí)時(shí)恢復(fù)。


二、備份方法

物理備份方法通常是用專門的MySQL備份工具或操作系統(tǒng)的相關(guān)指令進(jìn)行的,這里強(qiáng)調(diào)一點(diǎn),就是在進(jìn)行物理復(fù)制的時(shí)候,在執(zhí)行復(fù)制之前應(yīng)給需要備份的表加讀鎖,并且需要將駐留在內(nèi)存的索引信息寫入I/O,具體命令為FLUSH TABLES WITH READ LOCK。下面我主要介紹下MySQL普通版本下的備份方法。

使用mysqldump實(shí)現(xiàn)數(shù)據(jù)庫的邏輯備份。

mysqldump命令在mysql安裝目錄的bin目錄下。主要作用是導(dǎo)出SQL文件。具體語法格式如下:

mysqldump [options] db_name [tbl_name ...] 
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases


常用的可選參數(shù)如下:

參數(shù)描述適用廢棄
--add-drop-database在每個(gè) CREATE DATABASE 聲明前加上DROP DATABASE 聲明

--add-drop-table在每個(gè) CREATE TABLE 聲明前加上DROP TABLE 聲明

--add-drop-trigger在每個(gè) CREATE TRIGGER 聲明前加上DROP TRIGGER 聲明

--add-locks在備份時(shí)所表

--all-databases備份所有數(shù)據(jù)庫里的所有表

--allow-keywords將表名作為列名的前綴

--apply-slave-statements將STOP SLAVE放在CHANGE MASTER聲明前,并將START SLAVE放在結(jié)尾

--comments增加注釋到備份文件

--compact生成更加緊湊的輸出

--compatible=name[,name,...]生成更加兼容的格式

--complete-insert使用完整的 INSERT 聲明

--create-options在CREATE TABLE聲明里包含所有的MySQL指定選項(xiàng)

--databases備份指定的數(shù)據(jù)庫

--delete-master-logs在執(zhí)行dump操作后刪除master節(jié)點(diǎn)的binlog

--disable-keys對(duì)于每一個(gè)表的INSERT聲明前加上/*!40000 ALTER TABLE tbl_name DISABLE KEYS */; 和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */,這樣可以更快的載入dump文件,但僅僅對(duì)具有非唯一索引的MyISAM表有效。

--dump-date包含dump時(shí)間

--extended-insert使用批量插入語法

--flush-logs在開始導(dǎo)出前刷新MYSQL server日志文件

--flush-privileges在導(dǎo)出后刷新權(quán)限

--hex-blob使用16進(jìn)制導(dǎo)出二進(jìn)制列

--ignore-error=error[,error]...跳過指定的錯(cuò)誤5.7.1
--ignore-table=db_name.tbl_name不導(dǎo)出指定的表

--insert-ignore寫INSERT IGNORE 聲明,而不是 INSERT 聲明

--lock-all-tables鎖所有的數(shù)據(jù)庫表

--lock-tables導(dǎo)出前所數(shù)據(jù)庫內(nèi)的表

--login-path=name同mysql命令

--max_allowed_packet=value同mysql命令

--net_buffer_length=value同mysql命令

--no-autocommit添加 SET autocommit = 0 和COMMIT 聲明在每個(gè) INSERT 聲明前

--no-create-db不創(chuàng)建 CREATE DATABASE 聲明

--no-data不導(dǎo)出表的數(shù)據(jù)

--no-defaults同mysql命令

--no-set-names不設(shè)置字符集

--no-tablespaces不寫任何 CREATE LOGFILE GROUP 或 CREATE TABLESPACE 聲明

--opt--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset的縮寫

--order-by-primary按逐漸或唯一索引排序?qū)С鰯?shù)據(jù)行

--quote-names添加引用標(biāo)識(shí)

--replace用 REPLACE 聲明代替 INSERT 聲明

--result-file=file輸出文件到指定位置

--secure-auth同mysql命令5.7.45.7.5
--set-charset設(shè)置字符集

--set-gtid-purged=value增加 SET @@GLOBAL.GTID_PURGED

--shared-memory-base-name=name同mysql命令

--single-transaction在導(dǎo)出前寫 BEGIN SQL 聲明

--skip-add-drop-tableadd-drop-table 反向操作

--skip-add-locksadd-locks 反向操作

--skip-commentscomments 反向操作

--skip-compactcompact 反向操作

--skip-disable-keysdisable-keys 反向操作

--skip-extended-insertextended-insert 反向操作

--skip-opt關(guān)閉 --opt 選項(xiàng)

--skip-quickquick 反向操作

--skip-quote-namesquote-names 反向操作

--skip-set-charset不設(shè)置字符集

--skip-triggers不導(dǎo)出觸發(fā)器

--skip-tz-utc關(guān)閉 tz-utc 選項(xiàng)

--tab=path生成一個(gè)用tab隔開的數(shù)據(jù)文件。

--tables覆蓋 --databases 選項(xiàng)

--triggers導(dǎo)出觸發(fā)器

--tz-utc針對(duì)列中的TIMESTAMP字段,增加SET TIME_ZONE='+00:00'到導(dǎo)出文件中

--where='where_condition'導(dǎo)出符合where條件的行

--xml生成XML輸出


以下是一個(gè)簡單的備份例子,如下所示:

/usr/local/mysql/bin/mysql -uroot -p123456 \
-h127.0.0.1 -e"flush tables with read lock” \
#將駐留在內(nèi)存中的數(shù)據(jù)寫入表中并給所有表添加讀鎖
/usr/local/mysql/bin/mysqldump -uroot -p123456 \
-h127.0.0.1 --databases test --add-drop-database \
--add-drop-table --extended-insert --create-options > \
/usr/local/mysql/backup/backup.sql
#備份test庫到backup.sql文件。加了—databases后,會(huì)在備份文件里
生成創(chuàng)建數(shù)據(jù)庫CREATE DATABASE test;的聲明。否則,如果直接使用
mysqldump test > backup.sql命令則不會(huì)生成create database語句。
具體參數(shù)的運(yùn)用可以參考上表,如果數(shù)據(jù)較大,我們可以使用—opt選項(xiàng)進(jìn)行備份。
/usr/local/mysql/bin/mysql -uroot -p123456 \
-h127.0.0.1 -e"unlock tables”
#解除讀鎖

三、數(shù)據(jù)恢復(fù)方法

1、mysqldump恢復(fù)法

使用mysqldump備份的數(shù)據(jù),通常在一個(gè).sql文件中。要恢復(fù)數(shù)據(jù),只用利用mysql客戶端執(zhí)行備份文件即可。如:

/usr/local/mysql/bin/mysql -uroot -p123456 \
-h127.0.0.1 < /usr/local/mysql/backup/backup.sql

即可


2、二進(jìn)制日志恢復(fù)法

使用此方法的前提是你的服務(wù)器是以—log-bin參數(shù)運(yùn)行的,這樣服務(wù)器才會(huì)生成二進(jìn)制日志。使用二進(jìn)制日志恢復(fù)法需使用mysqlbinlog命令,此命令也在mysql安裝目錄的bin目錄下?;謴?fù)命令如下:

/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 \
| /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1


諸如此類xxx-bin.000001的格式均為二進(jìn)制日志文件。xxx-bin.000001里是以二進(jìn)制存儲(chǔ)的對(duì)數(shù)據(jù)庫的所有操作,所以此命令執(zhí)行后會(huì)將歷史上對(duì)數(shù)據(jù)庫的操作進(jìn)行重做,以此達(dá)到恢復(fù)數(shù)據(jù)的目的。值得注意的是,如果你有多個(gè)二進(jìn)制日志文件,如有xxx-bin.000001和xxx-bin.000002這兩個(gè)文件,如果按以下方式進(jìn)行恢復(fù)將是不安全的:

/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 \
| /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
/usr/local/mysql/bin/mysqlbinlog xxx-bin.000002 \
| /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1

這樣利用兩次客戶端連線去恢復(fù)數(shù)據(jù)是不安全的,如果在xxx-bin.000001內(nèi)有一個(gè)生成臨時(shí)表的聲明,而在xxx-bin.000002內(nèi)需要使用這個(gè)臨時(shí)表,則這樣操作將出現(xiàn)問題,執(zhí)行mysqlbinlog xxx-bin.000002時(shí)將會(huì)找不到這個(gè)臨時(shí)表。所以正確的做法應(yīng)該是:

/usr/local/mysql/bin/mysqlbinlog xxx-bin.000001 xxx-bin.000002 \
| /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1


mysqlbinlog恢復(fù)數(shù)據(jù)的方法很靈活,可以通過時(shí)間點(diǎn)與位置點(diǎn)進(jìn)行恢復(fù)如:

/usr/local/mysql/bin/mysqlbinlog —start-datetime=‘2014-01-20 8:00:00’\
—stop-datetime=‘2014-01-22 19:00:00' xxx-bin.000001\
| /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
#表示重做xxx-bin.000001文件里從2014-01-20 8:00:00到
2014-01-22 19:00:00這個(gè)時(shí)間范圍內(nèi)的操作。
/usr/local/mysql/bin/mysqlbinlog --start-position=368315\
xxx-bin.000001 | /usr/local/mysql/bin/mysql\
-uroot -p123456 -h127.0.0.1
#表示重做xxx-bin.000001文件內(nèi)從位置368315開始直到文件末尾的操作。


關(guān)于備份與恢復(fù),一般采用完全備份和增量備份結(jié)合的方法。這樣可以在保證備份效率的基礎(chǔ)上達(dá)到實(shí)時(shí)恢復(fù)要求。比如讓服務(wù)器以—log-bin參數(shù)運(yùn)行,然后每個(gè)禮拜天進(jìn)行一次mysqldump。這樣,比如2014年12月7號(hào)23點(diǎn)59分完成的備份,2014年12月9日7點(diǎn)需要進(jìn)行恢復(fù)。則首先運(yùn)行mysql < backup.2014-12-7.sql,恢復(fù)到2014年12月7日23點(diǎn)59分前的數(shù)據(jù)。然后利用mysqlbinlog hostname-bin.000001 —start-datetime=‘2014-12-8 00:00:00’ | mysql 命令恢復(fù)之后的數(shù)據(jù)。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

細(xì)聊MySQL的備份與恢復(fù)

細(xì)聊MySQL的備份與恢復(fù):備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果數(shù)據(jù)庫在使用過程中出現(xiàn)了問題,比如系統(tǒng)崩潰、硬件故障或錯(cuò)誤的刪除了數(shù)據(jù)。這時(shí),如果我們進(jìn)行了數(shù)據(jù)備份,就能比較方便的使數(shù)據(jù)庫恢復(fù)工作,并使我們的數(shù)據(jù)損失到最 備份對(duì)于數(shù)據(jù)庫來說是相當(dāng)重要的工作。如果
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top