備份簡介
備份一般分為邏輯備份 Logical Backup ( Hot Backup )和物理備份 Physical Backup ( Cold Backup )。
邏輯備份 由恢復(fù)數(shù)據(jù)所需的 SQL 語句組成,例如 CREATE DATABASE,CREATE TABLE 和 INSERT。
邏輯備份的特點:
- 無需停機作業(yè)
- 還原彈性較佳
- 硬件無關(guān),可任意還原到指定的數(shù)據(jù)庫
- 檔案較大, 備份與還原時間較長
- 無法備份 log 與配置文件
- 無事務(wù)的表(Non-transaction table) 必須被鎖定
- 可能影響聯(lián)機操作處理效能
物理備份 是通過復(fù)制單個數(shù)據(jù)文件或目錄來執(zhí)行的析恢。
物理備份的特點:
- 需停機作業(yè)( MariaDB 10 可執(zhí)行 Hot Physical Backup )
- 目錄/文件(Directories/Files) 操作
- 執(zhí)行速度較快
- 檔案 size 較小
- 可備份日志和配置文件
因此,邏輯備份和物理備份主要區(qū)別如下:
邏輯備份更加靈活,因為可以在其它不同的硬件配置限次、MariaDB 版本甚至其它 DBMS 上恢復(fù)數(shù)據(jù),而物理備份不能在明顯不同的硬件柴灯、不同的 DBMS 或可能甚至不同的 MariaDB 版本上導(dǎo)入卖漫。
邏輯備份可以在數(shù)據(jù)庫和表級別執(zhí)行,而物理數(shù)據(jù)庫是目錄和文件級別赠群。在 MyISAM 和 InnoDB 存儲引擎中羊始,每個表都有一組等效的文件。(在 MariaDB 5.5 之前的版本中查描,默認(rèn)情況下突委,多個 InnoDB 表存儲在同一文件中,在這種情況下冬三,無法按表進(jìn)行備份匀油。)
邏輯備份的大小 大于 等效物理備份的大小。
與等效的物理備份相比勾笆,邏輯備份花費更多的時間進(jìn)行備份和還原敌蚜。
日志文件和配置文件不是邏輯備份的一部分
備份工具:mysqldump 和 Mariabackup
mysqldump
mysqldump 簡述
mysqldump 執(zhí)行邏輯備份。這是執(zhí)行備份和還原的最靈活的方法匠襟,并且是當(dāng)數(shù)據(jù)量較小時的理想選擇钝侠。
對于大型數(shù)據(jù)集,備份文件可能很大酸舍,并且恢復(fù)時間很長帅韧。
mysqldump 將數(shù)據(jù)轉(zhuǎn)儲為 SQL 格式(它也可以轉(zhuǎn)儲為其它格式,例如 CSV 或 XML)啃勉,然后可以輕松地將其導(dǎo)入另一個數(shù)據(jù)庫忽舟。假設(shè)轉(zhuǎn)儲中沒有版本或特定于 DBMS 的語句,則可以將數(shù)據(jù)導(dǎo)入到其它版本的 MariaDB淮阐,MySQL 甚至是其它 DBMS 中叮阅。
mysqldump 將觸發(fā)器(triggers)與表一起轉(zhuǎn)儲,因為它們是表定義的一部分泣特。但是浩姥,存儲過程,視圖和事件(stored procedures, views, and events)不是状您,并且需要額外的參數(shù)來顯式地重新創(chuàng)建(例如–routines 和–events)勒叠。 但是兜挨,過程和函數(shù)也是系統(tǒng)表的一部分。
使用語法
備份語法
mysqldump db_name > backup-file.sql
具體例如:
shell> mysqldump [options] db_name [tbl_name ...] > backup-file.sql # 指定數(shù)據(jù)庫的某些表
shell> mysqldump [options] --databases db_name ... > backup-file.sql # 指定某幾個數(shù)據(jù)庫
shell> mysqldump [options] --all-databases > backup-file.sql # 備份所有數(shù)據(jù)庫
還原語法
mysql db_name < backup-file.sql
mysqldump 使用實例
(實際 demo 使用說明眯分,后續(xù)一些指令說明可能會接續(xù)使用此演示拌汇。若不感興趣可略過)
在 MariaDB 的命令窗口執(zhí)行以下語句(創(chuàng)建示例表及其數(shù)據(jù)):
CREATE DATABASE testbak;
CREATE TABLE testbak.tablebak (
`create_time` char(19) NOT NULL,
`create_user` varchar(20) NOT NULL,
`update_time` char(19) DEFAULT NULL,
`update_user` varchar(20) DEFAULT NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci;
INSERT INTO testbak.tablebak
(`create_time`,`create_user`,`update_time`,`update_user`)
VALUES
('2020/02/21 15:41:20','david','2020/02/21 15:43:20','david'),
('2020/02/21 15:41:20','david','2020/02/21 15:43:20','david'),
('2020/02/21 15:41:20','david','2020/02/21 15:43:20','david'),
('2020/02/21 15:41:20','david','2020/02/21 15:43:20','david'),
('2020/02/21 15:41:20','david','2020/02/21 15:43:20','david');
CREATE DATABASE testbres;
作用時創(chuàng)建一個名為 testbak 的數(shù)據(jù)庫,里面一個名為 tablebak 的表弊决,添加了 5 條數(shù)據(jù)噪舀。并創(chuàng)建了一個空的數(shù)據(jù)庫 testres,用于測試還原飘诗。
完成之后在終端中与倡,使用 mysqldump 備份該數(shù)據(jù)庫。
mysqldump -u test -p testbak > backup-testbak.sql -- >后是備份路徑和文件名疚察,此處就在用戶名根目錄下蒸走。
還原的話需要指定還原的數(shù)據(jù)庫名稱。否則會報錯類似ERROR 1049 (42000): Unknown database 'testres'
還原語句:
在終端中執(zhí)行
mysql -u test -p testres< backup-testbak.sql
更多 mysqldump 的使用貌嫡,可訪問官網(wǎng)https://mariadb.com/kb/en/mysqldump/了解比驻。
Mariabackup
Mariabackup 簡介:
Mariabackup 是 MariaDB 提供的開源工具,用于執(zhí)行 InnoDB岛抄,Aria 和 MyISAM 表的物理在線備份别惦。對于 InnoDB,可以進(jìn)行“熱在線”備份夫椭。
當(dāng)然掸掸,mariabackup 同樣適用于 MySQL。
支持的功能
MariaDB 一開始使用 Percona 的 XtraBackup (因為采用 Xtra Storage)
衍生自/并取代 Percona XtraBackup
內(nèi)建于 MariaDB 10.1.23 版之后
使用靜態(tài)數(shù)據(jù)加密備份/還原表蹭秋。
使用 InnoDB 頁面壓縮備份/恢復(fù)表扰付。
支持 Galera Cluster(MariaDB Galera Cluster 是僅在 Linux 上運行的同步多主群集(synchronous multi-master cluster)。)
Microsoft Windows 支持仁讨。
從 MariaDB 10.2.16 和 MariaDB 10.3.8 開始羽莺,使用 MyRocks 存儲引擎?zhèn)浞?還原表。
使用前先安裝
ubuntu 下洞豁,終端執(zhí)行:
sudo apt-get install mariadb-backup
其它系統(tǒng)可去官網(wǎng)https://mariadb.com/kb/en/mariabackup-overview/#installing-mariabackup 查看對應(yīng)下載方式盐固。
語法示例:
mariabackup
備份的選項
mariabackup --backup
--target-dir /path/to/backup \
--user user_name --password user_passwd
使用者信息,可以放到配置文件中
新增參數(shù)[mariabackup]并添加使用者和密碼:
[mariabackup]
user=
password=
mariabackup 的備份
完整備份(full backup):
示例:備份現(xiàn)有的 MariaDB:
mariabackup --backup \
--target-dir=/home/sanotsu/mariadb/backup/ \
--user=test --password=P@ssw0rd;
有兩點值得提醒一下:
1丈挟、–target-dir 后面跟的是數(shù)據(jù)庫備份的路徑刁卜,最好是提前創(chuàng)建(如果用 sudo 執(zhí)行則不需要);
2曙咽、可能會出現(xiàn)操作系統(tǒng)無法處理文件/活頁夾的問題蛔趴,可嘗試加 sudo,或者把活頁夾的所有權(quán)從組 root 更改為 mariadb例朱。
完整備份出錯:
正常執(zhí)行:
可以比較備份的活頁夾和原始數(shù)據(jù)庫的活頁夾:
部分備份(partial backup)
上述是備份的全部夺脾,如果只想備份某個/某些數(shù)據(jù)庫之拨,需要再指定–databases 參數(shù)茉继。
如果還需要指定備份某個數(shù)據(jù)庫的某張表咧叭,就需要再指定–tables 參數(shù)漠秋。
這兩個參數(shù)都支持正則表達(dá)式刃唤,可以更方便篩選戈盈。
例如:執(zhí)行
mariabackup --backup \
--target-dir=/home/sanotsu/mariadb/partialBackup/ \
--databases='testbak' \
--tables='tab_*' \
--user=test --password=P@ssw0rd;
可以查看備份結(jié)果:
類似的部分備份的參數(shù)還有:
databases-exclude
:指定不需要備份的數(shù)據(jù)庫益眉;
tables-exclude
:指定不需要備份的表液肌。
增量備份(incremental backup):
增量備份的基礎(chǔ)是完整備份关摇,想要進(jìn)行增量備份荠卷,首先需要進(jìn)行一次完整備份幻林,再執(zhí)行增量備份時终吼,就會在原本的完整備份的基礎(chǔ)上镀赌,備份尚未備份的部分,而不是重新再備份所有际跪,即遞增而不是覆蓋商佛。
語法也簡單,在完整備份下再加一個–incremental-basedir 參數(shù)指定基于哪一個備份的遞增:
mariabackup --backup \
--target-dir=/home/sanotsu/mariadb/incrementalBackup/ \
--incremental-basedir=/home/sanotsu/mariadb/backup/ \
--user=test --password=P@ssw0rd;
注意 –incremental-basedir 的值姆打,每一個新的增量備份應(yīng)該以上一個備份的目標(biāo)路徑為基準(zhǔn)良姆。
因為在執(zhí)行這次增量備份之前,并沒有新增或刪除過其它數(shù)據(jù)庫/表幔戏,但是也可以看出他們的區(qū)別玛追。
下圖是增量備份(左)和完整備份(右)的活頁夾,可以從占用 size 大小闲延,和指定數(shù)據(jù)庫的指定表的相關(guān)信息看出痊剖,的確不是完全覆蓋的備份:
mariabackup 還原
還原實際上會有兩步需要執(zhí)行,一是準(zhǔn)備(prepare)垒玲,二是還原(restore)陆馁。
準(zhǔn)備作業(yè):
準(zhǔn)備的作用是檢查用于還原的備份的數(shù)據(jù)文件一致性。如果不一致侍匙,InnoDB 會中斷避免數(shù)據(jù)庫損壞氮惯。
不同的備份準(zhǔn)備作業(yè)略有些不同
完整備份的準(zhǔn)備:
語法:
mariabackup --prepare \
--target-dir=/home/sanotsu/mariadb/backup/
如果權(quán)限不夠,可能無法讀取文件想暗,解決方法與備份時說明一致妇汗,加 sudo 或者把該文件/夾 root 權(quán)限賦予 mariadb
部分備份的準(zhǔn)備:
部分備份的還原前準(zhǔn)備除了檢查數(shù)據(jù)文件一致性外,還依賴 InnoDB 的可傳輸表空間说莫。為了讓 MariaDB 導(dǎo)入此類表空間杨箭,InnoDB 會尋找?guī)в?cfg 擴(kuò)展名的文件。為了讓 Mariabackup 創(chuàng)建這些文件储狭,還需要–export 在準(zhǔn)備步驟中添加選項互婿。
語法:
mariabackup --prepare --export \
--target-dir=/home/sanotsu/mariadb/backup/
注意:在 MariaDB 10.2.8 及之前的版本, Mariabackup 不支持 –export 選項捣郊。更多區(qū)別可查看https://mariadb.com/kb/en/partial-backup-and-restore-with-mariabackup/#preparing-the-backup
增量備份的準(zhǔn)備:
在 MariaDB 10.2 及其之后,準(zhǔn)備作業(yè)是這樣:
先準(zhǔn)備完整備份
mariabackup --prepare \
--target-dir=/home/sanotsu/mariadb/backup/
再準(zhǔn)備增量備份:
mariabackup --prepare \
--target-dir=/home/sanotsu/mariadb/backup/ \
--incremental-dir=/home/sanotsu/mariadb/incrementalBackup/ \
這里的–incremental-dir 是增量備份時–target-dir 的值慈参,–target-dir 是–incremental-basedir 的值呛牲。
注意多個層級的增量備份還原時的準(zhǔn)備,有層級依賴驮配,不要跨級娘扩。
即先還原 inc1,再還原 inc2壮锻、inc3……即依照增量順序修改–incremental-dir 的值就好琐旁。
還原作業(yè):
完整備份和增量備份
還原就稍微麻煩一點,不過以上完整備份和增量備份的還原方式都通用猜绣。
需要依次執(zhí)行以下步驟:
1灰殴、停止(stop) MariaDB 服務(wù)進(jìn)程;
2掰邢、確保用于還原的存儲數(shù)據(jù)的目錄為空牺陶。(mariadb 服務(wù)器系統(tǒng)參數(shù) datadir)
3、使用--copy-back
或--move-back
參數(shù)尸变,執(zhí)行還原操作义图,指令語法如:
mariabackup --copy-back \
--target-dir=/home/sanotsu/mariadb/backup/
–copy-back 選項允許您保留原始備份文件。
–move-back 選項實際上將備份文件移到 datadir召烂,因此原始備份文件會丟失碱工。
4、調(diào)整數(shù)據(jù)目錄的所有者奏夫,以匹配 MariaDB 服務(wù)器(通常 mysql 是兩者)的用戶和組怕篷。
例如,要將文件的所有權(quán)遞歸更改給 mysql 用戶和組酗昼,執(zhí)行
sudo chown -R mysql:mysql /var/lib/mysql/
5廊谓、啟動 MariaDB 服務(wù)進(jìn)程。
示例如下(部分顯示刪減):
sudo service mariadb stop # 關(guān)閉mariadb服務(wù)進(jìn)程
sudo rm -rf /var/lib/mysql/* #清空mariadb datadir目錄下數(shù)據(jù)
mariabackup --copy-back --target-dir=/home/sanotsu/mariadb/backup/ #執(zhí)行還原
sudo chown -R mysql:mysql /var/lib/mysql/ #給還原后的文件/夾附加mysql(mariadb的實際用戶名)用戶/組權(quán)限
sudo service mariadb start #啟動mariadb服務(wù)進(jìn)程
如果一切正常則還原成功麻削。
部分備份的還原
注意蒸痹,部分備份的還原,和完整備份的還原過程完全不同(quite different)呛哟。
部分備份不是功能齊全的數(shù)據(jù)目錄叠荠。InnoDB 系統(tǒng)表空間中的數(shù)據(jù)字典仍將包含未包含在備份中的數(shù)據(jù)庫和表的條目。
每個單獨的 InnoDB 每表文件空間表空間文件都必須手動導(dǎo)入到目標(biāo)服務(wù)器中扫责。用于導(dǎo)入文件的過程將取決于是否涉及分區(qū)榛鼎。
如果單表沒有分區(qū)
恢復(fù)單個非分區(qū)表
通過丟棄表的原始表空間,將表.ibd 和.cfg 文件從備份位置復(fù)制到表的相關(guān)表空間位置,然后告訴服務(wù)器導(dǎo)入表空間者娱,可以導(dǎo)入未分區(qū)的表抡笼。
- 1、在備份中找到該表的.ibd 和.cfg 文件黄鳍;
- 2推姻、目標(biāo)服務(wù)器上,您需要創(chuàng)建表的副本际起。使用與 CREATE TABLE 在原始服務(wù)器上創(chuàng)建表相同的語句拾碌。
- 3、使用
ALTER TABLE <table_name style="box-sizing: border-box;">DISCARD TABLESPACE</table_name>
丟棄新表的表空間街望。 - 4、將該表的.ibd 和.cfg 文件從備份位置復(fù)制需要還原的 mariadb server 的相關(guān)路勁弟跑。
- 5灾前、確定文件放到了正確的位置,使用
ALTER TABLE <table_name style="box-sizing: border-box;">IMPORT TABLESPACE</table_name>
語句導(dǎo)入新表的表空間孟辑。
如果單表有涉及到分區(qū)
恢復(fù)單個分區(qū)和分區(qū)表
創(chuàng)建占位符表哎甲,丟棄占位符表的原始表空間,將分區(qū)的文件.ibd 和.cfg 文件從備份位置復(fù)制到占位符表的相關(guān)表空間位置饲嗽,然后告訴服務(wù)器導(dǎo)入表空間來導(dǎo)入分區(qū)表炭玫。此時,服務(wù)器可以將占位符表的表空間與分區(qū)的表空間交換貌虾。
- 1吞加、將保存的表空間文件從原始服務(wù)器復(fù)制到目標(biāo)服務(wù)器;
- 2尽狠、將分區(qū)表空間導(dǎo)入到目標(biāo)服務(wù)器上衔憨。
- 2.1、首先袄膏,如果它尚不存在践图,那么我們需要在目標(biāo)服務(wù)器上創(chuàng)建一個與原始服務(wù)器上的分區(qū)表匹配的分區(qū)表:
- 2.2、然后沉馆,使用該表作為模型码党,我們需要使用不使用分區(qū)的相同結(jié)構(gòu)創(chuàng)建該表的占位符。這可以通過以下
CREATE TABLE <table_name style="box-sizing: border-box;">AS SELECT</table_name>
語句完成
- 3斥黑、針對每個分區(qū)進(jìn)行以下步驟
- 3.1揖盘、使用
ALTER TABLE <table_name style="box-sizing: border-box;">DISCARD TABLESPACE</table_name>
丟棄占位符表的表空間; - 3.2、將下一個分區(qū)的.ibd 和.cfg 文件復(fù)制到占位符表目標(biāo) MariaDB 服務(wù)器上表的相關(guān)目錄中
- 3.3心赶、文件位于目標(biāo)服務(wù)器上的正確目錄中后扣讼,使用
ALTER TABLE <table_name style="box-sizing: border-box;">IMPORT TABLESPACE</table_name>
來導(dǎo)入新表的表空間。操作成功缨叫,則可以在占位符表中查看到包含源服務(wù)器上分區(qū)中的數(shù)據(jù) - 3.4椭符、通過 ALTER TABLE <table_name style="box-sizing: border-box;">EXCHANGE PARTITION 語句將分區(qū)從占位符轉(zhuǎn)移到目標(biāo)表荔燎,若成功,目標(biāo)表將包含源表中的第一個分區(qū)销钝。</table_name>
- 3.5有咨、對要導(dǎo)入的每個分區(qū)重復(fù)以上 3.X 過程。對于每個分區(qū)蒸健,我們需要丟棄占位符表的表空間座享,然后將分區(qū)表的表空間導(dǎo)入到占位符表中,然后在占位符表和目標(biāo)表的分區(qū)之間交換表空間似忧。
- 3.6渣叛、所有分區(qū)都完成之后,目標(biāo)表應(yīng)該包含所有的對應(yīng)的數(shù)據(jù)盯捌,則可以從數(shù)據(jù)庫中刪除占位符表淳衙。
- 3.1揖盘、使用
單表(部分)備份,使用 mariabackup 的物理備份還原還是比較麻煩的饺著,使用其它方法可能更簡單便捷
更多 mariabackup 的部分備份/還原信息箫攀,可見官網(wǎng)
更多 mariabackup 的使用可見官網(wǎng)