我有一个运行在10.6上的PostgreSQL服务器,带有Linux的openSUSE发行版,我刚刚设置了pgpool-II,以允许我缓存查询。它通常可以正常工作,但是由于未知原因,有时我会收到以下警告消息:
WARNING: memcache: adding table oid maps, failed to create directory:"/var/log/pgpool/oiddir". error:"No such file or directory"
我已经创建了目录,将所有者更改为运行pgpool服务器的用户,并允许对该目录的同一用户进行读取,写入和执行。
当尚未缓存查询时,将出现此消息,并且它不会似乎产生任何影响,即查询已按原样缓存,如果我再次进行查询,结果为直接从缓存中提取。
但是我还有另一个问题,我不知道它是否与第一个有关:
当我编写大型查询(使用JOIN,子查询,许多条件等)时,即使结果不正确,pgpool-II也不会缓存其结果(或缓存但不使用它,我不知道)。大(少于500行)。另外,在这种情况下,我没有收到“ oid”警告消息。我尝试提高共享内存的不同限制pgpool-II被允许使用(请参阅documentation),但是它没有像我预期的那样改变,因为当pgpool-II由于缺少可用的共享内存而无法缓存查询时,它应该返回这样的消息:
LOG: pid 13756: pool_add_temp_query_cache: data size exceeds memqcache_maxcache. current:4095 requested:111 memq_maxcache:4096
但就我而言,我没有收到任何消息。以下两种情况的示例。
第一个问题
SELECT *
FROM some_table
WARNING: memcache: adding table oid maps, failed to create directory:"/var/log/pgpool/oiddir". error:"No such file or directory"
-- Doing it a second time will just give me the cached result without any warning, as expected
第二个问题
SELECT A.geom, A.id, to_char(C.timestamp, 'DD/MM/YY') as date, C.timestamp::time as time, ROUND(C.value) as value
FROM segments A, lines B, ( SELECT DISTINCT ON (B.id) B.id, A.timestamp, ROUND(A.nb1+A.nb2+A.nb3) as value
FROM records A
CROSS JOIN LATERAL (SELECT *
FROM points B
WHERE A.id = B.id
AND A.direction = B.direction
ORDER BY A.position <-> B.geom
LIMIT 1) AS B
ORDER BY B.id, A.timestamp DESC) AS C
WHERE A.id = B.id
AND B.id = C.id
AND A.direction = B.direction
AND B.direction = C.direction
-- Doing it a second time will just directly request the PostgreSQL server again, instead of pulling the result from the cache, as it should if the result was cached.
答案 0 :(得分:0)
您的第一个问题看起来像是oiddir上的权限问题。基本上pgpool不能创建缓存所需的目录。根据启动pgpool的方式(通过pgpoolAdmin或命令行),您需要
mkdir /var/log/pgpool/oiddir
chown -R _www /var/log/pgpool/oiddir
(我在Mac OS上使用pgpool,因此apache用户是“ _www”,请相应地进行更改)chown -R postgres /var/log/pgpool/oiddir
(或者您可以使用当前用户代替postgres)您的第二期看起来像是第一期。基本上,您无法缓存,因为没有创建oiddir。修复第一个应该允许您缓存。