一、MySQL 日志管理
MySQL 的日志默認保存位置為 /usr/local/mysql/data
MySQL 的日志組態檔為/etc/my.cnf ,里面有個[mysqld]項
修改組態檔:
vim /etc/my.cnf
[mysqld]
1.1錯誤日志
錯誤日志,用來記錄當MySQL啟動、停止或運行時發生的錯誤資訊,默認已開啟
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和檔案名
1.2通用查詢日志
通用查詢日志,用來記錄MySQL的所有連接和陳述句,默認是關閉的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
1.3二進制日志
二進制日志(binlog),用來記錄所有更新了資料或者已經潛在更新了資料的陳述句,記錄了資料的更改,可用于資料恢復,默認已開啟
log-bin=mysql-bin #也可以 log_bin=mysql-bin
1.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
1.5查看日志
show variables like 'general%'; #查看通用查詢日志是否開啟
show variables like 'log_bin%'; #查看二進制日志是否開啟
show variables like '%slow%'; #查看慢查詢日功能是否開啟
show variables like 'long_query_time'; #查看慢查詢時間設定
set global slow_query_log=ON; #在資料庫中設定開啟慢查詢的方法
1.6實體操作
(1)修改組態檔并重啟服務

![]()
(2)查詢日志



(3)開啟以及關閉慢查詢的方法


二、資料庫備份的重要性與分類
2.1資料備份的重要性
重要性:
- 備份的主要目的是災難恢復
- 在生產環境中,資料的安全性至關重要
- 任何資料的丟失都可能產生嚴重的后果
造成資料丟失的原因:
- 程式錯誤
- 人為操作錯誤
- 運算錯誤
- 磁盤故障
- 不可控因素
2.2從物理與邏輯的角度,備份分為
- 物理備份: 對資料庫作業系統的物理檔案(如資料檔案、日志檔案等)的備份
- 邏輯備份:對資料庫邏輯組件(如:表等資料庫物件)的備份
物理備份方法:
- 冷備份(脫機備份):是在關閉資料庫的時候進行的
- 熱備份(聯機備份):資料庫處于運行狀態,依賴于資料庫的日志檔案
- 溫備份:資料庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作
2.3從資料庫的備份策略角度,備份可分為
- 完全備份:每次對資料庫進行完整的備份
- 差異備份:備份自從上次完全備份之后被修改過的檔案
- 增量備份:只有在上次完全備份或者增量備份后被修改的檔案才會被備份
三、常見的備份方法
3.1物理冷備
- 備份時資料庫處于關閉狀態,直接打包資料庫檔案
- 備份速度快,恢復時也是最簡單的
3.2專用備份工具mydump或mysqlhotcopy
- myaqldump常用的邏輯備份工具
- mysqlhotcopy僅擁有備份MyISM和ARCHIVE表
3.3啟用二進制日志進行增量備份
- 進行增量備份,需要重繪二進制日志
3.4第三方工具備份
- 免費MySQL熱備份軟體Percona XtraBackup
四、MySQL完全備份
4.1完全備份的概念
- 是對整個資料庫,資料庫結構和檔案結構的備份
- 保存的是備份完成時刻的資料庫
- 是差異備份與增量備份的基礎
4.2優點
備份與恢復操作簡單方便
4.3缺點
- 資料存在大量的重復
- 占用大量的備份空間
- 備份與恢復時間長
4.4資料庫完全備份分類
(1)物理冷備份與恢復
- 關閉MySQL資料庫
- 使用tar命令直接打包資料庫檔案夾
- 直接替換現有MySQL目錄即可
(2)mysqldump備份與恢復
- Mysql自帶的備份工具,可方便實作對MySQL的備份
- 可以將指定的庫、表匯出為SQL腳本
- 使用命令mysql匯入備份的資料
五、MySQL增量備份
5.1使用mysqldump進行完全備份存在的問題
- 備份資料中有重復資料
- 備份時間與恢復時間過長
5.2增量備份的概念
是自上一次備份后增加/變化的檔案或者內容
5.3增量備份的特點
- 沒有重復資料,備份不大,時間短
- 恢復需要上次完全備份及完全備份之后所有的增量備份才能恢復,且要對所有增備份進行逐個反推恢復
5.4增量備份的方法
MySQL沒有提供直接的增量備份方法
可通過MySQL提供的二進制日志間接實作增量備份
5.5MySQL二進制日志對備份的意義
- 二進制日志保存了所有更新或者可能更新資料庫的操作
- 二進制日志在啟動MySQL服務器后開始記錄,并在檔案達到max_ binlog_ size所設 置的大小或者接收到flush logs命令后重新創建新的日志檔案
- 只需定時執行flush logs方法重新創建新的日志,生成二進制檔案序列,并及時把這些日志保存到安全的地方就完成了一個時間段的增量備份
5.6MySQL資料庫增量恢復
(1)一般恢復:將所有備份的二進制日志內容全部恢復
(2)基于位置恢復
- 資料庫在某一時間點可能既有錯誤的操作也有正確的操作
- 可以基于精準的位置跳過錯誤的操作
(3)基于時間點恢復:跳過某個發生錯誤的時間點實作資料恢復
六、MySQL 完全備份與恢復
InnoDB存盤引擎的資料庫在磁盤上存盤成三個檔案:
- db.opt(表屬性檔案)
- 表名.frm(表結構檔案)
- 表名.ibd(表資料檔案)
6.1物理冷備份與恢復
systemctl stop mysqld yum -y install xz cd /usr/local/mysql #壓縮備份 tar Jcvf mysql_all_$(date +%F).tar.xz ./data #解壓恢復 tar Jxvf /opt/mysql_all_2022-11-28.tar.xz
(1)備份data目錄


![]()
(2)洗掉資料庫learn,測驗備份能否恢復






6.2mysqldump 備份與恢復
(1)完全備份一個或多個完整的庫(包括其中所有的表)
mysqldump -u root -p[密碼] --databases 庫名1 [庫名2] … > /備份路徑/備份檔案名.sql #匯出的就是資料庫腳本檔案
例:
mysqldump -u root -p --databases bdqn > /opt/mysql_bak/bdqn.sql
mysqldump -u root -p --databases bdqn hs > /opt/mysql_bak/bdqn-hs.sql

(2)完全備份 MySQL 服務器中所有的庫
mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份檔案名.sql
例:
mysqldump -u root -p --all-databases > /opt/mysql_bak/all.sql

(3)完全備份指定庫中的部分表
mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] … > /備份路徑/備份檔案名.sql
- 使用“-d”選項,說明只保存資料庫的表結構
- 不使用“-d”選項,說明表資料也進行備份
例:
mysqldump -u root -p [-d] bdqn ky23 > /opt/mysql_bak/bdqn_ky23.sql

(4)查看備份檔案
grep -v "^--" /opt/mysql_bak/bdqn_ky23.sql | grep -v "^/" | grep -v "^$"

(5)開啟服務
systemctl start mysqld
![]()
(6)恢復資料庫
mysql -u root -p -e 'drop database bdqn;' #“-e”選項,用于指定連接 MySQL 后執行的命令,命令執行完后自動退出 mysql -u root -p -e 'SHOW DATABASES;' mysql -u root -p < /opt/mysql_bak/bdqn.sql mysql -u root -p -e 'SHOW DATABASES;'


(7)恢復資料表
當備份檔案中只包含表的備份,而不包含創建的庫的陳述句時,執行匯入操作時必須指定庫名,且目標庫必須存在,
mysqldump -u root -p bdqn test > /opt/mysql_bak/bdqn_test.sql mysql -u root -p -e 'drop table bdqn.test;' mysql -u root -p -e 'show tables from bdqn;' mysql -u root -p bdqn < /opt/mysql_bak/bdqn_test.sql mysql -u root -p -e 'show tables from bdqn;'


![]()

七、MySQL 增量備份與恢復
7.1MySQL 增量備份
(1)開啟二進制日志功能
vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format = MIXED 指定二進制日志(binlog)的記錄格式為 MIXED server-id = 1
systemctl restart mysqld ls -l /usr/local/mysql/data/mysql-bin.*
#二進制日志(binlog)有3種不同的記錄格式:STATEMENT(基于SQL陳述句)、ROW(基于行)、MIXED(混合模式),默認格式是STATEMENT
只要重啟服務就會生成二進制檔案


(2)可每周對資料庫或表進行完全備份
mysqldump -u root -p bbc test4 > /opt/learn_test4_$(date +%F).sql; mysqldump -u root -p --all-databases> /opt/all_$(date +%F).sql; 詳情請見上一章節
(3)可每天進行增量備份操作,生成新的二進制日志檔案
mysqladmin -u root -p flush-logs;

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

(5)再次生成新的二進制日志檔案
mysqladmin -u root -p flush-logs;

(6)查看二進制日志檔案的內容
cp /usr/local/mysql/data/mysql-bin.000009 /opt/mysql_bak mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql_bak/mysql-bin.000009


7.2MySQL 增量恢復
(1)一般恢復
- 模擬丟失更改的資料的恢復步驟
use bdqn; delete from ky23 where id=4; delete from ky23 where id=5; mysqlbinlog --no-defaults /opt/mysql_bak/mysql-bin.000010 | mysql -u root -p



(2)斷點恢復
- 模擬丟失更改的資料的恢復步驟
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000018 #查看二進制日志檔案
[root@mysql1 /opt/mysql_bak]#mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql_bak/mysql-bin.000018 #查看二進制檔案
BEGIN
/*!*/;
# at 298
#221129 15:54:37 server id 1 end_log_pos 407 CRC32 0xa4791619 Query thread_id=32 exec_time=0 error_code=0
use `bdqn`/*!*/;
SET TIMESTAMP=1669708477/*!*/;
insert into ky23 values(7,'fzr',22)
/*!*/;
# at 407
#221129 15:54:37 server id 1 end_log_pos 487 CRC32 0xf5de1e51 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708477/*!*/;
COMMIT
/*!*/;
# at 487
#221129 15:54:42 server id 1 end_log_pos 552 CRC32 0x5d396578 Anonymous_GTID last_committed=sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 552
#221129 15:54:42 server id 1 end_log_pos 631 CRC32 0xf4d5ce10 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708482/*!*/;
BEGIN
/*!*/;
# at 631
#221129 15:54:42 server id 1 end_log_pos 740 CRC32 0xe6affc26 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708482/*!*/;
insert into ky23 values(8,'fzr',22)
/*!*/;
# at 740
#221129 15:54:42 server id 1 end_log_pos 820 CRC32 0x733be338 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708482/*!*/;
COMMIT
/*!*/;
# at 820
#221129 15:55:06 server id 1 end_log_pos 885 CRC32 0xc44c88f9 Anonymous_GTID last_committed=sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 885
#221129 15:55:06 server id 1 end_log_pos 964 CRC32 0x04ee8524 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708506/*!*/;
BEGIN
/*!*/;
# at 964
#221129 15:55:06 server id 1 end_log_pos 1065 CRC32 0xfa73d44a Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708506/*!*/;
delete from ky23 where id=7
/*!*/;
# at 1065
#221129 15:55:06 server id 1 end_log_pos 1145 CRC32 0xeb3e8fe3 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708506/*!*/;
COMMIT
/*!*/;
# at 1145
#221129 15:55:09 server id 1 end_log_pos 1210 CRC32 0x3c812099 Anonymous_GTID last_committed=3 sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1210
#221129 15:55:09 server id 1 end_log_pos 1289 CRC32 0xaf1dbe83 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708509/*!*/;
BEGIN
/*!*/;
# at 1289
#221129 15:55:09 server id 1 end_log_pos 1390 CRC32 0x4e967220 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708509/*!*/;
delete from ky23 where id=8
/*!*/;
# at 1390
#221129 15:55:09 server id 1 end_log_pos 1470 CRC32 0x5ee86eda Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1669708509/*!*/;
COMMIT
/*!*/;
# at 1470
#221129 15:55:31 server id 1 end_log_pos 1517 CRC32 0x856771a7 Rotate to mysql-bin.000019 pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


(1)基于位置恢復
#僅恢復到操作 ID 為“7”之前的資料,即不恢復“8”的資料 mysqlbinlog --no-defaults --stop-position='487' mysql-bin.000018 | mysql -uroot -p


![]()
![]()

#都恢復7、8資料恢復 mysqlbinlog --no-defaults --start-position='820' /opt/mysql-bin.000018 | mysql -uroot -p
![]()

補充:mysqlbinlog --no-defaults --start-position='886' /opt/mysql-bin.0000018 | mysql -uroot -p
(2)基于時間點恢復
#僅恢復到 15:54:42 之前的資料,即不恢復“3”的資料 mysqlbinlog --no-defaults --stop-datetime='2022-11-29 15:54:42' mysql-bin.000018 |mysql -uroot -p
![]()

補充:mysqlbinlog --no-defaults --start-datetime='2022-11-29 15:55:31' mysql-bin.000018 |mysql -uroot -p
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538728.html
標籤:其他
