初識MariaDB之3——MariaDB備份與還原

一、基礎知識

數據的重要性無需多說,需要強調的是備份不是目的,能恢復纔是目的,以下就Mariadb的一些概念進行說明。

1.存儲引擎的分類

Mariadb5.1以後的版本,默認使用支持事務的InnoDB存儲引擎,之前的MyISAM存儲引擎不支持事務,所謂事務型存儲引擎,必須滿足ACID原則:

A:atom(原子性),即一個事務中所有的操作必須全部完成執行或不執行

C:consistent(一致性),一個事務從開始到結束狀態必須保持一致

I:isolation(隔離性),相同的數據不允許多個事務同時訪問

D:durability (持久性),一經修改永久保存

2.事務隔離級別

InnoDB存儲引擎分爲4種隔離級別:

read-uncommitted:讀未提交,可以讀取其他會話未提交的事務,稱爲髒讀

read-committed:讀提交,可以讀取其他會話已提交的事務,解決了髒讀,引發不可重讀

repeatable-read:可重讀(默認),通過MVCC多版本機制讓已發起的事務在提交前讀取到的數據不發生變化,即使有其他會話已提交了事務,解決了不可重讀,引發幻讀

serializable:串行提交,在每個讀的行上施加共享鎖,在寫的行上施加排他鎖,解決了幻讀,但是降低了併發

3.鎖機制

行鎖和表鎖:依據粒度不同進行的劃分,行鎖的併發能力更強

讀鎖和寫鎖:讀鎖又稱共享鎖,施加讀鎖後所有事務只能進行讀操作,不能再進行寫操作;寫鎖又稱排他鎖,施加寫鎖後除當前事務外的其他事務不能進行讀寫操作

InnoDB存儲引擎的行鎖其實是加在索引上的

4.備份方式

數據庫按照備份方法分爲物理備份和邏輯備份,按照服務運行的狀態又可以分爲冷備和熱備,對於不支持事物的MyISAM存儲引擎,可以採用溫備的方式進行(前提是必須使用lvm2或者Btree文件系統)。

物理備份:基於文件系統層的備份,優點是速度快,缺點是收到文件系統的約束

邏輯備份:備份時將數據庫抽取爲sql語句,優點是不受操作系統約束,可移植性強,缺點是當數據庫較大時速度慢

二、使用工具

1.mysqldump

--single-transaction 只對InnoDB引擎有效,用於保護數據的一致性,備份發起前,創建一個數據快照,直到備份結束都不會讀取備份開始後提交的任何事務

--quick 配合--single-transaction加速大空間表備份

--all-databases(-A) 備份所有數據庫

--where(-w) 按條件篩選要備份的數據

--databases(-B) 備份指定數據庫,多個數據庫之間用","分隔

--master-date=VALUE VALUE值有1|2兩個值,如果是1會在備份出的文件添加一個CHANGE MASTER TO語句;如果是2會在備份出的文件添加一個CHANGE MASTER TO語句並註釋,備份時建議使用該選項並將VALUE設置爲2,原因是該參數備份時會攜帶當前時刻binlog日誌的名稱和位置,便於後期使用binlog恢復

1.png

需要注意的是:mysqldump如果不帶-A|-B選項默認不備份數據結構,在恢復時需要先創建數據庫和表結構。單表恢復時只需要指定庫名,不需要指定表名。

2.png

2.mysqlbinlog

mysqlbinglog是一個客戶端工具,它可以在其他終端以客戶端的身份訪問mysql服務器

--database=DATABASE 只適用於本地日誌,查看二進制日誌中指定數據庫的信息(默認是所有庫),導出二進制日誌時建議使用該選項,否則還原時遇到該服務器上沒有的數據庫會報錯,無法正常恢復

--start-position=N 查看指定位置以後的事務

--to-last-log(-t) 在MySQL服務器中請求的二進制日誌結尾處不停止,而是繼續打印直到最後一個二進制日誌的結尾,如果發送給同一臺服務器則會無限循環。需要同時使用--read-from-remote-server選項

--result-file=FILENAME 輸出爲指定文件,同重定向">"

三、操作步驟

本次實驗操作系統版本爲CentOS7.4,數據庫版本爲Mariadb5.5.6,爲避免干擾,關閉selinux和iptables,172.16.10.30/24爲數據庫服務器,172.16.10.40/24爲備用服務器

1.冷備

(1)停止172.16.10.30/24的MariaDB服務

systemctl stop mariadb.service

(2)使用scp命令將172.16.10.30/24服務器上的hellodb數據庫拷到172.16.10.40/24服務器datadir目錄下

scp -r hellodb [email protected]:/var/lib/mysql/

(3)修改拷貝後172.16.10.40/24服務器hellodb數據庫的屬主和屬組

chown -R mysql.mysql /var/lib/mysql/hellodb

(4)啓動172.16.10.40/24的MariaDB服務

systemctl start mariadb.service

2.熱備

(1)備份172.16.10.30/24上的數據庫

mysqldump -uroot -ppassword1! --database hellodb --master-data=2 --single-transaction --quick > /tmp/hellodb.sql

(2)根據/tmp/hellodb.sql中記錄備份時使用的binlog及其位置將後續的sql語句備份到指定文件中,如果不止一個二進制日誌後續以追加方式進行

mysqlbinlog --database hellodb --start-position=245  mysql-binlog.000005 > /tmp/binlog.sql

(3)將hellodb.sql和/tmp/binlog.sql傳輸到172.16.10.40/24服務器

scp -r {binlog.sql,hellodb.sql} [email protected]:/tmp/

(4)導入數據庫過程無需記錄二進制日誌,把以先暫時關閉

MariaDB [hellodb]>set sql_log_bin=0

(5)在172.16.10.40/24服務器執行sql語句恢復數據庫

mysql -uroot -p < hellodb.sql

mysql -uroot -p < binlog.sql

(6)開啓二進制日誌

MariaDB [hellodb]>set sql_log_bin=1

由於二進制日誌的重要性,生產環境中建議將數據文件和二進制文件放在不同的磁盤上,如果有專門的日誌服務器也可以遠程同步二進制日誌中的sql語句

mysqlbinlog  --read-from-remote-server --host=172.16.10.30 --port=3306  --user=root --password=password1! --start-position=733 --to-last-log  mysql-binlog.000005 --result-file=/tmp/bin_log.sql

3.溫備

溫備是針對不支持事務的MyISAM存儲引擎採取的一種折中的備份方式,它通過lvm2的快照功能結合二進制日誌,實現了幾乎熱備的效果

(1)將172.16.10.30/24服務器上的表同步到磁盤並且鎖表

MariaDB [hellodb]> flush tables with read lock;

(2)刷新172.16.10.30/24服務器日誌

MariaDB [hellodb]> flush logs;

3.png

(3)記錄172.16.10.30/24服務器上當前二進制日誌文件及位置

[root@host3 ~]# mysql -uroot -ppassword1! -e 'show master status;' > /tmp/position.txt

(4)爲datadir目錄所在的設備創建一個快照

[root@host3 ~]# lvcreate -L 1G -s -n mylv_snap /dev/myvg/mylv

(5)解除讀鎖

MariaDB [hellodb]> unlock tables;

(6)掛載快照

mount /dev/myvg/mylv_snap /mnt/

(7)將備份拷貝至172.16.10.40/24服務器,並修改屬主和屬組

[root@host3 mysql]#scp -r /mnt/hellodb [email protected]:/data/mysql

[root@host3 mysql]#chown -R mysq.mysq /data/mysql/

(8)導入數據庫過程無需記錄二進制日誌,把以先暫時關閉

MariaDB [hellodb]>set sql_log_bin=0

(9)將172.16.10.30/24上的二進制文件同步至172.16.10.40/24

[root@host4 mysql]# mysqlbinlog  --read-from-remote-server --host=172.16.10.30 --port=3306  --user=root --password=password1! --start-position=245 --to-last-log  mysql-binlog.000006 --result-file=/tmp/bin_log.sql

(10)執行快照之後的sql語句

[root@host4 mysql]# mysql -uroot -p'password1!' < /tmp/bin_log.sql

(11)開啓二進制日誌

MariaDB [hellodb]>set sql_log_bin=1

(12)刪除172.16.10.30/24上的快照,至此操作完成

[root@host3 mysql]#umount /mnt/

[root@host3 ~]# lvremove mylv_snap

補充說明:

mysql5.6以後的版本中可以將遠程服務器上的服務器複製到本地,其中mysqldump命令中的-raw(以binlog形式將遠程服務器的日誌存儲到本地)和--stop-never(連接遠程mysql服務器讀取日誌,知道服務器關閉後纔會退出或被kill掉)選項在mariadb10.1中未找到,不確定是否有該功能


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章