Linux環境下實現MariaDB數據庫的三種備份和還原

一、tar工具的使用

 1、備份

(1)停止服務,3306端口關閉

image.png

(2)看下配置文件有沒有關鍵日誌存放於其它目錄的,檢查/etc/my.cnf,再檢查下/etc/my.cnf.d/下有沒有配置文件放置其他地方,有的話也需要一起拷貝歸檔

image.png

(3)建立備份目錄,歸檔

image.png

(4)開啓服務,備份完成

2、還原

(1)這裏有個不小心輸入刪重要mysql庫的命令,開始還原

image.png

(2)關閉服務,systemctl stop mariadb

(3)一定要注意配置文件和備份前的配置是否一樣,拷貝剛纔歸檔文件並解壓至庫裏

image.png

(4)解壓後文件注意權限,務必確保mysql.mysql權限

image.png

(4)開啓服務,systemctl start mariadb

(5)進入數據庫,查看數據庫,mysql又回來了

image.png


二、LVM邏輯卷快照實現幾乎熱備(實質還是冷備):將數據庫內容在很短時間用邏輯卷快照備份下,之後先將數據庫推上線,再處理快照中的內容,結合二進制日誌還原

1、備份

(1)新加硬盤並建立邏輯卷分區

開機添加硬盤掃描下,echo '- - -' > /sys/class/scsi_host/host0/scan,記得有每個host都需要掃描下image.png

分區,分區時候記得更改硬盤分區文件系統,代碼8e,Linux LVM

pvcreate /dev/sdb1

vgcreate vgdb /dev/sdb1

lvcreate -n lvdb -L +6G /dev/vgdb ----->建立邏輯卷用來放置數據庫數據

lvcreate -n lvdb -L +4G /dev/vgbin ----->建立邏輯卷用來單獨放置二進制日誌

mkfs.xfg /dev/vgdb/lvdb

mkfs.xfg /dev/vgdb/lvbin

mkdir -pv /data/{mysql,binlog}

mount /dev/vgdb/lvdb /data/mysql

mount /dev/vgdb/lvbin /data/binlog

image.png

(3)數據遷移,需要更改配置文件,開啓二進制日誌功能,確保權限正確

image.png

注:如果重啓服務後提示錯誤無法遷移,將原數據庫內mysql庫複製到新庫中重啓即可

image.png

附:清除二進制日誌指令:reset master

(4)基於快照備份

lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,設置了只讀屬性

image.png

(5)對數據做出修改,產生二進制日誌變動

create database chenux

use chenux

create table info (name char(10),age tinyint,job varchar(20))

alter table info add id tinyint primary key first

insert into info values (1,'chenux',24,'driver')

相比之前已經作出很多修改

image.png

POS點變化,說明從328往後的數據點都是在變化

image.png

(6)做完邏輯卷快照後,對數據的更改會影響服務器性能能,也就是說舊的內容會添加到邏輯卷快照中,因此我們需要把快照裏的數據導出來,對邏輯卷快照掛載

直接掛載mount /dev/vgdb/snap_dbbak /mnt會報錯,因爲快照snap_dbbak的邏輯卷uuid和lvdb邏輯卷uuid一樣,所以掛載輸入指令mount -o nouuid,norecovery /dev/vgdb/snap_dbbak  /mnt

image.png

(7)爲確保數據安全性,可以掛載完成後將掛載目錄裏的數據存放至其它設備中,因爲實驗環境,依舊在本機上操作

image.png

cp -a /mnt/* /backups,此處用cp -a,保留權限,此時相當於備份完成

(8)備份完成後,刪除快照

lvremove /dev/vgdb/snap_dbbak

(9)模擬損壞,刪庫,之後跑路,不過被抓了回來需要負責到底

(10)還原開始,停止服務,拷貝原數據庫內容到數據庫存放目錄,再開放數據庫

systemctl stop mariadb;cp -av /backups/* mysql/

image.png

(11)此時發現只有邏輯卷快照時的備份,後面的增刪改沒有了,所以這裏需要引入二進制日誌。在利用二進制還原時候,要避免其他用戶連接數據庫產生數據變更,此處需要使用防火牆或者其它策略確保數據庫只有自己一個人操作

引用之前的圖片,此時利用二進制日誌工具可以還原

image.png

mysqlbinlog --start-position=328 mysql-bin.000001,可以查看到內容

image.png

往下翻

image.png

mysqlbinlog --start-position=328 mysql-bin.000001 > bl.sql

mysqlbinlog mysql-bin.000002 >> bl.sql

image.png

導入後再打開二進制日誌功能,發現數據回來了

image.png

(12)還原後記得之前設置的防火牆或者其它拒絕訪問策略再取消掉,完成

注意:如果刪庫用的是drop,不像實驗中rm指令刪除的,mybinlog BINLOG > *.sql,編輯該sql文件,將drop命令那行註釋掉,再mysql < *.sql


3、mysqldump的備份和誤刪除操作後的還原

(1)準備環境,條件允許情況下,將二進制日誌文件和數據庫存放目錄放到不同的磁盤中,而且二進制日誌文件最好單獨放在一個分區中

image.png

(2)加個數據庫作爲準備環境

image.png

做點修改,二進制日誌產生變化

image.png

(3)開始備份

mysqldump -A -F --single-transacation --master-data=2 | gzip > /backupsq/db.sql.gz

image.png

(4)備份完,繼續修改點小數據,再刪個表之後繼續做點修改,此時模仿環境中數據庫時時刻刻都有增刪改操作,不能說是因爲刪了某個表就停止了其他增刪改

修改:alter table students add job varchar(20);、update students set job='nurse' where stuid=1;

刪除:drop tables teachers;

再修改:insert into students values(26,'Yang Guo',28,'M',NULL,NULL,'CEO');

最後表

image.png

(5)開始還原,還原過程中利用防火牆不允許其他人訪問數據庫

進入數據庫,先暫時關閉臨時會話的二進制日誌,避免二進制日誌重複記錄導入過程

mysql > set sql_log_bin=off;

      source /backups/db.sql;

此時完成完全備份的還原

image.png

(6)開始還原修改的數據,less /backups/db.sql,查看CHANGE MASTER TO信息

image.png

(7)利用工具將該日誌導成sql數據庫文件,並查找刪除關鍵表的指令

mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql

image.png

完成後,如果後續還有其它二進制日誌,將其它二進制日誌也追加到incr.sql:

mysqlbinlog /data/binlog/mysql-bin.000004 >> /data/incr.sql

mysqlbinlog /data/binlog/mysql-bin.000005 >> /data/incr.sql等等

不過我這裏由於增刪改不多,就mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql這一步就夠了

image.png

(8)導入數據,不過導入之前需要關閉臨時會話中的sql_log_bin,避免出現二進制日誌重複記錄的現象

set sql_log_bin=off;

source  /data/incr.sql

這下我們的teachers表回來了,修改的students表也還原了

image.pngimage.png

 (9)關閉之前的拒絕用戶訪問策略,完成


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