我正在尝试将我的 Postgres DB 备份到另一台服务器,但一直被拒绝访问。
我的 pg_hba.conf 文件如下所示:
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 md5
#host replication postgres ::1/128 md5
如果我将 postgres 设置从 PEER 更改为 TRUST,我可以备份代码,但网站将无法再访问数据库(有关 SSL 错误,我知道这不是问题)。
当我保持原样时,PEER 服务器可以工作 - php 可以访问数据库 - 但是在尝试运行备份时出现错误:
root> pg_dump -U postgres 表名> test.sql
.pg_dump:[archiver (db)] 与数据库“tablename”的连接失败:严重错误:用户“postgres”的对等身份验证失败。
PHP Apache 网站使用适当的用户名和密码。
备份脚本如下所示:pg_dump -U postgres tablename > test.sql
我怎样才能同时满足网站和备份脚本的要求,以便可以同时运行它们?
尝试的整个脚本是这样的:ssh SERVER“pg_dump -U postgres tablename| gzip -c”> /backup/sqlbackup.sql.gz
摘自《服务器故障》:ssh 远程命令-fu
答案1
如果您的 PHP Apache 网站可以使用peer
,请保留它,然后让我们来处理它。
1.第一种方法:
由于身份验证是基于对等的,您必须使用-h
选项指定主机名(通常是本地主机):
ssh server "pg_dump -h localhost -U postgres | gzip -c" >/backup/sqlbackup.sql.gz
这里的主要问题是您将被提示输入 postgres 用户密码。这对于备份自动化来说是一个问题。
您可以参考这以避免提示输入密码。但我将描述:
.pgpass
创建名为的隐藏文件$HOME
- 执行
chmod 600 .pgpass
- 编辑文件
.pgpass
并添加以下行:localhost:5432:postgres:postgres:password
2.第二种方法:
您可以为备份添加特定角色并信任它。
在 Postgres 中创建备份角色:
CREATE ROLE backup WITH LOGIN SUPERUSER PASSWORD 'password'
编辑文件pg_hba.conf
,添加角色backup
,然后trust
:
# Database administrative login by Unix domain socket
local all postgres peer
local all backup trust
重新开始postgresql
然后您应该能够使用以下命令运行备份:
ssh server "pg_dump -U backup postgres | gzip -c" >/backup/sqlbackup.sql.gz