使用 `pg_dump` 从数据库中仅获取一个表的插入语句。

180
我正在寻找一种方法,使用PostgreSQL中的pg_dump从数据库中的一个特定表获取所有行作为INSERT语句。
例如,我有一个表A,我需要将表A中的所有行作为INSERT语句,并将这些语句转储到一个文件中。
这是否可行?
6个回答

345

如果版本小于8.4.0

pg_dump -D -t <table> <database>

如果你只想要INSERTs,而不需要CREATE TABLE等来设置表,请在-t之前添加-a。

版本>= 8.4.0

pg_dump --column-inserts --data-only --table=<table> <database>

70
自 PostgreSQL 8.4 版本开始,已经移除了 -d 和 -D 选项(请参考 8.4.0 发布说明)。现在您需要使用“长”的选项名称:pg_dump --column-inserts --data-only --table=<table> <database>。 - Matthew Wood
1
-d-a-t 的短版本仍然存在。已经在 PG11 中进行了检查。 - demisx
1
“--inserts” 是另一个选项;它恢复速度稍快,但不能容忍列顺序更改。 - Andy
您可以通过运行查询 SELECT version(); 来检查PostgreSQL版本。 - Tms91

58

如果你想将你的插入语句导出到一个.sql文件中:

  1. cd到你要放置.sql文件的目录
  2. 运行以下命令: pg_dump --column-inserts --data-only --table=<表名> <数据库名> > my_dump.sql

请注意,该命令中的> my_dump.sql部分将把所有内容放入名为my_dump的.sql文件中。


8

如果您正在使用远程访问并想要转储所有数据库数据,则可以使用以下命令:

pg_dump -a -h 您的主机名 -U 您的用户名 -W -Fc 您的数据库 > DATA.dump

它将创建一个包含所有数据库数据的转储文件,并使用以下命令:

pg_restore -a -h 您的主机名 -U 您的用户名 -W -Fc 您的数据库 < DATA.dump

将相同的数据插入到您的数据库中,前提是您具有相同的结构。


对于 pg_restore,我必须添加一个用于数据库的 -d:-d your_database < mydump.dump。 - Harlin

3

对于PostgreSQL 12,以下方法适用:

pg_dump -d <database> -t <table> > DATA.dump

3
放入脚本中,我喜欢这样的形式:
#!/bin/bash
set -o xtrace # remove me after debug
TABLE=some_table_name
DB_NAME=prod_database

BASE_DIR=/var/backups/someDir
LOCATION="${BASE_DIR}/myApp_$(date +%Y%m%d_%H%M%S)"
FNAME="${LOCATION}_${DB_NAME}_${TABLE}.sql"

# Create backups directory if not exists
if [[ ! -e $BASE_DIR ]];then
       mkdir $BASE_DIR
       chown -R postgres:postgres $BASE_DIR
fi

sudo -H -u postgres pg_dump --column-inserts --data-only --table=$TABLE $DB_NAME > $FNAME
sudo gzip $FNAME

0
例如,您可以将用户(角色)johnapple 数据库的数据导出到 backup.sql,如下所示。*我的回答 解释了如何同时导出模式和数据。
pg_dump -U john -a apple > backup.sql

或者:

pg_dump -U john --data-only apple > backup.sql

而且,你可以将用户(角色)johnapple 数据库的数据仅导出到 backup.sql 文件中,并且只包含以下所示的列名的 INSERT 语句。
pg_dump -U john -a --column-inserts apple > backup.sql

而且,你可以将用户(角色)johnapple 数据库的数据仅导出到 backup.sql 文件中,只使用不包含列名的 INSERT 语句,如下所示:
pg_dump -U john -a --inserts apple > backup.sql

而且,您可以仅导出特定表格personanimal的数据,这些表格位于用户(角色)johnapple数据库中,并将其保存到backup.sql文件中,只包含以下所示的INSERT语句的列名。*在一个命令中可以指定多个表格。
pg_dump -U john -a --column-inserts -t person -t animal apple > backup.sql

或者:

pg_dump -U john -a --column-inserts --table=person --table=animal apple > backup.sql

或者:

pg_dump -U john -a --column-inserts --table person --table animal apple > backup.sql

最后举个例子,你只导出用户(角色)johnapple 数据库中特定表 personanimal 的数据到 backup.sql 文件中,只包含以下所示的带有列名的 INSERT 语句:
pg_dump -U john -a --column-inserts -t person -t animal apple > backup.sql

然后,您可以使用psqlbackup.sql导入到用户(角色)johnorange数据库中,该命令必须用于导入非归档文件,如下所示。*您必须先创建orange数据库和模式,否则会出现错误,我的回答解释了如何创建数据库,我的回答解释了如何导入模式和数据。
psql -U john -f backup.sql orange

例如,您可以将用户(角色)johnapple数据库中特定表personanimal的数据仅以INSERT语句的形式导出并存档(-Fc),并将其保存为backup.sql文件。下面是列名的示例。*我的回答解释了如何导出和存档数据库。
pg_dump -U john -Fc -a --column-inserts -t person -t animal apple > backup.sql

然后,您可以使用pg_restore将存档backup.sql导入到用户(角色)johnorange数据库中,如下所示。*您必须创建orange数据库和模式,否则会出现错误,my answer解释了如何创建数据库,my answer解释了如何导入存档文件。
pg_restore -U john -d orange < backup.sql

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接