数据库备份和恢复
数据库备份恢复
概述
AntDB 备份按备份机制分类:
- 逻辑备份:将数据库内的对象、数据以 SQL 语句的形式备份到一个或多个文件内,这种方式称之为逻辑备份
- 物理备份:以物理文件拷贝的方式进行备份,这种称之为物理备份
按备份方式分类:
- 全量备份:每次都备份整个数据库的所有数据
- 增量备份:在一次全量备份的基础之上,每次只备份新增的数据(WAL 日志归档)
逻辑备份
适合场景:
-
仅需备份部分对象或者数据(更精细粒度的备份场景)
-
跨版本的数据迁移
- 数据量比较小的时候(比如测试环境)
- 对数据库恢复时间要求不高
AntDB 的逻辑备份工具:
- adb_dump、adb_dumpall/adb_restore(二进制命令)
- copy(SQL 语句)
adb_dump
命令说明
大纲
adb_dump [connection-option...] [option...] [dbname]
描述
adb_dump 是用于备份一种 AntDB 数据库的工具。即使数据库正在被并发使用,它也能创建一致的备份。adb_dump 不阻塞其他用户访问数据库(读取或写入)。
adb_dump 只转储单个数据库。要备份一个集簇或者集簇中 对于所有数据库公共的全局对象(例如角色和表空间),应使用 adb_dumpall。
转储可以被输出到脚本或归档文件格式。脚本转储是包含 SQL 命令的纯文本文件,它们可以用来重构数据库到它被转储时的状态。
另一种可选的归档文件格式必须与 adb_restore 配合使用来重建数据库。它们允许 adb_restore 能选择恢复什么,或者甚至在恢复之前对条目重排序。归档文件格式被设计为在架构之间可移植。
当使用归档文件格式之一并与 adb_restore 组合时,adb_dump 提供了一种灵活的归档和传输机制。adb_dump可以被用来备份整个数据库,然后 adb_restore 可以被用来检查归档并/或选择数据库的哪些部分要被恢复。最灵活的输出文件格式是“自定义”格式(-Fc
)和“目录”格式(-Fd
)。它们允许选择和重排序所有已归档项、支持并行恢复并且默认是压缩的。“目录”格式是唯一一种支持并行转储的格式。
adb_dump --help
General options:
-f, --file=FILENAME output file or directory name
-F, --format=c|d|t|p output file format (custom, directory, tar,plain text (default))
-j, --jobs=NUM use this many parallel jobs to dump
-Z, --compress=0-9 compression level for compressed formats
Options controlling the output content:
-a, --data-only dump only the data, not the schema
-E, --encoding=ENCODING dump the data in encoding ENCODING
-n, --schema=PATTERN dump the specified schema(s) only
-N, --exclude-schema=PATTERN do NOT dump the specified schema(s)
-s, --schema-only dump only the schema, no data
-t, --table=PATTERN dump the specified table(s) only
选项
下列命令选项控制输出的内容和格式。
dbname
指定要被转储的数据库名。如果没有指定,将使用环境变量PGDATABASE。如果环境变量也没有设置,则使用指定给该连接的用户名。
-a
--data-only
只转储数据,而不转储模式(数据定义)。表数据、大对象和序列值都会被转储。
这个选项类似于指定--section=data,但是由于历史原因又不完全相同。
-b
--blobs
在转储中包括大对象。这是当--schema、--table或--schema-only被指定时的默认行为。因此,只有在请求转储一个特定方案或者表的情况中,-b开关才对向转储中加入大对象有用。注意blobs是被考虑的数据,因此在使用--data-only时将被包括在内,但在使用--schema-only时则不会包括。
-B
--no-blobs
在转储中排除大对象。
当同时给定-b和-B时,行为是在数据被转储时输出大对象,请参考-b文档。
-c
--clean
在输出创建数据库对象的命令之前输出清除(删除)它们的命令 (除非也指定了--if-exists,如果任何对象不存在于 目的数据库中,恢复可能会产生一些伤害性的错误消息)。
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用adb_restore时指定该选项。
-C
--create
使得在输出的开始是一个创建数据库本身并且重新连接到被创建的数据库的命令(通过这种形式的一个脚本,在运行脚本之前你连接的是目标安装中的哪个数据库都没有关系)。如果也指定了--clean,脚本会在重新连接到目标数据库之前先删除它然后再重建。
通过--create,输出还会包括数据库的注释(如果有)以及与这个数据库相关的任何配置变量设置,也就是任何提到了这个数据库的ALTER DATABASE ... SET ...命令和ALTER ROLE ... IN DATABASE ... SET ...命令。该数据库本身的访问特权也会被转储,除非指定有--no-acl。
这个选项只对纯文本格式有意义。对于归档格式,你可以在你调用adb_restore时指定这个选项。
-E encoding
--encoding=encoding
以指定的字符集编码创建转储。在默认情况下,该转储会以该数据库的编码创建(另一种得到相同结果的方式是将PGCLIENTENCODING环境变量设置成想要的转储编码)。
-f file
--file=file
将输出发送到指定文件。对于基于输出格式的文件这个参数可以被忽略,在那种情况下将使用标准输出。不过对于目录输出格式必须给定这个参数,在目录输出格式中指定的是一个目录而不是一个文件。在这种情况中,该目录会由adb_dump创建并且不需要以前就存在。
-F format
--format=format
选择输出的格式。format可以是下列之一:
p
plain
输出一个纯文本形式的SQL脚本文件(默认值)。
c
custom
输出一个适合于作为adb_restore输入的自定义格式归档。和目录输出格式一起,这是最灵活的输出格式,它允许在恢复时手动选择和排序已归档的项。这种格式在默认情况还会被压缩。
d
directory
输出一个适合作为adb_restore输入的目录格式归档。这将创建一个目录,其中每个被转储的表和大对象都有一个文件,外加一个所谓的目录文件,该文件以一种adb_restore能读取的机器可读格式描述被转储的对象。一个目录格式归档能用标准 Unix 工具操纵,例如一个未压缩归档中的文件可以使用gzip工具压缩。这种格式默认情况下是被压缩的并且也支持并行转储。
t
tar
输出一个适合于输入到adb_restore中的tar-格式归档。tar 格式可以兼容目录格式,抽取一个 tar 格式的归档会产生一个合法的目录格式归档。不过,tar 格式不支持压缩。还有,在使用 tar 格式时,表数据项的相对顺序不能在恢复过程中被更改。
-j njobs
--jobs=njobs
通过同时归档njobs个表来运行并行转储。这个选项可能会减少执行转储所需的时间,但也会增加数据库服务器上的负载。你只能和目录输出格式一起使用这个选项,因为这是唯一一种让多个进程能在同一时间写其数据的输出格式。
-n pattern
--schema=pattern
只转储匹配pattern的模式,这会选择模式本身以及它所包含的所有对象。当没有指定这个选项时,目标数据库中所有非系统模式都将被转储。多个模式可以通过书写多个-n开关来选择。
-N pattern
--exclude-schema=pattern
不转储匹配pattern模式的任何模式。该模式被根据-n所用的相同规则被解释。-N可以被给定多次来排除匹配几个模式中任意一个的模式。
当-n和-N都被给定时,该行为是只转储匹配至少一个-n开关但是不匹配-N开关的模式。如果只有-N而没有-n,那么匹配-N的模式会被从一个正常转储中排除。
-O
--no-owner
不输出设置对象拥有关系来匹配原始数据库的命令。默认情况下,adb_dump会发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置被创建的数据库对象的拥有关系。除非该脚本被一个超级用户(或是拥有脚本中所有对象的同一个用户)启动,这些语句都将会失败。要使一个脚本能够被任意用户恢复,但把所有对象的拥有关系都给这个用户,可指定-O。
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用adb_restore时指定该选项。
-R
--no-reconnect
这个选项已经废弃,但是为了向后兼容仍然能被接受。
-s
--schema-only
只转储对象定义(模式),而非数据。
这个选项是--data-only的逆选项。它和指定--section=pre-data --section=post-data相似,但是由于历史原因又不完全相同。
(不要把这个选项和--schema选项混淆,后者在“schema”的使用上有不同的含义)。
要为数据库中表的一个子集排除表数据,见--exclude-table-data。
-S username
--superuser=username
指定要在禁用触发器时使用的超级用户的用户名。只有使用--disable-triggers时,这个选项才相关(通常,最好省去这个选项,而作为超级用户来启动结果脚本来取而代之)。
-t pattern
--table=pattern
只转储名字匹配pattern的表。通过写多个-t开关可以选择多个表。另外,pattern参数可以被解释为一种根据psql's \d命令所用的相同规则(请参见下面的Patterns)编写的模式,这样多个表也可以通过在该模式中书写通配字符来选择。在使用通配符时,如果需要阻止 shell 展开通配符需要小心引用该模式,请参见下面的Examples。
当-t被使用时,-n和-N开关不会有效果,因为被-t选择的表将被转储而无视那些开关,并且非表对象将不会被转储。
-T pattern
--exclude-table=pattern
不转储匹配pattern模式的任何表。该模式被根据-t所用的相同规则被解释。-T可以被给定多次来排除匹配几个模式中任意一个的模式。
当-t和-T都被给定时,该行为是只转储匹配至少一个-t开关但是不匹配-T开关的表。如果只有-T而没有-t,那么匹配-T的表会被从一个正常转储中排除。
-v
--verbose
指定冗长模式。这将导致adb_dump向标准错误输出详细的对象注释以及转储文件的开始/停止时间,还有进度消息。
-V
--version
adb_dump版本并退出。
-x
--no-privileges
--no-acl
防止转储访问特权(授予/收回命令)。
-Z 0..9
--compress=0..9
指定要使用的压缩级别。零意味着不压缩。对于自定义归档格式,这会指定个体表数据段的压缩,并且默认是进行中等级别的压缩。对于纯文本输出,设置一个非零压缩级别会导致整个输出文件被压缩,就好像它被gzip处理过一样,但是默认是不压缩。tar 归档格式当前完全不支持压缩。
--binary-upgrade
这个选项用于就地升级功能。我们不推荐也不支持把它用于其他目的。这个选项在未来的发行中可能被改变而不做通知。
--column-inserts
--attribute-inserts
将数据转储为带有显式列名的INSERT命令(INSERT INTO table (column, ...) VALUES ...)。这将使得恢复过程非常慢,这主要用于使转储能够被载入到非AntDB数据库中。重新加载期间的任何错误都将导致有问题的INSERT相关的行将丢失,而不是整个表内容。
--disable-dollar-quoting
这个选项禁止在函数体中使用美元符号引用,并且强制它们使用 SQL 标准字符串语法被引用。
--disable-triggers
只有在创建一个只转储数据的转储时,这个选项才相关。它指示adb_dump包括在数据被重新载入时能够临时禁用目标表上的触发器的命令。如果你在表上有引用完整性检查或其他触发器,并且你在数据重新载入期间不想调用它们,请使用这个选项。
当前,为--disable-triggers发出的命令必须作为超级用户来执行。因此,你还应当使用-S指定一个超级用户名,或者宁可作为一个超级用户启动结果脚本。
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用adb_restore时指定这个选项。
--enable-row-security
只有在转储具有行安全性的表的内容时,这个选项才相关。默认情况下, adb_dump将把 row_security设置为 off 来确保从该表中转储 出所有的数据。如果用户不具有足够能绕过行安全性的特权,那么会抛出 一个错误这个参数指示adb_dump将 row_security设置为 on,允许用户只转储该表中 它们能够访问到的部分内容。
注意如果当前你使用了这个选项,你可能还想得到INSERT格式的转储,因为恢复期间的COPY FROM不支持行安全性。
--exclude-table-data=pattern
不转储匹配pattern模式的任何表中的数据。该模式根据-t的相同规则被解释。--exclude-table-data可以被给定多次来排除匹配多个模式的表。当你需要一个特定表的定义但不想要其中的数据时,这个选项就有用了。
要排除数据库中所有表的数据,见--schema-only。
--extra-float-digits=ndigits
在转储浮点数据时使用规定的extra_float_digits值,而不是最大可用精度。以备份目的生成的常规转储不使用此选项。
--if-exists
时间条件性命令(即增加一个IF EXISTS子句)来清除数据库和其他对象。 只有同时指定了--clean时,这个选项才可用。
--include-foreign-data=foreignserver
使用与foreignserver模式匹配的外部服务器转储任何外部表的数据。可以通过编写 多个--include-foreign-data开关来选择多个外部服务器。 同样,根据psql's \d命令使用的相同规则, 将foreignserver参数解释为模式。 (请参见下面的Patterns),因此也可以通过在模式中写入通配符来选择多个外部服务器。使用通配符时, 如果需要,请小心引用该模式,以防止Shell扩展通配符。请参见下面的Examples。 唯一的例外是不允许使用空模式。
--inserts
将数据转储为INSERT命令(而不是COPY)。这将使得恢复非常慢,这主要用于使转储能够被载入到非AntDB数据库中。重新加载期间的任何错误都将导致有问题的INSERT相关的行将丢失,而不是整个表内容。注意如果你已经重新安排了列序,该恢复可能会一起失败。--column-inserts选项对于列序改变是安全的,但是会更慢。
--load-via-partition-root
在为一个分区表转储数据时,让COPY语句或者INSERT语句把包含它的分区层次的根而不是分区自身作为目标。这导致在数据被装载时,会为每一个行重新确定合适的分区。如果在一台服务器上重新装载数据时会出现行并不是总是落入到和原始服务器上相同的分区中的情况,这个选项就很有用。例如,如果分区列是文本类型并且两个系统中用于排序分区列的排序规则有着不同的定义,就会发生这种情况。
在从用这个选项制作的归档恢复时,最好不要使用并行,因为adb_restore将不能准确地知道一个给定的归档数据项将把数据装载到哪个分区中。这会导致效率不高,因为在并行任务见会有锁冲突,或者甚至可能由于在所有的相关数据被装载前建立了外键约束而导致重新装载失败。
--lock-wait-timeout=timeout
在转储的开始从不等待共享表锁的获得。而是在指定的timeout内不能锁定一个表时失败。超时时长可以用SET statement_timeout接受的任何格式指定。
--no-comments
不转储注释。
--no-publications
不转储publication。
--no-security-labels
不转储安全标签。
--no-subscriptions
不转储订阅。
--no-sync
默认情况下,adb_dump将等待所有文件被安全地写入磁盘。这个选项会让adb_dump不等待直接返回,这样会更快,但是也意味着后续的一次操作系统崩溃会让该转储损坏。通常这个选项对测试有用,但是不应该在从生产安装中转储数据时使用。
--no-synchronized-snapshots
这个选项允许对 9.2 以前的服务器运行adb_dump -j,详见-j参数的文档。
--no-tablespaces
不要输出选择表空间的命令。通过这个选项,在恢复期间所有的对象都会被创建在任何作为默认的表空间中。
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用adb_restore时指定该选项。
--no-unlogged-table-data
不转储非日志记录表的内容。这个选项对于表定义(模式)是否被转储没有影响,它只会限制转储表数据。当从一个后备服务器转储时,在非日志记录表中的数据总是会被排除。
--on-conflict-do-nothing
增加 ON CONFLICT DO NOTHING 到INSERT commands。 除非规定了 --inserts,--column-inserts 或--rows-per-insert ,否则此选项是无效的,.
--quote-all-identifiers
强制引用所有标识符。当从AntDB主版本与adb_dump不同的服务器上转储一个数据库时或者当输出准备载入到一个具有不同主版本的服务器时,推荐使用这个选项。默认情况下,adb_dump只对在其主版本中是被保留词的标识符加上引号。在转储其他版本服务器时,这种默认行为有时会导致兼容性问题,因为那些版本可能具有些许不同的被保留词集合。使用--quote-all-identifiers能阻止这种问题,但代价是转储脚本更难阅读。
--rows-per-insert=nrows
数据转储为INSERT命令(而不是COPY)。 控制每个INSERT命令的最大行数。 指定的值必须大于零。重新加载期间的任何错误都将导致有问题的INSERT相关的行将丢失,而不是整个表内容。
--section=sectionname
只转储命名节。节的名称可以是pre-data、data或post-data。这个选项可以被指定多次来选择多个节。默认是转储所有节。
数据节包含真正的表数据、大对象内容和序列值。数据后项包括索引、触发器、规则和除了已验证检查约束之外的约束的定义。数据前项包括所有其他数据定义项。
--serializable-deferrable
为转储使用一个可序列化事务,以保证所使用的快照与后来的数据库状态是一致的。但是这样做是在事务流中等待一个点,在该点上不能存在异常,这样就不会有转储失败或者导致其他事务带着serialization_failure回滚的风险。关于事务隔离和并发控制详见第 13 章。
对于一个只为灾难恢复存在的转储,这个选项没什么益处。如果一个转储被用来在原始数据库持续被更新期间载入一份用于报表或其他只读负载的数据库拷贝时,这个选项就有所帮助。如果没有这个选项,转储可能会反映一个与最终提交事务的任何执行序列都不一致的状态。例如,如果使用了批处理技术,一个批处理在转储中可以显示为关闭,而其中的所有项都不出现。
如果 adb_dump 被启动时没有读写事务在活动,则这个选项没有什么不同。如果有读写事务在活动,该转储的启动可能会被延迟一段不确定的时间。一旦开始运行,有没有这个开关的表现是相同的。
--snapshot=snapshotname
在做一个数据库的转储时指定一个同步的快照(详见 表 9.88)。
在需要把转储和一个逻辑复制槽(见第 48 章) 或者一个并发会话同步时可以用上这个选项。
在并行转储的情况下,将使用这个选项指定的快照名而不是取一个新快照。
--strict-names
要求每一个模式(-n/--schema)和表(-t/--table)限定符匹配要转储的数据库中至少一个模式/表。注意,如果没有找到有这样的模式/表限定符匹配,即便没有--strict-names,adb_dump也将生成一个错误。
这个选项对-N/--exclude-schema、-T/--exclude-table或者--exclude-table-data没有效果。无法匹配任何对象的排除模式不会被当作错误。
--use-set-session-authorization
输出 SQL-标准的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令来确定对象的所有关系。这让该转储更加兼容标准,但是取决于该转储中对象的历史,该转储可能无法正常恢复。而且,一个使用SET SESSION AUTHORIZATION的转储将一定会要求超级用户特权来正确地恢复,而ALTER OWNER要求更少的特权。
-?
--help
显示有关adb_dump命令行参数的帮助并退出。
下列命令行选项控制数据库连接参数。
-d dbname
--dbname=dbname
指定要连接的数据库的名称。 这等效于在命令行上将dbname指定为 第一个非选项参数。dbname可以是连接字符串。 如果是这样,连接字符串参数将覆盖所有冲突的命令行选项。
-h host
--host=host
指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认是放在PGPORT环境变量中(如果被设置),否则使用编译在程序中的默认值。
-U username
--username=username
要作为哪个用户连接。
-w
--no-password
从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制adb_dump在连接到一个数据库之前提示要求一个口令。
这个选项从来不是必须的,因为如果服务器要求口令认证,adb_dump将自动提示要求一个口令。但是,adb_dump将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。
--role=rolename
指定一个用来创建该转储的角色名。这个选项导致adb_dump在连接到数据库后发出一个SET ROLE rolename命令。当已认证用户(由-U指定)缺少adb_dump所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。
adb_dump 实例 1:
$ adb_dump mydb > db.sql #把一个数据库mydb转储到一个SQL脚本文件
$ adb -d newdb -f db.sql #把这样一个脚本重新载入到一个(新创建的)名为newdb的数据库中
$ adb_dump -Fc mydb > db.dump #转储一个数据库到一个自定义格式归档文件
$ adb_dump -Fd mydb -f dumpdir #转储一个数据库到一个目录格式的归档
$ adb_dump -Fd mydb -j 5 -f dumpdir #用 5 个并行的工作者任务转储一个数据库到一个目录格式的归档
$ adb_dump -t mytab mydb > db.sql #要转储一个名为mytab的表
# 要转储detroit模式中名称以emp开始的所有表,排除名为employee_log的表
$ adb_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql
#要转储名称以east或者west开始并且以gsm结束的所有模式,排除名称包含词test的任何模式
$ adb_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql
#要转储除了名称以ts_开头的表之外的所有数据库对象
$ adb_dump -T 'ts_*' mydb > db.sql
adb_dump 实例 2:
数据备份重于一切,日常应检查备份执行情况,并检查备份有效性,确保备份能够保障数据安全,备份安全加密也应兼顾。
要把一个数据库 mydb
转储到一个 SQL 脚本文件:
adb_dump mydb > db.sql
要转储一个数据库到一个自定义格式归档文件:
adb_dump -Fc mydb > db.dump
要用 5 个并行的工作者任务转储一个数据库到一个目录格式的归档:
adb_dump -Fd mydb -j 5 -f dumpdir
要转储一个名为 mytab
的表:
adb_dump -t mytab mydb > db.sql
要转储 detroit
模式中名称以 emp
开始的所有表,排除名为 employee_log
的表:
adb_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql
要转储名称以 east
或者 west
开始并且以 gsm
结束的所有模式,排除名称包含词 test
的任何模式:
adb_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql
adb_dumpall
adb_dumpall — 将一个 AntDB 数据库集簇抽取到一个脚本文件中。
大纲
adb_dumpall [connection-option...] [option...]
描述
adb_dumpall 工具可以一个集簇中所有的 AntDB 数据库写出到(“转储”)一个脚本文件。该脚本文件包含可以用作 psql 的输入 SQL 命令来恢复数据库。它会对集簇中的每个数据库调用 adb_dump 来完成该工作。adb_dumpall 还转储对所有数据库公用的全局对象(adb_dump 不保存这些对象),也就是说数据库角色和表空间都会被转储。 目前这包括适数据库用户和组、表空间以及适合所有数据库的访问权限等属性。
因为 adb_dumpall 从所有数据库中读取表,所以很可能需要以一个数据库超级用户的身份连接以便生成完整的转储。同样,也需要超级用户特权执行保存下来的脚本,这样才能增加角色和组以及创建数据库。
SQL 脚本将被写出到标准输出。使用 -f
/--file
选项或者 shell 操作符可以把它重定向到一个文件。
adb_dumpall 需要多次连接到 AntDB 服务器(每个数据库一次)。如果使用口令认证,可能每次都会要求口令。这种情况下使用一个~/.pgpass
会比较方便。
选项
下列命令行选项用于控制输出的内容和格式。
-a
--data-only
只转储数据,不转储模式(数据定义)。
-c
--clean
包括在重建数据库之前清除(移除)它们的 SQL 命令。角色和表空间的DROP命令也会被加入进来。
-E encoding
--encoding=encoding
用指定的字符集编码创建转储。默认情况下,转储使用数据库的编码创建(另一种得到相同结果的方法是设置PGCLIENTENCODING环境变量为想要的转储编码)。
-f filename
--file=filename
将输出发送到指定的文件中。如果省略,将使用标准输出。
-g
--globals-only
只转储全局对象(角色和表空间),而不转储数据库。
-O
--no-owner
不输出用于设置对象所有权以符合原始数据库的命令。默认情况下,adb_dumpall发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置被创建的模式元素的所有权。除非脚本是由一个超级用户(或者是拥有脚本中所有对象的同一个用户)所运行,这些语句在脚本运行时会失败。要使得一个脚本能被任意用户恢复,但又不想给予该用户所有对象的所有权,可以指定-O。
-r
--roles-only
只转储角色,不转储数据库和表空间。
-s
--schema-only
只转储对象定义(模式),不转储数据。
-S username
--superuser=username
指定要在禁用触发器时使用的超级用户的用户名。只有使用--disable-triggers时,这个选项才相关(通常,最好省去这个选项,而作为超级用户来启动结果脚本来取而代之)。
-t
--tablespaces-only
只转储表空间,不转储数据库和角色。
-v
--verbose
指定细节模式。这将导致adb_dumpall向标准错误输出详细的对象注释以及转储文件的开始/停止时间,还有进度消息。它也会启用adb_dump中的细节输出。
-V
--version
打印adb_dumpall版本并退出。
-x
--no-privileges
--no-acl
防止转储访问特权(授予/收回命令)。
--binary-upgrade
这个选项用于就地升级功能。我们不推荐也不支持把它用于其他目的。这个选项在未来的发行中可能被改变而不做通知。
--column-inserts
--attribute-inserts
将数据转储为带有显式列名的INSERT命令(INSERT INTO table(column, ...) VALUES ...)。这将使得恢复过程非常慢,这主要用于使转储能够被载入到非AntDB数据库中。
--disable-dollar-quoting
这个选项禁止在函数体中使用美元符号引用,并且强制它们使用 SQL 标准字符串语法被引用。
--disable-triggers
只有在创建一个只转储数据的转储时,这个选项才相关。它指示adb_dumpall包括在数据被重新载入时能够临时禁用目标表上的触发器的命令。如果你在表上有引用完整性检查或其他触发器,并且你在数据重新载入期间不想调用它们,请使用这个选项。
当前,为--disable-triggers发出的命令必须作为超级用户来执行。因此,你还应当使用-S指定一个超级用户名,或者宁可作为一个超级用户启动结果脚本。
--exclude-database=pattern
不要转储名字与 pattern 匹配的数据库。可以通过编写多个--exclude-database开关来排除多个模式。 pattern参数被解释为模式,根据psql的\d命令使用的相同规则 (请参见下面的 Patterns),因此,通过在模式中编写通配符也可以排除多个数据库。 使用通配符时,请谨慎的引用模式,如果需要防止shell通配符扩展。
--extra-float-digits=ndigits
在转储浮点数据时使用extra_float_digits规定的值,而不是最大可用精度。备份目的进行的常规转储不使用此选项。
--if-exists
时间条件性命令(即增加一个IF EXISTS子句)来清除数据库和其他对象。 只有同时指定了--clean时,这个选项才可用。
--inserts
将数据转储为INSERT命令(而不是COPY)。这将使得恢复非常慢,这主要用于使转储能够被载入到非AntDB数据库中。注意如果你已经重新安排了列序,该恢复可能会一起失败。--column-inserts选项对于列序改变是安全的,但是会更慢。
--load-via-partition-root
在为一个分区表转储数据时,让COPY语句或者INSERT语句把包含它的分区层次的根而不是分区自身作为目标。这导致在数据被装载时,会为每一个行重新确定合适的分区。如果在一台服务器上重新装载数据时会出现行并不是总是落入到和原始服务器上相同的分区中的情况,这个选项就很有用。例如,如果分区列是文本类型并且两个系统中用于排序分区列的排序规则有着不同的定义,就会发生这种情况。
--lock-wait-timeout=timeout
在转储的开始从不等待共享表锁的获得。而是在指定的timeout内不能锁定一个表时失败。超时时长可以用SET statement_timeout接受的任何格式指定。
--no-comments
不转储注释。
--no-publications
不转储publication。
--no-role-passwords
不为角色转储口令。在恢复完后,角色的口令将是空口令,并且在设置口令之前口令认证都不会成功。由于指定这个选项时并不需要口令值,角色信息将从目录视图pg_roles而不是pg_authid中读出。因此,如果对pg_authid的访问被某条安全性策略所限制,那么这个选项也会有所帮助。
--no-security-labels
不转储安全标签。
--no-subscriptions
不转储subscription。
--no-sync
默认情况下,adb_dumpall将等待所有文件被安全地写入到磁盘。这个选项会让adb_dumpall不做这种等待而返回,这样会更快,但是意味着后续的操作系统崩溃可能留下被损坏的转储。通常来说,这个选项对测试有用,但不应该在从生产安装中转储数据时使用。
--no-tablespaces
不要输出选择表空间的命令。通过这个选项,在恢复期间所有的对象都会被创建在任何作为默认的表空间中。
--no-unlogged-table-data
不转储非日志记录表的内容。这个选项对于表定义(模式)是否被转储没有影响,它只会限制转储表数据。
--on-conflict-do-nothing
添加ON CONFLICT DO NOTHING到INSERT命令。 除非--inserts或--column-inserts也被规定,否则此选项不生效。
--quote-all-identifiers
强制引用所有标识符。在从一个与adb_dumpall主版本不同的AntDB服务器转储数据库时或者要将输出载入到一个不同主版本的服务器时,推荐使用这个选项。默认情况下,adb_dumpall只会对为其主版本中保留词的标识符加上引号。在与其他版本的具有不同保留词集合的服务器交互时,这有时会导致兼容性问题。使用--quote-all-identifiers可以阻止这类问题,但是代价是转储脚本会更加难读。
--rows-per-insert=nrows
将数据转储为INSERT命令(而不是COPY)。控制每个INSERT命令的最大行数。 指定的值必须是大于零的数。重新加载期间的任何错误都将导致仅丢失有问题的INSERT的行,而不是整个表内容。
--use-set-session-authorization
输出 SQL-标准的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令来确定对象的所有关系。这让该转储更加兼容标准,但是取决于该转储中对象的历史,该转储可能无法正常恢复。
-?
--help
显示有关adb_dumpall命令行参数的帮助并退出。
下列命令行选项控制数据库连接参数。
-d connstr
--dbname=connstr
指定用于连接到服务器的参数,比如连接字符串;这些将覆盖所有冲突的命令行选项。
这个选项被称为--dbname是为了和其他客户端应用一致,但是因为adb_dumpall需要连接多个数据库,连接字符串中的数据库名将被忽略。使用-l选项指定一个数据库,该数据库被用于初始连接,这将转储全局对象并且发现需要转储哪些其他数据库。
-h host
--host=host
指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。
-l dbname
--database=dbname
指定要连接到哪个数据库转储全局对象以及发现要转储哪些其他数据库。如果没有指定,将会使用postgres数据库,如果postgres不存在,就使用 template1。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认是放在PGPORT环境变量中(如果被设置),否则使用编译在程序中的默认值。
-U username
--username=username
要作为哪个用户连接。
-w
--no-password
从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制adb_dumpall在连接到一个数据库之前提示要求一个口令。
这个选项从来不是必须的,因为如果服务器要求口令认证,adb_dumpall将自动提示要求一个口令。但是,adb_dumpall将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。
注意对每个要被转储的数据库,口令提示都会再次出现。通常,最好设置一个~/.pgpass文件来减少手工口令输入。
--role=rolename
指定一个用来创建该转储的角色名。这个选项导致adb_dump在连接到数据库后发出一个SET ROLE rolename命令。当已认证用户(由-U指定)缺少adb_dump所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。
例子
要转储所有数据库:
$ adb_dumpall > db.out
要从这个文件重新载入数据库,你可以使用:
$ adb -f db.out postgres
adb_restore
adb_restore — 从一个由 adb_dump 创建的归档文件恢复一个 AntDB 数据库。
大纲
adb_restore [connection-option...] [option...] [filename]
描述
adb_restore 是一个用来从 adb_dump 创建的非文本格式归档恢复 AntDB 数据库的工具。它将发出必要的命令把该数据库重建成它被保存时的状态。这些归档文件还允许 adb_restore 选择恢复哪些内容或者在恢复前对恢复项重排序。这些归档文件被设计为可以在不同的架构之间迁移。
adb_restore可以在两种模式下操作。如果指定了一个数据库名称,adb_restore会连接那个数据库并且把归档内容直接恢复到该数据库中。否则,会创建一个脚本,其中包含着重建该数据库所必要的 SQL 命令,它会被写入到一个文件或者标准输出。这个脚本输出等效于 adb_dump 的纯文本输出格式。因此,一些控制输出的选项与 adb_dump 的选项类似。
显然,adb_restore 无法恢复不在归档文件中的信息。例如,如果归档使用“以 INSERT
命令转储数据”选项创建, adb_restore 将无法使用 COPY
语句装载数据。
adb_restore --help
General options:
-d, --dbname=NAME connect to database name
-f, --file=FILENAME output file name (- for stdout)
-F, --format=c|d|t backup file format (should be automatic)
-l, --list print summarized TOC of the archive
Options controlling the restore:
-a, --data-only restore only the data, no schema
-e, --exit-on-error exit on error, default is to continue
-j, --jobs=NUM use this many parallel jobs to restore
-L, --use-list=FILENAME use table of contents from this file for selecting/ordering output
-n, --schema=NAME restore only objects in this schema
选项
adb_restore 接受下列命令行参数。
filename
指定要被恢复的归档文件(对于一个目录格式的归档则是目录)的位置。如果没有指定,则使用标准输入。
-a
--data-only
只恢复数据,不恢复模式(数据定义)。如果在归档中存在,表数据、大对象和序列值会被恢复。
这个选项类似于指定--section=data,但是由于历史原因两者不完全相同。
-c
--clean
在重新创建数据库对象之前清除(丢弃)它们(除非使用了--if-exists,如果有对象在目标数据库中不存在,这可能会生成一些无害的错误消息)。
-C
--create
在恢复一个数据库之前县创建它。如果还指定了--clean,在连接到目标数据库之前丢弃并且重建它。
如果使用--create,adb_restore还会恢复数据库的注释(如果有)以及与其相关的配置变量设置,也就是任何提到过这个数据库的ALTER DATABASE ... SET ...和ALTER ROLE ... IN DATABASE ... SET ...命令。不管是否指定--no-acl,数据库本身的访问特权都会被恢复。
在使用这个选项时,-d提到的数据库只被用于发出初始的DROP DATABASE和CREATE DATABASE命令。所有要恢复到该数据库名中的数据都出现在归档中。
-d dbname
--dbname=dbname
连接到数据库dbname并且直接恢复到该数据库中。dbname 可以是 连接字符串。 如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-e
--exit-on-error
在发送 SQL 命令到该数据库期间如果碰到一个错误就退出。默认行为是继续并且在恢复结束时显示一个错误计数。
-f filename
--file=filename
为生成的脚本指定输出文件,或在与-l选项一起使用时为列表指定输出文件。为 stdout用 -。
-F format
--format=format
指定归档的格式。并不一定要指定该格式,因为adb_restore将会自动决定格式。如果指定,可以是下列之一:
c
custom
归档是adb_dump的自定义格式。
d
directory
归档是一个目录归档。
t
tar
归档是一个tar归档。
-I index
--index=index
只恢复提及的索引的定义。可以通过写多个-I开关指定多个索引。
-j number-of-jobs
--jobs=number-of-jobs
使用并发任务运行adb_restore中最耗时的步骤 — 载入数据、创建索引或者创建约束; 同时,最多使用number-of-jobs个并发会话。对于一个运行在多处理器机器上的服务器, 这个选项能够大幅度减少恢复一个大型数据库的时间。当发出脚本而不是直接连接到数据库服务器时,将忽略此选项。
每一个任务是一个进程或者一个线程,这取决于操作系统,它们都使用一个独立的服务器连接。
这个选项的最佳值取决于服务器、客户端以及网络的硬件设置。因素包括 CPU 的核心数和磁盘设置。一个好的建议是服务器上 CPU 的核心数,但是更大的值在很多情况下也能导致更快的恢复时间。当然,过高的值会由于超负荷反而导致性能降低。
这个选项只支持自定义和目录归档格式。输入必须是一个常规文件或目录(例如,不能是一个管道或者标准输出)。还有,多任务不能和选项--single-transaction一起用。
-l
--list
列出归档的内容的表格。这个操作的输出能被用作-L选项的输入。注意如果把-n或-t这样的过滤开关与-l一起使用,它们将会限制列出的项。
-L list-file
--use-list=list-file
只恢复在list-file中列出的归档元素,并且按照它们出现在该文件中的顺序进行恢复。注意如果把-n或-t这样的过滤开关与-L一起使用,它们将会进一步限制要恢复的项。
list-file通常是编辑一个-l操作的输出来创建。行可以被移动或者移除,并且也可以通过在行首放一个(;)将其注释掉。例子见下文。
-n shcema
--schema=schema
只恢复在被提及的模式中的对象。可以用多个-n开关来指定多个模式。这可以与-t选项组合在一起只恢复一个指定的表。
-N schema
--exclude-schema=schema
不恢复所提及方案中的对象。可以用多个-N开关指定多个要被排除的方案。
如果对同一个方案名称同时给出了-n和-N,则-N会胜出并且该方案会被排除。
-O
--no-owner
不要输出将对象的所有权设置为与原始数据库匹配的命令。默认情况下,adb_restore会发出ALTER OWNER或者SET SESSION AUTHORIZATION语句来设置已创建的模式对象的所有权。除非到该数据库的初始连接是一个超级用户(或者拥有脚本中所有对象的同一个用户)建立的,这些语句将会失败。通过-O,任何用户名都可以被用于初始连接,并且这个用户将会拥有所有被创建的对象。
-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])
只恢复被提及的函数。要小心地拼写函数的名称和参数使它们正好就是出现在转储文件的内容表中的名称和参数。可以使用多个-P开关指定多个函数。
-R
--no-reconnect
这个选项已被废弃,但是出于向后兼容性的目的,系统仍然还接受它。
-s
--schema-only
只恢复归档中的模式(数据定义)不恢复数据。
这个选项是--data-only的逆选项。它与指定--section=pre-data --section=post-data相似,但是由于历史原因并不完全相同。
(不要把这个选项和--schema选项弄混,后者把词“schema”用于一种不同的含义)。
-S username
--superuser=username
指定在禁用触发器时要用的超级用户名。只有使用--disable-triggers时这个选项才相关。
-t table
--table=table
只恢复所提及的表的定义和数据。出于这个目的,“table”包括视图、物化视图、序列和外部表。可以写上多个-t开关可以选择多个表。这个选项可以和-n选项结合在一起指定一个特定模式中的表。
-T trigger
--trigger=trigger
只恢复所提及的触发器。可以用多个-T开关指定多个触发器。
-v
--verbose
指定冗长模式。
-V
--version
打印该adb_restore的版本并退出。
-x
--no-privileges
--no-acl
阻止恢复访问特权(授予/收回命令)。
-1
--single-transaction
将恢复作为单一事务执行(即把发出的命令包裹在BEGIN/COMMIT中)。这可以确保要么所有命令完全成功,要么任何改变都不被应用。这个选项隐含了--exit-on-error。
--disable-triggers
只有在执行一个只恢复数据的恢复时,这个选项才相关。它指示adb_restore在装载数据时执行命令临时禁用目标表上的触发器。如果你在表上有参照完整性检查或者其他触发器并且你不希望在数据载入期间调用它们时,请使用这个选项。
目前,为--disable-triggers发出的命令必须以超级用户身份完成。因此你还应该用-S指定一个超级用户名,或者更好的方法是以一个AntDB超级用户运行adb_restore。
--enable-row-security
只有在恢复具有行安全性的表的内容时,这个选项才相关。默认情况下,adb_restore将把row_security设置为 off 来确保所有数据都被恢复到表中。如果用户不拥有足够绕过行安全性的特权,那么会抛出一个错误。这个参数指示adb_restore把row_security设置为on允许用户尝试恢复启用了行安全性的表的内容。如果用户没有从转储向表中插入行的权限,这仍将失败。
注意当前这个选项还要求转储处于INSERT格式,因为COPY FROM不支持行安全性。
--if-exists
使用条件命令(即增加一个IF EXISTS子句)删除数据库对象。只有指定了--clean时,这个选项才有效。
--no-comments
即便归档中包含注释也不输出恢复注释的命令。
--no-data-for-failed-tables
默认情况下,即便表的创建命令失败(例如因为表已经存在),表数据也会被恢复。通过这个选项,对这类表的数据会被跳过。如果目标数据库已经包含了想要的表内容,这种行为又很有有用。
只有当直接恢复到一个数据库中时这个选项才有效,在产生 SQL脚本输出时这个选项不会产生效果。
--no-publications
即便归档中包含publication也不输出恢复publication的命令。
--no-security-labels
不要输出恢复安全标签的命令,即使归档中包含安全标签。
--no-subscriptions
即便归档中包含subscription也不输出恢复subscription的命令。
--no-tablespaces
不输出命令选择表空间。通过这个选项,所有的对象都会被创建在恢复时的默认表空间中。
--section=sectionname
只恢复提及的小节。小节的名称可以是pre-data、data或者post-data。可以把这个选项指定多次来选择多个小节。默认值是恢复所有小节。
数据小节包含实际的表数据以及大对象定义。Post-data 项由索引定义、触发器、规则和除已验证的检查约束之外的约束构成。Pre-data 项由所有其他数据定义项构成。
--strict-names
要求每一个模式(-n/--schema)以及表(-t/--table)限定词匹配备份文件中至少一个模式/表。
--use-set-session-authorization
输出 SQL 标准的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令来决定对象拥有权。这会让转储更加兼容标准,但是依赖于转储中对象的历史,可能无法正确恢复。
-?
--help
显示有关adb_restore命令行参数的帮助,并且退出。
adb_restore也接受下列用于连接参数的命令行参数:
-h host
--host=host
指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认是放在PGPORT环境变量中(如果被设置),否则使用编译在程序中的默认值。
-U username
--username=username
要作为哪个用户连接。
-w
--no-password
不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制adb_restore在连接到一个数据库之前提示要求一个口令。
这个选项不是必须的,因为如果服务器要求口令认证,adb_restore将自动提示要求一个口令。但是,adb_restore将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。
--role=rolename
指定一个用来创建该转储的角色名。这个选项导致adb_restore在连接到数据库后发出一个SET ROLE rolename命令。当已认证用户(由-U指定)缺少adb_restore所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。
示例
假设我们已经以自定义格式转储了一个叫做mydb的数据库:
$ adb_dump -Fc mydb > db.dump
要删除该数据库并且从转储中重新创建它:
$ dropdb mydb
$ adb_restore -C -d postgres db.dump
要把转储重新载入到一个名为newdb的新数据库中:
$ createdb -T template0 newdb
$ adb_restore -d newdb db.dump
要对数据库项重排序,首先需要转储归档的表内容:
$ adb_restore -l db.dump > db.list
物理备份
适合场景:
- 全量备份和增量备份都需要的场景
- 需要快速恢复数据库
- 同版本之间做整体迁移
AntDB 的物理备份工具
- Linux 的文件拷贝命令,cp scp rsync 命令,配合 tar 打包(俗称“冷备”,需要停库操作)
- adb_basebackup
adb_basebackup
adb_basebackup — 获得一个 AntDB 集簇的一个基础备份
大纲
adb_basebackup [option...]
描述
adb_basebackup 被用于获得一个正在运行的 AntDB 数据库集簇的基础备份。获得这些备份不会影响数据库的其他客户端,并且可以被用于时间点恢复以及用作一个日志传送或流复制后备服务器的开始点。
adb_basebackup 对数据库群集的文件进行精确复制,同时确保服务器自动进入和退出备份模式。备份总是从整个数据库集簇获得,不可能备份单个数据库或数据库对象。关于选择性备份,必须使用一个像 adb_dump 的工具。
使用 adb_basebackup 备份需要注意:
备份期间,业务可以正常读写数据库
只能备份整个数据库集簇,不能单独备份某个数据库
必须使用超级用户或者有 REPLICATION 权限的用户执行备份操作
配置有白名单(pg_hba.conf)既可以基于主库做备份,也可以基于一个备库做备份
adb_basebackup --help
-D, --pgdata=DIRECTORY receive base backup into directory
-F, --format=p|t output format (plain (default), tar)
-r, --max-rate=RATE maximum transfer rate to transfer data directory(in kB/s, or use suffix "k" or "M")
-X, --wal-method=none|fetch|stream include required WAL files with specified method
-z, --gzip compress tar output
-Z, --compress=0-9 compress tar output with given compression level
-c, --checkpoint=fast|spread set fast or spread checkpointing
-P, --progress show progress information
选项
下列命令行选项控制输出的位置和格式:
-D directory
--pgdata=directory
设置目标目录以将输出写入。如果该目录不存在,adb_basebackup将创建该目录(以及所有丢失的父目录)。如果已经存在,则必须为空。
当备份处于 tar 模式中,目标目录可以被指定为-(破折号),从而将 tar 文件写入stdout。
这个选项是必需的。
-F format
--format=format
为输出选择格式。format可以是下列之一:
p
plain
把输出写成平面文件,使用和源服务器数据目录和表空间相同的布局。当集簇没有额外表空间时,整个数据库将被放在目标目录中。如果集簇包含额外的表空间,主数据目录将被放置在目标目录中,但是所有其他表空间将被放在它们位于源服务器上的相同的绝对路径中。
这是默认格式。
t
tar
将输出作为tar文件写入目标目录中。 主数据目录的内容将被写入名为base.tar的文件,而其他表空间将被写入以该表空间的OID命名的单独的tar文件。
如果将目标目录指定为-(破折号),则tar内容将被写入标准输出,该标准输出适用于管道传输至gzip(例如)。 只有当集簇没有额外表空间并且没有使用WAL流时才允许这样做。
-R
--write-recovery-conf
创建一个standby.signal文件,并将连接设置附加到目标目录(或使用tar格式的基本存档文件中)的postgresql.auto.conf文件中。 这样可以简化使用备份结果设置备用服务器的过程。
postgresql.auto.conf文件将记录连接设置(如果有)以及adb_basebackup所使用的复制槽,这样流复制后面就会使用相同的设置。
-T olddir=newdir
--tablespace-mapping=olddir=newdir
在备份期间将目录olddir中的表空间重定位到newdir中。为使之有效,olddir必须与源服务器上定义的表空间的路径规范完全匹配。(但如果备份中没有包含olddir中的表空间也不是错误)。同时,newdir是接收主机文件系统中的目录。与主目标目录一样,newdir不必已经存在,但是如果确实存在,则必须为空。olddir和newdir必须是绝对路径。如果一个路径凑巧包含了一个=符号,可用反斜线对它转义。对于多个表空间可以多次使用这个选项。
如果以这种方法重定位一个表空间,主数据目录中的符号链接会被更新成指向新位置。因此新数据目录已经可以被一个所有表空间位于更新后位置的新服务器实例使用。
--waldir=waldir
指定用于预写式日志目录的位置。waldir必须是绝对路径。只有当备份是平面文件模式时才能指定事务日志目录。 设置要写入WAL(预写日志)文件的目录。 默认情况下,WAL文件将放置在目标目录的pg_wal子目录中,但是此选项可用于将它们放置在其他位置。waldir必须是绝对路径。与主目标目录一样,waldir不必已经存在,但是如果确实存在,则必须为空。只有当备份是平面文件模式时才可以指定此选项。
-X method
--wal-method=method
在备份中包括所需的WAL(预写式日志)文件。这包括所有在备份期间产生的预写式日志。除非指定了方法none,可以在目标目录中启动postmaster而无需参考日志归档,从而使输出成为完全独立的备份。
支持下列收集预写式日志的方法:
n
none
不要在备份中包括预写式日志。
f
fetch
在备份末尾收集预写式日志文件。因此,有必要把源服务器的wal_keep_size参数设置得足够高,这样在备份末尾之前需要的日志数据不会被移除。如果所需的日志数据在传输之前已被回收,则备份将失败并且无法使用。
如果使用tar格式,预写式日志文件将被包含在base.tar文件。
s
stream
在进行备份时,流式传输预写式日志数据。将开启一个到服务器的第二连接并且在运行备份时并行开始流传输预写式日志。因此,它将需要两个复制连接,而不仅仅是一个。 只要客户端可以跟上预写式日志数据,使用此方法就不需要在源服务器上保存额外的预写式日志。
如果使用tar格式,预写式日志文件被写入到一个单独的名为pg_wal.tar的文件(如果服务器的版本超过10,该文件将被命名为pg_xlog.tar)。
这个值是默认值。
-z
--gzip
启用对 tar 文件输出的 gzip 压缩,使用默认的压缩级别。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。
-Z level
--compress=level
启用对 tar 文件输出的 gzip 压缩,并且制定压缩机别(0 到 9,0 是不压缩,9 是最佳压缩)。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。
下列命令行选项控制备份的生成和程序的调用:
-c fast|spread
--checkpoint=fast|spread
将检查点模式设置为 fast(立刻)或 spread(默认)(见第 25.3.3 节)。
-C
--create-slot
指定在启动备份之前应创建由--slot选项命名的复制插槽。如果插槽已存在,则会引发错误。
-l label
--label=label
为备份设置标签。如果没有指定,将使用一个默认值“adb_basebackup base backup”。
-n
--no-clean
默认情况下,当adb_basebackup因为一个错误而中止时,它会把它意识到无法完成该工作之前已经创建的目录(例如目标目录和预写式日志目录)都移除。这个选项可以禁止这种清洗,因此可以用于调试。
注意不管哪一种方式都不会清除表空间目录。
-N
--no-sync
默认情况下,adb_basebackup将等待所有文件被安全地写到磁盘上。这个选项导致adb_basebackup不做这种等待就返回,这样会更快一些,但是也意味着后续发生的操作系统崩溃可能会使得这个基础备份损坏。通常这个选项对测试比较有用,在创建生产安装时不应该使用。
-P
--progress
启用进度报告。启用这个选项将在备份期间发表一个大致的进度报告。由于数据库可能在备份期间改变,这仅仅是一种近似并且可能不会刚好在100%结束。特别地,当 WAL 日志被包括在备份中时,总数据量无法预先估计,并且在这种情况中估计的目标尺寸会在它经过不带 WAL 的总估计后增加。
-r rate
--max-rate=rate
设置从源服务器收集数据的最大传输速率。这有助于限制adb_basebackup对服务器的影响。值以每秒千字节为单位。使用后缀M表示每秒兆字节数。后缀k也可以接受,没有任何影响。有效值介于每秒32千字节和每秒1024兆字节之间。
此选项始终影响数据目录的传输。只有收集方法为fetch时,才会影响WAL文件的传输。
-S slotname
--slot=slotname
这个选项仅能与-X stream一起使用。它导致WAL流使用指定的复制槽。如果该基础备份的目的是被用作一台使用复制槽的流复制后备,则它应该使用与primary_slot_name中相同的复制槽名称。这可以确保主服务器不会移除位于该基础备份结束与新备用数据库上流复制开始之间产生的任何所需的WAL数据。
指定的复制槽必须已经存在,除非同时使用了选项-C。
如果这个选项没有被指定并且服务器支持临时复制槽(版本10以后),则会自动使用一个临时复制槽来进行WAL流。
-v
--verbose
启用冗长模式。将在启动和关闭期间输出一些额外步骤,并且如果进度报告也被启用,还会显示当前正在被处理的确切文件名。
--manifest-checksums=algorithm
指定应应用于备份清单中包含的每个文件的校验和算法。目前,可用的算法有NONE、CRC32C、SHA224、SHA256、 SHA384和SHA512。默认值为CRC32C。
如果选择了NONE,备份清单将不包含任何校验和。否则,它将包含备份中使用指定算法的每个文件的校验和。此外,清单将始终包含自身内容的SHA256校验和。SHA算法比CRC32C算法占用大量CPU,因此选择其中一种算法可能会增加完成备份所需的时间。
使用SHA散列函数可为希望验证备份是否遭到篡改的用户提供每个文件的加密安全摘要,而CRC32C算法提供的校验和计算速度更快。它擅长捕获由于意外更改引起的错误,但不能抵抗恶意修改。 请注意,为了对有权访问备份的对手有用,备份清单必须安全地存储在其他位置,否则必须经过验证以确保自从进行备份以来未进行任何修改。
adb_verifybackup可用于根据备份清单检查备份的完整性。
--manifest-force-encode
强制备份清单中的所有文件名采用十六进制编码。如果未指定此选项,则仅对非UTF8文件名进行十六进制编码。此选项主要用于测试读取备份清单文件的工具是否正确处理此情况。
--no-estimate-size
阻止服务器估计将要流式传输的备份数据总量,从而导致pg_stat_progress_basebackup视图中的backup_total列始终为NULL。
如果没有此选项,则备份将从枚举整个数据库的大小开始,然后返回并发送实际内容。这可能会使备份花费的时间稍长一些,特别是在发送第一个数据之前,备份将花费更长的时间。 如果估计时间过长,此选项将有助于避免此类估计时间。
使用--progress时不允许使用此选项。
--no-manifest
禁用备份清单的生成。如果未指定此选项,则服务器将生成并发送备份清单,可以使用adb_verifybackup进行验证。清单是备份中存在的每个文件的列表,可能包含的所有WAL文件除外。它还存储大小、上次修改时间和每个文件的可选校验和。
--no-slot
防止为备份创建临时复制插槽。
默认情况下,如果选择了日志流,但没有用选项-S指定槽名称,则会创建一个临时复制插槽(如果源服务器支持)。
这个选项的主要目的是允许在服务器没有空闲复制槽可用时制作基础备份。使用复制槽几乎总是最好的方式,因为它能防止备份期间所需的WAL被删除。
--no-verify-checksums
如果在取基础备份的服务器上启用了校验码验证,则禁用校验码验证。
默认情况下,校验码会被验证并且校验码失败将会导致一种非零的退出状态。不过,基础备份在这种情况下将不会被移除,就好像使用了--no-clean选项一样。校验和验证失败也将报告在 pg_stat_database视图中。
以下命令行选项控制到源服务器的连接:
-d connstr
--dbname=connstr
指定用于连接到服务器的参数,比如连接字符串;这些将覆盖所有冲突的命令行选项。
为了和其他客户端应用一致,该选项被称为--dbname。但是因为adb_basebackup并不连接到集簇中的任何特定数据库,连接字符串中的任何数据库名将被忽略。
-h host
--host=host
指定运行服务器的机器的主机名。如果该值以一个斜线开始,它被用作 Unix 域套接字的目录。默认值取自PGHOST环境变量(如果设置),否则会尝试一个 Unix 域套接字连接。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展。默认用PGPORT环境变量中的值(如果设置),或者一个编译在程序中的默认值。
-s interval
--status-interval=interval
指定发送回源服务器的状态包之间的秒数。较小的值可以更准确地监视服务器的备份进度。一个零值完全禁用这种周期性的状态更新,不过当服务器需要时还是会有一个更新会被发送来避免超时导致的断开连接。默认值是 10 秒。
-U username
--username=username
指定连接的用户名。
-w
--no-password
防止发出口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制adb_basebackup在连接到源服务器之前提示要求一个口令。
这个选项不是必不可少的,因为如果服务器要求口令认证,adb_basebackup将自动提示要求一个口令。但是,adb_basebackup将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下值得用-W来避免额外的连接尝试。
其他选项也可用:
-V
--version
打印adb_basebackup版本并退出。
-?
--help
显示有关adb_basebackup命令行参数的帮助并退出。
示例
常用的冷备命令:
$ adb_basebackup -h host_ip -p port -U user_name -D /data/test/test_backup.tar -F t -X f -f fast
要创建服务器mydbserver的一个基础备份并将它存储在本地目录/usr/local/pgsql/data中:
$ adb_basebackup -h mydbserver -D /usr/local/pgsql/data
要创建本地服务器的一个备份,为其中每一个表空间产生一个压缩过的 tar 文件,并且将它存储在目录backup中,在运行期间显示一个进度报告:
$ adb_basebackup -D backup -Ft -z -P
要创建一个单一表空间本地数据库的备份并且使用bzip2压缩它:
$ adb_basebackup -D - -Ft -X fetch | bzip2 > backup.tar.bz2
要创建一个本地数据库的备份,其中/opt/ts中的表空间被重定位到./backup/ts:
$ adb_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts
如果需要压缩,加上-z -Z 5(gzip压缩率0-9,0表示不压缩,9表示最好的压缩率)
adb_basebackup -h host_ip -p port -U user_name -D /data/test/test_backup.tar.gz -F t -X f -f fast -z -Z 5
如果想利用别的压缩算法,可以利用管道实现
adb_basebackup -h host_ip -p port -U user_name -F t -X f -f fast -D - | zstd -T 12 - > test_backup
闪回恢复
业务在使用 AntDB 数据库的过程中,经常由于操作失误或者程序 BUG 导致的表数据误删除,误更新,甚至整表删除,最终导致业务异常。针对上述场景,数据库需要支持数据闪回功能,将修改的数据进行找回,快速恢复业务。
闪回插件的构建基础是,checkpoint 之后对每一个 page 的更改会产生全页写(FPW),因此一个 checkpoint 之后的所有 wal 日志可以完美解析。
安装 antdb_flashback 插件
antdb_flashback 是 WAL(write ahead logs)日志的解析工具,旨在挖掘 wal 日志所有的有用信息,从而提供数据恢复支持。步骤如下:
修改参数,然后重启:
SET shared_preload_libraries= 'antdb_flashback';
SET shared_preload_libraries= 'antdb_flashback';
SET shared_preload_libraries= 'antdb_flashback';
连接到gtmcoord上创建extension。
CREATE EXTENSION antdb_flashback;
DML 闪回
本节主要介绍如何从 wal 日志产生的数据库中直接解析 DML 语句以及如何执行解析出来的 undo 语句。
通过调用 flashbackdml 函数即可解析出 DML 语句,并且执行 undo 语句,参数如下。
- timestart,timestamp 类型,起始时间点;
- timestop,timestamp 类型,终止时间点;
- relname,text类型,表名称;
- lsnstart,unsigned long 类型,起始 LSN 位置;
- lsnstop,unsigned long 类型,终止 LSN 位置;
- xid,unsigned int 类型,事务号;
- walpath,text 类型,wal 日志目录,为空则使用 pg_wal 目录;
- dictdir,text 类型,导出的元数据存储目录,为空则使用数据库元数据;
- sqldir,text 类型,闪回 SQL 存储目录,为空则将闪回 SQL 存储在表 flashback_dml_result 中;
- apply,bool 类型,是否自动应用闪回 SQL,默认为 false;
解析 undo 语句
使用 flashbackdml 方法,传入不同的参数,即可解析出 undo 语句到表中或者文件中。
解析特定时间区间内的DML语句:
SELECT flashbackdml(timestart =>'time1',timestop=>'time2');
解析特定lsn区间内的DML语句:
SELECT flashbackdml(lsnstart=>'lsn1',lsnstop=>'lsn2');
解析指定xid的语句:
SELECT flashbackdml(xid => 604);
指定wal文件目录解析:
SELECT flashbackdml(walpath =>'pg_wal');
指定表名解析:
SELECT flashbackdml(relname =>'t2');
解析到指定的目录:
SELECT flashbackdml(sqldir =>'./');
默认是结果解析到表 flashback_dml_result 中,如果指定了 sqldir,则会解析到对应的目录下,生成 2 个文件,flashback_dml_result_redo.sql 和 flashback_dml_result_undo.sql。
查看表 flashback_dml_result 中的结果:
SELECT redo_sql, undo_sql FROM flashback_dml_result order by xid;
应用 undo 语句
应用 flashback_dml_result 表中的 undosql:
SELECT flashbackdml(apply => 'true');
应用指定的 sqldir 目录下的 flashback_dml_result_undo.sql 文件:
SELECT flashbackdml(apply=> 'true', sqldir =>'./');
或者用户可以直接通过 psql 命令的 -f 直接应用 undo.sql 文件。
举例:
DROP TABLE if exists t1;
DROP TABLE if exists muti_test;
CREATE TABLE t1(i int, j int, k varchar default('abc'));
CREATE TABLE muti_test(id int, num int);
checkpoint;
INSERT INTO t1 VALUES(1,2);
INSERT INTO t1 VALUES(2,4);
SELECT now() AS time1 \gset
INSERT INTO t1 VALUES(3,5);
UPDATE t1 SET k = 'updated' WHERE i = 2;
DELETE FROM t1;
SELECT now() AS time2 \gset
INSERT INTO t1 SELECT i,i+10 FROM generate_series(1,5) i;
DELETE FROM t1 WHERE j = 12;
SELECT now() AS time3 \gset
--自动应用
SELECT flashbackdml(timestart =>:'time1',timestop=>:'time3');-- tuple:0
SELECT flashbackdml(apply => true);
DDL 闪回
本节介绍回收站的使用。
打开 adb_trashcan 开关
- 参数配置
在所有节点的postgresql.conf中增加配置项,如下:
adb_trashcan.enable = on
配置完成后需要重启节点生效。
- 检查插件是否已加载
SHOW adb_trashcan.enable;
找回被删除的表
通过 drop table 和 truncate table 删除的表数据会被放在 adb_trashcan 的 shcema 下面,在该模式下可找回删除的数据,表的名称是“表名_删除的时间”;
SET search_path = 'adb_trashcan';
\d
如果对 adb_trashcan 模式下的表进行 drop 和 truncate,这些表将被真正删除,且无法再找回;
在回收站中找到被删除的表后,调用函数即可恢复到原来的位置:
SELECT flashbackddl('原表名', '回收站中的表名');
例如:
SELECT flashbackddl('t1', 't1_timestamp');
如果想一次性清空回收站,可以重新创建扩展 antdb_flashback;
DROP EXTENSION antdb_flashback cascade;
CREATE EXTENSION antdb_flashback;
回收站的关闭
- 去除 postgresql.conf中 的配置项;
adb_trashcan.enable = off
- 重启节点或者 reload 配置;
关闭闪回开关
前面介绍过 DDL 的闪回开关有专门的参数 adb_trashcan.enable,关闭此参数,则会单独关闭 DDL 闪回功能,如果想进一步关闭 DML 闪回功能,则还需要下面的操作;
- 删除 antdb_flashback 扩展
DROP EXTENSION antdb_flashback cascade;
-
删除 shared_preload_libraries 中的 antdb_flashback 配置;
-
重启数据库;
使用限制
-
目前只能闪回表的 DML 语句和 drop table 和 truncate table 语句;
-
有继承关系的表,不支持 DDL 闪回;
-
有序列和约束的表,不支持 DDL 闪回;
-
分区表的 DDL 闪回,只支持两层的分区表;