MySQL數(shù)據(jù)庫備份與恢復(fù)基礎(chǔ)
目錄2.6.備份單個表2.7.備份多個表2.8.備份數(shù)據(jù)庫表結(jié)構(gòu)(不包含數(shù)據(jù))2.9.只備份數(shù)據(jù)庫表的數(shù)據(jù)(不包含表結(jié)構(gòu))2.10.同時將數(shù)據(jù)和表結(jié)構(gòu)分離導(dǎo)出2.11.刷新文件參數(shù)(-F)
前言1.備份數(shù)據(jù)的意義
運(yùn)維工作的核心簡單概括起來就是兩件事:第一個是保護(hù)公司的數(shù)據(jù),第二個是讓網(wǎng)站能夠7*24小時提供服務(wù)。
雖然這兩件事情都很重要,但是相比較而言,丟失一部分?jǐn)?shù)據(jù)和讓網(wǎng)站7*24小時提供服務(wù),哪個更重要呢?
對于絕大多數(shù)企業(yè)來講,失去數(shù)據(jù)就相當(dāng)于失去商機(jī),失去產(chǎn)品,失去客戶,甚至?xí)斐晒镜归],那么,在所有的數(shù)據(jù)中,最核心的數(shù)據(jù)又是哪些呢?這恐怕要屬數(shù)據(jù)庫中的數(shù)據(jù)了。既然數(shù)據(jù)庫中的數(shù)據(jù)地位這么高,那么數(shù)據(jù)庫備份與恢復(fù)的重要性就不言而喻了。
2.使用進(jìn)行數(shù)據(jù)庫備份
MySQL數(shù)據(jù)庫自帶了一個很優(yōu)秀的備份命令,即。
2.1.不帶參數(shù)備份單個數(shù)據(jù)庫
mysqldump oldboy >/opt/mysql_bak.sql
2.2.加-B參數(shù)備份
mysqldump -B oldboy >/opt/mysql_bak_B.sql #B參數(shù)的作用是增加創(chuàng)建數(shù)據(jù)庫和連接數(shù)據(jù)庫的語句,可同時備份多個庫。
2.3.使用gzip壓縮備份數(shù)據(jù)庫
mysqldump -B oldboy|gzip>/opt/mysql_bak_B.gz
2.4.命令工作原理
利用命令備份數(shù)據(jù)的過程,實(shí)際上就是把數(shù)據(jù)(包括庫表)從MySQL庫里以SQL語句的形式直接輸出或者生成備份文件的過程,這種備份成SQL語句的方式稱為邏輯備份。
使用命令可以把數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出來,并通過SQL語句的形式存儲。這種備份方式稱為邏輯備份,效率不是很高。在當(dāng)下的生產(chǎn)場景中,多用于數(shù)據(jù)量不是很大的備份情況,例如30GB以內(nèi)的數(shù)據(jù)。若在數(shù)據(jù)庫數(shù)據(jù)很大的時候采用此備份方法,則所用的時候就會很長,恢復(fù)的時間也會很長,因此,當(dāng)數(shù)據(jù)大于30GB后,建議選擇其他的諸如的物理方式進(jìn)行備份和恢復(fù)。
2.5.備份多個庫2.5.1.備份多個庫
mysqldump -B oldboy oldboy_utf8 mysql|gzip>/opt/all.sql.gz
2.5.2.如何做分庫備份
分庫備份實(shí)際上就是每次只執(zhí)行一個備份命令語句備份一個庫,如果數(shù)據(jù)庫里有多個庫,就執(zhí)行多條相同的語句來備份各個庫。
mysqldump -uroot -p'oldboy123' -B oldboy |gzip >/tmp/oldboy.sql.gz
mysql -e "show databases;" |egrep -v "_schema|atabase" |sed -r 's#^(.*)#mysqldump -B \1 |gzip >/tmp/\1.sql.gz#g' |bash #bash執(zhí)行這些備份命令,就是一次分開備份多個庫了
2.6.備份單個表
當(dāng)不加-B參數(shù)備份數(shù)據(jù)庫時,例如“ test”,命令默認(rèn)就會把當(dāng)作庫,把test當(dāng)作表,如果后面還有多個字符串,例如“ test test1“,那么除了為庫之外,其他的test、test1都是庫的表。
mysqldump oldboy test>/tmp/oldboy_test,sql
2.7.備份多個表
分表備份的缺點(diǎn):數(shù)據(jù)文件多數(shù)據(jù)備份的意義有哪些,很碎,一旦需要全部恢復(fù)又很麻煩。
1、做一個完整備份,再做一個分庫分表備份。
2、雖然文件多、碎,但可以利用腳本批量操作多個SQL文件。
mysqldump mysql user db>/tmp/mysql.sql
egrep -v "#|\*|--|^$" /tmp/mysql.sql
mysqldump oldboy test > /tmp/oldboy_test.sql
2.8.備份數(shù)據(jù)庫表結(jié)構(gòu)(不包含數(shù)據(jù))
利用的-d參數(shù)可以只備份表的結(jié)構(gòu),即建表的語句。
mysqldump -d oldboy >/opt/oldboy.sql
2.9.只備份數(shù)據(jù)庫表的數(shù)據(jù)(不包含表結(jié)構(gòu))
利用-t參數(shù)備份數(shù)據(jù)庫表的數(shù)據(jù)(SQL語句形式)。
mysqldump -t oldboy >/opt/oldboy1.sql
2.10.同時將數(shù)據(jù)和表結(jié)構(gòu)分離導(dǎo)出
利用-T參數(shù)可以實(shí)現(xiàn)將數(shù)據(jù)和表結(jié)構(gòu)同時分離備份。
vi /etc/my.cnf
secure_file_priv='' #在[mysqld]模塊下增加
/etc/init.d/mysqld restart
mysqldump oldboy test --compact -T /tmp/
1、-d參數(shù)的作用是只備份庫表結(jié)構(gòu)(SQL語句形式)。
2、-t參數(shù)的作用是只備份表內(nèi)的數(shù)據(jù)(SQL語句形式)。
3、-T將庫表和數(shù)據(jù)分離成不同的文件,數(shù)據(jù)是純文本,表結(jié)構(gòu)是SQL語句。
2.11.刷新文件參數(shù)(-F)2.11.1.是什么
是一個二進(jìn)制格式的文件,用于記錄用戶對數(shù)據(jù)庫更新的SQL語句信息,例如更改數(shù)據(jù)庫庫表和更改表內(nèi)容的SQL語句都會記錄到里,但是對庫表等內(nèi)容的查詢則不會記錄到日志中。
2.11.2.對于備份的作用
當(dāng)有數(shù)據(jù)寫入到數(shù)據(jù)庫時,還會同時把更新的SQL語句寫入到對應(yīng)的文件里。
使用備份時,一般是對某一時刻的數(shù)據(jù)進(jìn)行全備,例如,0點(diǎn)進(jìn)行數(shù)據(jù)庫備份。
假設(shè)是每天0點(diǎn)對數(shù)據(jù)庫進(jìn)行備份數(shù)據(jù)備份的意義有哪些,那么在兩次備份之間就有24小時的數(shù)據(jù)沒有備份,在這期間如果數(shù)據(jù)庫發(fā)生故障,使用全量恢復(fù)也只能恢復(fù)到當(dāng)日0點(diǎn),但是有了文件,就可以將兩次完整備份間隔之間的數(shù)據(jù)還原,因為文件里的數(shù)據(jù)就是寫入數(shù)據(jù)庫的數(shù)據(jù),使用文件恢復(fù)數(shù)據(jù),我們稱之為二進(jìn)制增量數(shù)據(jù)恢復(fù)。
2.11.3.為什么要刷新
刷新(切割)日志的目的就是確定全備和增量備(文件)的臨界點(diǎn),當(dāng)全備完成后,全備時刻以前的文件就無用了(全備里已有這部分?jǐn)?shù)據(jù)了),但是全備以后到下一次全備之前的數(shù)據(jù)就是十分重要的,這部分?jǐn)?shù)據(jù)就存在于文件里,因此在進(jìn)行全備時需要找到全備之后和增量之間的臨界點(diǎn),使得恢復(fù)時,需要的文件數(shù)據(jù)一條不多(不能和全備的內(nèi)容重合),一條不少(全備后的所有數(shù)據(jù)都要有)。
原文鏈接:
如有疑問請與原作者聯(lián)系