Original MQ4096 [OceanBase技術閑談](javascript:void(0)😉 2020-01-15
OceanBase 2.2的版本近期已通過官網放出,里面除了OceanBase數據庫軟件和部署軟件外,還會有個數據庫驅動文件,名字是:oceanbase-client-1.0.9.jar
文件。該驅動完全兼容 MySQL JDBC 的使用方式並且可以自動識別 OceanBase 租戶的兼容模式是 MySQL 還是 Oracle,在協議層兼容 2 種模式,且兼容 OB2.0 協#議。
DBeaver新增OceanBase驅動方法
I. 打開DBeaver,點擊菜單【數據庫(D)】-【驅動管理器】
II. 在【驅動管理器】里點擊【新建(N)】。
III. 填寫OceanBase驅動相關信息
類名:com.alipay.oceanbase.obproxy.mysql.jdbc.Driver
URL模板:jdbc:oceanbase://<server>:<port>/<database>
默認端口:2883
這個默認端口是OBProxy的連接端口,默認都是2883. 當然也有的運維人員會把它設置為1521. 有關OBProxy簡介請參考《從ORACLE/MySQL到OceanBase:數據訪問代理》。
IV. 點擊【添加文件】,找到驅動文件oceanbase-client-1.0.8.jar
位置。
DBeaver新增ORACLE租戶連接
I. 在DBeaver里點擊【數據庫】-【新建連接】或者點擊圖標
II.填寫數據庫連接相關信息
用戶名:格式有兩種:賬戶名@租戶名#集群名 或者 集群名:租戶名:賬戶名
密碼:賬戶名對應密碼
用戶名反映了OceanBase集群的數據架構的分層特征。一個OceanBase集群將一組物理服務器聚合為一個超級大的資源池,然后從中分配出大小和類型不同的租戶(即實例)。租戶才是給到業務方使用的,也就是通常說的數據庫。當租戶兼容MySQL時,租戶就像MySQL實例,下面有很多database
,創建不同的用戶訪問不同的數據庫;當租戶兼容ORACLE時,租戶就像ORACLE實例,下面有很多schema
(跟用戶一一對應)。
這里還需要在【驅動屬性】里填寫數據庫IP和端口、以及默認數據庫(或schema
)
DBNAME 填上想用的數據庫的用戶名
點擊【測試鏈接】,會有“已連接”的提示!
dbeaver批量執行sql
- 修改數據庫驅動屬性allowMultiQueries為true
- Ctrl + a,alt(option) + x
Java應用連接OceanBase的方法
Java應用也可以使用OceanBase Java驅動連接租戶(實例)。
添加 Maven 依賴
<dependency>
<groupId>com.alipay.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<!--推薦版本18,經過測試14~18都可以-->
<version>18.0</version>
</dependency>
修改 JDBC 連接串
連接串的前綴需要設置為 jdbc:oceanbase
,其他部分的使用方式與原生的 MySQL 使用方式保持一致。
String url = "jdbc:oceanbase://10.***.***.83:2883/SYS?useUnicode=true&characterEncoding=utf-8";
String username = "scott@tnt_oracle#obdemo";
String password = "tiger";
Connection conn = null;
try {
Class.forName("com.alipay.oceanbase.obproxy.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username, password);
PreparedStatement ps = conn.prepareStatement("select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;");
ResultSet rs = ps.executeQuery();
rs.next();
System.out.println("sysdate is:" + rs.getString(1));
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != conn) {
conn.close();
}
}
對於 Druid 框架,如果沒有使用 DriverManager,需要直接指定 DrvierClass,如下
<property name"driverClassName" value="com.alipay.oceanbase.obproxy.mysql.jdbc.Driver">
** 注意:**
如果提示 ORA-01882: timezone region 'UTC' not found
in VM Arguments section paste this
-Duser.timezone=Asia/Shanghai
具體參考:記一次JDBC連接Oracle出現“ORA-01882: timezone region not found“
OceanBase錯誤號
初次使用OceanBase時,經常會碰到各種錯誤,需要查看相應的錯誤號才能初步理解報錯原因。
OceanBase MySQL租戶的錯誤號都是負數,[-4000, -1]期間的跟MySQL錯誤號保持一致, 小於-4000的錯誤號為OceanBase新增的錯誤號。 詳細錯誤號定義請查看幫助文檔( https://tech.antfin.com/docs/2/YQ1174849)。
OceanBase ORACLE租戶的錯誤號有些跟ORACLE錯誤號定義是一致的,有些是自己特有的。詳細錯誤號定義請查看幫助文檔(https://tech.antfin.com/docs/2/YQ1243092)。
其他
DBeaver可以一定程度方便初學者了解OceanBase,但圖形化使用上跟OB驅動還不完全彼此兼容,所以體驗還不是非常好。OceanBase開發團隊也在開發適合OceanBase的圖形化客戶端工具。
ORACLE租戶下SQL示例
OceanBase ORACLE租戶下能運行一些常用的SQL語法,可以查詢常用的視圖。由於驅動本身沒有實現所有接口,所以還不能使用DBEaver的圖形化設計能力管理數據庫對象(如表),但是可以使用一些SQL操作。並且ORACLE租戶保留了一些MySQL租戶的SHOW
命令,很方便查看數據庫對象。
用戶權限管理
- 建用戶
-- 用戶管理
CREATE USER scott identified BY tiger;
GRANT ALL PRIVILEGES ON scott.* TO scott WITH GRANT option;
GRANT SELECT,CREATE ,DROP ON *.* TO scott;
- 查看用戶
- 查看用戶權限
表管理
- 建表
CREATE TABLE DEPT(
DEPTNO NUMBER(2) NOT NULL
,DNAME VARCHAR2(14)
,LOC VARCHAR2(13)
,CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO)
);
-- DROP TABLE EMP;
CREATE TABLE EMP(
EMPNO NUMBER(4)
,ENAME VARCHAR2(10)
,JOB VARCHAR2(9)
,MGR NUMBER(4) NULL
,HIREDATE DATE
,SAL NUMBER(7,2)
,COMM NUMBER(7,2)
,DEPTNO NUMBER(2) -- CONSTRAINT FK_DEPTNO REFERENCES DEPT
,CONSTRAINT PK_EMP PRIMARY KEY(EMPNO)
);
- 查看表結構
SHOW CREATE TABLE scott.dept;
-
查看索引結構
SELECT t1.owner, t1.table_name, t1.index_name, t1.index_type, t1.uniqueness, t2.column_name, t2.column_position, descend FROM all_indexes t1 JOIN all_ind_columns t2 ON (t1.owner=t2.table_owner AND t1.table_name=t2.table_name AND t1.index_name=t2.index_name) WHERE t1.owner ='SCOTT' AND t1.table_name='DEPT' ;
創建存儲過程
-- obclient -h127.1 -utpcc@tnt_oracle#obdemo -P2883 -p123456
delimiter //
CREATE OR REPLACE PROCEDURE stocklevel (
ware_id INTEGER,
dist_id INTEGER,
threshold INTEGER,
low_stock OUT INTEGER
)
IS
BEGIN
SELECT count (DISTINCT s_i_id)
INTO low_stock
FROM ordl, stok, dist
WHERE ol_w_id = ware_id AND d_id = dist_id AND d_w_id = ware_id AND
d_id = ol_d_id AND d_w_id = ol_w_id AND
ol_i_id = s_i_id AND ol_w_id = s_w_id AND
s_quantity < threshold AND
ol_o_id BETWEEN (d_next_o_id - 20) AND (d_next_o_id - 1);
COMMIT;
END stocklevel;
//
delimiter ;
存儲過程的創建在DBeaver里創建跟在命令工具obclient
里有點不同,不需要借助delimiter
命令改變語句終結符。直接選中存儲過程SQL,按快捷鍵CTRL+ENTER
即可。
- 查看存儲過程內容
SHOW CREATE PROCEDURE stocklevel;