跳到主要内容

逻辑备份与恢复

逻辑备份的原理是将数据库中的对象和数据转储成对应的 SQL 命令。Halo 提供 pg_dump、pg_dumpall、pg_restore 三个工具完成逻辑备份与恢复,三者分工如下:

  • pg_dump:备份单个数据库(可指定 schema、表等对象),是日常逻辑备份的常用工具。
  • pg_dumpall:备份整个数据库集群,包括所有数据库以及角色、表空间等全局对象,适合需要整体迁移或保留全局配置的场景。
  • pg_restore:恢复由 pg_dump 生成的备份文件(仅支持 custom、directory、tar 等非明文格式)。

逻辑备份的优点是操作灵活,可以选择备份整个数据库、指定 schema、指定表或指定数据;生成的备份文件为 SQL 格式,跨版本、跨平台兼容性好,适合数据迁移、小规模备份或特定对象的导出。但逻辑备份需要将数据逐条读取并转换为 SQL,备份速度较物理备份慢,尤其是数据库规模较大时差异更加明显。另一方面,逻辑备份占用的存储空间通常比物理备份小(仅存储数据内容,不包含数据文件中的空白页和索引结构)。恢复时需逐条执行 SQL 语句,恢复成本较高,且不支持按时间点恢复(PITR)。因此逻辑备份适合作为物理备份的补充,而非替代。

备份​

假设我们要备份名为 oracle 的数据库,我们可以使用如下命令:

pg_dump -Fc -v -f oracle.dump oracle

命令执行过程中会输出备份进度信息:

pg_dump: last built-in OID is 16383
pg_dump: reading extensions
pg_dump: identifying extension members
pg_dump: reading schemas
pg_dump: reading user-defined tables
pg_dump: reading user-defined functions
pg_dump: reading user-defined types
pg_dump: reading procedural languages
pg_dump: reading user-defined aggregate functions
pg_dump: reading user-defined operators
pg_dump: reading user-defined access methods
pg_dump: reading user-defined operator classes
pg_dump: reading user-defined operator families
pg_dump: reading user-defined text search parsers
pg_dump: reading user-defined text search templates
pg_dump: reading user-defined text search dictionaries
pg_dump: reading user-defined text search configurations
pg_dump: reading user-defined foreign-data wrappers
pg_dump: reading user-defined foreign servers
pg_dump: reading default privileges
pg_dump: reading user-defined collations
pg_dump: reading user-defined conversions
pg_dump: reading type casts
pg_dump: reading transforms
pg_dump: reading table inheritance information
pg_dump: reading event triggers
pg_dump: finding extension tables
pg_dump: finding inheritance relationships
pg_dump: reading column info for interesting tables
pg_dump: finding the columns and types of table "public.t_a"
pg_dump: flagging inherited columns in subtables
pg_dump: reading indexes
pg_dump: flagging indexes in partitioned tables
pg_dump: reading extended statistics
pg_dump: reading constraints
pg_dump: reading triggers
pg_dump: reading rewrite rules
pg_dump: reading policies
pg_dump: reading row-level security policies
pg_dump: reading publications
pg_dump: reading publication membership
pg_dump: reading subscriptions
pg_dump: reading large objects
pg_dump: reading dependency data
pg_dump: saving encoding = UTF8
pg_dump: saving standard_conforming_strings = on
pg_dump: saving search_path = public
pg_dump: saving database definition
pg_dump: dumping contents of table "public.t_a"

命令成功结束后,会生成一个 oracle.dump 的备份文件。

全集群备份(pg_dumpall)

pg_dump 一次只能备份单个数据库,且不包含角色、表空间等全局对象。当需要备份整个集群(所有数据库 + 全局对象)时,应使用 pg_dumpall。例如,将整个集群备份为单个 SQL 脚本文件:

pg_dumpall -v -f cluster.sql

主要参数含义:

参数说明
-v, --verbose详细模式,输出备份进度信息。
-f, --file输出文件名。不指定时输出到标准输出。
-g, --globals-only只备份全局对象(角色、表空间等),不备份数据库。常用于单独导出账号权限。
--roles-only只备份角色,不备份数据库和表空间。
--tablespaces-only只备份表空间,不备份数据库和角色。

说明: pg_dumpall 输出的是明文 SQL 脚本,恢复时直接用 psql 执行该脚本即可(如 psql -f cluster.sql),不需要也不支持 pg_restore。pg_dumpall 的完整参数列表见附录B 备份恢复工具命令参考。

恢复​

假设我们需要对 oracle 进行恢复,我们可以使用如下命令:

pg_restore -v -C -d oracle oracle.dump

命令中各参数的含义如下:

参数说明
-v, --verbose详细模式,输出恢复进度信息。
-C, --create恢复前先创建目标数据库(库名取自备份文件),用于恢复到一个全新的库。
-d, --dbname指定连接的目标数据库。与 -C 联用时,-d 指定的库仅作登录入口(需已存在),数据实际恢复到 -C 新建的库中。
oracle.dump待恢复的备份文件(由 pg_dump 生成)。

说明: 上例中 -C 与 -d oracle 同时使用,含义是"先连接到已存在的 oracle 库作为入口,再创建一个同名的新库 oracle 并将数据恢复进去"。若目标库已存在、无需新建,则去掉 -C,直接用 -d oracle 恢复到已有库即可。pg_restore 的完整参数列表见附录B 备份恢复工具命令参考。

恢复过程输出:

pg_restore: connecting to database for restore
pg_restore: creating DATABASE "oracle"
pg_restore: connecting to new database "oracle"
pg_restore: creating TABLE "public.t_a"
pg_restore: processing data for table "public.t_a"

这样,oracle 数据库就完成了恢复。