架構
OceanBase 數據庫支持數據跨地域(Region)部署,一個 Region 可以包含一個或者多個 Zone。Zone 是可用區(Availability Zone)的簡寫。
Zone 本身是一個邏輯概念,是對物理機進行管理的容器,一般是同一機房的一組機器的組合。物理層面來講一個 Zone 通常等價於一個機房、一個數據中心或一個 IDC。
一個 OceanBase 集群通常會分布在同城的 3 個機房中,同一份數據的三個副本分別分布在 3 個機房中(即三個 Zone 中)。
OceanBase 數據庫是支持多租戶的,這里租戶的概念類似於傳統數據庫的數據庫實例。租戶下可以建立數據庫,在租戶的數據庫下可以建立表。
目前支持兩種不同的租戶類型:MySQL 租戶和 Oracle 租戶。使用不同類型的租戶對應不同類型的語法和功能。
OceanBase 數據庫支持租戶隔離。每個租戶可以被賦於一定的資源(比如 CPU,內存,IOPS 和磁盤空間)。通過資源配置和設定資源池可以實現對租戶資源的控制。
查看數據庫版本
obclient> select version();
創建數據庫
使用 CREATE DATABASE
語句創建數據庫。
示例如下:
-
創建數據庫
test 2
,並指定字符集為UTF8
。obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8;
查看數據庫
使用 SHOW DATABASES
語句查看數據庫。
示例如下:
obclient> SHOW DATABASES;
刪除數據庫
使用 DROP DATABASE
語句刪除數據庫。
示例如下:
obclient> DROP DATABASE my_db;
創建表
使用 CREATE TABLE
語句在數據庫中創建新表。
示例如下:
obclient>CREATE TABLE table_name2 (c_w_id int NOT NULL
, c_d_id int NOT null
, c_id int NOT null
, c_last varchar(16)
, c_first varchar(16)
, c_middle char(2)
, c_balance decimal(12, 2)
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
, FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id)
, primary key (c_w_id, c_d_id, c_id)
);
創建了一個自增列,列的類型可以定義為 AUTO_INCREMENT,
示例如下:
obclient> CREATE TABLE t1(id bigint not null auto_increment primary key
, name varchar(50)
, gmt_create timestamp not null default current_timestamp
);
復制表結構和數據
不支持select * into from t語句。
使用 CREATE TABLE LIKE
語句復制表結構。
obclient>CREATE TABLE t1 like t;
使用INSERT INTO … SELECT …語句復制表數據。
obclient>INSERT INTO t1 SELECT * FROM t;
查看表
使用 SHOW CREATE TABLE
語句查看建表語句。
示例如下:
obclient> SHOW CREATE TABLE test;
使用 SHOW TABLES
語句查看指定數據庫中的所有表。
示例如下:
obclient> SHOW TABLES FROM my_db;
使用 DESCRIBE TABLE
語句查看表結構。
示例如下:
obclient> DESCRIBE test;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(3) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
使用 ALTER TABLE
語句修改表結構。
示例如下:
obclient> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10);
Query OK, 0 rows affected (0.08 sec)
obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c3 | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
執行以下命令,增加 c3
列。
obclient> ALTER TABLE test ADD c3 int;
執行以下命令,刪除 c3
列。
obclient> SHOW TABLES FROM my_db;
修改表
新增列,支持在表中新增列,但不支持增加主鍵列。
obclient> ALTER TABLE test ADD c3 int;
修改列屬性,支持修改列名稱和列類型。修改列c2為c,字段為char(60)
obclient>ALTER TABLE test CHANGE COLUMN c2 c CHAR(60);
刪除列,支持刪除表中的列,但不允許刪除主鍵列或包含索引的列。
obclient> ALTER TABLE test DROP c;
重命名表
obclient> ALTER TABLE test RENAME TO t1;
刪除表
使用 DROP TABLE
語句刪除表。
obclient> DROP TABLE IF EXISTS test;
創建索引
使用 CREATE INDEX
語句創建表的索引。
obclient> CREATE INDEX test_index ON test (c1, c2);
查看索引
使用 SHOW INDEX
語句查看表的索引。
obclient> SHOW INDEX FROM test;
刪除索引
使用 DROP INDEX
語句刪除表的索引。
obclient> DROP INDEX test_index ON test;
插入數據
向表 t1 中插入一行數據。
obclient> INSERT INTO t1 VALUES(1,1);
向表 t1 中插入多行數據。
obclient> INSERT t1 VALUES(1,1),(2,default),(2+2,3*4);
支持INSERT INTO … SELECT …
語句。
刪除數據
刪除表 t1
中按照 c2
列排序之后的第一行數據。
obclient> DELETE FROM t1 ORDER BY c2 LIMIT 1;
多表刪除,刪除 t1
、t2
表中 t1.c1 = t2.c1
的數據。
obclient> DELETE t1, t2 FROM t1, t2 WHERE t1.c1 = t2.c1;
更新數據
將表 t1
中 t1.c1=1
對應的那一行數據的 c2
列值修改為 100
。
obclient> UPDATE t1 SET t1.c2 = 100 WHERE t1.c1 = 1;
將表 t2
中 p2
分區的數據中 t2.c1 > 2
的對應行數據的 c2
列值修改為 100
。
obclient> UPDATE t2 partition(p2) SET t2.c2 = 100 WHERE t2.c1 > 2;
修改多個表。
obclient> UPDATE t1,t2 SET t1.c2 = 100, t2.c2 = 200 WHERE t1.c2 = t2.c2;
提交事務
如果使用 BEGIN 開啟一個事務,執行 DML 語句后需要使用 COMMIT
提交事務;
obclient> BEGIN;
Query OK, 0 rows affected
obclient> INSERT INTO t_insert(id,name) VALUES(4,'JP');
Query OK, 1 row affected
obclient> COMMIT;
Query OK, 0 rows affected
如果不顯示地使用 BEGIN
開啟事務,則一條 SQL 就是一個事務,不再需要提交事務。SQL 執行后您的修改即持久化成功,不可以用 ROLLBACK
語句回滾這些修改。
在提交事務(COMMIT
)之前:
-
您的修改只對當前會話可見,對其他數據庫會話均不可見。
-
您的修改沒有持久化,您可以通過
ROLLBACK
語句撤銷修改。
在提交事務(COMMIT
)之后:
-
您的修改對所有數據庫會話可見。
-
您的修改持久化成功,不能通過
ROLLBACK
語句回滾修改。
回滾事務
使用 ROLLBACK
語句回滾事務。
obclient> rollback;
Query OK, 0 rows affected (0.00 sec)
回滾一個事務指將事務的修改全部撤銷。可以回滾當前整個未提交的事務,也可以回滾到事務中任意一個保存點。
創建視圖
視圖用來展示表的查詢結果。大部分能使用表的地方,都可以使用視圖。如果經常訪問的數據分布在多個表里時,使用視圖是最好的方法。
創建視圖 stock_item。該視圖內容取自 stock 和 item 兩張表,兩張表做表連接即可得到該視圖。
obclient> CREATE VIEW stock_item
AS
SELECT i_price, i_name, s_i_id
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
修改視圖
修改視圖 stock_item。
obclient> CREATE OR REPLACE VIEW stock_item
AS
SELECT i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
刪除視圖
使用 DROP VIEW
語句刪除一個或多個視圖,刪除視圖並不會刪除視圖引用的表。
obclient> DROP VIEW V1;
創建同義詞
同義詞是一個租戶數據庫對象的別名。使用同義詞通常是為了管理權限方便,因為同義詞可以隱藏另外一個數據對象的所有者權限。
使用 CREATE SYNONYM
語句來創建私有同義詞s1,非當前數據庫dqms的表test。
obclient> CREATE SYNONYM s1 for dqms.test;
使用 CREATE
PUBLIC
SYNONYM
語句來創建公共同義詞。
刪除一個私有同義詞。
obclient> DROP SYNONYM test.s1;
刪除一個私有同義詞。
obclient> DROP PUBLIC SYNONYM syn_pub;