MySQL日誌管理、備份與恢復
目錄
一、MySQL日誌管理
1.1日誌的分類
1.1.1錯誤日誌
1.1.2通用查詢日誌
1.1.3二進位制日誌
1.1.4慢查詢日誌
1.1.5配置日誌
1.2日誌的查詢
二、MySQL完全備份與恢復
2.1資料備份的重要性
2.2造成資料丟失的原因
2.3資料庫備份的分類
2.3.1從物理和邏輯角度分
2.4資料庫的備份策略
2.4.1完全備份:每次對資料庫進行完整的備份
2.4.2差異備份:備份自從上次完全備份之後被修改過的檔案
2.4.3增量備份:只有在上次完全備份或者增量備份後被修改的檔案才會被備份
2.5 MySQL完全備份
2.5.1物理冷備份與恢復
2.5.2專用備份工具mydump和mysqlhotocopy
2.5.3 MySQL完全備份(使用免互動)
2.5.4 MySQL增量備份與恢復
2.5.5 MySQL增量恢復
一、MySQL日誌管理
MySQL 的日誌預設儲存位置為/usr/local/mysql/data MySQL 的日誌配置檔案為/etc/my.cnf,裡面有個[mysqld]項。
1.1日誌的分類
1.1.1錯誤日誌
用來記錄當MySQL啟動、停止或執行時發生的錯誤資訊,預設已開啟
1 vim /etc/my.cnf
2 log-error=/usr/local/mysql/data/mysql_error.log
1.1.2通用查詢日誌
用來記錄MySQL的所有連線和語句,預設是關閉的
1 vim /etc/my.cnf 2 general_log=ON 3 general_log_file=/usr/local/mysql/data/mysql_general.log
1.1.3二進位制日誌
用來記錄所有更新了資料或者已經潛在更新了資料的語句,記錄了資料的更改,可用於資料恢復,預設已開啟
1 vim /etc/my.cnf
2 #也可以 log_bin=mysql-bin
3 log-bin=mysql-bin
1.1.4慢查詢日誌
用來記錄所有執行時間超過long_query_time秒的語句,可以找到哪些查詢語句執行時間長,以便於優化,預設是關閉的
1 vim /etc/my.cnf
2 slow_query_log=ON
3 slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
4 long_query_time=5
1.1.5配置日誌
1 #修改my.cnf配置檔案
2
3 #錯誤日誌
4 log-error=/usr/local/mysql/data/mysql_error.log
5 #通用查詢日誌
6 general_log=ON
7 general_log_file=/usr/local/mysql/data/mysql_general.log
8 #二進位制日誌
9 log-bin=mysql-bin
10 #慢查詢日誌
11 slow_query_log=ON
12 slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
13 long_query_time=5
14
15 #重新mysql服務
16 systemctl restart mysqld.service
1.2日誌的查詢
1 #登入mysql
2 mysql -u root -p[密碼]
3
4 #檢視通用查詢日誌是否開啟
5 show variables like 'general%';
6
7 #檢視二進位制日誌是否開啟
8 show variables like 'log_bin%';
9 #檢視慢查詢日誌是否開啟
10 show variables like '%slow%';
11 #檢視慢查詢時間設定
12 show variables like 'long_query_time';
13 #在資料庫中設定開啟慢查詢的方法
二、MySQL完全備份與恢復
2.1資料備份的重要性
- 備份的主要目的是災難恢復
- 在生產環境中,資料的安全性至關重要
- 任何資料的丟失都可能產生嚴重的後果
2.2造成資料丟失的原因
-
程式錯誤
-
人為操作錯誤.
-
運算錯誤
-
磁碟故障
-
災難(如火災、地震)和盜竊
2.3資料庫備份的分類
2.3.1從物理和邏輯角度分
①物理備份
對資料庫作業系統的物理檔案(如資料檔案、日誌檔案等)的備份
物理備份的方法 :
冷備份(離線備份) :是在關閉資料庫的時候進行的;
熱備份(聯機備份) :資料庫處於執行狀態,依賴於資料庫的日誌檔案;
溫備份:資料庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作。
②邏輯備份
對資料庫邏輯元件(如:表等資料庫物件)的備份
2.4資料庫的備份策略
2.4.1完全備份:每次對資料庫進行完整的備份
-
是對整個資料庫、資料庫結構和檔案結構的備份
-
儲存的是備份完成時刻的資料庫
-
是差異備份與增量備份的基礎
優點:備份與恢復操作簡單方便 缺點:資料存在大量的重複、佔用大量的備份空間及備份與恢復時間長
2.4.2差異備份:備份自從上次完全備份之後被修改過的檔案
2.4.3增量備份:只有在上次完全備份或者增量備份後被修改的檔案才會被備份
1 use ky17;
2 create table xinxi (id int(10) not null auto_increment,primary key(id),name varchar(10) not null,hobby varchar(40));
3 insert into xinxi values (1,'zhangsan','dance'),(2,'lisi','sing');
2.5 MySQL完全備份
InnoDB儲存引擎的資料庫在磁碟上儲存成三個檔案:
-
db.opt(表屬性檔案)
-
表名.frm(表結構檔案)
-
表名.ibd(表資料檔案)
模擬環境如下:在ky17庫中有一張xinxi表
2.5.1物理冷備份與恢復
-
備份時資料庫處於關閉狀態,直接打包資料庫檔案
-
備份速度快,恢復時也是最簡單的
1. #關閉mysql,備份data目錄
systemctl stop mysqld.service
yum -y install xz
cd /usr/local/mysql
#壓縮備份data目錄
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz data/
2. #登入mysql,刪除ky17庫
systemctl start mysqld.service
mysql -u root -p123456
3. #解壓之前備份的資料庫data目錄,不用刪除原目錄,會自動替換
cd /opt
ls
cd /usr/local/mysql
tar Jxvf /opt/mysql_all_2022-04-08.tar.xz -C ./
4. #重啟服務檢視被刪除的庫
2.5.2專用備份工具mydump和mysqlhotocopy
-
mysqldump常用的邏輯備份工具
-
mysqlhotcopy僅擁有備份MyISAM和ARCHIVE表
①完全備份一個或多個完整的庫(包括其中所有的表)
1 #匯出的就是資料庫指令碼檔案
2 mysqldump -u root -p[密碼] --databases 庫名1 [庫名2] … > /備份路徑/備份檔名.sql
示例:備份單個和多個庫
1 mysqldump -uroot -p --databases ky17 > /opt/ky17.sql2 mysqldump -uroot -p --databases ky17 kgc > /opt/ky17-kgc.sql
②完全備份 MySQL 伺服器中所有的庫
1 mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份檔名.sql
示例:備份所有庫
1 mysqldump -uroot -p123456 --all-databases > /opt/all.sql
③完全備份指定庫中的部分表
1 mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] … > /備份路徑/備份檔名.sql
示例: 備份ky17庫中的xinxi表
1 mysqldump -uroot -p123456 ky17 [-d] xinxi > /opt/ky17_xinxi.sql
-
使用“-d”選項,說明只儲存資料庫的表結構
-
不使用“-d”選項,說明表資料也進行備份
④檢視備份檔案
1 cat ky17_xinxi.sql |grep -v '^/'|grep -v '^$'|grep -v '^-'
2.5.3 MySQL完全備份(使用免互動)
①恢復資料庫
1 mysql -u root -p -e 'drop database ky17;'
2 #“-e”選項,用於指定連線 MySQL 後執行的命令,命令執行完後自動退出
3 mysql -u root -p -e 'show databases;'
4
5 #恢復school資料庫
6 mysql -u root -p < /opt/ky17.sql
7 mysql -u root -p -e 'show databases;'
②恢復資料表
當備份檔案中只包含表的備份,而不包含建立的庫的語句時,執行匯入操作時必須指定庫名,且目標庫必須存在。
1. #刪除ky17中的xinxi表
mysql -uroot -p123456 -e 'drop table ky17.xinxi;'
mysql -uroot -p123456 -e 'show tables from ky17;'
2. #恢復ku17庫中的表
mysql -uroot -p123456 ky17 < /opt/ky17_xinxi.sql
mysql -uroot -p123456 -e 'show tables from ky17;'
2.5.4 MySQL增量備份與恢復
1.開啟二進位制日誌功能
1 vim /etc/my.cnf
2 [mysqld]
3 log-bin=mysql-bin
4 #指定二進位制日誌(binlog)的記錄格式為 MIXED
5 binlog_format = MIXED
6 server-id = 1
二進位制日誌(binlog)有3種不同的記錄格式:
-
STATEMENT(基於SQL語句)
-
ROW(基於行)
-
MIXED(混合模式),預設格式是STATEMENT
1 #只要重啟就會自動生成二進位制檔案
2 systemctl restart mysqld
2. 可每週對資料庫或表進行完全備份
3. 可每天進行增量備份操作,生成新的二進位制日誌檔案(例如 mysql-bin.000007)
4.插入新資料,以模擬資料的增加或變更
1 insert into xinxi values (3,'wangwu','pingpang'),(4,'zhaoliu','study');
5.再次生成新的二進位制日誌檔案(例如 mysql-bin.000008)
之前的步驟4的資料庫操作會儲存到mysql-bin.000007檔案中,之後資料庫資料再發生變化則儲存在mysql-bin.000008檔案中
1 cp /usr/local/mysql/data/mysql-bin.000008 /opt/
2 mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000008
3 #--base64-output=decode-rows:使用64位編碼機制去解碼並按行讀取
4 #-v:顯示詳細內容
2.5.5 MySQL增量恢復
1.一般恢復
將所有備份的二進位制日誌內容全部恢復
模擬丟失更改的資料的恢復步驟
1 use ky17;
2 delete from xinxi where id=3;
3 delete from xinxi where id=4;
4 mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p123456
2. 基於位置恢復
-
資料庫在某一時間點可能既有錯誤的操作也有正確的操作
-
可以基於精準的位置跳過錯誤的操作
-
發生錯誤節點之前的一個節點,上一次正確操作的位置點停止
1 # 重新整理生成新的二進位制日誌檔案
2 mysqladmin -u root -p flush-logs
3 # 進入到data目錄
4 cd /usr/local/mysql/data
5 #檢視二進位制日誌檔案
6 mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000009
例項:
1)在資料庫中插入資料並檢視
2)再插入一條資料
以上插入的資料都存放在mysql-bin.000009
3)測試恢復到ID為587之前的資料, 不恢復“後面一條”的資料
刪除資料之前必須先重新整理一下日誌檔案
1 mysqladmin -u root -p123456 flush-logs
對資料進行恢復
4) 僅恢復“最後一條”的資料,跳過“前面多條”的資料恢復
刪除表中所有資料
3.基於時間恢復
測試恢復到ID為587之前的資料
先刪除資料