Oracle 的 表空间(Tablespace)、用户(User)、模式(Schema)
前面有整理了一篇 Oracle 数据库(database) 与 实例(instance) 的概念及关系整理 。
那接下来就往下整理一个数据库里面的一些其他几个东西之间的奇奇怪怪的关系。
一、表空间(Tablespace)
讲表空间的话我就想到Oracle的逻辑存储结构了。所以还是简单讲讲吧,有机会再单独总结(抄袭)一篇。
在计算机技术中,逻辑就是虚拟的意思,实际的数据存储在硬盘中那是物理级别的,也就是我们说的物理存储结构。之间的关系我直接从官方文档中截个图放着,连接线的用的是乌鸦脚表示法来表示一对多的关系,看着还是很明确的!
图中明显可以看出:
1、在oracle的物理逻辑存储结构中,从小到大都是的关系如下,然后从大到小都是一对多的关系:
Oracle data block(数据块)-->Extent(扩展区)-->Segment(段)-->Tablespace(表空间)
2、物理存储结构上,OS block(操作系统的存储块),windows系统上的话,其实也就是我们格式化硬盘的时候选的分配单元大小,Oracle数据块跟操作系统块是一对多的关系。然后,比较重要的一个,一个Oracle的表空间,可以对应多个数据文件。
(一)表空间概述
1、上面刚其实也已经提到,表空间就是个逻辑存储容器,在对应的物理级别上,表空间的数据内容是存储在一个或者多个数据文件或者临时文件中。
2、表空间主要有Permanent Tablespaces(永久表空间)、Temporary Tablespaces(临时表空间)、Undo Tablespaces(撤销表空间)三种,Oracle Database 11g r2在用dbca数据库管理助手创建数据库的时候,默认会创建三个永久表空间(SYSTEM、SYSAUX、USERS),一个临时表空间(TEMP),一个撤销表空间(UNDOTBS1)。
3、 Oracle数据库有几个缺省表空间,其中SYSTEM和SYSAUX 表空间是一个Oracle数据库必须有的。
4、表空间的模式,也可以称为状态,可以设置表空间的online(联机)或者offline(脱机),Read/write(读/写) 或者 Read-only(只读) 。
(二)永久表空间
用于存储数据库中的持久性模式对象,如表、索引、视图等,其数据在物理上对应一个或者多个数据文件。永久表空间也是我们实际中用的最多的一个类型的表空间。
(三)临时表空间
见名知意,不能进行永久对象的存储。其主要用途在于存储临时表的数据、提供空间进行排序操作、创建索引等等。
临时表的话,例如会话级临时表,往里面插入数据进行操作的时候数据使用的就是临时表空间。
创建Oracle数据库的时候可以设置一个叫sort_area_size的参数,默认值为65536,排序的时候会首先使用这部分内存,如果不足就会使用临时表空间。
(四)撤销表空间
撤销表空间主要用于DML语句的数据管理,当执行insert,update,delete的时候,旧的数据就会存放到undo表空间。undo表空间的4个常见作用。
1、事务回滚,我们对数据进行dml操作的时候,如果撤销修改,就会通过undo表空间记录的修改数据把数据恢复到修改前。有些存储过程中通过exception捕捉异常的时候经常会有一句rollback,也是这个作用,对当前事务的数据操作进行回滚恢复。
2、数据库恢复,数据库异常关闭,重新启动的时候会通过undo表空间将回退未提交的事务。
3、读一致性,在一个会话操作数据未提交的时候,通过undo表空间保证其他人访问的数据的一致性(就是未修改的样子)。
4、闪回查询,这是个很有趣的功能。可以查看某个时间点的时候的数据,经常,,算了,也不经常,主要用于误操作、误删数据等的恢复。
综上所述,这些东西日常来说基本都不用管。
(五)表空间模式
1、联机(online)和脱机(offline)表空间
这个其实应该说是表空间的联机状态,Oracle数据库再开启状态的时候,我们可以让除了SYSTEM 表空间和临时表空间外其他所有的表空间联机或者脱机,offline状态的表空间无法被除了Oracle外任何其他的应用程序访问和读写。当然,如果刚好有个会话在操作这个表空间中的部分数据,也不会有太大的影响,Oracle会有相应的处理机制,不详细说。
不想打了,直接从官方文档摘抄一段:
表空间可以自动或手动脱机。例如,您可以将表空间脱机,以进行维护或备份与恢复。数据库在遇到某些错误时会自动将一个表空间脱机,比如数据库写进程 (DBWn)多次试图写入数据文件但遭遇失败时。当用户试图访问一个脱机表空间中的表时,将收到一个错误。
(六)表空间创建语法
放一个永久表空间的创建语法及几个常用的属性对应的注释吧
-
CREATE TABLESPACE "WEIXIN" --表空间名WEIXIN
-
LOGGING --启动重做日志
-
DATAFILE 'D:\app\oradata\orcl\WEIXIN.DBF' --指定对应的数据文件,可以一个或者多个
-
SIZE 512M --数据文件大小
-
AUTOEXTEND ON --数据文件自动扩展
-
NEXT 1024K --一次扩展的大小
-
MAXSIZE UNLIMITED --数据文件最大容量:无限
-
EXTENT MANAGEMENT LOCAL --表空间本地管理
-
SEGMENT SPACE MANAGEMENT AUTO ; --存储管理方式,AUTO为自动方式
二、用户(User) & 模式(Schema)
(一)用户
数据库中的用户,其实就是一个认证登录的东西,用来连接和访问数据库的。
我们先看下创建用户的语法:
-
CREATE USER "WEIXIN" --创建用户WEIXIN
-
PROFILE "DEFAULT" --忽略对profile中的一些资源限制(什么鬼)
-
IDENTIFIED BY "weixin" --密码为weixin
-
DEFAULT TABLESPACE "WEIXIN" --默认表空间WEIXIN,即数据默认存此表空间
-
ACCOUNT UNLOCK; --解锁用户
-
-
--通常建完用户后会给用户授予一些基本的权限
-
Grant connect, resource to weixin;
-
-
--或者直接再授个管理员权限
-
GRANT "DBA" TO "WEIXIN" WITH ADMIN OPTION;
-
--with admin option 表示在获得权限的同时也获得了将这个权限授予其他用户的能力。
好,用户就讲到这。还有一个需要注意的是,oracle的安全策略方面默认一个用户的密码有效期为180天,我们可以直接把这个有效期调成永久。
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
(二)模式(scheam)
我们再偷偷搬运一下官方文档的说法:数据库模式是逻辑数据结构(并非我们上面说的逻辑存储结构哈)或模式对象的集合。 数据库模式由一个数据库用户拥有,并与用户名具有相同的名称。
其实就是,我们在创建用户的时候,Oracle会自动创建一个与用户名相同的数据库模式,然后,该用户下所有的对象(也称为模式对象,如表、序列、视图、同义词、存储过程等等等等),都是归属到这个数据库模式。
简单点可以说,模式是对象的集合,对象(表、存储过程、视图等等)是模式的元素?大概可以这么理解。欢迎纠正!
所以,数据库模式是用来管理对象的。对象就是表呀、视图呀这些,也被称为数据库的逻辑数据结构。
(有点乱。。。看好几个关键字:模式、对象、逻辑数据结构)
举个大家比较常用的例子,很多语言都会提供一个英文句号 "." 这么个东西,在很多IDE上,想调用一个对象的某个东西的时候,我们可以打个对象名,然后点一下,后面就会自动联想出对象所有的变量呀,方法呀什么的。在oracle中也一样,我们可以通过 模式.对象名的形式去访问或者调用对象。
如下面的sql,就是通过指定模式名,然后点,后面跟上表名,就能查询到lhy模式下的emps表。这个主要用于跨用户的查询。日常开发中用户和模式的概念并不会分得很清楚,口头上也就是说,查一下lhy用户下的emps表,其实就是lhy用户对应的lhy模式里面的emps表。
select * from lhy.emps;
还有一点,就是模式下面的对象所存储的表空间,通常是由创建用户的时候的default tablespace参数决定。当然,创建表的时候你也可以单独制定这个表存在哪个表空间下面。