8.1 備份和恢復(fù)概述住拭、
根據(jù)備份的方法不同可以將備份分為:
Hot Backup(熱備)
Cold Backup(冷備)
Warm Backup(溫備)
熱備是指數(shù)據(jù)庫運行中直接備份幅虑,對正在運行的數(shù)據(jù)庫操作沒有任何影響。
冷備是指備份操作是在數(shù)據(jù)庫停止的情況下汁掠,這種備份最為簡單,一般只需復(fù)制相關(guān)的數(shù)據(jù)庫物理文件即可戈轿。
溫備是指在數(shù)據(jù)庫運行中進(jìn)行的启泣,但是會對當(dāng)前數(shù)據(jù)庫的操作有影響,如加一個全局讀鎖以保證備份數(shù)據(jù)的一致性亿蒸。
根據(jù)備份后文件的內(nèi)容凑兰,備份又可以分為:
邏輯備份
裸文件備份
邏輯備份是指備份出的文件內(nèi)容是可讀的,一般是文本文件边锁。內(nèi)容一般是一條條SQL語句姑食,或者表內(nèi)實際數(shù)據(jù)組成,這類方法的好處是可以觀察導(dǎo)出文件的內(nèi)容茅坛,一般適用于數(shù)據(jù)庫的升級音半,遷移等工作,缺點是恢復(fù)所需要的時間比較長
裸文件備份是指復(fù)制數(shù)據(jù)庫的物理文件贡蓖,即可以是在數(shù)據(jù)庫運行中的復(fù)制曹鸠,也可以是在數(shù)據(jù)庫停止運行時直接的數(shù)據(jù)文件復(fù)制。這類備份的恢復(fù)時間往往較邏輯備份短很多
根據(jù)備份數(shù)據(jù)庫的內(nèi)容斥铺,備份又可以分為:
- 完全備份
- 增量備份
- 日志備份
完全備份是指對數(shù)據(jù)庫進(jìn)行一個完整的備份彻桃。增量備份是指在上次完全備份的基礎(chǔ)上,對于更改的數(shù)據(jù)進(jìn)行備份仅父。日志備份是指對MySQL數(shù)據(jù)庫二進(jìn)制日志的備份叛薯,通過對一個完全備份進(jìn)行二進(jìn)制日志的重做(replay)來完成數(shù)據(jù)庫的point-in-time的恢復(fù)工作浑吟。MySQL數(shù)據(jù)庫復(fù)制(replication)的原理就是異步實時地將二進(jìn)制日志重做傳送應(yīng)用到從(slave/standby)數(shù)據(jù)庫
對于MySQL數(shù)據(jù)庫來說笙纤,官方?jīng)]有提供真正的增量備份的方法耗溜,大部分都是通過二進(jìn)制日志完成增量備份的工作。這種備份較之真正的增量備份來說省容,效率還是很低的抖拴。假如有一個100GB的數(shù)據(jù)庫,要通過二進(jìn)制日志完成備份腥椒,可能同一個頁需要執(zhí)行多次的SQL語句完成重做工作阿宅。但是對于真正的增量備份來說,只需要記錄當(dāng)前每頁最后的檢查點的LSN笼蛛,如果大于之前全備時的LSN洒放,則備份該頁,否則不用備份滨砍,這大大加快了備份的速度和恢復(fù)時間往湿,同時這也是xtrabackup工具增量備份的原理
對于msysqldump備份工具來說,可以通過添加 --single-transaction選項獲得InnoDB存儲引擎的一致性備份惋戏。
8.2 冷備
對于InnoDB存儲引擎的冷備非常簡單领追,只需要備份MySQL數(shù)據(jù)庫的frm文件,共享表空間文件响逢,獨立表空間文件(*.ibd)绒窑,重做日志文件。另外建議定期備份MySQL數(shù)據(jù)庫的配置文件舔亭,這樣有利于恢復(fù)操作些膨。在同一臺服務(wù)器上對數(shù)據(jù)庫進(jìn)行冷備是遠(yuǎn)遠(yuǎn)不夠的,至少還需要將本地產(chǎn)生的備份存放到一臺遠(yuǎn)程的服務(wù)器中钦铺,確保不會因為本地數(shù)據(jù)庫的宕機而影響備份文件的使用傀蓉。
冷備的優(yōu)點是:
- 備份簡單,只要復(fù)制相關(guān)文件即可职抡。
- 備份文件易于在不同操作系統(tǒng)葬燎,不同MySQL版本上進(jìn)行恢復(fù)。
- 恢復(fù)相當(dāng)簡單缚甩,只需要把文件恢復(fù)到指定位置即可谱净。
- 恢復(fù)速度快,不需要執(zhí)行任何SQL語句擅威,也不需要重建索引壕探。
冷備的缺點是:
- InnoDB存儲引擎冷備的文件通常比邏輯文件大很多,因為表空間中存放著很多其他數(shù)據(jù)郊丛,如undo段李请,插入緩沖等信息瞧筛。
- 冷備也不總是可以輕易地跨平臺的。操作系統(tǒng)导盅,MySQL版本较幌,文件大小寫敏感和浮點數(shù)格式都會成為問題。
8.3 邏輯備份
8.3.1 mysqldump
通常用來完成轉(zhuǎn)存(dump)數(shù)據(jù)庫的備份及不同數(shù)據(jù)庫之間的移植白翻,如從MySQL低版本升級到MySQL高版本數(shù)據(jù)庫乍炉,又或者從MySQL移植到Oracle,SQL Server數(shù)據(jù)庫等滤馍。
mysqldump的語法如下
mysqldump [arguments] > file_name
如果想要備份所有的數(shù)據(jù)庫岛琼,可以使用--all-databases選項:
mysqldump --all-databases > dump.sql
備份指定數(shù)據(jù)庫,可以使用--databases選項
mysqldump --databases db1 db2 > dump.sql
其他一些比較常用的參數(shù)如下
--single-transaction:在備份開始前巢株,先執(zhí)行start transaction命令槐瑞,以此來獲取備份的一致性,當(dāng)前該參數(shù)只對InnoDB存儲引擎有效阁苞。當(dāng)啟動該參數(shù)并進(jìn)行備份時困檩,確保沒有其他任何的DDL語句執(zhí)行,因為一致性讀并不能隔離DDL操作猬错。
--lock-tables:在備份中窗看,以次鎖住每個架構(gòu)下的所有表。一般用于MyISAM存儲引擎倦炒,當(dāng)備份時只能對數(shù)據(jù)庫進(jìn)行讀取操作显沈,不過備份依然可以保證一致性。對于InnoDB存儲引擎逢唤,不需要使用該參數(shù)拉讯,用--single-transaction即可。并且--lock-tables和--single-transaction是互斥的鳖藕,不能同時使用魔慷,如果數(shù)據(jù)庫中既有MyISAM引擎的表,又有InnoDB存儲引擎的表著恩,那么只有選擇--lock-tables了院尔。此外,因為--lock-tables選項是依次對每個架構(gòu)中的表上鎖喉誊,因此只能保證每個架構(gòu)下表備份的一致性邀摆,而不能保證所有架構(gòu)下表的一致性。
--locl-all-tables:在備份的過程中伍茄,對所有架構(gòu)中的所有表上鎖栋盹。這個可以避免--lock-tables參數(shù)不能同時鎖住所有表的問題。
--master-data:取值為1或者2敷矫,默認(rèn)為1例获,當(dāng)這個參數(shù)的值為1的時候汉额,mysqldump出來的文件就會包括CHANGE MASTER TO這個語句,CHANGE MASTER TO后面緊接著就是file和position的記錄榨汤,在slave上導(dǎo)入數(shù)據(jù)時就會執(zhí)行這個語句蠕搜,salve就會根據(jù)指定這個文件位置從master端復(fù)制binlog。默認(rèn)情況下這個值是1
當(dāng)這個值是2的時候件余,chang master to也是會寫到dump文件里面去的讥脐,但是這個語句是被注釋的狀態(tài)遭居。
使用--master-data 參數(shù)會忽略--local-tables 參數(shù)
使用--master-data 時啼器,如果沒有指定 --single-transaction 參數(shù),則會自動使用 -locl-all-tables參數(shù)--tab=path(-T path):產(chǎn)生TAB分隔的數(shù)據(jù)文件俱萍。對于每張表端壳,mysqldump創(chuàng)建一個包含 create table 語句的table_name.sql文件,和包含數(shù)據(jù)的tbl_name.txt 文件枪蘑。
--events: 備份事件調(diào)度器
--routines:備份存儲過程和函數(shù)
--triggers:備份觸發(fā)器损谦。
--hex-blob:將BINARY,VARBINARY岳颇,BLOG和BIT列類型備份為十六進(jìn)制的格式照捡。
--where = 'where_condition':導(dǎo)出給定條件的數(shù)據(jù)。
8.3.2 select...into outfile
select...into outfile 也是一種邏輯備份的方法话侧,更準(zhǔn)確地說是導(dǎo)出一張表中的數(shù)據(jù)栗精。
例如:select * into outfile '/dir/file1.txt' from a where...
8.3.3 邏輯備份的恢復(fù)
mysqldump的恢復(fù)操作比較簡單,因為備份的文件就是導(dǎo)出的SQL語句瞻鹏,一般只需要執(zhí)行這個文件就可以了悲立。mysqldump可以導(dǎo)出存儲過程,導(dǎo)出觸發(fā)器新博,導(dǎo)出事件薪夕,導(dǎo)出數(shù)據(jù),但是卻不能導(dǎo)出視圖赫悄。因此原献,如果用戶的數(shù)據(jù)庫還是用了視圖,那么在用mysqldump備份完數(shù)據(jù)庫后還需要導(dǎo)出視圖的定義或者備份視圖定義的frm文件埂淮,并在恢復(fù)時進(jìn)行導(dǎo)入姑隅,這樣才能保證mysqldump數(shù)據(jù)庫的完全恢復(fù)。
8.3.4 load data infile
若通過mysqldump -tab 同诫,或者通過select into outfile 導(dǎo)出的數(shù)據(jù)需要恢復(fù)粤策,這是可以通過命令 load data infile來進(jìn)行導(dǎo)入。load data infile的語法如下:
load data into table a ignore 1 lines infile '/dir/file1.txt'
要對服務(wù)器文件使用load data infile误窖,必須擁有file權(quán)限叮盘。
為了加快InnoDB存儲引擎的導(dǎo)入秩贰,可能希望導(dǎo)入過程忽略對外鍵的檢查,因此可以先關(guān)閉外鍵檢查柔吼,set @@foreign_key_checks = 0
毒费,然后導(dǎo)入數(shù)據(jù),再開啟開啟外鍵檢查 set @@foregin_key_checks = 1
8.3.5 mysqlimport
語法如下:mysqlimport [options] db_name textfile1 [textfile2 ...]
和load data infile不同的是愈魏,mysqlimport命令可以用來導(dǎo)入多張表觅玻。并且通過 --user-thread 參數(shù)并發(fā)地導(dǎo)入不同的文件,這里的并發(fā)是指并發(fā)的導(dǎo)入多個文件培漏,而不是值并發(fā)的導(dǎo)入一個文件溪厘。
8.4 二進(jìn)制日志備份與恢復(fù)
在默認(rèn)情況下并不啟用二進(jìn)制日志,要使用二進(jìn)制日志首先必須啟用它牌柄。在配置文件中進(jìn)行設(shè)置:
[mysqld]
log-bin=mysql-bin
但是只簡單的開啟二進(jìn)制日志是不夠的畸悬,還需要啟動一些其他參數(shù)來保證最為安全和正確的記錄二進(jìn)制日志,因此對于InnoDB引擎珊佣,推薦的二進(jìn)制日志的服務(wù)器配置是:
[mysqld]
log-bin=mysql-bin
sync_binlog=1
innodb_support_xa=1
通過 mysqlbinlog 恢復(fù)二進(jìn)制日志蹋宦,使用方法如下
mysqlbinlog [options] log_file
還可以通過--start-position 和 --stop-position選項來指定從二進(jìn)制日志的某個偏移量來進(jìn)行恢復(fù)
可以通過--start-datetime 和 --stop-datetime 選項來指定從二進(jìn)制日志某個時間點來進(jìn)行恢復(fù)。
8.5 熱備
8.5.1 ibbackup
ibbackup 是InnoDB存儲引擎官方提供的熱備工具咒锻,可以同時備份MyISAM存儲引擎和InnoDB存儲引擎冷冗。其備份原理是:
1.記錄備份開始時,InnoDB存儲引擎重做日志文件檢查點的LSN
2.復(fù)制共享表空間文件以及獨立表空間文件
3.記錄復(fù)制完表空間文件后惑艇,InnoDB存儲引擎重做日志文件堅持點的LSN
4.復(fù)制在備份時產(chǎn)生的重做日志文件蒿辙。
ibbackup的優(yōu)點是:
- 在線備份,不阻塞任何的SQL語句
- 備份性能好敦捧,備份的實質(zhì)是復(fù)制數(shù)據(jù)庫文件和重做日志文件
- 支持壓縮備份须板,通過選項,可以支持不同級別的壓縮
- 跨平臺支持兢卵,ibbackup可以運行在Linux习瑰,Windows以及主流的UNIX系統(tǒng)平臺上。
ibbackup對InnoDB存儲引擎表的恢復(fù)步驟為:
1.恢復(fù)表空間文件
2.應(yīng)用重做日志文件
ibbackup是收費的秽荤,但是開源的XtraBackup熱備工具甜奄,它實現(xiàn)所有ibbackup的功能,并支持真正的增量備份窃款。
8.5.3 XtraBackup實現(xiàn)增量備份
MySQL數(shù)據(jù)庫本省提供的工具并不支持真正的增量備份课兄,更準(zhǔn)確的說,二進(jìn)制日志的恢復(fù)應(yīng)該是point-in-time的恢復(fù)而不是增量備份晨继。而XtraBackup 工具支持對于InnoDB存儲引擎的增量備份烟阐,其工作原理如下:
1.首選完成一個全備,并記錄下此時檢查點的LSN
2.在進(jìn)行增量備份時,比較表空間中每個頁的LSN是否大于上次備份時的LSN蜒茄,如果是唉擂,則備份該頁,同時記錄當(dāng)前檢查點的LSN檀葛。
8.7 復(fù)制
8.7.1 復(fù)制的工作原理
復(fù)制(replication)是MySQL數(shù)據(jù)庫提供的一種高可用高性能的解決方法玩祟,一般用來建立大型的應(yīng)用∮炝總體來說空扎,replication的工作原理分為以下3個步驟:
1.主服務(wù)器(master)把數(shù)據(jù)更改記錄到二進(jìn)制日志(binlog)中。
2.從服務(wù)器(slave)把主服務(wù)器的二進(jìn)制日志復(fù)制到自己的中繼日志(relay log)中
3.從服務(wù)器重做中繼日志中的日志润讥,把更改應(yīng)用到自己的數(shù)據(jù)庫上转锈,以達(dá)到數(shù)據(jù)的最終一致性。
8.7.2 快照 + 復(fù)制的備份架構(gòu)
復(fù)制可以用來備份象对,但功能不僅限于備份黑忱,其主要功能如下:
- 數(shù)據(jù)分布宴抚。由于MySQL數(shù)據(jù)庫提供的復(fù)制并不需要很大的帶寬要求勒魔,因此可以在不同的數(shù)據(jù)中心之間實現(xiàn)數(shù)據(jù)的復(fù)制。
- 讀取的負(fù)載平衡菇曲。通過建立多個從服務(wù)器冠绢,可將讀取平均地分布到這些從服務(wù)器中,并且減少了主服務(wù)器的壓力常潮。一般通過DNS的Round-Robin和Linux的LVS功能都可以實現(xiàn)負(fù)載平衡
- 數(shù)據(jù)庫備份弟胀。復(fù)制對備份很有幫助,但是從服務(wù)器不是備份喊式,不能完全替代備份
- 高可用性和故障轉(zhuǎn)移孵户。通過復(fù)制建立的從服務(wù)器有助于故障轉(zhuǎn)移,減少故障的停機時間和恢復(fù)時間