pg_dump postgres数据库来自远程服务器

Ant*_*ern 50 postgresql ssh pg-dump remote-server

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

1)远程服务器上没有足够的空间,因此运行到本地备份数据库的正常命令 pg_dump -C database > sqldatabase.sql.bak 将因空间问题而无法工作.

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

pg_dump -C -h remotehost -U remoteuser db_name | psql localhost -U localuser db_name
Run Code Online (Sandbox Code Playgroud)

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

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

Oki*_*Oth 72

您可以将ssh连接到远程服务器,使用连接pg_dump调用并将输出发送回本地计算机的stdout.

ssh user@remote_machine "pg_dump -U dbuser -h localhost -C --column-inserts" \
 >> backup_file_on_your_local_machine.sql
Run Code Online (Sandbox Code Playgroud)

编辑:修正了一个错字.

  • 有一点需要注意的是,如果文件不为空,我会用`>`替换`>>`以避免写到最后 (3认同)
  • 这比我的 netcat hack 简单得多。 (2认同)
  • 我们不需要指定数据库名称吗? (2认同)
  • @AsnadAtta你可以做到这一点,重要的是通过 ssh 执行命令并通过 stdout 获取结果的想法。基本上pg_dump的所有参数都可以使用。 (2认同)
  • 在从 Windows 尝试此命令时,我必须删除 \ 才能使其正确 (2认同)

Kis*_*ngi 13

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

pg_dump -h [host address] -Fc -o -U [database user] <database name> > [dump file]
Run Code Online (Sandbox Code Playgroud)

之后,可以使用以下命令在同一远程服务器上将其还原:

sudo -u postgres pg_restore -C mydb_backup.dump
Run Code Online (Sandbox Code Playgroud)

例如:

pg_dump -h 67.8.78.10 -Fc -o -U myuser mydb > mydb_backup.dump
Run Code Online (Sandbox Code Playgroud)

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

pg_dumpall -U myuser -h 67.8.78.10 --clean --file=mydb_backup.dump
Run Code Online (Sandbox Code Playgroud)

从pg_dumpall --clean恢复:

psql -f mydb_backup.dump postgres #it doesn't matter which db you select here
Run Code Online (Sandbox Code Playgroud)

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

  • 我在 macos 上收到 `pg_dump: invalid option -- o` 。 (14认同)
  • 这不能回答问题。限制是您无法通过5432连接到远程服务器。 (4认同)
  • 该选项是大写的“O”:)。这就是文档中关于此选项的内容:“不要输出命令来设置对象所有权以匹配原始数据库。默认情况下,pg_dump 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句来设置已创建数据库对象的所有权。当以下情况发生时,这些语句将失败:除非由超级用户(或拥有脚本中所有对象的同一用户)启动,否则脚本将运行。要创建可由任何用户恢复的脚本,但将授予该用户所有对象的所有权,请指定-O。” (2认同)

nyb*_*bon 5

您可以尝试像这样将表的一部分转储到本地计算机中的文件中(假设您的本地计算机已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;"
Run Code Online (Sandbox Code Playgroud)

您可以稍后将导出的csv导入另一个数据库:

COPY my_table FROM '/path/to/some_local_file.csv' WITH (FORMAT csv);
Run Code Online (Sandbox Code Playgroud)