目錄
一. MySQL的日志
1.1 日志的作用
1.2 日志的分類
1.3 事務日志
1.4 錯誤日志
1.5 通用日志
1.6 慢查詢日志?
1.7 二進制備份
二. 備份
2.1 數據備份的重要性
2.2 備份的分類
2.3 MySQL備份的內容
2.4 備份的注意點
2.5 備份的工具
2.6 實戰案例
2.7?mysqldump備份工具
1. 備份表
2. 備份數據庫
3. 備份所有
4. 實戰案例
2.8?xtrabackup工具
1. 安裝
2. 完全備份
3. 增量備份
一. MySQL的日志
1.1 日志的作用
- 故障排查:通過日志可以追蹤數據庫操作中的錯誤和異常,幫助快速定位問題。
- 性能優化:分析日志可以了解數據庫的性能瓶頸,從而進行優化。
- 數據恢復:某些日志類型(如二進制日志)可以用于數據恢復,特別是在數據丟失或損壞的情況下。
1.2 日志的分類
-
錯誤日志(Error Log):
- 描述:記錄 MySQL 服務器啟動、運行和停止過程中的錯誤信息。
- 用途:主要用于故障排查和錯誤監控。
-
查詢日志(General Query Log):
- 描述:記錄所有客戶端發送到 MySQL 服務器的 SQL 查詢語句。
- 用途:用于審計和性能分析。
-
慢查詢日志(Slow Query Log):
- 描述:記錄執行時間超過指定閾值的查詢語句。
- 用途:用于識別和優化執行效率低下的查詢。
-
二進制日志(Binary Log):
- 描述:記錄所有對數據庫進行更改的 SQL 語句(如 INSERT、UPDATE、DELETE)。
- 用途:用于數據恢復和主從復制。
-
中繼日志(Relay Log):
- 描述:在主從復制中,從服務器記錄從主服務器接收到的二進制日志事件。
- 用途:用于主從復制的數據同步。
-
事務日志(Transaction Log):
- 描述:記錄事務的開始、提交和回滾操作。
- 用途:用于確保事務的原子性和持久性
- 文件名: ib_logfile0, ib_logfile1
1.3 事務日志
事務日志相關的操作
show variables like '%innodb_log%'; #查看事務日志常見返回參數:
innodb_log_file_size:單個日志文件的大小。
innodb_log_files_in_group:日志文件組的數量。
innodb_log_buffer_size:日志緩沖區的大小。
innodb_log_compressed_pages:是否啟用日志頁壓縮。
#通過編輯配置文件調整日志大小
vim /etc/my.cnf[mysqld]
innodb_log_file_size=503316480
innodb_log_files_in_group=3
事務日志的優化
innodb_flush_log_at_trx_commit,用于控制事務提交時重做日志的刷新策略select @@innodb_flush_log_at_trx_commit;
#用于查詢當前該參數的設置值。innodb_flush_log_at_trx_commit=0|1|2#=0:事務提交時,日志不會立即寫入磁盤,而是每秒刷新一次。這種設置性能最高,但存在數據丟失的風險(如系統崩潰時)。
#=1:事務提交時,日志會立即寫入磁盤。這種設置最安全,但性能較低。
#=2:事務提交時,日志會寫入操作系統的緩存,但不會立即刷新到磁盤。這種設置介于性能和安全性之間。
事務是操作的集合, 事務提交, 意味著你要把這些操作結果保存到硬盤上。?
1.4 錯誤日志
#查看錯誤日志的路徑
SHOW GLOBAL VARIABLES LIKE 'log_error' ;
#指定錯誤日志的存放位置
vim /etc/my.cnf
[mysqld]
log_error=/data/log_error/mysql-error.logsystemctl restart mysqld
#如何查看錯誤日志SHOW VARIABLES LIKE 'log_error';
#看錯誤日志文件路徑tail -f 錯誤日志路徑;
1.5 通用日志
通用日志:記錄對數據庫的通用操作,包括:錯誤的SQL語句
#配置通用日志
vim /etc/my.cnf
[mysqld]
general_log=ON
#log_output=TABLEsystemctl restart mysqldcd /var/lib/mysqlls#查看日志
tail -f ubuntu2204.log
?
?
?
將通用日志放入數據庫中
vim /etc/my.cnflog_output=TABLEsystemctl restart mysql
?
mysql -u rootuse mysql;show tables;生成一張general_log表select * from mysql.general_log\G
?
還會生成general_log.CSV
1.6 慢查詢日志?
慢查詢日志:記錄執行查詢時長超出指定時長的操作
#開啟慢查詢
vim /etc/my.cnf
[mysqld]
slow_query_log=ON
long_query_time=5 #慢查詢的閥值
log_queries_not_using_indexes=ON ?
#不使用索引或使用全索引掃描,不論是否達到慢查詢閥值的語句是否記錄日志,默認OFF,即不記錄mysql restart mysql
?
cd /var/lib/mysqlls
?
?
?
1.7 二進制備份
-
記錄導致數據改變或潛在導致數據改變的SQL語句
-
記錄已提交的日志
-
不依賴于存儲引擎類型
?二進制日志記錄三種格式
-
基于"語句"記錄:statement,記錄語句,默認模式( MariaDB 10.2.3 版本以下 ),日志量較少
-
基于"行"記錄:row,記錄數據,日志量較大,更加安全,建議使用的格式,MySQL8.0默認格式
-
混合模式:mixed, 讓系統自行判定該基于哪種方式進行,默認模式( MariaDB 10.2.4及版本以上)
#開啟二進制日志
mkdir - p data/binlog/
chown -R mysql:mysql /data/binlog/vim /etc/my.cnf
[mysqld]
sercer_id=100
log_bin=/data/binlog/mysql-bin
#指定存放位置systemctl restart mysqllog_bin=/data/binlog/ls
?
?
?
#查看所有二進制日志
show master logs;#查看使用中的二進制文件
show master status;#徹底清空二進制日志
reset master;
?
?
mysqlbinlog命令用于解析和查看二進制日志文件的內容,將二進制日志文件轉換為可讀的 SQL 語句或事件信息
?mysqlbinlog的備份過程
#查看日志內容
mysqlbinlog binlog.000001#過濾特定時間段/特定位置的日志
mysqlbinlog --start-datetime="2025-05-26 00:00:00" --stop-datetime="2025-05-26 23:59:59" binlog.000001
或
mysqlbinlog --start-position=12345 --stop-position=12456 binlog.000001#導出日志到文件: 將解析后的日志內容導出到文件。
mysqlbinlog binlog.000001 > output.sql#發生誤操作,進行備份
mysql -u root < output.sql
?
例子:
mysqlbinlog binlog.000001
#把binlog.000001備份下來
mysqlbinlog /data/mysql/bimlog.000001 > backup.sql#如果失誤刪除了hellodb
mysql -u root < backup.sql
?
二. 備份
2.1 數據備份的重要性
-
數據安全:防止因硬件故障、軟件錯誤或人為操作導致的數據丟失。
-
災難恢復:在發生災難性事件(如火災、洪水)時,能夠快速恢復數據。
2.2 備份的分類
-
完全備份:
- 描述:備份整個數據庫的所有數據。
- 優點:恢復簡單,只需一個備份文件。
- 缺點:占用存儲空間大,備份時間長。
-
增量備份:
- 描述:只備份自上次備份以來發生變化的數據。
- 優點:節省存儲空間,備份速度快。
- 缺點:恢復過程復雜,需要所有增量備份文件。
-
差異備份:
- 描述:備份自上次完全備份以來發生變化的數據。
- 優點:恢復過程相對簡單,只需完全備份和最新的差異備份。
- 缺點:占用存儲空間介于完全備份和增量備份之間
增量備份和差異備份又可稱部分備份
部分備份之前,需要完全備份
按照數據可用性和備份時數據庫的運行狀態來分類?
-
冷備(Cold Backup)
- 特點:數據庫完全關閉后進行備份,數據不可用。
- 優點:操作簡單,備份一致性高。
- 缺點:備份期間服務中斷。
-
溫備(Warm Backup)
- 特點:數據庫部分功能可用,備份時可能鎖定部分表或數據。
- 優點:比冷備對服務影響小,一致性較好。
- 缺點:部分功能受限,備份速度較慢。
-
熱備(Hot Backup)
- 特點:數據庫完全運行,備份時數據可用且無中斷。
- 優點:服務不受影響,備份效率高。
- 缺點:實現復雜,可能占用較多資源。
2.3 MySQL備份的內容
-
數據庫結構
- 包括表結構、索引、視圖、存儲過程等元數據信息。
- 例如:
CREATE TABLE
語句、ALTER TABLE
語句等。
-
數據內容
- 表中存儲的實際數據,即
INSERT
語句生成的內容。 - 這是備份的核心部分,確保數據丟失后可以恢復。
- 表中存儲的實際數據,即
-
事務日志(如binlog)
- 記錄數據庫的所有變更操作,用于實現增量備份和恢復。
- 例如:
UPDATE
、DELETE
等操作記錄。
-
用戶權限和配置
- 包括用戶賬戶、權限設置、數據庫配置參數等。
- 例如:
GRANT
語句、my.cnf
配置文件等。
2.4 備份的注意點
-
能容忍最多丟失多少數據
-
備份產生的負載
-
備份過程的時長
-
溫備的持鎖多久
-
恢復數據需要在多長時間內完成
-
需要備份和恢復哪些數據
2.5 備份的工具
-
cp, tar等復制歸檔工具:物理備份工具,適用所有存儲引擎;只支持冷備;完全和部分備份
-
mysqldump:邏輯備份工具,適用所有存儲引擎,對MyISAM存儲引擎進行溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份
-
xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份
-
MariaDB Backup: 從MariaDB 10.1.26開始集成,基于Percona XtraBackup 2.3.8實現
-
mysqlbackup:熱備份, MySQL Enterprise Edition 組件
-
mysqlhotcopy:PERL 語言實現,幾乎冷備,僅適用于MyISAM存儲引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫
2.6 實戰案例
實驗目標:數據庫冷備份和還原
實驗工具:cp, tar等復制歸檔工具
準備工作:
兩臺下載了同一版本MySQL的虛擬機
IP地址分別是:
Ubuntu=192.168.52.105
Ubuntu1=192.168.52.31將hellodb文件分別下載到虛擬機上,并輸入數據庫中
mysql -u root < hellodb_innodb.sql
實驗步驟:
#在Ubuntu1上模擬發送事故,誤刪除了數據庫
cd /var/lib/mysql
rm -rf *#在Ubuntu上進行冷備份操作
systemctl stop mysql
cd /var/lib/mysql
tar zcvf all.tar.gz *
scp all.tar.gz 192.168.52.31:/opt#在Ubuntu1上解壓
cd /var/lib/mysql
tar xf /opt/all.tar.gz
chown mysql:mysql /var/lib/mysql -R#在Ubuntu1上查看是否備份成功
systemctl start mysql
mysql -u root
show database;
?
2.7?mysqldump備份工具
1. 備份表
mysqldump -u root hellodb students > stu.sql
use hellodbdrop table students;
source /root/stu.sql
?
注意:因為備份表的時候不包含數據庫創建語句,需要先切換到目標數據庫。例如本實驗就需要先use hellodb.
2. 備份數據庫
mysqldump -B hellodb > hb.sqdrop database hellodb;source /root/hb.sq
?
注意:
關于 mysqldump -uroot hellodb > hb.sql 和 mysqldump -B hellodb > hb.sql 的區別mysqldump -uroot hellodb > hb.sql
僅備份 hellodb 數據庫的表結構和數據
不包含創建數據庫的語句mysqldump -B hellodb > hb.sql
備份 hellodb 數據庫的表結構和數據
包含創建數據庫的語句所以:
使用 mysqldump -uroot hellodb > hb.sql 備份:
恢復時需要先執行 create database hellodb; 和 use hellodb;
然后執行 source /root/hb.sql使用 mysqldump -B hellodb > hb.sql 備份:
直接執行source /root/hb.sql即可恢復
?以下是使用mysqldump -uroot hellodb > hb.sql 進行備份(了解)
mysqldump -uroot hellodb > hb.sqlmysql -u rootdrop database hellodb;create database hellodb;use hellodb;source /root/hb.sql
?
3. 備份所有
#有密碼
mysqldump -uroot -p 密碼 -A -F --single-transaction --master-data=1 > /opt/all.sql
#沒有密碼
mysqldump -uroot -A -F --single-transaction --master-data=1 > /opt/all.sql
注意:
使用 mysqldump
或 xtrabackup
等工具進行備份時,備份節點的時間點與真正節點的時間點可能會有微小差異。
#查看現在的操作節點
mysql -u root SHOW MASTER STATUS;
?
?可以發現,備份節點的時間點與真正節點的時間點可能會有微小差異。
?
4. 實戰案例
每天2:30做完全備份,早上10:00誤刪除了表students,10:10才發現故障,現需要將數據庫還原到10:10的狀態,且恢復被刪除的students表4
思路:
先恢復 完全備份 到2:30
把二進制日志中的 drop students 語句刪除即可
#執行全備
cd /opt
mysqldump -uroot -A -F --single-transaction --source-data=2 > /opt/all.sql#完全備份后數據更新
mysql -uroot
use hellodb
insert students (name,age,gender) values('rose',20,'f');
insert students (name,age,gender) values('jack',20,'f');#10:00誤刪除了一個students的表
drop table students;#后續其余的表繼續更新
insert teachers (name,age,gender)values('test',30,'M');
insert teachers (name,age,gender)values('test1',30,'M');#####10點10分發現進行還原
#停止數據庫訪問
systemctl stop mysql#從完全備份中,找到二進制位置
grep '\-\- CHANGE MASTER TO' /opt/all.sql#備份 完全備份后的二進制日志
mysqlbinlog --start-position=157 binlog.000005 > /opt/inc.sql#刪除 刪表的那一行
sed -n '/^DROP TABLE/p' /opt/inc.sql #先測試下
sed -i.bak '/^DROP TABLE/d' /opt/inc.sql systemctl start mysql
mysql -u root
source /opt/all.sql
source /opt/inc.sql#驗證實驗結果
show databases
use hellodb;
select * from students;
select * from teachers;
補充:一個用于備份MySQL數據庫的Shell腳本命令?
for db in `mysql -uroot -e 'show databases'|grep -Ev '^(Database|information_schema|performance_schema)$'`;do mysqldump -B $db | gzip > /backup/$db.sql.gz;donecd /backupgzip -d hellodb.sql.gz
?
2.8?xtrabackup工具
1. 安裝
#在centos安裝
yum install epel-release -yyum install percona-xtrabackup -y#在Ubuntu安裝
apt updateapt install curl -ycurl -O https://repo.percona.com/apt/percona-release_latest.generic_all.debapt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb -ypercona-release setup pxb-80apt install percona-xtrabackup-80 -y
2. 完全備份
#準備工作ubuntu和Ubuntu1都要做
#下載hellodb
mysql -u root < hellodb_innodb.sql#新建文件夾
mkdir /backup#在原主機做完全備份到/backup
xtrabackup -uroot --datadir=/var/lib/mysql --backup --target-dir=/backup/base#拷貝到目標主機
scp -r /backup/ ? 目標主機:/#在目標主機Ubuntu1上還原,讓目標主機出現誤刪除操作
drop database hellodb;#注意:恢復主機MySQL服務停止,并且數據目錄為空
systemctl stop mysql
cd /var/lib/mysql
rm -rf *#1)預準備:確保數據一致,提交完成的事務,回滾未完成的事務
xtrabackup --prepare --target-dir=/backup/base#2)復制到數據庫目錄
#注意:數據庫目錄必須為空,否則MySQL服務不能啟動
xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/backup/basecd /var/lib/mysql
chown -R mysql:mysql /var/lib/mysqlsystemctl start mysqlmysql -u root
use hellodbselect * from students;
?
?
?
?
?
3. 增量備份
#在需要恢復的主機Ubuntu1上
drop database hellodb;systemctl stop mysql#在Ubuntu上先完備
mkdir /backup/
xtrabackup -uroot --datadir=/var/lib/mysql --backup --target-dir=/backup/base#第一次修改數據
mysql -uroot -e "insert hellodb.students (name,age,gender) values('rose',20,'f');"#第一次增量備份
xtrabackup -uroot --datadir=/var/lib/mysql --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base#第二次修改數據
mysql -uroot -e "insert hellodb.students (name,age,gender) values('tony',20,'f');"#第二次增量備份
xtrabackup -uroot --datadir=/var/lib/mysql --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1#觀察目錄文件的大小
du -sh /backup/*scp -r /backup/* 目標主機:/backup/#在Ubuntu1上
du -sh /backup/*
?
?
?
?
?
?
#在Ubuntu1上還原
#預準備完成備份,此選項--apply-log-only 阻止回滾未完成的事務
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
du -sh /backup/*#合并第1次增量備份到完全備份
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1#合并第2次增量備份到完全備份:最后一次還原不需要加選項--apply-log-only
xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
du -sh /backup/*#復制到數據庫目錄,注意數據庫目錄必須為空,MySQL服務不能啟動
cd /var/lib/mysql
rm -rf *xtrabackup --prepare --target-dir=/backup/base
#準備備份目錄
xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/backup/basechown -R mysql:mysql /var/lib/mysqlsystemctl start mysqlshow databases;use hellodb;show tables;select * from students;
?
?
?
?
?