最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql數(shù)據(jù)庫(kù)備份恢復(fù)詳解

 更新時(shí)間:2026年05月27日 08:41:38   作者:huangSir-devops  
本文詳細(xì)介紹了MySQL備份與恢復(fù)技術(shù),包括邏輯備份工具mysqlogdop與mydumper,以及物理備份工具Xtrabbackup,myslogdop適用于跨版本、跨平臺(tái)場(chǎng)景,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

概述

在實(shí)際生產(chǎn)環(huán)境中,我們要定期針對(duì)數(shù)據(jù)庫(kù)做備份,避免誤操作導(dǎo)致數(shù)據(jù)丟失沒(méi)辦法恢復(fù)。
mysql備份按照原理分為兩種,分別是邏輯備份和物理備份。

邏輯備份:

  • 將數(shù)據(jù)導(dǎo)出為 SQL 語(yǔ)句
  • 優(yōu)點(diǎn):跨版本、跨平臺(tái)、可編輯、可單庫(kù)單表,所有版本通用
  • 缺點(diǎn):大數(shù)據(jù)量慢,因?yàn)槭菍⒄Z(yǔ)句導(dǎo)出為一條條sql
  • 工具:mysqldump、mydumper

物理備份

  • 直接拷貝數(shù)據(jù)文件
  • 優(yōu)點(diǎn):極快、適合 TB 級(jí)數(shù)據(jù)
  • 缺點(diǎn):同版本、同系統(tǒng)、不能單獨(dú)恢復(fù)某張表
  • 工具:xtrabackup、MySQL Clone、冷拷貝

邏輯備份之mysqldump

mysqldump 是 MySQL 官方自帶的邏輯備份工具,通過(guò)生成 SQL 腳本的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份、遷移、恢復(fù),是 MySQL 生態(tài)中最常用的備份方案之一,支持所有 MySQL 分支版本(MySQL 5.x/8.x、MariaDB、Percona Server 等)。

mysqldump 本質(zhì)是通過(guò)連接到 MySQL 服務(wù),將數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)、數(shù)據(jù)、索引、觸發(fā)器、存儲(chǔ)過(guò)程、函數(shù)、事件等對(duì)象轉(zhuǎn)換為標(biāo)準(zhǔn)的 CREATE、INSERT 等 SQL 語(yǔ)句,最終輸出為一個(gè)可直接執(zhí)行的 SQL 腳本文件。

mysqldump優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 官方原生,無(wú)需額外安裝,兼容性極強(qiáng)
  • 備份結(jié)果為純文本 SQL,可讀性高、便于編輯、跨平臺(tái)通用
  • 支持全量、部分庫(kù)/表、結(jié)構(gòu)-only、數(shù)據(jù)-only等多種備份粒度
  • 支持導(dǎo)出為CSV/XML等其他格式
  • 備份期間可控制鎖策略,盡可能降低對(duì)業(yè)務(wù)的影響

缺點(diǎn):

  • 邏輯備份,備份/恢復(fù)速度較慢(尤其是TB級(jí)以上大庫(kù))
  • 單線程備份,無(wú)法利用多核CPU(MySQL 8.0.26+ 支持并行備份 --parallel)
  • 大表備份會(huì)產(chǎn)生大量IO,影響業(yè)務(wù)性能
  • 不支持實(shí)時(shí)增量備份(需結(jié)合binlog實(shí)現(xiàn)增量)

mysqldump語(yǔ)法和基礎(chǔ)參數(shù)

基礎(chǔ)語(yǔ)法:

mysqldump [選項(xiàng)] > 備份文件.sql

通用連接參數(shù)(所有場(chǎng)景必填)

參數(shù)說(shuō)明示例
-u/--user數(shù)據(jù)庫(kù)用戶名-u root
-p/--password數(shù)據(jù)庫(kù)密碼(建議交互式輸入,避免明文在命令行泄露)-p 或 --password=123456
-h/--host數(shù)據(jù)庫(kù)地址-h 127.0.0.1
-P/--port數(shù)據(jù)庫(kù)端口-P 3306
-S/--socket本地socket文件路徑(本地連接時(shí)使用)-S /tmp/mysql.sock
--default-character-set指定導(dǎo)出字符集,避免亂碼--default-character-set=utf8mb4

備份范圍控制

用于指定備份哪些庫(kù)表

參數(shù)說(shuō)明
--all-databases/-A備份所有數(shù)據(jù)庫(kù)(包含系統(tǒng)庫(kù)mysql、information_schema等)
--databases/-B備份指定的多個(gè)數(shù)據(jù)庫(kù),會(huì)自動(dòng)生成 CREATE DATABASE 和 USE 語(yǔ)句
--ignore-database備份所有庫(kù)時(shí)排除指定庫(kù)(可多次使用排除多個(gè)庫(kù))
--tables備份指定庫(kù)下的單個(gè)/多個(gè)表(參數(shù)順序:庫(kù)名 表1 表2...)
--ignore-table備份庫(kù)時(shí)排除指定表(格式:庫(kù)名.表名,可多次使用)
--no-data/-d僅備份表結(jié)構(gòu),不備份數(shù)據(jù)
--no-create-info/-t僅備份數(shù)據(jù),不備份表結(jié)構(gòu)
--where/-w按條件過(guò)濾備份數(shù)據(jù)

默認(rèn)情況下mysqldump不會(huì)備份存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)、事件、視圖等高級(jí)對(duì)象,需要手動(dòng)開(kāi)啟:

參數(shù)說(shuō)明
--routines/-R備份存儲(chǔ)過(guò)程和函數(shù)
--triggers備份觸發(fā)器(默認(rèn)開(kāi)啟,--skip-triggers關(guān)閉)
--events/-E備份事件調(diào)度器
--default-character-set=utf8mb4必須指定,避免中文、emoji等字符亂碼

鎖與一致性控制
這是生產(chǎn)環(huán)境備份最核心的參數(shù),直接決定備份是否一致、對(duì)業(yè)務(wù)的影響大?。?/p>

參數(shù)適用引擎說(shuō)明業(yè)務(wù)影響
--lock-tables/-lMyISAM備份時(shí)鎖定所有表(只讀),保證備份一致性所有表不可寫(xiě),對(duì)業(yè)務(wù)影響極大,不建議生產(chǎn)用
--lock-all-tables/-x所有引擎全局鎖,整個(gè)實(shí)例只讀業(yè)務(wù)完全停寫(xiě),僅適用于停機(jī)維護(hù)場(chǎng)景
--single-transactionInnoDB利用InnoDB的MVCC特性,開(kāi)啟一個(gè)一致性快照事務(wù),備份期間不鎖表,不影響業(yè)務(wù)讀寫(xiě)幾乎無(wú)影響,InnoDB引擎生產(chǎn)環(huán)境首選
--master-data=2主從架構(gòu)備份結(jié)果中記錄備份時(shí)刻的binlog文件名和位置(注釋形式,值為1則不注釋),用于搭建從庫(kù)/基于binlog的增量恢復(fù)無(wú)額外影響
--flush-logs/-F所有引擎備份前刷新binlog,生成新的binlog文件,便于后續(xù)增量恢復(fù)幾乎無(wú)影響

性能優(yōu)化參數(shù)

參數(shù)效果
--quick/-q逐行讀取表數(shù)據(jù),不緩存整個(gè)表到內(nèi)存,大表備份必備,避免OOM
--max_allowed_packet=1G增大數(shù)據(jù)包限制,避免大字段/大表備份失敗
--net_buffer_length=64K增大網(wǎng)絡(luò)緩沖區(qū),提升傳輸速度
--parallel=NMySQL 8.0.26+ 支持,并行備份N個(gè)庫(kù),大幅提升備份速度

mysqldump備份實(shí)戰(zhàn)

  • 備份所有的庫(kù)
# -u指定用戶
# -p指定密碼
# -A代表所有的庫(kù)
# --single-transaction在備份期間,生成備份數(shù)據(jù)要保證一致性(新版數(shù)據(jù)庫(kù) 利用快照技術(shù) 舊版數(shù)據(jù)庫(kù) 利用鎖庫(kù)方式)
# --master-data=2--master-data=2
mysqldump -uroot -proot -A --single-transaction --master-data=2 >/tmp/test.sql
  • 備份單個(gè)庫(kù)
# -u指定用戶
# -p指定密碼
# -B備份指定的多個(gè)數(shù)據(jù)庫(kù),會(huì)自動(dòng)生成 CREATE DATABASE 和 USE 語(yǔ)句
# --single-transaction在備份期間,生成備份數(shù)據(jù)要保證一致性(新版數(shù)據(jù)庫(kù) 利用快照技術(shù) 舊版數(shù)據(jù)庫(kù) 利用鎖庫(kù)方式)
# --master-data=2--master-data=2
mysqldump -u root -proot -B test_db --single-transaction --master-data=2 > test_db.sql
  • 備份指定的表
# -u指定用戶
# -p指定密碼
# -B備份指定的多個(gè)數(shù)據(jù)庫(kù),會(huì)自動(dòng)生成 CREATE DATABASE 和 USE 語(yǔ)句
# --single-transaction在備份期間,生成備份數(shù)據(jù)要保證一致性(新版數(shù)據(jù)庫(kù) 利用快照技術(shù) 舊版數(shù)據(jù)庫(kù) 利用鎖庫(kù)方式)
# --master-data=2--master-data=2
mysqldump -u root -proot test_db user --single-transaction --master-data=2 > test_db_user.sql
  • 只備份結(jié)構(gòu),不備份數(shù)據(jù)
# -d僅備份表結(jié)構(gòu),不備份數(shù)據(jù)
mysqldump -u root -p -d test_db > test_db_schema.sql

mysqldump恢復(fù)實(shí)戰(zhàn)

方式一:

# 恢復(fù)全庫(kù)
mysql -u root -p < all_db_20250101.sql
# 恢復(fù)單庫(kù)(必須先創(chuàng)建庫(kù))
mysql -u root -p -e "CREATE DATABASE test_db;"
mysql -u root -p test_db < test_db.sql

方式二:

# 進(jìn)入數(shù)據(jù)庫(kù)中執(zhí)行
mysql> source /tmp/all.sql

邏輯備份之mydumper

mydumper 是一款開(kāi)源的 多線程高性能 MySQL/MariaDB/Percona Server 邏輯備份工具,由 MySQL 社區(qū)開(kāi)發(fā),是 mysqldump 的首選替代方案,備份速度比原生 mysqldump 快 3~10 倍,是中大型數(shù)據(jù)庫(kù)邏輯備份場(chǎng)景的工業(yè)標(biāo)準(zhǔn)工具。

mydumper優(yōu)勢(shì)和原理

優(yōu)勢(shì):

  • 多線程并行備份:充分利用多核CPU資源,備份速度遠(yuǎn)快于單線程的mysqldump
  • 一致的備份快照:所有線程備份的是同一時(shí)間點(diǎn)的數(shù)據(jù),保證備份一致性,支持InnoDB無(wú)鎖備份
  • 內(nèi)置壓縮:備份時(shí)直接壓縮,無(wú)需管道拼接,節(jié)省磁盤(pán)空間
  • 分表存儲(chǔ):每個(gè)表的結(jié)構(gòu)和數(shù)據(jù)單獨(dú)存儲(chǔ)為文件,方便單表/部分表恢復(fù),無(wú)需解析整個(gè)大備份文件
  • 備份進(jìn)度監(jiān)控:實(shí)時(shí)顯示備份進(jìn)度、已備份行數(shù)、速度等信息
  • 內(nèi)置限速:支持限制備份IO速度,避免備份占滿磁盤(pán)帶寬影響業(yè)務(wù)
  • 開(kāi)源免費(fèi):活躍維護(hù),支持所有主流MySQL分支版本
  • 配套恢復(fù)工具 myloader:多線程并行恢復(fù),恢復(fù)速度比mysql命令快5~20倍

原理:

  • 主線程連接到MySQL,開(kāi)啟一致性快照事務(wù)(InnoDB),獲取全局讀鎖(FTWRL)保證非InnoDB表備份一致性
  • 記錄當(dāng)前binlog文件名和位點(diǎn),用于搭建從庫(kù)/增量恢復(fù)
  • 啟動(dòng)N個(gè)工作線程,每個(gè)線程負(fù)責(zé)備份部分表,并行執(zhí)行備份任務(wù)
  • 備份完成后釋放全局鎖,生成備份元數(shù)據(jù)文件
  • 每個(gè)表的結(jié)構(gòu)導(dǎo)出為dbname.tablename-schema.sql,數(shù)據(jù)導(dǎo)出為dbname.tablename.sql(可自動(dòng)壓縮為.gz格式)

mydumper安裝方式

下載地址:https://github.com/mydumper/mydumper/releases

## centos
# CentOS/RHEL 7/8/9
yum update -y && yum install mydumper -y
# Debian/Ubuntu
apt update -y && apt install mydumper -y

驗(yàn)證一下

root@master:~# mydumper --version
mydumper 0.9.5, built against MySQL 10.3.22

mydumper核心參數(shù)詳解

分類參數(shù)說(shuō)明
連接參數(shù)-u/--user數(shù)據(jù)庫(kù)用戶名
-p/--password數(shù)據(jù)庫(kù)密碼
-h/--host數(shù)據(jù)庫(kù)地址
-P/--port數(shù)據(jù)庫(kù)端口
-S/--socket本地 socket 文件路徑
--default-character-set導(dǎo)出字符集,默認(rèn) utf8,建議指定 utf8mb4
備份范圍-B/--database備份指定數(shù)據(jù)庫(kù)(可多次使用指定多個(gè)庫(kù))
-T/--tables-list備份指定表,格式:db1.table1,db2.table2
--ignore-database排除指定數(shù)據(jù)庫(kù)
--ignore-table排除指定表,格式:db1.table1
--no-schemas/-m僅備份數(shù)據(jù),不備份表結(jié)構(gòu)
--no-data/-d僅備份表結(jié)構(gòu),不備份數(shù)據(jù)
--where/-w按條件過(guò)濾備份數(shù)據(jù),例如:--where="create_time>'2026-01-01'"
性能控制-t/--threads備份線程數(shù),默認(rèn) 4,建議設(shè)置為 CPU 核心數(shù)的 1~1.5 倍
-c/--compress開(kāi)啟備份文件壓縮(gzip 格式),大幅節(jié)省磁盤(pán)空間
--compress-threads壓縮線程數(shù),默認(rèn)等于備份線程數(shù)
-r/--rows大表分塊備份,每 N 行拆分為一個(gè)文件,避免單文件過(guò)大
--limit-io限制 IO 速度,單位 MB/s,避免備份占滿帶寬影響業(yè)務(wù)
一致性控制--no-locks/-k不獲取全局鎖,僅適用于所有表都是 InnoDB 且不需要一致性的場(chǎng)景
--single-transactionInnoDB 引擎無(wú)鎖一致性備份,和 mysqldump 參數(shù)效果一致,生產(chǎn)環(huán)境必備
--lock-all-tables/-x全局鎖所有表,僅 MyISAM 引擎場(chǎng)景使用
輸出控制-o/--outputdir備份文件輸出目錄,必須指定,mydumper 會(huì)自動(dòng)創(chuàng)建目錄
-F/--flush-logs備份前刷新 binlog,便于增量恢復(fù)
--binlog-position/-M備份元數(shù)據(jù)中記錄 binlog 文件名和位點(diǎn),默認(rèn)開(kāi)啟
--triggers備份觸發(fā)器,默認(rèn)開(kāi)啟
--routines/-R備份存儲(chǔ)過(guò)程和函數(shù)
--events/-E備份事件調(diào)度器
--hex-blob將 BLOB 類型以十六進(jìn)制導(dǎo)出,避免數(shù)據(jù)損壞
其他--verbose/-v日志級(jí)別:0=靜默,1=錯(cuò)誤,2=警告,3=信息,4=調(diào)試,默認(rèn) 3
--logfile備份日志輸出到指定文件

mydumper備份實(shí)戰(zhàn)

  • 備份所有的庫(kù)
mydumper \
-u root \
-p '你的密碼' \
-h 127.0.0.1 \
-P 3306 \
--single-transaction \
--default-character-set=utf8mb4 \
-R -E \
--hex-blob \
-c \
-t 8 \
-r 100000 \
-o /data/backup/mysql_full_$(date +%Y%m%d_%H%M%S)
  • 備份指定的庫(kù)
# 備份db1和db2兩個(gè)庫(kù)
mydumper -u root -p -B db1 -B db2 -c -t 4 -o /data00/backup/db1_db2
  • 備份指定的表
# 備份db1庫(kù)的user表和order表
mydumper -u root -p -B db1 -T user,order -c -o /data/backup/db1_user_order
  • 限速備份
# 限制IO速度不超過(guò)50MB/s,避免影響業(yè)務(wù)
mydumper -u root -p --single-transaction -c -t 4 --limit-io 50 -o /data/backup/full

備份文件結(jié)構(gòu)說(shuō)明

mydumper 備份完成后會(huì)在輸出目錄生成以下文件:

backup_dir/
├── metadata # 備份元數(shù)據(jù):備份時(shí)間、binlog位點(diǎn)、備份參數(shù)等核心信息
├── db1/
│ ├── db1.create.sql # 庫(kù)創(chuàng)建SQL
│ ├── user-schema.sql # user表結(jié)構(gòu)SQL
│ ├── user.sql.gz # user表數(shù)據(jù)SQL(壓縮后)
│ ├── order-schema.sql # order表結(jié)構(gòu)SQL
│ ├── order.00001.sql.gz # order表分塊備份第1塊
│ ├── order.00002.sql.gz # order表分塊備份第2塊
│ └── ...
├── db2/
│ └── ...
└── logs/
└── mydumper.log # 備份日志

metadata文件示例

Started dump at: 2026-05-26 10:00:00
SHOW MASTER STATUS:
Log: mysql-bin.000123
Pos: 456789
GTID: 0-1-123456
Finished dump at: 2026-05-26 10:15:23

mydumper恢復(fù)實(shí)戰(zhàn)

mydumper 配套的多線程恢復(fù)工具是myloader,支持并行恢復(fù),速度比原生mysql命令快5~20倍。

myloader核心參數(shù):

參數(shù)說(shuō)明
-u/--user數(shù)據(jù)庫(kù)用戶名
-p/--password數(shù)據(jù)庫(kù)密碼
-h/--host數(shù)據(jù)庫(kù)地址
-P/--port數(shù)據(jù)庫(kù)端口
-d/--directory備份文件目錄,必須指定
-B/--database恢復(fù)到指定庫(kù)(可以把原庫(kù)恢復(fù)到一個(gè)新庫(kù)名)
-o/--overwrite-tables如果表存在則刪除重建,默認(rèn)會(huì)報(bào)錯(cuò)
-t/--threads恢復(fù)線程數(shù),建議設(shè)置為CPU核心數(shù)的2倍
--no-schemas不恢復(fù)表結(jié)構(gòu),僅恢復(fù)數(shù)據(jù)
--no-data僅恢復(fù)表結(jié)構(gòu),不恢復(fù)數(shù)據(jù)
--disable-keys恢復(fù)數(shù)據(jù)時(shí)禁用索引,恢復(fù)完成后重建,大幅提升恢復(fù)速度
--enable-binlog恢復(fù)時(shí)開(kāi)啟binlog,默認(rèn)關(guān)閉(恢復(fù)到主庫(kù)需要開(kāi)啟,恢復(fù)到從庫(kù)建議關(guān)閉)
-v/--verbose日志級(jí)別
  • 全量恢復(fù)
myloader \
-u root \
-p '你的密碼' \
-h 127.0.0.1 \
-P 3306 \
-d /data/backup/mysql_full_20260526_100000 \
-t 16 \
--overwrite-tables \
--disable-keys
  • 恢復(fù)指定的庫(kù)
# 將備份中的db1庫(kù)恢復(fù)到新庫(kù)db1_new
myloader -u root -p -d /data/backup/full -B db1 -o new_db1 -t 8
  • 恢復(fù)指定的表
# 僅恢復(fù)db1.user表
myloader -u root -p -d /data/backup/full -B db1 -T user -t 4
  • 僅恢復(fù)數(shù)據(jù)(表結(jié)構(gòu)已存在)
myloader -u root -p -d /data/backup/full --no-schemas -t 16

mydumper生產(chǎn)最佳實(shí)踐

生產(chǎn)環(huán)境備份規(guī)范

  • 線程數(shù)配置:備份線程數(shù)建議為CPU核心數(shù)的1~1.5倍,恢復(fù)線程數(shù)建議為CPU核心數(shù)的2倍
  • 分塊備份:大表開(kāi)啟-r 100000參數(shù),按10萬(wàn)行分塊,便于恢復(fù)時(shí)并行處理,也避免單文件過(guò)大
  • 壓縮開(kāi)啟:生產(chǎn)環(huán)境必須開(kāi)啟-c壓縮,節(jié)省70%以上的磁盤(pán)空間,壓縮開(kāi)銷(xiāo)很小
  • 從庫(kù)備份:優(yōu)先在從庫(kù)執(zhí)行備份,避免占用主庫(kù)CPU/IO資源,完全不影響業(yè)務(wù)
  • 備份驗(yàn)證:每次備份后必須嘗試恢復(fù)至少1個(gè)表,驗(yàn)證備份文件有效性
  • 異地存儲(chǔ):備份文件必須同步到異地存儲(chǔ),避免單機(jī)房故障丟失
  • 限速策略:業(yè)務(wù)高峰時(shí)段備份必須開(kāi)啟--limit-io參數(shù),限制IO帶寬

性能優(yōu)化技巧

備份優(yōu)化

  • 使用SSD存儲(chǔ)備份,速度比機(jī)械盤(pán)快3~5倍
  • 開(kāi)啟大頁(yè)、調(diào)整系統(tǒng)IO調(diào)度算法為deadline/noop
  • 備份時(shí)關(guān)閉MySQL的慢查詢、general log等不必要的日志

恢復(fù)優(yōu)化

  • 恢復(fù)前調(diào)整MySQL參數(shù):innodb_flush_log_at_trx_commit=0、innodb_doublewrite=0(恢復(fù)完成后改回原值)
  • 開(kāi)啟--disable-keys參數(shù),數(shù)據(jù)恢復(fù)完成后再建索引
  • 大庫(kù)恢復(fù)前臨時(shí)關(guān)閉binlog(set sql_log_bin=0)

增量備份方案

和mysqldump類似,mydumper是全量備份工具,增量備份需要結(jié)合binlog實(shí)現(xiàn):

  • 每日/每周執(zhí)行mydumper全量備份
  • 實(shí)時(shí)同步binlog到異地存儲(chǔ)
  • 恢復(fù)時(shí)先恢復(fù)最近一次全量備份,再重放備份時(shí)間點(diǎn)之后的binlog,實(shí)現(xiàn)任意時(shí)間點(diǎn)恢復(fù)

物理備份之Xtrabackup

XtraBackup 是 Percona 公司開(kāi)發(fā)的 開(kāi)源 MySQL 物理熱備份工具,是目前生產(chǎn)環(huán)境 MySQL 物理備份的事實(shí)標(biāo)準(zhǔn),支持 MySQL、Percona Server、MariaDB 所有主流版本,備份和恢復(fù)速度是邏輯備份工具的 5~20 倍,完全不影響業(yè)務(wù)讀寫(xiě),是 TB 級(jí)大庫(kù)生產(chǎn)環(huán)境備份的首選方案。

為什么選擇 XtraBackup?

  • 真正的熱備:InnoDB 引擎?zhèn)浞萜陂g完全不鎖表、不中斷業(yè)務(wù)讀寫(xiě),對(duì)業(yè)務(wù)零影響
  • 物理備份:直接拷貝數(shù)據(jù)文件,速度極快(TB級(jí)庫(kù)備份僅需數(shù)十分鐘)
  • 增量備份:支持基于上一次備份的增量備份,僅備份變化的數(shù)據(jù),大幅節(jié)省備份時(shí)間和空間
  • 壓縮與加密:內(nèi)置壓縮、加密功能,備份文件大小僅為原數(shù)據(jù)的 20%~30%
  • 流備份:支持直接備份到遠(yuǎn)程存儲(chǔ)/云存儲(chǔ),無(wú)需占用本地磁盤(pán)空間
  • 支持部分備份/恢復(fù):可以單獨(dú)備份/恢復(fù)指定庫(kù)/表,無(wú)需恢復(fù)整個(gè)實(shí)例
  • 開(kāi)源免費(fèi):活躍維護(hù),兼容所有主流 MySQL 分支
  • 恢復(fù)速度快:物理恢復(fù)直接拷貝文件,速度比邏輯恢復(fù)快 10 倍以上,大幅縮短故障恢復(fù)時(shí)間

Xtrabackup核心原理

XtraBackup 基于 InnoDB 的 Crash Recovery 機(jī)制實(shí)現(xiàn)無(wú)鎖一致性備份:

  • 備份階段:
  • 啟動(dòng)后首先拷貝 InnoDB 的 redo log,記錄當(dāng)前最新的 LSN(日志序列號(hào))
  • 并行拷貝所有 InnoDB 數(shù)據(jù)文件(.ibd 文件)
  • 獲取全局讀鎖(FTWRL),拷貝 MyISAM、MEMORY 等非事務(wù)引擎的數(shù)據(jù)文件和系統(tǒng)表空間
  • 拷貝完成后釋放全局鎖,記錄最終的 LSN 和 binlog 位點(diǎn)
  • 生成備份元數(shù)據(jù)文件(backup-my.cnf、xtrabackup_info、xtrabackup_checkpoints)
  • Prepare 階段:
  • 應(yīng)用備份期間產(chǎn)生的 redo log 到數(shù)據(jù)文件,將所有數(shù)據(jù)頁(yè)推進(jìn)到一致的 LSN 點(diǎn)
  • 回滾未提交的事務(wù),生成完整一致的、可直接啟動(dòng)的 MySQL 數(shù)據(jù)目錄
  • 恢復(fù)階段:
  • 直接將 prepare 完成的數(shù)據(jù)目錄拷貝到 MySQL 數(shù)據(jù)目錄,修改權(quán)限后即可啟動(dòng) MySQL

Xtrabackup下載安裝

Xtrabackup與mysql版本對(duì)應(yīng)關(guān)系

XtraBackup 版本支持的 MySQL 版本
8.0.xMySQL 8.0.x、Percona Server 8.0.x、MariaDB 10.5+
2.4.xMySQL 5.6.x、5.7.x、Percona Server 5.6/5.7、MariaDB 10.0~10.4
2.3.x已停止維護(hù),僅支持 MySQL 5.5/5.6

下載地址:https://www.percona.com/downloads/

二進(jìn)制安裝

root@master:/data00/software# wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.26-18/binary/tarball/percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz
root@master:/data00/software# tar -xvf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz 
root@master:/data00/software# ln -s /data00/software/percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17/bin/* /usr/bin/
root@master:/data00/software# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/data00/data/mysql --innodb_buffer_pool_size=1G 
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)

Xtrabackup核心參數(shù)詳解

通用基礎(chǔ)參數(shù):

參數(shù)說(shuō)明
--user數(shù)據(jù)庫(kù)用戶名,需要有RELOAD、LOCK TABLES、PROCESS、BACKUP_ADMIN權(quán)限
--password數(shù)據(jù)庫(kù)密碼
--host數(shù)據(jù)庫(kù)地址
--port數(shù)據(jù)庫(kù)端口
--socket本地socket文件路徑
--datadirMySQL數(shù)據(jù)目錄路徑,自動(dòng)從my.cnf讀取,無(wú)需手動(dòng)指定
--target-dir備份文件存放目錄,必須指定
--parallel備份/恢復(fù)并行線程數(shù),建議設(shè)置為CPU核心數(shù)的2倍

備份功能參數(shù):

參數(shù)說(shuō)明
--backup執(zhí)行備份操作的核心參數(shù),必須指定
--compress開(kāi)啟LZ4壓縮,大幅減小備份文件大小
--compress-threads壓縮并行線程數(shù),默認(rèn)等于并行數(shù)
--incremental開(kāi)啟增量備份
--incremental-basedir增量備份基于的上一次備份目錄
--incremental-lsn增量備份基于的LSN號(hào),替代--incremental-basedir
--stream流備份模式,支持tar或xbstream格式,可直接輸出到標(biāo)準(zhǔn)輸出,用于遠(yuǎn)程備份
--encrypt開(kāi)啟加密備份,支持AES256算法
--encrypt-key加密密鑰,或使用--encrypt-key-file指定密鑰文件
--include部分備份,只備份匹配的庫(kù)/表,格式:庫(kù)名.表名,支持通配符
--exclude排除指定庫(kù)/表,格式同上
--no-lock跳過(guò)非事務(wù)引擎的全局鎖,僅所有表都是InnoDB時(shí)使用
--slave-info備份從庫(kù)時(shí),記錄主庫(kù)的binlog位點(diǎn),用于搭建新從庫(kù)
--galera-info備份Galera集群節(jié)點(diǎn)時(shí)記錄WSREP信息

Prepare(恢復(fù)準(zhǔn)備)參數(shù):

參數(shù)說(shuō)明
--prepare執(zhí)行prepare操作,將備份數(shù)據(jù)推進(jìn)到一致?tīng)顟B(tài)
--apply-log-only增量備份prepare時(shí)使用,僅應(yīng)用redo log,不回滾未提交事務(wù),便于后續(xù)應(yīng)用增量
--incremental-dir增量prepare時(shí)指定要應(yīng)用的增量備份目錄
--decompress解壓壓縮后的備份文件,需要先安裝qpress工具
--remove-original解壓后刪除原始?jí)嚎s文件,節(jié)省空間

恢復(fù)參數(shù)

參數(shù)說(shuō)明
--copy-back將prepare完成的備份文件拷貝到MySQL數(shù)據(jù)目錄
--move-back移動(dòng)備份文件到數(shù)據(jù)目錄,比copy更快,但備份文件會(huì)被刪除
--datadir目標(biāo)MySQL數(shù)據(jù)目錄路徑

Xtrabackup備份實(shí)戰(zhàn)

  • 全量備份
# 創(chuàng)建備份目錄
mkdir -p /data/backup/full_$(date +%Y%m%d_%H%M%S)
# 全量備份(開(kāi)啟壓縮,8線程,非InnoDB表加鎖)
xtrabackup \
--defaults-file=/etc/my.cnf \
--host=127.0.0.1 \
--port=3306 \
--user=root \
--password=root \
--backup \
--compress \
--parallel=8 \
--target-dir=/data00/backup/full_$(date +%Y%m%d_%H%M%S)
  • 無(wú)鎖全量備份(所有表都是InnoDB)
xtrabackup \
--defaults-file=/etc/my.cnf \
--host=127.0.0.1 \
--port=3306 \
--user=root \
--password='你的密碼' \
--backup \
--compress \
--parallel=8 \
--no-lock \
--target-dir=/data/backup/full_$(date +%Y%m%d_%H%M%S)
  • 增量備份
    增量備份基于上一次全量/增量備份,僅備份變化的數(shù)據(jù),適合大庫(kù)減少備份時(shí)間和空間占用:
# 第一步:周日?qǐng)?zhí)行全量備份
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8 --target-dir=/data/backup/full_sunday
# 第二步:周一執(zhí)行第一次增量備份(基于周日的全量)
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8 \
--incremental-basedir=/data/backup/full_sunday \
--target-dir=/data/backup/inc_monday
# 第三步:周二執(zhí)行第二次增量備份(基于周一的增量)
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8 \
--incremental-basedir=/data/backup/inc_monday \
--target-dir=/data/backup/inc_tuesday
  • 部分備份(僅備份指定庫(kù)/表)
# 僅備份db1和db2兩個(gè)庫(kù)
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --include='^db1\.|^db2\.' --target-dir=/data/backup/db1_db2
# 備份所有庫(kù),排除test庫(kù)和log庫(kù)
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --exclude='^test\.|^log\.' --target-dir=/data/backup/without_test_log
  • 流備份(直接備份到遠(yuǎn)程服務(wù)器,不占用本地空間)
# 本地備份直接流式傳輸?shù)竭h(yuǎn)程服務(wù)器
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --parallel=8 | ssh user@remote_host "xbstream -x -C /data/remote_backup/"
# 流備份+壓縮+加密+傳輸?shù)絊3
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --compress --encrypt=AES256 --encrypt-key='你的密鑰' | aws s3 cp - s3://your-bucket/mysql_backup.xbstream
# 流備份+壓縮+加密+傳輸?shù)給ss
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --compress | ossutil cp - oss://your-bucket/mysql_backup.xbstream

Xtrabackup恢復(fù)實(shí)戰(zhàn)

全量恢復(fù)實(shí)戰(zhàn)

步驟1:解壓備份(如果開(kāi)啟了壓縮)

下載解壓工具,ubuntu系統(tǒng)
# 1. 更新包列表并安裝必要工具
sudo apt update
sudo apt install -y wget gnupg2 lsb-release
# 2. 下載并安裝 Percona 倉(cāng)庫(kù)配置包
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
# 3. 啟用 Percona 的 tools 倉(cāng)庫(kù)并更新
sudo percona-release enable-only tools
sudo apt update
# 4. 安裝 qpress
sudo apt install -y qpress
# 5. 確認(rèn)安裝成功
which qpress
# 解壓
root@master:/data00/backup# xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data00/backup/full_20260526_170147
xtrabackup: recognized server arguments: --datadir=/data00/data/mysql --innodb_buffer_pool_size=1G
xtrabackup: recognized client arguments: --decompress=1 --remove-original=1 --parallel=8 --target-dir=/data00/backup/full_20260526_170147
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)
260526 17:25:59 [01] decompressing ./mysql.ibd.qp
260526 17:25:59 [07] decompressing ./mysql/slow_log.CSM.qp
# ...省略萬(wàn)字內(nèi)容
260526 17:25:59 completed OK!

步驟2:Prepare 備份(將數(shù)據(jù)推進(jìn)到一致?tīng)顟B(tài))

root@master:/data00/backup# xtrabackup --prepare --parallel=8 --target-dir=/data00/backup/full_20260526_170147
xtrabackup: recognized server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1 --innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_files_in_group=2 --innodb_log_file_size=50331648 --innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2 --server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0 --innodb_undo_log_encrypt=0 
xtrabackup: recognized client arguments: --prepare=1 --parallel=8 --target-dir=/data00/backup/full_20260526_170147 
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)
xtrabackup: cd to /data00/backup/full_20260526_170147/
#...省略萬(wàn)字內(nèi)容
260526 17:27:21 completed OK!

看到 completed OK! 表示prepare成功,此時(shí)備份已經(jīng)是一致可恢復(fù)的狀態(tài)。

步驟3:停止MySQL,清空數(shù)據(jù)目錄

root@master:/data00/backup# systemctl stop mysql.service 
root@master:~# mv /data00/data/mysql /data00/data/mysql_bak
root@master:~# mkdir -p /data00/data/mysql

步驟4:恢復(fù)備份到數(shù)據(jù)目錄

# 方式1:拷貝(備份文件保留)
xtrabackup --copy-back --parallel=8 --target-dir=/data00/backup/full_20260526_170147
# 方式2:移動(dòng)(速度更快,備份文件被刪除)
# xtrabackup --move-back --parallel=8 --target-dir=/data00/backup/full_20260526_170147

步驟五:修改權(quán)限,啟動(dòng)MySQL

chown -R mysql:mysql /data00/data/mysql
systemctl start mysql.service

增量備份恢復(fù)流程

假設(shè)我們有周日全量、周一增量、周二增量三份備份:
步驟1:解壓所有備份

xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/full_sunday
xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/inc_monday
xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/inc_tuesday

步驟2:Prepare 全量備份(僅應(yīng)用redo log,不回滾事務(wù))

xtrabackup --prepare --apply-log-only --parallel=8 --target-dir=/data/backup/full_sunday

步驟3:應(yīng)用周一增量到全量備份

xtrabackup --prepare --apply-log-only --parallel=8 \
--target-dir=/data/backup/full_sunday \
--incremental-dir=/data/backup/inc_monday

步驟4:應(yīng)用周二增量到全量備份(最后一次增量不需要--apply-log-only)

xtrabackup --prepare --parallel=8 \
--target-dir=/data/backup/full_sunday \
--incremental-dir=/data/backup/inc_tuesday

步驟5:后續(xù)恢復(fù)流程和全量備份一致

systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql_bak
mkdir /var/lib/mysql
xtrabackup --copy-back --parallel=8 --target-dir=/data/backup/full_sunday
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

單表恢復(fù)(MySQL 8.0+ 支持)

# 1. 單獨(dú)備份某張表
xtrabackup --user=root --password=xxx --backup --include='db1.user' --target-dir=/data/backup/user_table
# 2. Prepare 備份
xtrabackup --prepare --export --target-dir=/data/backup/user_table
# 3. 在目標(biāo)庫(kù)刪除該表的表空間
mysql> ALTER TABLE db1.user DISCARD TABLESPACE;
# 4. 拷貝備份中的.ibd和.cfg文件到目標(biāo)庫(kù)數(shù)據(jù)目錄
cp /data/backup/user_table/db1/user.{ibd,cfg} /var/lib/mysql/db1/
chown mysql:mysql /var/lib/mysql/db1/user.*
# 5. 導(dǎo)入表空間
mysql> ALTER TABLE db1.user IMPORT TABLESPACE;

生產(chǎn)環(huán)境最佳實(shí)踐

生產(chǎn)環(huán)境備份策略

  • 備份頻率:核心庫(kù)每周日全量備份,周一到周六每日增量備份,binlog實(shí)時(shí)備份到異地
  • 備份位置:優(yōu)先在從庫(kù)執(zhí)行備份,完全不影響主庫(kù)業(yè)務(wù)
  • 壓縮開(kāi)啟:生產(chǎn)環(huán)境必須開(kāi)啟壓縮,節(jié)省70%以上的存儲(chǔ)空間
  • 并行數(shù)配置:備份并行數(shù)設(shè)置為CPU核心數(shù)的2倍,恢復(fù)并行數(shù)設(shè)置為CPU核心數(shù)的4倍
  • 備份驗(yàn)證:每周至少執(zhí)行一次恢復(fù)演練,驗(yàn)證備份有效性(備份不可用=沒(méi)做備份)
  • 異地存儲(chǔ):備份文件必須同步到異地存儲(chǔ)/對(duì)象存儲(chǔ),避免單機(jī)房故障丟失
  • 監(jiān)控告警:備份失敗、備份文件大小異常必須及時(shí)告警
  • 定期清理:備份文件保留周期根據(jù)業(yè)務(wù)需求配置,一般保留1~4周,歸檔備份保留3個(gè)月以上

性能優(yōu)化技巧

  • 備份優(yōu)化:
  • 使用SSD存儲(chǔ)備份,速度比機(jī)械盤(pán)快5~10倍
  • 開(kāi)啟大頁(yè)、調(diào)整系統(tǒng)IO調(diào)度算法為noop/deadline
  • 備份時(shí)臨時(shí)調(diào)整MySQL的 innodb_flush_log_at_trx_commit=0 提升IO性能
  • 優(yōu)先使用物理機(jī)備份,避免虛擬化IO overhead
  • 恢復(fù)優(yōu)化:
  • 恢復(fù)前調(diào)整MySQL參數(shù):innodb_buffer_pool_size=物理內(nèi)存的70%、innodb_flush_log_at_trx_commit=0、innodb_doublewrite=0(恢復(fù)完成后改回原值)
  • 使用 --move-back 替代 --copy-back,減少一次文件拷貝開(kāi)銷(xiāo)
  • 大庫(kù)恢復(fù)前關(guān)閉binlog、慢查詢?nèi)罩?、general log

到此這篇關(guān)于mysql備份恢復(fù)詳解的文章就介紹到這了,更多相關(guān)mysql備份恢復(fù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql中int(1)、int(20)的區(qū)別小結(jié)

    Mysql中int(1)、int(20)的區(qū)別小結(jié)

    本文主要介紹了Mysql中int(1)、int(20)的區(qū)別小結(jié),int后的數(shù)字表示最大顯示寬度,一般int后面的數(shù)字M要配合zerofill一起使用才有效,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2025-03-03
  • Linux下mysql 5.7 部署及遠(yuǎn)程訪問(wèn)配置

    Linux下mysql 5.7 部署及遠(yuǎn)程訪問(wèn)配置

    這篇文章主要為大家詳細(xì)介紹了Linux下mysql 5.7 部署及遠(yuǎn)程訪問(wèn)的配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL中ROUND函數(shù)進(jìn)行四舍五入操作陷阱分析

    MySQL中ROUND函數(shù)進(jìn)行四舍五入操作陷阱分析

    這篇文章主要介紹了MySQL中ROUND函數(shù)進(jìn)行四舍五入操作陷阱,結(jié)合實(shí)例形式分析了mysql使用ROUND函數(shù)進(jìn)行四舍五入運(yùn)算中出現(xiàn)的問(wèn)題及其錯(cuò)誤原因,需要的朋友可以參考下
    2018-06-06
  • mysql 8.0.22 安裝配置圖文教程

    mysql 8.0.22 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.22 安裝配置圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • MySQL數(shù)據(jù)庫(kù)中null的知識(shí)點(diǎn)總結(jié)

    MySQL數(shù)據(jù)庫(kù)中null的知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于MySQL數(shù)據(jù)庫(kù)null的知識(shí)點(diǎn)以及相關(guān)實(shí)例,需要的朋友們可以學(xué)習(xí)下。
    2019-10-10
  • MYSQL自增id超過(guò)int最大值的解決方案

    MYSQL自增id超過(guò)int最大值的解決方案

    這篇文章詳細(xì)介紹了MySQL中自增ID超過(guò)int最大值的問(wèn)題,包括現(xiàn)象、原因、解決方案和最佳實(shí)踐,建議從緊急止血到長(zhǎng)期治理,推薦使用bigint或分布式ID生成器,面試時(shí),應(yīng)提供完整回答結(jié)構(gòu),并考慮業(yè)務(wù)場(chǎng)景和性能影響,需要的朋友可以參考下
    2026-02-02
  • MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法實(shí)例

    MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法實(shí)例

    我們?cè)谟肕ysql抽取數(shù)據(jù)時(shí)候,經(jīng)常需要按照天、周、月等不同的粒度對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì),下面這篇文章主要給大家介紹了關(guān)于MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • windows 環(huán)境下 MySQL 8.0.13 免安裝版配置教程

    windows 環(huán)境下 MySQL 8.0.13 免安裝版配置教程

    這篇文章主要介紹了windows 環(huán)境下 MySQL 8.0.13 免安裝版配置教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-12-12
  • CentOS 7.2下MySQL的安裝與相關(guān)配置

    CentOS 7.2下MySQL的安裝與相關(guān)配置

    最近因?yàn)楣ぷ餍枰?,要在CentOS上安裝MySQL,在安裝的時(shí)候遇到了一點(diǎn)問(wèn)題,花了點(diǎn)時(shí)間解決了,感覺(jué)不管是官網(wǎng)還是網(wǎng)上的一些教程都不夠完整,不能一次性幫新手解決問(wèn)題,于是我就結(jié)合官網(wǎng)和網(wǎng)上的資源整理了下,現(xiàn)在分享給大家,希望對(duì)有需要的朋友們能有所幫助。
    2016-11-11
  • 淺析MySQL 主鍵使用數(shù)字還是uuid查詢快

    淺析MySQL 主鍵使用數(shù)字還是uuid查詢快

    在實(shí)際開(kāi)發(fā)中可能會(huì)生成uuid作為主鍵那么疑問(wèn)來(lái)了,到底MySQL 主鍵使用數(shù)字還是uuid查詢快呢?下面小編給大家?guī)?lái)實(shí)例代碼給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2021-08-08

最新評(píng)論

浑源县| 甘南县| 思南县| 平果县| 湖北省| 宿州市| 盐城市| 观塘区| 阿坝县| 万安县| 伽师县| 邵阳市| 霍邱县| 项城市| 仲巴县| 射阳县| 密山市| 土默特左旗| 建水县| 金华市| 靖西县| 蓬安县| 手游| 利辛县| 开远市| 大兴区| 正蓝旗| 德清县| 昌都县| 会理县| 贞丰县| 枣庄市| 庆安县| 新河县| 那坡县| 肃宁县| 织金县| 左权县| 海晏县| 思南县| 固阳县|