Postgres 备份并覆盖一个 table
Postgres backup and overwrite one table
我有一个 postgres 数据库,我正在尝试用 :
备份 table
pg_dump --data-only --table=<table> <db> > dump.sql
然后几天后我试图通过以下方式覆盖它(基本上是想删除所有数据并从我的转储中添加数据):
psql -d <db> -c --table=<table> < dump.sql
但它不会覆盖,它会在不删除现有数据的情况下添加它。
任何建议都很棒,谢谢!
您基本上有两种选择,具体取决于您的数据和 fkey 限制。
如果 table 没有 fkey,那么最好的办法是在加载前截断 table。请注意,截断在事务中的行为有点奇怪,因此最好的做法是(在事务块中):
- 锁定table
- 截断
- 加载
这将避免其他事务看到空 table。
如果你有 fkeys 那么你可能想要加载到一个临时 table 然后做一个 upsert。在这种情况下,如果其他事务可能想要写入 table(也在事务块中),您可能仍然希望锁定 table 以避免竞争条件:
- 将数据加载到临时文件中table
- 锁定目的地table(可选,见上文)
- 在 table.
中对 "upsert" 使用可写的 cte
- 使用单独的删除语句从 table.
中删除数据
第 3 阶段有点棘手。您可能需要就此提出一个单独的问题,但基本上您将有两个阶段(并在与文档协商后编写):
- 更新现有记录
- 插入不存在的记录
希望对您有所帮助。
我有一个 postgres 数据库,我正在尝试用 :
备份 tablepg_dump --data-only --table=<table> <db> > dump.sql
然后几天后我试图通过以下方式覆盖它(基本上是想删除所有数据并从我的转储中添加数据):
psql -d <db> -c --table=<table> < dump.sql
但它不会覆盖,它会在不删除现有数据的情况下添加它。
任何建议都很棒,谢谢!
您基本上有两种选择,具体取决于您的数据和 fkey 限制。
如果 table 没有 fkey,那么最好的办法是在加载前截断 table。请注意,截断在事务中的行为有点奇怪,因此最好的做法是(在事务块中):
- 锁定table
- 截断
- 加载
这将避免其他事务看到空 table。
如果你有 fkeys 那么你可能想要加载到一个临时 table 然后做一个 upsert。在这种情况下,如果其他事务可能想要写入 table(也在事务块中),您可能仍然希望锁定 table 以避免竞争条件:
- 将数据加载到临时文件中table
- 锁定目的地table(可选,见上文)
- 在 table. 中对 "upsert" 使用可写的 cte
- 使用单独的删除语句从 table. 中删除数据
第 3 阶段有点棘手。您可能需要就此提出一个单独的问题,但基本上您将有两个阶段(并在与文档协商后编写):
- 更新现有记录
- 插入不存在的记录
希望对您有所帮助。