当端口 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到服务器:没有到主机的路由服务器是否在主机“ ************”上运行并接受端口5432上的TCP / IP连接?