MySQL 兼容性主要和表的数据类型、业务 SQL 的兼容性有关。 MySQL 的函数、触发器、存储过程在 OceanBase 的 MySQL 模式中不能良好的支持,因此不推荐使用。所以本章数据迁移只包含数据库表对象及其数据的迁移。
OceanBase 数据库支持的数据类型有:
数值类型
日期时间类型
字符类型
大对象类型
与 MySQL 数据库相比,OceanBase 数据库暂不支持空间数据类型和 JSON 数据类型,其他类别的数据类型中除大对象类型外,支持情况等于或大于 MySQL 数据库。
此处仅列举常用的查询和修改 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) | 变量含义 |
---|---|---|
autocommit | ON | 是否自动提交。ON :表示每个 DML 之后会自动添加 commit 语句。OFF :表示不会自动 commit,需要用户主动 commit 或 rollback 事务。 |
auto_increment_cache_size | 1000000 | 自增列的缓存值。自增列在节点重启发生切换后可能会跳号,该值越大,跳号间隔越大。 |
auto_increment_increment | 1 | 自增列类型值的增长步长。 |
auto_increment_offset | 1 | 自增列类型值的起始值。 |
character_set_client | utf8mb4 | 连接的客户端环境的字符集。保持默认即可。 |
character_set_connection | utf8mb4 | 连接自身的字符集。保持默认即可。 |
character_set_database | utf8mb4 | 连接的数据库的字符集。保持默认即可。 |
collation_connection | utf8mb4_general_ci | 用于设置连接使用的字符集和字符序。 |
collation_database | utf8mb4_general_ci | 设置创建数据库默认字符集和字符序。 |
collation_server | utf8mb4_general_ci | 用于设置服务器默认字符集和字符序。 |
max_allowed_packet | 4194304 | 需要调大,否则 SQL 文本或数据量很大时可能会报错。 |
sql_mode | STRICT_ALL_TABLES | 用于设置 SQL 模式,不同的 SQL 模式对于插入等行为有很大影响。 |
transaction_isolation | READ-COMMITTED | 用于设置事务的隔离级别。 |
tx_isolation | READ-COMMITTED | 用于设置事务隔离级别。 |
lower_case_table_names | 1 |
1 :表示自动将表名转小写,对于表名的大小写不敏感。0 :表示不对表名大小写转换,对于表名的大小写敏感。 |
foreign_key_checks | ON |
ON :检查外键约束。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 数据时不会出现乱码现象。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。