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