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