显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL research

公益是一辈子的事, I'm 德哥@Digoal, Just Do it!

 
 
 
 
 
 

PostgreSQL 老湿机图解平安科技遇到的垃圾回收"坑"

2016-8-15 22:54:26 阅读414 评论4 152016/08 Aug15

背景

近日收到 平安科技 海安童鞋 那里反馈的一个问题,在生产环境使用PostgreSQL的过程中,遇到的一个有点"不可思议"的问题。

一张经常被更新的表,通过主键查询这张表的记录时,发现需要扫描异常多的数据块。

本文将为你详细剖析这个问题,同时给出规避的方法,以及内核改造的方法。

文中还涉及到索引的结构解说,仔细阅读定有收获。

原因分析

.1. 和长事务有关,我在很多文章都提到过,PG在垃圾回收时,只判断垃圾版本是否是当前数据库中最老的事务之前的,如果是之后产生的,则不回收。

所以当数据库存在长事务时,同时被访问的记录被多次变更,造成一些垃圾版本没有回收。

.2. PG的索引没有版本信息,所以必须要访问heap tuple获取版本。

复现方法

测试表

de >postgres=# create unlogged table test03 (id int primary key, info text); de>

频繁更新100条记录

de >$ vi test.sql \setrandom id 1 100 insert into test03 values(:id, repeat(md5(random()::text), 1000)) on conflict on constraint test03_pkey do update set info=excluded.info; pgbench

作者  | 2016-8-15 22:54:26 | 阅读(414) |评论(4) | 阅读全文>>

PostgreSQL PL/Perl 钩子安全性分析

2016-8-15 22:53:05 阅读103 评论0 152016/08 Aug15

背景

plperl 是PostgreSQL支持的函数语言之一。

在使用plperl时,可以使用plperl提供的钩子功能,满足一些特殊场景的需求。

钩子分2种,一种是加载plperl.so库时的钩子,一种是加载perl语言解释器时的钩子。

钩子的使用有安全问题吗?

钩子用法介绍加载plperl.so库时的钩子

相关参数

plperl.on_init (string)

de >Specifies Perl code to be executed when a Perl interpreter is first initialized, before it is specialized for use by plperl or plperlu. The SPI functions are not available when this code is executed. If the code fails with an error it will abort the initialization of the interpreter and propagate out to the calling query, causing the current transaction or subtransaction to be aborted. The Perl code is limited to a single string. Longer code can

作者  | 2016-8-15 22:53:05 | 阅读(103) |评论(0) | 阅读全文>>

PostgreSQL Oracle 兼容性 之 - PL/SQL record, table类型定义

2016-8-15 22:52:36 阅读153 评论0 152016/08 Aug15

背景

Oracle PL/SQL是非常强大的一门SQL编程语言,许多Oracle用户也使用它来处理一些要求延迟低且数据一致性或可靠性要求很高的业务逻辑。

PostgreSQL也有一门非常高级的内置SQL编程语言,plpgsql。与Oracle PL/SQL语法极其类似,但是还是有一些不一样的地方。

(PS:除了plpgsql,PostgreSQL还支持C,java,python,perl等流行的语言作为数据库的函数编程语言)

本文是针对有Oracle用户遇到的一些函数语法与PostgreSQL不兼容的地方,给出的修改建议。

涉及type xx is table of xxxx index by binary_integer语法、type xx is record语法。

Oracle PL/SQL 例子de >CREATE OR REPLACE FUNCTION f_xml(p_xml CLOB) RETURN INT AS ... type rec_tk is record ( tkno VARCHAR2(100) , cg_zdj number(12,0) := 0 , cg_jsf number(12,0) := 0 ); type tklist is table of rec_tk index by binary_integer; type rec_cjr is record ( cjrid varchar2(30) , tk tklist ); type cjr is table

作者  | 2016-8-15 22:52:36 | 阅读(153) |评论(0) | 阅读全文>>

连接 0.0.0.0/32 发生了什么

2016-8-15 22:51:58 阅读151 评论0 152016/08 Aug15

根据RFC 3330, 1700 的描述, 0.0.0.0/32 可以用作当前网络的源地址。

de >0.0.0.0/8 - Addresses in this block refer to source hosts on "this" network. Address 0.0.0.0/32 may be used as a source address for this host on this network; other addresses within 0.0.0.0/8 may be used to refer to specified hosts on this network. [RFC1700, page 4]. de>

0.0.0.0/32 作为目标地址使用时,与127.0.0.1含义一样。

但是0.0.0.0还有更多的含义,如下

de >IP address numbers in Internet Protocol (IP) version 4 (IPv4) range from 0.0.0.0 up to 255.255.255.255. The IP address 0.0.0.0 has several special meanings on computer networks. It cannot be used as a general-purpose device address, however. IPv6 networks have a similar concept

作者  | 2016-8-15 22:51:58 | 阅读(151) |评论(0) | 阅读全文>>

[转载]聊聊Greenplum的那些事

2016-8-15 22:50:37 阅读364 评论0 152016/08 Aug15

原文

http://dbaplus.cn/news-21-341-1.html

聊聊Greenplum的那些事

李巍 2016-04-01 14:15:00 1024

开卷有益——作者的话

有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨。

笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum 早期员工加入Greenplum团队(当时的工牌是“005”,哈哈),记得当时看了一眼Greenplum的架构(嗯,就是现在大家耳熟能详的那个好多个X86框框的图),就义无反顾地加入了,转眼之间,已经到了第8个年头。

在诸多项目中我亲历了Greenplum在国内的生根发芽到高速发展,再到现在拥有一百多个企业级用户的过程。也见证了Greenplum从早期的2.1版本到当前的4.37版本,许多NB功能的不断增强、系统稳定性的不断大幅提高,在Greenplum的发展壮大中,IT行业也发生着巨大的变化,业界潮流沿着开放、开源的方向走向了大数据和云计算时代。由此看出,Greenplum十来年的快速发展不是偶然发生的,这与其在技术路线上始终保持与整个IT行业的技术演进高度一致密不可分的。

多年历练中接触过大大小小几十个数据类项目,有些浅尝辄止(最短的不到一周甚至还有远程支持),有些周期以年来计(长期出差现场、生不如死),客观来说, 每个项目都有其独一无二的的特点,只要有心,你总能

作者  | 2016-8-15 22:50:37 | 阅读(364) |评论(0) | 阅读全文>>

阿里云数据库Greenplum版发布啦

2016-8-15 22:49:54 阅读173 评论2 152016/08 Aug15

经过阿里云ApsaraDB小伙伴们几个月的不懈努力,Greenplum 终于上云了。

(这里有PostgreSQL内核小组的宇宙第一小鲜肉,还有宇宙无敌老腊肉)

云数据库Greenplum版(ApsaraDB for Greenplum)是基于Greenplum开源数据库项目的MPP大规模并行处理数据仓库产品,提供全面的SQL支持(包括符合SQL2008标准的OLAP分析函数),业界流行的BI软件都可以直接使用Greenplum进行在线业务分析。支持行存储和列存储混合模式,提高分析性能;同时提供数据压缩技术,降低存储成本。支持XML、GIS地理信息、模糊字符串等丰富的数据类型,为物联网、互联网、金融、政企等行业提供丰富的业务分析能力。

Greenplum从2008年在国内推广以来,生态已经非常的成熟,在 运营商、金融、物流、公安、政府、互联网 等行业都有非常庞大的用户群体。

从百TB到PB的OLAP仓库,Greenplum无疑是非常好的选择。

阿里云并不是简单的将Greenplum云化,还添加了一些非常贴地气的特性:

内核增强支持插件 oss_ext、PostGIS、orafunc(Oracle兼容包)、DBLINK、MADlib(机器学习方面的函数库)、fuzzystrmatch插件,字符串模糊匹配;

(OSS_EXT插件,读取存放在OSS(Open Storage Service)上的文件。)支持 create extension 语法创建插件

作者  | 2016-8-15 22:49:54 | 阅读(173) |评论(2) | 阅读全文>>

PostgreSQL relcache在长连接应用中的内存霸占"坑"

2016-8-15 22:49:09 阅读253 评论0 152016/08 Aug15

背景

阿里巴巴内部的某业务在使用阿里云RDS PG时,业务线细心的DBA发现,一些长连接占据了大量的内存没有释放。后来找到了复现的方法。使用场景有些极端。

有阿里巴巴内部业务这样的老湿机陪伴的RDS PG,是很靠谱的。

PostgreSQL 缓存

除了常见的执行计划缓存、数据缓存,PostgreSQL为了提高生成执行计划的效率,还提供了catalog, relation等缓存机制。

PostgreSQL 9.5支持的缓存代码如下

de >ll src/backend/utils/cache/ attoptcache.c catcache.c evtcache.c inval.c lsyscache.c plancache.c relcache.c relfilenodemap.c relmapper.c spccache.c syscache.c ts_cache.c typcache.c de>长连接的缓存问题

这些缓存中,某些缓存是不会主动释放的,因此可能导致长连接霸占大量的内存不释放。

通常,长连接的应用,一个连接可能给多个客户端会话使用过,访问到大量catalog的可能性非常大。所以此类的内存占用比是非常高的。

有什么影响呢?

如果长连接很多,而且每个都霸占大量的内存,你的内存很快会被大量的连接耗光,出现OOM是避免不了的。

而实际上,这些内存可能大部分都是relcache的(还

作者  | 2016-8-15 22:49:09 | 阅读(253) |评论(0) | 阅读全文>>

PostgreSQL 多路并行 xlog 设计

2016-8-15 22:48:26 阅读85 评论0 152016/08 Aug15

本文截取自《多核处理器下事务型数据库性能优化技术综述》

http://www.cnki.com.cn/Article/CJFDTotal-JSJX201509012.htm

数据库的redo记录了事务的重做信息,它最重要的功能之一是用来恢复数据库,例如当数据库crash后,需要从数据库的一致检查点开始,读取redo并回放。

为了保证事务回放的先后顺序,XLOG是串行的,所以写XLOG时也需要锁的。

为了提高写性能,PostgreSQL使用了xlog buffer来缓解写压力。

在使用了xlog buffer或者XLOG使用了SSD硬盘后,串行的写可能会成为瓶颈。

本文旨在研究多路并行XLOG的实现,从而减少不必要的等待,提高写的吞吐率。

当使用了多路XLOG后,不同路数的XLOG相互之间是没有锁竞争的,大大提高了XLOG的写并发。

同时,为了保证XLOG回放时的先后顺序,每一笔XLOG都需要申请一个时间戳,并写入XLOG文件中,回放时严格按照时间戳顺序来回放。

对于检查点的创建,多路XLOG都必须完成检查点的创建,才是一个有效的检查点。

从测试结果来看,使用多路XLOG的话,测试并行度越高,性能表现相比没有XLOG并行的越好。

作者  | 2016-8-15 22:48:26 | 阅读(85) |评论(0) | 阅读全文>>

PostgreSQL雕虫小技,分组TOP性能提升44倍

2016-8-15 22:47:47 阅读312 评论0 152016/08 Aug15

业务背景

按分组取出TOP值,是非常常见的业务需求。

比如提取每位歌手的下载量TOP 10的曲目、提取每个城市纳税前10的人或企业。

传统方法

传统的方法是使用窗口查询,PostgreSQL是支持窗口查询的。

例子

测试表和测试数据,生成10000个分组,1000万条记录。

de >postgres=# create table tbl(c1 int, c2 int, c3 int); CREATE TABLE postgres=# create index idx1 on tbl(c1,c2); CREATE INDEX postgres=# insert into tbl select mod(trunc(random()*10000)::int, 10000), trunc(random()*10000000) from generate_series(1,10000000); INSERT 0 10000000 de>

使用窗口查询的执行计划

de >postgres=# explain select * from (select row_number() over(partition by c1 order by c2) as rn,* from tbl) t where t.rn<=10; QUERY PLAN

作者  | 2016-8-15 22:47:47 | 阅读(312) |评论(0) | 阅读全文>>

如何生成和阅读EnterpriseDB (PPAS)诊断报告

2016-8-15 22:46:26 阅读93 评论0 152016/08 Aug15

PPAS是基于PostgreSQL的高度兼容Oracle的商业产品。

不仅语法和Oracle兼容,功能也和Oracle很类似。

例如它也支持生成类似statspack或者AWR报告。

如何创建快照

配置参数timed_statistics=true或者在客户端会话中设置timed_statistics=true.

然后创建一个快照

de >edb=# SELECT * FROM edbsnap(); edbsnap ---------------------- Statement processed. (1 row) de>

你可以周期性的创建快照。

如何生成诊断报告

然后选择两个快照,产生这两个快照时间点之间的数据库运行诊断报告。

de >SELECT * FROM edbsnap(); de>查看已创建的快照de >edb=# SELECT * FROM get_snaps(); get_snaps ------------------------------ 1 11-FEB-10 10:41:05.668852 2 11-FEB-10 10:42:27.26154 3 11-FEB-10 10:45:48.999992 4 11-FEB-10 11:01:58.345163 5 11-FEB-10 11:05:14.092683

作者  | 2016-8-15 22:46:26 | 阅读(93) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

浙江省 杭州市 狮子座

 发消息  写留言

 
PostgreSQL 高校实验室,企业,社区大联盟才是未来的方向.
 
QQ276732431
E-Mail digoal@126.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 

FlagCounter

 
 
模块内容加载中...
 
 
 
 
 

新浪微博

 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016

注册 登录  
 加关注