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

276

如何在postgres中创建单个表的备份?如何操作?pg_dump命令是否适用于此项操作?

8个回答

371

使用--table指定需要备份的表给pg_dump:

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

21
如何恢复备份文件(.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
32
使用以下命令进行数据库还原:psql -U 用户名 -d 数据库名 -1 -f 你的备份文件.sql,其中“用户名”为你的数据库用户名,“数据库名”为要还原的数据库名称,“你的备份文件.sql”为备份文件所在的路径和文件名。 - rnaud
7
你的意思是:抽象文件路径? - bandungeuy
11
我不确定为什么这个答案会被点赞,人们在未经检查或尝试后就会点击+1。这个答案存在的问题是,所给出的解决方法/命令不能导出表(主键)创建的序列,从而导致导入失败。就我所知,任何一个生产级别的PG数据库都使用带有序列的主键。这只是部分回答,没有完全回答问题,需要额外的工作来导出/导入单个表格。 - user10664542
4
@user10664542 肯定有一些使用 UUID 作为主键而不是序列的生产 PG 数据库。 - Peter Gerdes
显示剩余8条评论

118
如果您使用的是Ubuntu系统,可以按照以下步骤进行数据库备份:
1. 登录postgres用户: sudo su postgres 2. 使用命令pg_dump -d <database_name> -t <table_name> > file.sql进行备份 3. 请确保在具有写入权限的地方执行该命令,例如:/tmp 补充说明: 如果您希望将.sql文件转移到另一台计算机上,则需要考虑跳过所有者信息保存到.sql文件中。您可以使用以下命令:pg_dump --no-owner -d <database_name> -t <table_name> > file.sql

2
如果您想要所有的表,而不必指定每个表的名称怎么办? - shekeine
4
只需删除-t选项即可!pg_dump -d <数据库名称> > 文件名.sql - Sri Harsha Kappala
5
我不知道为什么,在psql9.3中“-d”选项无效,而给定的命令对我也没有起作用。有效的命令是pg_dump -U 用户名 数据库名 -t 表名 > 文件名 - serkan kucukbay
1
pg_dump -t <table_name> <database_name> > file.sql - Sri
1
@user10664542:请阅读手册,特别是这一部分:“为此,‘表’包括视图、物化视图、序列和外部表”。 - Frank Heikens
显示剩余2条评论

56

使用pg_dump -h localhost -p 5432 -U postgres -d mydb -t my_table > backup.sql命令可以备份单个表格,但我建议备份整个数据库,然后根据需要恢复所需的表格。备份整个数据库总是一个好习惯。

9种使用pg_dump的方法


1
我不确定为什么这个答案会被点赞,人们在不自己检查或尝试的情况下点击+1。这个答案的问题在于它提供的解决方案/命令不能导出表格(主键)创建的序列,因此导入失败。我不知道任何一个生产环境中使用没有带有序列的主键的PG数据库。它只是半个答案,未能彻底回答问题,并需要额外的工作来导出/导入单个表格。 - user10664542
4
如上所述,我强烈怀疑用户10664542在这里没有任何SO postgres的回答经验。虽然序列确实带来了额外的复杂性,但足够多的赞同已经证明其他人可能已经让它们正常工作,即使他们后来不得不调整序列。如果我必须恢复我的转储文件,我会寻找更新序列最后一个ID的方式,从表中的max(id)获取。 这是对我有效的答案,我相信,看着生成的SQL语句,我可以将其还原。 - JL Peyret

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

enter image description here

enter image description here

enter image description here


9

你可以使用这个命令

pg_dump --table=yourTable --data-only --column-inserts yourDataBase > file.sql

您应该根据自己的情况更改“yourTable”和“yourDataBase”


2
我缺少的是 --data-only 标志。 - faniva

4
作为对Frank Heiken回答的补充,如果您希望使用INSERT语句而不是从stdin拷贝,请指定--inserts标志。 pg_dump --host localhost --port 5432 --username postgres --format plain --verbose --file "" --table public.tablename --inserts dbname 请注意,我省略了--ignore-version标志,因为它已经过时了。

1
我不确定为什么这个答案会被点赞,人们只是点击+1而没有自己检查或尝试。这个答案的问题,在于给出的解决方案/命令没有导出在表上创建的序列(主键),因此导入会失败。我不知道有哪个生产PG数据库没有使用带序列的主键。它只是半个答案,没有全面回答问题,需要额外的工作来导出/导入单个表。 - user10664542

4

这是我如何做的。

pg_dump -h localhost -U postgres -p 5432 -t table database  > path/to/store/name.sql

你可以编辑这个SQL文件,删除表的创建命令和其他字段的设置,如果你不想发生这种情况,并且稍后运行下面的命令将数据插入到另一个数据库中。
 psql -h localhost -U postgres -p 5432 database < path/to/store/name.sql

1
使用以下命令获取表转储的压缩版本:
pg_dump -h localhost -p 5432 -U <username> -d <dbname> -t <tablename> -Fc -f backup.out

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