OceanBase 2.x體驗:推薦用DBeaver工具連接數據庫


Original MQ4096 [OceanBase技術閑談](javascript:void(0)😉 2020-01-15

OceanBase 2.x體驗:推薦用DBeaver工具連接數據庫

OceanBase 2.2的版本近期已通過官網放出,里面除了OceanBase數據庫軟件和部署軟件外,還會有個數據庫驅動文件,名字是:oceanbase-client-1.0.9.jar 文件。該驅動完全兼容 MySQL JDBC 的使用方式並且可以自動識別 OceanBase 租戶的兼容模式是 MySQL 還是 Oracle,在協議層兼容 2 種模式,且兼容 OB2.0 協#議。

DBeaver新增OceanBase驅動方法

I. 打開DBeaver,點擊菜單【數據庫(D)】-【驅動管理器】

Image

II. 在【驅動管理器】里點擊【新建(N)】。

Image

III. 填寫OceanBase驅動相關信息

類名:com.alipay.oceanbase.obproxy.mysql.jdbc.Driver
URL模板:jdbc:oceanbase://<server>:<port>/<database>
默認端口:2883

這個默認端口是OBProxy的連接端口,默認都是2883. 當然也有的運維人員會把它設置為1521. 有關OBProxy簡介請參考《從ORACLE/MySQL到OceanBase:數據訪問代理》。

Image

IV. 點擊【添加文件】,找到驅動文件oceanbase-client-1.0.8.jar位置。

DBeaver新增ORACLE租戶連接

I. 在DBeaver里點擊【數據庫】-【新建連接】或者點擊圖標

Image

II.填寫數據庫連接相關信息

Image

用戶名:格式有兩種:賬戶名@租戶名#集群名 或者 集群名:租戶名:賬戶名
密碼:賬戶名對應密碼

用戶名反映了OceanBase集群的數據架構的分層特征。一個OceanBase集群將一組物理服務器聚合為一個超級大的資源池,然后從中分配出大小和類型不同的租戶(即實例)。租戶才是給到業務方使用的,也就是通常說的數據庫。當租戶兼容MySQL時,租戶就像MySQL實例,下面有很多database,創建不同的用戶訪問不同的數據庫;當租戶兼容ORACLE時,租戶就像ORACLE實例,下面有很多schema(跟用戶一一對應)。

這里還需要在【驅動屬性】里填寫數據庫IP和端口、以及默認數據庫(或schema)

Image

DBNAME 填上想用的數據庫的用戶名

點擊【測試鏈接】,會有“已連接”的提示!

Image

dbeaver批量執行sql

  1. 修改數據庫驅動屬性allowMultiQueries為true

  1. 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;
  • 查看用戶

Image

  • 查看用戶權限

Image

表管理

  • 建表
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;

Image

  • 查看索引結構

    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'
    ;
    

Image

創建存儲過程

-- 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即可。

Image

  • 查看存儲過程內容
SHOW CREATE PROCEDURE stocklevel;

Image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM