Austindatabases公众号已经开启了,AI 文章分析,AI 文章问答,比如你想知道AustinDatabases 里面,说了多少种数据库,那些是讲 MySQL,那些是PostgreSQL, 那些是OB ,POLARDB ,MongoDB ,SQL Server, 阿里云的,问他他会列出来,同时如果有问题不明白,可以将文章的文字粘贴到公众号提供的专用AI ,公众号将通过众多文章(目前1300多篇)来进行尝试性的解释。使用方法,直接到微信公众号中点击服务,选择AI问答。如下示例
一直提到框架学习法,其中主体的思想就是如何快速的学习某项数据库产品的知识。其中框架学习法里面有一条系统学习,系统学习是在给学习的知识搭建“骨架”,所以从这期起,开始搭建OceanBase学习的骨架。今年要和“申公豹”一样修炼岂可怠慢。
修炼岂可怠慢
今天开始学习第5章OBCA 应用开发,本期学习的是应用开发,此为上半部分
OceanBase 数据库常见的客户端工具有三种:
1 MyClient 的客户端工具:如果你使用的是 MySQL 租户,就可以使用 MyCircle 的客户端去连接。MySQL 客户端工具的运行参数中,参数 -h 后指定数据库的 IP 地址,参数 -u 后指定数据库的用户名(包括用户名、租户名和集群名),大写的参数 -P 后指定数据库的端口号(一般指定 2883 端口,它是 OB Proxy 的端口),小写的参数 -p 后指定对应用户的密码,参数 -D 后指定对应的数据库名称。
2 OB client 客户端工具:如果你的租户类型是 MySQL 租户或 Oracle 租户,就可以使用 OB client 的工具去连接。OB client 这个命令行工具与 MySQL 命令行工具写法是一样的。需要注意的是,MyCircle 客户端只能连接 MySQL 的租户,而 OB client 支持连接 MySQL 和 Oracle 两种租户。
3 ODC 图形化工具:ODC (OceanBase Developer Center) 是 OceanBase 打造的一个企业级的数据库开发平台。它支持个人 PC 桌面版本和 Web 版,并且支持连接 MySQL 租户和 Oracle 租户。
桌面版 ODC:安装比较简单,下载安装包安装完成后创建数据源连接即可进行数据库开发。
Web 版 ODC:安装稍微复杂一点,分为 6 个步骤,其中 ODC 软件的安装可以通过 OATT 自动化部署工具完成。Web 版 ODC 对服务器有配置要求,例如以 20 个 ODC 用户为例,要求服务器最少 2C4G 的配置。
安装成功后,通过浏览器输入 ODC 服务器的 IP 地址以及端口号 8989 即可正常访问。登录 ODC 后,第一步需要创建数据源,配置要连接的数据库。创建好数据源后,选择需要进行 SQL 开发的数据源,在 SQL 编辑窗口中输入 SQL 语句进行数据库开发。
OceanBase 还提供了对 Java、C、Python这三种常用开发语言的支持。
Java 驱动 (JDBC) 和 C 驱动程序支持 MySQL 租户和 Oracle 租户两种类型。要使用 Java 进行数据库开发,首先需要去官方网站下载对应版本的 JDBC 驱动,并在 Java 工程中导入 JDBC 的驱动包。编写 Java 程序时,需要在程序中加载 JDBC 的驱动程序,数据库的 JDBC 连接串需要按照指定的格式编写,包括 OceanBase 关键字、IP 地址和数据库端口号 (2883)、数据库名称、用户名和密码。
Python 驱动目前只支持连接 MySQL 租户。
这里注意如果是开源的OB,可以通过MySQL的客户端来进行连接,注意端口号是 2883 默认的情况。同时也要注意ODC桌面的WEB部署的方式,个人空间和团队空间之间的区别
在部署完ODC后,通过浏览器可以访问 http://IP:8989 端口访问OB的开发中心。
ODC主要有以下几个区域: SQL 开发窗口
SQL 编辑区域:SQL 编辑区域中可编辑和执行 SQL 语句。
执行记录页签:可以查看当前连接进程中每次执行 SQL 语句的记录。
日志页签:日志页签中可查看当前 SQL 窗口的执行记录。
结果页签:结果页签中可查看当前 SQL 语句的执行结果。
在JAVA 驱动部分是与应用与数据库沟通的关键,也是应用驱动数据库的关键,这里OB的JAVA支持的租户类型:Java 驱动 (JDBC) 程序支持 MySQL 租户和 Oracle 租户两种类型。我们在官网上下载对应的JDBC版本,升级了OB后可以查看JDBC是否需要进行升级使用更新的功能。
集成到开发环境:在进行开发时,如果使用的是 Eclipse 或其他 IDE 开发工具,需要在 Java 工程中导入 JDBC 的驱动包。
加载驱动程序:在编写 Java 程序时,需要在程序中加载 JDBC 的驱动程序。数据库的 JDBC 连接串需要按照特定的格式编写。其写法以 JDBC: 开头,后面是 OceanBase 关键字,然后是数据库的 IP 地址和端口号 (2883),接着是数据库的名称,最后是 User(用户名)和 Password(密码)。
一个示例如 JDBC冒号后面是OB关键字,然后下一部分是IP地址和数据库端口号2883,接下来是数据库的名称,User是用户名,Password是密码。
程序执行:程序创建好之后,可以通过 Java 命令去执行该程序。
C语言的驱动程序也支持MySQL和Oracle租户两种类型,使用C语言进行OceanBase数据开发,需要安装OB Client的软件包。
首先我们遇到的第一个知识点就是租户的概念:
理解租户类型和兼容模式是我们要做的第一个功课,OceanBase 支持多种租户类型,最主要的是 MySQL 租户和 Oracle 租户。你需要根据你的应用场景和迁移需求选择合适的租户类型。例如,如果你的原有系统是 MySQL 数据库,迁移到 OceanBase 时通常会选择 MySQL 租户类型,社区版 OceanBase 只支持创建 MySQL 兼容模式的租户。
同时在资源规划与分配中在设计租户时,你需要根据业务量和性能需求规划租户所需的CPU、内存和磁盘空间等资源。OceanBase 企业版和社区版对最小配置有不同的建议,而且需要考虑 OCP 等组件以及操作系统预留内存。了解如何通过资源规格定义和调整租户资源是必要的,此外,OceanBase 提供了租户级别的资源隔离,确保不同租户之间的资源互不影响。
在MySQL的租户设计中,OceanBase 的 MySQL 租户兼容 MySQL 5.7 和 8.0 版本的绝大部分功能和语法,包括数据类型、过程性语言、函数、触发器以及其他常见功能。这样可以确保你现有的 MySQL 应用程序能够平滑地迁移至 OceanBase 数据库,原有系统的表结构、索引、视图等对象基本上无需改造。
在 MySQL 租户下进行表结构设计时,也需要结合 OceanBase 的特性。对于数据量比较大的表,可以设计成 分区表。MySQL 租户支持多种分区类型,包括 Range 分区、List 分区、Hash 分区、Key 分区以及 Range Columns List Columns 和组合分区。你需要根据数据的特点选择合适的分区类型,并选择区分度较大的列作为分区键。 在索引设计方面,OceanBase 在 MySQL 模式下默认创建的是局部索引。局部索引是针对单个分区上的数据所创建的索引。如果你需要在索引上保证全局唯一性,那么需要在索引列上添加表的分区列。 最后,从 4.2.0 版本之后,OceanBase 提供了 表组 功能,并且在表组的属性上有了很大的改进。你可以将需要进行关联查询的分区表指定到同一个表组中。OceanBase 在调度时会将同号的分区调度到同一个主机上,这样在进行关联查询时,数据就在同一个 OBServer 上,避免了跨机器的访问,从而提升 SQL 语句的查询性能。在创建表组之前,需要根据表的关联性和查询意图,将相关的表放在同一个表组中。
Oracle 租户在数据类型、SQL 功能和数据库对象等基本功能上与 Oracle 数据库兼容。OceanBase 的 Oracle 客户在过程化程序语言方面也已经基本能够兼容全部的研发功能。此外,在数据库安全、备份恢复、高可用和优化器等高级特性上,OceanBase 数据库的兼容性也非常好,甚至在某些特性上还要优于 Oracle 数据库。 在租户设计 时,如果您以前使用的是 Oracle 数据库,现在迁移到 OceanBase 集群,那么就需要选择 Oracle 的租户类型。这样做是为了可以平滑迁移您的生产系统。原有系统的表结构、索引、视图等对象在基本功能上无需进行大的改造
在我们对迁移到OB的数据库中的租户设计的原则有什么,也是我们需要注意的 在 OceanBase 中,租户的设计是一个至关重要的环节,它会直接影响到数据库的性能、可维护性和未来的扩展性。根据您提供的资料和我们的对话历史,租户设计的重点主要包括以下几个方面:
选择合适的租户类型 (选择合适的租户):
这是首要考虑的因素。您需要根据原有的数据库系统类型来选择 OceanBase 的租户类型,例如,如果原系统是 MySQL 数据库,则应选择 MySQL 租户类型。如果原系统是 Oracle 数据库,则应选择 Oracle 租户类型。
选择正确的租户类型能够最大程度地保证兼容性,使得原有的应用程序和数据库对象(如表结构、索引、视图等)能够平滑迁移,无需或只需少量改造。OceanBase 的 MySQL 租户兼容 MySQL 5.7 和 8.0 的绝大部分功能和语法,而 Oracle 租户在数据类型、SQL 功能和数据库对象等基本功能上与 Oracle 数据库兼容,并且在过程化程序语言和高级特性上也具备良好的兼容性。
这里有几个需要注意的部分:
1 租户类型一旦创建后就无法修改
2 租户类型一旦创建后就无法修改,创建租户后,需要根据具体的业务特点进行资源规划和优化,以保证性能和稳定性,针对不同业务特点的资源规划。
大量写入业务 (High Write Volume): 需要设置较大的内存和日志盘规格,以满足高并发写入的需求。
大量消耗 CPU 资源的业务 (High CPU Consumption): 需要将租户错落分布于不同的节点,以避免单个节点负载不均衡,甚至造成热点节点并影响业务 。这可以通过合理的 PZ (Partition Zone) 设计来实现。 租户的设计是使用 OceanBase 的关键步骤。在创建租户之前,务必根据业务的兼容性需求选择合适的租户类型(MySQL 或 Oracle)。创建租户后,需要根据业务的写入量和 CPU 消耗情况进行合理的资源规划和节点分布。对于从传统数据库迁移的业务,可以先采用单 Unit 的对等架构以保证平滑迁移,当业务量增长超出单机能力时,再考虑扩展为多 Unit 租户,并进行合理的数据分片设计以最小化分布式事务的影响,充分利用 OceanBase 的水平扩展能力。
创建数据表 (Creating Tables) 在 OceanBase 的 MySQL 租户下进行应用开发时,创建数据表是至关重要的步骤 。这与传统的 MySQL 数据库类似,但需要考虑 OceanBase 分布式数据库的特性。
基本流程:
1. 根据业务系统进行建模,识别实体及其关系,绘制 ER 图。
2. 将 ER 模型转换为逻辑模型,选择合适的属性,处理一对多、多对多关系 (例如,通过创建中间表)。
3. 将逻辑模型转化为物理模型,需要结合 OceanBase 数据库的特性,例如是否需要分区。
创建表的原则和建议:
选择合适的列类型:例如日期类型使用 DATE 或 TIMESTAMP,可变长度字符串使用 VARCHAR,整数类型使用 INT。
定义主键 (Primary Key):用于唯一标识表中的每一行数据,例如学生表的学生 ID 。主键具有非空、唯一和全局唯一的特性。在 OceanBase 中,数据表是以主键有序存储的 。
定义非空约束 (NOT NULL Constraint):确保某些列不允许为空值,例如学生的姓名。
考虑唯一性约束 (UNIQUE Constraint):保证表内索引面上不存在两行完全相同的值,NULL 值也会存储在唯一索引中。
创建表的语法:
基本的 CREATE TABLE 语句与 MySQL 类似,例如:
分区表 (Partitioned Tables)对于数据量比较大的表,为了利用 OceanBase 分布式数据库的性能,需要将表进行分区。OceanBase 的 MySQL 租户支持多种分区类型:
Range 分区:按范围分区,例如按日期字段按月或天分区。
List 分区:为每个分区键指定一组离散的值,例如按省份字段分区。
Hash 分区:通过哈希函数将数据打散。
Key 分区:类似于哈希分区 。
Range Columns/List Columns 分区:支持非整形数据类型进行 Range 和 List 分区。
组合分区:将多种分区方式组合使用
创建分区表的语法是在 CREATE TABLE 语句后添加 PARTITION BY 子句,指定分区字段和分区类型 :
分区键的选择需要考虑区分度,Range 分区通常选择具有明显范围特征的字段(如时间)。
表组 (Table Groups):
为了解决跨机器关联查询的性能问题,OceanBase 提供了表组功能。
可以将具有相同分区号的数据(例如,学生表和选课表的 P0 分区)调度到同一台主机上,避免跨机器访问。
创建表时可以通过 TABLEGROUP 属性将其指定到一个表组: 二、删除数据表 (Deleting Tables)
使用 DROP TABLE 语句删除已存在的数据表: 三、查看数据表定义 (Viewing Table Definitions)
使用SHOWCREATE TABLE语句查看表的创建语句 :
使用 SHOW TABLES FROM database_name 语句查看指定数据库中的所有表: 四、数据操作语言 (DML) - 读写数据 OceanBase 的 MySQL 租户支持标准的 DML 语句来操作表中的数据:
插入数据 (INSERT):向表中插入新的数据行。可以插入单行或多行数据。
更新数据 (UPDATE):修改表中已存在的记录。
删除数据 (DELETE):删除表中的记录。可以使用 WHERE 子句指定删除条件。
查询数据 (SELECT):从表中检索数据。支持单表查询、多表关联查询 (内连接 INNER JOIN、左外连接 LEFT JOIN、右外连接 RIGHT JOIN、全外连接 FULL JOIN) 以及按分区查询。
五、索引 (Indexes)
为了提高数据库查询性能,可以在表的某些列上创建索引。OceanBase 的 MySQL 租户支持多种索引类型,包括 B-树索引、唯一索引和二级索引等、。对于分区表,索引可以分为局部索引和全局索引 、。创建索引时需要注意覆盖索引、等值优先等原则,并避免对频繁更新的列进行索引、。创建索引的语法与标准 MySQL 类似,可以使用 LOCAL 或 GLOBAL 关键字指定索引类型。
![
关于表组的概念实际上是OB的一个在分布式数据库上的进步,这样在进行表join的情况下,就能安排在多表查询的时候,这些数据尽量在一个物理的数据存储中。
创建表组的语法如下: CREATE TABLE GROUP TBL1; -- 这里的 TBL1 是表组的名称 然后,在创建学生表和选课表时,通过 TABLEGROUP 属性将它们指定到刚刚创建的表组 TBL1: CREATE TABLE student ( sid INT PRIMARY KEY, -- 其他列 ) TABLEGROUP = TBL1;
CREATE TABLE course_selection ( sid INT, cid INT, -- 其他列 ) TABLEGROUP = TBL1;
在这个案例中,当 OceanBase 调度数据时,会将学生表和选课表中具有相同分区号的数据调度到同一个主机上。例如,学生表的 P0 分区和选课表的 P0 分区会被调度到同一台 OBServer 上。 表组产生的原因和解决的问题 表组的产生主要是为了解决在 OceanBase 分布式数据库中,跨机器进行关联查询时可能出现的性能问题。
产生的原因:
OceanBase 是一个分布式数据库,数据表可以进行分区,将数据分散存储在不同的物理节点上。
当需要关联查询两个或多个已分区的表时,如果关联条件涉及到的数据分布在不同的主机上,数据库需要将一台主机上的数据发送到另一台主机上进行关联,这会引起跨机器的网络访问 (RPC 调用),导致查询性能下降。
例如,在资料中描述了一个场景:学生表和选课表都进行了分区(哈希分区,分为 6 个分区)。当需要查询某个学生的选课记录时,即使两个表都存在相同分区号 (如 P0) 的数据,但这些 P0 分区的数据可能分布在不同的 OBServer 上。此时,关联查询就需要跨机器进行,影响性能。
解决的问题:
通过将相关的表指定到同一个表组,OceanBase 在调度时会尽量将这些表中具有相同分区号的数据调度到相同的物理主机上。这样一来,当对这些表进行关联查询时,需要关联的数据更有可能位于同一台主机上,避免了跨机器的数据传输,从而提高了 SQL 语句的查询性能。
在的案例中,将学生表和选课表加入到同一个表组后,当查询某个学生的选课记录时,如果学生信息和对应的选课记录(例如,都属于 P0 分区)被调度到了同一个 OBServer 上,那么关联操作就在本地完成,无需跨机器访问,提升了查询效率。
总而言之,表组是为了在 OceanBase 的分布式环境下优化关联查询性能而引入的一种机制,它通过将相关表中具有相同分区的数据尽量存放在同一物理节点上来减少跨机器的数据交互。
从OB4.2开始,表组没有了分区的概念,这里只需要定义SHARDING属性,就可以灵活的将不同的分区方式的表加入。
总结:在本次的学习中,我已经获得一些在OB数据库运维中的新思路
1 处理OB 的迁移中,我需要更多的与业务贴近,那些表应该在一个分组提高性能是DBA需要进行努力的工作
2 对于表的操作的方式要有更深的理解,那些表是更新插入频繁的表,那些不是,这写都与表在OB的呈现的方式有关。
如果最近有金融改造迁移到OceanBase的需求,可以看这本书,希望能对你有所帮助。追逐太阳的男人--林春 《金融数据库转型实战》
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!