解决PostgreSQL执行超时的问题
最近在使用PostgreSQL的时候,在执行一些数据库事务的时候,先后出现了statement timetout 和idle-in-transaction timeout的问题,导致数据库操作失败。 经研究查找,PostgreSQL有关于SQL语句执行超时和事务执行超时的相关配置,而默认超时时间是10000毫秒,即10秒钟的时间,这样会导致执行时间稍长的任务执行失败。可以通过修改PostgreSQL服务器配置文件的方式修改默认配置。 参数说明 statement_timeout 默认是0,表示语句可以一直执行下去。 如果设置为10000,那就意味着语句最多可以执行 10000ms = 10s。 建议设置为0,禁用该参数。 1idle_in_transaction_session_timeout PostgreSQL 9.6版本开始支持自动查杀超过指定时间的 idle in transaction 空闲事务连接,用于清理应用代码中忘记关闭已开启的事务,或者系统中存在僵死进程等。 idle_in_transaction_session_timeout 在 postgresql 被用来控制事务执行时长,单位是ms。 $ vi postgresql.conf #idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled 默认是0,表示语句可以一直执行下去。超时会报 FATAL: terminating connection due to idle-in-transaction timeout。 修改方法 查找配置 通过命令查找到postgresql配置文件的位置,用vi进行编辑。 1 2find / -name "postgresql.conf"vi /var/lib/pgsql/9.6/data/postgresql.conf 修改参数 进入vi编辑界面,可以通过vi查找命令定位到相关参数,修改成合适的时间,保存退出。 :/statement_timeout 重启配置 通过以下命令,查找pg_ctl的位置,然后执行 pg_ctl reload重新加载配置。 1 2find / -name "pg_ctl"/usr/pgsql-9.6/bin/pg_ctl reload PG_CTL用法 启动服务器 启动服务器: 1$ pg_ctl start 启动服务器的一个例子,等到服务器启动了才退出: 1$ pg_ctl -w start 服务器使用 5433 端口,而且不带 fsync 运行,使用: 1$ pg_ctl -o "-F -p 5433" start 停止服务器 1$ pg_ctl stop 使用 -m 选项停止服务器允许用户控制如何关闭后端。 重启服务器 这个命令几乎等于先停止服务器然后再启动它,只不过 pg_ctl 保存并重新使用上一次运行服务器的命令行参数。重启服务器的最简单的方法是: 1$ pg_ctl restart 重启服务器,等待其停止和重启: 1$ pg_ctl -w restart 使用 5433 端口重启并且重启后关闭 fsync : 1$ pg_ctl -o "-F -p 5433" restart 显示服务器状态 下面是来自 pg_ctl 的状态输出的例子: $ pg_ctl statuspg_ctl: server is running (pid: 13718) 这就是在 restart 模式中被调用的命令行。 补充:PostgreSQL 设置单条SQL的执行超时 - 防雪崩 背景 设置单条SQL的执行超时,防雪崩。 通常来说可以在SQL发起前设置事务级超时参数,SQL执行结束,重置。(如果SQL异常退出,会自动重置事务级参数) (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |