Postgres/数字海洋永恒回滚操作

问题描述 投票:0回答:1

我在 Digital Ocean 的 postgres 平台上有一个 SQL 服务器。它工作得很好,只是有时我的查询会失败。当我去我的服务器查看发生了什么时,我看到大约 30 多个回滚查询已经运行了几个小时。我不知道为什么会发生这些...我该怎么做才能自动终止这些永远运行的函数,以防止它们堵塞我的连接,而我必须进入并手动终止它们?

我的数字海洋平台中出现的回滚示例

postgresql digital-ocean
1个回答
0
投票

为了解决 DigitalOcean 平台上 PostgreSQL 中长时间运行的回滚问题,您可以考虑采取几个步骤和策略来自动检测和终止这些长时间运行的事务。您可以执行以下操作:

1. 确定问题:

长时间运行的回滚通常表明事务失败,并且数据库正在尝试回滚它,但由于事务的大小或复杂性,花费的时间太长。原因可能是:

  • 无意中留下未结交易。
  • 大型、复杂的查询失败。
  • 网络问题导致交易超时。

2. 使用
pg_terminate_backend
终止长时间运行的查询:

您可以设置查询来自动检测长时间运行的事务(包括回滚)并终止它们。这是一个例子:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active'
AND query LIKE 'ROLLBACK%' -- You can filter to only target rollbacks
AND now() - query_start > interval '10 minutes'; -- Set your desired time threshold

这将终止回滚查询运行超过 10 分钟的任何后端进程。您可以调整时间阈值以满足您的需要。

3. 自动化流程:

要自动执行此操作,您可以创建定期(例如每分钟)运行的 cron 作业或计划任务来终止长时间运行的事务。这是一个 shell 脚本示例:

#!/bin/bash
PSQL="psql -U yourusername -d yourdatabase -c"

$PSQL "SELECT pg_terminate_backend(pid)
       FROM pg_stat_activity
       WHERE state = 'active'
       AND query LIKE 'ROLLBACK%'
       AND now() - query_start > interval '10 minutes';"

通过将其添加到您的 cron 作业中,使用

cron
安排此脚本:

crontab -e

添加以下行以每分钟运行脚本:

* * * * * /path/to/your/script.sh

4. PostgreSQL 配置:

  • 设置查询超时:您可以通过在 PostgreSQL 配置 (

    statement_timeout
    ) 或每个会话中设置
    postgresql.conf
    ,将 PostgreSQL 配置为自动终止长时间运行的查询。这将自动终止超过一定执行时间的查询。

    示例:

    SET statement_timeout = '10min'; -- Set the timeout to 10 minutes for queries
    
  • 空闲事务超时:考虑设置

    idle_in_transaction_session_timeout
    参数,这将终止事务中空闲时间过长的任何会话:

    SET idle_in_transaction_session_timeout = '5min'; -- Set to 5 minutes of idle time
    

    这可以防止会话无意中保持打开状态。

5. 监控和警报:

使用pgAdminDatadogDigitalOcean Monitoring等监控工具来跟踪长时间运行的查询。您可以配置警报,以便在查询运行时间异常长时通知您,以便您在查询堆积之前采取行动。

© www.soinside.com 2019 - 2024. All rights reserved.