数据库备份全解析,包含大部分流行数据库国产数据库操作全解析!

数据库备份全解析,包含大部分流行数据库国产数据库操作全解析!


一、备份核心概念(速览)

开始之前,快速对齐几个术语,确保后面阅读无障碍:

概念 大白话解释
逻辑备份 把表结构和数据转成SQL语句或专用文件,可读可编辑,慢但灵活
物理备份 直接拷贝数据库的数据文件,速度快,适合大库
全量备份 某一时刻的完整副本
增量备份 只备份自上一次备份以来变化过的数据块
差异备份 只备份自上一次全量备份以来变化的数据
归档日志 数据库会把每次修改记录写进这些日志,物理热备和增量恢复的基石
RPO/RTO 能容忍丢失多少数据/能接受多长时间恢复业务

生产铁律:只要用物理热备或增量备份,必须先打开数据库的"归档模式",否则备份必定失败。


二、主流及国产数据库备份实战

下面我们逐库展开,每个数据库独立一节,让你随时查阅。


1. MySQL

MySQL的备份工具分社区版和企业版,这里只讲最通用、生产验证过的两种:mysqldump(逻辑) 和 Percona XtraBackup(物理)。

1.1 逻辑备份 -- mysqldump

全量导出单个数据库

bash 复制代码
mysqldump -u root -p'密码' --databases mydb --single-transaction --routines --triggers --events > /backup/mydb_full_$(date +%Y%m%d).sql

参数说明:

  • --databases :指定导出一个或多个库
  • --single-transaction :对于InnoDB,导出过程中不锁表,保证数据一致性
  • --routines :导出存储过程和函数
  • --triggers :导出触发器
  • --events :导出事件调度器

导出全部数据库

bash 复制代码
mysqldump -u root -p'密码' --all-databases --single-transaction --routines --triggers --events > /backup/all_db_$(date +%Y%m%d).sql

仅导出表结构

bash 复制代码
mysqldump -u root -p'密码' --no-data mydb > /backup/mydb_schema.sql
1.2 物理全量备份 -- XtraBackup

前提 :已安装 percona-xtrabackup

bash 复制代码
xtrabackup --backup --user=root --password='密码' --target-dir=/backup/base_$(date +%Y%m%d) --parallel=4

参数:

  • --target-dir :备份存放目录
  • --parallel=4 :并行线程数,按CPU核数调整

准备(应用日志):备份完必须执行这一步才能用于恢复

bash 复制代码
xtrabackup --prepare --target-dir=/backup/base_20250625
1.3 增量备份 -- XtraBackup

先做一次全量:

bash 复制代码
xtrabackup --backup --user=root --password='密码' --target-dir=/backup/base --parallel=4

第一次增量(基于全量):

bash 复制代码
xtrabackup --backup --user=root --password='密码' --target-dir=/backup/inc1 \
  --incremental-basedir=/backup/base --parallel=4

第二次增量(基于上一次增量):

bash 复制代码
xtrabackup --backup --user=root --password='密码' --target-dir=/backup/inc2 \
  --incremental-basedir=/backup/inc1 --parallel=4

恢复时,按顺序准备:

bash 复制代码
# 先准备全量
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
# 合并增量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

最后将 /backup/base 目录拷回数据目录,启动MySQL即可。

1.4 恢复验证

逻辑备份验证:在测试库导入

bash 复制代码
mysql -u root -p'密码' testdb < /backup/mydb_full_20250625.sql

检查表数量、抽样数据。

物理备份验证 :恢复到一个空闲MySQL实例,启动后执行 CHECKSUM TABLE 或跑业务SQL验证。


2. PostgreSQL

PostgreSQL生态的标准工具组合:pg_dump(逻辑) + pg_basebackup(物理全量) + pg_probackup(全量增量)。

2.1 逻辑备份 -- pg_dump

单库导出

bash 复制代码
pg_dump -U postgres -d mydb -F c -f /backup/mydb_$(date +%Y%m%d).dump
  • -F c :自定义格式,支持并行恢复,比纯SQL体积小
  • 如果希望导出为SQL文本,换成 -F p

仅导出结构

bash 复制代码
pg_dump -U postgres -d mydb -s -f /backup/mydb_schema.sql

全部数据库 (用 pg_dumpall

bash 复制代码
pg_dumpall -U postgres -f /backup/all_db.sql
2.2 物理全量备份 -- pg_basebackup

要求wal_level = replica 且已配置归档(或至少允许流复制连接)。

bash 复制代码
pg_basebackup -U postgres -D /backup/base_$(date +%Y%m%d) -Ft -z -P -Xs
  • -D :目标目录
  • -Ft :tar打包
  • -z :压缩
  • -P :显示进度
  • -Xs :使用流复制方式获取WAL,确保备份一致性
2.3 全量+增量备份 -- pg_probackup

初始化备份目录

bash 复制代码
pg_probackup init -B /backup/probackup
pg_probackup add-instance -B /backup/probackup --instance=prod -D /var/lib/postgresql/data

全量备份

bash 复制代码
pg_probackup backup -B /backup/probackup --instance=prod -b FULL \
  -U postgres -d postgres --stream --temp-slot --progress
  • -b FULL :全量
  • --stream :流式传输WAL
  • --temp-slot :创建临时复制槽,防止所需WAL被清除

增量备份(基于页级追踪)

bash 复制代码
pg_probackup backup -B /backup/probackup --instance=prod -b PAGE \
  -U postgres -d postgres --stream --temp-slot --progress
2.4 恢复与验证

恢复全量

bash 复制代码
# 解压后直接拷贝至数据目录,或使用 pg_probackup restore
pg_probackup restore -B /backup/probackup --instance=prod -D /var/lib/postgresql/data_new \
  --recovery-target-action=promote

验证备份有效性

bash 复制代码
pg_probackup validate -B /backup/probackup --instance=prod -i 备份ID

还可以通过 --recovery-target 进行时间点恢复测试。


3. Oracle

Oracle主推 RMAN 做物理备份,Data Pump(expdp/impdp) 做逻辑备份。

3.1 逻辑备份 -- expdp
bash 复制代码
expdp system/密码@PDB1 DIRECTORY=DPUMP_DIR DUMPFILE=mydb_%U.dmp LOGFILE=exp_mydb.log \
  FULL=Y PARALLEL=4
  • DIRECTORY :Oracle目录对象,需提前创建
  • FULL=Y :全库导出
  • PARALLEL=4 :4个并行通道

按用户导出

bash 复制代码
expdp system/密码@PDB1 DIRECTORY=DPUMP_DIR SCHEMAS=scott DUMPFILE=scott.dmp
3.2 物理全量备份 -- RMAN
sql 复制代码
RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
  • PLUS ARCHIVELOG :同时备份归档日志
  • DELETE INPUT :备份成功后删除已备份的归档,释放空间
3.3 增量备份 -- RMAN

0级全量(相当于增量基线)

sql 复制代码
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

1级增量

sql 复制代码
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;

差异增量(默认) :只备份自上次任意级别备份以来变化的块。

累积增量 :加 CUMULATIVE 则备份自上次0级以来所有变化。

3.4 备份验证与恢复测试

验证备份集完整性

sql 复制代码
RMAN> VALIDATE BACKUPSET 备份集号;
RMAN> RESTORE DATABASE VALIDATE;   -- 完全模拟恢复过程,但不实际写数据

恢复演练到新位置

sql 复制代码
RMAN> SET NEWNAME FOR DATABASE TO '/newpath/%b';
RMAN> RESTORE DATABASE;
RMAN> SWITCH DATAFILE ALL;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

下面进入国产数据库,操作方法很多和以上三大主流库一脉相承。


4. 达梦数据库 DM8

达梦的逻辑备份用 dexp ,物理备份用 DMRMAN (命令行工具)或 SQL 中的 BACKUP 语句。生产环境推荐 DMRMAN。

4.1 逻辑备份 -- dexp
bash 复制代码
./dexp USERID=SYSDBA/SYSDBA123@localhost:5236 FILE=/backup/dm_full_$(date +%Y%m%d).dmp LOG=exp.log FULL=Y
  • USERID :用户名/密码@主机:端口
  • FILE :输出文件
  • FULL=Y :全库导出
  • 可按用户导出:OWNER=用户名;按表:TABLES=表名
4.2 物理全量备份 -- DMRMAN

前置条件 :数据库已开启归档模式(ARCH_MODE=1),否则只能做冷备。

进入 DMRMAN 工具:

bash 复制代码
./dmrman

全量备份

sql 复制代码
RMAN> BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL BACKUPSET '/dm8/backup/full_250625';
4.3 增量备份 -- DMRMAN

增量备份

sql 复制代码
RMAN> BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' INCREMENT BACKUPSET '/dm8/backup/inc1_250625';

增量备份自动基于上次全量或增量产生差异备份(达梦称之为累计增量,只备份自上次全量后变化的页)。如果需要纯粹的差异增量(基于上次备份),可配合 BASE ON 语法。

4.4 恢复与验证

检查备份集

sql 复制代码
RMAN> CHECK BACKUPSET '/dm8/backup/full_250625';

恢复数据库(以全量+增量为例)

sql 复制代码
RMAN> RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/full_250625';
RMAN> RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' WITH BACKUPSET '/dm8/backup/inc1_250625';
RMAN> RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC;

完成后重启数据库即可。


5. 人大金仓 KingbaseES

金仓高度兼容 PostgreSQL,工具命名为 sys_dumpsys_basebackupsys_rman

5.1 逻辑备份 -- sys_dump
bash 复制代码
sys_dump -U system -d mydb -F c -f /backup/kingbase_mydb_$(date +%Y%m%d).dump

参数含义与 pg_dump 完全一致。

5.2 物理全量备份 -- sys_basebackup

前提:打开 WAL 归档(kingbase.confwal_level=replica,配置 archive_command)。

bash 复制代码
sys_basebackup -U system -D /backup/base_$(date +%Y%m%d) -Ft -z -P -Xs
5.3 全量+增量备份 -- sys_rman

初始化

bash 复制代码
sys_rman init -B /backup/sysrman
sys_rman add-instance -B /backup/sysrman -D /opt/kingbase/data

全量备份

bash 复制代码
sys_rman backup -B /backup/sysrman -D /opt/kingbase/data -b full -U system --progress

增量备份(基于上次备份)

bash 复制代码
sys_rman backup -B /backup/sysrman -D /opt/kingbase/data -b inc -U system --progress
5.4 恢复与验证

列出备份

bash 复制代码
sys_rman show -B /backup/sysrman

验证备份

bash 复制代码
sys_rman validate -B /backup/sysrman -i 备份ID

恢复到新目录

bash 复制代码
sys_rman restore -B /backup/sysrman -D /data/kingbase_restore -i 备份ID

6. 华为 GaussDB (openGauss)

GaussDB 的命令行工具也带着PG的影子:gs_dumpgs_basebackupgs_probackup

6.1 逻辑备份 -- gs_dump
bash 复制代码
gs_dump -U gaussdba -W 密码 -d mydb -F c -f /backup/gaussdb_mydb_$(date +%Y%m%d).dump

-F c 自定义格式;-F p 纯SQL。

6.2 物理全量备份 -- gs_basebackup

要求:wal_level = archive 并设置归档路径。

bash 复制代码
gs_basebackup -D /backup/base_$(date +%Y%m%d) -U gaussdba -W -P -Ft -z -X stream
  • -X stream :使用流复制方式获取WAL
6.3 全量+增量备份 -- gs_probackup

初始化

bash 复制代码
gs_probackup init -B /backup/probackup
gs_probackup add-instance -B /backup/probackup --instance=gaussdb -D /opt/gaussdb/data

全量

bash 复制代码
gs_probackup backup -B /backup/probackup --instance=gaussdb -b FULL -U gaussdba -W --progress

增量(PTRACK页追踪)

bash 复制代码
gs_probackup backup -B /backup/probackup --instance=gaussdb -b PTRACK -U gaussdba -W --progress
6.4 恢复与验证

恢复

bash 复制代码
gs_probackup restore -B /backup/probackup --instance=gaussdb -D /opt/gaussdb_restore -i 备份ID

验证

bash 复制代码
gs_probackup validate -B /backup/probackup --instance=gaussdb -i 备份ID

7. 南大通用 GBase 8a MPP

GBase 8a 底层兼容MySQL协议,逻辑备份可直接用 mysqldump,物理备份则使用集群自带的 gcrcman 工具。

7.1 逻辑备份(同MySQL)
bash 复制代码
mysqldump -h 集群VIP -u gbase -p'密码' mydb --single-transaction > /backup/gbase_mydb.sql
7.2 物理全量备份 -- gcrcman
bash 复制代码
gcrcman -u gbase -p'密码' --host=管理节点IP --port=5050

进入交互式命令行后:

sql 复制代码
backup level 0;

或直接一条命令:

bash 复制代码
gcrcman -u gbase -p'密码' --host=管理节点IP -e "backup level 0"
7.3 增量备份
sql 复制代码
backup level 1;

GBase 8a 的 level 0 为全量,level 1 为增量(自动基于上次 level 0 或 level 1)。

7.4 恢复与验证

查看备份信息

sql 复制代码
show backup;

恢复整个集群(在 gcrcman 中)

sql 复制代码
recover 备份ID;

恢复过程会自动从全量和增量叠加。

验证 :恢复后建议跑 CHECKSUM TABLE 或自定义数据校验。


8. OceanBase 社区版

OceanBase 的备份依赖 日志归档,备份命令通过 obclient 执行 SQL,物理备份和增量自动调度。

8.1 逻辑备份(使用 ob-dumper)

OceanBase 官方导出工具 obdumper

bash 复制代码
obdumper --host 11.22.33.44 --port 2883 -u root -p '密码' \
  --database mydb --output /backup/ob_mydb

参数与 mysqldump 类似,但支持分布式导出。

8.2 物理备份

设置备份目的端

sql 复制代码
ALTER SYSTEM SET backup_dest = 'file:///backup/oceanbase';

启动备份任务

sql 复制代码
ALTER SYSTEM BACKUP DATABASE;

OceanBase 会自动进行全量+增量合并,不需要手动区分。

查看备份进度

sql 复制代码
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS;
8.3 恢复与验证

恢复前需要停止集群并启动恢复

bash 复制代码
obclient> ALTER SYSTEM RESTORE DATABASE TO 'file:///backup/oceanbase' UNTIL TIME='2025-06-25 02:00:00';

OceanBase 支持时间点恢复。

验证:一般通过恢复到一个新的集群进行业务验证。


9. TiDB

TiDB 使用 Dumpling 做逻辑导出,BR 做物理全量/增量备份。

9.1 逻辑备份 -- Dumpling
bash 复制代码
dumpling -u root -P 4000 -h 127.0.0.1 -o /backup/tidb_dump_$(date +%Y%m%d) \
  --filetype sql -t 8 --no-schema false
  • -t 8 :8个并发线程
  • --no-schema false :同时导出表结构
9.2 物理全量备份 -- BR
bash 复制代码
br backup full --pd "127.0.0.1:2379" \
  --storage "local:///backup/tidb_full" \
  --ratelimit 128 --log-file /var/log/br_backup.log
  • --storage :备份存储路径,支持本地或S3
  • --ratelimit :限速(MB/s),防止影响业务
9.3 增量备份 -- BR
bash 复制代码
br backup full --pd "127.0.0.1:2379" \
  --storage "local:///backup/tidb_inc" \
  --lastbackupts $(cat /backup/last_backup_ts)

--lastbackupts 指定上次备份的时间戳,BR自动找出变化数据。

生产上常用脚本记录上次备份的 gc_safepoint

bash 复制代码
br backup full --pd "127.0.0.1:2379" \
  --storage "local:///backup/tidb_$(date +%Y%m%d%H%M)" \
  --send-credentials-to-tikv=true
9.4 恢复与验证

全量恢复

bash 复制代码
br restore full --pd "127.0.0.1:2379" \
  --storage "local:///backup/tidb_full" \
  --ratelimit 128

验证备份文件

bash 复制代码
br validate --storage "local:///backup/tidb_full"

BR 会快速检查备份集的完整性和校验和。


三、通用备份策略与自动化

无论什么数据库,生产环境都建议遵循以下框架:

3-2-1 原则

  • 3 份数据拷贝(生产 + 两份备份)
  • 2 种不同介质(本地磁盘 + 云对象存储/NAS)
  • 1 份异地存放(防机房级灾难)

策略组合模板

场景 备份方式 频次
核心交易库 物理全量 + 物理增量 每周日全量,每日增量
分析查询库 逻辑全量 每日凌晨
归档库 全量逻辑 每月1次
所有库 二进制日志/归档日志自动备份 持续

自动化示例(以达梦为例的crontab)

bash 复制代码
# 每周日凌晨2点全量备份
0 2 * * 0 /dm8/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL BACKUPSET '/backup/dm_full_$(date +\%Y\%m\%d)'"

# 周一至周六凌晨2点增量备份
0 2 * * 1-6 /dm8/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' INCREMENT BACKUPSET '/backup/dm_inc_$(date +\%Y\%m\%d)'"

恢复演练不可少

每月至少一次在隔离环境完整跑通恢复流程,记录恢复耗时(RTO),并核实数据最新时间戳(RPO)。


四、十大避坑要点

  1. 归档没开:物理热备和增量备份直接报错,务必检查。
  2. 备份用户权限不足:逻辑导出需 SELECT、LOCK TABLES 等权限。
  3. 磁盘空间爆满 :配置自动清理策略,如 find /backup -mtime +7 -delete
  4. 字符集不匹配 :导出导入务必加 --default-character-set=utf8mb4 或相应设置。
  5. 大表锁定 :InnoDB 用 --single-transaction,Oracle 注意 undo 压力。
  6. 并行度乱调:并行数不要超过CPU核心数,避免拖垮生产库。
  7. 未校验备份集:备份完立即运行 validate 或 checksum。
  8. 跨大版本恢复:优先使用逻辑备份,物理备份很可能不兼容。
  9. 忘记备份恢复脚本本身:自动化脚本也要入仓库。
  10. 只有本地备份:务必再复制一份到异地,防火灾、勒索。

以上,就是目前主流及国产数据库备份操作的完全手册。你只需找到对应数据库的章节,复制命令、修改路径和密码,就能迅速搭起生产级备份体系。备份是业务的保险绳,现在就去跑通第一条命令吧。