今天彻底搞懂Oracle的用户、Schema、数据库、表空间、数据文件的相互关系
在进入抽象的概念之前,可以先看一下网上的这段比喻:
“我们可以把Database(这里应该是指某一个sid对应的数据库)看做一个大仓库,仓库分了很多很多房间,Schema就是其中的房间,一个schema代表一个房间,table可以看做是每个schema中的床,table(床)被放入每个房间中,不能放置在房间外,user就是每个schema的主人,所以schema包含的是object,而不是user,user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西,如果一个user想要使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西都某一个房间,你还可以给每个user分配具体的权限,也就是他到某一个房间能做写什么,是只能看(read-only),还是可以像主人一样有所有的控制权(R/W).这个就要看这个user所对应的角色role了。
(1)数据库:
Oracle数据库时数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看做是oracle就只要一个大数据库。
(2)实例
一个oracle实例(Oracle instance)有一系列的后台进程(Backgroud processes)和内存结构(Memory Structures)组成,一个数据库可以有n个实例。
(3)用户(user)
用户是在实例下建立的。不同实例可以建立相同名字的用户。
-- 创建新用户时,同时要指明表空间和临时表空间(建立创建时就指定表空间名) create user testuser #profile "default" identified by "password123" default tablespace ts_test ##这里要指定默认表空间 temporary tablespace tmp_ts_test ##这里指定了临时表空间 quota 500m on ts_test ##用户在表空间的限额 account unlock; ##解锁用户
*关于profile的说明(使用profile文件实现用户口令限制与资源限制)
profile是口令限制,资源限制的命令集合,建立oracle数据库时,oracle会自动建立命为default的profile,初始化的default没有进行任何口令和资源限制,使用profile有以下一些注意事项:
1.建立profile时,如果只设置了部分口令或者资源限制选项,其他选项会自动使用默认值(default的相应选项)
2.建立用户时,如果不指定profile选项,oracle会自动将default分配给相应的数据库用户
3.一个用户只能分配一个profile。如果要同时管理用户的口令和资源,那么在建立profile时应该同时指定口令和资源选项。
4.使用profile管理口令时,口令管理选项总是处于被激活状态,但如果使用profile管理资源,必须要激活资源限制。
*关于profile使用实践
1)查看当前存在的profile文件
select distinct profile from dba_profiles; --查看指定profile文件中各资源的限制情况: select resouce_name,limit from dba_profiles where profile='DEFAULT';
2)修改现在profile文件中资源选项:
1 alter profile default limit FAILED_LOGIN_ATTEMPTS 1 password_lock_time 3;
3)创建一个新的profile文件
1 create profile lock_accout limit failed_login_attempts 3 password_lock_time 10;
4)让用户使用新的profile文件:
1 alter user testuser profile lock_accout;
5)查看用户当前使用的profile文件
select username,profile from dba_users;
6)使用profile文件限制用户对资源的使用;
1 --必须先激活资源限制: 2 alter system set resource_limit=TRUE scope=memory; 3 --对资源限制做修改: 4 alter profile lock_accout limit cpu_per_session 5000;
7)删除profile
1 drop profile lock_accout;
8)删除profile并将使用当前profile的用户profile改为default
1 drop profile lock_accout cascade;
9)以下列出所有profile相关参数内容以便参考:
FAILED_LOGIN_ATTEMPTS:用于指定联系登陆的最大失败次数. PASSWORD_LOCK_TIME:用于指定帐户被锁定的天数. PASSWORD_LIFE_TIME:用于指定口令有效期 PASSWORD_GRACE_TIME:用于指定口令宽限期. PASSWORD_REUSE_TIME:用于指定口令可重用时间. PASSWORD_REUSE_MAX;用于指定在重用口令之前口令需要改变的次数. PASSWORD_VERIFY_FUNCTION;是否校验口令(校验将值改为VERIFY_FUNCTION) CPU_PER_SESSION:用于指定每个会话可以占用的最大CPU时间. LOGICAL_READS_PER_SESSON:用于指定会话的最大逻辑读取次数. PRIVATE_SGA:用于指定会话在共享池中可以分配的最大总计私有空间.需要注意,该选项只使用与共享服务器模式. COMPOSITE_LIMIT:用于指定会话的总计资源消耗(单位:服务单元). CPU_PER_CALL:限制每次调用(解析,执行或提取数据)可占用的最大CPU时间(单位:百分之一秒) LOGICAL_READS_PER_CALL:用于限制每次调用的最大逻辑I/O次数. SESSIONS_PER_USER:用于指定每个用户的最大并发会话个数. CONNECT_TIME:用于指定会话的最大连接时间. IDLE_TIME:用于指定会话的最大空闲时间.
(4)schema
在Oracle中,一般一个用户就对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema,用户是不能创建schema的,schema在创建用户的时候创建,并可以指定用户的各种表空间(这点与pg是不同,pg是可以创建schema并指派给某个用户)。当前连接到数据库上的用户创建的所有数据库对象都默认数据这个schema(在不指明schema的情况下),比如若用户scott连接到数据库,然后create table test(id int null)创建表,那么这个表被创建在了scott这个schema中;但若这样create table testuser.test(id int not null)的话,这个表被创建在了testuser这个schema中,当前前提是权限允许(即testuser用户给scott用户在其schema下创建数据表的权限)。由此看来,schema是一个逻辑概念。
但一定要注意一点:schema并不是在创建user时就创建的,而是在该用户创建了第一个对象之后才将schema真正创建的,只有user下存在对象,他对应的schema才会存在,如果user下不存在任何对象了,schema也就不存在了。
(5)表空间
表空间是一个用来管理数据存储逻辑概念,表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。
(6)数据文件(dbf、ora)
数据文件是数据库的物理存储单位,数据库的数据在逻辑上是存储在表空间中的,但真正落地是在某一个或者多个数据文件中。而一个表空间可以由一个或者多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。