1. 程式人生 > 其它 >MySQL日誌管理、備份與恢復

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之前的資料

先刪除資料