备份与恢复

概述

数据备份是保护数据安全的重要手段之一,为了更好的保护数据安全,openGauss数据库支持三种备份恢复类型,以及多种备份恢复方案,备份和恢复过程中提供数据的可靠性保障机制。

备份与恢复类型可分为逻辑备份与恢复、物理备份与恢复、闪回恢复。

  • 逻辑备份与恢复:通过逻辑导出对数据进行备份,逻辑备份只能基于备份时刻进行数据转储,所以恢复时也只能恢复到备份时保存的数据。对于故障点和备份点之间的数据,逻辑备份无能为力,逻辑备份适合备份那些很少变化的数据,当这些数据因误操作被损坏时,可以通过逻辑备份进行快速恢复。如果通过逻辑备份进行全库恢复,通常需要重建数据库,导入备份数据来完成,对于可用性要求很高的数据库,这种恢复时间太长,通常不被采用。由于逻辑备份具有平台无关性,所以更为常见的是,逻辑备份被作为一个数据迁移及移动的主要手段。

  • 物理备份与恢复:通过物理文件拷贝的方式对数据库进行备份,以磁盘块为基本单位将数据从主机复制到备机。通过备份的数据文件及归档日志等文件,数据库可以进行完全恢复。物理备份速度快,一般被用作对数据进行备份和恢复,用于全量备份的场景。通过合理规划,可以低成本进行备份与恢复。

  • 闪回恢复:利用回收站的闪回恢复删除的表。数据库的回收站功能类似于windows系统的回收站,将删除的表信息保存到回收站中。利用MVCC机制闪回恢复到指定时间点或者CSN点。

    以下为openGauss支持的三类数据备份恢复方案,备份方案也决定了当异常发生时该如何恢复。

    表 1 三种备份恢复类型对比

    备份类型

    应用场景

    支持的介质

    工具名称

    恢复时间

    优缺点

    逻辑备份与恢复

    适合于数据量小的场景。

    可以备份单表和多表,单database和所有database。备份后的数据需要使用gsql或者gs_restore工具恢复。数据量大时,恢复需要较长时间。

    磁盘

    SSD

    gs_dump

    纯文本格式数据恢复时间长。归档格式数据恢复时间中等。

    导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。导出的格式可选择纯文本格式或者归档格式。纯文本格式的数据只能通过gsql进行恢复,恢复时间较长。归档格式的数据只能通过gs_restore进行恢复,恢复时间较纯文本格式短。

    gs_dumpall

    数据恢复时间长。

    导出所有数据库相关信息工具,它可以导出openGauss数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据、以及openGauss所有数据库公共的全局对象。

    只能导出纯文本格式的数据,导出的数据只能通过gsql进行恢复,恢复时间较长。

    物理备份与恢复

    适用于数据量大的场景,主要用于全量数据备份恢复,也可对整个数据库中的WAL归档日志和运行日志进行备份。

    gs_backup

    数据量小数据恢复时间快。

    导出数据库相关信息的OM工具,可以导出数据库参数文件和二进制文件。帮助openGauss备份、恢复重要数据、显示帮助信息和版本号信息。在进行备份时,可以选择备份内容的类型,在进行还原时,需要保证各节点备份目录中存在备份文件。在数据库实例恢复时,通过静态配置文件中的数据库实例信息进行恢复。只恢复参数文件恢复时间较短。

    gs_basebackup

    恢复时可以直接拷贝替换原有的文件, 或者直接在备份的库上启动数据库,恢复时间快。

    对服务器数据库文件的二进制进行全量拷贝,只能对数据库某一个时间点的时间作备份。结合PITR恢复,可恢复全量备份时间点后的某一时间点。

    gs_probackup

    恢复时可以直接恢复到某个备份点,在备份的库上启动数据库,恢复时间快。

    gs_probackup是一个用于管理openGauss数据库备份和恢复的工具。它对openGauss 实例进行定期备份。可用于备份单机数据库或者数据库实例主节点,为物理备份。 可备份外部目录的内容,如脚本文件、配置文件、日志文件、dump文件等。 支持增量备份、定期备份和远程备份。增量备份时间相对于全量备份时间比较短,只需要备份修改的文件。当前默认备份是数据目录,如果表空间不在数据目录,需要手动指定备份的表空间目录进行备份。当前只支持在主机上执行备份。

    闪回恢复

    适用于:

    1)误删除表的场景;

    2)需要将表中的数据恢复到指定时间点或者CSN。

    可以将表的状态恢复到指定时间点或者是表结构删除前的状态,恢复时间快。

    闪回技术能够有选择性的高效撤销一个已提交事务的影响,从人为错误中恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。

    闪回支持两种恢复模式:

    • 基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN点。
    • 基于类似windows系统回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误DROP、误TRUNCATE的表找回。

    当需要进行备份恢复操作时,主要从以下四个方面考虑数据备份方案。

    • 备份对业务的影响在可接受范围。

    • 数据库恢复效率。

      为尽量减小数据库故障的影响,要使恢复时间减到最少,从而使恢复的效率达到最高。

    • 数据可恢复程度。

      当数据库失效后,要尽量减少数据损失。

    • 数据库恢复成本。

    在现网选择备份策略时参考的因素比较多,如备份对象、数据大小、网络配置等,表2列出了可用的备份策略和每个备份策略的适用场景。

    表 2 备份策略典型场景

    备份策略

    关键性能因素

    典型数据量

    性能规格

    数据库实例备份

    • 数据大小
    • 网络配置

    数据:PB级

    对象:约100万个

    备份:

    • 每个主机80 Mbit/s(NBU/EISOO+磁盘)
    • 约90%磁盘I/O速率(SSD/HDD)

    表备份

    • 表所在模式
    • 网络配置(NBU)

    数据:10 TB级

    备份:基于查询性能速度+I/O速度

    说明:

    多表备份时,备份耗时计算方式:

    1. 总时间 = 表数量 x 起步时间 + 数据总量 / 数据备份速度

    其中:

    • 磁盘起步时间为5s左右,NBU起步时间比DISK长(取决于NBU部署方案)。
    • 数据备份速度为单节点50MB/s左右(基于1GB大小的表,物理机备份到本地磁盘得出此速率)。

    表越小,备份性能更低。

物理备份恢复

gs_backup

背景信息

openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs_backup工具帮助openGauss备份、恢复重要数据、显示帮助信息和版本号信息。

前提条件

  • 可以正常连接openGauss数据库。
  • 在进行还原时,需要保证各节点备份目录中存在备份文件。
  • 需以操作系统用户omm执行gs_backup命令。

语法

  • 备份数据库主机

    1. gs_backup -t backup --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE]
  • 恢复数据库主机

    1. gs_backup -t restore --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE] [--force]
  • 显示帮助信息

    1. gs_backup -? | --help
  • 显示版本号信息

    1. gs_backup -V | --version

参数说明

gs_backup参数可以分为如下几类:

  • 备份数据库主机参数:

    • -h

      指定存储备份文件的主机名称。

      取值范围:主机名称。如果不指定主机名称,则备份当前数据库实例。

    • –backup-dir=BACKUPDIR

      备份文件保存路径。

    • –parameter

      备份参数文件,不指定–parameter、–binary、–all参数时默认只备份参数文件。

    • –binary

      备份app目录下的二进制文件。

    • –all

      备份app目录下的二进制文件、pg_hba.conf和postgsql.conf文件。

    • -l

      指定日志文件及存放路径。

      默认值:$GAUSSLOG/om/gs_backup-YYYY-MM-DD_hhmmss.log

  • 恢复数据库主机参数:

    • -h

      指定需要恢复主机的名称。

      取值范围:主机名称。如果不指定主机,则恢复对应的备份节点。

    • –backup-dir=BACKUPDIR

      恢复文件提取路径。

    • –parameter

      恢复参数文件,不指定–parameter、–binary、–all参数时默认只恢复参数文件。

    • –binary

      恢复二进制文件。

    • –all

      恢复二进制和参数文件。

    • -l

      指定日志文件及存放路径。

      默认值:$GAUSSLOG/om/gs_backup-YYYY-MM-DD_hhmmss.log

    • –force

      节点的静态文件丢失后强行restore,仅限–all 或者–binary一起使用时才生效。

  • 其他参数:

    • -?, –help

      显示帮助信息。

    • -V, –version

      显示版本号信息。

    • -t

      指定操作类型。

      取值范围:backup 或者 restore。

示例

  • 使用gs_backup脚本备份数据库主机。

    1. gs_backup -t backup --backup-dir=/opt/software/gaussdb/backup_dir -h plat1 --parameter
    2. Backing up openGauss.
    3. Parsing configuration files.
    4. Successfully parsed the configuration file.
    5. Performing remote backup.
    6. Remote backup succeeded.
    7. Successfully backed up openGauss.
  • 使用gs_backup脚本恢复数据库主机。

    1. gs_backup -t restore --backup-dir=/opt/software/gaussdb/backup_dir -h plat1 --parameter
    2. Restoring openGauss.
    3. Parsing the configuration file.
    4. Successfully parsed configuration files.
    5. Performing remote restoration.
    6. Remote restoration succeeded.
    7. Successfully restored openGauss.

gs_basebackup

背景信息

openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs_basebackup工具做基础的物理备份。gs_basebackup的实现目标是对服务器数据库文件的二进制进行拷贝,其实现原理使用了复制协议。远程执行gs_basebackup时,需要使用系统管理员账户。gs_basebackup当前支持热备份模式和压缩格式备份。

备份与恢复 - 图1 说明:

  • gs_basebackup仅支持主机和备机的全量备份,不支持增量。
  • gs_basebackup当前支持热备份模式和压缩格式备份。
  • gs_basebackup在备份包含绝对路径的表空间时,如果在同一台机器上进行备份,可以通过tablespace-mapping重定向表空间路径,或使用归档模式进行备份。
  • 若打开增量检测点功能且打开双写,gs_basebackup也会备份双写文件。
  • 若pg_xlog目录为软链接,备份时将不会建立软链接,会直接将数据备份到目的路径的pg_xlog目录下。
  • 备份过程中收回用户备份权限,可能导致备份失败或者备份数据不可用。
  • 如果因为网络临时故障等原因导致Server端无应答,gs_basebackup将在最长等待120秒后退出。

前提条件

  • 可以正常连接openGauss数据库。

  • 备份过程中用户权限没有被回收。

  • pg_hba.conf中需要配置允许复制链接,且该连接必须由一个系统管理员建立。

  • 如果xlog传输模式为stream模式,需要配置max_wal_senders的数量, 至少有一个可用。

  • 如果xlog传输模式为fetch模式,有必要把wal_keep_segments参数设置得足够高,这样在备份末尾之前日志不会被移除。

  • 在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝。

语法

  • 显示帮助信息

    1. gs_basebackup -? | --help
  • 显示版本号信息

    1. gs_basebackup -V | --version

参数说明

gs_basebackup参数可以分为如下几类:

  • -D directory

    备份文件输出的目录,必选项。

  • 常用参数:

    • -c,–checkpoint=fast|spread

      设置检查点模式为fast或者spread(默认)。

    • -l,–label=LABEL

      为备份设置标签。

    • -P,–progress

      启用进展报告。

    • -v, –verbose

      启用冗长模式。

    • -V, –version

      打印版本后退出。

    • -?,–help

      显示gs_basebackup命令行参数。

    • -T,–tablespace-mapping=olddir=newdir

      在备份期间将目录olddir中的表空间重定位到newdir中。为使之有效,olddir必须正好匹配表空间所在的路径(但如果备份中没有包含olddir中的表空间也不是错误)。olddir和newdir必须是绝对路径。如果一个路径凑巧包含了一个=符号,可用反斜线对它转义。对于多个表空间可以多次使用这个选项。

    • -F,–format=plain|tar

      设置输出格式为plain(默认)或者tar。没有设置该参数的情况下,默认–format=plain。plain格式把输出写成平面文件,使用和当前数据目录和表空间相同的布局。当集簇没有额外表空间时,整个数据库将被放在目标目录中。如果集簇包含额外的表空间,主数据目录将被放置在目标目录中,但是所有其他表空间将被放在它们位于服务器上的相同的绝对路径中。tar模式将输出写成目标目录中的 tar 文件。主数据目录将被写入到一个名为base.tar的文件中,并且其他表空间将被以其 OID 命名。生成的tar包,需要用gs_tar命令解压。

    • -X, –xlog-method=fetch|stream

      设置xlog传输方式。没有设置该参数的情况下,默认–xlog-method=stream。在备份中包括所需的预写式日志文件(WAL文件)。这包括所有在备份期间产生的预写式日志。fetch方式在备份末尾收集预写式日志文件。因此,有必要把wal_keep_segments参数设置得足够高,这样在备份末尾之前日志不会被移除。如果在要传输日志时它已经被轮转,备份将失败并且是不可用的。stream方式在备份被创建时流传送预写式日志。这将开启一个到服务器的第二连接并且在运行备份时并行开始流传输预写式日志。因此,它将使用最多两个由max_wal_senders参数配置的连接。只要客户端能保持接收预写式日志,使用这种模式不需要在主控机上保存额外的预写式日志。

    • -x,

      –xlog 使用这个选项等效于和方法fetch一起使用-X。

    • -Z –compress=level

      启用对 tar 文件输出的 gzip 压缩,并且制定压缩级别(0 到 9,0 是不压缩,9 是最佳压缩)。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。

    • -z

      启用对 tar 文件输出的 gzip 压缩,使用默认的压缩级别。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。

    • -t,–rw-timeout

      设置备份期间checkpoint的时间限制,默认限制时间为120s。当数据库全量checkpoint耗时较长时,可以适当增大rw-timeout限制时间。

  • 连接参数

    • -h, –host=HOSTNAME

      指定正在运行服务器的主机名或者Unix域套接字的路径。

    • -p,–port=PORT

      指定数据库服务器的端口号。

      可以通过port参数修改默认端口号。

    • -U,–username=USERNAME

      指定连接数据库的用户。

    • -s, –status-interval=INTERVAL

      发送到服务器的状态包的时间(以秒为单位)。

    • -w,–no-password

      不出现输入密码提示。

    • -W, –password

      当使用-U参数连接本地数据库或者连接远端数据库时,可通过指定该选项出现输入密码提示。

示例

  1. gs_basebackup -D /home/test/trunk/install/data/backup -h 127.0.0.1 -p 21233
  2. INFO: The starting position of the xlog copy of the full build is: 0/1B800000. The slot minimum LSN is: 0/1B800000.

从备份文件恢复数据

当数据库发生故障时需要从备份文件进行恢复。因为gs_basebackup是对数据库按二进制进行备份,因此恢复时可以直接拷贝替换原有的文件,或者直接在备份的库上启动数据库。

备份与恢复 - 图2 说明:

  • 若当前数据库实例正在运行,直接从备份文件启动数据库可能会存在端口冲突,这时需要修改配置文件的port参数,或者在启动数据库时指定一下端口。
  • 若当前备份文件为主备数据库,可能需要修改一下主备之间的复制连接。即配置文件中的postgre.conf中的replconninfo1、 replconninfo2等。
  • 若配置文件postgresql.conf的参数data_directory打开且有配置,当使用备份目录启动数据库时候,data_directory和备份目录不同会导致启动失败。可以修改data_directory的值为新的数据目录,或者注释掉该参数。

若要在原库的地方恢复数据库,参考步骤如下:

  1. 停止数据库服务器, 具体操作请参见《管理员指南》。
  2. 将原数据库和所有表空间复制到另外一个位置,以备后面需要。
  3. 清理原库中的所有或部分文件。
  4. 使用数据库系统用户权限从备份中还原需要的数据库文件。
  5. 若数据库中存在链接文件,需要修改使其链接到正确的文件。
  6. 重启数据库服务器,并检查数据库内容,确保数据库已经恢复到所需的状态。

备份与恢复 - 图3 说明:

  • 暂不支持备份文件增量恢复。
  • 恢复后需要检查数据库中的链接文件是否链接到正确的文件。

PITR恢复

背景信息

当数据库崩溃或希望回退到数据库之前的某一状态时,openGauss的即时恢复功能(Point-In-Time Recovery,简称PITR)可以支持恢复到备份归档数据之后的任意时间点。

备份与恢复 - 图4 说明:

  • PITR仅支持恢复到物理备份数据之后的某一时间点。
  • 仅主节点可以进行PITR恢复,备机需要进行全量build达成与主机数据同步。

前提条件

  • 基于经过物理备份的全量数据文件。
  • 基于已归档的WAL日志文件。

PITR恢复流程

  1. 将物理备份的文件替换目标数据库目录。
  2. 删除数据库目录下pg_xlog/中的所有文件。
  3. 将归档的WAL日志文件复制到pg_xlog文件中(此步骤可以省略,通过配置recovery.conf恢复命令文件中的restore_command项替代)。
  4. 在数据库目录下创建恢复命令文件recovery.conf,指定数据库恢复的程度。
  5. 启动数据库。
  6. 连接数据库,查看是否恢复到希望预期的状态。
  7. 若已经恢复到预期状态,通过pg_xlog_replay_resume()指令使主节点对外提供服务。

recovery.conf文件配置

归档恢复配置

  • restore_command = string

这个SHELL命令是获取WAL文件系列中已归档的WAL文件。字符串中的任何一个%f是用归档检索中的文件名替换, 并且%p是用服务器上的复制目的地的路径名替换。 任意一个%r是用包含最新可用重启点的文件名替换。

示例:

  1. restore_command = 'cp /mnt/server/archivedir/%f %p'
  • archive_cleanup_command = string

这个选项参数声明一个shell命令。在每次重启时会执行这个shell命令。 archive_cleanup_command为清理备库不需要的归档WAL文件提供一个机制。 任何一个%r由包含最新可用重启点的文件名代替。这是最早的文件,因此必须保留以允许恢复能够重新启动,因此所有早于%r的文件可以安全的移除。

示例:

  1. archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'

需要注意的是,如果多个备服务器从相同的归档路径恢复时, 需要确保在任何一个备服务器在需要之前,不能删除WAL文件。

  • recovery_end_command = string

这个参数是可选的,用于声明一个只在恢复完成时执行的SHELL命令。recovery_end_command是为以后的复制或恢复提供一个清理机制。

恢复目标设置

  • recovery_target_name = string

此参数声明命名还原到一个使用pg_create_restore_point()创建的还原点。

示例:

  1. recovery_target_name = 'restore_point_1'
  • recovery_target_time = timestamp

此参数声明命名还原到一个指定时间戳。

示例:

  1. recovery_target_time = '2020-01-01 12:00:00'
  • recovery_target_xid = string

这个参数声明还原到一个事务ID。

示例:

  1. recovery_target_xid = '3000'
  • recovery_target_lsn = string

这个参数声明还原到日志的指定LSN点。

示例:

  1. recovery_target_lsn = '0/0FFFFFF'
  • recovery_target_inclusive = boolean

声明是否在指定恢复目标(true)之后停止,或在这(false)之前停止。改声明仅支持恢复目标为recovery_target_time、recovery_target_xid和recovery_target_lsn的配置。

示例:

  1. recovery_target_inclusive = true

备份与恢复 - 图5 说明:

  • recovery_target_name、recovery_target_time、recovery_target_xid、recovery_target_lsn这四个配置项仅同时支持一项。

  • 如果不配置任何恢复目标,或配置目标不存在,则默认恢复到最新的WAL日志点。

gs_probackup

背景信息

gs_probackup是一个用于管理openGauss数据库备份和恢复的工具。它对openGauss实例进行定期备份,以便在数据库出现故障时能够恢复服务器。

  • 可用于备份单机数据库,也可对主机或者主节点数据库备机进行备份,为物理备份。
  • 可备份外部目录的内容,如脚本文件、配置文件、日志文件、dump文件等。
  • 支持增量备份、定期备份和远程备份。
  • 可设置备份的留存策略。

前提条件

  • 可以正常连接openGauss数据库。
  • 若要使用PTRACK增量备份,需在postgresql.conf中手动添加参数“enable_cbm_tracking = on”。
  • 为了防止xlog在传输结束前被清理,请适当调高postgresql.conf文件中wal_keep_segments的值。

限制说明

  • 备份必须由运行数据库服务器的用户执行。
  • 备份和恢复的数据库服务器的主版本号必须相同。
  • 如果要通过ssh在远程模式下备份数据库,需要在本地和远程主机安装相同主版本的数据库,并通过ssh-copy-id remote_user@remote_host命令设置本地主机备份用户和远程主机数据库用户的无密码ssh连接。
  • 远程模式下只能执行add-instance、backup、restore子命令。
  • 使用restore子命令前,应先停止gaussdb进程。
  • 当存在用户自定义表空间时,备份的时候要加上 –external-dirs 参数,否则,该表空间不会被备份。
  • 当备份的规模比较大时,为了防止备份过程中timeout发生,请适当调整postgresql.conf文件的参数 session_timeout、wal_sender_timeout。并且在备份的命令行参数中适当调整参数–rw-timeout的值。
  • 恢复时,使用-T选项把备份中的外部目录重定向到新目录时,请同时指定参数–external-mapping。
  • 增量备份恢复后,之前创建的逻辑复制槽不可用,需删除重建。
  • 当使用远程备份时,请确保远程机器和备份机器的时钟同步,以防止使用–recovery-target-time恢复的场合,启动gaussdb时有可能会失败。
  • 当远程备份有效时(remote-proto=ssh),请确保-h和–remote-host指定的是同一台机器。当远程备份无效时,如果指定了-h选项,请确保-h指定的是本机地址或本机主机名。
  • 当前暂不支持备份逻辑复制槽。

命令说明

  • 打印gs_probackup版本。

    1. gs_probackup -V|--version
    2. gs_probackup version
  • 显示gs_probackup命令的摘要信息。如果指定了gs_probackup的子命令,则显示可用于此子命令的参数的详细信息。

    1. gs_probackup -?|--help
    2. gs_probackup help [command]
  • 初始化备份路径_backup-path_中的备份目录,该目录将存储已备份的内容。如果备份路径_backup-path_已存在,则_backup-path_必须为空目录。

    1. gs_probackup init -B backup-path [--help]
  • 在备份路径_backup-path_内初始化一个新的备份实例,并生成pg_probackup.conf配置文件,该文件保存了指定数据目录_pgdata-path_的gs_probackup设置。

    1. gs_probackup add-instance -B backup-path -D pgdata-path --instance=instance_name
    2. [-E external-directories-paths]
    3. [remote_options] [dss_options]
    4. [--help]
  • 在备份路径_backup-path_内删除指定实例相关的备份内容。

    1. gs_probackup del-instance -B backup-path --instance=instance_name
    2. [--help]
  • 将指定的连接、压缩、日志等相关设置添加到pg_probackup.conf配置文件中,或修改已设置的值。不推荐手动编辑pg_probackup.conf配置文件。

    1. gs_probackup set-config -B backup-path --instance=instance_name
    2. [-D pgdata-path] [-E external-directories-paths] [--archive-timeout=timeout]
    3. [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth]
    4. [--compress-algorithm=compress-algorithm] [--compress-level=compress-level]
    5. [-d dbname] [-h hostname] [-p port] [-U username]
    6. [logging_options] [remote_options] [dss_options]
    7. [--help]
  • 将备份相关设置添加到backup.control配置文件中,或修改已设置的值。

    1. gs_probackup set-backup -B backup-path --instance=instance_name -i backup-id
    2. [--note=text] [pinning_options]
    3. [--help]
  • 显示位于备份目录中的pg_probackup.conf配置文件的内容。可以通过指定–format=json选项,以json格式显示。默认情况下,显示为纯文本格式。

    1. gs_probackup show-config -B backup-path --instance=instance_name
    2. [--format=plain|json]
    3. [--help]
  • 显示备份目录的内容。如果指定了instance_name和backup_id,则显示该备份的详细信息。可以通过指定–format=json选项,以json格式显示。默认情况下,备份目录的内容显示为纯文本格式。

    1. gs_probackup show -B backup-path
    2. [--instance=instance_name [-i backup-id]] [--archive] [--format=plain|json]
    3. [--help]
  • 创建指定实例的备份。

    1. gs_probackup backup -B backup-path --instance=instance_name -b backup-mode
    2. [-D pgdata-path] [-C] [-S slot-name] [--temp-slot] [--backup-pg-log] [-j threads_num] [--progress]
    3. [--no-validate] [--skip-block-validation] [-E external-directories-paths] [--no-sync] [--note=text]
    4. [--archive-timeout=timeout] [-t rwtimeout]
    5. [logging_options] [retention_options] [compression_options] [connection_options]
    6. [remote_options] [dss_options] [pinning_options][--backup-pg-replslot]
    7. [--help]
  • 从备份目录_backup-path_中的备份副本恢复指定实例。如果指定了恢复目标选项,gs_probackup将查找最近的备份并将其还原到指定的恢复目标。否则,使用最近一次备份。

    1. gs_probackup restore -B backup-path --instance=instance_name
    2. [-D pgdata-path] [-i backup_id] [-j threads_num] [--progress] [--force] [--no-sync] [--no-validate] [--skip-block-validation]
    3. [--external-mapping=OLDDIR=NEWDIR] [-T OLDDIR=NEWDIR] [--skip-external-dirs] [-I incremental_mode]
    4. [recovery_options] [remote_options] [dss_options] [logging_options]
    5. [--help]
  • 将指定的增量备份与其父完全备份之间的所有增量备份合并到父完全备份。父完全备份将接收所有合并的数据,而已合并的增量备份将作为冗余被删除。

    1. gs_probackup merge -B backup-path --instance=instance_name -i backup_id
    2. [-j threads_num] [--progress] [logging_options]
    3. [--help]
  • 删除指定备份,或删除不满足当前保留策略的备份。

    1. gs_probackup delete -B backup-path --instance=instance_name
    2. [-i backup-id | --delete-expired | --merge-expired | --status=backup_status]
    3. [--delete-wal] [-j threads_num] [--progress]
    4. [--retention-redundancy=retention-redundancy] [--retention-window=retention-window]
    5. [--wal-depth=wal-depth] [--dry-run]
    6. [logging_options]
    7. [--help]
  • 验证恢复数据库所需的所有文件是否存在且未损坏。如果未指定_instance_name_,gs_probackup将验证备份目录中的所有可用备份。如果指定_instance_name_而不指定任何附加选项,gs_probackup将验证此备份实例的所有可用备份。如果指定了_instance_name_并且指定_backup-id_或恢复目标相关选项,gs_probackup将检查是否可以使用这些选项恢复数据库。

    1. gs_probackup validate -B backup-path
    2. [--instance=instance_name] [-i backup-id]
    3. [-j threads_num] [--progress] [--skip-block-validation]
    4. [--recovery-target-time=time | --recovery-target-xid=xid | --recovery-target-lsn=lsn | --recovery-target-name=target-name]
    5. [--recovery-target-inclusive=boolean]
    6. [logging_options]
    7. [--help]

参数说明

通用参数

  • command

    gs_probackup除version和help以外的子命令:init、add-instance、del-instance、set-config、set-backup、show-config、show、backup、restore、merge、delete、validate。

  • -?, –help

    显示gs_probackup命令行参数的帮助信息,然后退出。

    子命令中只能使用–help,不能使用-?。

  • -V, –version

    打印gs_probackup版本,然后退出。

  • -B backup-path, –backup-path=backup-path

    备份的路径。

    系统环境变量:$BACKUP_PATH

  • -D pgdata-path, –pgdata=pgdata-path

    数据目录的路径。

    系统环境变量:$PGDATA

  • –instance=instance_name

    实例名。

  • -i backup-id, –backup-id=backup-id

    备份的唯一标识。

  • –format=format

    指定显示备份信息的格式,支持plain和json格式。

    默认值:plain

  • –status=backup_status

    删除指定状态的所有备份,包含以下状态:

    • OK:备份已完成且有效。
    • DONE:备份已完成但未经过验证。
    • RUNNING:备份正在进行中。
    • MERGING:备份正在合并中。
    • DELETING:备份正在删除中。
    • CORRUPT:部分备份文件已损坏。
    • ERROR:由于意外错误,备份失败。
    • ORPHAN:由于其父备份之一已损坏或丢失,备份无效。
  • -j threads_num, –threads=threads_num

    设置备份、还原、合并进程的并行线程数。

  • –archive

    显示WAL归档信息。

  • –progress

    显示进度。

  • –note=text

    给备份添加note。

dss模式下添加实例相关参数

  • –enable-dss

    开启dss模式。

  • –instance-id

    数据库节点id号,因为dss模式只支持主机备份,因此该参数一般为0。

  • –vgname

    dss模式下数据库使用的卷的卷名。

  • –socketpath

    dss进程socket文件路径。

备份相关参数

  • -b backup-mode, –backup-mode=backup-mode

    指定备份模式,支持FULL和PTRACK。

    FULL:创建全量备份,全量备份包含所有数据文件。

    PTRACK:创建PTRACK增量备份。

  • -C, –smooth-checkpoint

    将检查点在一段时间内展开。默认情况下,gs_probackup会尝试尽快完成检查点。

  • -S slot-name, –slot=slot-name

    指定WAL流处理的复制slot。

  • –temp-slot

    在备份的实例中为WAL流处理创建一个临时物理复制slot,它确保在备份过程中,所有所需的WAL段仍然是可用的。

    默认的slot名为pg_probackup_slot,可通过选项–slot/-S更改。

  • –backup-pg-log

    将日志目录包含到备份中。此目录通常包含日志消息。默认情况下包含日志目录,但不包含日志文件。如果修改了默认的日志路径,需要备份日志文件时可使用-E参数进行备份,使用方法见下文。

  • -E external-directories-paths, –external-dirs=external-directories-paths

    将指定的目录包含到备份中。此选项对于备份位于数据目录外部的脚本、sql转储和配置文件很有用。如果要备份多个外部目录,请在Unix上用冒号分隔它们的路径。

    例如:-E /tmp/dir1:/tmp/dir2

  • –skip-block-validation

    关闭块级校验,加快备份速度。

  • –no-validate

    在完成备份后跳过自动验证。

  • –no-sync

    不将备份文件同步到磁盘。

  • –archive-timeout=timeout

    以秒为单位设置流式处理的超时时间。

    默认值:300

  • -t rwtimeout

    以秒为单位的连接的超时时间。

    默认值: 120

恢复相关参数

  • -I, –incremental-mode=none|checksum|lsn

    若PGDATA中可用的有效页没有修改,则重新使用它们。

    默认值:none

  • –external-mapping=OLDDIR=NEWDIR

    在恢复时,将包含在备份中的外部目录从_OLDDIR_重新定位到_NEWDIR_目录。_OLDDIR_和_NEWDIR_都必须是绝对路径。如果路径中包含“=”,则使用反斜杠转义。此选项可为多个目录多次指定。

  • -T OLDDIR=NEWDIR, –tablespace-mapping=OLDDIR=NEWDIR

    在恢复时,将表空间从_OLDDIR_重新定位到_NEWDIR_目录。_OLDDIR_和_NEWDIR_必须都是绝对路径。如果路径中包含“=”,则使用反斜杠转义。多个表空间可以多次指定此选项。此选项必须和–external-mapping一起使用。

  • –skip-external-dirs

    跳过备份中包含的使用–external-dirs选项指定的外部目录。这些目录的内容将不会被恢复。

  • –skip-block-validation

    跳过块级校验,以加快验证速度。在恢复之前的自动验证期间,将仅做文件级别的校验。

  • –no-validate

    跳过备份验证。

  • –force

    允许忽略备份的无效状态。如果出于某种原因需要从损坏的或无效的备份中恢复数据,可以使用此标志。请谨慎使用。

恢复目标相关参数(recovery_options)

备份与恢复 - 图6 说明: 当前不支持配置连续的WAL归档的PITR,因而使用这些参数会有一定限制,具体如下描述。 如果需要使用持续归档的WAL日志进行PITR恢复,请按照下面描述的步骤:

  1. 将物理备份的文件替换目标数据库目录。
  2. 删除数据库目录下pg_xlog/中的所有文件。
  3. 将归档的WAL日志文件复制到pg_xlog文件中(此步骤可以省略,通过配置recovery.conf恢复命令文件中的restore_command项替代)。
  4. 在数据库目录下创建恢复命令文件recovery.conf,指定数据库恢复的程度。
  5. 启动数据库。
  6. 连接数据库,查看是否恢复到希望预期的状态。若已经恢复到预期状态,通过pg_xlog_replay_resume()指令使主节点对外提供服务。
  • –recovery-target-lsn=lsn

    指定要恢复到的lsn,当前只能指定备份的stop lsn。

  • –recovery-target-name=target-name

    指定要将数据恢复到的已命名的保存点,保存点可以通过查看备份中recovery-name字段得到。

  • –recovery-target-time=time

    指定要恢复到的时间,当前只能指定备份中的recovery-time。

  • –recovery-target-xid=xid

    指定要恢复到的事务ID,当前只能指定备份中的recovery-xid。

  • –recovery-target-inclusive=boolean

    当该参数指定为true时,恢复目标将包括指定的内容。

    当该参数指定为false时,恢复目标将不包括指定的内容。

    该参数必须和–recovery-target-name、–recovery-target-time、–recovery-target-lsn或–recovery-target-xid一起使用。

留存相关参数(retention_options)

备份与恢复 - 图7 说明: 可以和backup和delete命令一起使用这些参数。

  • –retention-redundancy=retention-redundancy

    指定在数据目录中留存的完整备份数。必须为正整数。0表示禁用此设置。

    默认值:0

  • –retention-window=retention-window

    指定留存的天数。必须为正整数。0表示禁用此设置。

    默认值:0

  • –wal-depth=wal-depth

    每个时间轴上必须留存的执行PITR能力的最新有效备份数。必须为正整数。0表示禁用此设置。

    默认值:0

  • –delete-wal

    从任何现有的备份中删除不需要的WAL文件。

  • –delete-expired

    删除不符合pg_probackup.conf配置文件中定义的留存策略的备份。

  • –merge-expired

    将满足留存策略要求的最旧的增量备份与其已过期的父备份合并。

  • –dry-run

    显示所有可用备份的当前状态,不删除或合并过期备份。

固定备份相关参数(pinning_options)

备份与恢复 - 图8 说明: 如果要将某些备份从已建立的留存策略中排除,可以和backup和set-backup命令一起使用这些参数。

  • –ttl=interval

    指定从恢复时间开始计算,备份要固定的时间量。必须为正整数。0表示取消备份固定。

    支持的单位:ms, s, min, h, d(默认为s)。

    例如:–ttl=30d。

  • –expire-time=time

    指定备份固定失效的时间戳。必须是ISO-8601标准的时间戳。

    例如:–expire-time=’2020-01-01 00:00:00+03’

日志相关参数(logging_options)

日志级别:verbose、log、info、warning、error和off。

  • –log-level-console=log-level-console

    设置要发送到控制台的日志级别。每个级别都包含其后的所有级别。级别越高,发送的消息越少。指定off级别表示禁用控制台日志记录。

    默认值:info

  • –log-level-file=log-level-file

    设置要发送到日志文件的日志级别。每个级别都包含其后的所有级别。级别越高,发送的消息越少。指定off级别表示禁用日志文件记录。

    默认值:off

  • –log-filename=log-filename

    指定要创建的日志文件的文件名。文件名可以使用strftime模式,因此可以使用%-escapes指定随时间变化的文件名。

    例如,如果指定了“pg_probackup-%u.log”模式,则pg_probackup为每周的每一天生成单独的日志文件,其中%u替换为相应的十进制数字,即pg_probackup-1.log表示星期一;pg_probackup-2.log表示星期二,以此类推。

    如果指定了–log-level-file参数启用日志文件记录,则该参数有效。

    默认值:“pg_probackup.log”

  • –error-log-filename=error-log-filename

    指定仅用于error日志的日志文件名。指定方式与–log-filename参数相同。

    此参数用于故障排除和监视。

  • –log-directory=log-directory

    指定创建日志文件的目录。必须是绝对路径。此目录会在写入第一条日志时创建。

    默认值:$BACKUP_PATH/log

  • –log-rotation-size=log-rotation-size

    指定单个日志文件的最大大小。如果达到此值,则启动gs_probackup命令后,日志文件将循环,但help和version命令除外。0表示禁用基于文件大小的循环。

    支持的单位:KB、MB、GB、TB(默认为KB)。

    默认值:0

  • –log-rotation-age=log-rotation-age

    单个日志文件的最大生命周期。如果达到此值,则启动gs_probackup命令后,日志文件将循环,但help和version命令除外。$BACKUP_PATH/log/log_rotation目录下保存最后一次创建日志文件的时间。0表示禁用基于时间的循环。

    支持的单位:ms, s, min, h, d(默认为min)。

    默认值:0

连接相关参数(connection_options)

备份与恢复 - 图9 说明: 可以和backup命令一起使用这些参数。

  • -d dbname, –pgdatabase=dbname

    指定要连接的数据库名称。该连接仅用于管理备份进程,因此您可以连接到任何现有的数据库。如果命令行、PGDATABASE环境变量或pg_probackup.conf配置文件中没有指定此参数,则gs_probackup会尝试从PGUSER环境变量中获取该值。如果未设置PGUSER变量,则从当前用户名获取。

    系统环境变量:$PGDATABASE

  • -h hostname, –pghost=hostname

    指定运行服务器的系统的主机名。如果该值以斜杠开头,则被用作到Unix域套接字的路径。

    系统环境变量:$PGHOST

    默认值:local socket

  • -p port, –pgport=p\_ort_

    指定服务器正在侦听连接的TCP端口或本地Unix域套接字文件扩展名。

    系统环境变量:$PGPORT

    默认值:5432

  • -U username, –pguser=username

    指定所连接主机的用户名。

    系统环境变量:$PGUSER

  • -w, –no-password

    不出现输入密码提示。如果主机要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。

  • -W password, –password=password

    指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,则会提示用户输入密码。

压缩相关参数(compression_options)

备份与恢复 - 图10 说明: 可以和backup命令一起使用这些参数。

  • –compress-algorithm=compress-algorithm

    指定用于压缩数据文件的算法。

    取值包括zlib、pglz和none。如果设置为zlib或pglz,此选项将启用压缩。默认情况下,压缩功能处于关闭状态。

    默认值:none

  • –compress-level=compress-level

    指定压缩级别。取值范围:0~9

    • 0表示无压缩。
    • 1表示压缩比最小,处理速度最快。
    • 9表示压缩比最大,处理速度最慢。
    • 可与–compress-algorithm选项一起使用。

    默认值:1

  • –compress

    以–compress-algorithm=zlib和–compress-level=1进行压缩。

远程模式相关参数(remote_options)

备份与恢复 - 图11 说明: 通过SSH远程运行gs_probackup操作的相关参数。可以和add-instance、set-config、backup、restore命令一起使用这些参数。

  • –remote-proto=protocol

    指定用于远程操作的协议。目前只支持SSH协议。取值包括:

    ssh:通过SSH启用远程备份模式。这是默认值。

    none:显式禁用远程模式。

    如果指定了–remote-host参数,可以省略此参数。

  • –remote-host=destination

    指定要连接的远程主机的IP地址或主机名。

  • –remote-port=port

    指定要连接的远程主机的端口号。

    默认值:22

  • –remote-user=username

    指定SSH连接的远程主机用户。如果省略此参数,则使用当前发起SSH连接的用户。

    默认值:当前用户

  • –remote-path=path

    指定gs_probackup在远程系统的安装目录。

    默认值:当前路径

  • –remote-libpath=libpath

    指定gs_probackup在远程系统安装的lib库目录。

  • –ssh-options=ssh_options

    指定SSH命令行参数的字符串。

    例如:–ssh-options=’-c cipher_spec -F configfile’

    备份与恢复 - 图12 说明:

    • 如果因为网络临时故障等原因导致server端无应答,gs_probackup将在等待archive-timeout(默认300秒)后退出。

    • 如果备机lsn与主机有差别时,数据库会不停地刷以下log信息,此时应重新build备机。

      1. LOG: walsender thread shut down
      2. LOG: walsender thread started
      3. LOG: received wal replication command: IDENTIFY_VERSION
      4. LOG: received wal replication command: IDENTIFY_MODE
      5. LOG: received wal replication command: IDENTIFY_SYSTEM
      6. LOG: received wal replication command: IDENTIFY_CONSISTENCE 0/D0002D8
      7. LOG: remote request lsn/crc: [xxxxx] local max lsn/crc: [xxxxx]

备份流程

  1. 初始化备份目录。在指定的目录下创建backups/和wal/子目录,分别用于存放备份文件和WAL文件。

    1. gs_probackup init -B backup_dir
  2. 添加一个新的备份实例。gs_probackup可以在同一个备份目录下存放多个数据库实例的备份。

    1. gs_probackup add-instance -B backup_dir -D data_dir --instance instance_name
  3. 创建指定实例的备份。在进行增量备份之前,必须至少创建一次全量备份。

    1. gs_probackup backup -B backup_dir --instance instance_name -b backup_mode
  4. 从指定实例的备份中恢复数据。

    1. gs_probackup restore -B backup_dir --instance instance_name -D pgdata-path -i backup_id

故障处理

问题描述

原因和解决方案

ERROR: query failed: ERROR: canceling statement due to conflict with recovery

(错误:查询失败:由于与恢复操作冲突,正在取消语句命令)

原因:在备机上执行的操作正在访问存储行,主机上更改或者删除了对应的行,并将xlog在备机上重放,迫使备机上操作取消。

解决方案:

1. 适当增加如下配置参数的值

max_standby_archive_delay

max_standby_streaming_delay

2. 增加如下配置

hot_standby_feedback = on

逻辑备份恢复

gs_dump

背景信息

gs_dump是openGauss用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等),回收站对象除外。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。

gs_dump工具由操作系统用户omm执行。

gs_dump工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。

gs_dump工具支持导出完整一致的数据。例如,T1时刻启动gs_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出。

gs_dump时生成列不会被转储。

gs_dump支持导出兼容v1版本数据库的文本格式文件。

gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。

  • 纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过gsql运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。
  • 归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见表1。该导出结果必须与gs_restore配合使用来恢复数据库,gs_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。

主要功能

gs_dump可以创建四种不同的导出文件格式,通过**[-F或者–format=]**选项指定,具体如表1所示。

表 1 导出文件格式

格式名称

-F的参数值

说明

建议

对应导入工具

纯文本格式

p

纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。

小型数据库,一般推荐纯文本格式。

使用gsql工具恢复数据库对象前,可根据需要使用文本编辑器编辑纯文本导出文件。

自定义归档格式

c

一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。

中型或大型数据库,推荐自定义归档格式。

使用gs_restore可以选择要从自定义归档/目录归档/tar归档导出文件中导入相应的数据库对象。

目录归档格式

d

该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。

-

tar归档格式

t

tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。

-

备份与恢复 - 图13 说明:

可以使用gs_dump程序将文件压缩为目录归档或自定义归档导出文件,减少导出文件的大小。生成目录归档或自定义归档导出文件时,默认进行中等级别的压缩。gs_dump程序无法压缩已归档导出文件。

注意事项

  • 禁止修改-F c/d/t 格式导出的文件和内容,否则可能无法恢复成功。对于-F p 格式导出的文件,如有需要,可根据需要谨慎编辑导出文件。
  • 为了保证数据一致性和完整性,gs_dump会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定–lock-wait-timeout选项,自定义等待锁超时时间。
  • 不支持加密导出存储过程和函数。

语法

  1. gs_dump [OPTION]... [DBNAME]

备份与恢复 - 图14 说明:

“DBNAME”前面不需要加短或长选项。“DBNAME指定要连接的数据库。 例如: 不需要-d,直接指”DBNAME”。

  1. gs_dump -p port_number postgres -f dump1.sql

或者

  1. export PGDATABASE=postgres
  1. gs_dump -p port_number -f dump1.sql

环境变量: PGDATABASE

参数说明

通用参数:
  • -f, –file=FILENAME

    将输出发送至指定文件或目录。如果省略该参数,则使用标准输出。如果输出格式为(-F c/-F d/-F t)时,必须指定-f参数。如果-f的参数值含有目录,要求当前用户对该目录具有读写权限,并且不能指定已有目录。

  • -F, –format=c|d|t|p

    选择输出格式。格式如下:

    • p|plain:输出一个文本SQL脚本文件(默认)。

    • c|custom:输出一个自定义格式的归档,并且以目录形式输出,作为gs_restore输入信息。该格式是最灵活的输出格式,因为能手动选择,而且能在恢复过程中将归档项重新排序。该格式默认状态下会被压缩。

    • d|directory:该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。

    • t|tar:输出一个tar格式的归档形式,作为gs_restore输入信息。tar格式与目录格式兼容;tar格式归档形式在提取过程中会生成一个有效的目录格式归档形式。但是,tar格式不支持压缩且对于单独表有8GB的大小限制。此外,表数据项的相应排序在恢复过程中不能更改。

  • -v, –verbose

    指定verbose模式。该选项将导致gs_dump向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。

  • -V, –version

    打印gs_dump版本,然后退出。

  • -Z, –compress=0-9

    指定使用的压缩比级别。

    取值范围:0~9

    • 0表示无压缩。
    • 1表示压缩比最小,处理速度最快。
    • 9表示压缩比最大,处理速度最慢。

    针对自定义归档格式,该选项指定单个表数据片段的压缩,默认方式是以中等级别进行压缩。tar归档格式和纯文本格式目前不支持压缩。

  • –lock-wait-timeout=TIMEOUT

    请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement_timeout的格式指定超时时间。

  • -?, –help

    显示gs_dump命令行参数帮助,然后退出。

转储参数:
  • -a, –data-only

    只输出数据,不输出模式(数据定义)。转储表数据、大对象和序列值。

  • -b, –blobs

    该参数为扩展预留接口,不建议使用。

  • -c, –clean

    在将创建数据库对象的指令输出到备份文件之前,先将清理(删除)数据库对象的指令输出到备份文件中。(如果目标数据库中没有任何对象,gs_restore工具可能会输出一些提示性的错误信息)

    该选项只对文本格式有意义。针对归档格式,可以调用gs_restore时指定选项。

  • -C, –create

    备份文件以创建数据库和连接到创建的数据库的命令开始。(如果命令脚本是这种方式执行,可以先指定任意数据库用于执行创建数据库的命令,数据不会恢复到指定的数据库中,而是恢复到创建的数据库中。)

    该选项只对文本格式有意义。针对归档格式,可以在调用gs_restore时指定选项。

  • -E, –encoding=ENCODING

    以指定的字符集编码创建转储。默认情况下,以数据库编码创建转储。(得到相同结果的另一个办法是将环境变量“PGCLIENTENCODING”设置为所需的转储编码。)

  • -n, –schema=SCHEMA

    只转储与模式名称匹配的模式,此选项包括模式本身和所有它包含的对象。如果该选项没有指定,所有在目标数据库中的非系统模式将会被转储。写入多个-n选项来选择多个模式。此外,根据gsql的\d命令所使用的相同规则,模式参数可被理解成一个pattern,所以多个模式也可以通过在该pattern中写入通配符来选择。使用通配符时,注意给pattern打引号,防止shell扩展通配符。

    备份与恢复 - 图15 说明:

    • 当-n已指定时,gs_dump不会转储已选模式所附着的任何其他数据库对象。因此,无法保证某个指定模式的转储结果能够自行成功地储存到一个空数据库中。
    • 当-n指定时,非模式对象不会被转储。

    转储支持多个模式的转储。多次输入-n schemaname转储多个模式。

    例如:

    1. gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -n sch1 -n sch2

    在上面这个例子中,sch1和sch2会被转储。

  • -N, –exclude-schema=SCHEMA

    不转储任何与模式pattern匹配的模式。pattern将参照针对-n的相同规则来理解。可以通过输入多次-N,不转储与任何pattern匹配的模式。

    当同时输入-n和-N时,会转储与至少一个-n选项匹配、与-N选项不匹配的模式。如果有-N没有-n,则不转储常规转储中与-N匹配的模式。

    转储过程支持排除多个模式。

    在转储过程中,输入-N exclude schema name排除多个模式。

    例如:

    1. gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -N sch1 -N sch2

    在上面这个例子中,sch1和sch2在转储过程中会被排除。

  • -o, –oids

    转储每个表的对象标识符(OIDs),作为表的一部分数据。该选项用于应用以某种方式参照了OID列的情况。如果不是以上这种情况,请勿使用该选项。

  • -O, –no-owner

    不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs_dump会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的数据库对象的归属。如果脚本正在运行,该语句不会执行成功,除非是由系统管理员触发(或是拥有脚本中所有对象的同一个用户)。通过指定-O,编写一个任何用户都能存储的脚本,且该脚本会授予该用户拥有所有对象的权限。

    该选项只对文本格式有意义。针对归档格式,可以在调用gs_restore时指定选项。

  • -s, –schema-only

    只转储对象定义(模式),而非数据。

  • -S, –sysadmin=NAME

    该参数为扩展预留接口,不建议使用。

  • -t, –table=TABLE

    指定转储的表(或视图、或序列、或外表)对象列表,可以使用多个-t选项来选择多个表,也可以使用通配符指定多个表对象。

    当使用通配符指定多个表对象时,注意给pattern打引号,防止shell扩展通配符。

    当使用-t时,-n和-N没有任何效应,这是因为由-t选择的表的转储不受那些选项的影响。

    备份与恢复 - 图16 说明:

    • -t参数选项个数必须小于等于100。
    • 如果-t参数选项个数大于100,建议使用参数–include-table-file来替换。
    • 当-t已指定时,gs_dump不会转储已选表所附着的任何其他数据库对象。因此,无法保证某个指定表的转储结果能够自行成功地储存到一个空数据库中。
    • -t tablename只转储在默认搜索路径中可见的表。-t *.tablename转储数据库下所有模式下的tablename表。-t schema.table转储特定模式中的表。
    • -t tablename不会导出表上的触发器信息。
    • 对于表名中包含大写字母的表,在使用-t参数指定导出时需对表名添加”来导出。如对于表”abC”,导出需指定-t “abC”;如对于表schema.“abC”,导出需指定-t schema.”abC”。

    例如:

    1. gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -t schema1.table1 -t schema2.table2

    在上面这个例子中,schema1.table1和schema2.table2会被转储。

  • –include-table-file=FILENAME

    指定需要dump的表文件。

  • -T, –exclude-table=TABLE

    不转储的表(或视图、或序列、或外表)对象列表,可以使用多个-T选项来选择多个表,也可以使用通配符指定多个表对象。

    当同时输入-t和-T时,会转储在-t列表中,而不在-T列表中的表对象。

    例如:

    1. gs_dump -h host_name -p port_number postgres -f backup/bkp_shl2.sql -T table1 -T table2

    在上面这个例子中,table1和table2在转储过程中会被排除。

  • –exclude-table-file=FILENAME

    指定不需要dump的表文件。

    备份与恢复 - 图17 说明:

    • 同–include-table-file,其内容格式如下:

    • schema1.table1

    • schema2.table2 -……

  • -x, –no-privileges|–no-acl

    防止转储访问权限(授权/撤销命令)。

  • -q, –target

    指定导出兼容其他版本数据库的文本文件,目前支持v1和v5参数。v1参数用于导出v5数据库的数据为兼容v1的文本文件。v5参数用于导出v5数据库的数据为v5格式的文本文件,减少了导入v5时的可能的报错情况。

    在使用v1参数时,建议和–exclude-guc=“enable_cluster_resize”,–exclude-function,–exclude-with等选项共用,否则导入到v1时可能报错。

  • -g, –exclude-guc

    该参数为扩展预留接口,不建议使用。

  • –exclude-function

    不导出函数和存储过程。

  • –exclude-with

    导出的表定义,末尾不添加WITH(orientation=row,compression=on)这样的描述。

  • –binary-upgrade

    该参数为扩展预留接口,不建议使用。

  • –binary-upgrade-usermap=“USER1=USER2”

    该参数为扩展预留接口,不建议使用。

  • –column-inserts|–attribute-inserts

    以INSERT命令带列名(INSERT INTO表(列、…)值…)方式导出数据。这会导致恢复缓慢。但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。

  • –disable-dollar-quoting

    该选项将禁止在函数体前使用美元符号$,并强制使用SQL标准字符串语法对其进行引用。

  • –disable-triggers

    该参数为扩展预留接口,不建议使用。

  • –exclude-table-data=TABLE

    指定不转储任何匹配表pattern的表这方面的数据。依照针对-t的相同规则理解该pattern。

    可多次输入–exclude-table-data来排除匹配任何pattern的表。当用户需要特定表的定义但不需要其中的数据时,这个选项很有帮助。

    排除数据库中所有表的数据,参见–schema-only

  • –inserts

    发出INSERT命令(而非COPY命令)转储数据。这会导致恢复缓慢。

    但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。注意:如果重排列顺序,可能会导致整个恢复失败。列顺序改变时,–column-inserts选项不受影响,虽然会更慢。

  • –no-publications

    不转储发布。

  • –no-security-labels

    该参数为扩展预留接口,不建议使用。

  • –no-subscriptions

    不转储订阅。

  • –no-tablespaces

    不输出选择表空间的命令。使用该选项,无论默认表空间是哪个,在恢复过程中所有对象都会被创建。

    该选项只对文本格式有意义。针对归档格式,可以在调用gs_restore时指定选项。

  • –no-unlogged-table-data

    该参数为扩展预留接口,不建议使用。

  • –non-lock-table

    该参数仅供软件间接口调用。

  • –include-alter-table

    转储表删除列。该选项会记录列的删除。

  • –quote-all-identifiers

    强制对所有标识符加引号。为了向后续版本迁移,且其中可能涉及引入额外关键词,在转储相应数据库时该选项会有帮助。

  • –section=SECTION

    指定已转储的名称区段(pre-data、data和post-data)。

  • –serializable-deferrable

    转储过程中使用可串行化事务,以确保所使用的快照与之后的数据库状态一致;要实现该操作需要在无异常状况的事务流中等待某个点,因为这样才能保证转储成功,避免引起其他事务出现serialization_failure要重新再做。

    但是该选项对于灾难恢复没有益处。对于在原始数据库进行升级的时候,加载一个数据库的拷贝作为报告或其他只读加载共享的转储是有帮助的。没有这个选项,转储会反映一个与任何事务最终提交的序列化执行不一致的状态。

    如果当gs_dump启动时,读写事务仍处于非活动状态,即便使用该选项也不会对其产生影响。如果读写事务处于活动状态,转储的开始时间可能会延迟一段不确定的时间。

  • –use-set-session-authorization

    输出符合SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。这样令转储更加符合标准,但是如果转储文件中的对象的历史有些问题,那么可能不能正确恢复。并且,使用SET SESSION AUTHORIZATION的转储需要数据库系统管理员的权限才能转储成功,而ALTER OWNER需要的权限则低得多。

  • –with-encryption=AES128

    指定转储数据需用AES128进行加密。

  • –with-key=KEY

    AES128密钥规则如下:

    • 密钥长度为8~16个字符。
    • 至少包含大写字母(A-Z)、小写字母(a-z)、数字(0-9)、非字母数字字符(限定为~!@#$%^&*()-_=+\|[{}];:,<.>/?)四类字符中的三类字符。

    备份与恢复 - 图18 说明:

    • 使用gs_dump工具进行加密导出时,仅支持plain格式导出。通过-F plain导出的数据,需要通过gsql工具进行导入,且如果以加密方式导入,在通过gsql导入时,需要指定–with-key参数。
    • 不支持加密导出存储过程和函数。
  • –with-salt=RANDVALUES

    gs_dumpall使用此参数传递随机值。

  • –include-extensions

    在转储中包含扩展。

  • –include-depend-objs

    备份结果包含依赖于指定对象的对象信息。该参数需要同-t/–include-table-file参数关联使用才会生效。

  • –exclude-self

    备份结果不包含指定对象自身的信息。该参数需要同-t/–include-table-file参数关联使用才会生效。

  • –pipeline

    使用管道传输密码,禁止在终端使用。

  • –dont-overwrite-file

    文本、tar以及自定义格式情况下会重写现有文件。这对目录格式不适用。

    例如:

    设想这样一种情景,即当前目录下backup.sql已存在。如果在输入命令中输入-f backup.sql选项时,当前目录恰好也生成backup.sql,文件就会被重写。

    如果备份文件已存在,且输入–dont-overwrite-file选项,则会报告附带‘转储文件已经存在’信息的错误。

    1. gs_dump -p port_number postgres -f backup.sql -F plain --dont-overwrite-file

备份与恢复 - 图19 说明:

  • -s/–schema-only和-a/–data-only不能同时使用。
  • -c/–clean和-a/–data-only不能同时使用。
  • –inserts/–column-inserts和-o/–oids不能同时使用,因为INSERT命令不能设置OIDS。
  • –role和–rolepassword必须一起使用。
  • –binary-upgrade-usermap和–binary-upgrade必须一起使用。
  • –include-depend-objs/–exclude-self需要同-t/–include-table-file参数关联使用才会生效。
  • –exclude-self必须同–include-depend-objs一起使用。
连接参数:
  • -h, –host=HOSTNAME

    指定主机名称。如果数值以斜杠开头,则被用作到Unix域套接字的路径。缺省从PGHOST环境变量中获取(如果已设置),否则,尝试一个Unix域套接字连接。

    该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。

    例如:主机名

    环境变量:PGHOST

  • -p, –port=PORT

    指定主机端口。在开启线程池情况下,建议使用 pooler port,即主机端口+1。

    环境变量:PGPORT

  • -U, –username=NAME

    指定所连接主机的用户名。

    不指定连接主机的用户名时,用户默认系统管理员。

    环境变量:PGUSER

  • -w, –no-password

    不出现输入密码提示。如果主机要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。

  • -W, –password=PASSWORD

    指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。

  • –role=ROLENAME

    指定创建转储使用的角色名。选择该选项,会使gs_dump连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs_dump要求的权限时,该选项会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以超系统管理员身份登录,而使用该选项能够在不违反该规定的情况下完成转储。

  • –rolepassword=ROLEPASSWORD

    指定角色名的密码。

说明

如果openGauss有任何本地数据要添加到template1数据库,请谨慎将gs_dump的输出恢复到一个真正的空数据库中,否则可能会因为被添加对象的定义被复制,出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如:

  1. CREATE DATABASE foo WITH TEMPLATE template0;

tar归档形式的文件大小不得超过8GB(tar文件格式的固有限制)。tar文档整体大小和任何其他输出格式没有限制,操作系统可能对此有要求。

由gs_dump生成的转储文件不包含优化程序用来做执行计划决定的统计数据。因此,最好从某转储文件恢复之后运行ANALYZE以确保最佳效果。转储文件不包含任何ALTER DATABASE…SET命令,这些设置由gs_dumpall转储,还有数据库用户和其他完成安装设置。

示例

使用gs_dump转储数据库为SQL文本文件或其它格式的操作,如下所示。

示例中“Bigdata@123”表示数据库用户密码;“backup/MPPDB_backup.sql”表示导出的文件,其中backup表示相对于当前目录的相对目录;“37300”表示数据库服务器端口;“postgres”表示要访问的数据库名。导出操作时,请确保该目录存在并且当前的操作系统用户对其具有读写权限。

示例1:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.sql文件格式为纯文本格式。

  1. gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.sql -p 37300 postgres -F p
  2. gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: The total objects number is 356.
  3. gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: [100.00%] 356 objects have been dumped.
  4. gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: dump database postgres successfully
  5. gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: total time: 1274 ms

使用gsql程序从纯文本导出文件中导入数据。

示例2:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.tar文件格式为tar格式。

  1. gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.tar -p 37300 postgres -F t
  2. gs_dump[port='37300'][postgres][2018-06-27 10:02:24]: The total objects number is 1369.
  3. gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: [100.00%] 1369 objects have been dumped.
  4. gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: dump database postgres successfully
  5. gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: total time: 50086 ms

示例3:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.dmp文件格式为自定义归档格式。

  1. gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup.dmp -p 37300 postgres -F c
  2. gs_dump[port='37300'][postgres][2018-06-27 10:05:40]: The total objects number is 1369.
  3. gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: [100.00%] 1369 objects have been dumped.
  4. gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: dump database postgres successfully
  5. gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: total time: 36620 ms

示例4:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup文件格式为目录格式。

  1. gs_dump -U omm -W Bigdata@123 -f backup/MPPDB_backup -p 37300 postgres -F d
  2. gs_dump[port='37300'][postgres][2018-06-27 10:16:04]: The total objects number is 1369.
  3. gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: [100.00%] 1369 objects have been dumped.
  4. gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: dump database postgres successfully
  5. gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: total time: 33977 ms

示例5:执行gs_dump,导出postgres数据库信息,但不导出/home/MPPDB_temp.sql中指定的表信息。导出的MPPDB_backup.sql文件格式为纯文本格式。

  1. gs_dump -U omm -W Bigdata@123 -p 37300 postgres --exclude-table-file=/home/MPPDB_temp.sql -f backup/MPPDB_backup.sql
  2. gs_dump[port='37300'][postgres][2018-06-27 10:37:01]: The total objects number is 1367.
  3. gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: [100.00%] 1367 objects have been dumped.
  4. gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: dump database postgres successfully
  5. gs_dump[port='37300'][postgres][2018-06-27 10:37:22]: total time: 37017 ms

示例6:执行gs_dump,仅导出依赖于指定表testtable的视图信息。然后创建新的testtable表,再恢复依赖其上的视图。

  • 备份仅依赖于testtable的视图。

    1. gs_dump -s -p 37300 postgres -t PUBLIC.testtable --include-depend-objs --exclude-self -f backup/MPPDB_backup.sql -F p
    2. gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: The total objects number is 331.
    3. gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: [100.00%] 331 objects have been dumped.
    4. gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: dump database postgres successfully
    5. gs_dump[port='37300'][postgres][2018-06-15 14:12:54]: total time: 327 ms
  • 修改testtable名称。

    1. gsql -p 37300 postgres -r -c "ALTER TABLE PUBLIC.testtable RENAME TO testtable_bak;"
  • 创建新的testtable表。

    1. CREATE TABLE PUBLIC.testtable(a int, b int, c int);
  • 还原依赖于testtable的视图。

    1. gsql -p 37300 postgres -r -f backup/MPPDB_backup.sql

gs_dumpall

背景信息

gs_dumpall是openGauss用于导出所有数据库相关信息工具,它可以导出openGauss数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据以及openGauss所有数据库公共的全局对象。

gs_dumpall工具由操作系统用户omm执行。

gs_dumpall工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。

gs_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs_dumpall导出openGauss数据库,那么导出数据结果将会是T1时刻该openGauss数据库的数据状态,T1时刻之后对openGauss的修改不会被导出。

gs_dumpall时生成列不会被转储。

gs_dumpall在导出openGauss所有数据库时分为两部分:

  • gs_dumpall自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组、表空间以及属性(例如,适用于数据库整体的访问权限)信息。
  • gs_dumpall通过调用gs_dump来完成openGauss中各数据库的SQL脚本文件导出,该脚本文件包含将数据库恢复为其保存时的状态所需要的全部SQL语句。

以上两部分导出的结果为纯文本格式的SQL脚本文件,使用gsql运行该脚本文件可以恢复openGauss数据库。

注意事项

  • 禁止修改导出的文件和内容,否则可能无法恢复成功。
  • 为了保证数据一致性和完整性,gs_dumpall会对需要转储的表设置共享锁。如果某张表在别的事务中设置了共享锁,gs_dumpall会等待此表的锁释放后锁定此表。如果无法在指定时间内锁定某张表,转储会失败。用户可以通过指定–lock-wait-timeout选项,自定义等待锁超时时间。
  • 由于gs_dumpall读取所有数据库中的表,因此必须以openGauss管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组以及创建数据库。

语法

  1. gs_dumpall [OPTION]...

参数说明

通用参数:
  • -f, –filename=FILENAME

    将输出发送至指定文件。如果这里省略,则使用标准输出。

  • -v, –verbose

    指定verbose模式。该选项将导致gs_dumpall向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。

  • -V, –version

    打印gs_dumpall版本,然后退出。

  • –lock-wait-timeout=TIMEOUT

    请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement_timeout的格式指定超时时间。

  • -?, –help

    显示gs_dumpall命令行参数帮助,然后退出。

转储参数:
  • -a, –data-only

    只转储数据,不转储模式(数据定义)。

  • -c, –clean

    在重新创建数据库之前,执行SQL语句清理(删除)这些数据库。针对角色和表空间的转储命令已添加。

  • -g, –globals-only

    只转储全局对象(角色和表空间),无数据库。

  • -o, –oids

    转储每个表的对象标识符(OIDs),作为表的一部分数据。该选项用于应用以某种方式参照了OID列的情况。如果不是以上这种情况,请勿使用该选项。

  • -O, –no-owner

    不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs_dumpall会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的模式元素的所属。如果脚本正在运行,该语句不会执行成功,除非是由系统管理员触发(或是拥有脚本中所有对象的同一个用户)。通过指定-O,编写一个任何用户都能存储的脚本,且该脚本会授予该用户拥有所有对象的权限。

  • -r, –roles-only

    只转储角色,不转储数据库或表空间。

  • -s, –schema-only

    只转储对象定义(模式),而非数据。

  • -S, –sysadmin=NAME

    该参数为扩展预留接口,不建议使用。。

  • -t, –tablespaces-only

    只转储表空间,不转储数据库或角色。

  • -x, –no-privileges

    防止转储访问权限(授权/撤销命令)。

  • –column-inserts|–attribute-inserts

    以INSERT命令带列名(INSERT INTO表(列、…)值…)方式导出数据。这会导致恢复缓慢。但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。

  • –disable-dollar-quoting

    该选项将禁止在函数体前使用美元符号$,并强制使用SQL标准字符串语法对其进行引用。

  • –disable-triggers

    该参数为扩展预留接口,不建议使用。

  • –inserts

    发出INSERT命令(而非COPY命令)转储数据。这会导致恢复缓慢。注意:如果重排列顺序,可能会导致恢复整个失败。–column-inserts选项更加安全,虽然可能更慢些。

  • –no-security-labels

    该参数为扩展预留接口,不建议使用。

  • –no-tablespaces

    请勿输出创建表空间的命令,也请勿针对对象选择表空间。使用该选项,无论默认表空间是哪个,在恢复过程中所有对象都会被创建。

  • –no-publications

    不转储发布。

  • –no-security-labels

    该参数为扩展预留接口,不建议使用。

  • –no-subscriptions

    不转储订阅。

  • –include-alter-table

    导出表中已删除的列信息。

  • –quote-all-identifiers

    强制对所有标识符加引号。为了向后续版本迁移,且其中可能涉及引入额外关键词,在转储相应数据库时该选项会有帮助。

  • –dont-overwrite-file

    不重写当前文件。

  • –use-set-session-authorization

    输出符合SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。这样令转储更加符合标准,但是如果转储文件中的对象的历史有些问题,那么可能不能正确恢复。并且,使用SET SESSION AUTHORIZATION的转储需要数据库系统管理员的权限才能转储成功,而ALTER OWNER需要的权限则低得多。

  • –with-encryption=AES128

    指定转储数据需用AES128进行加密。

  • –with-key=KEY

    AES128密钥规则如下:

    • 密钥长度为8~16个字符。
    • 至少包含大写字母(A-Z),小写字母(a-z),数字(0-9),非字母数字字符(限定为~!@#$%^&*()-_=+\|[{}];:,<.>/?)四类字符中的三类字符。
  • –include-extensions

    如果include-extensions参数被设置,将备份所有的CREATE EXTENSION语句。

  • –include-templatedb

    转储过程中包含模板库。

  • –binary-upgrade

    该参数为扩展预留接口,不建议使用。

  • –binary-upgrade-usermap=“USER1=USER2”

    该参数为扩展预留接口,不建议使用。

  • –non-lock-table

    该参数仅供软件间接口调用。

  • –tablespaces-postfix

    该参数为扩展预留接口,不建议使用。

  • –parallel-jobs

    指定备份进程并发数,取值范围为1~1000。

  • –pipeline

    使用管道传输密码,禁止在终端使用。

备份与恢复 - 图20 说明:

  • -g/–globals-only和-r/–roles-only不能同时使用。
  • -g/–globals-only和-t/–tablespaces-only不能同时使用。
  • -r/–roles-only和-t/–tablespaces-only不能同时使用。
  • -s/–schema-only和-a/–data-only不能同时使用。
  • -r/–roles-only和-a/–data-only不能同时使用。
  • -t/–tablespaces-only和-a/–data-only不能同时使用。
  • -g/–globals-only和-a/–data-only不能同时使用。
  • –tablespaces-postfix和–binary-upgrade必须一起使用。
  • –binary-upgrade-usermap和–binary-upgrade必须一起使用。
  • –parallel-jobs和-f/–file必须一起使用。

连接参数:

  • -h, –host=HOSTNAME

    指定主机的名称。如果取值是以斜线开头,它将用作Unix域套接字的目录。默认值取自PGHOST环境变量;如果没有设置,将启动某个Unix域套接字建立连接。

    该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。

    环境变量:PGHOST

  • -l, –database=DATABASENAME

    指定所连接的转储全局对象的数据库名称,并去寻找还有其他哪些数据库需要被转储。如果没有指定,会使用postgres数据库,如果postgres数据库不存在,会使用template1。

  • -p, –port=PORT

    指定服务器所侦听的TCP端口或本地Unix域套接字后缀,以确保连接。默认值设置为PGPORT环境变量。

    在开启线程池情况下,建议使用 pooler port,即侦听端口+1。

    环境变量:PGPORT

  • -U, –username=NAME

    所连接的用户名。

    环境变量:PGUSER

  • -w, –no-password

    不出现输入密码提示。如果服务器要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。

  • -W, –password=PASSWORD

    指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。

  • –role=ROLENAME

    指定创建转储使用的角色名。选择该选项,会使gs_dumpall连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs_dumpall要求的权限时,该选项会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以系统管理员身份登录,而使用该选项能够在不违反该规定的情况下完成转储。

  • –rolepassword=ROLEPASSWORD

    指定具体角色用户的角色密码。

说明

由于gs_dumpall内部调用gs_dump,所以一些诊断信息参见gs_dump。

一旦恢复,最好在每个数据库上运行ANALYZE,优化程序提供有用的统计数据。

gs_dumpall恢复前需要所有必要的表空间目录为空;否则,对于处在非默认位置的数据库,数据库创建会失败。

示例

使用gs_dumpall一次导出openGauss的所有数据库。

备份与恢复 - 图21 说明:

gs_dumpall仅支持纯文本格式导出。所以只能使用gsql恢复gs_dumpall导出的转储内容。

  1. gs_dumpall -f backup/bkp2.sql -p 37300
  2. gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:09]: The total objects number is 2371.
  3. gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:35]: [100.00%] 2371 objects have been dumped.
  4. gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:46]: dump database dbname='postgres' successfully
  5. gs_dump[port='37300'][dbname='postgres'][2018-06-27 09:55:46]: total time: 55567 ms
  6. gs_dumpall[port='37300'][2018-06-27 09:55:46]: dumpall operation successful
  7. gs_dumpall[port='37300'][2018-06-27 09:55:46]: total time: 56088 ms

gs_restore

背景信息

gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可由gs_dump生成的导出文件进行导入。

gs_restore工具由操作系统用户omm执行。

主要功能包含:

  • 导入到数据库

    如果连接参数中指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接的密码。导入时生成列会自动更新,并像普通列一样保存。

  • 导入到脚本文件

    如果未指定导入数据库,则创建包含重建数据库所必须的SQL语句脚本并写入到文件或者标准输出。等效于直接使用gs_dump导出为纯文本格式。

命令格式

  1. gs_restore [OPTION]... FILE

备份与恢复 - 图22 说明:

  • FILE没有短选项或长选项。用来指定归档文件所处的位置。
  • 作为前提条件,需输入dbname或-l选项。不允许用户同时输入dbname和-l选项。
  • gs_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常,在进行导入时,建议使用“-c”参数,在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象。
  • 日志打印无开关,若需隐藏日志,请将日志重定向到日志文件。若恢复表数据时,数据量很大,会分批恢复,因此会多次出现“表数据已完成导入”的日志。

参数说明

通用参数:
  • -d, –dbname=NAME

    连接数据库dbname并直接导入到该数据库中。

  • -f, –file=FILENAME

    指定生成脚本的输出文件,或使用-l时列表的输出文件。

    默认是标准输出。

    备份与恢复 - 图23 说明:

    -f不能同-d一起使用。

  • -F, –format=c|d|t

    指定归档格式。由于gs_restore会自动决定格式,因此不需要指定格式。

    取值范围:

    • c/custom:该归档形式为gs_dump的自定义格式。
    • d/directory:该归档形式是一个目录归档形式。
    • t/tar:该归档形式是一个tar归档形式。
  • -l, –list

    列出归档形式内容。这一操作的输出可用作-L选项的输入。注意如果像-n或-t的过滤选项与-l使用,过滤选项将会限制列举的项目(即归档形式内容)。

  • -v, –verbose

    指定verbose模式。

  • -V, –version

    打印gs_restore版本,然后退出。

  • -?, –help

    显示gs_restore命令行参数帮助,然后退出。

导入参数:
  • -a, –data-only

    只导入数据,不导入模式(数据定义)。gs_restore的导入是以追加方式进行的。

  • -c, –clean

    在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象。

  • -C, –create

    导入数据库之前会先使用CREATE DATABASE创建数据库。(指定该选项后,-d指定的数据库仅用以执行CREATE DATABASE命令,所有数据依然会导入到创建的数据库中。)

  • -e, –exit-on-error

    当发送SQL语句到数据库时如果出现错误,请退出。默认状态下会继续,且在导入后会显示一系列错误信息。

  • -I, –index=NAME

    只导入已列举的index的定义。允许导入多个index。如果多次输入-I index导入多个index。

    例如:

    1. gs_restore -h host_name -p port_number -d postgres -I Index1 -I Index2 backup/MPPDB_backup.tar

    在上面这个例子中,Index1和Index2会被导入。

  • -j, –jobs=NUM

    运行gs_restore最耗时的部分(如加载数据、创建index或创建约束)使用并发任务。该选项能大幅缩短导入时间,即将一个大型数据库导入到某一多处理器的服务器上。

    每个任务可能是一个进程或一个线程,这由操作系统决定。每个任务与服务器进行单独连接。

    该选项的最优值取决于服务器的硬件设置、客户端以及网络。还包括这些因素,如CPU核数量、硬盘设置。建议是从增加服务器上的CPU核数量入手,更大的值(服务器上CPU核数量)在很多情况下也能导致数据文件更快的被导入。当然,过高的值会由于超负荷反而导致性能降低。

    该选项只支持自定义归档格式。输入文件必须是常规文件(不能是像pipe的文件)。如果是通过脚本文件,而非直接连接数据库服务器,该选项可忽略。而且,多任务不能与–single-transaction选项一起使用。

  • -L, –use-list=FILENAME

    只导入列举在list-file中的那些归档形式元素,导入顺序以它们在文件中的顺序为准。注意如果像-n或-t的过滤选项与-L使用,它们将会进一步限制导入的项目。

    一般情况下,list-file是通过编辑前面提到的某个-l参数的输出创建的。文件行的位置可更改或直接删除,也可使用分号(;)在行的开始注出。

  • -n, –schema=NAME

    只导入已列举的模式中的对象。

    该选项可与-t选项一起用以导入某个指定的表。

    多次输入-n _schemaname_可以导入多个模式。

    例如:

    1. gs_restore -h host_name -p port_number -d postgres -n sch1 -n sch2 backup/MPPDB_backup.tar

    在上面这个例子中,sch1和sch2会被导入。

  • -O, –no-owner

    不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs_restore会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的模式元素的所属。除非是由系统管理员(或是拥有脚本中所有对象的同一个用户)进行数据库首次连接的操作,否则语句会失败。使用-O选项,任何用户名都可用于首次连接,且该用户拥有所有已创建的对象。

  • -P, –function=NAME(args)

    只导入已列举的函数。请按照函数所在转储文件中的目录,准确拼写函数名称和参数。

    当-P单独使用时,表示导入文件中所有’function-name(args)’函数;当-P同-n一起使用时,表示导入指定模式下的’function-name(args)’函数;多次输入-P,而仅指定一次-n,表示所有导入的函数默认都是位于-n模式下的。

    可以多次输入-n schema-name -P ‘function-name(args)’同时导入多个指定模式下的函数。

    例如:

    1. gs_restore -h host_name -p port_number -d postgres -n test1 -P 'Func1(integer)' -n test2 -P 'Func2(integer)' backup/MPPDB_backup.tar

    在上面这个例子中,test1模式下的函数Func1(i integer)和test2模式下的函数Func2(j integer)会被一起导入。

  • -s, –schema-only

    只导入模式(数据定义),不导入数据(表内容)。当前的序列值也不会导入。

  • -S, –sysadmin=NAME

    该参数为扩展预留接口,不建议使用。

  • -t, –table=NAME

    只导入已列举的表定义、数据或定义和数据。该选项与-n选项同时使用时,用来指定某个模式下的表对象。-n参数不输入时,默认为PUBLIC模式。多次输入-n <schemaname> -t <tablename>可以导入指定模式下的多个表。

    例如:

    导入PUBLIC模式下的table1

    1. gs_restore -h host_name -p port_number -d postgres -t table1 backup/MPPDB_backup.tar

    导入test1模式下的test1和test2模式下test2

    1. gs_restore -h host_name -p port_number -d postgres -n test1 -t test1 -n test2 -t test2 backup/MPPDB_backup.tar

    导入PUBLIC模式下的table1和test1 模式下test1

    1. gs_restore -h host_name -p port_number -d postgres -n PUBLIC -t table1 -n test1 -t table1 backup/MPPDB_backup.tar

    备份与恢复 - 图24 说明:

    -t不支持schema_name.table_name的,指定此格式不会报错,但不会生效。

  • -T, –trigger=NAME

    该参数为扩展预留接口。

  • -x, –no-privileges/–no-acl

    防止导入访问权限(GRANT/REVOKE命令)。

  • -1, –single-transaction

    执行导入作为一个单独事务(即把命令包围在BEGIN/COMMIT中)。

    该选项确保要么所有命令成功完成,要么没有改变应用。该选项意为–exit-on-error。

  • –disable-triggers

    该参数为扩展预留接口,不建议使用。

  • –no-data-for-failed-tables

    默认状态下,即使创建表的命令失败(如表已经存在),表数据仍会被导入。使用该选项,像这种表的数据会被跳过。如果目标数据库已包含想要的表内容,这种行为会有帮助。

    该选项只有在直接导入到某数据库中时有效,不针对生成SQL脚本文件输出。

  • –no-publications

    不导入发布。

  • –no-security-labels

    该参数为扩展预留接口,不建议使用。

  • –no-subscriptions

    不导入订阅。

  • –no-tablespaces

    不输出选择表空间的命令。使用该选项,无论默认表空间是哪个,在导入过程中所有对象都会被创建。

  • –section=SECTION

    导入已列举的区段(如pre-data、data或post-data)。

  • –use-set-session-authorization

    该选项用来进行文本格式的备份。

    输出SET SESSION AUTHORIZATION命令,而非ALTER OWNER命令,用以决定对象归属。该选项使转储更加兼容标准,但通过参考转储中对象的记录,导入过程可能会有问题。使用SET SESSION AUTHORIZATION的转储要求必须是系统管理员,同时在导入前还需参考“SET SESSION AUTHORIZATION”,手工对导出文件的密码进行修改验证,只有这样才能进行正确的导入操作,相比之下,ALTER OWNER对权限要求较低。

  • –pipeline

    使用管道传输密码,禁止在终端使用。

备份与恢复 - 图25 须知:

  • 如果安装过程中有任何本地数据要添加到template1数据库,请谨慎将gs_restore的输出载入到一个真正的空数据库中;否则可能会因为被添加对象的定义被复制,而出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如:
  1. CREATE DATABASE foo WITH TEMPLATE template0;
  • gs_restore不能选择性地导入大对象;例如只能导入那些指定表的对象。如果某个归档形式包含大对象,那所有大对象都会被导入或一个都不会被导入。如果此归档对象通过-L、-t或其他选项被排除,那么所有大对象一个都不会被导入。

备份与恢复 - 图26 说明:

    1. -d/–dbname 和 -f/–file 不能同时使用。
    1. -s/–schema-only 和 -a/–data-only不能同时使用。
    1. -c/–clean 和 -a/–data-only不能同时使用。
    1. 使用–single-transaction时,-j/–jobs必须为单任务。
    1. –role 和 –rolepassword必须一起使用。

连接参数:

  • -h, –host=HOSTNAME

    指定的主机名称。如果取值是以斜线开头,他将用作Unix域套接字的目录。默认值取自PGHOST环境变量;如果没有设置,将启动某个Unix域套接字建立连接。

    该参数只针对openGauss外,对openGauss内本机只能用127.0.0.1。

    环境变量:PGHOST

  • -p, –port=PORT

    指定服务器所侦听的TCP端口或本地Unix域套接字后缀,以确保连接。默认值设置为PGPORT环境变量。

    在开启线程池情况下,建议使用 pooler port,即侦听端口+1。

    环境变量:PGPORT

  • -U, –username=NAME

    所连接的用户名。

    环境变量:PGUESR

  • -w, –no-password

    不出现输入密码提示。如果服务器要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。

  • -W, –password=PASSWORD

    指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W参数;如果没有-W参数,并且不是系统管理员,“gs_restore”会提示用户输入密码。

  • –role=ROLENAME

    指定导入操作使用的角色名。选择该参数,会使gs_restore连接数据库后,发起一个SET ROLE角色名命令。当所授权用户(由-U指定)没有gs_restore要求的权限时,该参数会起到作用,即切换到具备相应权限的角色。某些安装操作规定不允许直接以初始用户身份登录,而使用该参数能够在不违反该规定的情况下完成导入。

  • –rolepassword=ROLEPASSWORD

    指定具体角色用户的角色密码。

示例

特例:执行gsql程序,使用如下选项导入由gs_dump/gs_dumpall生成导出文件夹(纯文本格式)的MPPDB_backup.sql文件到postgres数据库。

  1. gsql -d postgres -p 15400 -W Bigdata@123 -f /home/omm/test/MPPDB_backup.sql
  2. SET
  3. SET
  4. SET
  5. SET
  6. SET
  7. ALTER TABLE
  8. ALTER TABLE
  9. ALTER TABLE
  10. ALTER TABLE
  11. ALTER TABLE
  12. CREATE INDEX
  13. CREATE INDEX
  14. CREATE INDEX
  15. SET
  16. CREATE INDEX
  17. REVOKE
  18. REVOKE
  19. GRANT
  20. GRANT
  21. total time: 30476 ms

gs_restore用来导入由gs_dump生成的导出文件。

示例1:执行gs_restore,将导出的MPPDB_backup.dmp文件(自定义归档格式)导入到postgres数据库。

  1. gs_restore -W Bigdata@123 backup/MPPDB_backup.dmp -p 15400 -d postgres
  2. restore operation successful
  3. total time: 13053 ms

示例2:执行gs_restore,将导出的MPPDB_backup.tar文件(tar格式)导入到postgres数据库。

  1. gs_restore backup/MPPDB_backup.tar -p 15400 -d postgres
  2. restore operation successful
  3. total time: 21203 ms

示例3:执行gs_restore,将导出的MPPDB_backup文件(目录格式)导入到postgres数据库。

  1. gs_restore backup/MPPDB_backup -p 15400 -d postgres
  2. restore operation successful
  3. total time: 21003 ms

示例4:执行gs_restore,使用自定义归档格式的MPPDB_backup.dmp文件来进行如下导入操作。 导入PUBLIC模式下所有对象的定义和数据。在导入时会先删除已经存在的对象,如果原对象存在跨模式的依赖则需手工强制干预。

  1. gs_restore backup/MPPDB_backup.dmp -p 15400 -d postgres -e -c -n PUBLIC
  2. Error while PROCESSING TOC:
  3. Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba
  4. could not execute query: ERROR: cannot drop table table1 because other objects depend on it
  5. DETAIL: view t1.v1 depends on table table1
  6. HINT: Use DROP ... CASCADE to drop the dependent objects too.
  7. Command was: DROP TABLE IF EXISTS public.table1;

手工删除依赖,导入完成后再重新创建。

  1. gs_restore backup/MPPDB_backup.dmp -p 15400 -d postgres -e -c -n PUBLIC
  2. restore operation successful
  3. total time: 2203 ms

示例5:执行gs_restore,使用自定义归档格式的MPPDB_backup.dmp文件来进行如下导入操作。只导入PUBLIC模式下表table1的定义。

  1. gs_restore backup/MPPDB_backup.dmp -p 15400 -d postgres -e -c -s -n PUBLIC -t table1
  2. restore operation successful
  3. total time: 21000 ms

示例6:执行gs_restore,使用自定义归档格式的MPPDB_backup.dmp文件来进行如下导入操作。只导入PUBLIC模式下表table1的数据。

  1. gs_restore backup/MPPDB_backup.dmp -p 15400 -d postgres -e -a -n PUBLIC -t table1
  2. restore operation successful
  3. total time: 20203 ms

闪回恢复

闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。

备份与恢复 - 图27 说明:

ASTORE引擎暂不支持闪回DROP/TRUNCATE。

闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。

闪回查询

背景信息

闪回查询可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。

前提条件

  • undo_retention_time参数用于设置undo旧版本的保留时间。

语法

  1. {[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
  2. [ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]
  3. [TIMECAPSULE { TIMESTAMP | CSN } expression ]
  4. |( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
  5. |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
  6. |function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
  7. |function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
  8. |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]}

语法树中“TIMECAPSULE {TIMESTAMP | CSN} expression”为闪回功能新增表达方式,其中TIMECAPSULE表示使用闪回功能,TIMESTAMP以及CSN表示闪回功能使用具体时间点信息或使用CSN(commit sequence number)信息。

参数说明

  • TIMESTAMP

    • 指要查询某个表在TIMESTAMP这个时间点上的数据,TIMESTAMP指一个具体的历史时间。
  • CSN

    • 指要查询整个数据库逻辑提交序下某个CSN点的数据,CSN指一个具体逻辑提交时间点,数据库中的CSN为写一致性点,每个CSN代表整个数据库的一个一致性点,查询某个CSN下的数据代表SQL查询数据库在该一致性点的相关数据。

使用示例

  • 示例1:

    1. SELECT * FROM t1 TIMECAPSULE TIMESTAMP to_timestamp ('2020-02-11 10:13:22.724718', 'YYYY-MM-DD HH24:MI:SS.FF');
  • 示例2:

    1. SELECT * FROM t1 TIMECAPSULE CSN 9617;
  • 示例3:

    1. SELECT * FROM t1 AS t TIMECAPSULE TIMESTAMP to_timestamp ('2020-02-11 10:13:22.724718', 'YYYY-MM-DD HH24:MI:SS.FF');
  • 示例4:

    1. SELECT * FROM t1 AS t TIMECAPSULE CSN 9617;

闪回表

背景信息

闪回表可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性可以快速恢复表的数据。闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。

前提条件

  • undo_retention_time参数用于设置undo旧版本的保留时间。

语法

  1. TIMECAPSULE TABLE table_name TO { TIMESTAMP | CSN } expression

使用示例

  1. TIMECAPSULE TABLE t1 TO TIMESTAMP to_timestamp ('2020-02-11 10:13:22.724718', 'YYYY-MM-DD HH24:MI:SS.FF');
  2. TIMECAPSULE TABLE t1 TO CSN 9617;

闪回DROP/TRUNCATE

背景信息

  • 闪回DROP:可以恢复意外删除的表,从回收站(recycle bin)中恢复被删除的表及其附属结构如索引、表约束等。闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。
  • 闪回TRUNCATE:可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。

前提条件

  • 开启enable_recyclebin参数,启用回收站。
  • recyclebin_retention_time参数用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。

相关语法

  • 删除表

    1. DROP TABLE table_name [PURGE]
  • 清理回收站对象

    1. PURGE { TABLE { table_name }
    2. | INDEX { index_name }
    3. | RECYCLEBIN
    4. }
  • 闪回被删除的表

    1. TIMECAPSULE TABLE { table_name } TO BEFORE DROP [RENAME TO new_tablename]
  • 截断表

    1. TRUNCATE TABLE { table_name } [ PURGE ]
  • 闪回截断的表

    1. TIMECAPSULE TABLE { table_name } TO BEFORE TRUNCATE

参数说明

  • DROP/TRUNCATE TABLE table_name PURGE

    • 默认将表数据放入回收站中,PURGE直接清理。
  • PURGE RECYCLEBIN

    • 表示清理回收站对象。
  • TO BEFORE DROP

    使用这个子句检索回收站中已删除的表及其子对象。

    可以指定原始用户指定的表的名称,或对象删除时数据库分配的系统生成名称。

    • 回收站中系统生成的对象名称是唯一的。因此,如果指定系统生成名称,那么数据库检索指定的对象。使用“select * from pg_recyclebin;”语句查看回收站中的内容。

    • 如果指定了用户指定的名称,且如果回收站中包含多个该名称的对象,然后数据库检索回收站中最近移动的对象。如果想要检索更早版本的表,你可以这样做:

      • 指定你想要检索的表的系统生成名称。

      • 执行TIMECAPSULE TABLE … TO BEFORE DROP语句,直到你要检索的表。

  • 恢复DROP表时,只恢复基表名,其他子对象名均保持回收站对象名。用户可根据需要,执行DDL命令手工调整子对象名。

  • 回收站对象不支持DML、DCL、DDL等写操作,不支持DQL查询操作(后续支持)。

  • 闪回点和当前点之间,执行过修改表结构或影响物理结构的语句,闪回失败。涉及namespace、表名改变等操作的DDL执行闪回报错: ERROR: recycle object %s desired does not exis;增加/删除/切割/合成等分区改变等操作的DDL执行闪回报错: ERROR: relation %s does not exis;其他情况报错:“ERROR:The table definition of %s has been changed. ”。

  • RENAME TO

    为从回收站中检索的表指定一个新名称。

  • TO BEFORE TRUNCATE

    闪回到TRUNCATE之前。

语法示例

  1. DROP TABLE t1 PURGE;
  2. PURGE TABLE t1;
  3. PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
  4. PURGE INDEX i1;
  5. PURGE INDEX "BIN$04LhcpndanfgMAAAAAANPw==$0";
  6. PURGE RECYCLEBIN;
  7. TIMECAPSULE TABLE t1 TO BEFORE DROP;
  8. TIMECAPSULE TABLE t1 TO BEFORE DROP RENAME TO new_t1;
  9. TIMECAPSULE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0" TO BEFORE DROP;
  10. TIMECAPSULE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO new_t1;