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
-