逻辑备份与恢复
逻辑备份的原理是将数据库中的对象和数据转储成对应的 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 数据库就完成了恢复。