2007-04-23

pgpool-II不能处理的语句(簡體)

更新:2007-04-24

INSERT
不能在分区字段中使用DEFAULT,比如,如果x是数据表t的分区字段,下边的语句无效:
INSERT INTO t(x) VALUES (DEFAULT);
同样,函数也不能作为值使用:
INSERT INTO t(x) VALUES (func());
在这里必须使用常量。
另外,也不能支持SELECT INTO和INSERT INTO ... SELECT 语句。

UPDATE
如果更新分区列可能会丧失数据一致性,pgpool-II不能对更新过的数据重新分区。
如果查询因为违反约束(constraint)而引发错误,那么事务不能回滚(rollback)。
如果从WHERE子句中调用函数,更新可能无法正确执行。比如:
UPDATE branches set bid = 100 where bid = (select max(bid) from beances);

SELECT ... FOR UPDATE
如果从WHERE子句中调用函数,查询可能无法正确执行。比如:
SELECT * FROM branches where bid = (select max(bid) from beances) FOR UPDATE;

COPY
不支持COPY BINARY,也不支持从文件中copy,只能支持COPY FROM STDIN和COPY TO STDOUT。

ALTER/CREATE TABLE
更新分区规则(partition rule)以后,必须重新启动pgpool-II从系统DB中读入新设置。

Transaction
在事务块中执行的SELECT语句将被放在分离的事务块中执行,例如:
BEGIN;
INSERT INTO t(a) VALUES (1);
SELECT * FROM t ORDER BY a; <-- 上边的INSERT结果在这个SELECT语句中不可见 END;


Views / Rules
对于视图和规则,后端数据库将创建相同的定义。
SELECT * FROM a, b where a.i = b.i
像上边这样的联合(join)将在每一个后端数据库运行,然后合并它们的结果,无法建立跨越节点的视图和规则。
(看起来这里有个问题,如果存在分区,那么a和b的必须基于i而且必须一样。)

Functions / Triggers
相同的函数定义在每一个后端数据库创建,跨越节点的联合(join)和其它节点上的数据无法在函数内部操作。

Extended Query Protocol
不支持被JDBC驱动等程序使用的扩展查询协议(extended query protocol),必须使用简单查询协议(simple query protocols)。

Multi-byte Characters
pgpool-II不能进行不同字符集之间的转换,因此客户端、后端数据库和pgpool-II系统DB的字符集编码必须相同。

Deadlocks
跨越后端服务器的死锁无法被检测,例如:
(tellers数据表按照以下规则分区
-partition)
tid <= 10 --> node 0
tid >= 10 --> node 1
A) BEGIN;
B) BEGIN;
A) SELECT * FROM tellers WHERE tid = 11 FOR UPDATE;
B) SELECT * FROM tellers WHERE tid = 1 FOR UPDATE;
A) SELECT * FROM tellers WHERE tid = 1 FOR UPDATE;
B) SELECT * FROM tellers WHERE tid = 11 FOR UPDATE;


这个例子,单一节点无法检测思锁,pgpool-II会一直等待响应,这个现象发生在其他检索获得行级锁(row level lock)时。可以设置replication_timeout参数避免这个问题
同样,如果某个节点发生死锁,每个节点的事务状态会变得不一致,所以,如果检测到死锁pgpool-II会中止处理。
pool_read_kind: kind does not match between master(84) slot[1] (69)

Schemas
public之外的schema的对象必须用全名引用:
schema.object
否则,当设置路径set search_path = xxx并且在查询中省略schema名时,pgpool-II无法解析正确的schema。

关于pgpool-II的一些特点就写完了,后边准备写一点使用指南。
建议不要使用分区功能,因为它看起来很不健壮,会带来意想不到的问题,相信大家从文档中也能看到这一点。我认为它更适合于大型查询系统而不是有频繁更新的地方,不然维护数据一致性对采用它的project来讲是一个非常繁重的工作,而且有太多限制,有些几乎是致命的,会导致某些功能根本无法实现。


延伸閱讀(Link):
pgpool官方英文网站
pgpool-II官方英文网站

沒有留言:

網誌存檔

PostgreSQL & Google-Analytics Running...

::Planet PostgreSQL::

PostgreSQL Information Page

PostgreSQL日記(日本 石井達夫先生Blog)

PostgreSQL News

黑喵的家 - 資料庫相關

Google 網上論壇
PostgreSQL 8 DBA 專業指南中文版
書籍內容討論與更多下載區(造訪此群組)
目錄下載: PostgreSQL_8 _DBA_Index_zh_TW.pdf (更新:2007-05-18)

全球訪客分佈圖(Google)

全球訪客分佈圖(Google)