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