常用的幾種mariadb備份還原手段——上篇
備份相關知識
為什麽要備份
備份主要是用來應對以下的情況:災難恢復,硬件故障,軟件故障,自然災害,×××惡意×××,人為的誤操作導致數據的損壞等。
備份時要關註的重點在於能容忍最多丟失多少的數據量,在如今數據基本和金錢等價的現實下,數據還是能少丟就少丟吧;恢復數據要在多長時間內完成;需要恢復哪些數據。
註意:
單純做備份是不可行的,做好備份之後還要考慮做的備份是否可用(還原測試);定期做還原演練(在個人機器實驗)。
備份的分類
完全備份-整個數據集全部備份。
增量備份-僅僅備份最近一次完全備份或者增量備份(若存在增量)以後的變化的數據,備份速度相對較快,但是還原比較復雜,需要做整合。
部分備份-只備份數據的子集,例如部分庫和部分表。
盡可能要講數據文件和二進制日誌文件分開存放。
冷備:數據庫讀寫操作全部停止直到備份結束。
溫備:讀操作可以進行,但是無法進行寫操作。
熱備:讀寫操作都不受影響,均可正常進行。
MyISAM:溫備,不支持熱備。
InnoDB:都支持(現在大多都使用,同時還支持事務)
物理備份:直接復制數據文件進行備份,與存儲引擎相關,占用空間多,速度快。
邏輯備份:從數據庫中導出數據到其他地方存儲,與存儲引擎無關,占用空間相對較少,速度慢,可能會丟失數據精度。
額外考慮
在進行備份之前我們考慮清楚後才可以進行,畢竟數據無價。
2.備份過程中會占用多少系統的資源
3.備份會消耗的時間
4.數據恢復時候消耗的時間
5.我們該備份什麽
數據
二進制日誌,InnoDB事務日誌文件
程序代碼(指的是數據庫的)
服務器的配置文件
幾種備份方式的簡單演示
簡單的cp和tar就不做演示了,cp和tar屬於物理備份工具,適用於所有的存儲引擎,但是僅僅支持冷備;可以完全備份混合部分備份。
基於LVM的備份
環境
centos7.4 mariadb 10.2.15
這裏我的數據目錄在/data/mysql
二進制文件目錄在/data/binlog
準備mariadb配置
修改數據庫的配置文件將二進制文件和數據文件分開存放並且重啟數據庫,重讀配置文件。
#mariadb的高版本配置文件被拆分到幾個文件中去了
vim /etc/my.cnf.d/server.cnf
[mysqld]
#指定數據目錄
datadir=/data/mysql
#指定二進制文件路徑和名稱前綴
log_bin=/data/binlog/mysql-bin
#將每個數據庫都單獨存放
innodb_file_per_table
由於這裏實現的是基於LVM的備份因此數據要存放於lvm卷上
#創建目錄
mkdir /data/{binlog,mysql} -pv
#掛載邏輯卷
mount /dev/vg0/lv_data /data/mysql
mount /dev/vg0/lv_binlog /data/binlog
chown -R mysql:mysql /data/
#重啟數據庫
systemctl restart mariadb
#如果出現下圖提示就執行以下命令
#低版本一般不會出現,mariadb在10.2.15包括以上要手動重新初始化數據庫才能正常啟動
mysql_install_db --datadir=/data/mysql --user=mysql
systemctl restart mariadb
實現LVM的快照備份
既然要做備份實驗那麽就先在數據庫中導入一些數據,
mysql <hellodb_innodb.sql
1.在數據庫添加讀鎖,限制其他用戶寫入數據
#進入數據庫,我這裏沒有設密碼可以直接登入
mysql
#添加讀鎖
mysql>flush tables with read lock;
#查看二進制日誌文件,記錄文件名和pos編號
mysql>show master logs;
2.創建快照,這裏要新打開一個終端
lvcreate -n lv_mysql_snap -L 1G -s -p r /dev/vg0/lv_data
3.數據庫解鎖
mysql>unlock tables;
4.掛載快照並備份數據文件
mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt
#復制文件,由於是做演示所以就進備份到本地了
cp -a /mnt/ /backup/
5.刪除快照
#卸載
umount /mnt
#刪除快照(快照存在會影響數據的寫入)
lvremove /dev/vg0/lv_mysql_snap
到這裏備份基本完成
實現LVM快照的還原
1.模擬損壞
#模擬在損壞前有用戶寫入了其他數據信息
mysql> create database db1;
mysql> create database db2;
#刪除數據庫數據
rm -rf /data/mysql/*
#停止數據庫
systemctl stop mariadb
2.還原備份的數據文件
cp -av /backup/* /data/mysql/
3.禁止外部用戶連接
vim /etc/my.cnf.d/server.cnf
#加入以下字段到mysqld
skip_networking
#重啟數據庫
systemctl start maraidb
4.恢復binlog中最新日誌到數據庫中,要先登錄數據庫查看以下master logs
cd /data/binlog/
mysqlbinlog --start-position=8960 mysql-bin.000002 > /backup/bin.sql
mysqlbinlog mysql-bin.000003 >> /backup/bin.sql
mysqlbinlog mysql-bin.000004 >> /backup/bin.sql
mysqlbinlog mysql-bin.000005 >> /backup/bin.sql
mysql < /backup/bin.sql
5.恢復用戶訪問
vim /etc/my.cnf.d/server.cnf
#刪除字段
skip_networking
systemctl restart mariadb
6.查看數據信息,發現後續添加的信息也恢復了
基於mysqldump實現備份恢復
這裏是還原了新環境的虛擬機
數據庫數據文件損壞,如何還原最新狀態
這裏的前提是要求有著完全備份,而且可以正常獲取最新從二進制日誌文件
1.完全備份數據庫
mysqldump -A -F --single-transaction --master-data=2 > /backup/full.sql
2.修改數據庫後破壞數據信息
rm -rf /data/mysql/*
3.重啟數據庫並恢復備份
systemctl stop mariadb
mysql_install_db --datadir=/data/mysql --user=mysql
# 編輯配置文件並禁止其他用戶訪問
vim /etc/my.cnf.d/server.cnf
innodb_file_per_table
systemctl start mariadb
#將二進制文件生成sql文件
#查看全備份的sql文件可以看到備份時候的二進制文件和起始位置(如果是恢復失誤刪除的表可以在整合完二進制文件生成的sql文件後,找到誤刪除表的語句,刪除該語句即可)
mysqlbinlog --start-position=385 mysql-bin.000005 >bin.sql
# 恢復完全備份數據
mysql < /backup/full.sql
mysql < bin.sql
4.修改配置文件刪除innodb_file_per_table字段重啟即可
單表備份
單表恢復(涉及表之間的關聯問題)
備份
mysqldump hellodb students > /backup/stu_bak.sql
還原備份
mysql hellodb < /backup/stu_bak.sql
基於xtrabackup實現備份恢復
mariadb 10.2.15要使用最新的2.4.11版本
完全備份和恢復
1.安裝percona-xtrabackup
yum localinstall percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm -y
2.完全備份(先導入了一個自建的hellodb作為測試數據)
# innobackupex (--user=root) /backup/默認就是以root用戶去備份,這裏省略了
innobackupex /backup/
3.刪除數據模擬損壞
rm -rf /data/mysql/*
4.整理日誌信息
innobackupex --apply-log /backup/2018-06-15_22-12-06/
5.停止數據庫
systemctl stop mariadb
6.恢復數據到目錄並修改權限
innobackupex --copy-back /backup/2018-06-15_22-12-06/
chown -R mysql:mysql /data/mysql/
7.啟動mariadb,驗證是否成功
systemctl start mariadb
常用的幾種mariadb備份還原手段——上篇