一、tar工具的使用
1、備份
(1)停止服務,3306端口關閉

(2)看下配置檔案有沒有關鍵日志存放于其它目錄的,檢查/etc/my.cnf,再檢查下/etc/my.cnf.d/下有沒有配置檔案放置其他地方,有的話也需要一起拷貝歸檔
(3)建立備份目錄,歸檔
(4)開啟服務,備份完成
2、還原
(1)這裡有個不小心輸入删重要mysql庫的指令,開始還原
(2)關閉服務,systemctl stop mariadb
(3)一定要注意配置檔案和備份前的配置是否一樣,拷貝剛才歸檔檔案并解壓至庫裡
(4)解壓後檔案注意權限,務必確定mysql.mysql權限
(4)開啟服務,systemctl start mariadb
(5)進入資料庫,檢視資料庫,mysql又回來了
二、LVM邏輯卷快照實作幾乎熱備(實質還是冷備):将資料庫内容在很短時間用邏輯卷快照備份下,之後先将資料庫推上線,再處理快照中的内容,結合二進制日志還原
1、備份
(1)新加硬碟并建立邏輯卷分區
開機添加硬碟掃描下,echo '- - -' > /sys/class/scsi_host/host0/scan,記得有每個host都需要掃描下
分區,分區時候記得更改硬碟分區檔案系統,代碼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
(3)資料遷移,需要更改配置檔案,開啟二進制日志功能,確定權限正确
注:如果重新開機服務後提示錯誤無法遷移,将原資料庫内mysql庫複制到新庫中重新開機即可
附:清除二進制日志指令:reset master
(4)基于快照備份
lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,設定了隻讀屬性
(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')
相比之前已經作出很多修改
POS點變化,說明從328往後的資料點都是在變化
(6)做完邏輯卷快照後,對資料的更改會影響伺服器性能能,也就是說舊的内容會添加到邏輯卷快照中,是以我們需要把快照裡的資料導出來,對邏輯卷快照挂載
直接挂載mount /dev/vgdb/snap_dbbak /mnt會報錯,因為快照snap_dbbak的邏輯卷uuid和lvdb邏輯卷uuid一樣,是以挂載輸入指令mount -o nouuid,norecovery /dev/vgdb/snap_dbbak /mnt
(7)為確定資料安全性,可以挂載完成後将挂載目錄裡的資料存放至其它裝置中,因為實驗環境,依舊在本機上操作
cp -a /mnt/* /backups,此處用cp -a,保留權限,此時相當于備份完成
(8)備份完成後,删除快照
lvremove /dev/vgdb/snap_dbbak
(9)模拟損壞,删庫,之後跑路,不過被抓了回來需要負責到底
(10)還原開始,停止服務,拷貝原資料庫内容到資料庫存放目錄,再開放資料庫
systemctl stop mariadb;cp -av /backups/* mysql/
(11)此時發現隻有邏輯卷快照時的備份,後面的增删改沒有了,是以這裡需要引入二進制日志。在利用二進制還原時候,要避免其他使用者連接配接資料庫産生資料變更,此處需要使用防火牆或者其它政策確定資料庫隻有自己一個人操作
引用之前的圖檔,此時利用二進制日志工具可以還原
mysqlbinlog --start-position=328 mysql-bin.000001,可以檢視到内容
往下翻
mysqlbinlog --start-position=328 mysql-bin.000001 > bl.sql
mysqlbinlog mysql-bin.000002 >> bl.sql
導入後再打開二進制日志功能,發現資料回來了
(12)還原後記得之前設定的防火牆或者其它拒絕通路政策再取消掉,完成
注意:如果删庫用的是drop,不像實驗中rm指令删除的,mybinlog BINLOG > *.sql,編輯該sql檔案,将drop指令那行注釋掉,再mysql < *.sql
3、mysqldump的備份和誤删除操作後的還原
(1)準備環境,條件允許情況下,将二進制日志檔案和資料庫存放目錄放到不同的磁盤中,而且二進制日志檔案最好單獨放在一個分區中
(2)加個資料庫作為準備環境
做點修改,二進制日志産生變化
(3)開始備份
mysqldump -A -F --single-transacation --master-data=2 | gzip > /backupsq/db.sql.gz
(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');
最後表
(5)開始還原,還原過程中利用防火牆不允許其他人通路資料庫
進入資料庫,先暫時關閉臨時會話的二進制日志,避免二進制日志重複記錄導入過程
mysql > set sql_log_bin=off;
source /backups/db.sql;
此時完成完全備份的還原
(6)開始還原修改的資料,less /backups/db.sql,檢視CHANGE MASTER TO資訊
(7)利用工具将該日志導成sql資料庫檔案,并查找删除關鍵表的指令
mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql
完成後,如果後續還有其它二進制日志,将其它二進制日志也追加到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這一步就夠了
(8)導入資料,不過導入之前需要關閉臨時會話中的sql_log_bin,避免出現二進制日志重複記錄的現象
set sql_log_bin=off;
source /data/incr.sql
這下我們的teachers表回來了,修改的students表也還原了
(9)關閉之前的拒絕使用者通路政策,完成