目錄
前言
一、備份概述
(一)備份方式
(二)備份策略
二、物理備份及恢復
(一)備份操作
(二)恢復操作
三、邏輯備份及恢復
(一)邏輯備份
(二)邏輯恢復
(三)mysqldump局限性
四、環境準備
(一)軟件介紹?編輯
(二)安裝軟件
六、增量備份與恢復
(一)增量備份
首次完全備份
增量備份
(二)增量恢復
準備全量備份?
合并增量備份
恢復數據
七、差異備份與恢復
(一)差異備份
首次完全備份
差異備份
(二)差異恢復
準備全量備份
合并差異備份
恢復數據
八、數據實時備份與恢復
(一)binlog日志管理
日志介紹
啟用bin-log
創建新日志文件
?日志文件常用管理命令
(二)備份數據
備份單個庫
備份所有庫
(三)恢復數據
恢復所有數據
恢復部分數據
(四)注意事項
前言
- 如果有需要了解MySQL的基礎使用,如查詢和表管理的可以參考MySQL技術筆記-從基礎配置到高級查詢的全棧實戰指南、MySQL技術筆記-表結構設計與管理的完整指南
一、備份概述
(一)備份方式
- 按照數據庫服務狀態分類
類型 | 說明 | 優點 | 缺點 |
---|---|---|---|
冷備份 | 在數據庫服務停止狀態下進行備份,直接復制數據文件 | 數據一致性強,備份過程簡單 | 服務中斷,影響業務連續性 |
熱備份 | 在數據庫服務運行狀態下進行備份,無需停機 | 不影響業務運行,適合高可用場景 | 數據可能存在短暫不一致,備份復雜度較高 |
溫備份 | 在數據庫運行狀態下進行的備份操作,但備份過程中會短暫阻塞數據庫的寫操作,以保證數據一致性(mysqldump) | 無需停止數據庫服務,通過短暫阻塞寫操作,確保備份數據的一致性,適用于數據一致性要求較高、寫入壓力適中的業務系統 | 寫入壓力較大的業務可能因阻塞而產生延遲 |
- 按照備份的數據分類
類型 | 說明 | 優點 | 缺點 |
---|---|---|---|
物理備份 | 直接復制數據庫的物理文件(如?.ibd 、.frm ?文件) | 恢復速度快,適合大數據量 | 跨平臺兼容性差,備份文件體積大 |
邏輯備份 | 導出數據庫中的數據為 SQL 腳本(如?mysqldump ) | 跨平臺兼容性好,適合數據遷移 | 備份和恢復速度較慢,依賴 SQL 解析 |
(二)備份策略
- 備份系統的三要素
要素 | 全稱 | 含義 | 說明 |
---|---|---|---|
BW | Backup Window(備份窗口) | 在一個工作周期內,系統可用于執行備份操作的時間范圍 | 備份窗口越短,對業務影響越小 |
RPO | Recovery Point Objective(恢復點目標) | 在發生故障時,企業可接受的最大數據丟失量 | RPO 越小,數據丟失越少 |
RTO | Recovery Time Objective(恢復時間目標) | 在發生故障時,企業可接受的最長系統恢復時間 | RTO 越短,業務中斷時間越短 |
- 災備系統建設國際標準(SHARE 78)
級別 | 描述 | 恢復能力 | 適用場景 |
---|---|---|---|
0 | 無備份,無恢復能力 | 無法恢復 | 不建議 |
1 | 本地磁帶備份 | 恢復時間長 | 小型企業 |
2 | 遠程磁帶備份 | 恢復時間較短 | 中型企業 |
3 | 遠程磁盤備份 | 恢復時間更短 | 大型企業 |
4 | 遠程熱備中心 | 快速恢復 | 高可用需求 |
5 | 實時數據復制 | 數據幾乎無丟失 | 金融、電商等關鍵業務 |
6 | 實時復制 + 完整IT基礎設施 | 快速切換 | 數據中心級容災 |
7 | 實時復制 + 完整IT基礎設施 + 應用 | 零中斷 | 最高級別容災 |
二、物理備份及恢復
(一)備份操作
- 使用
cp
命令備份cp -r /var/lib/mysql /備份目錄/mysql.bak
- 使用
tar
命令備份tar -zcf /root/mysql.tar.gz /var/lib/mysql/*
(二)恢復操作
- 使用
cp
命令恢復cp -r 備份目錄/mysql.bak /var/lib/mysql/
- 使用
tar
命令恢復tar -zxf /root/mysql.tar.gz -C /var/lib/mysql/
- 修改文件所有權
chown -R mysql:mysql /var/lib/mysql # 確保MySQL對目錄和目錄下的文件有讀權限
三、邏輯備份及恢復
(一)邏輯備份
- 備份操作
mysqldump -uroot -p密碼 庫名 > /目錄/xxx.sql
- 庫名表示方式:
庫名 表名列表
:備份1張表或多張表所有數據。-B 庫名列表
:備份1個庫或多個庫所有數據。--all-databases
或-A
:備份1臺服務器所有數據。
- 示例:
mysqldump -uroot -ptest -A > /bakdir/all_backup.sql
(二)邏輯恢復
- 恢復操作
mysql -uroot -p密碼 [庫名] < /目錄/名.sql
- 示例:
mysqldump -uroot -pa test users > /test_users.sql mysqldump -uroot -pa -B test > /test.sql mysql -uroot -pa test < /test_users.sql mysql -uroot -pa < /test.sql
- 注意:
- 恢復庫時庫名可以省略。
- 備份和恢復時,數據庫服務必須是運行狀態。
- 覆蓋恢復數據時需謹慎操作,確保數據安全。
(三)mysqldump局限性
- 物理備份缺點:
- 跨平臺性差。
- 備份時間長、冗余備份、浪費存儲空間。
- ?物理備份通常只能恢復整個數據庫實例,無法單獨恢復某個庫或表,靈活性不如邏輯備份。
- mysqldump備份缺點:
- ?恢復效率低,導入大數據量時耗時較長?。
- 備份速度較慢,尤其在大數據量場景下性能不佳??。
- 鎖表,備份過程中數據插入和更新操作被阻塞。
- ?不支持增量備份,僅支持全量邏輯備份?。
- 對于大規模數據庫,備份文件體積較大,占用存儲資源?。
- ?備份過程中可能對數據庫性能產生影響?。
四、環境準備
(一)軟件介紹
- Percona XtraBackup:一款強大的在線熱備份工具,備份過程中不鎖庫表,適合生產環境。由專業組織Percona提供(改進MySQL分支)。
(二)安裝軟件
- 安裝依賴
yum -y install perl-DBD-MySQL
- 解壓軟件
tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12 /usr/local/percona
- 配置環境變量
echo 'export PATH=/usr/local/percona/bin:$PATH' >> /etc/bashrc source /etc/bashrc
五、增量備份與恢復
(一)增量備份
首次完全備份
xtrabackup --host=127.0.0.1 --user=用戶名 --password=密碼 --backup --target-dir=備份目錄 --datadir=數據庫目錄
#完全備份就是每次進行備份都只執行該操作
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/basement --datadir=/var/lib/mysql
增量備份
xtrabackup --host=127.0.0.1 --user=用戶名 --password=密碼 --backup --target-dir=備份目錄 --incremental-basedir=參考目錄 --datadir=數據庫目錄
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/inc1 --incremental-basedir=/basement --datadir=/var/lib/mysql
(二)增量恢復
準備全量備份?
xtrabackup --prepare --apply-log-only --target-dir=/完全備份目錄
#--apply-log-only 參數,確保未提交的事務不被回滾,以便后續合并增量備份。
- 示例:
xtrabackup --prepare --apply-log-only --target-dir=/basement
合并增量備份
xtrabackup --prepare --apply-log-only \
--target-dir=/完全備份目錄 \
--incremental-dir=/增量備份目錄
#將增量備份的數據合并到全量備份目錄中,確保數據一致性。
#如果有多個增量備份需要將每個增量備份按照先后順序和完全備份進行合并
- 示例:
xtrabackup --prepare --apply-log-only \
--target-dir=/basement \
--incremental-dir=/inc1
恢復數據
xtrabackup --copy-back --target-dir=/完全備份目錄
#--copy-back 將準備好的備份數據復制回 MySQL 的數據目錄。
- 示例:
xtrabackup --copy-back --target-dir=/basement
- 注意事項:
- 執行恢復前,務必清空 MySQL 數據目錄(如
/var/lib/mysql
),避免數據沖突。 - 恢復完成后,需修改數據目錄權限為
mysql:mysql
,并重啟 MySQL 服務。chown -R mysql:mysql /var/lib/mysql systemctl restart mysqld
- 執行恢復前,務必清空 MySQL 數據目錄(如
六、差異備份與恢復
(一)差異備份
首次完全備份
xtrabackup --host=127.0.0.1 --user=用戶名 --password=密碼 --backup --target-dir=/備份目錄 --datadir=/數據庫目錄
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/fullbackup --datadir=/var/lib/mysql
差異備份
xtrabackup --host=127.0.0.1 --user=用戶名 --password=密碼 --backup --target-dir=/備份目錄 --incremental-basedir=/完全備份目錄 --datadir=/數據庫目錄
#每次差異備份都是以上次全量或差異備份為基礎
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/diff_1 --incremental-basedir=/fullbackup --datadir=/var/lib/mysql
(二)差異恢復
準備全量備份
xtrabackup --prepare --apply-log-only --target-dir=/完全備份目錄
- 示例:
xtrabackup --prepare --apply-log-only --target-dir=/fullbackup
合并差異備份
xtrabackup --prepare --apply-log-only --target-dir=/完全備份目錄 --incremental-dir=/最后一次差異備份
#只要和最后一次差異備份合并即可,因為最后一次差異備份包括之前所有差異備份的數據
- 示例:
xtrabackup --prepare --apply-log-only \ --target-dir=/fullbackup \ --incremental-dir=/diff_1
恢復數據
xtrabackup --copy-back --target-dir=/完全備份目錄
- 示例:
xtrabackup --copy-back --target-dir=/fullbackup
- 注意事項:
- 執行恢復前,務必清空 MySQL 數據目錄(如
/var/lib/mysql
),避免數據沖突。 - 恢復完成后,需修改數據目錄權限為
mysql:mysql
,并重啟 MySQL 服務。chown -R mysql:mysql /var/lib/mysql systemctl restart mysqld
- 執行恢復前,務必清空 MySQL 數據目錄(如
七、數據實時備份與恢復
(一)binlog日志管理
日志介紹
- 什么是binlog日志:
- 又稱“二進制日志”,是MySQL服務生成的日志文件之一。
- 記錄除查詢語句(SELECT、SHOW等)以外的所有SQL命令,包括INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
- 主要用于數據恢復、數據復制以及主從同步。
- 啟用binlog是實現MySQL主從復制的必要條件。
啟用bin-log
- 日志默認啟用:日志默認存儲在
/var/lib/mysql/
目錄下。 - 自定義日志
- 示例:
mkdir /mylog # 創建目錄 vim /etc/my.cnf.d/mysql-server.cnf #修改配置 #添加 [mysqld] log-bin=/mylog/mysql-binchown mysql:mysql /mylog # 修改目錄的所有者為mysql setenforce 0 # 關閉selinux systemctl restart mysqld # 重啟服務
創建新日志文件
- 默認容量:Binlog日志文件默認1G容量,超出后會自動創建新日志。
- 手動創建:
FLUSH LOGS; 或者 systemctl restart mysqld
?日志文件常用管理命令
- 查看正在使用的日志
SHOW MASTER STATUS;
- 查看已有的日志文件
SHOW BINARY LOGS;
- 刪除編號之前的日志
PURGE MASTER LOGS TO "日志名";
- 示例:
PURGE MASTER LOGS TO "mysql-bin.000004";
- 刪除所有日志,重新創建日志
RESET MASTER;
- 查看日志文件內容
SHOW BINLOG EVENTS IN "日志文件名";
- ?示例:
SHOW BINLOG EVENTS IN "mysql-000004";
(二)備份數據
備份單個庫
mysqldump -uroot -p密碼 --flush-logs -B test > /single.sql
備份所有庫
mysqldump -uroot -p密碼 --flush-logs -A > /all.sql
(三)恢復數據
恢復所有數據
mysqlbinlog /目錄/文件名 | mysql -uroot -p密碼 #查看文件全部內容并通過管道導入數據庫中
- 示例:
mysqlbinlog /mylog/mysql-bin.000001 | mysql -uroot -ptest
恢復部分數據
mysqlbinlog --start-datetime="開始時間" --stop-datetime="結束時間" /目錄/文件名 | mysql -uroot -p密碼
- 示例:
mysqlbinlog --start-datetime="2025-06-01 00:00:00" --stop-datetime="2025-07-10 23:59:59" /mylog/mysql-bin.000001 | mysql -uroot -ptest
(四)注意事項
- 備份時:
- 確保備份目錄有足夠的空間。
- 定期檢查備份文件的完整性和可用性。
- 恢復時:
- 確保恢復操作不會影響生產環境。
- 在恢復前備份當前數據庫狀態,以防恢復失敗。
- 確保恢復后的數據一致性。