暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PostgreSQL 学习笔记020 —— PostgreSQL 备份恢复

心有阳光 2023-02-04
1515

Postgresql 备份恢复

简述

备份(backup),通过某种方式(物理复制或者逻辑导出)将数据库的文件或结构和数据拷贝到其他位置进行存储。
还原(restore),一种不完全的恢复,使用备份的文件将数据库恢复到执行备份时的状态。备份时间点之后的数据变更无法通过还原进行恢复。
恢复(recovery),执行恢复时,通常是先使用物理备份文件进行还原,然后再应用备份时间点到故障点之间的日志文件(WAL),将数据库恢复到最新状态。

备份类型

物理备份与逻辑备份

物理备份(Physical Backup) 就是直接复制数据库相关的文件。通常来说,物理备份比逻辑备份更快,但是占用的空间也更大。PostgreSQL 支持在线和离线的物理备份。实际环境中应该以物理备份为主。

逻辑备份(Logical Backup) 就是将数据库的结构和数据导出为 SQL 文件,还原时通过文件中的 SQL 语句和命令重建数据库并恢复数据。逻辑备份通常需要更多的备份和还原时间。逻辑备份可以作为物理备份的补充,或者用于测试目的的数据导入导出。

在线备份与离线备份

在线备份(Online Backup) 是指 PostgreSQL 服务器处于启动状态时的备份,也称为热备份(Hot Backup)。由于逻辑备份需要连接到数据库进行操作,因此逻辑备份只能是在线备份。

离线备份(Offline Backup) 是指 PostgreSQL 服务器处于关闭状态时的备份,也称为冷备份(Cold Backup)。离线状态只能执行数据库的物理备份,即复制数据库文件。

全量备份与增量备份

全量备份(Full Backup) 就是备份所有的数据库文件,执行一次完整的 PostgreSQL 数据库集群备份。这种方式需要备份的内容较多,备份时较慢,但是恢复速度更快。

增量备份(Incremental Backup) 就是备份上一次备份(任何类型)之后改变的文件。
差异备份(Differential Backup) 是针对上一次完全备份后发生变化的所有文件进行备份。增量备份每次备份的数据量较小,但是恢复时需要基于全量备份,并依次恢复增量部分,时间较长。差异备份位于两者之间。

在 PostgreSQL 中是通过一个基准备份(Base Backup),加上不断备份的事务日志文件(WAL)来达到增量备份的效果。

在实际环境中可以结合全量备份和增量/差异备份,以平衡备份和恢复所需的存储空间和时间。

备份恢复工具

  • pg_dump:逻辑备份工具,支持单个数据库(可以指定模式、表)的导出,可以选择导出的格式。
  • pg_dumpall:逻辑备份工具,用于导出整个数据库集群,包括公用的全局对象。
  • pg_basebackup:物理备份工具,为数据库集群创建一个基准备份。它也可以用于时间点恢复(point-in-time recovery)的基准备份,或者设置基于日志传输或流复制的从节点的初始化。
  • psql:PostgreSQL 交互式命令行工具,也可以用于导入逻辑备份产生的 SQL 文件。
  • pg_restore:逻辑还原工具,用于还原 pg_dump 导出的归档格式的备份文件。
  • copy:PostgreSQL 专有的 SQL 语句,将表中的数据复制到文件,或者将文件中的数据复制到表中。

备份与恢复

逻辑备份与还原

执行逻辑备份时,PostgreSQL 服务器必须已经启动,备份工具(例如 pg_dump)通过建立数据库连接,从数据库中查询出相应的结构信息和数据,并生成备份文件。针对不同的备份格式,PostgreSQL 提供了配套的还原工具。

备份单个数据库

PostgreSQL 提供了备份单个数据库的工具 pg_dump。它支持三种文件格式:

  • plain:文本格式,输出一个纯文本形式的 SQL 脚本,默认值。还原时直接使用 psql 导入。
  • custom:自定义格式,输出一个自定义格式的归档文件,还原时使用 pg_restore 工具。与目录导出格式结合使用时,提供了最灵活的输出格式,它允许在恢复时手动选择和排序已归档的项。这种格式在默认情况还会进行文件的压缩。
  • directory:目录格式,输出一个目录格式的归档,还原时使用 pg_restore 工具。这种格式将会创建一个目录,为每个导出的表和大对象都创建一个文件,另外再创建一个内容目录文件,该文件使用自定义格式存储关于导出对象的描述。这种格式在默认情况还会进行文件的压缩,并且支持并行导出。
  • tar:打包格式,输出一个 tar 格式的归档,还原时使用 pg_restore 工具。这种格式与目录格式兼容,解压一个 tar 格式的归档将会产生一个目录格式的归档。但是,tar 格式不支持压缩。另外,在使用 tar 格式归档进行还原时,表数据项的相对顺序不能进行改动。
[postgres@192 ~]$ pwd /home/postgres [postgres@192 ~]$ pg_dump --help pg_dump dumps a database as a text file or to other formats. Usage: pg_dump [OPTION]... [DBNAME] General options: -- 导出文件名 -f, --file=FILENAME output file or directory name -- 导出数据格式(text, 自定义转储格式,目录,tar) -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 -v, --verbose verbose mode -V, --version output version information, then exit -- 使用gzip压缩 -Z, --compress=0-9 compression level for compressed formats --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock --no-sync do not wait for changes to be written safely to disk -?, --help show this help, then exit Options controlling the output content: -- 只输出数据,不输出模式(数据对象的定义)。这个选项只是对纯文本格式有意义。对于归档格式,可以在调用pg_restore时指定选项。 -a, --data-only dump only the data, not the schema -- 在输出中是否包含大对象。除非指定了选择性输出的选项 --schema、–table、–schema-only 开关,否则默认会输出大对象。 -b, --blobs include large objects in dump -B, --no-blobs exclude large objects in dump -- 在输出创建数据库对象的SQL命令之前,先输出删除该数据库对象的SQL命令。这个选项只是对纯文本格式有意义。对于归档格式,可以在调用 pg_restore时指定选项。 -c, --clean clean (drop) database objects before recreating -- 先输出创建数据库的命令,之后再重新连接新创建的数据库。对于此种格式的脚本,在运行之前是和哪个数据库进行连接就不这么重要了。这个选项只是对纯文本格式有意义。对于归档格式,可以在调用pg_restore时指定选项。 -C, --create include commands to create database in dump -e, --extension=PATTERN dump the specified extension(s) only -- 以指定的字符集编码创建输出,默认为数据库字符集。 -E, --encoding=ENCODING dump the data in encoding ENCODING -- 只转储schema的内容。如果没有声明该选项,目标数据库中的所有非系统模式都会被转储。该选项也可以被多次指定,以指定不同pattern的模式。 -n, --schema=PATTERN dump the specified schema(s) only -- 不转储匹配schema的内容,其他规则和-n一致。 -N, --exclude-schema=PATTERN do NOT dump the specified schema(s) -- 不输出设置对象所有权的SQL命令。 -O, --no-owner skip restoration of object ownership in plain-text format -- 只导出对象定义不导出数据 -s, --schema-only dump only the schema, no data -- 指定超级用户 -S, --superuser=NAME superuser user name to use in plain-text format -- 只转储指定名称的表 -t, --table=PATTERN dump the specified table(s) only -- 不转储指定名称的表 -T, --exclude-table=PATTERN do NOT dump the specified table(s) -- 不转储权限 (grant/revoke) -x, --no-privileges do not dump privileges (grant/revoke) -- 只能由升级工具使用 --binary-upgrade for use by upgrade utilities only -- 以带有列名的insert命令形式转储数据 --column-inserts dump data as INSERT commands with column names -- 取消美元 (符号) 引号, 使用 SQL 标准引号 --disable-dollar-quoting disable dollar quoting, use SQL standard quoting -- 禁用触发器 --disable-triggers disable triggers during data-only restore --enable-row-security enable row security (dump only content user has access to) -- 不转储指定表的数据 --exclude-table-data=PATTERN do NOT dump data for the specified table(s) --extra-float-digits=NUM override default setting for extra_float_digits --if-exists use IF EXISTS when dropping objects --include-foreign-data=PATTERN include data of foreign tables on foreign servers matching PATTERN -- 将数据转储为insert命令,而不是copy命令 --inserts dump data as INSERT commands, rather than COPY --load-via-partition-root load partitions via the root table --no-comments do not dump comments --no-publications do not dump publications -- 不分配安全标签进行转储 --no-security-labels do not dump security label assignments --no-subscriptions do not dump subscriptions -- 不在并行任务中使用同步快照 --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs -- 不转储表空间分配信息 --no-tablespaces do not dump tablespace assignments --no-toast-compression do not dump TOAST compression methods -- 不转储未标记的表数据 --no-unlogged-table-data do not dump unlogged table data --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands -- 引用所有标识符( 不是关键字 ) --quote-all-identifiers quote all identifiers, even if not key words --rows-per-insert=NROWS number of rows per INSERT; implies --inserts -- 转储命名部分(pre-data, data, or post-data) --section=SECTION dump named section (pre-data, data, or post-data) -- 等待没有异常的情况下进行转储 --serializable-deferrable wait until the dump can run without anomalies --snapshot=SNAPSHOT use given snapshot for the dump --strict-names require table and/or schema include patterns to match at least one entity each -- 使用SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来设置所有权 --use-set-session-authorization use SET SESSION AUTHORIZATION commands instead of ALTER OWNER commands to set ownership Connection options: -- 导出的数据库名字 -d, --dbname=DBNAME database to dump -- 连接到指定数据库主机地址 -h, --host=HOSTNAME database server host or socket directory -- 连接到指定数据库端口 -p, --port=PORT database server port number -- 连接使用的用户名 -U, --username=NAME connect as specified database user -- 从不提示密码,该选项常用于后台脚本中 -w, --no-password never prompt for password -- 强制 pg_dump 在连接到一个数据库之前提示密码,某些情况下可避免额外的连接尝试。 -W, --password force password prompt (should happen automatically) -- 该选项会导致 pg_dump 在连接到数据库时发布一个 set role rolename 命令。相当于切换到另一个角色。当已验证的用户缺少 pg_dump需要的权限时,可以使用这个功能切换到一个相应权限的角色。 --role=ROLENAME do SET ROLE before dump If no database name is supplied, then the PGDATABASE environment variable value is used. Report bugs to <pgsql-bugs@lists.postgresql.org>. PostgreSQL home page: <https://www.postgresql.org/> [postgres@192 ~]$
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论