技術分享 | OceanBase 租戶延遲刪除

碼農談IT發表於2023-03-09

作者:楊濤濤

資深資料庫專家,專研 MySQL 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源資料庫相關的備份恢復、SQL 調優、監控運維、高可用架構設計等。目前任職於愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支援、MySQL 相關課程培訓等工作。

本文來源:原創投稿

* 愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


OceanBase 關於租戶的刪除設計了以下三種方式:
  1. 正常刪除:租戶
    裡的各種物件也被刪除,具體表現形式依賴sys租戶回收站功能是否開啟。
  2. 延遲刪除:保留一段時間的租戶資料,等時間到期後,再刪除租戶。
  3. 立即刪除:徹底丟棄租戶!

對於第二種方式,之前同事們有內部討論過 OceanBase 的設計初衷:有可能是以防租戶被誤刪、或者是給費用到期並且不續租的租戶一段緩衝的時間,讓他能在時間到期前備份自己的資料。

租戶的刪除語法為:
DROP TENANT [IF EXISTS] tenant_name [PURGE|FORCE];
DROP TENANT:依賴sys租戶回收站是否開啟,有兩種表現形式。
  1. 回收站
    開啟,刪除的租戶會
    進入回收站,後續可以透過回收站還原此租戶!
  2. 回收站
    關閉,此操作租戶被
    刪除,但是可以讓租戶資料保留一段時間(由配置引數schema_history_expire_time 來設定)。在此期間租戶仍然可以進行DML操作,保證遺留業務的正常執行。OceanBase 會有一個後臺垃圾清理執行緒在時間到期後徹底刪除租戶。

DROP TENANT PURGE:此操作僅延遲刪除租戶,且具體表現形式和回收站是否開啟無關。也即無論回收站開啟與否,刪除的租戶都不會進入回收站,而是到期後,由後臺垃圾清理執行緒刪除租戶。
DROP TENANT FORCE:此操作立刻刪除租戶!
那我們接下來用幾個簡單例子詮釋下這些刪除操作。

先來建立兩個新租戶 tenant1、tenant2 。

mysql:5.6.25:oceanbase>create resource unit mini1 max_cpu 1,max_memory '1G',max_disk_size '1G',max_session_num 1200,max_iops 1000;
Query OK, 0 rows affected (0.015 sec)

<mysql:5.6.25:oceanbase>create resource pool p3 unit 'mini1',unit_num=1;
Query OK, 0 rows affected (0.038 sec)

<mysql:5.6.25:oceanbase>create resource pool p4 unit 'mini1',unit_num=1;
Query OK, 0 rows affected (0.062 sec)

<mysql:5.6.25:oceanbase>create tenant tenant1 resource_pool_list=('p3');
Query OK, 0 rows affected (2.660 sec)

<mysql:5.6.25:oceanbase>create tenant tenant2 resource_pool_list=('p4');

回收站開啟,刪除租戶 tenant1 : 查詢系統表 __all_tenant ,租戶 tenant1 已經被刪除,但是租戶資料存放在 sys 租戶回收站裡,可以隨時被恢復。

mysql:5.6.25:oceanbase>set recyclebin=on;
Query OK, 0 rows affected (0.000 sec)

<mysql:5.6.25:oceanbase>drop tenant tenant1;
Query OK, 0 rows affected (0.040 sec)

<mysql:5.6.25:oceanbase>show recyclebin;
+--------------------------------+---------------+--------+----------------------------+
| OBJECT_NAME                    | ORIGINAL_NAME | TYPE   | CREATETIME                 |
+--------------------------------+---------------+--------+----------------------------+
| __recycle_$_1_1678073859469312 | tenant1       | TENANT | 2023-03-06 12:07:21.626602 |
+--------------------------------+---------------+--------+----------------------------+
1 row in set (0.012 sec)

<mysql:5.6.25:oceanbase>select tenant_name from __all_tenant where tenant_name = 'tenant1';
Empty set (0.001 sec)

從回收站恢復租戶 tenant1 :再次查詢系統表 __all_tenant ,租戶 tenant1 恢復正常。

mysql:5.6.25:oceanbase>flashback tenant tenant1 to before drop;
Query OK, 0 rows affected (0.044 sec)

<mysql:5.6.25:oceanbase>show recyclebin;
Empty set (0.003 sec)

<mysql:5.6.25:oceanbase>select tenant_name from __all_tenant where tenant_name = 'tenant1';
+-------------+
| tenant_name |
+-------------+
| tenant1     |
+-------------+
1 row in set (0.002 sec)

回收站關閉,刪除租戶 tenant1:刪除後,依然可以透過系統表 __all_tenant 查詢到租戶資訊。

mysql:5.6.25:oceanbase>set recyclebin=off;
Query OK, 0 rows affected (0.001 sec)

<mysql:5.6.25:oceanbase>drop tenant tenant1;
Query OK, 0 rows affected (0.041 sec)

<mysql:5.6.25:oceanbase>select tenant_name from __all_tenant where tenant_name = 'tenant1';
+-------------+
| tenant_name |
+-------------+
| tenant1     |
+-------------+
1 row in set (0.001 sec)

直到配置項 schema_history_expire_time 設定的時間到期前,租戶 tenant1 都可以對其內部物件正常操作:比如 DQL 語句 、DML 語句等。

[root@ytt-pc obytt111]# obclient -uroot@tenant1#ob-ytt -P 2883 -cA -h 127.1 -D ytt -e "select * from t1;"
+----+
| id |
+----+
|  1 |
|  2 |
+----+

[root@ytt-pc obytt111]# obclient -uroot@tenant1#ob-ytt -P 2883 -cA -h 127.1 -Dytt -e "insert into t1 values (10)"

但是無法執行 DDL 語句:比如新建表 t2 則會報錯!

[root@ytt-pc obytt111]# obclient -uroot@tenant1#ob-ytt -P 2883 -cA -h 127.1 -Dytt -e "create table t2 like t1;"
ERROR 4179 (HY000) at line 1: ddl operation during dropping tenant not allowed

DROP TENANT tenant2 PURGE:延遲刪除租戶,同樣是等配置項 schema_history_expire_time 設定的時間到期後,徹底將租戶刪除,和上面例子類似。

<mysql:5.6.25:oceanbase>drop tenant tenant2 purge;
Query OK, 0 rows affected (0.055 sec)

<mysql:5.6.25:oceanbase>select tenant_name from __all_tenant where tenant_name ='tenant2';
+-------------+
| tenant_name |
+-------------+
| tenant2     |
+-------------+
1 row in set (0.002 sec)

DROP TENANT tenant2 FORCE :後續不再需要租戶 tenant2 ,可以立即刪除。

mysql:5.6.25:oceanbase>drop tenant tenant2 force;
Query OK, 0 rows affected (0.050 sec)

<mysql:5.6.25:oceanbase>select tenant_name from __all_tenant where tenant_name = 'tenant2';
Empty set (0.002 sec)

本文關鍵字:#OceanBase# #租戶刪除#


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2938828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章