使用 pg_restore 创建或覆盖表
Using pg_restore to create or overwrite tables
我知道这是一个奇怪的请求,但出于一些我无法避免的怪异原因,我希望能够始终如一地将一些表从一个数据库同步到另一个数据库。我知道我可以自己在脚本中写出功能,但我认为 pg_dump
和 pg_restore
将对我自己没有意识到的过程应用大量优化。
我想知道是否有办法让 pg_restore
覆盖现有表格。基本上,在伪代码中是这样的:
-- pseudo code
begin;
drop table to_restore;
drop table to_restore2;
drop table to_restore3;
-- etc
restore table to_restore;
restore table to_restore2;
restore table to_restore3;
-- etc
commit;
如果这不是很好,我也愿意接受其他方法。
这只是可能解决方案的示例:
将这些表从第一个数据库复制到 csv。并在事务中使用极快的副本:
begin;
truncate table to_restore;
truncate table to_restore2;
truncate table to_restore3;
set commit_delay to 100000;
set synchronous_commit to off;
copy to_restore from 'to_restore.csv';
copy to_restore2 from 'to_restore2.csv';
copy to_restore3 from 'to_restore3.csv';
commit;
您似乎想要在 pg_restore documentation
中指定的 -c
选项
-c
--clean
Clean (drop) database objects before recreating them. (Unless --if-exists is used, this might generate some harmless error messages, if any objects were not present in the destination database.)
您可以将其与 -1
标志一起使用,在一笔交易中完成所有事情
-1
--single-transaction
Execute the restore as a single transaction (that is, wrap the emitted commands in BEGIN/COMMIT). This ensures that either all the commands complete successfully, or no changes are applied. This option implies --exit-on-error.
我知道这是一个奇怪的请求,但出于一些我无法避免的怪异原因,我希望能够始终如一地将一些表从一个数据库同步到另一个数据库。我知道我可以自己在脚本中写出功能,但我认为 pg_dump
和 pg_restore
将对我自己没有意识到的过程应用大量优化。
我想知道是否有办法让 pg_restore
覆盖现有表格。基本上,在伪代码中是这样的:
-- pseudo code
begin;
drop table to_restore;
drop table to_restore2;
drop table to_restore3;
-- etc
restore table to_restore;
restore table to_restore2;
restore table to_restore3;
-- etc
commit;
如果这不是很好,我也愿意接受其他方法。
这只是可能解决方案的示例:
将这些表从第一个数据库复制到 csv。并在事务中使用极快的副本:
begin;
truncate table to_restore;
truncate table to_restore2;
truncate table to_restore3;
set commit_delay to 100000;
set synchronous_commit to off;
copy to_restore from 'to_restore.csv';
copy to_restore2 from 'to_restore2.csv';
copy to_restore3 from 'to_restore3.csv';
commit;
您似乎想要在 pg_restore documentation
中指定的-c
选项
-c
--clean
Clean (drop) database objects before recreating them. (Unless --if-exists is used, this might generate some harmless error messages, if any objects were not present in the destination database.)
您可以将其与 -1
标志一起使用,在一笔交易中完成所有事情
-1
--single-transaction
Execute the restore as a single transaction (that is, wrap the emitted commands in BEGIN/COMMIT). This ensures that either all the commands complete successfully, or no changes are applied. This option implies --exit-on-error.