以下是详细信息:
必须对数据库进行存档,以便将超过6个月的记录复制到新数据库并从主(生产)数据库中删除。这里的复杂性是复制所有相互引用的表中的所有行。之后,将删除某些表中的这些复制行(这些表非常庞大且不再需要其数据)。
postgres数据库是Amazon RDS实例。
实现这一目标的最佳方法是什么?
我在考虑使用Springboot应用程序
OR
让postgresql.conf调用一个调用sql批处理的shell脚本。 对于第二种方法,我不知道如何编辑amazon RDS postgresql.conf文件以及在何处指定shell脚本。 sql批处理写在哪里?这对我来说有点新鲜,欣赏任何指针。
答案 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 file和How to import CSV file data into a PostgreSQL table?