ORACLE各种对象、概念及关系整理(一文读懂)
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
下面是我整理(抄袭)的一些Oracle数据库相关概念对象的理解,如有疏漏,欢迎指正。至于整理这篇文章的目的:主要是网上的内容太散了,这样整理一遍可以加深理解,也便于后续查阅。就我的理解:下述内容应该可对10g,11g,12c都适用。更新的版本没用过。
Oracle DataBase是一款关系型数据库管理系统,很多时候,我们会把那个承载我们核心数据的系统笼统地成为数据库服务器,但从严格意义上来讲Oracle DataBase是由两个部分组成:
其中:
数据库指的是用户存储数据的一些物理文件,数据库 = 物理结构+逻辑结构
实例是数据库启动时初始化的一组进程和内存结构,实例 = 后台进程 + 内存
正因为如此我们一般才会说关闭和启动实例,加载和卸载数据库,就是这个道理。从实例和数据库的概念上来看,我们能知道,实例是暂时的,它不过是一组逻辑划分的内存结构和进程结构,它会随着数据库的关闭而消失,而数据库它其实就是一堆物理文件,它是永久存在的(除非磁盘损坏)。数据库和实例通常是一对一的,这种结构我们称为单实例体系结构;当然还有一些复杂的分布式的结构,一个数据库可以对多个实例,像Oracle的RAC(请自行google或者baidu),即集群模式。
下图是对一个oracle数据库服务,更具体的结构展示:
当在计算机服务器上启动Oracle数据库后,称服务器上启动了一个Oracle实例(Instance)。Oracle 实例(Instance)是存取和控制数据库的软件机制,它包含系统全局区(SGA)和Oracle进程两部分。SGA是系统为实例分配的一组共享内存缓冲区,用于存放数据库实例和控制信息,以实现对数据库中数据的治理和操作。 进程是操作系统中一个极为重要的概念。一个进程执行一组操作,完成一个特定的任务。对Oracle数据库治理系统来说,进程由用户进程、服务器进程和后台进程所组成。 当用户运行一个应用程序时,系统就为它建立一个用户进程。服务器进程处理与之相连的用户进程的请求,它与用户进程相通讯,为相连的用户进程的Oracle请求服务。 为了提高系统性能,更好地实现多用户功能,Oracle还在系统后台启动一些后台进程,用于数据库数据操作。 下面具体说明Oracle数据库的相关概念 一、Oracle数据库实例 这一部分主要参考(抄袭): https://www.cnblogs.com/chengxiao/p/5904783.html https://blog.csdn.net/huay_li/article/details/80545275 https://blog.csdn.net/oChangWen/article/details/51171992 1、 用户与Oracle数据库的交互流程 下面这张图,描述了单实例体系结构大致的交互流程




- PCTFREE参数:指定块中必须保留的最小空闲空间比例。当块中的空闲存储空间减少到PCTFREE所设置的比例后,Oracle将块标记为不可用状态,新的数据行将不能被加入到这个块。
- PCTUSED参数:制定一个百分比,当块中已经使用的存储空间降低到这个百分比之下时,这个块才被重新标记为可用状态。
1 -- 相关表:DBA_EXTENTS 、USER_EXTENTS 2 select * from dba_extents; 3 select * from user_extents; 4 5 --回收表、索引等对象中未使用的区 6 alter table table_name deallocate unused;(3)段(segment): 由多个区组成,这些区可以是连续的,也可以是不连续的。当用户在数据库中创建各种具有实际存储结构的对象时(保存有数据的对象),比如表、索引等,Oracle将为这些对象创建“段”。 一般一个对象只拥有一个段。在创建段时,可以为它指定PCTFREE、PCTUSED等参数来控制其中的块的存储空间管理方式,也可以为它指定INITIAL、NEXT、PCTINCREASE等存储参数,以指定其中区的分配方式。如果 没有为段指定这些参数,段将自动继承表空间的相应参数。不同类型的数据库对象拥有不同类型的段:
- 数据段:保存用户的数据(表中的记录)。每个表都有一个对应的数据段,其名称和数据表的名字相同
- 索引段:用来存储系统、用户的索引信息(索引中的索引条目)
- 临时段:在执行查询等操作时,Oracle可能会需要使用到一些临时存储空间,用于临时保存解析过的查询语句以及在排序过程中产生的临时数据,如:order by语句的排序以及一些汇总等。
- 回滚段:用来存储用户数据修改前的值,回滚段与事务是一对多的关系,一个事务只能使用一个回滚段,而一个回滚段可存放一个或多个事务的回退数据。
1 --相关表:DBA_SEGMENTS 、 USER_SEGMENTS 2 select * from dba_segments; 3 select * from user_segments;(4)表空间(tablespace): 最高级的逻辑存储结构, 一个Oracle数据库是由多个表空间组成的, 但一个表空间只隶属于一个数据库,一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间。一个表空间就是一片磁盘区域,他由一个或者多个磁盘文件组成,一个表空间可以容纳许多表、索引或者簇等。每个表空间有一个预制的磁盘区域称为初始区间(initial extent)用完这个区间后再用下一个,直到用完表空间,这时候需要对表空间进行扩展,增加数据文件或者扩大已经存在的数据文件。在创建数据库时会自动创建一些默认的表空间,例如 SYSTEM表空间,SYSAUX表空间等。通过使用表空间,Oracle将所有相关的逻辑结构和对象组合在一起。我们 可以在表空间级别指定存储参数,也可以在段级别指定。下面我们列出常见的表空间,和他们所存储的信息:
- 数据表空间:或称为用户表空间,用于存储用户数据的普通表空间。
- 系统表空间:默认的表空间,用于保存数据字典(一组保存数据库自身信息的内部系统表和视图,及用于Oracle内部使用的其他一些对象),保存所有的PL/SQL程序的源代码和解析代码,包括存储过程和函数、包、数据库触发器等,保存数据库对象(表、视图、序列)的定义。
- 回滚表空间:用于存放回滚段,每个实例最多只能使用一个撤销表空间。undo表空间的4个常见作用:
- 临时表空间:存储SQL执行过程中产生的临时数据。创建Oracle数据库的时候可以设置一个叫sort_area_size的参数,默认值为65536,排序的时候会首先使用这部分内存,如果不足就会使用临时表空间。
1 CREATE TABLESPACE "ts_test" --表空间名WEIXIN 2 LOGGING --启动重做日志 3 DATAFILE 'D:\app\oradata\orcl\ts_test.dbf' --指定对应的数据文件,可以一个或者多个 4 SIZE 512M --数据文件大小 5 AUTOEXTEND ON --数据文件自动扩展 6 NEXT 1024K --一次扩展的大小 7 MAXSIZE UNLIMITED --数据文件最大容量:无限 8 EXTENT MANAGEMENT LOCAL --表空间本地管理 9 SEGMENT SPACE MANAGEMENT AUTO ; --存储管理方式,AUTO为自动方式3)创建临时表空间
1 CREATE TEMPORARY TABLESPACE tmp_ts_test 2 TEMPFILE 'D:\app\oradata\orcl\tmp_ts_test.DBF' 3 SIZE 100M;4)回滚段表空间
1 create undo tablespace undo_ts_test 2 datafile 'D:\app\oradata\orclundo_ts_test.DBF' 3 size 100M;5)新建用户,并将先前建的表空间 ts_test 和临时表空间 tmp_ts_test 作为testuser用户的默认使用空间。
1 --创建新用户,同时指定表空间和临时表空间 2 CREATE USER testuser --创建用户testuser 3 PROFILE "DEFAULT" --忽略对profile中的一些资源限制(什么鬼,不明白) 4 IDENTIFIED BY "pwd123456" --密码为weixin 5 default tablespace ts_test --默认表空间ts_test,即数据默认存此表空间 6 temporary tablespace tmp_ts_test --临时表空间 7 QUOTA 500m ON ts_test --用户在表空间中的限额 8 ACCOUNT UNLOCK; --解锁用户 9 10 --通常建完用户后会给用户授予一些基本的权限 11 Grant connect, resource to testuser; 12 13 --或者直接给用户赋予dba权限(只是测试,生产请不要这么做) 14 --with admin option 表示在获得权限的同时也获得了将这个权限授予其他用户的能力。 15 GRANT "DBA" TO "testuser" WITH ADMIN OPTION;oracle的安全策略方面默认一个用户的密码有效期为180天,我们可以直接把这个有效期调成永久。 1 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 6)如果表空间不足,可以有两种方法: 第一种,增加数据文件:
1 ALTER TABLESPACE ts_test(表空间名) 2 ADD DATAFILE '......'(数据文件全路径名) 3 SIZE 1000M;第二种,把表空间设置为自动扩展:
1 ALTER DATABASE DATAFILE '.......'(数据文件全路径名) 2 autoextend on; (在创建表空间时,就可以加上这个关键字,表示该表空间自动扩展)7)删除表空间
1 drop tablespace ts_test 2 including contents and datafile;如果表空间有数据,不增加 including contents 将无法删除成功,增加 and datafiles 关键字在linux 及 unix 下可自动删除数据文件,而在windows 环境下需要手动删除 8)UNDO 表空间和 TEMP 表空间在数据库建好是必然已经创建好了,不过,它们都可以新建,并且用户都可以指定新建的空间。 9)oracle 可以为不同的用户指定不同的临时表空间,而且可以为同一用户的不同session 设置不同的临时表空间(临时表空间组),从而减缓IO 竞争。 2. oracle物理存储结构: Oracle数据库逻辑上由一个或多个表空间组成,每个表空间在物理上由一个或多个数据文件组成,而每个数据文件由数据块构成的。所以, 逻辑上数据存放在表空间中,而物理上存储在表空间所对应的数据文件中。我们可以用这张图来描述数据文件和表空间的关系。




1 C:\Users\anand>set oracle_sid=orcl
2)和数据库建立连接(其实一般这样就可以使用了)
1 C:\Users\anand>sqlplus / as sysdba 2 SQL*Plus: Release 11.2.0.1.0 Production on 星期六 6月 2 10:58:17 2018 3 Copyright (c) 1982, 2010, Oracle. All rights reserved. 4 连接到: 5 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 6 With the Partitioning, OLAP, Data Mining and Real Application Testing options(2)测试数据库启动流程 1)启动实例(不加载数据库)
1 SQL> startup nomount 2 ORACLE 例程已经启动。 3 4 Total System Global Area 1068937216 bytes 5 Fixed Size 2182592 bytes 6 Variable Size 624951872 bytes 7 Database Buffers 436207616 bytes 8 Redo Buffers 5595136 bytes2)加载(关联)数据库
1 SQL> alter database mount; 2 3 数据库已更改。3)打开数据库
1 SQL> alter database open; 2 3 数据库已更改。4)验证
1 SQL> select status from v$instance; 2 3 STATUS 4 ------------ 5 OPEN
四、ORACLE 的用户、SCHEMA、数据库、表空间、数据文件的相互关系 这一部分主要参考(抄袭): https://blog.csdn.net/kanon_lgt/article/details/4269135
在进入抽象的概念之前,可以先看下网上的这段比喻: “我们可以把Database(这里应该指的是某一个sid对应的数据库)看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西,如果一个user想使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,你还可以给每个User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了。”这些Oracle数据库中具体的概念在前面已经介绍过了,下面再简述一下: (1)数据库: Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。 (2)实例: 一个Oracle实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)组成。 一个数据库可以有n个实例。
数据库和实例的关系: ORACLE实例与ORACLE数据库,这个是比较混淆的一个概念,在很多观念下,包括我以前也会认为一个实例等价于一个数据库,其实这个应该说是在 大部分情况下可以认为:一个实例对应一个数据库, 实例是一个Instance,而数据是对外屏蔽的一些转换后文件组合(学习过第四代数据库就知道,如果你做过裸机文件也会明白原理),数据库不是对外直接开放的,开放的规则是通过实例(Instance),Instance是一段内存,这个内存中包含很多个不同的版块(主体上的分就是SGA和PGA了), 我们一切操作都是交给实例的,而不是直接操作数据库文件系统,为什么要有中间这个过程,ORACLE考虑到:安全、缓冲、效率、扩展性等问题;而为什么是大部分情况下这样说, 因为ORACLE还有集群的概念,对于ORACLE RAC真正集群使用后你会更加深刻认识实例和数据库之间的关系,它使用多个分布于不同主机上的实例,对同一个裸机文件系统上的数据库进行操作,所以此时实例和数据库就不是一对一了,而是多对一,但是一个实例只能用一个数据库这是肯定的。(3)用户(user) 用户是在实例下建立的。不同实例可以建相同名字的用户。 具体的创建用户的方法是这样的(再写一遍):
1 --创建新用户,同时指定表空间和临时表空间(建议创建的时候指明表空间名) 2 CREATE USER testuser --创建用户testuser 3 PROFILE "DEFAULT" --忽略对profile中的一些资源限制(什么鬼,不明白) 4 IDENTIFIED BY "pwd123456" --密码为weixin 5 default tablespace ts_test --默认表空间ts_test,即数据默认存此表空间 6 temporary tablespace tmp_ts_test --临时表空间 7 QUOTA 500m ON ts_test --用户在表空间中的限额 8 ACCOUNT UNLOCK; --解锁用户※关于profile的说明(使用profile文件实现用户口令限制与资源限制) Proflie是口令限制,资源限制的命名集合.建立oracle数据库时,oracle会自动建立名为DEFAULT的PROFILE,初始化的DEFAULT没有进行任何口令和资源限制.使用PROFILE有以下一些主要事项: a,建立PROFILE时,如果只设置了部分口令或资源限制选项,其他选项会自动使用默认值(DEFAULT的相应选项) b,建立用户时,如果不指定PROFILE选项,oracle会自动将DEFAULT分配给相应的数据库用户. c,一个用户只能分配一个PROFILE.如果要同时管理用户的口令和资源,那么在建立PROFILE时应该同时指定口令和资源选项. d,使用PROFILE管理口令时,口令管理选项总是处于被激活状态,但如果使用PROFILE管理资源,必须要激活资源限制. ※关于profile使用的实践 1)查看当前存在的profile文件
1 select distinct profile from dba_profiles; 2 --查看指定profile文件中各资源的限制情况: 3 select resource_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在创建用户的时候创建,并可以指定用户的各种表空间(这点与PostgreSQL是不同,PostgreSQL是可以创建schema并指派给某个用户)。当前连接到数据库上的用户创建的所有数据库对象默认都属于这个schema(在不指明schema的情况下),比如若用户scott连接到数据库,然后create table test(id int not 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): 数据文件是数据库的 物理存储单位。数据库的数据在逻辑上是存储在表空间中的,但真正落地是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。
表的数据,是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。 由于oracle的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!下图也许有助于理解上述名称之间的关系:


更多精彩