我正在尝试使用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服务器。
答案 0 :(得分:7)
可能是 SSL renegociation 问题。
请参阅服务器上的此参数(postgresql.conf
)以及有关旧SSL客户端库的相关警告,但OS X 10.8似乎比此更新。
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 reload
或service postgresql reload
重新加载服务器。
也可以使用show ssl_renegotiation_limit;
即使转储的大小小于512Mb,也可能是传输的数据量更大,因为pg_dump
在使用自定义格式(--format custom
)时会在本地压缩数据