1. 程式人生 > >MySQL 完全備份 + 增量備份+完全恢復

MySQL 完全備份 + 增量備份+完全恢復

val 還需 結合 nlog sha local 保存 定時備份 完全備份

簡介

1·完全備份與增量備份的概念
2·使用 mysqldump 完全備份
3·使用 mysqldump 進行表結構備份
4·完全備份恢復的兩種方法
5·使用 flush logs 進行增量備份
6·增量備份恢復
7·基於時間點與位子的恢復
8·MySQL 備份思路


完全備份與增量備份的概念

1·MySQL 完全備份:是對整個數據庫的備份、數據庫結構和文件結構的備份,保存的是備份完成時刻的數據庫,它也是增量備份的基礎。它的優點:備份與恢復操作簡單,缺點是數據存在大量的重復,占用大量的備份空間,備份時間長。
2·MySQL 增量備份:是針對在上次完全備份或增量備份後被修改的文件才會備份。因為完全備份的 缺點會占用很多的資源,所以增量備份與完全備份這中結合就能解決這樣的缺點。

3·MySQL 是沒有提供直接的增量備份的辦法,但是可以通過MySQL的二進制日誌間接實現增量備份。二進制日誌保存了所有更新或者可能更新數據庫的操作,使用flush logs 可以使日誌分割開來,這樣就可以識別每次更新的操作會在另一個日誌文件中。


實驗前準備:

因為這裏涉及到數據庫的表,所以在這之前就創建好了一張表,如下圖所示:


技術分享圖片


mysqldump 完全備份與恢復

1·針對一個庫完全備份命令格式:
mysqldump -uroot -p123123 --databases kgc(庫名) > /opt/kgc.sql(備份到什麽地方)
2·模擬kgc這個庫中的表丟失。
mysql> drop tabale school;


技術分享圖片


3·數據庫中的表丟失,恢復表的命令格式:
mysql -uroot -p123123 < /opt/kgc.sql ---- (恢復kgc庫中的表,重你備份的地方導入即可)
4·驗證恢復備份:
mysql> show tables;
mysql> select * from school;


技術分享圖片


5·對數據庫所有表進行備份
mysqldump -uroot -p123123 --all-databases > /opt/all.sql ----(對所有庫備份加入選項 --all )


6·對庫中的一張表的表結構進行備份,註意這裏只是備份表結構
mysqldump -uroot -p123123 -d kgc(庫名)school(表名) > /opt/desc.sql


MySQL 增量備份

1·增量備份是基於完全備份之後的所修改的數據進行備份,所以這裏必須先做完全備份,在做增量備份。上面的實驗已經做過了完全備份,現在可以直接做增量分了。
2·要進行MySQL增量備份需要開啟二進制日誌功能。需要在主配置文件【mysqld】項中加入:log-bin=mysql-bin 如下圖:
[root@localhost ~]# vim /etc/my.cnf


技術分享圖片


3·重啟MySQL服務、查看二進制日誌文件
[root@localhost ~]# systemctl restart mysqld.service


技術分享圖片


4·模擬在表中添加數據,然後把只備份添加的數據。
mysql> insert into school (姓名,成績) values (‘成龍‘,79);


技術分享圖片


5·模擬故障,因為人員誤操作或其他因素,導致表被刪除。
使用命令 mysqladmin -uroot -p123123 flush-logs 再次生成一份日誌文件,這樣接下來對MySQL的記錄將會寫在新的日誌文件中
mysql> drop table school;
mysql> show tables;


技術分享圖片


6·數據恢復。恢復思路
(1)首先需要把完全備份恢復
(2)其次,需要知道我們之前在插入數據的時候的所有操作都會紀律在日誌文件中。
(3)最後我們需要重日誌文件中恢復之前插入的數據。
(4)這樣就能完全恢復之前表中的數據。


技術分享圖片


7·驗證數據是否恢復成功。


技術分享圖片


8·基於時間點與位置的恢復
列如:需要往數據庫中插入兩條數據,但是由於誤操作,兩條插入語句中間刪除了一條數據,而這條數據是不應該被刪除的,這個時候就需要恢復到誤操作之前,跳過刪除這一條數據這個命令,再恢復後面的正確操作。
(1)再次分割日誌:
[root@localhost data]# mysqladmin -uroot -p123123 flush-logs
(2)模擬誤操作,添加數據的過程中,誤刪除一條數據,因為大意沒註意刪除的數據還需要保留,再次繼續寫入數據


技術分享圖片


9·這時候發現表數據丟失,需要恢復表中被刪除的數據。恢復思路:
(1)再次進行日誌分割,是接下來的操作歸於另一個二進制日誌文件中
(2)查看需要恢復的二進制日誌文件,找到需要恢復的時間點或位置點並且記錄
(3)如果是基於時間點恢復則使用命令:
--stop-datetime(到這個錯誤操作的時間點停止)
--start-datetime (再到下一個正確的時間點開始)
(4)如果是基於位置的恢復則使用命令:
--stop-position ---(上一次可以正確執行的位子點)
--start-position ---(下一次可以正確執行的位子點)


10·使用以下命令查看二進制日誌文件,查找正確與錯的時間和位子點:
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000003
查找的內容如下圖:


技術分享圖片


11·模擬故障數據庫中的表丟失,開始恢復數據,恢復思路:
(1)首先完全備份恢復
(2)其次找到恢復的時間點或者位子點
(3)開始增量備份位子點的恢復(這裏我選擇位子點恢復)
[root@localhost data]# mysqlbinlog --no-defaults --stop-position=‘344‘ /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p123123 ---(恢復正確位子點)
[root@localhost data]# mysqlbinlog --no-defaults --start-position=‘835‘ /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p123123 ---(下一次正確位子點)


總結

1·MySQL 中使用mysqldump 工具備份,它生成的是sql的腳本文件
2·恢復數據使用mysql
3·備份可以針對整庫、一些庫或表、表結構進行備份。
4·增量備份需要使用分割日誌的方式備份
5·增量恢復需要根據日誌文件的先後,做個執行
6·使用基於時間和位子的方式恢復,可以更精確的恢復數據
7·大企業應該每周做一次全備,每天做一次增量備份;中小企業應該每天進行一次全備
8·可以結合周期性計劃任務進行備份,定時備份。時間主要放在業務需求量較小的時間段。

MySQL 完全備份 + 增量備份+完全恢復