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

第四章:向 OceanBase 数据库迁移数据 4.1 OceanBase 的 MySQL 兼容性简介

509

本章使用不同的工具介绍如何将 MySQL 数据库数据迁移到 OceanBase 数据库,以及如何将 OceanBase 数据库数据迁移到 MySQL 数据库。


4.1 OceanBase 的 MySQL 兼容性简介

MySQL 兼容性主要和表的数据类型、业务 SQL 的兼容性有关。 MySQL 的函数、触发器、存储过程在 OceanBase 的 MySQL 模式中不能良好的支持,因此不推荐使用。所以本章数据迁移只包含数据库表对象及其数据的迁移。


支持的数据类型

OceanBase 数据库支持的数据类型有:

  • 数值类型

  • 日期时间类型

  • 字符类型

  • 大对象类型

与 MySQL 数据库相比,OceanBase 数据库暂不支持空间数据类型和 JSON 数据类型,其他类别的数据类型中除大对象类型外,支持情况等于或大于 MySQL 数据库。


支持的 SQL 语法

此处仅列举常用的查询和修改 SQL。

  • SELECT

    支持通过如下方式查看执行计划:

    EXPLAIN <SQL Statement> \G
    
    EXPLAIN extended_noaddr <SQL Statement> \G
    
    EXPLAIN extended <SQL Statement> \G

  • INSERT

    • 支持单行、多行插入和指定分区插入

    • 支持 INSERT INTO ... SELECT ... 语句

  • UPDATE

    • 支持单列和多列更新

    • 支持使用子查询

    • 支持集合更新

  • DELETE

    支持单表和多表删除

  • TRUNCATE

    支持完全清空指定表


支持的变量

MySQL 实例中的参数叫 variable。可以通过以下方式设置:

  • 启动时通过命令行设置

  • 在启动的配置文件中设置

  • SQL 命令行下设置

    • 全局级别

    • 会话级别

MySQL 的部分变量在 OceanBase 的 MySQL 租户中同样适用。但需注意源端 MySQL 和目标端 OceanBase 变量值的差异。

变量名变量默认值(OceanBase)变量含义
autocommitON是否自动提交。
ON:表示每个 DML 之后会自动添加 commit 语句。
OFF:表示不会自动 commit,需要用户主动 commit 或 rollback 事务。
auto_increment_cache_size1000000自增列的缓存值。自增列在节点重启发生切换后可能会跳号,该值越大,跳号间隔越大。
auto_increment_increment1自增列类型值的增长步长。
auto_increment_offset1自增列类型值的起始值。
character_set_clientutf8mb4连接的客户端环境的字符集。保持默认即可。
character_set_connectionutf8mb4连接自身的字符集。保持默认即可。
character_set_databaseutf8mb4连接的数据库的字符集。保持默认即可。
collation_connectionutf8mb4_general_ci用于设置连接使用的字符集和字符序。
collation_databaseutf8mb4_general_ci设置创建数据库默认字符集和字符序。
collation_serverutf8mb4_general_ci用于设置服务器默认字符集和字符序。
max_allowed_packet4194304需要调大,否则 SQL 文本或数据量很大时可能会报错。
sql_modeSTRICT_ALL_TABLES用于设置 SQL 模式,不同的 SQL 模式对于插入等行为有很大影响。
transaction_isolationREAD-COMMITTED用于设置事务的隔离级别。
tx_isolationREAD-COMMITTED用于设置事务隔离级别。
lower_case_table_names11:表示自动将表名转小写,对于表名的大小写不敏感。
0:表示不对表名大小写转换,对于表名的大小写敏感。
foreign_key_checksONON:检查外键约束。
OFF:不检查外键约束。

这些变量中要留意字符集相关设置、sql_mode 设置以及 lower_case_table_names 设置。这些设置建议在数据迁移之前完成,后期修改会带来风险。


支持的字符集

OceanBase MySQL 租户支持字符集 binary 和 utf8mb4,默认字符集是 utf8mb4。字符集 utf8mb4 是 utf8 的超集,比 utf8 多一些表情字符的编码。租户的字符集在租户创建时指定,是租户全局级别的字符集。

迁移数据到 OceanBase 时建议使用 utf8mb4 字符集。 在 utf8mb4 字符集下,每个英文字符长度为 1 字节,每个汉字长度为 3 字节,每个表情字符长度为 4 字节。如果迁移数据时更换了字符集,字符串列的长度需要适当增加。

MySQL [test]> create table t1(c1 varchar(50));
Query OK, 0 rows affected (0.04 sec)

MySQL [test]> insert into t1 values('a'),('中');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

MySQL [test]> select length(c1) from t1;
+------------+
| length(c1) |
+------------+
|          1 |
|          3 |
+------------+
2 rows in set (0.01 sec)

从 MySQL 中导出数据时,需确保数据库中的字符都能正确输出到文件中。通过 vim 命令下的 :set fileencoding 命令可以查看文件的编码,一般为 utf-8,这样通过文件迁移 MySQL 数据时不会出现乱码现象。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论