Oracle体系结构
数据库文件组成
0 速览
1.数据文件
2 控制文件
3 联机重做日志文件
4 参数文件
5 归档重做日志文件
6 诊断文件
1)参数文件(启动实例-内存)
参数文件的作用
用来生产实例
实例启动时会读这个spfile文件,根据其中的参数生产实例
Oracle会根据参数文件向操作系统申请内存,然后会启动一堆进程
指向控制文件
参数文件的位置
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /opt/oracle/product/12.2.0.1/dbhome_1/dbs/spfiledev101.ora
参数文件的内容
[oracle@txy dbs]$ strings spfiletxydb.ora
txydb.__data_transfer_cache_size=0
txydb.__db_cache_size=268435456
txydb.__inmemory_ext_roarea=0
txydb.__inmemory_ext_rwarea=0
txydb.__java_pool_size=16777216
txydb.__large_pool_size=33554432
txydb.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
txydb.__pga_aggregate_target=536870912
txydb.__sga_target=1023410176
txydb.__shared_io_pool_size=50331648
txydb.__shared_pool_size=603979776
txydb.__streams_pool_size=33554432
*.audit_file_dest='/opt/oracle/admin/txydb/adump'
udit_trail='db'
*.compatible='12.2.0'
*.control_files='/opt/oracle/oradata/txydb/control01.ctl','/opt/oracle/oradata/txydb/control02.ctl'
*.db_block_size=8192
*.db_name='txydb'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=txydbXDB)'
*.enable_pluggable_database=true
*.local_listener='LISTENER_TXYDB'
*.memory_target=1476m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tables
pace='UNDOTBS1'
具体内容
*.control_files= ##一个或多个控制文件的绝对路径
db_files ##数据文件的最大数量
*.processes=300 ##server_processs的最大数量
db_block_size
有两种参数文件
静态参数文件(pfile)和动态参数文件(spfile)
SPFILE: 格式 SPFILE+<ORACLE_SID>.ora 二进制文件
PFILE: 格式 init+<ORACLE_SID>/init.ora 普通文本文件
两种文件相互创建
[oracle@orcl19c dbs]$ rm -rf spfileorcl19c.ora
##shutdown immediate
##再次启动
SQL> startup;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/19c/dbhome_1/dbs/initorcl19c.ora'
##报错了是吧?
删除了 sp
2)控制文件(指向数据文件)
每个数据库都只有一个控制文件(但可以有多个副本)
控制文件的作用
指向数据文件的位置与redo文件位置;
存储维护数据库完成性的信息:序列号与时间戳。使用RMAN备份,控制文件将存储这些备份的信息。
控制文件的内容
[oracle@test101 dev101]$ strings control01.ctl
}|{z
;DEV101
WBDEV101
WBDEV101
dev101
dev101
/opt/oracle/oradata/dev101/redo03.log
/opt/oracle/oradata/dev101/redo02.log
/opt/oracle/oradata/dev101/redo01.log
/opt/oracle/oradata/dev101/users01.dbf
/opt/oracle/oradata/dev101/undotbs01.dbf
/opt/oracle/oradata/dev101/system01.dbf
/opt/oracle/oradata/dev101/sysaux01.dbf
/opt/oracle/oradata/dev101/temp01.dbf
/opt/oracle/oradata/dev101/ss_data01.dbf
/opt/oracle/oradata/dev101/redo03.log
/opt/oracle/oradata/dev101/redo02.log
/opt/oracle/oradata/dev101/redo01.log
/opt/oracle/oradata/dev101/users01.dbf
/opt/oracle/oradata/dev101/undotbs01.dbf
/opt/oracle/oradata/dev101/system01.dbf
/opt/oracle/oradata/dev101/sysaux01.dbf
/opt/oracle/oradata/dev101/temp01.dbf
/opt/oracle/oradata/dev101/ss_data01.dbf
SYSAUX
SYSTEM
UNDOTBS1
USERS
3)联机重做日志文件
首先解释术语
联机重做日志 重做日志 在线日志 是一样的
另外一种日志:归档日志文件,就是在线日志文件的历史备份
它是联机的(正在使用中)
每个数据库至少有两个联机重做日志文件。
数据库至少有两个组,组内每个文件称为一个成员,每组至少一个成员在运行。
文件内容
存储着数据库的变更向量(不仅仅是DML DDL这些操作),若数据库受损则可以使用这些文件,将它们回复到发生故障那一刻前的状态。
日志组
为什么需要两个组呢?
一个组正在接受更改,另一个组用于备份(即进行归档)
因为日志是不停记录着的,所以
内存组成
内存基本结构
SGA PGA UGA(这个比较小) 软件代码区
SGA包含:
必须存在的:
高速缓存
日志缓冲区
共享池
可能包含的:
大池 JAVA池 流池 其他缓存池
SGA 与 PGA
SGA是共享的。
PGA是非共享的内存区域
启动时间
当实例启动时分配SGA
当server process启动时分配PGA
1)数据缓冲区缓冲
database buffer cache SGA中最大的一部分
缓存的作用
是Oracle执行SQL的区域。存数据块的拷贝信息
从数据文件没读一次到buffer cacha 就有一次IO
减少物理读(物理读:从数据文件里读),如果buffer cahe有的话就从内存里取,就不用IO了
数据块
数据文件中数据块是8k大小,读取到buffer中也是8k
2)重做日志缓冲
是一个循环写的缓冲区
作用:存储改变信息,
执行delete语句的时候,会先生成一条redo log,会先放在redo log buffer里
commit的时候,才会写到 redo log(文件)里
3)共享池
share pool
作用
语法分析,编译,生产执行计划,运行执行计划。
共享,就是保存共享的执行计划
PGA的内容
包含单个服务器进程所需的数据与控制信息。比如每个人session传入的sql绑定变量,如果session进行了排序或者hash链接操作,也会使用PGA中的内存。
进程组成
有哪些进程
Oracle实例有一下几种不同的进程:
1 客户端进程 client process(也叫用户进程,因为是在客户端的)
2 ORACLE 进程
后台进程 background process
服务器进程 server process
从属进程
每个server p 都有自己的PGA
会话是怎么产生的?
会话(session)就是user process 与 server process 连接产生的
session的信息保存在 PGA 的uga 中
服务器进程 server process
作用:用来处理客户端发出的请求。客户端进程总是通过单独的服务器进程与数据库通信。
如果有20个客户端进程连接到实例,就有20个server process提供服务
执行的任务:
解析SQL
执行PL/SQL
从数据文件中读取数据块读入进buffer cache
返回结果信息
注意:不仅仅user process会产生
后台进程
后台进程
查看后台进程
select pname,program from v$process
where pname is not null
PNAME PROGRAM
----- ------------------------------------------------
PMON oracle@txy.example.com (PMON)
CLMN oracle@txy.example.com (CLMN)
PSP0 oracle@txy.example.com (PSP0)
VKTM oracle@txy.example.com (VKTM)
GEN0 oracle@txy.example.com (GEN0)
MMAN oracle@txy.example.com (MMAN)
RECO oracle@txy.example.com (RECO)
GEN1 oracle@txy.example.com (GEN1)
SCMN oracle@txy.example.com (SCMN)
DIAG oracle@txy.example.com (DIAG)
OFSD oracle@txy.example.com (OFSD)
SCMN oracle@txy.example.com (SCMN)
DBRM oracle@txy.example.com (DBRM)
VKRM oracle@txy.example.com (VKRM)
SVCB oracle@txy.example.com (SVCB)
PMAN oracle@txy.example.com (PMAN)
DIA0 oracle@txy.example.com (DIA0)
DBW0 oracle@txy.example.com (DBW0)
LGWR oracle@txy.example.com (LGWR)
CKPT oracle@txy.example.com (CKPT)
PNAME PROGRAM
----- ------------------------------------------------
LG00 oracle@txy.example.com (LG00)
SMON oracle@txy.example.com (SMON)
LG01 oracle@txy.example.com (LG01)
SMCO oracle@txy.example.com (SMCO)
W004 oracle@txy.example.com (W004)
LREG oracle@txy.example.com (LREG)
PXMN oracle@txy.example.com (PXMN)
MMNL oracle@txy.example.com (MMNL)
MMON oracle@txy.example.com (MMON)
D000 oracle@txy.example.com (D000)
S000 oracle@txy.example.com (S000)
TMON oracle@txy.example.com (TMON)
QM02 oracle@txy.example.com (QM02)
TT00 oracle@txy.example.com (TT00)
TT01 oracle@txy.example.com (TT01)
TT02 oracle@txy.example.com (TT02)
AQPC oracle@txy.example.com (AQPC)
CJQ0 oracle@txy.example.com (CJQ0)
P000 oracle@txy.example.com (P000)
P001 oracle@txy.example.com (P001)
P002 oracle@txy.example.com (P002)
PNAME PROGRAM
----- ------------------------------------------------
P003 oracle@txy.example.com (P003)
P004 oracle@txy.example.com (P004)
P005 oracle@txy.example.com (P005)
P006 oracle@txy.example.com (P006)
P007 oracle@txy.example.com (P007)
W003 oracle@txy.example.com (W003)
Q002 oracle@txy.example.com (Q002)
Q003 oracle@txy.example.com (Q003)
W000 oracle@txy.example.com (W000)
W006 oracle@txy.example.com (W006)
51 rows selected
1)LGWR
LGWR()
2)PMON
process monitor process ,进程监视器进程
1 监视其他的后台进程,异常时执行进程回复
2 清理buffer cache
3 将实例注册到Oracle Net Listener
数据库的启动
shutdown -> no mount -> mount -> open
快速浏览
1)no mount 启动实例
由此可知参数文件的作用
1、搜索并读取参数文件(spfing_
2、分配SGA
3、启动后台进程
4、启动警报与追踪文件
--若nomount启动
select * from v$datafile;
--会什么都没找到
alter database mount;
select * from v$datafile;
2)mount 装载
关联实例与数据库文件
控制文件已经打开了,但是用户信息不能查看
读取控制文件并获取数据文件与重做日志文件
只是获取文件而已,并不检查文件检查存在于有效性
这时候普通用户会这样
SQL> conn sim/11111111;'
ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Process ID: 0
Session ID: 0 Serial number: 0
但是
select * from hr.employess; --这样是查不到的
3)open
任何有效的用户可以
1 打开数据文件
2 打开重做日志
3 检查数据库一致性(可以做CRUD了)
其他打开方式
startup nomount:通过参数文件,分配sga,启动数据库后台进程,不打开控制文件和数据文件,不能访问数据库。
startup mount:仅给dba进行管理操作,不允许数据库用户访问。仅当前实例的控制文件被打开,数据文件未打开,在这个模式下可以进行如下操作:重命名数据文件、添加取消或重命名重做日志文件、设置归档模式、设置闪回、执行完整的数据库恢复操作等。
startup open:startup的默认参数就是open,打开数据库,允许数据库的访问,当前实例控制文件中所描述的所有文件都已经打开。
startup pfile=FILENAME:以FILENAME为初始化文件启动数据库,不是采用默认初始化文件。
startup force:中止当前数据库的运行,并开始重新正常的启动数据库。
startup restrict:只允许具有restricted session权限的用户访问数据库,该模式下登陆者可做如下操作:执行数据库数据的导出或导入、执行数据装载操作用SQL*Loader、暂时阻止一般的用户使用数据、在某个移植过程和升级操作过程中restricted session登陆后可使用ALTER SYSTEM 语句来禁止RESTRICTED SESSION特性ALTER SYSTEM DISABLE RESTRICTED SESSION;如果是在非受限模式下打开的数据库,后来发现需要限制访问,此时可以使用带ENABLE RESTRICTED SESSION 子句的ALTER SYSTEM 语句来完成。
startup recover:数据库启动,并开始介质恢复。
数据库的关闭
A = ABORT 强制
I
T
N
物理文件
段
一个段可以分布在多个数据文件中,一个数据文件可以包含多个段的一部分或全部分
这带来很多好处:
1.如果一个段就是一个数据文件,将会产生数千数万的文件
2.不受操作系统文件大小的限制
① 段的存在,并不是依赖于表的。建立一些其它逻辑对象也会会创建段,如索引、物化视图
② 一张普通表(堆组织表)对应一个段
③ 表的建立,并不意味着段的创建,如临时表(Global Temporary Table)
④ 一张表也可以创建多个段,如分区表(Partition Table)
⑤ 多个表也可以共存于一个段,如簇表(Cluster Table
典型的段是表(Table),但也有其他类型的段
2 块
数据文件就是连续编号的Oracle块,
3 区
管理一个个块是比较麻烦的,所以块组合成了区间(extend)
区间是数据文件中一组连续编号的块
LONG TIME 问题、
1 ) 数据库有哪些文件?这些文件有什么作用?
参数文件
2)数据库启动的过程
nomout : 打开实力,加载参数文件
mount : 加载数据文件吗,挂载数据库
*