@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @font-face{ font-family:"Calibri"; } p.MsoNormal{ mso-style-name:正文; mso-style-parent:""; margin:0pt; margin-bottom:.0001pt; mso-pagination:none; text-align:justify; text-justify:inter-ideograph; font-family:Calibri; mso-fareast-font-family:宋体; mso-bidi-font-family:'Times New Roman'; font-size:10.5000pt; mso-font-kerning:1.0000pt; } p.MsoHeader{ mso-style-name:页眉; margin:0pt; margin-bottom:.0001pt; border-top:none; mso-border-top-alt:none; border-right:none; mso-border-right-alt:none; border-bottom:none; mso-border-bottom-alt:none; border-left:none; mso-border-left-alt:none; padding:1pt 4pt 1pt 4pt ; layout-grid-mode:char; mso-pagination:none; text-align:justify; text-justify:inter-ideograph; font-family:Calibri; mso-fareast-font-family:宋体; mso-bidi-font-family:'Times New Roman'; font-size:9.0000pt; mso-font-kerning:1.0000pt; } p.MsoFooter{ mso-style-name:页脚; margin:0pt; margin-bottom:.0001pt; layout-grid-mode:char; mso-pagination:none; text-align:left; font-family:Calibri; mso-fareast-font-family:宋体; mso-bidi-font-family:'Times New Roman'; font-size:9.0000pt; mso-font-kerning:1.0000pt; } span.msoIns{ mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single; color:blue; } span.msoDel{ mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red; } @page{mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section0{ margin-top:72.0000pt; margin-bottom:72.0000pt; margin-left:90.0000pt; margin-right:90.0000pt; size:595.3000pt 841.9000pt; layout-grid:15.6000pt; mso-header-margin:42.5500pt; mso-footer-margin:49.6000pt; mso-page-numbers:decimal; } div.Section0{page:Section0;}
[TOC]
## 一、概述
```
1. 在数据库集簇中可以创建多个数据库。
2. 在一个数据库集簇中可以创建多个表空间。
3. 多个数据库可共同使用多个表空间(多对多的关系)。
4. 一个数据库可以创建和拥有多个模式(模式是数据库相关对象的集合)。
5. 用户被授予权限后可以登录多个数据库。
6. 用户被授予权限后可以访问多个模式中的对象。
7. 用户/角色 和数据库之间也没有归属关系,二者是平级关系,用户/角色可以看到所有的数据库。
```
## 二、数据库
### 1. 数据库概念
```
1. 数据库集簇(Database Cluster)和数据库实例(Database Instance)
<1>. KES集簇是指由单个KES集簇实例管理的数据库的集合。而管理数据库集簇的就是实例。
形象比喻:把从数据库中取数据类比为从银行中取钱。
那么银行的营业网点就是实例,银行的金库就是数据库,金库里的钱是数据。
<2>. KES集簇中的库使用相同的全局配置文件和监听端口、共享相关的进程和内存结构。
<3>. 同一数据库集簇中的进程、相关的内存结构统称为实例。
2. 数据库
<1>. 数据库是长期存储在计算机内的、有组织、可共享、统一管理的大量数据的集合。
<2>. 从物理结构来说,数据库由一系列位于文件系统上的文件组成。
<3>. 从逻辑结构来说,数据库内部通过表空间、模式、表/索引等对象与文件系统上的文件关联。
```
### 2. 创建数据库
1. 语法:
```
提示:可使用 '\h create database' 查看帮助信息。
create database 数据库名
[ [with] [owner] [=] user_name ]
[ template [=] template ]
[ encoding [=] encoding ]
[ lc_collate [=] lc_collate ]
[ lc_ctype [=] lc_ctype ]
[ tablespace [=] tablespece_name ]
[ allow_connections [=] allowconn ]
[ connection limit [=] connlimit ]
[ is_template [=] istemplate ]
参数简介:
user_name 指定该数据库的属主,默认属主是建库命令的执行者。
template 模板的名称,新建的数据库通过克隆数据库模板template0而生成,可选择模板或自定义创建模板。
encoding 数据库字符集。
lc_collate 数据库的排序规则,默认参照模板方式。
lc_ctype 数据库的字符分类,默认参照模板方式。
tablespace_name 数据库关联的表空间,该库的相关对象存储空间将使用该表空间。
allowconn 真,允许用户连接;假,不允许用户连接。
connlimit 数据库允许的连接数,默认-1 无限制。
is_template 真,具有createdb权限的用户可以从模板克隆;假,超级用户或库的所有者可以从模板克隆。
说明:
只有超级用户或具有createdb权限的用户才能创建数据库。
范例:
1. 使用模板template0创建数据库db01,属主为user01,字符集为UTF8,限制连接数为10。
test=# create database db01 with owner = user01 template = template0 encoding = 'UTF8' connection limit = 10;
或
test=# create database db01 owner user01 template template0 encoding 'UTF8' connection limit 10;
```
### 3. 修改数据库
1. 语法:
```
提示:可使用 '\h alter database' 查看帮助信息。
alter database 数据库名 rename to 新数据库名;
alter database 数据库名 owner to { 数据库的新所有者 | current_user | session_user };
alter database 数据库名 set tablespace 新表空间;
alter database 数据库名 set configuration_parameter { to | = } { value | default};
alter database 数据库名 set configuration_parameter from current;
alter database 数据库名 reset configuration_parameter;
alter databses 数据库名 reset all;
参数简介:
rename 修改非当前连接数据库的名称。
owner 更改数据库的所有者。
set tablespace 修改数据库对应的默认表空间。
set/reset configuretion_parameter 修改/重置该数据库的参数配置。
parameter /pəˈræmɪtər/ n.参数
说明:
修改数据库的属性,需要超级管理员或具备createdb权限、或是数据库的所有者。
```
### 4. 删除数据库
1. 语法:
```
提示:可使用 '\h drop database' 查看帮助信息。
drop database [ if exists ] 数据库名;
参数简介:
if exists 若删除的库存在,则直接删除;若删除的库不存在,则显示提示信息而不是报错信息。
说明:
删库时会移除磁盘上对应的文件及文件夹。
删库要由库的所有者或数据库管理员进行。
删除当前使用的库会报错。
创建和删除数据库的操作不能在同一个事务中将进行。
创建和删除数据库的操作不可回滚。
```
### 5. 数据库的增删改查
#### 5.1 查 -->列出数据库集簇中现有数据库的清单
```
[kingbase@node1 ~]$ ksql
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
-----------+--------+----------+-------------+-------------+-------------------
security | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +
| | | | | system=CTc/system
template1 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +
| | | | | system=CTc/system
test | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/system +
| | | | | system=CTc/system+
| | | | | u01=C*T*c*/system
(4 行记录)
说明:
1. test:自带的测试库,可以在其中创建数据库对象用于学习或测试。
2. security:存储入侵检测日志和检测结果。
3. template0:自带的干净的模板库,用于创建纯净的数据库,不允许用户连接和是删除。
4. template1:自带的模板库,允许用户连接和删除。
```
#### 5.2 增 -->创建数据库
```
1. 用system用户连接数据库test
2. 创建用户user01,密码为kingbase
3. 创建数据库db01,属主为user01、编码为UTF8、参照模板template0、连接数为10
4. 检查数据库的定义信息
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# create user user01 with password 'kingbase';
CREATE ROLE
test=# create database db01 with owner = user01 template = template0 encoding = 'UTF8' connection limit = 10;
或
test=# create database db01 owner user01 template template0 encoding 'UTF8' connection limit 10;
CREATE DATABASE
test=# \l+ db01
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-------+-------------+------
db01 | user01 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 12 MB | sys_default |
(1 行记录)
```
#### 5.3 改 -->修改数据库的属主和名称
```
1. 用管理员system连接数据库test
2. 检查数据库的定义信息
3. 修改数据库db01属主为system
4. 修改数据库db01名称为db001
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# \l+ db01
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-------+-------------+------
db01 | user01 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 12 MB | sys_default |
(1 行记录)
test=# alter database db01 owner to system;
ALTER DATABASE
test=# alter database db01 rename to db001;
ALTER DATABASE
```
#### 5.4 删 -->非属主/非超级管理员/或正在使用的库不能删除
```
1. 用system用户连接数据库db001
2. 删除数据库db001,提示“无法删除当前使用的数据库”
3. 切换到数据库test
4. 删除数据库据db001,提示删除完成
5. 再次删除数据库db001,提示数据库库不存在,添加 if exists 选项后,继续删除db001,提示“数据库不存在,删除完成”。
[kingbase@node1 ~]$ ksql -Usystem -ddb001
ksql (V8.0)
输入 "help" 来获取帮助信息.
db001=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "db001"
db001=# drop database db001;
错误: 无法删除当前使用的数据库
db001=# \c test
您现在已经连接到数据库 "test",用户 "system".
test=# drop database db001;
DROP DATABASE
test=# drop database db001;
错误: 数据库 "db001" 不存在
test=# drop database if exists db001;
注意: 数据库 "db001" 不存在,跳过
DROP DATABASE
```
## 三、模式
### 1. 模式的概念
```
1. 模式(schema)
<1>.模式就是数据库对象的集合。
<2>.一个数据库包含一个或多个模式。
<3>.为了区分各个集合,我们需要给这个集合取个名字,这个名字叫模式。
<4>.在多个模式中可以创建相同名称的对象,例如scott模式和hr模式都可包含名为emp的表。
2. 模式对象(schema object)
<1>.用于存储或引用数据的相关对象叫模式对象,如表、索引、视图、序列、函数等。
<2>.一个库中同一个模式下的对象不能重名。
<3>.一个库中不同模式的对象可以重名。
```
### 2. 创建模式
1. 语法:
```
create schema 模式名称 [ authorization role_specification ] [ schema_element [...] ]
create schema authorization role_specification [ schema_element [...] ]
create schema if not exists 模式名称 [ authorization role_specification ]
create schema if not exists authorization role_specification
authorization /ɔːθərəˈzeɪʃ(ə)n/ n.授权
参数简介:
role_specification 该模式的属主;若缺省,默认属主是执行该命令的角色/用户。
schema_element 创建模式时,嵌套的创建对象的sql语句。
authorization 创建一个与用户同名的模式。
if not exists 创建模式时,若模式不存在则创建,若模式已存在则显示提示信息而不是报错信息。
范例:创建模式s01,属主为user01
test=# create schema s01 authorization user01;
```
### 3. 修改模式
1. 语法:
```
alter schema 模式名称 rename 模式新名称
alter schema 模式名称 owner to { 模式的新所有者 | current_user | session_user }
参数简介:
rename 修改模式的名称
owner 修改模式的所有者
```
### 4. 删除模式
1. 语法:
```
drop schema [ if exists ] 模式名称 [, ...] [ cascade | restrict ]
参数简介:
if exists 删除模式时,若模式存在则删除,若不存在则显示提示信息。
cascade 删除模式时级联删除其中的对象。
restrict 默认,如果模式下包含对象,则拒绝删除。
cascade /kæˈskeɪd/ v.级联
restrict /rɪˈstrɪkt/ v.限制
说明:
删除模式需要模式所有者或超级用户权限。
```
### 5. 模式的增删改查
#### 5.1 查 -->列出test库中的模式清单
```
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# \dn+
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------------------+--------+------------------+------------------------
dbms_job | system | |
dbms_scheduler | system | |
dbms_sql | system | |
exam | system | |
kdb_schedule | system | |
public | system | system=UC/system+| standard public schema
| | =UC/system |
sysaudit | system | system=UC/system+|
| | sso=UC/system +|
| | sao=UC/system +|
| | =UC/system |
sysmac | system | system=UC/system+|
| | sso=UC/system +|
| | =U/system |
xlog_record_read | system | |
(9 行记录)
说明:
1. public:创建数据时会默认创建的模式,默认情况下允许所有用户写入。
2. sysaudit:该模式下存储会话像审计日志记录、对象审计日志记录。
3. xlog_record_read:该模式保存xlog事务日志相关的信息。
```
#### 5.2 增 -->创建模式
```
1. 用system用户登录test库
2. 创建用户user01,密码设置为kingbase
3. 新建模式s01,属主为user01
4. 检查模式的定义信息
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# create user user01 with password 'kingbase';
CREATE ROLE
test=# create schema s01 authorization user01;
CREATE SCHEMA
test=# \dn+ s01
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------+--------+----------+------
s01 | user01 | |
(1 行记录)
```
#### 5.3 改 -->修改模式
```
1. 用system连接数据库test
2. 修改模式s01的属主为system
3. 修改模式s01的名称为s001
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# alter schema s01 owner to system;
ALTER SCHEMA
test=# alter schema s01 rename to s001;
ALTER SCHEMA
test=# \dn+ s001
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------+--------+----------+------
s001 | system | |
(1 行记录)
```
#### 5.4 删 -->删除模式
```
1. 用system连接数据库test
2. 在s001模式下创建t01表
3. 删除模式s001,提示“有对象依赖于该模式、无法删除”
4. 检查模式s001中的对象信息
5. 通过cascade删除模式s001
[kingbase@node1 ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# create table s001.t01(id int);
CREATE TABLE
test=# drop schema s001;
错误: 无法删除 模式 s001 因为有其它对象倚赖它
描述: 表 s001.t01 倚赖于 模式 s001
提示: 使用 DROP .. CASCADE 把倚赖对象一并删除.
test=# \d+ s001.*
数据表 "s001.t01"
栏位 | 类型 | 校对规则 | 可空的 | 预设 | 存储 | 统计目标 | 描述
------+---------+----------+--------+------+-------+----------+------
id | integer | | | | plain | |
访问方法 heap
test=# drop schema s001 cascade;
注意: 递归删除 表 s001.t01
DROP SCHEMA
```
## 四、search_path
```
1. KES中的环境变量search_path是什么?
<1>. search_path 是一个用于对象搜索的模式列表,即当未指定对象的模式的时候要去哪些模式中搜索,它类似于linux操作系统中的path环境变量。
<2>. 比如,执行“select * from t01”语句用来引用t01表:
1).数据库会沿着search_path(show search_path; 可查看搜索路径)指定的模式列表依次查找。
2).用户需要拥有模式的usage权限,否则会跳过该模式。
3).用户需要拥有对象的select权限,否则报错。
4).返回命中的第一个t01表的数据。
5).如果遍历search_path变量中的模式列表后仍未找到t01,则报错“找不到 对象”。
2. 如果用户自定义的对象与系统内置的数据字典同名,优先访问数据字典对象。
3. 修改模式名可能影响 search_path
4. 显示指定模式名前缀(比如:schema.t01),数据库会忽略search_path。
5. sys_catalog模式总是被搜索,不管它是否在搜索路径中被提及。
<1>.如果sys_catalog在路径中被提及,那么它将被按照路径指定的顺序搜索。
<2>.如果sys_catalog不在路径中,则它将在任何路径项之前被搜索。
```
### 1. search_path理解
```
1. 使用'show search_path;'可查看模式搜索路径
test=# show search_path;
search_path
-----------------
"$user", public
(1 行记录)
说明:
a. $user 表示先到和当前用户同名的模式里搜索对象。
b. public 表示public模式。
c. 即先在和当前用户同名的模式中搜索,如果没有同名的模式,就到public模式中搜索,如果也没有就报错。
2. 使用'show search_path;'可查看模式搜索路径。通过未修饰的表名(名称中只含有表名,没有“schema名”)引用表时,
系统会通过search_path(搜索路径)来判断该表是哪个schema下的表。默认的搜索顺序?(A、B)
A. pg_temp 和 pg_catalog 始终会作为搜索路径顺序中的前两位,无论二者是否出现在search_path中,或者出现在search_path中的任何位置。
B. 搜索路径可以自定义
3. search_path变量中的模式列表可以增加、减少、调整顺序。
```
### 2. 修改search_path
```
一、仅会话层修改
1. 首先查看当前search_path,并查看score表。
test=# show search_path;
search_path
-----------------
"$user", public
(1 行记录)
#此时exam模式不在search_path中,所以会报错。
test=# table score;
错误: 关系 "score" 不存在
第1行table score;
2. 将exam模式加入到search_path中并查看。
test=# set search_path = "$user", public,exam;
SET
test=# show search_path;
search_path
-----------------------
"$user", public, exam
(1 行记录)
#此时exam模式已经在search_path中,所以不会报错了。
test=# table score;
sno | cno | ino | exam_date | score | certificate
------+-----+-----+---------------------+-------+-------------
1001 | 10 | 101 | 2021-03-05 00:00:00 | 85 | t
1001 | 20 | 101 | 2021-06-10 00:00:00 | 88 | t
1001 | 30 | 101 | 2021-08-24 00:00:00 | 83 | t
(3 行记录)
二、永久修改
```
## 五、表空间
### 1. 表空间的概念
```
1. 表空间是数据库分配空间的逻辑结构。
2. 数据库对象都存放在表空间中,主要存放的是表,所以称作表空间。
3. 表空间实际上就是给数据库对象指定一个操作系统文件夹。
4. 表空间依赖于包含在主数据目录中的元数据。
<1>.表空间不能被附加到一个不同的数据库集簇或者单独备份。
<2>.如果表空间中文件损坏或丢失,数据库集簇可能会变成不可读或者无法启动。
1. 表空间和数据库是相互独立的,二者不存在包含关系,二者是多对多的关系,即一个数据库可以拥有多个表空间,而一个表空间又可以服务于多个数据库。
2. 表空间和服务器上的目录是一对一的关系,在KES中一个表空间就映射操作系统中的一个目录。即在KES中我们把表放在表空间中其实物理上就是存放在服务器的一个目录里。
可以通过以下例子理解表空间的逻辑和物理关系:
如:小明同学是高三一班的学生,(可以将小明理解为表,高三一班是表空间,小明在高三一班里,即表存放在表空间里,此时是逻辑关系),
10号楼5楼第一个房间是高三一班(即表空间的物理位置)。
```
### 2. 表空间的好处
```
1. 当表空间所在的存储不够且无法扩展时,可以在不同的存储设备上创建新的表空间。
2. 频繁使用的表可以放在高速磁盘上,性能要求不高的表可以存放在慢速磁盘上。
```
### 3. 创建表空间
1. 语法:
```
create tablespace 表空间名称
[ owner { new_owner | current_user | session_user } ]
location 'directory'
[ with ( tablespace_option = value [, ... ]) ]
参数简介:
owner 指定该表空间的属主;如果缺省,默认为执行该命令的用户为该表空间的属主。
directory 与表空间关联的文件系统的绝对路径。
tablespace_option 设置或重置表空间的I/O参数。
```
2. 范例:
```
1. 创建表空间tbs01,物理目录是/home/kingbase/tbs01
1.1 创建物理目录tbs01并查看权限
[kingbase@node1 ~]$ mkdir tbs01
[kingbase@node1 ~]$ ll -d tbs01
drwxrwxr-x. 2 kingbase kingbase 6 5月 31 15:13 tbs01
1.2 创建表空间,此时再查看物理目录tbs01的权限
test=# create tablespace tbs01 location '/home/kingbase/tbs01';
CREATE TABLESPACE
[kingbase@node1 ~]$ ll -d tbs01
drwx------. 3 kingbase kingbase 29 5月 31 15:14 tbs01
```
### 4. 修改表空间
1. 语法:
```
alter tablespace 表空间名称 rename to 表空间新名称
alter tablespace 表空间名称 owner to { new_owner | current_user |session_user }
alter tablespace 表空间名称 set ( tablespace_option = value [, ...] )
alter tablespace 表空间名称 reset ( tablespace_option [, ...] )
参数简介:
rename 重命名表空间,只有超级用户或表空间的所有者才有修改权限。
owner to 修改表空间的属主,只有超级用户或表空间的所有者才有修改权限。
set 设置表空间的相关参数。
reset 重置表空间的相关参数到默认值。
说明:
1. 在某数据库新建模式对象时未指定表空间,则该对象将自动存入该库对应的默认表空间
(如果该库未指定自定义的表空间,对象存入sys_default;
如果该库指定了自己的表空间,对象存入指定的表空间)。
2. 库的默认表空间修改后,该库原有的对象自动迁移到新的表空间。
3. 一个库可以使用多个表空间,一个表空间可以被多个库使用。
4. KES支持使用参数temp_tablespaces配置临时表空间用于存储SQL执行时产生的临时数据。
```
2. 范例:
```
前提:已存在表空间tbs01,对应的物理目录为'/home/kingbase/tbs01'
1. 查看数据库db02
test=# \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+------- +-------------+------
db02 | user02 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 12 MB | sys_default |
(1 行记录)
2. 将数据库db02的表空间从sys_default修改为tbs01,然后再查看
test=# alter database db02 set tablespace tbs01;
ALTER DATABASE
test=# \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+------- +--------+------
db02 | user02 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 12 MB | tbs01 |
(1 行记录)
3. 查看表空间tbs01对应的物理目录
[kingbase@node1 SYS_12_202110271]$ ll
总用量 12
drwx------. 2 kingbase kingbase 58 5月 31 15:42 16165
drwx------. 2 kingbase kingbase 8192 5月 31 16:25 57352
说明:
16165是test数据库的oid
57352是db02数据库的oid
test=# select oid,datname from sys_database;
oid | datname
-------+-----------
16166 | security
1 | template1
16164 | template0
16165 | test
57352 | db02
(5 行记录)
```
### 5. 删除表空间
1. 语法:
```
drop tablespace [ if exists ] 表空间名称
参数简介:
if exists 如果删除的表空间存在,则直接删除;如果不存在,则显示提示信息,而不是显示报错信息。
说明:
1. 一个表空间只能被超级用户或拥有者删除。
2. 表空间删除前不能存在任何对象,否则删除失败。
```
### 6. 默认表空间
```
1. 查看当前默认表空间
test=# \db
表空间列表
名称 | 拥有者 | 所在地
-------------+--------+--------
sys_default | system |
sys_global | system |
sysaudit | system |
(3 行记录)
sys_default 存放用户数据,对应操作系统中的/data/base目录
sys_global 存放数据字典,对应操作系统中的/data/global目录
sysaudit 存放审计数据,对应操作系统中的/data/sys_aud目录
```
### 7. 使用表空间
```
前提条件:使用system用户连接test数据库
1. 创建表空间tbs01,物理路径为/home/kingbase/tbs01
[kingbase@node1 ~]$ mkdir tbs01
test=# create tablespace tbs01 location '/home/kingbase/tbs01';
2. 创建表t02使用表空间tbs01
test=# create table t02(id int,name text) tablespace tbs01;
CREATE TABLE
test=# insert into t02 select generate_series(1,1000000),md5(random());
INSERT 0 1000000
3. 查看表空间tbs01的物理目录
[kingbase@node1 SYS_12_202110271]$ pwd
/home/kingbase/tbs01/SYS_12_202110271
[kingbase@node1 SYS_12_202110271]$ ll
总用量 0
drwx------. 2 kingbase kingbase 58 5月 31 15:42 16165
说明:
'/home/kingbase/tbs01/SYS_12_202110271'中有个名为16165的目录,16165是test数据库的oid,可通过以下方式进行验证:
注释:oid 即object id
test=# select oid,datname from sys_database;
oid | datname
-------+-----------
16166 | security
1 | template1
16164 | template0
16165 | test
57352 | db02
(5 行记录)
查看16165目录:
[kingbase@node1 16165]$ ll
总用量 67280
-rw-------. 1 kingbase kingbase 68845568 5月 31 15:57 73747
-rw-------. 1 kingbase kingbase 40960 5月 31 15:42 73747_fsm
-rw-------. 1 kingbase kingbase 0 5月 31 15:42 73750
-rw-------. 1 kingbase kingbase 8192 5月 31 15:42 73752
说明:
其中有个名为73747的文件,73747是表t02的oid,表t02中的数据就存在此数据文件中,可通过以下方式得知t02的oid:
test=# select 't02'::regclass::oid;
oid
-------
73747
(1 行记录)
```
### 8. 表空间不足了怎么办
```
1. 在KES中表空间和操作系统中的目录一一对应,表空间不足即文件系统不足。
2. 根据不同的场景,采取不同的措施:
a.在线扩展对应的逻辑卷、文件系统。
b.挂载新的存储、并且dba创建新的表空间。
c.紧急情况下可以迁移走alert日志、清理大表的历史数据并收缩表。
```