#文章首发挑战赛#
前面介绍了 OceanBase 按需选择的各种部署方案,本文接着把后半部完成。
1. 监控与管理工具
先来看一下 oceanbase 自带的服务和性能监控工具 grafana 和 prometheus,前一篇我们已经完成了它们的安装,并已启动。
1.1. Grafana
前文提到 Grafana 是一款开源的数据可视化工具,可以将数据源中的各种指标数据进行可视化展示,以便更直观地了解系统运行状态和性能指标。这里也简单的跑起来看看。
不过在这之前,先做个实验,试试把虚拟机的内存从 10G 调低到 8G 是否可行。修改之后重启服务,结果报错:内存不足,没辙只好重新改回 10G。
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/6a3a6d8b51064b4ab9c6d716358b6424.jpg)
RAM 8G
回到 grafana 的使用吧,在服务启动过程中可以看到 grafana 服务的地址和初始账号信息:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/08921e85f5024e92a9d25fb972d8da8f.jpg)
grafana url
不过要在浏览器中打开,还需要开放端口:
[root@localhost ~]# firewall-cmd --permanent --add-port=3000/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
这时就可以在浏览器中输入 URL,按提示输入用户名密码,就可以看到服务器的性能指标了:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/8d7798f4d71a423d95c1a758017870b2.jpg)
grafana
看起来还是不错的
1.2. Prometheus
再来看 Prometheus,它是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型以及快捷数据采集、存储和查询接口。同样在启动过程中会输出该服务的相关信息:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/83d556070a7f4b88940cb8125bac675b.jpg)
prometheus service
类似的,也要先开放端口:
[root@localhost ~]# firewall-cmd --permanent --add-port=9090/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
然后在浏览器输入 URL 打开。Alerts 页面用来查看异常情况:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/317c83c9de80481bbbca2d33700d784e.jpg)
prometheus – alerts
Status 下面的 Rules 页面,可以看到超出规则指标的警告:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/7ffb7f37fed946f48907d4528c0fb60f.jpg)
prometheus – rules
2. 数据库规划
- 单机最小化集群:demo (前文已完成)
- 系统租户:sys (随集群自动创建)
- root 用户密码:123456789(密码待修改)
- 连接命令:obclient -h127.0.0.1 -P2881 -uroot@sys -p -Doceanbase -A
- 业务租户:obmysql(待创建)
- root 用户密码:123456(待创建)
- 连接命令:obclient -h127.0.0.1 -uroot@obmysql -P2881 -p123456 -A
- 业务数据库:mydb(待创建)
- user 表(待创建)
2.1. 修改系统租户的密码
系统租户 sys 的 root 用户的默认密码为空,这里把它修改为 123456789。
# admin 账号登录 linux,执行如下命令
[admin@localhost ~] obd cluster edit-config demo
# 在 oceanbase-ce/global的最后增加一行:
# root_password: 123456789,如下图
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/c118bf42ddb749be972bba0717080d81.jpg)
sys – root – password
# 使修改生效
[admin@localhost ~] obd cluster reload demo
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/50ed6049f3ef4707bdf65488edcc7849.jpg)
reload cluster
分别采用无密码和新密码来连接,验证密码设置成功:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/561e19cb1ec942df81317a047deea32c.jpg)
密码设置成功
2.2. 创建租户 obmysql(数据库实例)
在 OceanBase 中,数据是按照租户来组织的,所以第一应创建一个租户实例(数据库实例)。创建之前,应该先了解一下租户类型:
- 系统租户:集群默认创建的租户,与集群生命期一致,负责管理集群和所有租户的生命周期。系统租户数据是集群私有的,不支持物理备份恢复。
- 用户租户:用户租户是由用户创建的租户,对外提供完整的数据库功能,支持 MySQL 和 Oracle 两种兼容模式。
- Meta 租户:Meta 租户是 OceanBase 数据库内部自管理的租户,每创建一个用户租户会创建一个对应的 Meta 租户,其生命周期与用户租户保持一致。Meta 租户用于存储和管理用户租户的租户私有数据,这部分数据不需要跨库物理同步以及物理备份恢复。Meta 租户不可登录,普通用户只能通过系统租户的视图查询 Meta 租户下的数据。
部署 OceanBase 之后,提议创建用户租户进行业务操作。sys 租户仅做集群管理使用,不适合在业务场景中使用。租户创建后,租户类型无法修改,因此创建租户前请规划好租户类型。本文选择 MySQL 租户类型。
2.2.1. 创建方法一
使用 obd 工具,用法如下:
# 语法:obd cluster tenant create <deploy name> [-n <tenant name>] [flags]
# -n tenant_name
# --max-iops Max IOPS unit nuber
# --unit-num pool unit nuber
obd cluster tenant create demo -n obmysql --max-cpu=2 --memory-size=2G --log-disk-size=3G --max-iops=10000 --iops-weight=2 --unit-num=1 --charset=utf8mb4
租户创建成功后,默认管理员用户(MySQL 模式为 root,Oracle 模式为 sys)的密码为空。
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
Enter password:
Welcome to the OceanBase. Commands end with ; or g.
Your OceanBase connection id is 3221494035
Server version: OceanBase_CE 4.2.1.2 (r102000042023120514-ccdde7d34de421336c5362483d64bf2b73348bd4) (Built Dec 5 2023 14:34:01)
Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
查看租户信息,如上使用 obclient 工具连接新创建的租户后,使用下面 SQL 语句查询:
obclient [oceanbase]> select * from __all_unit_config;
obclient [oceanbase]> select * from dba_ob_tenants;
obclient [oceanbase]> show tenant;
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/3d5ebd3afcb74291b9fe3dca769ac398.jpg)
查看租户
修改允许任意主机登录,默认只能从本机登录。
# 使用租户 obmysql 的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
# 修改允许任意主机登录
obclient [oceanbase]> alter tenant obmysql set variables ob_tcp_invited_nodes='%';
看到这里是不是有种强烈的熟悉感,没错和 MySQL 一样的操作。后面就可以把 obmysql 当作 MySQL Server 来看待。
修改租户的 root 用户密码:
# 查看当前租户
obclient [oceanbase]> show tenant;
# 修改当前租户的 root 用户的密码
obclient [oceanbase]> alter user root identified by '123456';
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/022ccdd7d4ec465fb61a6a04f3d4da62.jpg)
修改租户 root 用户密码
2.2.2. 创建方法二
使用系统租户 sys,连接到 OceanBase 服务器,执行 SQL 命令来创建一个用户租户。
- 步骤一:创建资源规格
# 使用 sys 租户的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -P2881 -uroot@sys -p123456789 -A
# 选择 oceanbase 数据库
obclient [(none)]> use oceanbase;
# 通过 DBA_OB_UNIT_CONFIGS 视图,获取已有的资源规格信息
obclient [oceanbase]> select * from dba_ob_unit_configs;
# 创建资源规格
CREATE RESOURCE UNIT dbmysql2_unit_config MEMORY_SIZE = '2G', MAX_CPU = 1, MIN_CPU = 1, LOG_DISK_SIZE = '2G', MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;
# 查看资源规格是否创建成功
obclient [oceanbase]> SELECT * FROM DBA_OB_UNIT_CONFIGS WHERE NAME = 'dbmysql2_unit_config';
- 步骤二:创建资源池
# CREATE RESOURCE POOL dbmysql2_pool UNIT='dbmysql2_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1','zone2');
CREATE RESOURCE POOL dbmysql2_pool UNIT='dbmysql2_unit_config', UNIT_NUM=1;
# 查询 DBA_OB_RESOURCE_POOLS 视图,确认资源池创建成功
obclient [oceanbase]> SELECT * FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'dbmysql2_pool';
- 步骤三:创建租户
# 创建租户
# CREATE TENANT IF NOT EXISTS dbmysql2 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('dbmysql2_pool'), charset='utf8mb4' set OB_TCP_INVITED_NODES='%';
CREATE TENANT IF NOT EXISTS dbmysql2 PRIMARY_ZONE='RANDOM', comment 'mysql tenant instance', RESOURCE_POOL_LIST=('dbmysql2_pool'), charset='utf8mb4' set OB_TCP_INVITED_NODES='%';
2.3. 连接租户 obmysql
使用新创建的租户的用户名和密码连接到 OceanBase 服务器。支持通过客户端、驱动或 ORM 框架连接到 OceanBase 数据库的租户。
# 使用租户 obmysql 的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2883 -p123456 -Doceanbase -A
2.4. 创建业务数据库 mydb 和 user 表
连接到相应的租户 obmysql(可以把它看作是 MySQL Server)后,就可以在其上创建自己的业务数据库了,可以创建许多个哦,和在 MySQL Server 上创建多个 DB 是一样一样的。
obclient> CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 READ WRITE;
obclient> SHOW DATABASES;
obclient> USE mydb;
obclient> CREATE TABLE user (seq INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), gender VARCHAR(20), birthday DATE);
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/f456a527c50e4849a9a7177b25b9bfa1.jpg)
创建业务数据库
查看是否创建成功:
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/0eac7f43362f44a69a21ffc7887fd5fb.jpg)
查看表
插入两条数据:
# 插入两行数据
obclient [mydb]> insert user(name, gender, birthday) values("张三", "男", "2000-01-01"),("李四", "女", "2008-02-02");
Query OK, 2 rows affected (0.038 sec)
Records: 2 Duplicates: 0 Warnings: 0
# 查看数据
obclient [mydb1]> select * from user;
3. SpringBoot3 + MyBatis + OceanBase 实现增删改查
这里不再从头开始,而是基于前面 SpringBoot3 + MyBatis + 达梦8 文章中的实现直接修改依赖,连接字符串,并微调 Mapper 接口即可实现。
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/9b9a4e65be5d45ec95c50e977a1c6c01.jpg)
OceanBase CRUD
3.1. 基于 dm8 的代码,修改驱动依赖,POM.xml
<!-- 把原来达梦的驱动换成 mysql 的驱动 -->
<!-- <dependency>-->
<!-- <groupId>com.dameng</groupId>-->
<!-- <artifactId>DmJdbcDriver18</artifactId>-->
<!-- <version>8.1.3.62</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
3.2. 基于 dm8 的代码实现,修改 application.yml 中的数据源配置
spring:
datasource:
#driver-class-name: dm.jdbc.driver.DmDriver
driver-class-name: com.mysql.cj.jdbc.Driver
#url: jdbc:dm://192.168.1.107:5236?schema=DEMO&genKeyNameCase=2&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=Asia/Shanghai
url: jdbc:mysql://192.168.1.105:2881/mydb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root@obmysql
password: '123456'
mybatis:
configuration:
mapUnderscoreToCamelCase: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.3. 修改 DAO(MyBtis Mapper 接口),去掉为了达梦大小写而加的引号
- 查
@Repository
public interface UserDao {
@Select("select * from user")
List<UserEntity> list();
...
}
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/685328ac85624bdaa28282a8dbf306b0.jpg)
查
- 改
@Repository
public interface UserDao {
... ...
@Update({
"<script>" +
"update user " +
"<set>" +
"<if test='name != null'>name=#{name},</if> " +
"<if test='birthday != null'>birthday=#{birthday},</if> " +
"<if test='gender != null'>gender=#{gender},</if> " +
"</set> " +
"where seq=#{seq}" +
"</script>"
})
int update(UserEntity product);
... ...
}
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/69dfdbadd237499492fe53cb05fa36f4.jpg)
改
- 删
@Repository
public interface UserDao {
...
@Delete("delete from user where seq= #{seq}")
int delete(Long seq);
...
}
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/c834bcb2d96a45988deabaa7319fe64c.jpg)
删
- 增
@Repository
public interface UserDao {
...
@Insert(
"insert into user (name, birthday, gender) values (#{name}, #{birthday, jdbcType=DATE}, #{gender})"
)
@Options(useGeneratedKeys = true, keyProperty = "seq", keyColumn = "seq")
int insert(UserEntity product);
...
}
![[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)](https://img.niaorui.com/blogimg/20251015/b01f808e57a1400e922e87119647b140.jpg)
增
全文完成,感谢阅读
收藏了,感谢分享