如何在postgres数据库中创建单个表的备份?


160

有没有一种方法可以使用postgres在数据库中创建单个表的备份?如何?这也可以与pg_dump命令一起使用吗?

Answers:


211

使用--table告诉pg_dump什么表它必须备份:

pg_dump --host localhost --port 5432 --username postgres --format plain --verbose --file "<abstract_file_path>" --table public.tablename dbname

9
以及如何还原该备份文件。(.backup),pg_restore --host localhost --port 5432 --username postgres --dbname "anydb" --table public.tablename -Ft --verbose "/path/filename.backup"但我使用了它,但结果出来了:pg_restore: [tar archiver] corrupt tar header found in --
Anderson Dorregaray Linares,2016年

13
psql -U username -d database -1 -f your_dump.sql
rnaud

5
您是什么意思:abstract_file_path?
bandungeuy

3
我不确定为什么要对这个答案进行投票,人们单击+1而不自己检查或尝试检查。这个答案的问题,使它完全无用,是给定的解决方案/命令没有导出在表上创建的序列(主键),因此导入失败。我不知道任何不使用主键与序列的生产PG数据库。这是一半的答案,无法彻底回答问题,并且需要其他工作才能导出/导入单个表。
user10664542 '19

1
与sudo略有不同,我最终在文件转储上出现了权限错误(由于用户postgres对我的目录没有写访问权,因此在逻辑上是足够的),并且我有一个未知的标志错误--ignore-version。比较简单的Prashant Kumar的答案对我有用。
JL Peyret

84

如果您使用的是Ubuntu,

  1. 登录到您的postgres用户 sudo su postgres
  2. pg_dump -d <database_name> -t <table_name> > file.sql

请确保您正在执行的命令,其中的postgres用户具有写权限(例如:/tmp

编辑

如果要将.sql转储到另一台计算机中,则可能需要考虑跳过保存到.sql文件中的所有者信息。

您可以使用 pg_dump --no-owner -d <database_name> -t <table_name> > file.sql


1
如果您想要所有表而不必指定每个表的名称怎么办?
shekeine

3
只需删除-t选项即可!pg_dump -d <database_name> > file.sql
斯里·哈莎·卡巴拉

4
我不知道为什么,但是-d选项对psql9.3无效,并且给定的命令对我不起作用。工作之一是pg_dump -U用户名db_name -t table_name> fileName
serkan kucukbay

pg_dump -t <table_name> <database_name> > file.sql
斯里拉姆

@ user10664542:请阅读手册,尤其是本节:“为此,“表”包括视图,实例化视图,序列和外部表”。
Frank Heikens

42

pg_dump -h本地主机-p 5432 -U postgres -d mydb -t my_table> backup.sql

您可以备份单个表,但我建议备份整个数据库,然后还原所需的任何表。备份整个数据库总是好的。

9种使用pg_dump的方法


我不确定为什么要对这个答案进行投票,人们单击+1而不自己检查或尝试检查。这个答案的问题,使它完全无用,是给定的解决方案/命令没有导出在表上创建的序列(主键),因此导入失败。我不知道任何不使用主键与序列的生产PG数据库。这是一半的答案,无法彻底回答问题,并且需要其他工作才能导出/导入单个表。
user10664542

如上所述,我非常怀疑user10664542,在此之前他的名字没有任何SO postgres答案。尽管顺序确实带来了更多的复杂性,但即使人们在事后必须调整顺序,也有足够的反对者对类似的答案表示赞同,以至于人们可能使他们工作。如果必须还原转储,我会寻找方法来从max(id)表上的。这是有效的答案,我有信心查看生成的sql,我可以将其还原。
JL Peyret

9

如果您喜欢图形用户界面,则可以使用pgAdmin III(Linux / Windows / OS X)。只需右键单击您选择的表,然后单击“备份”。它将pg_dump为您创建一个命令。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


2

作为弗兰克·海肯(Frank Heiken)回答的补充,如果您希望使用INSERT语句代替copy from stdin,则应指定--inserts标志

pg_dump --host localhost --port 5432 --username postgres --format plain --verbose --file "<abstract_file_path>" --table public.tablename --inserts dbname

请注意,我已省略该--ignore-version标志,因为它已弃用。


我不确定为什么要对这个答案进行投票,人们单击+1而不自己检查或尝试检查。这个答案的问题,使它完全无用,是给定的解决方案/命令没有导出在表上创建的序列(主键),因此导入失败。我不知道任何不使用主键与序列的生产PG数据库。这是一半的答案,无法彻底回答问题,并且需要其他工作才能导出/导入单个表。
user10664542
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.