Skip to content

GaussDB 备份恢复命令

全量备份命令

全量备份是指备份数据库的完整内容,包括所有数据文件、配置文件和WAL日志。全量备份是增量备份和差异备份的基础,也是最常用的备份方式之一。

1. 使用gs_basebackup进行全量备份

gs_basebackup是GaussDB提供的基于PostgreSQL原生的备份工具,适用于简单的全量备份需求。以下是常用的gs_basebackup命令示例:

bash
# 基本全量备份
gs_basebackup -D /backup/gaussdb/full_backup_$(date +%Y%m%d) -Fp -Xs -c fast -h localhost -p 5432 -U backup -W

# 压缩备份
gs_basebackup -D /backup/gaussdb/full_backup_$(date +%Y%m%d) -Fp -Xs -c fast -z -h localhost -p 5432 -U backup -W

# 并行备份
gs_basebackup -D /backup/gaussdb/full_backup_$(date +%Y%m%d) -Fp -Xs -c fast -j 4 -h localhost -p 5432 -U backup -W

# 备份到tar文件
gs_basebackup -D /backup/gaussdb/ -Ft -Xs -c fast -z -h localhost -p 5432 -U backup -W -v

参数说明

  • -D:指定备份输出目录
  • -Fp:使用普通文件格式备份
  • -Ft:使用tar文件格式备份
  • -Xs:在备份过程中流式传输WAL日志
  • -c fast:使用快速 checkpoint 模式
  • -z:启用压缩
  • -j:指定并行备份的线程数
  • -h:指定数据库主机地址
  • -p:指定数据库端口
  • -U:指定备份使用的用户名
  • -W:提示输入密码
  • -v:启用详细输出

2. 使用gs_probackup进行全量备份

gs_probackup是GaussDB提供的增强型备份工具,支持全量备份、增量备份、差异备份以及更丰富的备份管理功能。以下是常用的gs_probackup命令示例:

bash
# 初始化备份目录
gs_probackup init -B /backup/gaussdb

# 添加备份实例
gs_probackup add-instance -B /backup/gaussdb -D /data/gaussdb --instance gaussdb_instance

# 进行全量备份
gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b full -d postgres -h localhost -p 5432 -U backup -W

# 带有压缩的全量备份
gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b full -d postgres -h localhost -p 5432 -U backup -W --compress=zlib

参数说明

  • -B:指定备份目录
  • -D:指定数据库数据目录
  • --instance:指定备份实例名称
  • -b:指定备份类型(full:全量备份)
  • -d:指定连接的数据库名称
  • -h:指定数据库主机地址
  • -p:指定数据库端口
  • -U:指定备份使用的用户名
  • -W:提示输入密码
  • --compress:指定压缩算法(zlib、pglz或none)

增量备份命令

增量备份是指只备份自上次备份(全量或增量)以来发生变化的数据,相比全量备份,增量备份具有备份时间短、占用存储空间小等优势。差异备份是增量备份的一种特殊形式,只备份自上次全量备份以来发生变化的数据。

1. 使用gs_probackup进行增量备份

GaussDB的gs_probackup工具支持增量备份和差异备份,以下是常用的命令示例:

bash
# 基于上次备份的增量备份
gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b incremental -d postgres -h localhost -p 5432 -U backup -W

# 基于特定备份的增量备份
gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b incremental --parent-backup=QPSQL20231201120000 -d postgres -h localhost -p 5432 -U backup -W

# 差异备份
gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b differential -d postgres -h localhost -p 5432 -U backup -W

参数说明

  • -b incremental:指定执行增量备份
  • -b differential:指定执行差异备份
  • --parent-backup:指定增量备份的父备份ID

增量备份的恢复需要先恢复全量备份,然后依次恢复所有增量备份;而差异备份的恢复只需要恢复全量备份和最后一次差异备份,恢复过程相对简单。

WAL日志备份命令

WAL(Write-Ahead Log)日志是GaussDB数据库的事务日志,记录了所有数据库修改操作。WAL日志备份对于实现点-in-time恢复(PITR)至关重要,可以将数据库恢复到任意时间点。

1. 手动切换WAL日志

在某些情况下,需要手动切换WAL日志,例如在进行备份前确保所有事务都已记录到WAL日志中。以下是手动切换WAL日志的命令:

sql
-- 手动切换WAL日志
SELECT pg_switch_wal();

-- 查看当前WAL日志位置
SELECT pg_current_wal_lsn();

-- 查看WAL日志文件
SELECT * FROM pg_ls_waldir();

命令说明

  • pg_switch_wal():强制切换到新的WAL日志文件
  • pg_current_wal_lsn():返回当前WAL日志的位置
  • pg_ls_waldir():列出WAL日志目录中的所有日志文件

2. 配置WAL日志归档

WAL日志归档是指将已完成的WAL日志文件复制到指定的归档目录,以便用于后续的恢复操作。以下是配置WAL日志归档的步骤:

bash
# 修改postgresql.conf文件,启用归档模式
vi /data/gaussdb/postgresql.conf

# 添加以下配置
archive_mode = on
archive_command = 'cp %p /archive/gaussdb/wal/%f'
archive_timeout = 300

# 重启数据库使配置生效
gs_ctl restart -D /data/gaussdb

参数说明

  • archive_mode = on:启用WAL日志归档模式
  • archive_command:指定归档命令,%p表示当前WAL日志文件的路径,%f表示WAL日志文件名
  • archive_timeout:指定WAL日志归档的超时时间(秒),当超过该时间时,即使WAL日志文件未写满,也会触发归档

3. 查看归档状态

可以通过以下命令查看WAL日志归档的状态:

sql
-- 查看归档器状态
SELECT * FROM pg_stat_archiver;

该命令返回的结果包含归档的统计信息,如已归档的WAL日志数量、最后一次归档的时间、归档失败的次数等,可以帮助管理员监控WAL日志归档的状态。

恢复命令

数据库恢复是指将数据库从备份中还原到指定状态的过程。GaussDB支持多种恢复方式,包括基于gs_basebackup的恢复、基于gs_probackup的恢复以及点-in-time恢复(PITR)。

1. 基于gs_basebackup的恢复

使用gs_basebackup进行恢复是一种简单直接的恢复方式,适用于基本的全量备份恢复。以下是恢复步骤:

bash
# 停止数据库服务
gs_ctl stop -D /data/gaussdb

# 清空数据目录
rm -rf /data/gaussdb/*

# 恢复全量备份
rsync -a /backup/gaussdb/full_backup_20231201/ /data/gaussdb/

# 创建recovery.conf文件
cat > /data/gaussdb/recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'host=primary_host port=5432 user=replication password=password sslmode=require'
recovery_target_timeline = 'latest'
EOF

# 启动数据库服务
gs_ctl start -D /data/gaussdb

# 验证恢复状态
psql -h localhost -p 5432 -U postgres -c "SELECT pg_is_in_recovery();"

恢复步骤说明

  1. 停止数据库服务,确保数据库处于关闭状态
  2. 清空数据目录,准备恢复备份
  3. 使用rsync命令将全量备份恢复到数据目录
  4. 创建recovery.conf文件,配置恢复参数
  5. 启动数据库服务,开始恢复过程
  6. 验证数据库是否处于恢复模式

2. 使用gs_probackup进行恢复

gs_probackup提供了更灵活的恢复选项,支持恢复到最新状态、指定时间点或指定LSN位置。以下是常用的恢复命令:

bash
# 查看可用备份
gs_probackup show -B /backup/gaussdb --instance gaussdb_instance

# 停止数据库服务
gs_ctl stop -D /data/gaussdb

# 清空数据目录
rm -rf /data/gaussdb/*

# 恢复最新备份
gs_probackup restore -B /backup/gaussdb --instance gaussdb_instance -D /data/gaussdb

# 恢复到指定时间点
gs_probackup restore -B /backup/gaussdb --instance gaussdb_instance -D /data/gaussdb --recovery-target-time '2023-12-01 12:00:00'

# 恢复到指定LSN
gs_probackup restore -B /backup/gaussdb --instance gaussdb_instance -D /data/gaussdb --recovery-target-lsn '0/12345678'

# 启动数据库服务
gs_ctl start -D /data/gaussdb

参数说明

  • --recovery-target-time:指定恢复到的目标时间点
  • --recovery-target-lsn:指定恢复到的目标LSN位置

3. 点-in-time恢复(PITR)

点-in-time恢复(PITR)允许将数据库恢复到任意指定的时间点,这对于恢复到故障发生前的状态非常重要。以下是PITR恢复的步骤:

bash
# 停止数据库服务
gs_ctl stop -D /data/gaussdb

# 清空数据目录
rm -rf /data/gaussdb/*

# 恢复全量备份
rsync -a /backup/gaussdb/full_backup_20231201/ /data/gaussdb/

# 创建recovery.conf文件,指定恢复目标时间
cat > /data/gaussdb/recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'host=primary_host port=5432 user=replication password=password sslmode=require'
recovery_target_time = '2023-12-01 12:30:00'
recovery_target_inclusive = true
recovery_target_timeline = 'latest'
EOF

# 启动数据库服务进行恢复
gs_ctl start -D /data/gaussdb

# 等待恢复完成,查看恢复状态
psql -h localhost -p 5432 -U postgres -c "SELECT pg_is_in_recovery();"

# 恢复完成后,关闭数据库,移除recovery.conf文件,重新启动
gs_ctl stop -D /data/gaussdb
rm /data/gaussdb/recovery.conf
gs_ctl start -D /data/gaussdb

PITR恢复说明

  1. 恢复全量备份到数据目录
  2. 在recovery.conf文件中指定recovery_target_time参数,设置恢复目标时间
  3. 启动数据库服务,系统会自动应用WAL日志,恢复到指定时间点
  4. 恢复完成后,需要手动关闭数据库,移除recovery.conf文件,然后重新启动数据库,使其退出恢复模式

WAL日志恢复命令

WAL日志恢复是数据库恢复过程中的重要环节,用于将数据库恢复到指定的时间点或状态。以下是常用的WAL日志恢复命令:

1. 手动应用WAL日志

在某些情况下,需要手动查看或接收WAL日志,例如验证WAL日志的内容或手动接收WAL日志用于恢复。以下是常用命令:

bash
# 使用pg_waldump查看WAL日志内容
pg_waldump /archive/gaussdb/wal/000000010000000000000001 | head -20

# 使用pg_receivewal接收WAL日志
pg_receivewal -h localhost -p 5432 -U replication -W -D /archive/gaussdb/wal/ --verbose

命令说明

  • pg_waldump:用于查看WAL日志的内容,帮助管理员分析WAL日志
  • pg_receivewal:用于从主服务器接收WAL日志,可用于手动搭建流复制或备份WAL日志

2. 配置WAL日志恢复

在recovery.conf文件中可以配置WAL日志恢复的相关参数,以下是常用的配置示例:

bash
# 在recovery.conf中配置WAL日志恢复
trusted_servers = '192.168.1.0/24'
restore_command = 'cp /archive/gaussdb/wal/%f %p'
recovery_end_command = 'echo "Recovery completed at $(date)" > /var/log/gaussdb/recovery_completed.log'

配置参数说明

  • trusted_servers:指定可信的服务器IP范围
  • restore_command:指定从归档目录恢复WAL日志的命令
  • recovery_end_command:指定恢复完成后执行的命令

备份验证命令

备份验证是确保备份可用性和完整性的重要步骤,建议定期进行备份验证。以下是常用的备份验证命令:

1. 验证备份文件完整性

bash
# 使用gs_probackup验证备份
gs_probackup validate -B /backup/gaussdb --instance gaussdb_instance --backup-id QPSQL20231201120000

# 检查备份目录结构
ls -la /backup/gaussdb/full_backup_20231201/

# 检查WAL日志文件数量
ls -la /archive/gaussdb/wal/ | wc -l

验证方法说明

  • 使用gs_probackup validate命令可以验证备份的完整性和可用性
  • 检查备份目录结构可以确认备份文件是否完整
  • 检查WAL日志文件数量可以确认WAL日志归档是否正常

2. 测试备份恢复

最好的备份验证方法是定期进行恢复测试,将备份恢复到测试环境并验证数据的完整性和可用性:

bash
# 创建测试目录
mkdir -p /test/gaussdb

# 恢复备份到测试目录
gs_probackup restore -B /backup/gaussdb --instance gaussdb_instance -D /test/gaussdb

# 启动测试数据库
gs_ctl start -D /test/gaussdb

# 验证测试数据库可用性
psql -h localhost -p 5432 -U postgres -c "SELECT 1;"

# 停止测试数据库
gs_ctl stop -D /test/gaussdb

恢复测试说明

  1. 创建专门的测试目录用于恢复测试
  2. 将备份恢复到测试目录
  3. 启动测试数据库并验证其可用性
  4. 测试完成后停止测试数据库

备份管理命令

备份管理包括查看备份列表、删除旧备份和配置备份参数等操作,以下是常用的备份管理命令:

1. 查看备份列表

bash
# 使用gs_probackup查看备份列表
gs_probackup show -B /backup/gaussdb --instance gaussdb_instance

# 查看备份详细信息
gs_probackup show -B /backup/gaussdb --instance gaussdb_instance --backup-id QPSQL20231201120000

命令说明

  • gs_probackup show:查看所有可用备份的列表
  • 添加--backup-id参数可以查看特定备份的详细信息

2. 删除旧备份

bash
# 删除特定备份
gs_probackup delete -B /backup/gaussdb --instance gaussdb_instance --backup-id QPSQL20231201120000

# 根据保留策略删除旧备份
gs_probackup purge -B /backup/gaussdb --instance gaussdb_instance

# 删除所有备份
gs_probackup cleanup -B /backup/gaussdb --instance gaussdb_instance

删除命令说明

  • delete:删除指定ID的备份
  • purge:根据配置的保留策略删除旧备份
  • cleanup:删除所有备份,谨慎使用

3. 备份配置管理

bash
# 查看备份配置
gs_probackup show-config -B /backup/gaussdb --instance gaussdb_instance

# 修改备份配置
gs_probackup set-config -B /backup/gaussdb --instance gaussdb_instance --retention-redundancy 3 --retention-window 7

配置管理说明

  • show-config:查看当前的备份配置
  • set-config:修改备份配置,例如设置保留策略
  • --retention-redundancy:设置保留的全量备份数量
  • --retention-window:设置保留的备份时间窗口(天)

常见问题(FAQ)

Q1: gs_basebackup和gs_probackup有什么区别?

A1: gs_basebackup是基于PostgreSQL原生的备份工具,功能相对简单,主要用于全量备份;而gs_probackup是GaussDB提供的增强型备份工具,支持全量备份、增量备份、差异备份,以及更丰富的备份管理功能。

Q2: 如何选择合适的备份工具?

A2: 对于简单的备份需求,可以使用gs_basebackup;对于复杂的备份策略,如需要增量备份、差异备份或更灵活的备份管理,建议使用gs_probackup。

Q3: 备份命令中的-Xs和-Xf有什么区别?

A3: -Xs表示在备份过程中流式传输WAL日志,确保备份的一致性;-Xf表示在备份结束后复制所有WAL日志文件。-Xs更适合生产环境,因为它可以确保备份的时间点一致性。

Q4: 如何提高备份速度?

A4: 可以通过以下方式提高备份速度:

  • 使用并行备份(-j参数)
  • 使用压缩备份(-z参数)
  • 确保备份存储设备具有足够的IO性能
  • 在低峰期进行备份

Q5: 恢复命令中的recovery_target_timeline参数有什么作用?

A5: recovery_target_timeline参数用于指定恢复到哪个时间线,'latest'表示恢复到最新的时间线,这在进行PITR恢复时非常重要。

Q6: 如何验证备份的可用性?

A6: 最好的验证方法是定期进行恢复测试,将备份恢复到测试环境并验证数据的完整性和可用性。此外,还可以使用备份工具提供的验证命令,如gs_probackup validate。

Q7: 如何自动化备份操作?

A7: 可以使用crontab或其他调度工具来自动化备份操作,例如:

bash
# 每天凌晨2点执行全量备份
0 2 * * * gs_probackup backup -B /backup/gaussdb --instance gaussdb_instance -b full -d postgres -h localhost -p 5432 -U backup -W --compress=zlib > /var/log/gaussdb/backup.log 2>&1

Q8: 备份和恢复命令对数据库性能有影响吗?

A8: 备份命令会对数据库性能产生一定影响,特别是在进行全量备份时,会占用较多的IO资源。建议在业务低峰期进行备份操作。恢复命令需要停止数据库服务,因此会导致数据库不可用,应在维护窗口内进行。