上一篇寫了mariadb的幾種複製模型,此次就丟幾個maraidb的經常使用備份恢復模擬吧。
文中用到的數據庫hellodb連接
使用的hellodb.sql文件地址
https://pan.baidu.com/s/1uI3Br-HJ8t5-C-_bfZenPgmysql
備份主要是用來應對如下的狀況:災難恢復,硬件故障,軟件故障,天然災害,×××惡意×××,人爲的誤操做致使數據的損壞等。
備份時要關注的重點在於能容忍最多丟失多少的數據量,在現在數據基本和金錢等價的現實下,數據仍是能少丟就少丟吧;恢復數據要在多長時間內完成;須要恢復哪些數據。
注意:
單純作備份是不可行的,作好備份以後還要考慮作的備份是否可用(還原測試);按期作還原演練(在我的機器實驗)。sql
徹底備份-整個數據集所有備份。
增量備份-僅僅備份最近一次徹底備份或者增量備份(若存在增量)之後的變化的數據,備份速度相對較快,可是還原比較複雜,須要作整合。
差別備份-僅僅備份一次徹底備份以來變化的數據,備份速度相對增量備份慢,可是還原簡單。
部分備份-只備份數據的子集,例如部分庫和部分表。數據庫
儘量要講數據文件和二進制日誌文件分開存放。vim
冷備:數據庫讀寫操做所有中止直到備份結束。
溫備:讀操做能夠進行,可是沒法進行寫操做。
熱備:讀寫操做都不受影響,都可正常進行。
MyISAM:溫備,不支持熱備。
InnoDB:都支持(如今大多都使用,同時還支持事務)
物理備份:直接複製數據文件進行備份,與存儲引擎相關,佔用空間多,速度快。
邏輯備份:從數據庫中導出數據到其餘地方存儲,與存儲引擎無關,佔用空間相對較少,速度慢,可能會丟失數據精度。centos
在進行備份以前咱們考慮清楚後才能夠進行,畢竟數據無價。
1.作溫備時候鎖要持續的時間
2.備份過程當中會佔用多少系統的資源
3.備份會消耗的時間
4.數據恢復時候消耗的時間
5.咱們該備份什麼
數據
二進制日誌,InnoDB事務日誌文件
程序代碼(指的是數據庫的)
服務器的配置文件服務器
簡單的cp和tar就不作演示了,cp和tar屬於物理備份工具,適用於全部的存儲引擎,可是僅僅支持冷備;能夠徹底備份混合部分備份。ide
centos7.4 mariadb 10.2.15
這裏個人數據目錄在/data/mysql
二進制文件目錄在/data/binlog工具
修改數據庫的配置文件將二進制文件和數據文件分開存放而且重啓數據庫,重讀配置文件。測試
#mariadb的高版本配置文件被拆分到幾個文件中去了 vim /etc/my.cnf.d/server.cnf [mysqld] #指定數據目錄 datadir=/data/mysql #指定二進制文件路徑和名稱前綴 log_bin=/data/binlog/mysql-bin #將每一個數據庫都單獨存放 innodb_file_per_table
因爲這裏實現的是基於LVM的備份所以數據要存放於lvm捲上ui
#建立目錄 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
既然要作備份實驗那麼就先在數據庫中導入一些數據,
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
到這裏備份基本完成
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.查看數據信息,發現後續添加的信息也恢復了
這裏是還原了新環境的虛擬機
這裏的前提是要求有着徹底備份,並且能夠正常獲取最新從二進制日誌文件
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