博文结构
Oracle数据库体系结构
Oracle物理结构
Oracle逻辑结构
Oracle内存结构
Oracle进程结构
创建用户并授权
一.oracle体系结构概述
- Orcale体系结构
Oracle体系结构包含一系列组件。 如图显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件 和归档日志文件等.
从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的
两个概念, DBA -个很重要的工作就是维护实例和数据库本身的正常工作。
-
1.实例
Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle 实
例启动时,将分配- -个系统全局区(SGA) 并启动一系列Oracle后台进程。Oracle 实例有两种类型:
单进程实例和多进程实例。单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下
的Oracle实例仅允许- -个用户可存取。多进程Oracle实例(又称多用户Oracle)使用多个进程来执行
Oracle的不同部分,对于每个连接的用户都有一个进程。 - 2.数据库
数据库是数据的集合,物理上是指存储数据库信息的一组操作系统文件,每个数据库有-个逻
辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件.主要由三种类型文件组成:
数据文件、控制文件和重做日志文件。数据库的逻辑结构是指数据库数据的逻辑存储结构(如表空
间、段等)和模式对象(如表、 视图等)。
- 3.可插拔数据库
从Oracle 12c 版本开始. Oracle 引入了可插拔数据库的概念,可插拔是为云计算而生。可插拔的结构由-个容器数据库(Container Database, CDB) 和若干个可组装数据库(Pluggable Database,
PDB) 组成,每个PDB对外可充当一个独立的数据库供应用程序使用,它可以包含自己的数据文件,但是所有的PDB共享CDB的控制文件以及日志文件。所谓的可插拔.意味着PDB可以像USB一样随
时插入CDB中,不用了也可以随时拔下来
-
Oracle服务器
Oracle服务器也是非常重要的概念,它主要由实例和数据库文件组成,也就是我们常说的数据库管理系统(Database Management System ,DBMS)。Oracle 服务器的组成如图。
-
Oracle存储结构
Oracle的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系,
如图:
1.物理结构主要描述Oracle数据库的外部存储结构,即在操作系统中如何组织、管理数据。
2.逻辑结构主要描述Oracle数据库的内部存储结构,即从逻辑概念上描述在Oracle数据库中如何
组织、管理数据。
-
1.物理结构
物理结构是Oracle 数据库创建后使用的操作系统物理文件,Oracle 数据库的物理文件分为以下
主要文件
数据文件
日志文件
控制文件
-
2.逻辑结构
数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle 数据库的逻辑结构包括表空间、段.区.块和模式等,
如图所示。
(1)表空间
每个Oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以有多个数据文件,但- -个数据文件只能属于一个表空间。与数据文件这种物理结构不同,表空间属于数据库的逻辑结构。
分为三类:
1.永久性表空间
2.临时性表空间
3.撤销表空间
- 分别介绍SYSTEM表空间、SYSAUX表空间、USERS表空间和TEMP表空间。
(1) SYSTEM表空间:用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表、索引等对象存放到SYSTEM表空间中。
(2) SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具(如企业管理器.StatsPack. LogMiner 等)用到的数据:还用于存放各模式的对象数据.如智能代理用户DBSNMP等,这些模式在数据库安装完成后就建立了相应的对象并都存放在SYSAUX表空间中。
(3) USERS 表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表,索引等。
(4) TEVP表空间: Oracle 系统用于存放临时数据的特殊表空间。例如.当操作中需要进行排序时,Oracle 系统就将排序的数据临时存放在该表空间内。排序处理完成后即可释放排序数据所占用
的空间,因此称之为临时表空间。
-
Oracle内存结构
内存结构是Oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要 素Oracle内存存储的主要内容如下:
程序代码(PL/SQL. Java)。
已经连接的会话的相关信息,包括当前所有活动会话和非活动会话。
程序运行时必需的相关信息,如查询计划。
Oracle进程之间通信和共享的信息,如锁。
按照内存使用方法的不同, Oracle数据库的内存又可以分为SGA. PGA和UGA (User Global Area,
用户全局区)。
SGA:所有用户都可以访问的实例的共享内存区域。数据块、事务处理日志、数据字典信息等
都存储在SGA中。
PGA:一类非共享的内存,专用于特定的服务器进程,并且只能够由这个进程访问。
UGA:为用户进程存储会话状态的内存区域。根据用户数据库是配置为专用服务器模式,还是配置为共享服务器模式,UGA可以作为SGA或者PGA的一部分。它为用户会话存储数据。
-
分别介绍SGA与PGA
-
1.SGA
Oracle实例的SGA用来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时, SGA的内存被自动分配。SGA 是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。SGA按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和Java池等。 - (1)共享池
共享池是对SQL. PL/SQL 程序进行语法分析.编译、执行时用到的内存区域。共享池由库缓存和数据字典缓存组成。
库缓存含有最近执行的SQL. PL/SQL 语句的分析码和执行计划。
数据字典缓存含有从数据字典中得到的表、索引、列定义、权限信息和其他一些数据库对
象的定义。如果Oracle缓存了这些信息,那么无疑是缩短了查询的响应时间。
-
(2)数据缓冲区
数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改数据时,首先要从
数据文件中取出数据,存储于数据缓冲区中。修改的数据、插入的数据都被存储于数据缓冲区中,
修改完成和其他条件满足时,数据才被写入数据文件中。 -
(3)重做日志缓冲区
当用户执行了如INSERT. UPDATE. DELETE.、CREATE. ALTER或DROP 等操作后,数据发生了变化,这些变化了的数据在写入数据缓存之前先要写入重做日志缓冲区,同时变化之前的数据也放入
重做日志缓存,这样在数据恢复时Oracle 就知道哪些资源需要提交,哪些资源需要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较小。 -
(4)大池
在SGA中,大池是一个可选的缓冲区,管理员可以根据需要对其进行配置。在大规模输入、输出及备份过程中也需要大池作为缓存空间,如大数据操作、数据库备份与恢复之类的操作。 -
(5)Java池
在SGA中,Java池也是-个可选的缓冲区.但是在安装Java或者使用Java程序时必须设置Java池,用于编译Java语言编写的指令。 -
2.PGA
PGA不是实例的一部分,它包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA是在用户进程连接到数据库并创建-个会话时自动分配的,该区内保留了每个与Oracle 数据库连接的用户进程所需的内存。在一个用户会话结束后, PGA将释放。 -
Oracle进程结构
Oracle中有几种不同类型的进程:用户进程、服务器进程、后台进程。
用户进程:在数据库用户请求连接Oracle 服务器时启动,
服务器进程:在用户建立会话并连接Oracle 实例时启动,
后台进程:在Oracle实例启动时启动。
- 1.PMON进程
PMON进程在用户连接意外中断后执行资源清理工作,包括下列任务:
?释放所有当前挂起的锁。
?回滚用户当前事务处理。
?释放用户当前使用的资源。
?监控服务器进程和其他后台进程,出现故障时重启它们。
- 2.SMON进程
在实例启动时执行实例恢复。 实例恢复包括三个步骤:
(1) 前滚以恢复未写入数据文件但已记入联机日志文件的数据:
(2) 打开数据库,以便用户能登录并访问数据;
(3) 回滚未提交的事务处理。
整理数据文件的*空间。
释放不再使用的临时段。
-
3.DBWR
管理数据缓冲区,以便能找到空闲的缓冲区读入数据文件的数据。
将所有修改后的缓冲区数据写入数据文件。
使用LRU (Least Recently Used,最近最少使用)算法将最近使用过的块保留在内存中。通过延迟写来优化磁盘l/0读写。 -
4.LGWR
LGWR进程负责将重做日志缓冲区中的日志数据写入日志文件组。数据库在运行时,如果对数据进行修改,则产生日志信息,日志信息首先产生于重做日志缓冲区中。此缓冲区按照“先进 先出”的原则进行操作,当日志信息满足一定条件时,由LGWR进程将日志数据写入日志文件。系统通常有多个日志文件,日志写入进程以循环的方式将数据写入文件。 -
5.CKPT
CKPT进程是确保数据缓冲区中所有修改过的数据块都写入数据文件的机制。当检查点完成后,CKPT进程负责更新数据文件头和控制文件,保存检查点信息,以保证数据库日志文件和数据文件同步。在数据库恢复时只需要找到CKPT保存的最后一次检查点, 就可以根据它确定在日志文件中恢复数据的开始位置,然后重新执行其之后的日志记录即可。 - 6.ARCn
ARCn进程即归档日志进程,是一个可选进程,只有在打开日志归档时才有该进程。该进程的主要作用是发生日志切换时将写满的联机日志文件复制到归档目录。
二.用户管理
在创建一个新数据库时,Oracle 将创建一些默认数据库用户, 如SYS. SYSTEM 等用户。SYS和SYSTEM用户都是Oracle的管理用户。如果在安装过程中选择安装示例数据库,则会自动创建HR用.
户, HR用户是Oracle 数据库的一个示范用户,也可以根据需求导入其他示例数据库。
-
用户分为三种
-
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模式下,用户分为两种.分别是公用用户(Common User) 和本地用户(Local User) ,公用用户
可以在CDB及PDB中使用,而本地用户只能存在于PDB中。在CDB环境中,不允许创建本地用户。Oracle规定,在CDB中创建公用用户时,用户名必须以c##开头。 -
数据库权限管理
权限是执行某种类型的SQL语句或者存取其他用户数据库对象的权力。在Oracle中,权限分为系统权限与对象权限两类。 -
1.系统权限
系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权力。 - 常见的系统权限如下。
?CREATE SESSION:连接到数据库。
?CREATE TABLE: 创建表.
?CREATE VIEW:创建视图。
?CREATE SEQUENCE: 创建序列。
-
2.对象权限
对象权限是指针对某个特定的模式对象执行操作的权力。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等,
Oracle中常用的系统预定义角色如下
CONNECT: 拥有连接数据库的权限,
RESOURCE: 拥有创建表、触发器、过程等权限。
DBA. 数据库管理员角色,拥有管理数据库的最高权限。-个具有DBA角色的用户可以授权任何其他用户甚至其他DBA权限,这是很危险的,因此不要轻易授予该角色。新创建的用户必须授予- -定的权限才能进行相关数据库操作。授权通过GRANT语句,取消授权则通过REVOKE语句
三.案例
1.解决sqlplus方向键问题(可以上下左右按键)
[[email protected] /]# yum -y install ncurses* readline*
[[email protected] /]# cd /media/
[[email protected] media]# ls
rlwrap-0.30.tar.gz sqlplus方向键问题.txt
[[email protected] media]# tar zxf rlwrap-0.30.tar.gz -C /usr/src/
[[email protected] media]# cd /usr/src/
[[email protected] src]# ls
debug kernels rlwrap-0.30
[[email protected] src]# cd rlwrap-0.30/
[[email protected] rlwrap-0.30]# ./configure && make && make install
[[email protected] rlwrap-0.30]# vim /home/oracle/.bash_profile
alias sqlplus=‘rlwrap sqlplus‘
- 创建一个自动增长表空间qq
[[email protected] ~]$ su - oracle
[[email protected] ~]$ sqlplus / as sysdba
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 1593835520 bytes
Fixed Size 8793256 bytes
Variable Size 1023411032 bytes
Database Buffers 553648128 bytes
Redo Buffers 7983104 bytes
数据库装载完毕。
数据库已经打开。
SQL> create tablespace qq
2 datafile ‘/u01/app/oracle/oradata/qq01.dbf‘
3 size 10M autoextend on;
表空间已创建。
- 更改数据文件大小
SQL> alter database datafile
2 ‘/u01/app/oracle/oradata/qq01.dbf‘
3 resize 80M;
数据库已更改。
- 向表空间添加数据文件
SQL> alter tablespace qq
2 add datafile ‘/u01/app/oracle/oradata/orcl/qq02.dbf‘
3 size 20M autoextend on;
表空间已更改。
- 删除表空间
SQL> drop tablespace qq including contents;
表空间已删除。
- 查看系统中有杜鳌少个数据文件
SQL> select FILE_NAME from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
- 查看表空间
SQL> select name from v$tablespace;
NAME
--------------------------------------------------------------------------------
SYSAUX
SYSTEM
UNDOTBS1
USERS
TEMP
- 二.CDB与PDB的基本操作
1.先启动数据库
2.查询数据库的所有容器
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
3.查询当前所在的容器
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED
4.CDB下修改可插拔库orclpdb为打开状态
SQL> alter pluggable database orclpdb open;
插接式数据库已变更。
5.在CDB下切换会话到PDB中
SQL> alter session set container=orclpdb;
会话已更改。
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB
6.在PDB中关闭与开启可插拔数据库
SQL> shutdown immediate
插接式数据库已关闭。
SQL> startup
插接式数据库已打开。
7.切换会话到CDB中
SQL> alter session set container=cdb$root;
会话已更改。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
- 三.用户管理
1.先创建表空间
SQL> create tablespace yy
2 datafile ‘/u01/app/oracle/oradata/orcl/yy01.dbf‘
3 size 10M autoextend on;
表空间已创建。
2.在数据库的CDB模式下,创建C##zhangsan的用户
SQL> create user c##zhangsan \用户名
2 identified by pwd123 \密码
3 default tablespace yy \默认表空间
4 temporary tablespace temp
5 quota unlimited on yy
6 password expire; \第一次登陆需要修改密码
用户已创建。
- 授予c##zhangsan用户的connect和resource俩角色
SQL> grant connect,resource to c##zhangsan;
授权成功。
- 验证权限
SQL> conn c##zhangsan/pwd123
ERROR:
ORA-28001: 口令已经失效
更改 c##zhangsan 的口令
新口令:******
重新键入新口令:******
口令已更改
已连接。
SQL> create table benet(id int,name varchar(10))
2 ;
表已创建。
SQL> insert into benet values (1,‘tom‘);
已创建 1 行。
SQL> select * from benet;
ID NAME
---------- ------------------------------
1 tom
- 用sys用户登陆,撤销c##zhangsan的权限
SQL> revoke connect,resource from c##zhangsan
- 删除c##zhangsan用户
SQL> drop user c##zhangsan cascade;
-
导入测试数据
在Oracle 12c以前的版本中,安装完成之后默认会scott用户,该用户模式下存放了用于测试的表,而Oracle 12c安装完成之后默认没有scott用户。为了以后测试方便,下面介绍如何在Oracle 12c中导入测试数据的方法。
下载test.sql脚本,然后执行以下操作:
[[email protected] ~]$ ll //准备脚本测试文件
总用量 8
-rw-r--r-- 1 oracle oinstall 7658 6月 15 2017 test.sql
[[email protected] ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 17:19:15 2019
Copyright (c) 1982, 2016, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create user c##scott identified by scott default tablespace users temporary tablespace temp quota unlimited on users;
//创建用户c##scott
用户已创建。
SQL> grant connect,resource to c##scott; //用户授权
授权成功。
SQL> @test.sql //导入脚本文件,不带路径表示当前目录下
………………………… //创建过程省略
SQL> conn c##scott/scott; //切换用户c##scott
已连接。
SQL> show user; //查看当前用户
USER 为 "C##SCOTT"
SQL> col tname for a10; //格式化输出,让一行中显示所有的列,调整tname列的宽度为10
SQL> select * from tab; //查询当前用户下的所有的表
TNAME TABTYPE CLUSTERID
---------- --------------------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
SQL> desc emp; //查询emp表的结构
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> col empno for 9999; //格式化输出,empno列为数字,9999代表宽度为4
SQL> select * from emp; //根据实际情况,自行修改,怎么好看怎么来
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALES 7698 20-2月 -81 1600 300 30
MAN
7521 WARD SALES 7698 22-2月 -81 1250 500 30
MAN
7566 JONES MANAG 7839 02-4月 -81 2975 20
ER
7654 MARTI SALES 7698 28-9月 -81 1250 1400 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
N MAN
7698 BLAKE MANAG 7839 01-5月 -81 2850 30
ER
7782 CLARK MANAG 7839 09-6月 -81 2450 10
ER
7788 SCOTT ANALY 7566 19-4月 -87 3000 20
ST
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
7839 KING PRESI 17-11月-81 5000 10
DENT
7844 TURNE SALES 7698 08-9月 -81 1500 0 30
R MAN
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALY 7566 03-12月-81 3000 20
ST
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
7934 MILLE CLERK 7782 23-1月 -82 1300 10
R
已选择 14 行。
SQL> select * from c##scott.emp; //如果使用的是非c##scott用户,需要指定用户.表名