归档postgres数据库的最佳方法是什么?

时间:2016-11-09 13:57:54

标签: database postgresql archiving

以下是详细信息:

必须对数据库进行存档,以便将超过6个月的记录复制到新数据库并从主(生产)数据库中删除。这里的复杂性是复制所有相互引用的表中的所有行。之后,将删除某些表中的这些复制行(这些表非常庞大且不再需要其数据)。

postgres数据库是Amazon RDS实例。

实现这一目标的最佳方法是什么?

我在考虑使用Springboot应用程序

OR

让postgresql.conf调用一个调用sql批处理的shell脚本。 对于第二种方法,我不知道如何编辑amazon RDS postgresql.conf文件以及在何处指定shell脚本。 sql批处理写在哪里?这对我来说有点新鲜,欣赏任何指针。

1 个答案:

答案 0 :(得分:2)

如果你做所有服务器端而不是使用Springboot应用程序,它会快得多。问题不是转储/恢复,您可以使用pg_dump实用程序或psql -d dbname -t -A -F“;”轻松完成-c“SELECT * FROM yourdata WHERE cutdate< = current_timestamp-interval'6 months'”> output.csv

但您必须保证导出的所有内容都会加载到第二个数据库中,并且您不会删除任何尚未导出的内容。

我首先将主键的子集SELECT到临时表中。然后使用服务器端COPY命令导出预先选择的密钥(及其所有依赖项)

COPY (SELECT d.* FROM yourdata d INNER JOIN temporal t WHERE d.pk=t.pk) To '/tmp/yourdata.csv' WITH CSV DELIMITER ',';

生成所有导出文件后

DELETE FROM yourdata WHERE pk IN (SELECT pk FROM temporal)

然后在备份数据库上执行

COPY yourdata(column1,column2,column3) FROM '/tmp/yourdata.csv' DELIMITER ',' CSV

您可以编写一个脚本,使用psql命令行工具调用服务器端的所有命令,并最后将导入的文件移动到永久位置,以防万一出错并且您需要再次处理它们。

请参阅Save PL/pgSQL output from PostgreSQL to a CSV fileHow to import CSV file data into a PostgreSQL table?