【问题标题】:How to export huge postgresql database in batches?如何批量导出庞大的postgresql数据库?
【发布时间】:2020-03-15 19:15:08
【问题描述】:

我有一个包含超过 2000 万行的庞大数据库。我可以导出整个数据库(这需要几个小时),但是当我尝试使用 python (pandas) 过滤数据时,pycharm 失败(由于内存问题)。

例如,有没有办法以 200 万行为单位批量导出数据库?导出 2mil,然后是其他 2mil,最后有 10 个 200 万行的文件?这样我就可以使用 python (pandas) 过滤每个文件,并且不会有内存问题。

谢谢!

【问题讨论】:

  • 在 Postgres 中完成工作,而不是在 Python 中。
  • 如果你能给出你的数据库的一些示例模式来估计每行的大小,那就太好了。
  • 平均记录量是多少?
  • 这似乎相当广泛,请参阅help centerHow to Ask。你做过研究吗?
  • 我尝试在 Postgres 中完成这项工作,但它占用了我 20gb 以上的内存,如果我执行任何 SQL,它最终会崩溃。这就是为什么我只导出整个数据库。我对数据库一无所知,使用简单的 SQL 条件示例:SELECT * FROM mainDB where (random column) > 5 有更好的方法吗?

标签: python sql database postgresql csv


【解决方案1】:

2000 万行并不多。除非每一行都很大或者您通过慢速网络发送,否则导出应该需要几分钟而不是几小时。

如果要拆分的是单个表,那对于 COPY 来说是一个更好的任务,而不是 pg_dump。

psql -c 'copy pgbench_accounts to stdout'|split -l 2000000

您可以在终端命令提示符下输入它,就像您输入 pg_dump 一样。它会像 pg_dump 一样发送表的数据(除了它只发送数据,并且只发送一个表),但是随后 linux 命令split 将它分解为每个 2e6 行的文件。

嗯,我看到你没有在你的帖子中特别提到 pg_dump。当您说“出口”时,您的意思是什么?我以为你的意思是 pg_dump。

【讨论】:

  • 复制有什么作用?我在终端里写这段代码对吧?
【解决方案2】:

如果有帮助,您可以使用 pg_dump 仅提取一个或多个表或排除表

【讨论】:

  • 我读过“转储”,但我不知道它的作用。我今天去看看,谢谢!
  • pg_dump -t tablename -U postgres -f tablename_date_etc.sql dbname
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多