Oracle系统基础
开篇一句话,数据库都是对日志的关心远超于对磁盘数据的关心,缓存日志纪录的是数据时时的变化情况,对于已经落盘的数据,重要性远没有还在日志中变化的数据来的重要,即便是数据库down了,落盘的数据都能追回,而缓存的数据可能会丢失导致数据无法保证一致性,所以开发数据库要重点关心动态的日志文件。
掌握的术语:
alter log 警告日志、archived redo log 归档重做日志、backup controlfile 备份控制文件、block 块、checkpoint 检查点、database 数据库、database consistency 数据库一致性、database controlfile 数据库控制文件、database parameter file 数据量参数文件、database file 数据库数据文件、flash recovery area 闪回恢复区、granule 区组、instance 实列、online redo log 联机重做日志、process 进程、redo 重做、schema 空间、system global area 系统全局区、system change number 系统更改号、tablespace 表空间、trace file 跟踪文件
数据库启动startup的时候会有三个过程:
在以上三个过程中,我们加上限定条件,会产生不一样的启动方式,如:
数据库关闭,shutdown:
数据大致流向:
数据写入 -----------> system global area 系统全局缓存区 ---------->LGWR进程开始写入数据到联机重做日志redo log ,同时在Undo log里面写入历史数据(内存读磁盘写)------------>ARCH进程写入到归档日志archive log(磁盘读磁盘写)---------->DBWN 进程写入到磁盘------->落到磁盘持久化
可以看出如果频繁的DML操作,LGWR进程会比ARCH进程块,可能会产生冲突,所以可以相应的对ARC的线程数进行相关调整,这是一个系统级别的优化点
在DML运行阶段,实际数据已经发生了变化,比如insert、delete、update操作,即使没有手动提交,只要运行了,在系统全局区数据已经改变且会给到redo log进行写入,同时在Undo log里面会纪录一条操作前的数据,如果在这时候进行select查询操作,实际上select查询的数据不是查询的磁盘数据,而是先去undo log里面查数据给到用户。如果用户commit之前的dml操作,Undo log里面纪录的历史数据会被删除掉,用户再执行select操作的时候,会先去undo log查询是否有数据,没有则去redo log查询,redo log如果落盘了,最后进程会去磁盘进行查询。
所以,不能在PLSQL工具的SQL窗口大批量的进行update和delete操作,因为在没有commit期间,Undo log会持续的纪录这些数据的历史状态,如果有10万条update,Undo log会纪录10万条书籍,那么往往会超过Undo log文件的大小限制,会直接报错不允许操作。
必需知道参数:
1、进程,在启动过程1中,Oracle会在system global area创建一个内城区,然后实列就启动了,这里有5个基础进程:PMON 监控进程的进程、SMON 系统监控进程、
DBWN 写入数据库进程、LGWR 写入日志进程、CKPT 检查点进程;很容易理解,数据库最重要的就是日志的变化,所以后面几个都是为了数据服务的进程,而第一个和第二个就是监控进程的进程。
以上是五个基础进程,对于RMAN来说还有一个ARCH进程,这是开了归档模式的进程,用于备份和恢复的必要进程,归档模式建议打开,基本上也算常用进程。
2、内存,所有的进程都需要使用内存,基本内存区域就是SGA,当然也有私有的全局区(private global area)PGA。
SGA是一个块很大的共享内存分配区,里面分为:
Database buffer cache 数据库缓存区
Shared pool 共享池
Redo log buffer 重做日志缓存区
Large pool 大池
Java pool Java池
Streams pool 流池
RMAN常用的是shared pool 和large pool。Large pool除非有特殊配置,默认不使用的。
3、数据库
数据库是由许多不同的物理结构和逻辑结构构成的,物理结构组建包含有:
数据库数据文件:每一个数据文件都有一个数据头文件,CKPT线程会更新维护这个头文件来反映数据的当前状态,不过这个头文件在表结构中是看不到的。
联机重做日志:就是redo log
归档重做日志:archive log
数据库控制文件:controlfile,放了数据库控制信息和Rman的控制信息,也包含检查点SCN的信息
Oracle表空间:这是物理和逻辑并存的结构,存储数据、表、索引等
闪回日志:历史数据存放点
自动存储管理:管理Oracle磁盘操作的文件
以上的物理结构都是独立的文件形式存在于磁盘上的,在磁盘上相当于对应了物理实体,占用磁盘扇区。
重点日志:
作用:
重做日志纪录了Oracle数据库所有发生的变化。
联机重做日志:
任何Oracle的操作都会被LGWR线程写到联机重做日志中,这个动作叫做redo,产生的日志文件我们称之为redo log,这里的数据变化,是顺序写入的,即同一条数据变化是串行的。
Redo log 特点:
1、日志文件大小固定,可以自行设定大小。
2、日子文件大小确定后,可以设定多份redo log,在第一份写满的时候,会自动串行切换到第二份,同理串行切换到第三份,这个动作称为log switch。如果所有的redo log都被写满了而导致无法写入新的数据,LGWR将会等待直到有空余的redo log后再执行写入操作,所以这里也可以参考作为性能优化点,对于redo log的分数和单份大小设定需要根据实际情况来,一般切换时间不能超过半小时也不能太短,由于可以在线后期变更,所以可以好好的测试决定。
3、如果是RAC集群模式,redo log将会有联机重做日志组,每个实列都会把redo 写入到自己的重做日志组中,组中redo将会有几个状态:current 正在使用、active 当前组中没有该日志,等待ARCH进程复制、inactive 已被归档、unused 正在被Oracle使用
由于redo log非常的重要,建议给他做一个集群模式,把日志多做几个副本放在不同的物理位置。
归档重做日志:
处理归档模式下的一个重要日志,我们一般都会开启归档模式,所以当作常用重要日志纪录。
和redo log相似,由ARCH 线程纪录产生的日志文件,我们成为arch log,主要用于日志信息归档纪录,写入方式也是串行。
Arch log 特点:
1、由ARCH线程写入,ARCH线程接受LGWR线程调用,即当LGWR写满redo log后,将会调用ARCH线程进程读取redo log进行数据写入到arch log。LGWR线程至少要等到一个ARCH线程写完才能重用相关的redo log。这里也可以是一个Oracle系统优化点,当使用Oracle命令resetlogs恢复数据时,redo log在写入期间未归档的数据,即使没有写满也会先进行强制归档写入到arch log中。
常用redo log 命令:
增加日志文件或者删除:
Alter database add logfile group4 ‘磁盘位置’ size 100M;新增一个组号为4的100m大小的redo log
查看日志文件结果:
Select group#,sequence#,bytes,members from v$log where group#4;
上边已经描述了许多归档模式的情况,这里单独区分一下。
Oracle运行的时候有两种模式可选:
如果在noarchive模式下运行Oracle,不会有archive log文件,即不会有归档文件。没有这个文件就无法解耦数据库备份,即不能实现联机备份(热备份),即使全备也要停机备份,无法增备,同时也不提供时间点恢复操作。
使用archive模式,即归档模式运行,将会产生arch log,由arch 线程对 arch log进行管理,支持Oracle热备和按时间点恢复。当然打开archive模式后不是只打开开关就行了,还需要对arch 线程进行相关配置,并且指定arch log相关目录,在打开archive模式后,所有的redo log写入完,不会立即释放,而会挂起等待arch log日志写入完成,所以错误的配置arch线程会导致redo log的错误,从而引发整个数据库错误。
Oracle的三个启动顺序具体做的是什么呢?
启动命令执行后,回去检测Oracle参数文件,获取实列锁确认实列还未启动,之后按参数文件启动各大必要线程和配置的必要线程,如LGWR线程和ARCH线程,并且占用内存分配全局内存区(SGA),最后向用户报告启动了实列并且占用了多大的内存。
这个节点Oracle会打开database control file数据库控制文件,解析文件内容并为打开这些文件做好准备,由于是control file而不是data file,所以数据库不会去判断data file是否真的存在,而只是执行control file中所纪录的文件位置。所以这一步可以进行一些数据库恢复操作、修改指向data file位置等。
验证control file内容并打开data file,确认数据库头文件,比较SCN信息,当data file的SCN和control file的SCN校验完一致时,就可以使用数据库了
关闭:
若是没有数据库灾难,会默认按打开三步的反操作进行关闭。
最后关于check point 检查点,这个动作是由DBWR更新的,在Oracle的生命周期内会一致增加检查点,目的是为了减少数据库执行灾难恢复时候所需时间。由特定参数来处理检查点的执行,这些检查点的写入不会影响到数据库的运行。
Oracle的备份方式有:
RMAN冷备方式:
Noarchive模式备份方式:
Archive模式备份方式:
Oracle备份除了数据文件以外的内容:
以上参数rman不会自动备份,需要定期手动备份