Citus 14 创建 columnar 表时为何提示 access method 不存在?
需要在创建表的同一个数据库中启用 citus_columnar 扩展。SELECT citus_version() 能返回版本,只能说明 citus 可用,不能证明当前数据库已启用列式存储。
使用 Citus 14.0.1 时,先检查当前数据库是否已创建 citus_columnar 扩展。如果尚未创建,执行:
CREATE EXTENSION IF NOT EXISTS citus_columnar;
为什么安装了 Citus 仍会报错?
从 Citus 13.2 开始,执行 CREATE EXTENSION citus 不再自动创建 citus_columnar。Citus 14 也保留了这一行为,因此数据库中即使已有 citus,也可能没有 Columnar 提供的表访问方法。这一变化见 Citus 13.2 发布说明。
这两个名称的用途不同:
citus_columnar:需要启用的扩展名称。columnar:创建表时使用的访问方法名称。
执行 CREATE TABLE ... USING columnar 时,PostgreSQL 需要找到名为 columnar 的表访问方法。如果当前数据库没有注册它,就会出现题目中的错误。可以查询系统目录 pg_am,查看访问方法的注册信息,参见 PostgreSQL pg_am 文档。
文档中的 USING columnar 语法仍然适用,只需在执行前启用相应扩展。
检查并启用扩展
先在准备创建表的连接中执行:
SELECT current_database();
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name IN ('citus', 'citus_columnar');
查看 citus_columnar 的查询结果:
- 有记录,且
installed_version为NULL:服务端能识别该扩展,但当前数据库尚未启用。 - 有记录,且
installed_version有值:当前数据库已启用该扩展,需要继续检查访问方法,以及实际执行 SQL 的连接。 - 没有记录:当前服务端未找到该扩展的安装信息,需要检查服务端的扩展安装文件。
pg_available_extensions 列出可安装的扩展,installed_version 表示扩展在当前数据库中的安装版本,参见 PostgreSQL pg_available_extensions 文档。
确认扩展可用后,在同一个数据库中执行:
CREATE EXTENSION IF NOT EXISTS citus_columnar;
然后重新运行建表语句:
CREATE TABLE contestant (
handle TEXT,
birthdate DATE,
rating INT,
percentile FLOAT,
region CHAR(3),
achievements TEXT[]
) USING columnar;
如何确认已经生效?
查询表访问方法:
SELECT amname, amtype
FROM pg_am
WHERE amname = 'columnar';
扩展正常启用后,应能查到 columnar,且 amtype 为 t,表示表访问方法。
建表成功后,还可以查询该表实际使用的访问方法:
SELECT n.nspname AS schema_name,
c.relname AS table_name,
a.amname AS access_method
FROM pg_class AS c
JOIN pg_namespace AS n ON n.oid = c.relnamespace
JOIN pg_am AS a ON a.oid = c.relam
WHERE c.oid = 'contestant'::regclass;
结果中的 access_method 应为 columnar。
如果创建扩展仍然失败
如果提示扩展不可用,或找不到 citus_columnar.control,需要先在 PostgreSQL 服务端所在的主机或容器中补齐扩展文件,并确认这些文件与正在运行的 PostgreSQL 主版本和 Citus 版本匹配。具体安装包名称取决于软件源和部署方式,仅凭题目中的版本字符串无法确定。
CREATE EXTENSION 使用服务端已有的扩展文件,不会下载或安装操作系统软件包,参见 PostgreSQL CREATE EXTENSION 文档。
如果提示权限不足,应由具备所需权限的管理员执行。同时,确认启用扩展和创建表时连接的是同一个数据库。CREATE EXTENSION 只作用于当前数据库,在其他数据库中启用扩展,当前连接仍无法使用 columnar。
备注:内容仅供参考。
