1、備份
(1)停止服務,3306端口關閉
(2)看下配置文件有沒有關鍵日誌存放於其它目錄的,檢查/etc/my.cnf,再檢查下/etc/my.cnf.d/下有沒有配置文件放置其他地方,有的話也需要一起拷貝歸檔
(2)關閉服務,systemctl stop mariadb
(3)一定要注意配置文件和備份前的配置是否一樣,拷貝剛纔歸檔文件並解壓至庫裏
(4)解壓後文件注意權限,務必確保mysql.mysql權限
(4)開啓服務,systemctl start mariadb
二、LVM邏輯卷快照實現幾乎熱備(實質還是冷備):將數據庫內容在很短時間用邏輯卷快照備份下,之後先將數據庫推上線,再處理快照中的內容,結合二進制日誌還原
(1)新加硬盤並建立邏輯卷分區
開機添加硬盤掃描下,echo '- - -' > /sys/class/scsi_host/host0/scan,記得有每個host都需要掃描下
分區,分區時候記得更改硬盤分區文件系統,代碼8e,Linux LVM
lvcreate -n lvdb -L +6G /dev/vgdb ----->建立邏輯卷用來放置數據庫數據
lvcreate -n lvdb -L +4G /dev/vgbin ----->建立邏輯卷用來單獨放置二進制日誌
mkdir -pv /data/{mysql,binlog}
mount /dev/vgdb/lvdb /data/mysql
mount /dev/vgdb/lvbin /data/binlog
(3)數據遷移,需要更改配置文件,開啓二進制日誌功能,確保權限正確
注:如果重啓服務後提示錯誤無法遷移,將原數據庫內mysql庫複製到新庫中重啓即可
lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,設置了只讀屬性
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')
(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,保留權限,此時相當於備份完成
(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)準備環境,條件允許情況下,將二進制日誌文件和數據庫存放目錄放到不同的磁盤中,而且二進制日誌文件最好單獨放在一個分區中
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;
再修改:insert into students values(26,'Yang Guo',28,'M',NULL,NULL,'CEO');
(5)開始還原,還原過程中利用防火牆不允許其他人訪問數據庫
進入數據庫,先暫時關閉臨時會話的二進制日誌,避免二進制日誌重複記錄導入過程
(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,避免出現二進制日誌重複記錄的現象
這下我們的teachers表回來了,修改的students表也還原了