b414.png

金倉數據庫的邏輯存儲結構主要是指數據庫中的各種數據庫對象,包括:數據庫集羣、數據庫、表、索引、視圖等等。所有數據庫對象都有各自的對象標識符oid(object identifiers),它是一個無符號的四字節整數,相關對象的oid都存放在相關的系統目錄表中,比如數據庫的oid和表的oid分別存放在sys_database,sys_class表中。下圖展示了KingBaseES數據庫的邏輯存儲結構。 image.png

image.png
點擊這裏查看視頻講解:【趙渝強老師】國產金倉數據庫的邏輯存儲結構

下面對金倉數據庫中的各種數據庫對象進行説明。

一、 數據庫集羣-Database Cluster

它也叫數據庫集簇,是指由單個KingBaseES數據庫服務器實例管理的所有數據庫集合。組成數據庫集羣的這些數據庫使用相同的全局配置文件和監聽端口、共用數據庫的後台進程和內存結構。一個數據庫集羣可以包括:多個數據庫、多個用户以及數據庫中的所有對象。

在文件系統術語中,一個數據庫集羣是一個單一目錄,該目錄稱之為數據目錄或數據區域,所有數據都將被存儲在該目錄中。它沒有默認的位置,其文件系統位置可以由-D選項或者環境變量KINGBASE_DATA指定,例如:

[kingbase@kingbase Server]$ pwd
/home/kingbase/kdb/Server
[kingbase@kingbase Server]$ bin/sys_ctl -D /home/kingbase/kdb/kes_oracle_instance/ start

二、 數據庫-Database

在金倉數據庫中,數據庫本身也是數據庫對象。不同的數據庫在邏輯上彼此分離,除數據庫之外的其他數據庫對象(例如:表、索引等等)都屬於它們各自的數據庫。通過下面的語句可以查看金倉數據庫服務器中已存在的數據庫。 (1)登錄KingBaseES。

ksql -U system -d kingbase

(2)查看KingBaseES中已有的數據庫。

kingbase=# \l 

# 輸出的信息如下:
                    數據庫列表
   名稱    | 擁有者 | 字元編碼 |  校對規則   | ......
-----------+--------+----------+-------------+-......
 kingbase  | system | UTF8     | zh_CN.UTF-8 | ......
 scott     | system | UTF8     | zh_CN.UTF-8 | ......
 security  | system | UTF8     | zh_CN.UTF-8 | ......
 template0 | system | UTF8     | zh_CN.UTF-8 | ......
 template1 | system | UTF8     | zh_CN.UTF-8 | ......
 test      | system | UTF8     | zh_CN.UTF-8 | ......
(6 行記錄)

三、 表空間-Tablespace

數據庫在邏輯上分成多個存儲單元,該單元稱作表空間。表空間用作把邏輯上相關的數據結構放在一起。數據庫邏輯上是由一個或多個表空間組成。在數據庫初始化的時候,會自動創建sys_default、sys_global和sysaudit三個表空間。

其中:

  • sys_global:該表空間用於存放系統表,對應存儲目錄是$KINGBASE_DATA/global/。
  • sys_default:創建表時的默認表空間,該表空間的物理文件存儲在數據目錄中的base目錄中,例如:$KINGBASE_DATA/base/。
  • sysaudit:該表空間用於存放安全審計相關的數據。對應存儲目錄$KINGBASE_DATA/sys_aud

下面通過具體的操作來演示如何查看KingBaseES中已有的表空間和如何創建自己的表空間。 (1)登錄KingBaseES。

ksql -U system -d kingbase

(2)查看KingBaseES中已有的表空間。

kingbase=# \db

# 輸出的信息如下:
          表空間列表
    名稱     | 擁有者 | 所在地 
-------------+--------+--------
 sys_default | system | 
 sys_global  | system | 
 sysaudit    | system | 
(3 行記錄)

(3)創建自己的表空間。

kingbase=# create tablespace mydemotbs location '/home/kingbase/mydemotbs';

(4)在mydemotbs 表空間上創建表。

kingbase=# create table testtable1(tid int primary key,tname text)
           tablespace mydemotbs;

(5)再次查看KingBaseES中已有的表空間。

kingbase=# \db

# 輸出的信息如下:
                   表空間列表
    名稱     | 擁有者 |          所在地          
-------------+--------+--------------------------
 mydemotbs   | system | /home/kingbase/mydemotbs
 sys_default | system | 
 sys_global  | system | 
 sysaudit    | system | 
(4 行記錄)

(6)將該表空間設置為默認的表空間。

kingbase=# set default_tablespace = mydemotbs;

(7)查詢表空間信息

kingbase=# select * from sys_tablespace;

# 輸出的信息如下:
  oid  |   spcname   | spcowner | spcacl | spcoptions 
-------+-------------+----------+--------+------------
  1663 | sys_default |       10 |        | 
  1664 | sys_global  |       10 |        | 
  1986 | sysaudit    |       10 |        | 
 16427 | mydemotbs   |       10 |        | 
(4 行記錄)

(8)使用\db+命令查看錶空間的詳細信息,輸出的信息如下:

kingbase=# \db+

# 輸出的信息如下:
                                      表空間列表
    名稱      | 擁有者  |          所在地           |    大小    | 描述 
-------------+--------+--------------------------+------------+------
 mydemotbs   | system | /home/kingbase/mydemotbs | 8237 bytes | 
 sys_default | system |                          | 102 MB     | 
 sys_global  | system |                          | 101 MB     | 
 sysaudit    | system |                          | 32 kB      | 
(4 行記錄)

# 命令中的加號表示顯示詳細信息。

image.png

四、 模式-Schema

當創建一個數據庫時,會為其自動創建一個名為“public”的默認Schema。Schema是數據庫中的命名空間,在數據庫中創建的所有對象都是在Schema中創建。一個用户可以從同一個客户端連接中訪問不同的Schema。而不同的Schema中可以有多個同名的表、索引、視圖、序列、函數等等各種不同的數據庫對象。可以通過下面的方式來查看當前數據庫的Schema。

kingbase=# \dn

# 輸出的信息如下:  
       架構模式列表
       名稱       | 擁有者 
------------------+--------
 anon             | system
 dbms_job         | system
 dbms_scheduler   | system
 dbms_sql         | system
 kdb_schedule     | system
 perf             | system
 public           | system
 src_restrict     | system
 sys_hm           | system
 sysaudit         | system
 sysmac           | system
 wmsys            | system
 xlog_record_read | system
(13 行記錄)

五、 段-Segment

一個段是分配給一個邏輯結構,如:一個表、一個索引或其他對象的一組區,它是數據庫對象使用空間的集合。段可以有表段、索引段、回滾段、臨時段和高速緩存段等,而最常用的段就是表段和索引段。

六、 區-Extent

區是數據庫存儲空間分配的一個邏輯單位,它由連續數據塊所組成。一個段是由一個或多個磁盤盤區組成。當一段中間所有空間已完全使用,KingBaseES會自動為該段分配一個新的磁盤盤區範圍。

七、 塊-Block(Page)

數據塊是KingBaseES管理數據文件中存儲空間的單位,為數據庫使用的I/O的最小單位。數據庫是最小的邏輯存儲單位,其默認值8K。通過參數block_size可以查看當前數據庫的數據塊大小。

kingbase=# show block_size;

# 輸出的信息如下:
 block_size 
------------
 8192
(1 行記錄)

在KingBaseES中,數據的讀寫是以數據塊為最小單位。在編譯KingBaseES時通過指定BLCKSZ參數大小將決定數據塊的大小。每個表文件由都由BLCKSZ字節大小的數據塊組成。在分析型數據庫中,適當增加BLCKSZ大小可以小幅度提升數據庫的性能。

八、 數據庫對象-Database Object

KingBaseES提供了各種數據庫對象,如表、視圖、索引、序列、函數等等。在KingBaseES中的所有數據庫對象都由各自的對象標識符(oid)進行內部的管理。數據庫的oid存儲在sys_database系統表中,可以通過下面的語句進行查詢。

kingbase=# select oid,datname from sys_database;

# 輸出的信息如下:  
  oid  |  datname  
-------+-----------
 14791 | test
 14792 | kingbase
     1 | template1
 14790 | template0
 14793 | security
 16384 | scott
(6 行記錄)

image.png 而數據庫中的表、索引、序列等數據庫對象的oid則存在了sys_class系統表中,例如可以通過下面的語句查詢前面創建的testtable1表的OID。

kingbase=# select oid,relname,relkind,relfilenode from sys_class
           where relname ='testtable1';
# 輸出的信息如下:  
  oid  |  relname   | relkind | relfilenode 
-------+------------+---------+-------------
 16428 | testtable1 | r       |       16428
(1 行記錄)