1.pg_dump
pg_dump 是用于备份一种 PostgreSQL 数据库的工具。即使数据库正在被并发使用,它也能创建一致的备份。pg_dump不阻塞其他用户访问数据库(读取或写入)。
pg_dump 只转储单个数据库。要备份一个集簇中 对于所有数据库公共的全局对象(例如角色和表空间),应使用 pg_dumpall。
转储可以被输出到脚本或归档文件格式。脚本转储是包含 SQL 命令的纯文本文件,它们可以用来重构数据库到它被转储时的状态。
另一种可选的归档文件格式必须与 pg_restore配合使用来重建数据库。它们允许 pg_restore 能选择恢复什么,或者甚至在恢复之前对条目重排序。归档文件格式被设计为在架构之间可移植。
当使用归档文件格式之一并与 pg_restore 组合时,pg_dump提供了一种灵活的归档和传输机制。**pg_dump可以被用来备份整个数据库,然后 pg_restore 可以被用来检查归档并/或选择数据库的哪些部分要被恢复。**最灵活的输出文件格式是"自定义"格式( -Fc )和"目录"格式(-Fd)。它们允许选择和重排序所有已归档项、支持并行恢复并且默认是压缩的。"目录"格式是唯一一种支持并行转储的格式。
要声明pg_dump连接哪个数据库服务器,使用命令行选项-hhost 和 -p port 。 默认主机是本地主机或PGHOST环境变量指定的主机。 默认端口是环境变量PGPORT或(如果PGPORT不存在)内建的默认值。
和任何其他PostgreSQL客户端应用一样, pg_dump默认使用与当前操作系统用户名同名的数据库用户名进行连接。 要使用其他名字,要么声明-U选项,要么设置环境变量PGUSER。请注意pg_dump的连接也要通过客户认证机制。
pg_dump对于其他备份方法的一个重要优势是,pg_dump的输出可以很容易地在新版本的PostgreSQL中载入,而文件级备份和连续归档都是极度的服务器版本限定的。pg_dump也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个32位服务器到一个64位服务器。
2. pg_dump使用
pg_dump生成的文本文件可以由psql程序读取。从转储中恢复的常用命令是:
psql dbname < dumpfile
其中dumpfile就是pg_dump命令的输出文件。这条命令不会创建数据库dbname,必须在执行psql前自己从template0创建(例如,用命令 createdb -T template0 dbname )。psql支持类似pg_dump的选项用以指定要连接的数据库服务器和要使用的用户名。非文本文件转储可以使用 pg_restore 工具来恢复。
使用示例:
1、利用pg_dump进行转储
[root@pgdb_backup]# pg_dump -U postgres mydb > ./pgdb_bk_`date +%F`.sql
也可以压缩来节省存储空间:
[root@pgdb_backup]# pg_dump -U postgres mydb |gzip > ./pgdb_bk_`date +%F`.sql.gz
2、删除原数据库进行测试
postgres=# drop database mydb;
DROP DATABASE
3、创建一个新的空数据库:
CREATE DATABASE mydb
WITH
TEMPLATE = template0
OWNER = mydb
ENCODING = 'UTF8'
LC_COLLATE = 'zh_CN.utf8'
LC_CTYPE = 'zh_CN.utf8'
CONNECTION LIMIT = -1;
4、将转储文件恢复至mydb中:
[root@ pgdb_backup]# psql -U postgres -d mydb < pgdb_bk_2023-12-04.sql
示例:
1、 将数据库转储,以时间命名:
2、 为转储文件准备一个空的数据库:
3、将转储文件还原为数据库:
3. pg_restore使用
测试导出归档日志文件格式的一种恢复,转储一个数据库到一个自定义格式归档文件:
$ pg_dump -U postgres -Fc mydb > db.dump
导入的时候:
$ pg_restore -U postgres -d mydb pgdb_bk_2023-12-24.dump --需要重新创建mydb数据库
$ pg_restore -U postgres -C -d postgres pgdb_bk_2023-12-24.dump --不需要创建mydb
说明:
-C
--create
在恢复一个数据库之前先创建它。如果还指定了 --clean ,在连接到目标数据库之前丢弃
并且重建它。
在使用这个选项时, -d 提到的数据库只被用于发出初始的 DROP DATABASE 和 CREATE
DATABASE 命令。所有要恢复到该数据库名中的数据都出现在归档中。
-d dbname
--dbname=dbname
4. pg_dumpall使用
pg_dump每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集簇的全部内容,提供了pg_dumpall程序。 pg_dumpall备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是:
pg_dumpall > dumpfile
转储的结果可以使用psql恢复:
psql -f dumpfile postgres
pg_dumpall工作时会发出命令重新创建角色、表空间和空数据库,接着为每一个数据库pg_dump。这意味着每个数据库自身是一致的,但是不同数据库的快照并不同步。
集簇范围的数据可以使用pg_dumpall的--globals-only选项来单独转储。
5. 大型数据库转储
在一些具有最大文件尺寸限制的操作系统上创建大型的pg_dump输出文件可能会出现问题。pg_dump可以写出到标准输出,因此要使用标准Unix工具来处理这种潜在的问题。有几种主要方法:
1、使用压缩转储。压缩程序,例如gzip:
pg_dump dbname| gzip > filename.gz
恢复:
gunzip -c filename.gz | psql dbname
2、使用split。. split命令允许将输出分割成较小的文件以便能够适应底层文件系统的尺寸要求。例如,让每一块的大小为1兆字节:
pg_dump dbname| split -b 1m -- filename
恢复:
cat filename * | psql dbname
3、使用pg_dump的自定义转储格式。. 如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用gzip时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。下面的命令使用自定义转储格式来转储一个数据库:
pg_dump -Fc dbname > filename
自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:
pg_restore -d dbname filename
4、使用pg_dump的并行转储特性。. 为了加快转储一个大型数据库的速度,可以使用pg_dump的并行模式。它将同时转储多个表。可以使用-j参数控制并行度。并行转储只支持"目录"归档格式。
pg_dump -j num -F d -f out.dir dbname
可以使用pg_restore -j来以并行方式恢复一个转储。它只能适合于"自定义"归档或者"目录"归档,但不管归档是否由pg_dump -j创建。