space 紧张时转储 Postgres 数据库?

Dump Postgres database when space is tight?

想象一下这种情况。我有一台只有 1 GB 可用空间 space 的服务器。 Postgres 数据库大约需要 600MB(根据 SELECT pg_size_pretty(pg_database_size('dbname'));),其他东西需要 300MB,所以我只有 100MB 可用 space.

我想转储此数据库(以移动到另一台服务器)。

自然地,pg_dump dbname > dump 的简单解决方案失败并出现配额超出错误。

我尝试先用 VACUUM FULL 压缩它(不确定它是否有助于转储大小,但无论如何),但由于磁盘限制也失败了。

我可以通过 SSH 访问此服务器。所以我想知道:有没有办法通过 ssh 将 pg_dump 的输出通过管道传输到我的家用机器?

(Ubuntu同时安装在服务器和本地机器上。)

也欢迎提出其他建议。

当然有

在您的本地计算机上执行如下操作:

ssh -L15432:127.0.0.1:5432 user@remote-machine

然后在您的本地计算机上,您可以执行以下操作:

pg_dump -h localhost -p 15432 ...

这会建立一条从本地机器上的端口 15432 到远程机器上的 5432 的隧道。假设权限等允许您连接,您就可以开始了。

(如果机器连接到网络)如果有足够的授权,您可以远程执行任何操作:

从您的本地计算机:

pg_dump -h source_machine -U user_id the_database_name >>the_output.dmp

您甚至可以将其直接通过管道传输到您的本地计算机(在处理好用户角色和创建数据库等之后):

pg_dump -h ${ORIG_HOST} -U ${ORIG_USER} -d ${ORIG_DB} \
     -Fc --create | pg_restore -c -C | psql -U postgres template1
  • pg_dump 在本地(新)机器上执行
  • 但它连接到 $ORIG_HOST 作为用户 $ORIG_USER 到 db $ORIG_DB
  • pg_restore 也在本地机器上运行
  • pg_restore 并非 真正需要 (此处),但可以派上用场 drop/rename/create 数据库等
  • psql 在本地机器上运行,它接受来自管道的 SQL 流和数据,并且 executes/inserts 它到(新创建的)数据库
  • template1 的连接只是一个存根,因为 psql 坚持要用数据库名称调用
  • 如果你想构建一个这样的命令管道,你应该首先用 moreless 替换 | 管道之一之后的内容,或者重定向它到一个文件。
  • 您可能需要先导入系统范围的东西(用户名和表空间)