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 坚持要用数据库名称调用
- 如果你想构建一个这样的命令管道,你应该首先用
more
或 less
替换 |
管道之一之后的内容,或者重定向它到一个文件。
- 您可能需要先导入系统范围的东西(用户名和表空间)
想象一下这种情况。我有一台只有 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 坚持要用数据库名称调用 - 如果你想构建一个这样的命令管道,你应该首先用
more
或less
替换|
管道之一之后的内容,或者重定向它到一个文件。 - 您可能需要先导入系统范围的东西(用户名和表空间)