当端口 5432 被阻塞时,来自远程服务器的 pg_dump postgres 数据库

Posted

技术标签:

【中文标题】当端口 5432 被阻塞时,来自远程服务器的 pg_dump postgres 数据库【英文标题】:pg_dump postgres database from remote server when port 5432 is blocked 【发布时间】:2015-06-21 07:13:04 【问题描述】:

我正在尝试在我们的 DMZ 中的远程服务器上 pg_dump 一个 SQL 数据库。有2个问题。

    远程服务器上没有太多空间,所以运行正常命令来本地备份数据库 pg_dump -C database > sqldatabase.sql.bak 因空间问题无法使用。

    我也无法使用其他版本的 pg_dump 命令将数据库从远程服务器转储到本地服务器:

    pg_dump -C -h remotehost -U remoteuser db_name | psql localhost -U localuser db_name

因为服务器在我们的 DMZ 中并且端口 5432 被阻止。我希望看到的是是否可以对数据库进行 pg_dump 并立即将其(ssh 或其他形式)作为文件保存到远程服务器。 我正在尝试的是:pg_dump -C testdb | ssh admin@ourserver.com | > /home/admin/testdb.sql.bak

有谁知道我想要实现的目标是否可行?

【问题讨论】:

[未测试] (1) 在您的本地机器上设置一个 netcat 监听器(使用未使用或被阻止的端口号),例如 netcat -l -p 1234 > thefile & 。 (2) 从远程机器,执行:pg_dump ... | netcat your.local.ip 1234 【参考方案1】:

您可以使用 ssh 连接到远程服务器,执行 connect pg_dump 调用并将输出发送回本地机器的标准输出。

ssh user@remote_machine "pg_dump -U dbuser -h localhost -C --column-inserts" \
 > backup_file_on_your_local_machine.sql

【讨论】:

这比我的 netcat hack 简单得多。 一点小提示是,如果文件不为空,我会将 >> 替换为 > 以避免写入末尾 不需要指定数据库名吗? @AsnadAtta 您可以这样做,重要的是通过 ssh 执行命令并通过标准输出获取结果的想法。基本上pg_dump的所有参数都可以使用。 在从 Windows 中尝试此命令时,我必须删除 \ 以使其正确【参考方案2】:

让我们使用 pg_dump 从远程 postgresql 数据库创建备份:

pg_dump -h [host address] -Fc -o -U [database user] <database name> > [dump file]

稍后可以使用以下方法在同一远程服务器上恢复它:

sudo -u postgres pg_restore -C mydb_backup.dump

例如:

pg_dump -h 67.8.78.10 -Fc -o -U myuser mydb > mydb_backup.dump

完整(所有数据库和对象)

pg_dumpall -U myuser -h 67.8.78.10 --clean --file=mydb_backup.dump

从 pg_dumpall --clean 恢复:

psql -f mydb_backup.dump postgres #it doesn't matter which db you select here

复制自:https://codepad.co/snippet/73eKCuLx

【讨论】:

这不能回答问题。限制是不能通过5432连接到远程服务器。 我在 macos 上收到 pg_dump: invalid option -- o 选项是大写的“O”:)。这是关于此选项的文档所说的“不要输出命令来设置对象的所有权以匹配原始数据库。默认情况下,pg_dump 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句来设置创建的数据库对象的所有权。当脚本会运行,除非它由超级用户(或拥有脚本中所有对象的同一用户)启动。要创建一个可以由任何用户恢复的脚本,但将赋予该用户对所有对象的所有权,请指定-O。” 你能解释一下所有的参数吗?【参考方案3】:

您可以尝试像这样将表的一部分转储到本地机器中的文件中(假设您的本地机器安装了psql):

psql -h $db_host -p 5432 -U $db_user -d $db_name \
-c "\copy (SELECT * FROM my_table LIMIT 10000) to 'some_local_file.csv' csv;"

您可以稍后将导出的 csv 导入另一个数据库,如下所示:

COPY my_table FROM '/path/to/some_local_file.csv' WITH (FORMAT csv);

【讨论】:

【参考方案4】:

已经提到了一种可能的解决方案 - 通过 ssh 管道。

您还可以让您的数据库服务器监听公共 inet 地址,为您的备份机器添加一个 hostssl 条目到 pg_hba.conf,也许配置一个客户端证书以确保安全,然后只需在客户端/备份机器上运行转储pg_dump -h dbserver.example.com ...

这对于无人值守的备份来说更简单。

有关连接的配置(sslmode),另请参阅the supported environment variables。

【讨论】:

在此处显示整个命令会很有帮助,因为我不明白您如何也可以通过这种方式恢复到目标机器(当然您可以先转储然后恢复,但这不会适合问题) 对不起,我没有简单的命令示例,我的设置已经相当进化,配置文件用于 ssh(用于 ssh 管道替代)和用于连接服务名称的 psql。命令有问题吗?您只需将主机名添加到命令行。我宁愿认为问题/任务是在服务器上设置 TLS!完成此操作后,它只是简单的命令行 psql 和 pg_dump,其主机名与 localhost 不同。【参考方案5】:

如果您想通过使用pg_dump 而不是ssh 定期将远程服务器中容器内的数据库PostgreSQL 备份到本地主机,这对您很有用:

https://github.com/omidraha/periodic-pgdump-over-ssh

【讨论】:

以上是关于当端口 5432 被阻塞时,来自远程服务器的 pg_dump postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Linux服务器上的PostgreSQL远程连接不上

无法连接到服务器:没有到主机的路由服务器是否在主机“ ************”上运行并接受端口5432上的TCP / IP连接?

arcgis连接pg不同版本问题

在远程机器上恢复转储

来自远程服务器的android telnet控制台端口5554:连接被外国主机关闭

华为云ip违规冻结-原因开了redis或者pgsql默认端口不设置或者密码过于简单被植入病毒