e3b096e732c1955374f1fd4790652cde1148cfec
OceanBase \346\225\260\346\215\256\345\272\223\344\275\277\347\224\250\346\214\207\345\215\227.md
| ... | ... | @@ -3,18 +3,23 @@ |
| 3 | 3 | ## 1. OceanBase 与 MySQL 兼容性总结及 JDBC 配置指南 |
| 4 | 4 | |
| 5 | 5 | ### 1.1 兼容性概述 |
| 6 | + |
|
| 6 | 7 | OceanBase 数据库在以下方面高度兼容 MySQL(接近 100%): |
| 8 | + |
|
| 7 | 9 | - SQL 语法 |
| 8 | 10 | - 数据读取和写入 |
| 9 | 11 | - 事务处理机制 |
| 10 | 12 | - 系统表结构 |
| 11 | 13 | |
| 12 | 14 | ### 1.2 JDBC 连接配置调整 |
| 15 | + |
|
| 13 | 16 | 从 MySQL 迁移到 OceanBase 时,需要修改 `dbcp.properties` 的 JDBC 连接 URL,添加以下两个关键参数: |
| 17 | + |
|
| 14 | 18 | - `rewriteBatchedStatements=TRUE` |
| 15 | 19 | - `allowMultiQueries=TRUE` |
| 16 | 20 | |
| 17 | 21 | **MySQL 模式下的 JDBC 参数配置建议:** |
| 22 | + |
|
| 18 | 23 | ```plaintext |
| 19 | 24 | url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?rewriteBatchedStatements=TRUE&allowMultiQueries=TRUE&useLocalSessionState=TRUE&useUnicode=TRUE&characterEncoding=utf-8&socketTimeout=3000000&connectTimeout=60000&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true |
| 20 | 25 | ``` |
| ... | ... | @@ -25,6 +30,7 @@ url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?rewriteBatchedStatements=TRUE&allowMu |
| 25 | 30 | **特例说明**:开启 `rewriteBatchedStatements` 后,对于多条 multi queries 插入语句(无论使用文本协议或 PS 协议),JDBC 驱动会将其改写为一条 Multi Values Insert 语句。 |
| 26 | 31 | |
| 27 | 32 | **参考文档**: |
| 33 | + |
|
| 28 | 34 | - [JDBC 配置示例](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013674) |
| 29 | 35 | - [数据库 URL-V2.4.13-OceanBase JDBC 驱动程序文档](https://www.oceanbase.com/docs/common-oceanbase-connector-j-cn-1000000001506761) |
| 30 | 36 | - [配置 JDBC 和 OBServer 实现 Batch DML 最佳性能的最佳实践](https://www.oceanbase.com/docs/common-best-practices-1000000001489651) |
| ... | ... | @@ -32,7 +38,9 @@ url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?rewriteBatchedStatements=TRUE&allowMu |
| 32 | 38 | --- |
| 33 | 39 | |
| 34 | 40 | ## 2. OceanBase 概述 |
| 41 | + |
|
| 35 | 42 | OceanBase 数据库是一款完全自研的企业级原生分布式数据库,具有以下特性: |
| 43 | + |
|
| 36 | 44 | - 在普通硬件上实现金融级高可用 |
| 37 | 45 | - 首创“三地五中心”城市级故障自动无损容灾新标准 |
| 38 | 46 | - 单集群规模超过 1500 节点 |
| ... | ... | @@ -43,7 +51,9 @@ OceanBase 数据库是一款完全自研的企业级原生分布式数据库, |
| 43 | 51 | --- |
| 44 | 52 | |
| 45 | 53 | ## 3. 与 MySQL 兼容性对比 |
| 54 | + |
|
| 46 | 55 | OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和语法。由于产品架构不同,或者客户需求不大,有些功能并没有被支持。以下是 OceanBase 数据库的 MySQL 模式与原生 MySQL 数据库的不同之处: |
| 56 | + |
|
| 47 | 57 | - 数据类型 |
| 48 | 58 | - SQL 语法 |
| 49 | 59 | - 过程性语言 |
| ... | ... | @@ -57,6 +67,7 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 57 | 67 | - 优化器 |
| 58 | 68 | |
| 59 | 69 | **数据类型**: |
| 70 | + |
|
| 60 | 71 | - 数值类型:`BOOL`/`BOOLEAN`/`TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT`、`DECIMAL`、`NUMERIC`、`FLOAT`、`DOUBLE`、`BIT` |
| 61 | 72 | - 日期时间类型:`DATETIME`、`TIMESTAMP`、`DATE`、`TIME`、`YEAR` |
| 62 | 73 | - 字符类型:`CHAR`、`VARCHAR`、`BINARY`、`VARBINARY` |
| ... | ... | @@ -68,11 +79,13 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 68 | 79 | ## 4. MySQL 模式使用限制 |
| 69 | 80 | |
| 70 | 81 | ### 4.1 集群名长度限制 |
| 82 | + |
|
| 71 | 83 | | 数据项 | 最大长度 | |
| 72 | 84 | | ------ | -------- | |
| 73 | 85 | | 集群名 | 128 字节 | |
| 74 | 86 | |
| 75 | 87 | ### 4.2 标识符长度限制 |
| 88 | + |
|
| 76 | 89 | | 数据项 | 最大长度 | |
| 77 | 90 | | -------- | -------- | |
| 78 | 91 | | 用户名 | 64 字节 | |
| ... | ... | @@ -86,6 +99,7 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 86 | 99 | | 表组名 | 127 字节 | |
| 87 | 100 | |
| 88 | 101 | ### 4.3 单个表的限制 |
| 102 | + |
|
| 89 | 103 | | 类型 | 最大限制 | |
| 90 | 104 | | ---------- | ------------------------------------------------------------ | |
| 91 | 105 | | 行长度 | 1.5M 字节 | |
| ... | ... | @@ -98,11 +112,13 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 98 | 112 | | 分区个数 | Oracle 模式:65536 个,MySQL 模式:8192 个(从 V4.2.1 BP3 版本开始,MySQL 模式下单个表允许的最大分区数由租户级配置项 `max_partition_num` 控制,默认为 8192 个) | |
| 99 | 113 | |
| 100 | 114 | ### 4.4 单列的限制 |
| 115 | + |
|
| 101 | 116 | | 类型 | 最大限制 | |
| 102 | 117 | | -------------- | -------- | |
| 103 | 118 | | 索引单个列长度 | 16K | |
| 104 | 119 | |
| 105 | 120 | ### 4.5 字符串类型限制 |
| 121 | + |
|
| 106 | 122 | | 类型 | 最大长度 | |
| 107 | 123 | | ------------ | -------------- | |
| 108 | 124 | | `CHAR` | 256 字符 | |
| ... | ... | @@ -121,29 +137,21 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 121 | 137 | --- |
| 122 | 138 | |
| 123 | 139 | ## 5. 创建索引 |
| 140 | + |
|
| 124 | 141 | **参考文档**:[创建索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013233) |
| 125 | 142 | |
| 126 | -### 5.1 索引简介 |
|
| 127 | -索引也叫二级索引,是一种可选的表结构。OceanBase 数据库采用聚集索引表模型,系统会自动生成主键索引,用户创建的其他索引为二级索引。可以根据业务需求在字段上创建索引,以加快查询速度。 |
|
| 143 | +### 5.1 创建索引的限制 |
|
| 128 | 144 | |
| 129 | -### 5.2 创建索引的限制 |
|
| 130 | 145 | - 索引名称必须在数据库范围内唯一,长度不能超过 64 字节。 |
| 131 | 146 | - 唯一索引的列值必须保持唯一,局部唯一索引必须包含表的分区函数中的所有列。 |
| 132 | 147 | - 全局索引的分区规则不一定需要与表的分区规则完全相同。 |
| 133 | 148 | |
| 134 | -### 5.3 创建索引的建议 |
|
| 135 | -- 使用简洁的名称描述索引所涵盖的列和用途,例如 `idx_customer_name`。 |
|
| 136 | -- 如果全局索引的分区规则和主表的分区规则相同且分区数相同,建议创建局部索引。 |
|
| 137 | -- 并行下发创建索引的 SQL 语句条数,不要超过租户 Unit 规格中的核数上限。例如,租户的 Unit 规格为 4 核(4C),则建议并发创建索引不超过 4 条。 |
|
| 138 | -- 对经常更新的表要避免对其进行过多的索引,对经常用于查询的字段应该创建索引。 |
|
| 139 | -- 数据量小的表建议不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。 |
|
| 140 | -- 当修改性能远远大于检索性能时,不建议创建索引。 |
|
| 141 | -- 创建高效索引。 |
|
| 142 | - |
|
| 143 | 149 | --- |
| 144 | 150 | |
| 145 | 151 | ## 6. 数据写入 |
| 152 | + |
|
| 146 | 153 | **参考文档**: |
| 154 | + |
|
| 147 | 155 | - [插入数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013243) |
| 148 | 156 | - [更新数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013240) |
| 149 | 157 | - [删除数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013244) |
| ... | ... | @@ -152,7 +160,9 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 152 | 160 | --- |
| 153 | 161 | |
| 154 | 162 | ## 7. 数据读取 |
| 163 | + |
|
| 155 | 164 | **参考文档**: |
| 165 | + |
|
| 156 | 166 | - [单表查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013225) |
| 157 | 167 | - [多表关联查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013650) |
| 158 | 168 | - [在查询中使用操作符和函数](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013225) |
| ... | ... | @@ -160,15 +170,18 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 160 | 170 | --- |
| 161 | 171 | |
| 162 | 172 | ## 8. 事务 |
| 173 | + |
|
| 163 | 174 | 事务机制和 MySQL 一样,完全兼容 MySQL。 |
| 164 | 175 | |
| 165 | 176 | **事务控制语句**: |
| 177 | + |
|
| 166 | 178 | - [BEGIN](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013247):显式开启一个事务。 |
| 167 | 179 | - [SAVEPOINT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013673):在事务过程中标记一个“保存点”。 |
| 168 | 180 | - [COMMIT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013246):提交并结束当前事务。 |
| 169 | 181 | - [ROLLBACK](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013245):回滚整个事务或回滚到某个保存点。 |
| 170 | 182 | |
| 171 | 183 | **相关文档**: |
| 184 | + |
|
| 172 | 185 | - [开启事务](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013247) |
| 173 | 186 | - [事务保存点](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013673) |
| 174 | 187 | - [提交事务](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013246) |
| ... | ... | @@ -177,9 +190,11 @@ OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和 |
| 177 | 190 | --- |
| 178 | 191 | |
| 179 | 192 | ## 9. 租户管理 |
| 193 | + |
|
| 180 | 194 | OceanBase 数据库采用了多租户架构。集群是 Zone 和节点的集合,租户则是资源层面的逻辑概念,通过资源池与资源关联。 |
| 181 | 195 | |
| 182 | 196 | **相关文档**: |
| 197 | + |
|
| 183 | 198 | - [租户介绍](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002012845) |
| 184 | 199 | - [租户容量](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002012845) |
| 185 | 200 | - [租户类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002012845) |
| ... | ... | @@ -190,7 +205,9 @@ OceanBase 数据库采用了多租户架构。集群是 Zone 和节点的集合 |
| 190 | 205 | --- |
| 191 | 206 | |
| 192 | 207 | ## 10. 批量操作配置 |
| 208 | + |
|
| 193 | 209 | **异常 SQL 示例**: |
| 210 | + |
|
| 194 | 211 | ```sql |
| 195 | 212 | SQL出错:DELETE FROM ui_file_seed WHERE id = 'mbm-mdm.master.mbm_mdm_wip_resource_template',异常信息:Not supported feature or function |
| 196 | 213 | 2025-03-27 14:52:05.083 [main] ERROR c.s.snest.engine.db.relationdb.RelationDBAccessor -数据源:main,批量执行SQL出错:DELETE FROM ui_file_seed WHERE id = 'mbm-mdm.master.whm_storage_location_template',异常信息:批量执行SQL出错 |
| ... | ... | @@ -201,11 +218,13 @@ SQL出错:DELETE FROM ui_file_seed WHERE id = 'mbm-mdm.master.mbm_mdm_wip_reso |
| 201 | 218 | **参考文档**:[JDBC 配置示例](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013674) |
| 202 | 219 | |
| 203 | 220 | **JDBC 连接示例**: |
| 221 | + |
|
| 204 | 222 | ```plaintext |
| 205 | 223 | url=jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test?rewriteBatchedStatements=TRUE&allowMultiQueries=TRUE&useLocalSessionState=TRUE&useUnicode=TRUE&characterEncoding=utf-8&socketTimeout=10000&connectTimeout=30000 |
| 206 | 224 | ``` |
| 207 | 225 | |
| 208 | 226 | **相关参数说明**: |
| 227 | + |
|
| 209 | 228 | - `rewriteBatchedStatements`:建议设置为 `TRUE`,以提高批量插入的性能。 |
| 210 | 229 | - `allowMultiQueries`:建议设置为 `TRUE`,允许使用分号连接的多语句文本格式。 |
| 211 | 230 | - `useLocalSessionState`:建议设置为 `TRUE`,避免频繁向 OB 数据库发送 session 变量查询 SQL。 |
| ... | ... | @@ -221,6 +240,7 @@ url=jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test?rewriteBatchedStatements=TRUE&all |
| 221 | 240 | --- |
| 222 | 241 | |
| 223 | 242 | ## 11. 数据类型转换规则 |
| 243 | + |
|
| 224 | 244 | 数据类型转换和 MySQL 一致。 |
| 225 | 245 | |
| 226 | 246 | --- |
| ... | ... | @@ -230,6 +250,7 @@ url=jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test?rewriteBatchedStatements=TRUE&all |
| 230 | 250 | **安装参考文档**:[Docker 部署 OceanBase](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494) |
| 231 | 251 | |
| 232 | 252 | **部署步骤**: |
| 253 | + |
|
| 233 | 254 | ```shell |
| 234 | 255 | sudo docker pull quay.io/oceanbase/oceanbase-ce |
| 235 | 256 | sudo docker run -p 2881:2881 --name oceanbase -e MODE=MINI -e OB_TENANT_PASSWORD=Passw0rd -d quay.io/oceanbase/oceanbase-ce |
| ... | ... | @@ -250,4 +271,3 @@ CREATE DATABASE snest_changwen DEFAULT CHARACTER SET utf8mb4 READ WRITE; |
| 250 | 271 | show databases; |
| 251 | 272 | ``` |
| 252 | 273 | |
| 253 | - |