postgresql weekly推荐了几款备份恢复工具,其中一个是pg_dumpbinary。
pg_dumpbinary
是一个用于转储PG数据库的工具,其中数据以二进制格式转储。必须使用对应工具pg_restorebinary恢复。
pg_dumpbinary在某些情况下很有用:
1)有pg_dump无法导出的bytea,由于转义/十六制输出超过1GB
2)有自定义类型,内部以bytea形式存储 ,但是数据作为char/varchar/text输出,会被’ ’截断。这种场景下,pg_dump会以输出格式导出数据,造成数据丢失。
3)任何其他使用二进制的场景会很有用。
如何您在这种情况下,pg_dumpbinary将通过二进制格式转储PG数据库来帮助您。在其他所有情况下,必须使用PG分发的pg_dump/pg_restore工具。
该程序使用给定的名称作为备份参数创建一个目录,然后在该目录中使用pg_dump转储per-data和post-data部分。
pg_dumpbinary从pre-data部分收集模式和表的列表,并通过psql命令执行SQL COPY命令以从所有表中以二进制格式转储所有数据。COPY语句:
COPY my_table TO stdout WITH (FORMAT binary);
所有数据都导出到每个表的文件中,名为:data-schema.table.bin.gz。该文件使用gzip即时压缩。可以使用pg_restorebinary程序恢复备份。pg_dumpbinary创建一致的备份,数据库服务器需要支持同步快照,这是在PG9.2中引入的用于主服务器和10用于备服务器的功能。pg_dumpbinary会拒绝dump小于这个最小版本的数据库。
pg_dumpbinary使用多个database连接,与主进程连接到database一次,以创建同步快照并转储pre-data部分。使用这个同步快照的每个work任务再连接一次。
pg_restorebinary
用于恢复使用pg_dumpbinary命令以二进制格式转储的PG数据库的工具。程序读取作为备份参数给出的目录,然后再-d选项中恢复数据库中的pre-data部分。完成后,继续进行数据导入。所有数据文件都再运行中解压缩并使用COPY SQL命令发送的psql命令,如:
COPY my_table FROM stdin WITH (FORMAT binary);
然后将post-data部分导入新数据库。
安装
pg_dumpbinary和pg_restorebinary都是perl程序,除了perl本身、perl模块DBD::pg和DateTime外不需要任何其他东西。PG命令pg_dump、pg_restore和psql必须通过PATH环境变量设置才可用。数据通过gzip压缩。
Perl 模块 Date::Time 可以使用sudo apt install libdatetime-perl 或安装sudo yum install perl-Date-Time。您也可以从从CPAN下载的源安装它。
Perl 模块 DBD::Pg 可以使用sudo apt install libdbd-pg-perl 或安装sudo yum install perl-DBI perl-DBD-Pg。您也可以从从CPAN下载的源安装它。
要安装 pg_dumpbinary:
代码语言:javascript复制perl Makefile.PL
make
sudo make install
用法
pg_dumpbinary
代码语言:javascript复制usage: pg_dumpbinary -d dbname [options] backup_name
backup_name output directory where dump will be saved. Default
directory name is binary_bkup_YYYY-MM-DDTHH:MM:SS
when no output directory is provided.
options:
-d, --database DBNAME database to dump
-h, --host HOSTNAME database server host or socket directory
-j, --job NUM use this many parallel jobs to dump
-n, --schema SCHEMA dump the named schema(s) only
-N, --exclude-schema SCHEMA do NOT dump the named schema(s)
-p, --port PORT database server port number, default: 5432
-t, --table TABLE dump named relation
-T, --exclude-table TABLE do NOT dump the named table
-u, --user NAME connect as specified database user
-v, --version show program version
--help show usage
--load-via-partition-root dump data through partitioned table only, make
the COPY statements target the root of the
partitioning hierarchy rather than the partition
pg_restorebinary
代码语言:javascript复制usage: pg_restorebinary [options] -d dbname backup_dir
backup_dir directory where backup files to restore will be read.
It must be a directory created by pg_dumpbinary.
options:
-a, --data-only restore only the data, no schema
-d, --database DBNAME database to restore, it must exists
-E, --exclude-ext EXTNAME name of an extension to not restore, it can
be used multiple time.
-h, --host HOSTNAME database server host or socket directory
-i, --info print information about the dump and exit
-j, --job NUM use this many parallel jobs to restore
-n, --schema SCHEMA restore the named schema(s) only
-N, --exclude-schema SCHEMA do NOT restore the named schema(s)
-p, --port PORT database server port number, default: 5432
-t, --table TABLE restore named relation
-T, --exclude-table TABLE do NOT restore the named table
-u, --user NAME connect as specified database user
-v, --version show program version
--help show usage
--disable-triggers disable triggers during data restore
--truncate truncate the table before importing the data
--schema-exists add an IF NOT EXISTS clause to CREATE SCHEMA
并行处理
通过 pg_dumpbinary 在导出期间使用并行可以提高转储速度。将选项 -j 设置为要使用的同时进程数。该行为类似于目录格式中 pg_dump 的 -j 选项。
在调用 pg_restorebinary 期间使用并行可以提高类似的恢复速度。将选项 -j 设置为要使用的同时进程数。该行为类似于 pg_restore 的 -j 选项。
并行性还用于恢复索引和约束的后数据部分。
二进制格式
pg_dumpbinary 以二进制格式存储所有表数据,它速度很快,但请注意,它在机器架构和 PostgreSQL 版本之间的可移植性较差。二进制格式是非常特定于数据类型的,不可能在具有不同类型的列中导入数据。
原文
https://github.com/lzlabs/pg_dumpbinary