Oracle存储结构

Oracle的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系。如下图所示:

  • 物理结构主要描述Oracle数据库的外部存储结构,即在操作系统中如何组织、管理数据。
  • 逻辑结构主要描述Oracle数据库的内部存储结构,即从逻辑概念上描述在Oracle数据库中如何组织、管理数据。
1)Oracle物理结构

物理结构是Oracle数据库创建后使用的操作系统物理文件,Oracle数据库的物理文件分为以下两类:

(1)主要文件

**①数据文件:**数据文件(Data File)的扩展名通常是.dbf,是物理存储Oracle数据库数据的文件。

数据文件的特点:

  • 每个数据文件只与一个数据库相联系;
  • 一个表空间可包含一个或多个数据文件;
  • 一个数据文件只能属于一个表空间;

**②重做日志文件:**重做日志文件(Redo Log File)的扩展名是.log,它记录了对数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库。

在Oracle数据库中,重做日志文件是成组使用的,每个重做日志文件组可以有一个或多个重做日志文件。在工作过程中,多个重做日志文件组之间循环使用,当一个重做日志文件组写满后,会转向下一个日志文件组。重做日志文件用于记录数据库变化,是用户的事务处理日志。

**③控制文件:**控制文件(Control File)的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息很多,其中包括数据文件和重做日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当Oracle读写数据时,要根据控制文件 的信息查找数据文件。

由于控制文件的重要性,一个数据库至少要有两份控制文件。Oracle 12c默认包含两个控制文件,各个控制文件内容相同,从而可以避免因为一个控制文件的损坏而导致无法启动数据库的情况出现。

控制文件中记录了以下关键信息:

  • 数据文件的位置及大小;
  • 重做日志文件的位置及大小;
  • 数据库名称及创建时间;
  • 日志序列号;
(2)其他文件

其他文件有参数文件、归档日志文件、口令文件等。

2)Oracle逻辑结构

数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle数据库的逻辑结构包括表空间、段、区、块和模式等。如图:

(1)表空间

每个Oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以由多个数据文件,但一个数据文件只能属于一个表空间。与数据文件这种物理结构不同,表空间属于数据库的逻辑结构。

在Oracle数据库中,用于存放数据库表、索引、回滚段等对象的磁盘逻辑空间叫做表空间。 如上所示。

一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统会自动创建多个表空间。

在每个数据库中,都有一个名为"SYSTEM"的表空间,即系统表空间,还会有SYSAUX、UNDO、USERS等表空间,这些都是在创建数据库时自动创建的。管理员可以创建自定义的表空间并分配给指定用户,也可以为表空间增加和删除数据文件。

表空间基本有以下三类:

  • ①永久性表空间:一般保持基表、试图、过程和索引等的数据。SYSTEM、SYSAUX、USERS表空间是默认安装的;
  • ②临时性表空间:只用于保存系统中短期活动的数据,如排序数据等;
  • ③撤销表空间:用来帮助回退未提交的事务数据,已提交的数据在这里是不可以恢复的;

一般不需要创建临时性表空间和撤销表空间,除非要把他们转移到其他磁盘中以提高性能。

表空间的目的如下:

  • ①对不同用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和对模式对象的管理;
  • ②可以将不同数据文件创建不同的磁盘中,有利于管理磁盘空间、提高I/O性能、备份和恢复数据等;

一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统自动建立SYSTEM、SYSAUX、USRS等多个表空间。

下面详细介绍一下SYSTEM表空间、SYSAUX表空间、TEMP表空间和TEMP表空间:

  • SYSTEM表空间:用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表,索引等对象存放到SYSTEM表空间中。
  • SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具用户的数据;还用于存放各种模式的对象数据,如智能代理用户DBSNMP等,这些模式在数据库安装完成后就建立了相应的对象并都存放在SYSAUX表空间中。
  • USERS表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表、索引等。
  • TEMP表空间:Oracle系统用于存放临时数据的特殊表空间。比如:当操作中需要进行排序时,Oracle系统就将排序的数据临时存放在该表空间内。排序处理完成后即可释放排序数据所占用的空间,因此成为临时表空间。
SYSAUX表空间
  • SYSAUX表空间是Oracle 11g新增加的表空间,主要用于存放Oracle系统内部的常用样例用户的对象。
  • SYSAUX一般不存放用户的数据,由Oracle系统内部自动维护
  • SYSAUX对应的数据文件为 sysaux01.dbf

UDNO表空间
  • 列表内容UNDO表空间用于存储撤销信息的表空间
  • 当我们对数据库进行修改(包括INSERT、UPDATE、DELETE操作)时, Oracle会自动使用UNDO表空间来存放修改前的数据
  • 当操作完成并提交后,Oracle系统会根据细腰保留修改前数据时间长短来释放UNDO表空间的部分空间。
  • 默认的数据文件为undotbs01.dbf

USERS表空间
  • USER是Oracle建议用户使用的表空间,可以在这这个表空间上创建跟踪对象。

  • Oracle的基本样例用户SCOTT的对象就存放在USERS表空间中。

  • 一般USERS的表空间对应的数据文件是users01.dbf

    select tablespace_name,
    file_id,
    file_name,
    round(bytes / (1024 * 1024*1024), 0) || 'G' total_space
    from dba_data_files
    order by tablespace_name;

从上面的查询结果看出来: 表空间和数据文件是一对不可分离的数据库实体。

除了Oracle系统默认创建的表空间外,用户可根据应用系统的模式及其所要存储的对象类型创建多个表空间,以区分用户数据和系统数据。 创建表空间数据数据定义语言,语法如下:

代码语言:javascript

AI代码解释

复制代码
SQL> create tablespace benet datafile'/u01/app/oracle/oradata/benet.DBF' size 10M 
autoextend on;

在语法中:

  • tablespacename是表空间名称。
  • DATAFILE指定组成表空间的一个或多个数据文件,当有多个数据文件时使用逗号进行分隔。
  • filename是表空间中数据文件的路径和名称。
  • SIZE指定文件的大小,用K指定千字节大小,用M指定兆字节大小。
  • AUTOEXTEND子句用来启动或禁用数据文件的自动扩展。若设置AUTOEXTEND��数为ON,则空间用尽会自动扩展;当设置AUTOEXTEND参数为OFF时很容易出现表空间剩余容量为0,造成数据不能存储到数据库中的情况出现。

创建完表空间之后,可以对表空间进行相应的管理,主要包括以下几种操作。

调整表空间大小,当遇到数据插入失败,表空间已满的情况,可以通过ALTER语句来调整表空间的大小,此时有两种调整表空间大小的方式。

方法一:更改数据文件的大小,并指明数据文件的存放路径,其中还使用了RESIZE关键字,用于指定调整后的数据文件的大小,代码如下:

代码语言:javascript

AI代码解释

复制代码
SQL> alter database datafile'/u01/app/oracle/oradata/benet.DBF' resize 50M;

Database altered.

方法二:向表空间内添加数据文件。为表空间添加一个新的数据文件的代码如下:

代码语言:javascript

AI代码解释

复制代码
SQL> alter tablespace benet add datafile '/u01/app/oracle/oradata/benet01.DBF' size 20M autoextend no;

Tablespace altered.

改变表空间的读写状态。当数据是历史数据,只允许查询,不希望被修改使,可以将表空间设置为只读状态。READ ONLY表示该表空间为只读状态,READ WRITE表示该表空间为可读写状态。具体语法格式如下:

代码语言:javascript

AI代码解释

复制代码
SQL> alter tablespace benet read only;  <!--修改表空间为只读-->

Tablespace altered.

SQL> alter tablespace benet read write; <!--修改表空间为可读写文件-->

Tablespace altered.

删除表空间。可以通过DROP语句来删除表空间,只需要再加上表空间的名称即可。具体语法格式如下:

代码语言:javascript

AI代码解释

复制代码
SQL> drop tablespace benet including contents;

Tablespace dropped.
(2)段

段(Segment)存在于表空间中,是一种指定类型的逻辑存储结构,段由一组区组成。段可分成四类:数据段、索引段、回退段、临时段。例如,对于每个非聚集表有一个数据段,表的所有数据存储再该段;而对于每个索引都有一个索引段。

(3)区

区(Extent)是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区由连续的数据块组成。段主要由一个或者多个区构成,当段创建后,它至少包含一个区。当段中的所有空间都完全使用时,系统将自动为该段分配一个新区。区不能跨数据文件存在,只能存在于一个数据文件中。

(4)数据块

数据块(Data Block)是数据库中最小的数据组织单位于管理单位。Oracle数据库中的数据存储于数据块中。数据块是Oracle服务器所能读取或写入的最小存储单元。Oracle服务器以数据块为单位管理数据文件的存储空间。数据块的取值范围为2~64KB,其默认大小与Oracle版本有关。

(5)模式

模式(Schema)是数据库对象(又称模式对象)的集合。模式对象包括表、视图、索引、同义词、序列、过程和程序包等。每创建一个用户,Oracle会自动创建一个与用户名相同的模式,因此,模式又称用户模式。用户登录后,默认访问的是与自己的名称相同的模式中的数据库对象。

用户管理

在创建一个新数据库时,Oracle将创建一些默认数据库用户,比如:SYS、SYSTEM等用户。SYS和SYSTEM用户都是Oracle的管理用户。如果在安装过程中选择安装示例数据库,则会自动创建HR用户,HR用户是Oracle数据库的一个示范用户,也可以根据需求导入其他示例数据库。示例数据库里面包含一些测试展示用的示例表。下面简单介绍一下SYS、SYSTEM和自定义用户。

1、SYS

SYS用户是Oracle中的一个超级用户,主要用来维护系统信息和管理实例。数据库中所有数据字典和视图都存储在SYS模式中。数据字典存储了用来管理数据库对象的所有信息,是Oracle数据库中非常重要的系统信息。SYS用户只能以SYSOPER或SYSDBA角色登录数据库系统。

2、SYSTEM

SYSTEM用户是Oracle中默认的数据库管理员,它拥有DBA权限。该用户模式中存储了Oracle管理工具使用的内部表和视图。通常通过SYSTEM用户管理Oracle数据库的用户、权限和存储等,不建议在SYSTEM模式中创建用户表。SYSTEM用户不能以SYSOPER或SYSDBA角色登录系统,只能使用以默认方式(数据库身份验证的方式)登录。

3、自定义用户

Oracle 12c支持创建自定义用户,由于PDB的引入,自定义用户范畴和之前版本有所不同。在CDB模式下,用户分为两种:公用用户和本地用户。公用用户可以在CDB和PDB中使用,而本地用户只能在PDB中使用。在CDB环境中,不允许创建本地用户。Oracle规定,在CDB中创建公用用户时,用户名必须以c##开头。

通常情况下,出于安全考虑,对于不同用户的数据表需要不同的访问权限,因此,就需要创建不同的用户。Oracle中的CREATE USER命令用于创建新用户。每个用户都有一个默认空间和一个临时表空间。如果没有指定,Oracle就将USERS设为默认表空间,将TEMP设为临时表空间。创建用户的语法如下:

1)以system用户的身份登录orcl数据库的CDB,创建用户tom,密码为123,默认表空间是users,临时表空间是temp,开启表空间限额,下次登录修改密码

代码语言:javascript

AI代码解释

复制代码
SQL> create user c##tom identified by 123 default tablespace users temporary tablespace temp quota unlimited on users password expire;

User created.
2)修改tom用户密码为123456

代码语言:javascript

AI代码解释

复制代码
SQL> alter user c##tom identified by 123456;

User altered.
3)删除不用的账户tom

代码语言:javascript

AI代码解释

复制代码
SQL> drop user c##tom cascade;

User dropped.

四、数据库权限管理

权限是执行某种类型的SQL语句挥着存取其他用户数据库对象的权力。在Oracle中,权限分为系统权限和对象权限两类。

1、系统权限

系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权限。例如,在数据库中创建表空间的权力,或者在数据库中创建表的权力,都属于系统权限。系统权限示例如下图:

常见的系统权限如下:

  • CREATE SESSION:连接到数据库;
  • CREATE TABLE:创建表;
  • CREATE VIEW:创建视图;
  • CREATE SEQUENCE:创建序列;

一个新用户创建后,首选要授予其CREATE SESSION权限,使其可以登录到数据库。

2、对象权限

对象权限是指针对某个特定的模式对象执行操作的权力。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等。如下图所示:

Oracle数据库用户有两种获取权限的途径:①直接向用户授予权限;②将权限授予角色,再将角色授予一个或多个用户。使用角色能够更加方便和高效地对权限进行管理。所以数据库管理员通过使用角色向用户授予权限,而不是直接向用户授予权限。在Oracle数据库系统中预定义了很多角色,其中最常用的主要有CONNECT角色、RESOURCE角色、DBA角色等。

Oracle中常用的系统预定义角色如下:

  • CONNECT:拥有连接数据库的权限;
  • RESOURCE:拥有创建表、触发器、过程等权限;
  • DBA:数据库管理员角色,拥有管理数据库的最高权限;一个具有DBA角色的用户可以授权任何其他用户甚至其他DBA权限,这是很危险的,因此不要轻易授予该角色;

新创建的用户必须授予一定的权限才能进行相关数据库的操作。授权通过CRANT语句,取消授权则通过REVOKE语句。

1)创建bob账户,授权和撤销授权基本操作语法示例

代码语言:javascript

AI代码解释

复制代码
SQL> alter session set container=orclpdb;  <!--切换到orclpdb数据库-->

Session altered.

SQL> create user bob identified by 123456;  <!--创建账户bob-->

User created.

SQL> grant connect,resource to bob;  
<!--授权bob用户拥有连接数据库和创建表、触发器、过程等权限-->

Grant succeeded.

SQL> revoke connect,resource from bob;  <!--撤销授权-->

Revoke succeeded.

数据库用户安全设计原则如下:

  • 数据库用户去哪先按照最小分配原则;
  • 数据库用户可分为管理、应用、维护、备份四类用户;
  • 不允许使用sys和system用户建立数据库应用对象;
  • 禁止对普通用户授予dba权限;
  • 对查询用户只能开放查询权限;
  • 对新建用户初次登录数据库时强制修改密码;

一般程序开发人员只要授予 CONNECT和RESOURCE两个角色即可。特别注意,授予这两个角色就包含了授予用户无限制使用默认表空间的权限。

相关推荐
2301_766283442 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
y = xⁿ2 小时前
Redis八股学习日记:布隆过滤器
数据库·redis·学习
悟纤2 小时前
Seedance 2.0 API 文生视频 |支持100并发 | [灵龙AI API]
数据库·文生视频·seedance 2.0
czlczl200209252 小时前
MySQL 性能优化:前缀索引(Prefix Index)深度解析
数据库·mysql·性能优化
逍遥德2 小时前
SpringBoot数据库连接池HikariCP,Druid,Tomcat JDBC,DBCP2,c3p0配置使用
数据库·spring boot·tomcat
小菜同学爱学习3 小时前
第一章 初识达梦数据库:基础认知与环境准备
数据库·达梦
zhoutongsheng3 小时前
如何解决ORA-01078参数文件错误_pfile与spfile互相创建恢复
jvm·数据库·python
m0_716255003 小时前
批处理一道例题+答案解析+批处理知识点总结 | 批处理高频易错场景 + 正确写法对照表
数据库·oracle
2401_824222693 小时前
HTML怎么标注字数限制提示_HTML实时字数统计占位【详解】
jvm·数据库·python