pg_dump收到SSL错误,似乎超时了

时间:2014-01-31 09:11:10

标签: postgresql ssl pg-dump

我正在尝试使用pg_dump将数据库下载到本地计算机。我正在使用的命令是:

pg_dump --host xx.xx.xx.xx --port xxxx --username "xxx" --password  --format custom --blobs --verbose --file "testing.db" "xxx"

当它转发数据库中的最后一个表时,它总是崩溃并出现此错误:

pg_dump: Dumping the contents of table "versions" failed: PQgetCopyData() failed.
pg_dump: Error message from server: SSL error: sslv3 alert handshake failure
pg_dump: The command was: COPY public.xxx (columns) TO stdout;

我通过SSH连接到一个服务器,它更接近我正在下载的服务器(我在布里斯班,它在旧金山)并且能够毫无问题地执行pg_dump。所以我知道数据库服务器很好。我怀疑这是暂停,因为它在失败之前到达最后一张桌子;如果它实际上是一个SSL错误,我预计它会更早出现。也就是说,超时发生在每次失败后不同的时间(两次最近的测试分别在1300s和1812s之后失败)。

欢迎任何有关如何调试的提示。

我在OS X 10.8.5上。本地pg_dump是9.2.4,服务器是运行psql 9.1.9的Ubuntu服务器。

1 个答案:

答案 0 :(得分:7)

可能是 SSL renegociation 问题。

请参阅服务器上的此参数(postgresql.conf)以及有关旧SSL客户端库的相关警告,但OS X 10.8似乎比此更新。

来自9.1 documentation

  

ssl_renegotiation_limit(整数)

Specifies how much data can flow over an SSL-encrypted connection before
renegotiation of the session keys will take place.
     

重新协商会降低攻击者进行密码分析的机会   当可以检查大量的流量时,它也会带来一个   大的性能损失。发送和接收流量的总和是   用来检查限制。如果此参数设置为0,则重新协商   被禁用。默认值为512MB。

     

注意:使用SSL时,2009年11月之前的SSL库不安全    重新协商,由于SSL协议中存在漏洞。    作为此漏洞的一个临时修复,一些供应商   运送的SSL库无法进行重新协商。如果是这样的话   库在客户端或服务器上使用,SSL重新协商应该   被禁用。

修改

postgresql.conf中更新此参数不需要重新启动服务器,而是需要使用/etc/init.d/postgresql reloadservice postgresql reload重新加载服务器。

也可以使用show ssl_renegotiation_limit;

在SQL中检查该值

即使转储的大小小于512Mb,也可能是传输的数据量更大,因为pg_dump在使用自定义格式(--format custom)时会在本地压缩数据