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# sql
SET allow_deprecated_syntax_for_merge_tree = 1;
在 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;
# sql
CREATE TABLE db_ops.db_backup_day_new (
column1 Type1,
column2 Type2,
...
) ENGINE = MergeTree()
ORDER BY (column1, column2);
# sql
INSERT INTO db_ops.db_backup_day_new
SELECT * FROM db_ops.db_backup_day;
# sql
DROP TABLE db_ops.db_backup_day;
RENAME TABLE db_ops.db_backup_day_new TO db_ops.db_backup_day;