【问题标题】:psycopg2.OperationalError: SSL SYSCALL error: EOF detectedpsycopg2.OperationalError:SSL SYSCALL 错误:检测到 EOF
【发布时间】:2018-11-15 11:04:29
【问题描述】:

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

psycopg2.OperationalError:SSL SYSCALL 错误:检测到 EOF

这个错误只发生过一次,在 90% 的时间里脚本都能正常工作。

我尝试将其放入 try 和 except 块中以捕获错误,但似乎捕获不起作用。例如,我尝试捕获错误,以便在发生这种情况时自动向我发送电子邮件。但是,发生错误时未发送电子邮件。以下是我的尝试代码,除了:

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

我在日志中收到的错误:

Traceback(最近一次调用最后一次): 文件“/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)) psycopg2.OperationalError:SSL SYSCALL 错误:检测到 EOF

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

【问题讨论】:

    标签: python amazon-redshift psycopg2


    【解决方案1】:

    来自docs

    异常 psycopg2.OperationalError

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

    这是一个错误,可能是由许多不同的原因造成的。

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

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

    您已成功连接,但后来发生了 OperationalError。 尝试在脚本中处理这些断开连接: 将要执行的命令放入 try-catch 块中,如果连接丢失,请尝试重新连接。

    【讨论】:

    • 就我而言,我使用直接 PostgreSQL 连接从 Odoo 控制器获取一些数据。解决方案是使用框架提供的路径来获取数据。例如:http.request.env['res.partner'].search([...])) 而不是查询。
    【解决方案2】:

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

    您可以使用此代码示例控制 Keepalive 和 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)
    

    您可以在此post 中找到更多信息

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案3】:

    如果您附上您尝试添加的实际代码,那将会很有帮助。在您附加的堆栈跟踪中:“文件”/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!')
    

    【讨论】:

    • 嗨,我能知道你是如何激发这个错误的吗? psycopg2.OperationalError: SSL SYSCALL error: EOF detected 我尝试刺激它,但它不会返回相同的错误
    • 就像我的回答中所述 - 如果您附上导致此错误的代码,那将会很有帮助。另外,请提供使用的 Python 和 psycopg2 的版本,因为版本之间的结果可能会有所不同
    • 我不知道为什么 Elle 得了 -1。但我确实知道如何造成这种情况。让用户使用 postgres 密码实用程序登录,然后用户放弃网页。一段时间后,与 DB 的连接丢失,此错误消息只是断开连接的症状。我不认为有一个特定的命令会为我们导致它。这是不专心的用户。
    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2021-11-28
    • 2017-12-29
    • 2022-01-24
    • 2021-04-10
    相关资源
    最近更新 更多