PAYATHON 2026

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。

备注:内容仅供参考。