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 | - |