返回介绍

升级与升级后常见问题

发布于 2020-10-26 07:01:36 字数 6252 浏览 891 评论 0 收藏 0

本文介绍 TiDB 升级与升级后的常见问题与解决办法。

升级常见问题

本小节列出了 TiDB 升级相关的常见问题与解决办法。

滚动升级有那些影响?

滚动升级 TiDB 服务,滚动升级期间不影响业务运行。需要配置最小集群拓扑(TiDB * 2、PD * 3、TiKV * 3),如果集群环境中有 Pump 和 Drainer 服务,建议先停止 Drainer,然后滚动升级(升级 TiDB 时会升级 Pump)。

Binary 如何升级?

Binary 不是建议的安装方式,对升级支持也不友好,建议换成 TiUP 部署

升级后常见问题

本小节列出了一些升级后可能会遇到的问题与解决办法。

执行 DDL 操作时遇到的字符集 (charset) 问题

TiDB 在 v2.1.0 以及之前版本(包括 v2.0 所有版本)中,默认字符集是 UTF8。从 v2.1.1 开始,默认字符集变更为 UTF8MB4。如果在 v2.1.0 及之前版本中,建表时显式指定了 table 的 charset 为 UTF8,那么升级到 v2.1.1 之后,执行 DDL 操作可能会失败。

要避免该问题,需注意以下两个要点:

  • 在 v2.1.3 之前,TiDB 不支持修改 column 的 charset。所以,执行 DDL 操作时,新 column 的 charset 需要和旧 column 的 charset 保持一致。
  • 在 v2.1.3 之前,即使 column 的 charset 和 table 的 charset 不一样,show create table 也不会显示 column 的 charset,但可以通过 HTTP API 获取 table 的元信息来查看 column 的 charset,下文提供了示例。

unsupported modify column charset utf8mb4 not match origin utf8

  • 升级前:v2.1.0 及之前版本

    create table t(a varchar(10)) charset=utf8;
    Query OK, 0 rows affected
    Time: 0.106s
    show create table t
    +-------+-------------------------------------------------------+
    | Table | Create Table                                          |
    +-------+-------------------------------------------------------+
    | t     | CREATE TABLE `t` (                                    |
    |       |   `a` varchar(10) DEFAULT NULL                        |
    |       | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
    +-------+-------------------------------------------------------+
    1 row in set
    Time: 0.006s
  • 升级后:v2.1.1、v2.1.2 会出现下面的问题,v2.1.3 以及之后版本不会出现下面的问题。

    alter table t change column a a varchar(20);
    ERROR 1105 (HY000): unsupported modify column charset utf8mb4 not match origin utf8

解决方案:显式指定 column charset,保持和原来的 charset 一致即可。

alter table t change column a a varchar(22) character set utf8;
  • 根据要点 1,此处如果不指定 column 的 charset,会用默认的 UTF8MB4,所以需要指定 column charset 保持和原来一致。

  • 根据要点 2,用 HTTP API 获取 table 元信息,然后根据 column 名字和 Charset 关键字搜索即可找到 column 的 charset。

    curl "http://$IP:10080/schema/test/t" | python -m json.tool

    这里用了 python 的格式化 json的工具,也可以不加,此处只是为了方便注释。

    {
        "ShardRowIDBits": 0,
        "auto_inc_id": 0,
        "charset": "utf8",   # table 的 charset
        "collate": "",
        "cols": [            # 从这里开始列举 column 的相关信息
            {
                ...
                "id": 1,
                "name": {
                    "L": "a",
                    "O": "a"   # column 的名字
                },
                "offset": 0,
                "origin_default": null,
                "state": 5,
                "type": {
                    "Charset": "utf8",   # column a 的 charset
                    "Collate": "utf8_bin",
                    "Decimal": 0,
                    "Elems": null,
                    "Flag": 0,
                    "Flen": 10,
                    "Tp": 15
                }
            }
        ],
        ...
    }

unsupported modify charset from utf8mb4 to utf8

  • 升级前:v2.1.1,v2.1.2

    create table t(a varchar(10)) charset=utf8;
    Query OK, 0 rows affected
    Time: 0.109s
    show create table t;
    +-------+-------------------------------------------------------+
    | Table | Create Table                                          |
    +-------+-------------------------------------------------------+
    | t     | CREATE TABLE `t` (                                    |
    |       |   `a` varchar(10) DEFAULT NULL                        |
    |       | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
    +-------+-------------------------------------------------------+

    上面 show create table 只显示出了 table 的 charset,但其实 column 的 charset 是 UTF8MB4,这可以通过 HTTP API 获取 schema 来确认。这是一个 bug,即此处建表时 column 的 charset 应该要和 table 保持一致为 UTF8,该问题在 v2.1.3 中已经修复。

  • 升级后:v2.1.3 及之后版本

    show create table t;
    +-------+--------------------------------------------------------------------+
    | Table | Create Table                                                       |
    +-------+--------------------------------------------------------------------+
    | t     | CREATE TABLE `t` (                                                 |
    |       |   `a` varchar(10) CHARSET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL |
    |       | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin              |
    +-------+--------------------------------------------------------------------+
    1 row in set
    Time: 0.007s
    alter table t change column a a varchar(20);
    ERROR 1105 (HY000): unsupported modify charset from utf8mb4 to utf8

解决方案:

  • 因为在 v2.1.3 之后,TiDB 支持修改 column 和 table 的 charset,所以这里推荐修改 table 的 charset 为 UTF8MB4。

    alter table t convert to character set utf8mb4;
  • 也可以像问题 1 一样指定 column 的 charset,保持和 column 原来的 charset (UTF8MB4) 一致即可。

    alter table t change column a a varchar(20) character set utf8mb4;

ERROR 1366 (HY000): incorrect utf8 value f09f8c80(

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文