1. 程式人生 > 其它 >Mysql資料庫—日誌、備份與恢復

Mysql資料庫—日誌、備份與恢復

目錄

一、mysql常用日誌

1.1 概述

1.日誌檔案在資料庫進行備份和恢復時起到了很重要的作用
2.常用的日誌檔案預設儲存在mysql的工作目錄下的data目錄(/usr/local/mysql/data)目錄下
3.可在/etc/my.cnf配置檔案中的 [mysqld] 中進行日誌的路徑配置

1.1.1 錯誤日誌

1.用於記錄 mysql 啟動、停止或執行時產生的錯誤資訊
2.可通過一下欄位進行更新: 
log-error=/usr/local/mysql/data/mysql_error.log(指定日誌的儲存位置和檔名)

1.1.2 通用查詢日誌

1.用來記錄mysql的所有連線和語句,預設是關閉的
2.開啟方式:
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

1.1.3 二進位制日誌(binlog)

1.二進位制日誌,用來記錄所有更新的資料或者已經潛在更新了資料的語句,記錄了資料的更改,可用於資料恢復,預設開啟
2.開啟方式: 
log-bin=mysql-bin 或者 log_bin=mysql-bin

1.1.4 慢查詢日誌

1.慢查詢日誌,用來記錄所有執行時間超過long_query_time秒的語句,可以找到哪些查詢語句執行時間長,以便於優化 
2.開啟方式: 
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log (指定檔案路徑和名稱)
long_query_time=5 (設定執行超過5秒的語句會被記錄,預設時預設為10秒)


1.2 查詢日誌狀態

1.2.1 檢視通用日誌開啟狀態

show variables like 'general%';

1.2.2 檢視二進位制日誌開啟狀態

show variables like 'log_bin%';

1.2.3 檢視慢查詢日誌功能是否開啟

show variables like '%slow%';

1.2.4 檢視慢查詢時間設定

show variables like 'long_query_time';

1.2.5 在資料庫中設定開啟慢查詢的辦法(臨時)

set global slow_query_log=ON;

二、備份與恢復

2.1 概述

1.備份的主要目的是災難恢復
2.在生產環境中,資料的安全性至關重要
3.任何資料的丟失都可能產生嚴重的後果
4.通常情況下,造成資料丟失的原因有一下幾種:
1)程式錯誤
2)人為操作錯誤
3)運算錯誤
4)磁碟故障
5)災難(火災、地震、盜竊等)

2.2 備份型別

2.2.1 從物理與邏輯的角度分類(邏輯備份、物理備份)

1.資料庫備份可以分為物理備份和邏輯備份
2.邏輯備份是對資料庫邏輯元件(如表等資料庫物件)的備份
3.邏輯備份適用於可以編輯資料值或表結構較小的資料量,或者在不同的機器體系結構上重新建立資料
4.物理備份是對資料庫作業系統的物理檔案(如資料檔案、日誌檔案等)的備份
5.物理備份適用於在出現問題時需要快速恢復的大型重要資料庫
6.物理備份又可以分為冷備份(離線備份)、熱備份(聯機備份)和溫備。
1)冷備份:在資料庫關閉狀態下進行備份操作(tar)
2)熱備份:在資料庫處於執行狀態時進行備份操作,該備份方法依賴資料庫的日誌檔案(mysqldump)
3)溫備份:資料庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作。

2.2.2 從資料庫的備份策略角度分類(完全備份、差異備份、增量備份)

1.完全備份:
1)每次對資料進行完整的備份,即對整個資料庫、資料庫結構和檔案結構的備份,是差異備份與增量備份的基礎,儲存的是備份完成時刻的資料庫
2)完全備份恢復資料時直接使用完全備份的檔案即可,備份與恢復操作簡單
3)每次完全備份後會導致備份檔案存在大量的重複,並且會佔用大量的磁碟空間,備份與恢復的時間也很長
2.差異備份:
1)每次差異備份都會備份上一次完全備份之後的資料,可能出現備份資料重複,導致佔用額外的磁碟空間
2)恢復資料時,先恢復上次的完全備份,再恢復最近的一次差異備份
3.增量備份:
1)只有那些在上次完全備份或者增量備份後被修改的檔案才會被備份,不會出現重複資料的情況,也不佔用額外的磁碟空間
2)備份的資料量小,佔用空間小,備份速度快但
3)恢復時,需要從上一次的完整備份開始到最後一次增量備份之的所有增量依次恢復,如中間某次的備份資料損壞,將導致資料的丟失

2.3 備份方法

資料庫的備份可以採用很多種方式,如直接打包資料庫檔案(物理冷備份)、專用備份工具(mysqldump)、二進位制日誌增量備份、第三方工具備份等

2.3.1 物理冷備份

1.物理冷備份時需要在資料庫處於關閉狀態下,能夠較好地保證資料庫的完整性
2.使用tar命令直接打包資料庫資料夾(/usr/local/mysql/data)來實現備份,直接替換現有mysql目錄即可
3.速度快,恢復時也是最為簡單,一般用於非核心業務,這類業務一般都允許中斷

2.3.2 專用備份工具mysqldump或mysqlhotcopy

1.mysqldump工具和mysqlhotcopy都可以做備份
2.mysqlhotcopy僅適用於某些儲存引擎(MyISAM和ARCHIVE)

2.3.3 通過啟用二進位制日誌進行增量備份

如果進行增量備份(包含自上次完全備份或增量備份以來發生的資料修改) ,需要重新整理二進位制日誌

2.3.4 通過第三方工具備份

第三方工具Percona xtraBackup是一個免費的MysQL熱備份軟體

2.4 完全備份/恢復操作

2.4.1 建立表結構、表資料

use gxd;
create table if not exists gxd03 (
id int(4) not null auto_increment,
name varchar(10) not null,
primary key (id));

insert into gxd03 values(1,'zhangsan');
insert into gxd03 values(2,'lisi');

2.4.2 完全備份

InnoDB儲存引擎的資料庫在磁碟上儲存成三個檔案:db.opt(表屬性檔案)、表名.frm(表結構檔案)、表名.ibd(表資料檔案)

1)物理冷備份與恢復

systemctl stop mysqld
yum -y install xz   # xz為一種壓縮工具

壓縮備份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/

解壓恢復
tar Jxvf /opt/mysql_all_2021-08-31.tar.xz -C /usr/local/mysql/data/

2)mysqldump備份與恢復

1.完全備份一個或多個完整的庫(包括其中所有的表)

mysqldump -uroot -p[密碼] --databases 庫名 > /備份路徑/備份檔名.sql
匯出的就是資料庫指令碼檔案 
 
如:
mysqldump -uroot -p264196 --databases gxd > /opt/gxd.sql
mysqldump -uroot -p264196 --databases gxd gxd03 > /opt/gxd-gxd03.sql


2.備份所有的庫

mysqldump -uroot -p[密碼] --all-databases > /備份路徑/備份檔名.sql

如:
mysqldump -uroot -p[密碼] --all-databases > /備份路徑/all.sql

3.完全備份指定庫中的部分表

mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] … > /備份路徑/備份檔名.sql

如:
mysqldump -uroot -p264196 [-d] gxd gxd03 > /opt/gxd-gxd03.sql
#使用“-d”選項,說明只儲存資料庫的表結構
#不使用“-d”選項,說明表資料也進行備份



4.檢視備份檔案

grep -v "^--" /opt/gxd-gxd03.sql | grep -v "^/" | grep -v "^$"

2.4.3 完全恢復

1) 恢復庫

先刪除庫
mysql -uroot -p264196 -e 'drop database gxd;'
#“-e”選項,用於指定連線 MySQL 後執行的命令,命令執行完後自動退出

檢視庫
mysql -uroot -p264196 -e 'show databases;'

進行恢復操作
mysql -uroot -p264196 < /opt/gxd.sql
mysql -uroot -p264196 -e 'show databases;'

2)恢復表

先刪除表
mysql -uroot -p264196 -e 'drop table gxd.gxd03;'

檢視庫中的表
mysql -uroot -p264196 -e 'show tables from gxd;'

進行恢復操作
mysql -uroot -p264196 gxd < /opt/gxd-gxd03.sql
mysql -uroot -p264196 -e 'show tables from gxd;'


2.5 增量備份和恢復

2.5.1 增量備份需要開啟二進位制日誌功能

systemctl stop mysqld
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED	(可選項)		
server-id = 1
systemctl restart mysqld

|日誌格式|說明|
|STATEMENT(基於sql語句,預設)|每一條涉及到被修改的 sql 都會記錄在binlog中。日誌量過大,如函式、主從複製等構架記錄日誌時會出現問題|
|ROW(基於行)|只記錄變動的記錄,不記錄sql的上下文。如果遇到 updata…set…where true,那麼日誌資料量就會很大|
|MIXED(混合模式)|一般語句使用 STATEMENT,函式使用ROW。推薦使用|

2.5.2 可每天進行增量備份操作,生成新的二進位制檔案(如mysql-bin.000002)

先完成完全備份(在建立好表和庫的基礎上)
mysqldump -uroot -p264196 gxd gxd03 > /opt/gxd-gxd03-$(date +%F).sql
mysqldump -uroot -p264196 --all-databases gxd > /opt/gxd-$(date +%F).sql

生成新的二進位制檔案(可每天進行增量備份操作)
mysqladmin -uroot -p264196 flush-logs


2.5.3 進行簡單的資料插入,並增量備份

use gxd;
insert into gxd03 values(3,'wangwu');
insert into gxd03 values (4,'zhaoliu');
select * from gxd03;


2.5.4 檢視新生成的日誌內容

cp /usr/local/mysql/data/mysql-bin.000005 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000005
#--base64-output=decode-rows:使用64位編碼機制去解碼並按行讀取
#-v:顯示詳細內容
注:這邊我們解析的bin.000005,因為05才是新新增備份資料的檔案,06是重新整理後的新檔案,是個空檔案

2.5.5 模擬丟失資料,並進行恢復

1)模擬丟失更改的資料並恢復

#模擬刪除
use gxd;
delete from gxd03 where id=1;
delete from gxd03 where id=2;
exit;

#模擬恢復
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'


2)模擬丟失所有資料並恢復

use gxd;
drop table gxd03;

mysql -uroot -p264196 gxd < /opt/gxd-2021-08-31.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'