文章目錄
- 一、資料庫備份分類:
- 從物理與邏輯的角度,備份可分為物理備份和邏輯備份,
- 從資料庫的備份策略角度,備份可分為完全備份、差異備份、增量備份,
- 二、完全備份與恢復
- 備份
- 恢復
- 完全備份后恢復的實驗,
- 恢復單個庫
- 恢復單個表
- 使用Linux命令恢復
- 三、增量備份與恢復
- 1.實作增量備份
- 2.丟失完全備份之后更改的資料的恢復
- 3. 完全備份之后丟失所有資料的恢復
- 4. 基于時間點與位置恢復
- 基于時間點恢復
- 基于位置恢復
在生產環境中,資料的安全性是至關重要的,任何資料的丟失都可能產生嚴重的后果,所以資料庫需要備份,這里以新版mysql5.7為例,
一、資料庫備份分類:
從物理與邏輯的角度,備份可分為物理備份和邏輯備份,
(1)物理備份:對資料庫作業系統的物理檔案(如資料檔案、日志檔案等)的備份,又可以分為冷備份和熱備份,
冷備份:關閉資料庫時進行的備份操作
熱備份:在資料庫運行狀態中進行備份操作,這種備份方法依賴于資料庫的日志檔案,
(2)邏輯備份:對資料庫邏輯組件(如表等資料庫物件)的備份,
從資料庫的備份策略角度,備份可分為完全備份、差異備份、增量備份,
(1)完全備份:每次對資料庫進行完整的備份,可以備份單個資料庫,多個資料庫,所有資料庫,也可以備份資料
庫中的單個表,多個表,
(2)差異備份:備份那些自從上次完全備份之后被修改過的檔案,只備份資料庫部分內容,但是存盤和恢復速度快
(3)增量備份:只有那些在上次完全備份或者增量備份后被修改的檔案才會被備份,
二、完全備份與恢復
備份
使用mysqldump工具可以靈活的控制備份的內容,比如某幾個表或庫都可以單獨備份,
- 對單個庫進行完全備份,命令格式如下:
mysqldump -u用戶名 -p[密碼] [選項] [資料庫名] > /備份路徑/備份檔案名
例:
mysqldump -u root -p123456 mysql > /bak/mysql_bak/$(date +%F).sql
圖解:

如果不想出現那個warning資訊,可以執行export MYSQL_PWD=123456,然后下次可以不用輸入密碼引數了,
2、對多個庫進行完全備份,命令格式如下:
mysqldump -u用戶名 -p[密碼] [選項] --databases 庫名1 庫名2 ... > /備份路徑/備份檔案名

3. 對所有庫進行完全備份,命令格式如下:
mysqldump -u用戶名 -p[密碼] --opt --all-databases > /備份路徑/備份檔案名

4. 對表結構進行完全備份,命令格式如下:
mysqldump -u用戶名 -p[密碼] -d 資料庫名 表名 > /備份路徑/備份檔案名
例:
mysqldump -uroot -p123456 -d zcy1 student > /bak/mysql_bak/$(date +%F).sql

5. 對表進行完全備份,命令格式如下:
mysqldump -u用戶名 -p[密碼] 資料庫名 表名 > /備份路徑/備份檔案名

恢復
- 登錄mysql,使用source命令恢復庫,命令格式如下:
source 庫備份腳本的路徑

2. 在不登錄MySQL的情況下,使用mysql命令直接恢復整庫,命令格式如下:
mysql -u用戶名 -p[密碼] < 庫備份腳本的路徑
例:
mysql -u root -p123456 < /bak/mysql_bak/2021-02-03.sql

完全備份后恢復的實驗,
恢復單個庫
環境:假設資料庫損壞,洗掉資料庫zcy1,
drop database zcy1;

1、 使用source命令恢復,
注意:先創建一個同名的資料庫,再進入資料庫,用surce命令恢復,否則會報錯,
source /bak/mysql_bak-2021-01-30.sql

2、使用mysql命令恢復,
再一次刪掉資料庫zcy1,
drop database zcy1;

然后在linux下恢復:
mysql -u root -p123456 < /bak/mysql_bak/2021-02-03.sql

恢復之后成功進入

恢復單個表
先將表模擬洗掉,再恢復,
drop table student;

然后進行恢復
source /bak/mysql_bak/2021-02-03.zcy1.student.sql


使用Linux命令恢復
模擬一下刪表,然后再恢復

表已經沒了,現在我們來恢復一下
mysql -uroot -p 123456 zcy1 < /bak/mysql_bak/2021-02-03.zcy1.student.sql

恢復成功了,

三、增量備份與恢復
MySQL沒有提供直接的增量辦法,但是可以通過對MySQL的二進制日志間接實作增量備份,二進制日志保存了所有更新或者可能更新資料庫的操作,
特點:
- 沒有重復資料,備份量不大,時間短
- 需要上次完全備份及完全備份之后所有的增量備份才能恢復,而且要進行逐個反推恢復,操作繁瑣,
1.實作增量備份
要進行MySQL增量備份,首先要開啟二進制日志功能,
(1)在mysql的組態檔的[mysqld]選項中加入log-bin=mysql-bin,然后重啟服務,
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin

然后重啟mysql
(2)使用mysqldump完全備份school庫,
mysqldump -u root -p123456 zcy1 > /bak/mysql_bak/$(date +%F).sql

(3)使用mysqladmin的選項flush-logs生成新的二進制檔案,這樣在插入新的資料后,新的二進制檔案對應的就是資料庫的變化的內容,
mysqladmin -uroot -p123456 flush-logs

(4)插入一條新的資料,以模擬資料的增加或變更,

此時的資料庫變化保存在編號2 的二進制檔案中,使用mysqlbinlog命令可以查看二進制檔案的內容,里面保存了插入資料的陳述句,
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002

(5)再次執行flush- logs操作生成新的二進制檔案,而新的二進制檔案會保存之后的資料操作,
mysqladmin -uroot -p123456 flush-logs

(6)再次向資料庫插入一條資料,
insert into student (id,name,age) values (7,'wl','30');

(7)最后再執行一次flush-logs操作,確保之前的二進制檔案不再發生變化,

2.丟失完全備份之后更改的資料的恢復
(1)使用delete洗掉插入的兩條資料,也就是假設完全備份后的資料丟失了,
delete from student where id=6;
delete from student where id=7;

(2)使用二進制檔案恢復時需要注意的是恢復順序,要先恢復最先生成的二進制檔案,然后依次執行,
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000002|mysql -uroot -p123456
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000003|mysql -uroot -p123456

3. 完全備份之后丟失所有資料的恢復
當完全備份和增量備份之后,所有資料丟失,需要把完全備份和所有增量備份檔案逐個恢復,
(1)執行flush-logs操作分割日志,插入一條資料,

insert into student (id,name,age) values (8,'wangw','20');

這條插入陳述句保存在mysql-bin.000005二進制檔案中,
(2)再執行一次flush-logs操作,插入一條資料,之后還要再執行一次flush-logs操作,確保插入資料保存在二進制檔案中,不再改變,
mysqladmin -uroot -p123456 flush-logs

insert into student (id,name,age) values (9,'lqw','22');

mysqladmin -uroot -p123456 flush-logs

這條插入陳述句保存在mysql-bin.000006二進制檔案中,
(3)使用drop洗掉表student,也就是假設完全備份前info的資料和完全備份后的資料都丟失了,
drop table student;

(4)先使用mysql命令進行完全備份的恢復操作,
show tables;

(5)使用二進制檔案恢復時需要注意的是恢復順序,要先恢復最先生成的二進制檔案,然后依次執行,
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000005|mysql -uroot -p123456
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000006|mysql -uroot -p123456

4. 基于時間點與位置恢復
利用二進制日志可實作基于時間點與位置的恢復,例如由于誤操作洗掉了一張表,這時完全恢復時沒有用的,因為日志里面還存在誤操作的陳述句,我們需要的是恢復到誤操作前的狀態,然后跳過誤操作的陳述句,再恢復后面操作的陳述句,
以此表為實驗物件:

首先對資料庫進行備份,

基于時間點恢復
將某個起始時間的二進制日志匯入資料庫中,從而跳過某個發生錯誤的時間點實作資料的恢復,
1)執行flush-logs操作生成新的二進制檔案,
mysqladmin -uroot -p123456 flush-logs

2)插入兩條資料,但由于誤操作,兩條插入陳述句中間洗掉了一條資料,而這條資料是不應該洗掉的,為了確保資料保存在二進制檔案中不改變,執行一次flush-logs操作,

生成新的二進制檔案
mysqladmin -uroot -p123456 flush-logs

3)假設資料損壞,洗掉表info,
drop table student;

4)使用mysql命令進行完全備份的恢復操作,
mysql -uroot -p123456 zcy1 < /bak/mysql_bak/2021-02-04.sql

可以看到,剛才洗掉的表又被恢復了,

5)查看資料操作陳述句保存的二進制檔案mysql-bin.0000020,
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000008



6)根據二進制檔案的資料操作陳述句的時間點進行完全備份后增量備份的恢復操作,
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000008 --stop-datetime='21-02-04 18:08:47'|mysql -uroot -p123456
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000008 --start-datetime='21-02-04 18:09:03'|mysql -uroot -p123456


基于位置恢復
使用基于時間點的恢復可能會出現在一個時間點里既同時存在正確的操作又存在錯誤的操作,基于位置是一種更為精確的恢復方式,
實驗物件表:

1)執行flush-logs操作生成新的二進制檔案,
mysqladmin -uroot -p123456 flush-logs

2)插入兩條資料,但由于誤操作,兩條插入陳述句中間洗掉了一條資料,而這條資料是不應該洗掉的,為了確保資料保存在二進制檔案中不改變,執行一次flush-logs操作,
insert into student (id,name,age) values (10,'ten','10');
delete from student where id=8;
insert into student (id,name,age) values (11,'bba','11');


再生成一條二進制日志,保存之后的操作資料,
mysqladmin -uroot -p123456 flush-logs

3)查看資料操作陳述句保存的二進制檔案mysql-bin.0000010,
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.0000010



4)假設資料損壞,洗掉表 student,
drop table student;

5)使用mysql命令進行完全備份的恢復操作,
mysql -uroot -p123456 zcy1 < /bak/mysql_bak/2021-02-04.sql

全量備份恢復成功,下面進行增加備份的恢復,

4)根據二進制檔案的資料操作陳述句的時間點進行完全備份后增量備份的恢復操作,
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000010 --stop-position='615'|mysql -uroot -p123456
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000010 --start-position='665'|mysql -uroot -p123456

備份恢復成功,連之前誤操作的洗掉資料也都恢復了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256723.html
標籤:其他
上一篇:OSPF雙點雙規與雙歸屬實驗
下一篇:Linux中的命令列解釋器和權限
