心理战2.操作错误: SSL 系统调用错误: 检测到 EOF



我在python脚本中使用psycopg2连接到Redshift数据库,偶尔会收到如下错误:

心理战2.操作错误: SSL 系统调用错误: 检测到 EOF

此错误仅发生一次,并且脚本工作的时间为 90%。

我试图尝试一下,除了阻止以捕获错误,但似乎捕获不起作用。例如,我尝试捕获错误,以便在发生这种情况时它会自动向我发送电子邮件。但是,发生错误时未发送电子邮件。以下是我的尝试代码,除了:

try:
conn2 = psycopg2.connect(host="localhost", port = '5439', 
database="testing", user="admin", password="admin")
except psycopg2.Error as e:
print ("Unable to connect!")
print (e.pgerror)
print (e.diag.message_detail)
# Call check_row_count function to check today's number of rows and send 
mail to notify issue
print("Trigger send mail now")
import status_mail
print (status_mail.redshift_failed(YtdDate))
sys.exit(1)
else:
print("RedShift Database Connected")
cur2 = conn2.cursor()
rowcount = cur2.rowcount

我在日志中收到的错误:

回溯(最近一次调用(: 文件 "/home/ec2-user/dradis/dradisetl-daily.py",第 579 行,在 load_from_redshift_to_s3(( 文件"/home/ec2-user/dradis/dradisetl-daily.py",第 106 行,load_from_redshift_to_s3 分隔符为",";"".format(YtdDate, s3location(( 心理战2.操作错误: SSL 系统调用错误: 检测到 EOF

所以问题是,是什么导致了这个错误,为什么除了块捕获它之外我的尝试没有?

从文档中:

异常 psycopg2.操作错误

针对与数据库相关的错误引发的异常 操作,不一定在程序员的控制下, 例如,发生意外断开连接,数据源名称不是 找到,无法处理事务,内存分配错误 在处理过程中发生等。

这是一个错误,可能是许多不同事情的结果。

  • 慢查询
  • 进程内存不足
  • 其他查询正在运行,导致表无限期锁定
  • 磁盘空间不足
  • 防火墙

(您绝对应该提供有关这些因素的更多信息和更多代码。

您已成功连接,但稍后发生操作错误。 尝试在脚本中处理这些断开连接: 将要执行的命令放入 try-catch 块中,并在连接丢失时尝试重新连接。

最近遇到此错误。在我的情况下,原因是使用数据库时网络不稳定。如果网络将关闭足够长的时间,以至于套接字检测到超时,您将看到此错误。如果停机时间不长,您将不会看到任何错误。

您可以使用此代码示例控制保持连接和 RTO 功能的超时

s = socket.fromfd(conn.fileno(), socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 6)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 2)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 2)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_USER_TIMEOUT, 10000)

您可以在这篇文章中找到更多信息

如果您附加了您尝试的实际代码,但它会有所帮助。在您附加的堆栈中跟踪其:"文件"/home/ec2-user/dradis/dradisetl-daily.py",第 106 行" 类似的,除了代码对我来说很好用。请注意,如果错误发生在客户端,例如我示例中的错误,e.pgerror 将为空。在这种情况下,e.diag 对象也将毫无用处。

try:
conn = psycopg2.connect('')
except psycopg2.Error  as e:
print('Unable to connect!n{0}'.format(e))
else:
print('Connected!')

也许这对某人有帮助,但是当我尝试将备份还原到没有足够的空间的数据库时,我遇到了这样的错误。

最新更新