MySQL日志管理、備份與恢復


一、MySQL 日志管理

MySQL 的日志默認保存位置為 /usr/local/mysql/data

MySQL 的日志配置文件為 /etc/my.cnf ,里面有個 [mysqld] 項

修改配置文件:

vim /etc/my.cnf
[mysqld]

1、錯誤日志

##錯誤日志,用來記錄當MySQL啟動、停止或運行時發生的錯誤信息,默認已開啟
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名

2、通用查詢日志

##通用查詢日志,用來記錄MySQL的所有連接和語句,默認是關閉的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

3、二進制日志

##二進制日志(binlog),用來記錄所有更新了數據或者已經潛在更新了數據的語句,記錄了數據的更改,可用於數據恢復,默認已開啟
log-bin=mysql-bin #也可以 log_bin=mysql-bin

4、慢日志查詢

##慢查詢日志,用來記錄所有執行時間超過long_query_time秒的語句,可以找到哪些查詢語句執行時間長,以便於優化,默認是關閉的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 #設置超過5秒執行的語句被記錄,缺省時為10秒


systemctl restart mysqld

mysql -u root -p

5、查看日志

show variables like 'general%'; #查看通用查詢日志是否開啟

show variables like 'log_bin%'; #查看二進制日志是否開啟

show variables like '%slow%'; #查看慢查詢日功能是否開啟
show variables like 'long_query_time'; #查看慢查詢時間設置

set global show_query_log=ON; #在數據庫中設置開啟慢查詢的方法

6、實例操作

6.1 修改配置文件並重啟服務

復制代碼
tail -10 /etc/my.cnf
 
log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
log-bin=mysql-bin
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5

systemctl restart mysqld.service
復制代碼

 

 6.2 查詢日志

 

 6.3 開啟以及關閉慢查詢的方法

 

 二、數據庫備份的重要性與分類

1、數據備份的重要性

  • 備份的主要目的是災難恢復
  • 在生產環境中,數據的安全性至關重要
  • 任何數據的丟失都可能產生嚴重的后果

造成數據丟失的原因

  • 程序錯誤
  • 人為操作錯誤
  • 運算錯誤
  • 磁盤故障
  • 不可控因素

2、從物理與邏輯的角度,備份分為

  • 物理備份: 對數據庫操作系統的物理文件(如數據文件、日志文件等)的備份
  • 邏輯備份:對數據庫邏輯組件(如:表等數據庫對象)的備份

物理備份方法:

  • 冷備份(脫機備份):是在關閉數據庫的時候進行的
  • 熱備份(聯機備份):數據庫處於運行狀態,依賴於數據庫的日志文件 
  • 溫備份:數據庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作

3、從數據庫的備份策略角度,備份可分為

  • 完全備份:每次對數據庫進行完整的備份
  • 差異備份:備份自從上次完全備份之后被修改過的文件
  • 增量備份:只有在上次完全備份或者增量備份后被修改的文件才會被備份

三、常見的備份方法

1、物理冷備

  • 備份時數據庫處於關閉狀態,直接打包數據庫文件
  • 備份速度快,恢復時也是最簡單的

2、專用備份工具mydump或mysqlhotcopy

  • myaqldump常用的邏輯備份工具
  • mysqlhotcopy僅擁有備份MyISM和ARCHIVE表

3、啟動二進制日志進行增量備份

  • 進行增量備份,需要刷新二進制日志

4、第三方工具備份

  • 免費MySQL熱備份軟件Percona XtraBackup

四、MySQL完全備份

1、完全備份的概念

是對整個數據庫,數據庫結構和文件結構的備份

保存的是備份完成時刻的數據庫

是差異備份與增量備份的基礎

2、優點

備份與恢復操作簡單方便

3、缺點

數據存在大量的重復

占用大量的備份空間

備份與恢復時間長

4、數據庫完全備份分類

4.1 物理冷備份與恢復

關閉MySQL數據庫

使用tar命令直接打包數據庫文件夾

直接替換現有MySQL目錄即可

4.2 mysqldump備份與恢復

MySQL自帶的備份工具,可方便實現對MySQL的備份

可以將指定的庫、表導出為SQL腳本

使用命令mysql導入備份的數據

五、MySQL增量備份

1、使用mysqldump進行完全備份存在的問題

備份數據中有重復數據

備份時間與恢復時間過長

2、增量備份的概念

是自上一次備份后增加/變化的文件或內容

3、增量備份的特點

沒有重復數據,備份不大,時間短

恢復需要上次完全備份及完全備份之后所有的增量備份才能恢復,且要對所有增備份進行逐個反推恢復

4、增量備份的方法

MySQL沒有提供直接的增量備份方法

可通過MySQL提供的二進制日志間接實現增量備份

5、MySQL二進制日志對備份的意義

二進制日志保存了所有更新或者可能更新數據庫的操作

二進制日志在啟動MySQL服務器后開始記錄,並在文件達到max_ binlog_ size所設 置的大小或者接收到flush logs命令后重新創建新的日志文件

只需定時執行flush logs方法重新創建新的日志,生成二進制文件序列,並及時把這些日志保存到安全的地方就完成了一個時間段的增量備份

6、mysql數據庫增量恢復

6.1 一般恢復

將所有備份的二進制日志內容全部恢復

6.2 基於位置恢復

數據庫在某一時間點可能既有錯誤的操作也有正確的操作

可以基於精准的位置跳過錯誤的操作

6.3 基於時間點恢復

跳過某個發生錯誤的時間點實現數據恢復

六、MySQL 完全備份與恢復

InnoDB存儲引擎的數據庫在磁盤上存儲成三個文件:

db.opt(表屬性文件)
表名.frm(表結構文件)
表名.ibd(表數據文件)

1、物理冷備份與恢復

復制代碼
systemctl stop mysqld
yum -y install xz
 
cd /usr/local/mysql
//壓縮備份
tar jcvf /opt/mysql_all_$(date +%F).tar.xz ./data
//解壓恢復
tar jxvf /opt/mysql_all_2021-8-30.tar.xz
復制代碼

1.1 備份data目錄

 

 1.2 刪除數據庫abc,測試備份能否恢復

 

 

 

 2、mysqldump 備份與恢復

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

mysqldump -u root -p[密碼] --databases 庫名1 [庫名2] … > /備份路徑/備份文件名.sql     #導出的就是數據庫腳本文件

mysqldump -u root -p --databases abc > /opt/bbc.sql
mysqldump -u root -p --databases mysql abc > /opt/mysql-abc.sql

 

 2.2 完全備份MySQL 服務器中所有的庫

mysqldump -u root -p --all-databases > /opt/all.sql

//mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份文件名.sql

 

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

mysqldump -u root -p [-d] abc mysql > /opt/abc_mysql.sql
//mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] … > /備份路徑/備份文件名.sql
//使用“-d”選項,說明只保存數據庫的表結構
//不使用“-d”選項,說明表數據也進行備份

 

 2.4 查看備份文件

grep -v "^--" /opt/bbc_test1.sql | grep -v "^/" | grep -v "^$"

 

 2.5 開啟服務

systemctl start mysqld

2.6 恢復數據庫

復制代碼
mysql -u root -p -e 'drop database abc;'
#“-e”選項,用於指定連接 MySQL 后執行的命令,命令執行完后自動退出
mysql -u root -p -e 'SHOW DATABASES;'
 
mysql -u root -p < /opt/bbc.sql
mysql -u root -p -e 'SHOW DATABASES;'
復制代碼

 

 2.7 恢復數據表

當備份文件中只包含表的備份,而不包含創建的庫的語句時,執行導入操作時必須指定庫名,且目標庫必須存在。

復制代碼
mysqldump -u root -p bbc test1 > /opt/bbc_test1.sql
 
mysql -u root -p -e 'drop table bbc.test1;'
mysql -u root -p -e 'show tables from bbc;'
 
mysql -u root -p bbc < /opt/bbc_test1.sql
mysql -u root -p -e 'show tables from bbc;'
復制代碼

 

 八、MySQL 增量備份與恢復

1、MySQL 增量備份

1.1 開啟二進制日志功能

復制代碼
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED   指定二進制日志(binlog)的記錄格式為 MIXED
server-id = 1  
//二進制日志(binlog)有3種不同的記錄格式:STATEMENT(基於SQL語句)、ROW(基於行)、MIXED(混合模式),默認格式是STATEMENT

//只要重啟服務就會生成二進制文件

systemctl restart mysqld
ls -l /usr/local/mysql/data/mysql-bin.* 
復制代碼

 

 1.2 可每周對數據庫或表進行完全備份

mysqldump -u root -p bbc test1 > /opt/bbc_test1_$(date +%F).sql
mysqldump -u root -p --all-databases> /opt/all_$(date +%F).sql

 

 1.3 可每天進行增量備份操作,生成新的二進制日志文件(例如 mysql-bin.000002)

mysqladmin -u root -p flush-logs

 

 1.4 插入新數據,以模擬數據的增加變更

use abc;
insert into test1 values(4,'aapp','女',23);
insert into test1 values(5,'bbcc','男',26);

 

 1.5 再次生成新的二進制日志文件(例如 mysql-bin.000005)

mysqladmin -u root -p flush-logs  
//之前的步驟4的數據庫操作會保存到mysql-bin.000004文件中,之后數據庫數據再發生變化則保存在mysql-bin.000005文件

 

 1.6 查看二進制文件內容

cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002  
#--base64-output=decode-rows:使用64位編碼機制去解碼並按行讀取
#-v:顯示詳細內容

 

 2、MySQL 增量恢復

2.1 一般恢復

2.1.1 模擬丟失更改的數據的恢復步驟

use abc;
delete from test1 where id=4;
delete from test1 where id=5;
 
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -u root -p

 

 2.1.2 模擬丟失所有數據的恢復步驟

use bbc;
drop table test1;
 
mysql -u root -p bbc < /opt/bbc_test1_2021-8-31.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005| mysql -u root -p

 

 2.2 斷點恢復

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000009 #查看二進制日志文件

復制代碼
BEGIN
/*!*/;
# at 831104   #斷點
#210831 11:19:18 server id 1  end_log_pos 831220 CRC32 0xa8f834ba   Query   thread_id=55    exec_time=0 error_code=0 #時間
SET TIMESTAMP=1630379958/*!*/;
insert into test1 values(4,'nancy',20,'女') #插入數據
/*!*/;
# at 831220
#210831 11:19:18 server id 1  end_log_pos 831251 CRC32 0xe3304ac7   Xid = 1393
COMMIT/*!*/;
 
BEGIN
/*!*/;
# at 831393
#210831 11:19:41 server id 1  end_log_pos 831508 CRC32 0x54ef1c18   Query   thread_id=55    exec_time=0 error_code=0
SET TIMESTAMP=1630379981/*!*/;
insert into test1 values(5,'jack',23,'男')
/*!*/;
# at 831508
#210831 11:19:41 server id 1  end_log_pos 831539 CRC32 0x0284ebb0   Xid = 1394
COMMIT/*!*/;
 
BEGIN
/*!*/;
# at 831681
#210831 11:20:05 server id 1  end_log_pos 831796 CRC32 0x3a5b528d   Query   thread_id=55    exec_time=0 error_code=0
SET TIMESTAMP=1630380005/*!*/;
insert into test1 values(6,'lucy',21,'女')
/*!*/;
# at 831796
#210831 11:20:05 server id 1  end_log_pos 831827 CRC32 0xe10e3da2   Xid = 1395
COMMIT/*!*/;  
復制代碼

 

 2.2.1 基於位置恢復

#僅恢復到操作 ID 為“4”之前的數據,即不恢復“5”的數據
mysqlbinlog --no-defaults --stop-position='831393' /opt/mysql-bin.00009 | mysql -uroot -p

#僅恢復“6”的數據,跳過“5”的數據恢復
mysqlbinlog --no-defaults --start-position='831681' /opt/mysql-bin.000009 | mysql -uroot -p

2.2.2 基於時間點恢復

#僅恢復到 11∶19∶41 之前的數據,即不恢復“5”的數據
mysqlbinlog --no-defaults --stop-datetime='2021-08-31 11:19:41'/opt/mysql-bin.000009 |mysql -uroot -p

#僅恢復“6”的數據,跳過“5”的數據恢復
mysqlbinlog --no-defaults--start-datetime='2021-08-31 11:20:05' /opt/mysql-bin.000009 |mysql -uroot -p

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM