备份与恢复

更新时间:2025-04-03 08:23:17

PolarDB PostgreSQL轻量版支持逻辑备份和物理备份两种核心备份功能。备份过程中支持并行备份,并且对于备份集,能够对接多种存储介质,同时具备备份集本身的压缩能力。

逻辑备份

使用原生PostgreSQL提供的逻辑备份工具pg_dump,将数据导出为SQL文件,通过将该文件导入数据库实现数据恢复。PolarDB PostgreSQL轻量版使用pg_dump工具包括以下优势:

  • PolarDB PostgreSQL轻量版完全兼容。

  • 支持在不同服务器架构间传递数据。例如,将数据文件从32位服务器传递到64位服务器。

  • pg_dump开始运行时刻创建一个一致性快照,仅读取数据库当前状态,不受后续事务影响。

  • pg_dump运行过程中不会阻塞其他数据库的操作。但是会阻塞需要排它锁的操作,例如ALTER TABLE

SQL备份

使用一个由SQL命令组成的文件创建与备份时状态相同的数据库。在集群启动后,您可以通过PolarDB PostgreSQL轻量版中内置的pg_dump工具导出数据文件。pg_dump默认安装在/u01/polardb_pg/bin目录下。

pg_dump dbname > dumpfile

使用说明

  • pg_dump支持以其他格式创建文件,同时具备并行处理能力以及对细粒度对象恢复的控制功能。

  • 您可以在任何能够访问该集群的远程主机上执行备份操作。但是,pg_dump不能在任何特殊权限下运行,必须具备备份表的读取权限。对应地,您可以使用-n schema-t table选项,以备份该数据库中您能够访问的部分。

  • 需要使用命令行选项-h-p指定pg_dump连接集群地址和端口。如果为空,则使用默认值,其中,-h为本地主机或PGHOST环境变量,-p为默认端口1523。

  • 默认情况下,pg_dump使用与当前操作系统用户名同名的数据库用户连接集群。如需使用其他数据库用户,请增加选项-U,或设置环境变量PGUSER

    说明

    pg_dump的连接需要通过客户端认证

通过备份文件恢复数据

前提条件

请提前创建备份文件所需的相关角色,并确认该角色已被授予读取权限。

恢复操作

psql dbname < dumpfile

其中,dbname为已存在的需要恢复数据的目标数据库,dumpfilepg_dump导出的备份文件。

注意事项

  • 默认情况下,遇到SQL错误时恢复操作会继续执行。对于这种场景您可以增加ON_ERROR_STOP变量,在遇到SQL错误时将退出运行并返回当前状态,但是您只能得到一个部分恢复的数据库,请谨慎考虑后使用。

    psql --set ON_ERROR_STOP=on dbname < dumpfile
  • 可通过增加-1--single-transaction选项,将整个恢复作为一个单独的事务运行。在这种模式下,即便是微小的错误也可能导致经过数小时运行后的恢复失败,请谨慎考虑后使用。

  • pg_dumppsql读写管道的能力支持直接跨主机数据恢复。例如:

    pg_dump -h host1 dbname | psql -h host2 dbname

pg_dumpall

pg_dump仅支持备份单个数据库,但不包括角色和表空间信息。对应地,您可以使用pg_dumpall备份整个数据库集群。

# 备份文件
pg_dumpall > dumpfile

# 使用备份文件恢复数据
psql -f dumpfile postgres

注意事项

  • 使用pg_dumpall备份文件恢复数据时,可以指定恢复到任何已存在的数据库。如果备份文件中包含CREATE DATABASE语句,若该数据库已存在会导致数据冲突。如果需要恢复到空集群建议连接到目标集群的postgres库。

  • 使用pg_dumpall备份文件恢复数据时,通常需要以数据库超级用户身份操作,以恢复角色和表空间信息。此外,如备份文件中包含表空间信息,请验证表空间路径在新环境中的有效性。

  • 使用pg_dumpall备份文件时,首先发出命令以重建角色、表空间以及空数据库,然后逐一为每个数据库生成备份。虽然每个数据库的备份是自身一致的,但由于每个数据库备份操作是顺序进行的,因此它们在备份时的状态可能不同(即不完全同步)。

常见问题

大型数据库备份恢复

在存在最大文件尺寸限制的操作系统上,使用pg_dump导出大型输出文件可能会出现异常。然而,pg_dump支持将输出写入标准输出,您可以利用标准Unix工具来处理这一潜在问题。

  • 使用压缩备份。例如gzip

    pg_dump dbname | gzip > filename.gz

    对于此类压缩文件,可选择以下任一方式进行数据解压后恢复:

    • gunzip -c filename.gz | psql dbname
    • cat filename.gz | gunzip | psql dbname
  • 使用split命令,将一个大的文本文件切分成多个指定大小的小文件。例如,将输出文件分割为1 MB的小文件:

    pg_dump dbname | split -b 1m - filename

    对于此类分割后的文件,可通过以下方式进行数据恢复:

    cat filename* | psql dbname
  • 使用pg_dump的自定义备份格式。

    如果集群已安装zlib压缩库,使用自定义备份格式时,数据将在写入输出文件时进行压缩。此类备份文件的大小与使用gzip压缩时大致相当,但一个显著的优势是可以在恢复过程中选择性地恢复特定的表或数据库对象。以下为您展示如何使用自定义备份格式备份一个数据库:

    pg_dump -Fc dbname > filename

    自定义备份格式只能通过pg_restore恢复:

    pg_restore -d dbname filename
说明
  • 对于非常大型的集群备份,可能需要将split与其他两种方法之一结合使用。

  • 相关文档:

加快数据库备份和恢复

为了提高大型数据库的备份速度,可使用pg_dump的并行备份特性,该特性支持同时备份多个表。可增加-j参数控制并行线程数量,需要注意的是并行备份仅支持“目录”归档格式。

pg_dump -j num -F d -f out.dir dbname

其中,num为并行线程数量。

对应的您可以使用pg_restore-j参数实现并行恢复。同时,并行恢复仅适用于“自定义”归档或“目录”归档格式,与备份文件是否由pg_dump -j创建无关。

物理备份

使用原生PostgreSQL提供的物理备份工具pg_basebackup,支持创建整个数据目录的备份。此外,支持将归档的WAL日志与数据备份结合使用,允许在恢复过程中实现按时间点恢复(PITR),可精确到秒级恢复。

语法

pg_basebackup -D /home/polar1/testbackupdir --host=<PolarDB_Endpoint> --port=<PolarDB_Port> -U <user_name> --no-sync --write-recovery-conf --format=tar --gzip -X fetch

其中:

  • -D:指定备份存储的目录。

  • --host:集群地址。

  • --port:集群端口。

  • -U:连接集群的用户。

  • --no-sync:在备份完成后,不强制进行同步写入。该参数可能会提升性能,但在集群发生崩溃时,存在数据丢失的风险。

  • --write-recovery-conf:在备份完成后,生成一个recovery.conf文件,使得在恢复时能够自动应用WAL日志进行时间点恢复(PITR)。

  • --format:备份文件格式。

  • --gzip:使用gzip格式压缩。

  • -X fetch:指定WAL日志文件的处理方式。此处使用fetch,表示在备份过程中从主服务器获取所需的WAL日志,这可以确保在进行时间点恢复时备份的完整。

基础备份恢复

备份

使用pg_basebackup命令进行全量备份,并将备份集以gzip格式压缩,具体命令及示例如下:

pg_basebackup -D /home/polar1/testbackupdir --host=<PolarDB_Endpoint> --port=<PolarDB_Port> -U <user_name> --no-sync --write-recovery-conf --format=tar --gzip -X fetch

恢复

  1. 将物理备份文件解压至恢复节点的本地目录。

    tar -zxvf /home/polar1/testbackupdir/base.tar.gz -C /home/polar1/testrestoredir
  2. 更新postgresql.conf配置文件。

    port = 1525
    recovery_target_action = 'promote'
  3. 更改解压后备份文件目录权限。

    chmod 0700 -R /home/polar1/testbackupdir
  4. 启动数据库。

    pg_ctl start -D /home/polar1/testbackupdir

日志归档

通过设置archive_modearchive_command参数,将日志归档到指定位置。主备服务器均需进行相应设置,并重启数据库以使配置生效。

postgresql.conf配置示例

# 打开日志归档功能
archive_mode = on
# 此处将日志压缩并归档到目录/home/polar1/testarchivedir
archive_command = 'gzip < %p > /home/polar1/testarchivedir/%f.gz'

按时间点恢复(PITR

  1. 启用日志归档功能。

  2. 数据备份。使用pg_basebackup命令进行全量备份,并将备份集以gzip格式进行压缩。

    pg_basebackup -D /home/polar1/testbackupdir --host=<PolarDB_Endpoint> --port=<PolarDB_Port> -U <user_name> --no-sync --write-recovery-conf --format=tar --gzip -X fetch
  3. 在数据恢复的目标数据库中构造数据结构。

    CREATE TABLE test(id int);
    INSERT INTO test VALUES(1);
    INSERT INTO test VALUES(2);
    SELECT now();
                  now              
    -------------------------------
     2024-08-26 08:17:34.432277+00
    (1 row)
    
    INSERT INTO test VALUES(3);
    INSERT INTO test VALUES(4);
  4. 将物理备份文件解压至恢复节点的本地目录。

    tar -zxvf /home/polar1/testbackupdir/base.tar.gz -C /home/polar1/testrestoredir
  5. 更新postgresql.conf配置文件。

    port = 1525
    recovery_target_action = 'promote'
    restore_command = 'gunzip < /home/polar1/testarchivedir/%f.gz > %p'
    recovery_target_time = '2024-08-26 08:17:34.432277 UTC'
    recovery_target_action = 'promote'
  6. 更改解压后备份文件目录权限。

    chmod 0700 -R /home/polar1/testbackupdir
  7. 启动数据库。

    pg_ctl start -D /home/polar1/testbackupdir
  8. 数据恢复结果验证。

    TABLE test;

    返回结果如下,数据恢复至目标时间。

     id 
    ----
      1
      2
    (2 rows)
  • 本页导读 (1)
  • 逻辑备份
  • SQL备份
  • 通过备份文件恢复数据
  • pg_dumpall
  • 常见问题
  • 物理备份
  • 基础备份恢复
  • 日志归档
  • 按时间点恢复(PITR)
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等