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

PostgreSQL 备份工具 pg_dump 与 pg_dumpall(上部分)


前言:

      前段时间,在学习kingbase数据库的备份后,于是想着整理PostgreSQL备份,在整理过程中,发现kingbase是基于PostgreSQL发展而来,但又有所区别,接下来将PostgreSQL备份分享如下:


测试环境:

主机名称                 操作系统                       PostgreSQL版本             
Node1CentOS 7.9PostgreSQL 16.2


第一部分:pg_dump 备份工具的使用方法


一.Pg_dump 工具功能概述


1.1、备份工具功能概述

pg_dump 是 PostgreSQL 数据库的一个强大的备份工具,它可以在数据库运行时进行备份,而不会影响其他用户对数据库的访问。pg_dump 可以将数据库备份为多种格式,包括纯文本脚本、自定义格式、目录格式和 tar 格式。这些备份文件可以用于恢复数据库,或者在不同的环境中迁移数据。

1.2、使用场景

pg_dump 通常用于以下几种场景:

  • 定期备份:为了防止数据丢失,定期使用 pg_dump 备份数据库是非常必要的。
  • 迁移数据库:当需要将数据库从一个服务器迁移到另一个服务器时,pg_dump 可以生成备份文件,然后在目标服务器上使用 pg_restore 恢复。
  • 灾难恢复:在发生数据损坏或丢失的情况下,可以使用 pg_dump 备份的文件来恢复数据。

1.3、常见的 pg_dump 选项

  • -h:指定数据库服务器的主机名或 IP 地址。
  • -p:指定数据库服务器的端口号。
  • -U:指定连接数据库时使用的用户名。
  • -d:指定要备份的数据库名称。
  • -F:指定导出文件格式,例如 c(自定义格式)、t(纯文本格式)等。
  • -f:指定导出文件的路径和名称。
  • -n:指定要导出的架构名称。
  • -t:指定要导出的表名称。

1.4、pg_dump功能列表图


二、学习 pg_dump --help 使用方法


2.1、pg_dump --help使用方法

说明: 如果您需要了解如何使用 pg_dump 或查看所有可用的选项,可以在命令行中运行 pg_dump --help 命令。这将显示一个详细的帮助菜单,列出了所有可用的选项和它们的说明。

代码如下:

[postgres@node1 /]$  sys_dump --help
sys_dump 把一个数据库转储为纯文本文件或者是其它格式.

用法:
  sys_dump [选项]... [数据库名字]

一般选项:
  -f, --file=FILENAME          输出文件或目录名
  -F, --format=c|d|t|p         输出文件格式(c为定制,d为目录,t为tar,p为明文(默认值))
  -j, --jobs=NUM               执行多个并行任务进行备份转储工作
  -v, --verbose                详细模式
  -V, --version                输出版本信息,然后退出
  -Z, --compress=默认不压缩           被压缩格式的压缩级别,压缩级别:0-9
  --lock-wait-timeout=TIMEOUT  在等待表锁超时后操作失败
  --no-sync                    不用等待变化安全写入磁盘
  -?, --help                   显示此帮助, 然后退出

控制输出内容选项:
  -a, --data-only              只转储数据,不包括模式
  -b, --large-objects  --blobs     在转储中包括大对象
  -B, --no-large-objects   --no-blobs  排除转储中的大型对象
  -c, --clean                  在重新创建之前,先清除(删除)数据库对象
  -C, --create                 在转储中包括命令,以便创建数据库
-e、 --extension=PATTERN     仅转储指定的扩展
  -E, --encoding=ENCODING      转储以ENCODING形式编码的数据
  -n, --schema=PATTERN         只导出指定的模式
  -N, --exclude-schema=PATTERN 不导出指定的模式
  -O, --no-owner               在明文格式中, 忽略恢复对象所属者
  -s, --schema-only            只转储模式, 不包括数据
  -S, --superuser=NAME         在明文格式中使用指定的超级用户名
  -t, --table=PATTERN          只导出指定表
  -T, --exclude-table=PATTERN  不导出指定表
  -x, --no-privileges          不要转储权限 (grant/revoke)
  --binary-upgrade             只能由升级工具使用
  --column-inserts             以带有列名的INSERT命令形式转储数据
  --disable-dollar-quoting     取消美元 (符号) 引号, 使用 SQL 标准引号
  --disable-triggers           在只恢复数据的过程中禁用触发器
  --enable-row-security        启用行安全性(只转储用户能够访问的内容)
--exclude table and children=PATTERN 不要转储指定的表,包括子表和分区表
  --exclude-table-data=PATTERN 不导出特定表数据
--exclude-table-data-and-children=PATTERN 不要转储指定表的数据,包括子表和分区表

  --extra-float-digits=NUM     覆盖extra_float_digits的默认设置
  --if-exists                  当删除对象时使用IF EXISTS
--include-foreign-data=PATTERN  在foreign上包含foreign表的数据,匹配PATTERN的服务器
  --inserts                    以INSERT命令,而不是COPY命令的形式转储数据
  --load-via-partition-root    通过根表加载分区
  --no-comments                不转储注释
  --no-publications            不转储发布


 --no-security-labels         不转储安全标签的分配
  --no-subscriptions           不转储订阅
--no-table-access-method    不转储表访问方法
  --no-tablespaces             不转储表空间分配信息
--no-toast-compression 不转储toast压缩方法
  --no-unlogged-table-data     不转储没有日志的表数据


  --on-conflict-do-nothing     将ON CONFLICT DO NOTHING添加到INSERT命令
   --quote-all-identifiers      所有标识符加引号,即使不是关键字
  --rows-per-insert=NROWS      每个插入的行数;意味着--inserts
--section=SECTION            备份命名的节 (数据前, 数据, 及 数据后)
  --serializable-deferrable    等到备份可以无异常运行
  --snapshot=SNAPSHOT          为转储使用给定的快照
  --strict-names               要求每个表和(或)schema包括模式以匹配至少一个实体
--table-and-children=PATTERN  仅转储指定的表,包括子表和分区表
  --use-set-session-authorization
                               使用 SESSION AUTHORIZATION 命令代替
                               ALTER OWNER 命令来设置所有权

联接选项:
  -d, --dbname=DBNAME      对数据库 DBNAME备份
  -h, --host=主机名        数据库服务器的主机名或套接字目录
  -p, --port=端口号        数据库服务器的端口号
  -U, --username=名字      以指定的数据库用户联接
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)
  --role=ROLENAME          在转储前运行SET ROLE

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@node1 /]$


三、pg_dump 备份


3.1、将数据库 postgres 导出到 postgres.sql 文件中

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump postgres >/postgres/backup/postgres.sql
[postgres@node1 /]$

查看导出文件:

代码如下:

[postgres@node1 /]$ ls /postgres/backup/postgres.sql
/postgres/backup/postgres.sql
[postgres@node1 /]$

3.2、将备份的 postgres.sql 文件导入到test数据库中


说明:

  • 1、在导入 postgres.sql 前,需创建 test 数据库
  • 2、在 test 数据库中导入 postgres.sql

代码如下:

[postgres@node1 /]$ createdb test
[postgres@node1 /]$
[postgres@node1 /]$ psql -dtest -f  /postgres/backup/postgres.sql
SET
SET
SET
SET
SET
 set_config
------------

(1 row)
...........................................
ALTER TABLE
ALTER TABLE
REVOKE
GRANT
GRANT


3.3、将 test 数据库备份成 dump 文件

代码如下:

[postgres@node1 /]$ pg_dump -Fc test > /postgres/backup/test.dmp
[postgres@node1 /]$ ls  /postgres/backup/test.dmp
/postgres/backup/test.dmp
[postgres@node1 /]$


3.4、将 test 数据库备份成目录格式的归档文件

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump -Fd test -f /postgres/backup/dumpdir
[postgres@node1 /]$
[postgres@node1 /]$ ls /postgres/backup/dumpdir
4373.dat.gz  4380.dat.gz  4387.dat.gz  4394.dat.gz  4398.dat.gz  4405.dat.gz
4375.dat.gz  4381.dat.gz  4389.dat.gz  4395.dat.gz  4399.dat.gz  toc.dat
4377.dat.gz  4383.dat.gz  4391.dat.gz  4396.dat.gz  4401.dat.gz
4379.dat.gz  4385.dat.gz  4393.dat.gz  4397.dat.gz  4403.dat.gz
[postgres@node1 /]$


3.5、将 5 个并行的工作任务转储一个数据库到一个目录格式的归档

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump -Fd test -j 5 -f /postgres/backup/dumpdir_5个任务合并成1个目录
[postgres@node1 /]$ ls  /postgres/backup/dumpdir_5个任务合并成1个目录        4373.dat.gz  4380.dat.gz  4387.dat.gz  4394.dat.gz  4398.dat.gz  4405.dat.gz
4375.dat.gz  4381.dat.gz  4389.dat.gz  4395.dat.gz  4399.dat.gz  toc.dat
4377.dat.gz  4383.dat.gz  4391.dat.gz  4396.dat.gz  4401.dat.gz
4379.dat.gz  4385.dat.gz  4393.dat.gz  4397.dat.gz  4403.dat.gz
[postgres@node1 /]$


3.6、备份名为 pu 开头,以 lic 结束的所有模式,并排除名为 server 的任何模式

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump -n 'pu*lic' -n 'ser*lic' -N '*server*'  test >/postgres/backup/schemaall.sql
[postgres@node1 /]$ ls /postgres/backup/schemaall.sql                        /postgres/backup/schemaall.sql
[postgres@node1 /]$


3.7、备份除以 c 开头以外的所有数据库对象

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump -T 'c*'  test > /postgres/backup/test_c.sql      [postgres@node1 /]$
[postgres@node1 /]$
[postgres@node1 /]$ ls /postgres/backup/test_c.sql
/postgres/backup/test_c.sql
[postgres@node1 /]$


3.8、要转储一个有混合大小写名称的 city 表

说明:要在-t 和相关开关中指定一个大写形式或混合大小写形式的名称,你需要双引用该名称,否则它会被折叠到小写形式 (请参见下面的Patterns)。但是双引号对于 shell 是特殊的,所以反过来它们必须被引用。

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dump -t "\"city"\" test > /postgres/backup/test_MixedCase.sql
[postgres@node1 /]$


第二部分:pg_dumpall 备份工具的使用方法


一、pg_dumpall --help 工具的使用方法


1.1、pg_dumpall 功能概述

pg_dumpall 是 PostgreSQL 数据库管理系统中的一个实用工具,它可以用来备份整个 PostgreSQL 数据库集群中的所有数据库。这个工具会将每个数据库以及集群中的全局对象(如角色和表空间)转换成一系列 SQL 命令,并存储在一个文件中。这个文件可以用来在另一个 PostgreSQL 实例中重建整个数据库集群。

1.2、pg_dumpall 功能列表图



二、pg_dumpall 查看帮助,学习使用方法

说明: 如果您需要了解如何使用 pg_dumpall 或查看所有可用的选项,可以在命令行中运行 pg_dump --help 命令。这将显示一个详细的帮助菜单,列出了所有可用的选项和它们的说明。

代码如下:

[postgres@node1 /]$  sys_dump --help
sys_dump 把一个数据库转储为纯文本文件或者是其它格式.

用法:
  sys_dump [选项]... [数据库名字]

一般选项:
  -f, --file=FILENAME          输出文件或目录名
  -v, --verbose                详细模式
  -V, --version                输出版本信息,然后退出
  --lock-wait-timeout=TIMEOUT  在等待表锁超时后操作失败
  -?, --help                   显示此帮助, 然后退出

控制输出内容选项:
  -a, --data-only              只转储数据,不包括模式
  -B, --no-large-objects   --no-blobs  排除转储中的大型对象
  -c, --clean                  在重新创建之前,先清除(删除)数据库对象
  -E, --encoding=ENCODING      转储以ENCODING形式编码的数据
-g, --globals-only           只转储全局对象,不转储数据库
  -O, --no-owner             在明文格式中, 忽略恢复对象所属者
-r, --roles-only             只转储角色,不转储数据库或表空间
  -s, --schema-only            只转储模式, 不包括数据
  -S, --superuser=NAME         在明文格式中使用指定的超级用户名
  -t, --tablespaces-only          只转储表空间,不转储数据库或角色
  -x, --no-privileges          不要转储权限 (grant/revoke)
  --binary-upgrade             只能由升级工具使用
  --column-inserts             以带有列名的INSERT命令形式转储数据
  --disable-dollar-quoting     取消美元 (符号) 引号, 使用 SQL 标准引号
  --disable-triggers           在只恢复数据的过程中禁用触发器
  --exclude-database=PATTERN 排除名称与PATTERN匹配的数据库
  --extra-float-digits=NUM     覆盖extra_float_digits的默认设置
  --if-exists                  当删除对象时使用IF EXISTS
  --inserts                    以INSERT命令,而不是COPY命令的形式转储数据
  --load-via-partition-root    通过根表加载分区
  --no-comments                不转储注释
  --no-publications            不转储发布
--no-role-passwords         不要转储角色的密码

 --no-security-labels         不转储安全标签的分配
  --no-subscriptions           不转储订阅
--no-sync                    不要等待更改安全写入磁盘
--no-table-access-method    不转储表访问方法
  --no-tablespaces             不转储表空间分配信息
--no-toast-compression 不转储toast压缩方法
  --no-unlogged-table-data     不转储没有日志的表数据


  --on-conflict-do-nothing     将ON CONFLICT DO NOTHING添加到INSERT命令
   --quote-all-identifiers      所有标识符加引号,即使不是关键字
 --rows-per-insert=NROWS      每个插入的行数;意味着--inserts
   --use-set-session-authorization  使用 SESSION AUTHORIZATION 命令代替
                               ALTER OWNER 命令来设置所有权

联接选项:
  -d, --dbname=DBNAME      对数据库 DBNAME备份
  -h, --host=主机名        数据库服务器的主机名或套接字目录
  -p, --port=端口号        数据库服务器的端口号
  -U, --username=名字      以指定的数据库用户联接
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)
  --role=ROLENAME          在转储前运行SET ROLE

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@node1 /]$

三、pg_dumpall 工具使用方法


3.1、备份所有数据库

代码如下:

[postgres@node1 /]$
[postgres@node1 /]$ pg_dumpall >/postgres/backup/pgall.sql
[postgres@node1 /]$

[postgres@node1 /]$ ll /postgres/backup
总用量 266
drwxrwxrwx 2 postgres postgres       6 5月  25 22:40 PackServer
-rw-rw-r-- 1 postgres postgres 2717995 6月  11 13:59 pgall.sql

3.2、备份 role 和 tablespace

代码如下:

[postgres@node1 /]$ pg_dumpall -g >/postgres/backup/pgtablespaceandroleall.sql
[postgres@node1 /]$
[postgres@node1 /]$ ll /postgres/backup
总用量 1298
drwxrwxrwx 2 postgres postgres   6 5月  25 22:40 PackServer
-rw-rw-r-- 1 postgres postgres 2717995 6月  11 13:59 pgall.sql
-rw-rw-r-- 1 postgres postgres 869 6月  11 13:56 pgtablespaceandroleall.sql
[postgres@node1 /]$

3.3、只备份 role

代码如下:

[postgres@node1 /]$ pg_dumpall -r >/postgres/backup/pgroleall.sql
[postgres@node1 /]$
[postgres@node1 /]$ ll /postgres/backup
总用量 2300
drwxrwxrwx 2 postgres postgres   6 5月  25 22:40 PackServer
-rw-rw-r-- 1 postgres postgres 2717995 6月  11 13:59 pgall.sql
-rw-rw-r-- 1 postgres postgres 869 6月  11 13:56 pgtablespaceandroleall.sql
-rw-rw-r-- 1 postgres postgres 774 6月  11 13:57 pgroleall.sql
[postgres@node1 /]$

3.4、只备份 tablespace

代码如下:

[postgres@node1 /]$ pg_dumpall -t >/postgres/backup/pgtablespaceall.sql
[postgres@node1 /]$
[postgres@node1 /]$ ll /postgres/backup
总用量 4500
drwxrwxrwx 2 postgres postgres   6 5月  25 22:40 PackServer
-rw-rw-r-- 1 postgres postgres 2717995 6月  11 13:59 pgall.sql
-rw-rw-r-- 1 postgres postgres 869 6月  11 13:56 pgtablespaceandroleall.sql
-rw-rw-r-- 1 postgres postgres 774 6月  11 13:57 pgroleall.sql
-rw-rw-r-- 1 postgres postgres 301 6月  11 13:57 pgtablespaceall.sql
[postgres@node1 /]$

3.5、其他备份需求,可根据帮助参数搭配



第三部分:pg_dump与pg_dumpall的区别


一、pg_dump 与 pg_dumpall 的 区别


1.1、pg_dump 和 pg_dumpall 的参数选项差异

pg_dump 和 pg_dumpall 是 PostgreSQL 数据库管理系统中用于备份的两个命令,它们在参数选项上有所不同,主要体现在备份范围和功能上。

1.2、pg_dump 的参数选项

  • -a, --data-only:只转储数据,不转储数据定义。
  • -n, --schema=PATTERN:只转储匹配 pattern 的模式,包括模式本身及其包含的所有对象。
  • -s, --schema-only:只转储对象定义(模式),不转储数据。
  • -t, --table=PATTERN:只转储名字匹配 pattern 的表。
  • -T, --exclude-table=PATTERN:不转储匹配 pattern 模式的任何表。
  • -F, --format=FORMAT:选择输出的格式,如自定义格式、目录格式、tar 格式或纯文本格式(默认)。
  • -j, --jobs=NUM:使用指定数量的并行作业来进行备份,仅适用于目录输出格式。
  • -Z, --compress=METHOD[:DETAIL]:指定压缩级别,仅适用于自定义和目录归档格式。
  • --lock-wait-timeout=TIMEOUT:设置导出时等待获取表锁的最大时间。

1.3、pg_dumpall 的参数选项

  • -a, --data-only:只转储数据,不转储数据定义。
  • -g, --globals-only:只转储全局对象(用户和组),不转储数据库。
  • -s, --schema-only:只转储模式(数据定义),不转储数据。
  • -v, --verbose:打印进度信息。
  • -W, --password:强制提示输入密码。
  • pg_dumpall 在备份时无法指定备份数据的格式,即无法使用-Fc 这样的参数。此外,pg_dumpall 可以备份整个 PostgreSQL 集群,包括所有数据库和全局对象,而 pg_dump 则用于备份单个数据库或数据库中的特定对象。

1.4、pg_dump与pg_dumpall 对比图



第四部分:总结

PostgreSQL 的 pg_dump 和 pg_dumpall 是两个用于备份数据库的命令行工具,它们在功能和使用场景上有所不同。

  • 备份范围:pg_dump 用于备份单个数据库,而 pg_dumpall 用于备份整个 PostgreSQL 集群,包括所有数据库和全局对象。
  • 输出格式:pg_dump 支持多种输出格式,包括自定义格式,这些格式可能更适合大型数据库的快速备份和恢复;pg_dumpall 只支持纯文本 SQL 脚本格式。
  • 灵活性:pg_dump 提供了更多的选项,如只备份数据或只备份结构、选择要备份的具体对象等;pg_dumpall 主要针对全面备份,提供较少的过滤选项。
  • 使用场景:如果只需要备份单一数据库或特定对象,pg_dump 是更好的选择。它可以灵活地为每个数据库创建单独的备份文件,并且您可以选择备份的内容。
  • 集群备份:如果希望备份整个 PostgreSQL 集群,并且想要包含全局对象和角色等,pg_dumpall 是更好的选择。这对于全量备份和集群恢复非常有用。
  • 综上所述,选择 pg_dump 还是 pg_dumpall 取决于备份的需要。若只需备份单一数据库或特定对象,pg_dump 是更好的选择。若需要备份整个数据库服务器,包括所有数据库和全局级对象,pg_dumpall 更加合适。

最后修改时间:2024-06-13 11:14:04
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论