分享至

概述

本指南介绍了如何从 PostgreSQL 数据库导出数据以及如何将数据导入 PostgreSQL 数据库。您可以在官方 PostgreSQL 文档 中了解更多有关此主题的信息。

使用 pg_dump 导出数据

pg_dump 是一个原生 PostgreSQL 实用程序,您可以使用它从 PostgreSQL 数据库导出数据。要查看此命令的所有选项,请运行

pg_dump --help

来自 PostgreSQL 文档

这种转储方法的思路是生成一个包含 SQL 命令的文件,这些命令在反馈回服务器时会重新创建数据库,使其与转储时的状态相同。PostgreSQL 提供了用于此目的的实用程序 pg_dumppg_dump 是一个普通的 PostgreSQL 客户端应用程序(尽管它特别聪明)。这意味着您可以从任何可以访问数据库的远程主机执行此备份过程。但请记住,pg_dump 不使用特殊权限。特别是,它必须对要备份的所有表具有读取权限,因此为了备份整个数据库,您几乎总是必须以数据库超级用户的身份运行它。

该命令的基本语法如下所示

pg_dump DB_NAME > OUTPUT_FILE

您需要将 DB_NAMEOUTPUT_FILE 占位符替换为以下内容:

  • 您的 **数据库名称**
  • 所需 **输出文件** 的名称(应以 .sql 结尾以获得最佳的互操作性)

例如,要将本地 PostgreSQL 服务器上名为 mydb 的数据库中的数据导出到名为 mydb.sql 的文件中,您可以使用以下命令

pg_dump mydb > mydb.sql

如果您的数据库模式使用 对象标识符类型 (OID),您需要使用 --oids(缩写为 -o)选项运行 pg_dump

pg_dump mydb --oids > mydb.sql

提供数据库凭据

您可以添加以下参数来指定 PostgreSQL 数据库服务器的位置

参数默认值环境变量描述
--host(缩写为 -hlocalhostPGHOST服务器主机机器的地址
--port(缩写为 -p-PGPORT服务器主机机器上 PostgreSQL 服务器正在侦听的端口

要对 PostgreSQL 数据库服务器进行身份验证,您可以使用以下参数

参数默认值环境变量描述
--username(缩写为 -U您当前的操作系统用户名PGUSER数据库用户的名称。

例如,如果您要从具有以下 连接字符串 的 PostgreSQL 数据库导出数据

postgresql://opnmyfngbknppm:[email protected]:5432/d50rgmkqi2ipus

您可以使用以下 pg_dump 命令

pg_dump --host ec2-46-137-91-216.eu-west-1.compute.amazonaws.com --port 5432 --user opnmyfngbknppm d50rgmkqi2ipus > backup.sql

请注意,**此命令将触发一个提示,您需要在其中指定提供的用户的密码**。

控制输出

在某些情况下,您可能不想转储整个数据库,例如,您可能想要

  • 只转储实际数据,但不包括 DDL(即定义数据库模式的 SQL 语句,例如 CREATE TABLE 等)
  • 只转储 DDL,但不包括实际数据
  • 排除特定的 PostgreSQL 模式
  • 排除大型文件
  • 排除特定表

以下是在这些情况下您可以使用的一些命令行选项概述

参数默认值描述
--data-only(缩写为 -afalse排除任何 DDL 语句,只导出数据。
--schema-only(缩写为 -sfalse排除数据,只导出 DDL 语句。
--blobs(缩写为 -b除非指定了 -schema--table--schema-only 选项,否则为 true包含二进制大对象。
--no-blobs(缩写为 -Bfalse排除二进制大对象。
--table(缩写为 -t默认情况下包括所有表显式指定要转储的表的名称。
--exclude-table(缩写为 -T-从转储中排除特定表。

从 SQL 文件导入数据

使用 SQL Dump 将您的 PostgreSQL 数据库导出为 SQL 文件后,您可以通过将 SQL 文件输入 psql 来恢复数据库的状态。

psql DB_NAME < INPUT_FILE

您需要用相应的实际值替换 DB_NAMEINPUT_FILE 占位符,分别对应:

  • 您的 **数据库名称** (必须先创建具有该名称的数据库!)
  • 目标 **输入文件** 的名称(通常以 .sql 结尾)

要事先创建数据库 DB_NAME,您可以使用 template0 (这将创建一个不包含任何站点本地添加的普通用户数据库)。

CREATE DATABASE dbname TEMPLATE template0;

结论

从 PostgreSQL 导出数据并再次导入以重建数据结构和填充数据库,是迁移数据、备份和恢复或准备复制的好方法。了解 pg_dumppsql 工具如何协同工作以完成此任务将有助于您跨越数据库的边界传输数据。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直在撰写有关数据库、Linux、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。