postgresql 锁的定位
今天碰到了一个问题,锁定穷根追底把postgresql的锁研究了一番。
数据库查看锁
可以通过表 pg_locks来查看有哪些锁。sql如下:
select a.locktype,a.database,a.pid,a.mode,a.relation,b.relname
from pg_locks a
join pg_class b on a.relation = b.oid and b.relname not like 'pg%';
可以通过pg_stat_query表找到具体的sql,根据pid,正如文档2里面所说,很鸡肋,木有神马作用。顶多知道出于神马状态。
锁的定位一般步骤
鉴于这次的问题发生在“idle in transaction”, 因此针对这个具体做了下攻关:(参考文档2)
1. 设置PostgreSQL\x.x\data\下的postgresql.conf文件中的两个参数:
log_line_prefix , 日志行的前缀(支持比较多的参数,具体看conf文件后面的说明。修改为 '%m %u@%d %p'。
log_min_duration_statement , 是否记录所有的sql,默认为-1,即不记录,0则为记录。修改为0
2. 这一步可以不做。 清空原来的日志,位于PostgreSQL\x.x\data\pg_log下面。需要先停掉postgres然后再开启。便于我们观察不受影响。
3. 重复你产生问题的操作。
4. 定位哪些sql操作时间比较长。(可能需要制作一个工具分析下日志得到报表)
5. 定位具体有问题的代码。
参考:
文档1:http://blog.sina.com.cn/s/blog_79d599dc0100qpra.html
文档2:http://www.depesz.com/2008/08/28/hunting-idle-in-transactions/
文档3:http://blog.sina.com.cn/s/blog_544a710b01019u1f.html (pg_stat_query表结构参考)
附录:
python+django.db快速将日志导入数据表中源码:
sqldb.py
#coding=utf-8
__author__ = 'tommy.yu' from django.db import connection
from django.conf import settings settings.configure(
DATABASES = { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'django',
'USER': 'openerp',
'PASSWORD': '1',
'HOST': 'localhost',
'PORT': '5432',
}, },
TIME_ZONE = 'Hongkong'
) class cursor(object):
def __init__(self):
self.cr = connection.cursor() def query(self,sql):
self.cr.execute(sql)
res = self.cr.fetchall()
self.cr.close()
return res def un_query(self,sql):
return self.cr.execute(sql)
main.py
#coding=utf-8
__author__ = 'tommy.yu'
from sqldb import cursor
import os class odoo_sql_log2db(object):
def __init__(self,log_dir, delimiter, db_table):
self.table=db_table
self.delimiter = delimiter
self.log_dir = log_dir
self.cr = cursor()
# self.cr.un_query("""
# create table %s (
# sql text,
# dura float
# );
# """%self.table) def _sync_line(self, line):
res = {}
#FORMAT EG.
#2014-11-17 16:19:27.965 HKT openerp@ES_IT_TEST 3376日志: 执行时间: 0.000 ms 语句: SELECT nextval('mail_message_id_seq')
try:
t = line.split(': ',3)
if t:
res.update(sql = t[-1])
res.update(dura = t[-2].split(' ')[0])
res.update(ret = self.cr.un_query("""insert into %s(sql, dura) values ('%s', %s)"""%(self.table, res.get('sql').replace('\'','‘'), float(res.get('dura')))))
return res
except Exception,ex:
print ex.message def parse_log(self, file_name):
data = []
line = ''
with open(file_name) as f:
for temp_line in f:
if not temp_line.startswith(self.delimiter):
line += ' '+ temp_line
else:
if line:
data.append(self._sync_line(line))
line = temp_line
return data def parse_logs(self):
#os.path.dirname(self.log_dir)
for (cur, dirs, files) in os.walk(self.log_dir):
for fname in files:
log_path = os.path.join(self.log_dir,cur,fname)
print('begin parsing data for file %s .................................'%fname)
res= self.parse_log(log_path)
print('job done. %s records of log file %s have been inserted to the db'%(len(res),fname))
#print log_path o = odoo_sql_log2db(r'D:\Program Files\PostgreSQL\9.3\data\pg_log','2014-11-17', 'x_sql_log')
o.parse_logs()
转载请注明本文来自:http://www.cnblogs.com/Tommy-Yu/p/4103289.html,谢谢!
postgresql 锁的定位的更多相关文章
- postgresql异常快速定位
今天下午在使用.NET链接postgresql的时候报了“3D000”的错误,经过测试得知原来是web.config中的数据库配置问题. 在这里有个小情况需要注意,postgresql是不允许创建相同 ...
- PostgreSQL 锁等待诊断详解
摘要PostgreSQL和大多数传统RDBMS一样,都设计了大量的锁来保证并发操作的数据一致性. 同时PG在设计锁等待时,以队列方式存储等待锁. 参考 ProcSleep()@src/backend/ ...
- Postgresql 锁查看
之前版本 PostgreSQL 的 pg_stat_activity 视图的 waiting 字段判断会话是否等待锁资源(通俗地讲, waiting 值为true表示申请不到锁资源处于等待状态),但是 ...
- PostgreSQL 锁机制浅析
锁机制在 PostgreSQL 里非常重要 (对于其他现代的 RDBMS 也是如此).对于数据库应用程序开发者(特别是那些涉及到高并发代码的程序员),需要对锁非常熟悉.对于某些问题,锁需要被重点关注与 ...
- PostgreSQL 锁 之 关系级锁
1.关于锁的基本信息 PostgreSQL 有各种各样的技术来锁定某些东西(或者至少是这样称呼的).因此,我将首先用最笼统的术语解释为什么需要锁,可用的锁类型以及它们之间的区别.然后我们将弄清楚 Po ...
- PostgreSQL 锁监控
PG>9.2 postgres=# SELECT blocked_locks.pid AS blocked_pid,postgres-# blocked_activity.usename AS ...
- PostgreSQL锁级别及什么操作获取什么锁
表级锁 大多数的表级锁是由内置的 SQL 命令获得的,但他们也可以通过锁命令来明确获取.可使用的表级锁包括: 访问共享(ACCESS SHARE) - SELECT 命令可在查询中引用的表上获得该锁. ...
- postgresql 锁表查询语句
1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation = t.oid where t.relkind = 'r' an ...
- POSTGRESQL 锁表的问题
一.找出所的语句 select wait.pid, wait.query as wait_query, wait.query_start as wait_query_start, wait.lockt ...
随机推荐
- 标准IDispose模式浅析
DoNet资源 众所周知,.Net内存管理分托管资源和非托管资源,把内存中的对象按照这两种资源划分,然后由GC负责回收托管资源(Managed Resource),而对于非托管资源来讲,就需要程序员手 ...
- “耐撕”团队2016.04.19站立会议
1. 时间 : 20:20--20:40 共计20分钟 2. 人员 : Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客 ...
- 【RSYSLOG】rsyslog作为日志采集器安装配置说明
RSYSLOG is the rocket-fast system for log processing. About 由于环境基于CentOS 6.7 x64,rsyslog本身就是OS的组件,由于 ...
- 【OpenCV入门教程之二】OPENCV3 开源之美 — 编译源代码、配置opencv_contrib
为什么要配置opencv_contrib? opencv3.0版本 功能更加模块块,一些功能模块不够完善,等足够完善在merge到主分支中,而我们图像识别中要用到的SIFT等算法被封装在xfeactu ...
- Cas_Java客户端登录相关过滤器的处理流程
首先了解一下CAS登录原理: 1.CAS结构中一般包含CAS服务器(Cas验证服务器).应用服务器(程序所在服务器).客户端(web浏览器)三个部分. 2.客户端向应用服务器发出请求,由于未登录,会被 ...
- HDU-1754I Hate It 线段树区间最值
这道题比较基本,就是用线段树维护区间最值,可以算是模板吧-.. I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768 ...
- SpringAOP
首先导包, 我用的是Spring4.0.4;需要这三个包 Spring-AOP-4.0.4.REALEASE.jar + Spring-aspect-4.0.4.REALEASE.jar +aspec ...
- 【bzoj4010】 HNOI2015—菜肴制作
http://www.lydsy.com/JudgeOnline/problem.php?id=4010 (题目链接) 题意 给出一张无向图要求出一个拓扑序列满足1的位置最靠前 ,在保证上面的条件下使 ...
- 超级懒汉编写的基于.NET的微信SDK
一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...
- hdu acmsteps 2.2.1 Fibonacci
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...