分享到

概述

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

使用 pg_dump 导出数据

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

pg_dump --help

来自 PostgreSQL 文档

这种转储方法背后的想法是生成一个包含 SQL 命令的文件,当将该文件反馈给服务器时,将以与转储时相同的状态重新创建数据库。PostgreSQL 提供了实用程序 pg_dump 来实现此目的。pg_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-PGPORTPostgreSQL 服务器正在监听的服务器主机端口

要对 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(简写:-btrue,除非指定了 -schema--table--schema-only 选项包含二进制大对象。
--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

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