(八)MariaDB的備份還原(mysqldump及mariabackup)

備份簡介

備份一般分為邏輯備份 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ù)庫中刪除占位符表淳衙。

單表(部分)備份,使用 mariabackup 的物理備份還原還是比較麻煩的饺著,使用其它方法可能更簡單便捷

更多 mariabackup 的部分備份/還原信息箫攀,可見官網(wǎng)

更多 mariabackup 的使用可見官網(wǎng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幼衰,隨后出現(xiàn)的幾起案子靴跛,更是在濱河造成了極大的恐慌,老刑警劉巖渡嚣,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梢睛,死亡現(xiàn)場離奇詭異,居然都是意外死亡严拒,警方通過查閱死者的電腦和手機扬绪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裤唠,“玉大人挤牛,你說我怎么就攤上這事≈终海” “怎么了墓赴?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長航瞭。 經(jīng)常有香客問我诫硕,道長,這世上最難降的妖魔是什么刊侯? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任章办,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藕届。我一直安慰自己挪蹭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布休偶。 她就那樣靜靜地躺著梁厉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踏兜。 梳的紋絲不亂的頭發(fā)上词顾,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音碱妆,去河邊找鬼肉盹。 笑死,一個胖子當(dāng)著我的面吹牛山橄,可吹牛的內(nèi)容都是我干的垮媒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼航棱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萌衬?” 一聲冷哼從身側(cè)響起饮醇,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秕豫,沒想到半個月后朴艰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡混移,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年祠墅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌径。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁嗦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回铛,到底是詐尸還是另有隱情狗准,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布茵肃,位于F島的核電站腔长,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏验残。R本人自食惡果不足惜捞附,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸟召,春花似錦胆绊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至槽片,卻和暖如春何缓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背还栓。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工碌廓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩盒。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓谷婆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辽聊。 傳聞我的和親對象是個殘疾皇子纪挎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350