扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章将为大家详细讲解有关PostgreSQL中出现执行超时如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、虚拟主机、营销软件、网站建设、惠阳网站维护、网站推广。statement_timeout statement_timeout 在 postgresql 被用来控制语句执行时长,单位是ms。 $ vi postgresql.conf #statement_timeout = 0 # in milliseconds, 0 is disabled
默认是0,表示语句可以一直执行下去。
如果设置为10000,那就意味着语句最多可以执行 10000ms = 10s。
建议设置为0,禁用该参数。
idle_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进行编辑。
find / -name "postgresql.conf" vi /var/lib/pgsql/9.6/data/postgresql.conf
修改参数
进入vi编辑界面,可以通过vi查找命令定位到相关参数,修改成合适的时间,保存退出。
:/statement_timeout
重启配置
通过以下命令,查找pg_ctl的位置,然后执行 pg_ctl reload重新加载配置。
find / -name "pg_ctl" /usr/pgsql-9.6/bin/pg_ctl reload
PG_CTL用法
启动服务器:
$ pg_ctl start
启动服务器的一个例子,等到服务器启动了才退出:
$ pg_ctl -w start
服务器使用 5433 端口,而且不带 fsync 运行,使用:
$ pg_ctl -o "-F -p 5433" start
$ pg_ctl stop
使用 -m 选项停止服务器允许用户控制如何关闭后端。
这个命令几乎等于先停止服务器然后再启动它,只不过 pg_ctl 保存并重新使用上一次运行服务器的命令行参数。重启服务器的最简单的方法是:
$ pg_ctl restart
重启服务器,等待其停止和重启:
$ pg_ctl -w restart
使用 5433 端口重启并且重启后关闭 fsync :
$ pg_ctl -o "-F -p 5433" restart
下面是来自 pg_ctl 的状态输出的例子:
$ pg_ctl statuspg_ctl: server is running (pid: 13718) Command line was: /usr/local/pgsql/bin/postgres '-D' '/usr/local/pgsql/data' '-p' '5433' '-B' '128'
这就是在 restart 模式中被调用的命令行。
补充:PostgreSQL 设置单条SQL的执行超时 - 防雪崩
设置单条SQL的执行超时,防雪崩。
通常来说可以在SQL发起前设置事务级超时参数,SQL执行结束,重置。(如果SQL异常退出,会自动重置事务级参数)
begin; ...... set local statement_time='100ms'; select count(*) from a; -- 这条SQL的执行时间超过100MS则主动退出,并回滚整个事务 set local statement_timeout to default; ...... end;
例如这个QUERY,我们想让它100毫秒超时。
select count(*) as cnt, id from a where id<$1 group by id;
将它写到函数中,在函数中设置超时
create or replace function f1(int) returns setof record as $$ declare begin set local statement_timeout='100ms'; return query select count(*) as cnt, id from a where id<$1 group by id; end; $$ language plpgsql strict ;
调用SQL改成这样
select cnt,id from f1(1) as t(cnt int8, id int);
但是这么做实际上是没有效果的,原因是statement_timeout的设计之初是为交互性SQL设计的,在postgres.c中。
所以需要plpgsql超时,需要通过插件HOOK来实现。
https://www.postgresql.org/message-id/flat/200702201200.53535.xzilla%40users.sourceforge.net#200702201200.53535.xzilla@users.sourceforge.net
statement_timeout is measured across an entire interactive command, not individual commands within a function; and the timeout that applies to an interactive command is determined at its beginning. So the above doesn't do what you think.
1、实例级
修改
postgresql.conf
2、库级
alter database dbname set parameter=?;
3、用户级
alter role rolname set parameter=?;
4、会话级
set parameter=?;
5、事务级
begin; set local parameter=?; .... end;
6、函数级
alter function fun_name() set parameter=?;
1、空闲事务超时
idle_in_transaction_session_timeout = 2h
2、锁等待超时
lock_timeout = 1s
3、死锁检测超时间隔
deadlock_timeout = 1s
关于PostgreSQL中出现执行超时如何解决就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流