暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

升级Clickhouse出现了MergeTree表引擎语法更新,如何处理?

运维笔谈 2025-01-20
397
Clickhouse在升级的时候,假如ck版本比较老,升级到较新版本可能会遇到如下情况:can't create table 'db_ops.db_backup_day': code: 36, message: This syntax for *MergeTree engine is deprecated. Use extended storage definition syntax with ORDER BY/PRIMARY KEY clause. See also `allow_deprecated_syntax_for_merge_tree` setting 
这是因为当初在创建`MergeTree`表时使用了旧的语法,而新版本的ClickHouse 不再支持这种语法。从较新的 ClickHouse 版本开始,MergeTree 系列引擎(如`MergeTree`、`ReplacingMergeTree` 、`SummingMergeTree` 等)要求明确指定`ORDER BY`或 `PRIMARY KEY`参数,而不能依赖默认值。
一、使用兼容旧语法方法
我们需要修改建表语句来匹配新的语法规则,假如我们无法修改建表语句,官方也提供了一个临时的解决方案,通过如下配置来允许使用旧的语法:allow_deprecated_syntax_for_merge_tree
方法 1:动态设置(当前会话有效,临时调整)
    sql
    SET allow_deprecated_syntax_for_merge_tree = 1;
    方法 2:修改配置文件(永久生效)
    在 ClickHouse 配置文件 /etc/clickhouse-server/config.xml 中添加:
      # xml
      <yandex>
          <allow_deprecated_syntax_for_merge_tree>1</allow_deprecated_syntax_for_merge_tree>
      </yandex>
      配置文件修改之后需要重启下clickhouse服务。
        sudo systemctl restart clickhouse-server
        二、建新表、迁移数据方法
        表中已经有数据,我们只能通过新语法来创建新表,然后把旧表中数据导入新表之后,再重命名新表,具体步骤如下:
        1、我们先查看表的建表语句,可以通过如下语法来获取当初创建表的建表SQL:
          sql
          SHOW CREATE TABLE db_ops.db_backup_day;
          2、创建符合新语法的新表
            sql
            CREATE TABLE db_ops.db_backup_day_new (
                column1 Type1,
                column2 Type2,
                ...
            ) ENGINE = MergeTree()
            ORDER BY (column1, column2);
            3、导入数据到新表(数据大可以使用备份工具还原)
              sql
              INSERT INTO db_ops.db_backup_day_new
              SELECT * FROM db_ops.db_backup_day;
              4、重命名新表
              备份旧表再删除,然后将新表重命名为旧表名
                sql
                DROP TABLE db_ops.db_backup_day;
                RENAME TABLE db_ops.db_backup_day_new TO db_ops.db_backup_day;

                文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论