空间紧张时转储Postgres数据库?

时间:2015-10-16 18:21:12

标签: postgresql ssh dump

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

我想转储这个数据库(转移到另一台服务器)。

当然,pg_dump dbname > dump的简单解决方案会因配额超出错误而失败。

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

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

(Ubuntu既安装在服务器上又安装在本地计算机上。)

欢迎其他建议。

2 个答案:

答案 0 :(得分:3)

当然有。

在本地计算机上执行以下操作:

Thread th = new Thread(new Runnable() {
    public void run() {
        while(true) {
            //do stuff
            try {
                Thread.sleep(15000);
            }
            catch(InterruptedException ex) {}
        }
    }
});
th.start();

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

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

这将设置从本地盒子上的端口15432到远程端口上的5432的隧道。假设权限等允许你连接,你很高兴。

答案 1 :(得分:1)

(如果机器已连接到网络),只要有足够的授权,您就可以从远程执行所有操作:

来自您当地的机器:

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_USER用户连接到$ ORIG_HOST到db $ ORIG_DB
  • pg_restore也在本地计算机上运行
  • pg_restore不是真的需要(这里),但可以派上拉/重命名/创建数据库等等。
  • psql在本地计算机上运行,​​它接受来自管道的SQL和数据流,并执行/插入到(新创建的)数据库
  • template1的连接只是一个存根,因为psql坚持使用数据库名称进行调用
  • 如果你想构建这样的命令管道,你可能应该首先用|more替换其中一个less管道之后的东西,或者将其重定向到一个文件。
  • 您可能需要先导入系统范围的内容(用户名和表空间)