概述

OceanBase是一款通用的分布式关系型数据库,目前内部业务使用比较多有两个版本:1.4和2.1。OceanBase每个版本变化总能带给人很多惊喜,其中2.1版本实现了ORACLE很多特性的兼容。本文主要简单浏览一下这些新功能。

运维

账户管理

在ORACLE Mode的租户里,创建用户依然是create user命令,密码不用单引号。授权方式还是还是ORACLE和MySQL的结合。查看权限方式是MySQL的语法(这点还是MySQL语法很方便)。

在ORACLE Mode的租户里,不同用户就是不同SCHEMA,默认彼此数据访问权限隔离,除非明确授权访问。

$obclient -h11.***.84.84 -usys@tnt_oracle#obdemo -P2883 SYS -A -pobDBA2019

create user ora_user identified by 123456;
grant all privileges on ora_user.* to ora_user;
grant select on sys.* to ora_user;
show grants for ora_user;
select username, account_status, lock_date, expiry_date, created from dba_users;

实例变量查看

OceanBase集群级别的参数是通过查看和修改parameters,但是在Oracle租户里,租户级别的设置修改依然是通过类似修改MySQL的变量(variables)来的。这点跟Oracle原生实例不一样。

show global variables where variable_name in ('autocommit','ob_compatibility_mode','ob_enable_sql_audit','ob_query_timeout','ob_read_consistency','ob_tcp_invited_nodes','ob_trx_timeout','sql_mode','tx_isolation','system_time_zone','time_zone');

修改方法举例

set global autocommit=on;

性能分析

OceanBase实现了很多类似Oracle的AWR相关的GV$视图。不过大部分在业务租户下是没有权限查看的。业务租户下只提供了一个SQL全量日志视图。这个也够用了。详细用法参见《阿里数据库性能诊断的利器——SQL全量日志

select /*+ read_consistency(weak) query_timeout(1000000000) */ request_time, svr_Ip, trace_id, sid, client_ip, tenant_id,tenant_name,user_name,db_name, query_sql, affected_rows,ret_code, event, state, elapsed_time, execute_time, queue_time, decode_time, get_plan_time, block_cache_hit, bloom_filter_cache_Hit, block_index_cache_hit, disk_reads,retry_cnt,table_scan, memstore_read_row_count, ssstore_read_row_count, round(request_memory_used/1024/1024) req_mem_mbfrom gv$sql_audit where user_name in ('ora_user') and rownum<100order by request_time desc ;

开发

面向开发的功能主要就是DDLDML了。

DDL

建表

OceanBase的表是索引组织表(IOT),强烈建议设置主键,并且主键就是数据。

建表时支持的数据类型如下:

  • CHAR/VARCHAR2

  • DATE/TIMESTAMP/TIMESTAMP WITH TIME ZONE/TIMESTAMP WITH LOCAL TIME ZONE

  • INTERVAL(部分运算)

  • NUMBER(包括其子类型int等)

  • CLOB/BLOB(不超过48M)

建表示例:

$obclient -h11.***.84.84 -uora_user@tnt_oracle#obdemo -P2883 -A -p123456 ORA_USER
create table t01(
id number not null,
c1 char(10),
c2 varchar2(10),
c3 DATE default sysdate,
c4 timestamp default systimestamp,
c5 timestamp with time zone default localtimestamp,
c6 timestamp with local time zone default localtimestamp,
c7 int,
c8 clob,
c9 blob
); create sequence seq_t01 start with 1000000000 increment by 2 cache 100 ;
insert into t01(id, c1, c2, c7, c8)
values(seq_t01.nextval, 'test', 'test',99999999999,'clobtextclobtextclobtextclobtextclobtextclobtextclobtextclobtextclobtext');
select * from t01\G

支持通过CTAS方法从老表创建新表。

修改表结构

目前对修改表结构类型还有很多限制,如只能在同类类型中改大值域。如varchar扩大长度。

函数

目前支持ORACLE常用的函数。如时间函数、数值函数、字符串函数、类型转换函数、条件函数、系统函数、统计分析函数等等。

时间函数

目前支持:

  • interval

  • localtimestamp

  • current_timestamp

  • sysdate/systimestamp

select sysdate, sysdate + interval'1' minute next_min, sysdate + interval'1' hour next_hour, sysdate + interval'1' day next_day from dual;

数值函数

目前支持:

  • abs/sign

  • floor/'ceil`

  • trunc/mod

  • bitand

示例如下:

select abs(-3.1415926), ceil(3.1415926), floor(3.1415926), sign(-3.1415926),round(314 / 7, 0), mod(314,7), trunc(3.1415926) f
rom dual;

比较函数

目前支持:

  • least/greatest

字符串函数

目前支持:

  • pad/lpad/rpad

  • instr/substr

  • concat/||

  • length/lengthb

  • lower/upper

select lpad(3.14159, 10, '*') c1, rpad('Apple', 10, '<') c2, ltrim('   Hello') c3, rtrim('World!   ') c4, 'Hello ' || ' World' c5, concat('Hello ',' World!') c6, lower('Hello World!') c7, upper('Hello World!') c8, instr('Hello World','o',6) c9, substr('Hello World',5,3) c10, length('Hello 中国!') c11, lengthb('Hello 中国!') c12 from dual; 

类型转换函数

主要是数值、字符串、日期之间的互相转换
目前支持:

  • to_date/to_timestamp

  • to_char

  • to_number

示例如下:

select cast('3.1415926' as number), to_date('2019-05-23 14:00:00','yyyy-mm-dd hh24:mi:ss'), to_number('3.1415926'), to_char(3.1415926), to_timestamp(sysdate), to_timestamp_tz(sysdate) from dual;

条件函数

目前支持:

  • case...when...end

  • nvl

  • decode

drop table t02;
create table t02(id number not null , type varchar2(2), gmt_create date not null default sysdate);
insert into t02(id,type) values(1,'R'),(2,'B'),(3,NULL);commit;
select id, NVL(type,'NULL!') type, case type when 'R' then 'Good guy!' when 'B' then 'Bad guy!' else 'Unknown!' end type_desc,
decode(type,'R','Good guy!','B','Bad guy!','Unknown!') type_desc2, gmt_create
from t02;

系统函数

目前支持:

  • uid/user

select uid, user, userenv('schemaid'),SYS_CONTEXT('userenv','current_user') from dual;

select rownum rn,object_name, object_type from user_objects order by object_name;

分析函数

目前支持的聚合函数包括:

  • COUNT

  • APPROX_COUNT_DISTINCT

  • SUMMAXMINAVG

  • LISTAGGRANKDENSE_RANKPERCENT_RANK +ROW_NUMBER

  • NTILECUME_DISTFIRST_VALUELAST_VALUE

  • LEADLAGNTH_VALUE

示例如下:

统计组内排名

select customernumber, checknumber, paymentdate, amount, dense_rank() over (partition by customernumber order by amount) dense_rank , 
round(PERCENT_RANK() over (partition by customernumber order by amount),2) perentage
from payments where customernumber=141 order by dense_rank, customernumber;

统计数量近似值

select count(distinct customernumber), APPROX_COUNT_DISTINCT(customernumber) from payments;

统计分组汇总

select * from (
select OFFICECODE, listagg(LASTNAME,',') within GROUP (ORDER BY EMPLOYEENUMBER) OVER (partition by OFFICECODE) EMP_LIST,
row_number() over (partition by OFFICECODE order by EMPLOYEENUMBER) as rn
FROM employees)
where rn = 1;

统计分组内第一和最后一个值

select OFFICECODE, listagg(LASTNAME,',') within GROUP (ORDER BY EMPLOYEENUMBER) OVER (partition by OFFICECODE) EMP_LIST,
first_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_emp_all,
last_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ) last_emp,
last_value(LASTNAME) over (partition by OFFICECODE order by EMPLOYEENUMBER ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_emp_all
FROM employees
order by OFFICECODE;

同行显示分组统计的上一个和下一个值

select customernumber, checknumber, paymentdate,amount, round(cume_dist() over (partition by customernumber order by amount) ,2) as cume_dist ,lag(amount) over (partition by customernumber order by amount) last_ck,lead(amount) over (partition by customernumber order by amount) next_ckfrom payments where customernumber in (412,447,452,458) order by customernumber;

后记

更多Oracle的兼容性还在陆续开发或内部试用中。尤其是存储过程、PLSQL以及Package。请保持关注。

OceanBase对Oracle的兼容只是用户功能接口上的兼容,其底层原理依然是OceanBase特有的原理。

推荐阅读

更多后续分享敬请关注公众号:obpilot

 
 

OceanBase 2.1 的ORACLE兼容性能力探秘的更多相关文章

  1. 一文详解TDSQL PG版Oracle兼容性实践

    TDSQL PG版分布式关系型数据库,是一款同时面向在线事务交易和MPP实时数据分析的高性能HTAP数据库系统.面对应用业务产生的不定性数据爆炸需求,不管是高并发交易还是海量实时数据分析,TDSQL ...

  2. PostgreSQL Oracle 兼容性之 - sys_guid()

    Oracle 使用sys_guid()用来产生UUID值.  在PostgreSQL中有类似的函数,需要安装uuid-ossp插件.  如果用户不想修改代码,还是需要使用sys_guid()函数的话, ...

  3. oracle与DB2

    1.体系结构,DB2的实例和数据库分开的做法,我个人还是比较喜欢的,因为实例可以创建多个,数据库的恢复直接恢复到实例下就可以了,相对ORACLE简单多了. 2.管理工具,DB2的管理工具做得太简陋了, ...

  4. 阿里云如何打破Oracle迁移上云的壁垒

    2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲.Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够 ...

  5. Oracle设计规范!

    Oracle设计规范! 一哥们整理的Oracle的设计规范,相当的不错,贴这以备后续之需! 目录 1.数据库模型设计方法规范 1.1.数据建模原则性规范 1.2.实体型之间关系认定规范 1.3.范式化 ...

  6. Oracle表空间详解

    Oracle表空间详解 1.表空间的分类 Oracle数据库把表空间分为两类:系统表空间和非系统表空间. 1.1系统表空间指的是数据库系统创建时需要的表空间,这些表空间在数据库创建时自动创建,是每个数 ...

  7. win7兼容oracle

    操作系统:win7,数据库版本:Oracle 10.0. 问题:安装Oracle10.0时,安装程序意外退出,可按照如下操作解决win7与oracle兼容性问题. 1.打开“\Oracle 10G \ ...

  8. ORACLE数据库学习之逻辑结构

     逻辑结构 数据库逻辑结构包含表空间.段.范围(extent).数据块和模式对象. (一)表空间 一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间类似于sybase下的设备.(TABLES ...

  9. 深入探访支付宝双11十年路,技术凿穿焦虑与想象极限 | CYZONE特写

    小蚂蚁说: 双11十年间,交易规模的指数级增长不断挑战人们的想象力,而对蚂蚁技术团队来说,这不仅是一场消费盛宴,而是无数次濒临压力和焦虑极限的体验,更是技术的练兵场.如今双11对蚂蚁金服而言,已经绝不 ...

随机推荐

  1. 遗传算法 | Java版GA_TSP (2)

    嗯哼,上一篇博客中用Java实现了遗传算法求解TSP(Java版GA_TSP(我的第一个Java程序)),但明显求解效果不太好,都没太好意思贴出具体的结果,今天捣腾了下,对算法做了一些小改进,求解效果 ...

  2. setTimeout相关整理

    setTimeout里面函数有无双引号的区别 双引号中的作用域不捕捉局部变量,不用双引号包着的是捕捉局部作用域 var a = function(){ alert(1111) } function a ...

  3. 使用code::blocks编译windows的dll链接库

    因为机子上没有安装Visual Studio,所以找到了一种通过code::blocks编译dll的方式,踩到的坑是code::blocks默认的compiler是32位的,这样编译出的dll也是32 ...

  4. IOS开发学习笔记031-代码实现微博界面

    微博界面如下 1.准备资源文件 新建一个plist文件,添加条目,root类型是array,子类型是Dictionary 2.更改父类,实现代理方法 接下来得实现过程如上一篇文章,改变父类为UITab ...

  5. Python 模块搜索路径

    Python 会在什么地方寻找文件来导入模块? 使用命名为 path 变量的存储在标准 sys 模块 下的一系列目录名和 ZIP 压缩文件. 你可以读取和修改这个列表.下面是在我的 Mac 上 Pyt ...

  6. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  7. Python面向对象之私有方法(4)

    类里面有很多成员修饰符,用来修饰各种属性 (1)私有属性,只有内部的方法可以访问 class Foo: xo = 'xo'#表明是公共的,内部外部都可以访问 __ox = '私有属性'#私有属性,只有 ...

  8. [Android]APK一键反编译

    每次反编译就是件很烦的事情,烦了就开始偷懒.直接写成脚本节省操作. 使用apktool,d2j-dex2jar进行反编译 脚本:reseve-complie-apk.py import os impo ...

  9. Nginx概述与安装

    什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...

  10. Log4j官方文档翻译(一、基本介绍)

    简介 log4j是使用java语言编写的可靠的.快速的.灵活的日志框架,它是基于Apache的license. log4j支持c,c++,c#,perl,python,ruby等语言.在运行时通过额外 ...