oracle的存储结构

一、oracle体系结构

oracle的体系结构分三类:内存结构、进程结构、存储结构

 

二、存储结构

参考连接:Oracle存储结构

数据库物理结构和逻辑结构的基本关系

1、一个数据库在物理上包含多个数据文件,在逻辑上包含多个表空间

2、一个表空间包含一个或多个数据文件,一个数据文件只能从属于某个表空间

3、数据库的逻辑块由一个或多个操作系统块组成

4、一个逻辑区只能从属于一个数据文件,而一个数据文件可包括一个或多个逻辑区

 

三、逻辑结构

1、Tablespace:表空间概念

参考连接:https://www.cnblogs.com/eastsea/p/3863354.html

表空间是一个逻辑的概念,在物理上不存在,是为了方便空间管理,数据库真正存放数据的是数据文件,一个表空间可由一个或多个数据文件组成。一个数据库可以包含多个表空间,一个表空间只能属于一个数据库。当表空间使用达到85%,就会在告警日志中产生告警,97%就会产生关键的告警。

(1)、基本的表空间

a、SYSTEM:系统表空间,存储核心数据,包括数据字典、有关数据库的表和视图、已编译的存储过程和包,一旦损坏,数据库将无法打开。

b、SYSAUX:是SYSTEM的辅助表空间,许多数据库特性默认表空间如AWR

c、USERS:用户表空间,

d、UNDOTBS1:回滚表空间,用于保存回滚和撤销数据库更改的数据,包括事务的记录,主要是事务被提交前的记录。相关信息在下面undo段。

e、TEMP:临时表空间,用于保存仅在会话期间产生的临时数据,包括中间结果排序、临时表、临时索引。创建临时表空间组,表空间组允许用户使用多个表空间中的临时空间,可以缓解一个表空间不足以保存排序结果的问题,特别是在有许多分区的表上。

create temporary tablespace temp01 tempfile '/u01/app/oracle/oradata/CHENMU/temp01.dbf' SIZE 10M TABLESPACE GROUP group1;
create temporary tablespace temp02 tempfile '/u01/app/oracle/oradata/CHENMU/temp02.dbf' SIZE 10M TABLESPACE GROUP group1; 

表空间的大小是实际用户表空间的大小,配额大小是用户指定使用表空间的大小。SELECT * FROM DBA_TS_QUOTAS  可以查看所有用户表空间配额大小。

(2)、表空间查询

select tablespace_name, block_size,contents,status from dba_tablespaces;
//查看数据库所有表空间块大小,contents表示是永久表空间还是临时表空间还是undo表空间
select ts#,name from v$tablespace;  //这个视图也可以查看表空间,输出编号和名称

select username,default_tablespace,temporary_tablespace from dba_users;  //查看HR用户的默认表空间和临时表空间

表空间有online(联机)、offline(脱机)、read only(只读)、read write(读写)几个状态,修改表空间的状态可以通过alter tablespace CHENMU onlile | offline | read only | read write。

当表空间为脱机状态时,任何用户都访问不了它,system表空间不可以设置成脱机状态,因为数据库运行时始终会用到system表空间中的数据。

ALTER TABLESPACE CHENMU OFFLINE IMMEDIATE;  //直接设置成脱机状态会出现错误,需要将数据库设置成归档模式
select name,log_mode from v$database;  //可以看到是未归档
shutdown immediate;
startup mount;
alter database archivelog;  //改为归档模式
alter database open;
ALTER TABLESPACE CHENMU OFFLINE IMMEDIATE;
select tablespace_name,status from dba_tablespaces;

切入HR用户进行查询测试,会报数据文件不可读的错误

conn hr/hr123;
select * from test;

 调整数据文件为联机状态,需要进入dba用户下

ALTER TABLESPACE CHENMU ONLINE;

(3)、表空间的创建

CREATE TABLESPACE TEST DATAFILE '/u01/app/oracle/oradata/CHENMU/test.dbf' SIZE 100M;
drop tablespace TEST including contents and datafiles;  //将创建的TEST表空间删除

表空间有BIGFILE和SMALLFILE两种数据文件,一个表空间只允许有一个BIGFILE数据文件,单个文件容量是32TB,优点是创建快捷;可以有多个SMALLFILE,文件容量上限是32GB,优点是灵活,可以起到均衡IO和动态扩展的目的。当小表空间内存不足时可以调整数据文件为自动增长,也可以增加数据文件。增加表空间大小和查看表空间使用率参考连接:https://www.cnblogs.com/muhai/p/15822377.html

select property_name,property_value from database_properties where  property_name = 'DEFAULT_TBS_TYPE';  //查看数据库默认表空间类型

 

自动分配表空间(AUTOALLOCATE):表空间自动分配给段的区个数

create tablespace autoallocate datafile '/u01/app/oracle/oradata/CHENMU/autoallocate.dbf' size 50M extent management local AUTOALLOCATE;  //创建表空间
select file_name,autoextensible,increment_by from dba_data_files;  //查看数据文件是否是自动增长
alter user hr  DEFAULT TABLESPACE autoallocate;  //将hr用户的默认表空间改为autoallocate

同一分配表空间(UNIFORM):表空间每次分配给段固定区个数

create tablespace uniform datafile '/u01/app/oracle/oradata/CHENMU/uniform.dbf' SIZE 50M extent management local uniform SIZE 128K;  //在dba用户下创建

创建大表空间

create bigfile tablespace bigfile01 datafile '/u01/app/oracle/oradata/CHENMU/bigfile01.dbf' SIZE 20M autoextend on;
ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;  //调整默认表空间是大表空间

(4)表空间的管理

参考连接:https://www.cnblogs.com/muhai/p/15822377.html

resumable是可恢复特性,预留一段处理故障的时间,而不是直接报错,由参数resumable_timeout控制,默认没有开启。在空间不足、达到空间上限、超出空间配额可使用该特性。下面是开启的方法

//方法一:要设置预留时间且要开启该特性,单位是s
ALTER SESSION SET resumable_timeout=3600; 
ALTER SESSION ENABLE RESUMABLE;
//方法二:
ALTER SESSION ENABLE RESUMABLE timeout 3600;

 

2、segment:段的概念

Oracle中的段就是对象在数据库中占用的空间,段和对象是一一对应的,可以分为数据段、索引段、回滚段、临时段四类,一个段只能属于一个表空间,一个段可以属于多个数据文件。segments是存储数据的,由oracle服务器自动分配。普通视图只保存sql语句没有段,物化视图可以刷新有段。deferred_segment_create = true延迟段分配,user_segment查看create建表的时候会创建段,如果延迟段分配生效的话插入数据才会分配段,可以节省空间和提高安装部署效率,对默认对表、索引、分区有效。

两do一点:redo、undo、检查点。

redo:commit之后redo buffer会写入redo LOG,是顺序写,记录的是变更向量;数据块不一定写入数据文件,是随机写。

undo:保存数据块的前进项,事务回滚;闪回查询;日志挖掘分析。

检查点:定期将脏快落盘,是数据库一致性关闭、实例恢复和oracle数据库操作的关键机制。有线程、表空间和数据文件(read-ONLY、offline NORMAL、shrinking 触发)、增量检查点(三秒机制、日志先写机制wal)三种类型,

(1)、数据段:存储数据的段,除聚簇外每个对象都有一个数据段,表的数据存在数据段中,默认情况下段名与表名相同。簇段将几张表组织在一起,放在一个物理段。

(2)、索引段:存储索引,当用户创建索引或定义约束而自动创建索引时,就会为该用户的默认表空间为该索引分配一个与索引名相同的索引段。

(3)、回滚段:用于存储用户修改之前的值,回滚段与事务是一对多,一个事务只能使用一个回滚段,一个回滚段可以存放一个或多个事务的回退数据。

参数undo_management决定数据库使用的是回滚段(在SYSTEM表空间)还是undo表空间,auto表示使用undo表空间自动管理,manual表示手动管理回退段。支持回退操作、读取一致性查询(使用游标,定位到之前的scn,如果表被truncate,游标会中断)、闪回查询、从失败的事务处理中恢复。

a、undo段信息:包括段头和回滚段

select * from v$rollname;  //查看当前回滚段
select blocks,extents from dba_segments where segment_name='_SYSSMU1_1261223759$';  //查看段有多少扩展区及块大小
select tablespace_name,extent_id,file_id,block_id,blocks from dba_extents where SEGMENT_NAME='_SYSSMU1_1261223759$';  //查看扩展区里段的表名、数据文件id、块id
select owner, segment_name, tablespace_name from dba_rollback_segs;  //查看每个回滚段的段头
show parameter undo;  //查看undo的参数信息
alter tablespace undotbs1 retention guarantee;  //设置undo成guarantee

b、undo段状态

active(保存当前事务正在执行但未提交的sql,不会过期,用于事务回滚)、unexpired(保存事务已提交但是未到retention的数据,用于闪回查询、日志挖掘)、expired(事务已提交且超过保留期的sql,会被覆盖)、free(空闲)四个状态。undo的unexpired保留周期受UNDO_RETENTION参数影响,对固定大小的undo表空间且is not guarantee,retention在空间不足的时候可能会动态调整(时间根据sql执行最长时间决定);对于启用autoextend的undo表空间,遵守undo_retention指定的最小保留时间,不会覆盖unexpired的undo,会优先扩展除非空间不足。当设置了retention guarantee且大小固定,永远不会覆盖未过期的undo数据。

select extent_id, bytes, status from dba_undo_extents where segment_name='_SYSSMU1_1261223759$';  //查看undo段的区,这里段名从rollname获取
show parameter UNDO_RETENTION;  //查看保留时间,默认是900s

c、临时undo,记录临时对象的DML前进项,因此不会记录在重做日志中,减少undo表空间中的undo量,减少redo log的日志量。

v$rollstat是undo资料信息表,usn是回滚段编号,rssize是回滚段大小,xacts是回滚段中的活动事务数量,status是回滚段的状态;v$rollname查看当前回滚段

//查看undo retention
select to_char(begin_time, 'DD-MON-RR HH24:MI') begin_time,
          to_char(end_time, 'DD-MON-RR HH24:MI') end_time, 
          tuned_undoretention
from  v$undostat order by end_time;

(4)、临时段:用于暂时存储排序和汇总的数据。

 

3、extents:区的概念

由物理上连续存放的块构成,由一个或多个块组成区,由一个或多个区组成段,一个分区只能属于一个数据文件。分配区有uniform(固定大小)、autoallocate(大小不一致,减少分配次数)两种方式。

4、数据块的概念

块是最小的I/O单位,其大小是OS块大小的整数倍。block header记录段的信息,从上至下写;table directory 记录表的信息;row ditrctory 记录字段的信息;row data就是存放的数据,从下至上写。rowid=data_object_id+file_id+block_id +row_nmu,每一张表都会有一个rowid字段,可以通过rowid找到行放在那个块里面。

pctfree为一个块的可用空间,默认是10,当数据块的可用空间低于10%后,就不可以被insert了。只能被用于update。pctused指当块里的数据低于多少百分比时,又可以重新被insert,默认是40,当数据低于40%时,又可以写入新的数据,高于40%不能被插入,空闲空间只能用来update。

select table_name,pct_free,pct_used from user_tables;  //查看表的pct信息
alter table employees pctfree 15;  //修改表的pctfree值

 

行链接:数据块太大一个块存不下,需要多个块存,在insert阶段;行迁移:数据更新之后一个块存不下,将数据存放在另一个块中,在更新阶段,rowid不变。尽量避免行链接和行迁移,比如增加块大小;修改pctfree;以上两种情况rowid都不变。

 

四、物理结构(物理文件,磁盘上的二进制和文本文件)

磁盘上的物理文件有密码文件、参数文件、控制文件、数据文件、在线重做日志文件、归档日志文件、告警日志文件。在CDB中,密码文件、参数文件、控制文件、在线重做日志文件、告警日志文件是共享的,数据文件SYSTEM、SYSAUX、USERS、TEMP不是共享的,12c以前UNDO是共享的,19c以后就不是共享的,叫local_UNDO。数据文件存储着系统数据、数据字典、索引数据及用户存储的数据。

1、密码文件管理(不是所有用户都可以密码登录)

远程登录(即通过网络登录)需要有密码文件,且remote_login_passwordfile为exclusive或shared。

select * from v$pwfile_users;  //有输出说明有密码文件
$ORACLE_HOME/dbs/orapw$ORACLE_SID;   //linux下存放的位置
//文件丢失后,可直接生成一个密码文件来恢复
rm $ORACLE_HOME/dbs/orapw$ORACLE_SID;  //模拟密码文件丢失
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=xxx;  //生成一个密码文件,password指定密码

 

2、参数文件管理(在进入nomount状态需要读取参数文件,分配SGA等空间)

spfile是server parameter file的缩写,pfile是parameter file的缩写。文件位置是$ORACLE_HOME/dbs;参数文件主要用来记录数据库的配置,在instance的启动阶段读取参数文件,根据这些参数来配置数据库,比如控制文件位置,内存大小。参数文件有两种,pfile是文本文件,静态参数文件,可以通过编辑器修改。命名为init<$ORACLE_SID>.ora,可以不放在database server上;spfile是二进制文件,动态参数文件,不可以通过编辑器修改。命名为spfile<$ORACLE_SID>.ora,必须放在database server上。控制文件的读取顺序是spfilesid>pfilesid>initsid

//pfile与spfile相互转换
create pfile from spfile;
create spfile from pfile;
create pfile='/tmp/a.ora' from spfile;  //通过spfile创建pfile文件,且定义pfile文件路径
show parameter spfile;   //查看参数文件位置

恢复参数文件时,如果实例正在运行,数据库默认spfile存在,所以不可以创建spfile,可通过内存来恢复,即create pfile  from memory,再通过pfile来生成spfile;数据库关闭时可将告警日志的相关参数写进pfile再生成spfile,在数据库启动时每次都会将启动的相关参数写进告警日志,compatible、db_name、controlfile_file这些参数都是需要的(在容器数据库还需要enable_pluggable_database=true);也可查看官方文档来实现。参数文件里chenmu.__sga_target=306184192等表示当前实例的参数,*.processes表示所有的实例。

//根据spfile文件生成pfile文件,存在spfile的情况
shutdown immediate;
create pfile='/tmp/pfilechenmu.ora' from spfile;
startup nomount pfile='/tmp/pfilechenmu.ora'; 
alter database mount;
alter database open;
//恢复spfile文件(当前实例正在运行,不可以直接生成spfile文件),根据内存值恢复
create pfile='/tmp/pfile.ora' from memory;
shutdown immediate;
create spfile from pfile='/tmp/pfile.ora';
startup;
//当前实例关闭,可利用备份或告警日志的历史记录手动编辑一个pfile,再利用pfile生成一个spfile,如果是容器数据库还要加上enable_pluggable_database=true;
vi /tmp/pfile.ora; 
db_name='chenmu' 
control_files = ('/u01/app/oracle/oradata/CHENMU/control01.ctl','/u01/app/oracle/fast_recovery_area/CHENMU/control02.ctl') 
compatible='19.0.0'

create spfile from pfile='/tmp/pfile.ora';

(1)、基本参数和高级参数

基本参数是可调整的参数,如CONTROL_FILES,DB_BLOCK_SIZE,PROCESSES等。

select name, value from v$parameter where isbasic='TRUE';  //查看基本参数,isbasic查看是否是基本参数

高级参数是高级参数是一组精细调整的参数,如共享服务器SHARED_SERVERS等。

(2)、静态参数和动态参数

a、静态参数在修改参数之后必须重启数据库才能生效,要指定scope=spfile(数据写进spfile文件,开机之后生效,scope=memory或scope=both都会出错),如果不指定scope,默认是both,memory表示写进内存不写进参数文件(即只在当前实例中修改),下次重启失效;both是写进memory和spfile,即当前实例生效,重启之后也生效(如动态参数)。

select name, value, isses_modifiable, issys_modifiable, ispdb_modifiable, isinstance_modifiable from v$parameter where issys_modifiable=upper('false');  
//查看静态参数,不是system级别修改

issys_modifiable有false、immediate、deferred三个值,false表示是静态参数,immediate和deferred表示是动态参数

修改静态参数要指定scope,静态参数要写入spfile文件,要重启之后生效

alter system set processes=400;  //静态参数修改要指定scope,否则会出现specified initialization parameter cannot be modified错误
alter system set processes=400 scope=spfile;  //即使修改了要等重启读取参数文件才会生效
show parameter processes;

shutdown immediate;
startup;

b、动态参数不用重启数据库也可以生效,重启后依然生效,immediate表示修改后立即在该会话生效,deferred表示此后生效,当前会话不生效。

select name, isses_modifiable, issys_modifiable, ispdb_modifiable from v$parameter where issys_modifiable<>upper('false');  //查看动态态参数,是system级别修改

 修改immediate参数share_servers,不允许使用deferred

show parameter shared_servers;  //值为0,将其修改为2
alter system set shared_servers=2;
show parameter shared_servers;  //不用重启数据库,值就变成2了

修改deferred参数recyclebin,要指定spfile

show parameter recyclebin;
alter system set recyclebin=off;  //出错
alter system set recyclebin=off scope=spfile;

(3)、会话级别参数、系统级别参数和pdb级别参数

alter session修改的是当前会话的参数;alter system修改的是参数文件,所有用户都会生效;pdb级别表示pdb容器可以修改的参数;alter database修改的是控制文件信息。

v$parameter视图中的isses_modifiable、issys_modifiable、ispdb_modifable可以查看其修改权限,即select name, isses_modifiable, issys_modifiable, ispdb_modifiable from v$parameter

v$parameter显示当前实例内存里的参数值、会话值,是session级别的参数,有多个值只显示在一行;v$parameter2如果有多个值显示多行,是session级别的参数;v$system_parameter是system级别的参数,使用的是alter system修改的值;v$spparameter显示的是保存在spfile里面的文件。

select name, value from v$parameter where name='control_files';
select name, value from v$parameter2 where name='control_files';

 

3、控制文件(在进入mount状态时需要读取,里面有数据文件、在线重做日志文件的位置,维护数据库的一致性,记录RMAN备份的元数据,记录redo日志当前序列和arch信息)

(1)、控制文件内存详解

alter database backup controlfile to trace as '/tmp/c.sql' reuse;  //将控制文件转为文本文件
vi /tmp/c.sql;  //控制文件有两段,NORESETLOGS case和RESETLOGS case
:set nu;  //设置行号
/Set #1;  //找到有Set #1的行,在37行,Set #1.  NORESETLOGS case
/Set #2;  //找到有Set #2的行,在94行,Set #2.  RESETLOGS case
cp /tmp/c.sql /tmp/noReset.sql;
cp /tmp/c.sql /tmp/Reset.sql

noresetlogs版本,当所有在线日志的当前版本可用时使用noresetlogs模式

vi /tmp/noReset.sql
:94,$d;   //在noresetlogs中将94行至最后一行删除
sed '/^--/d' /tmp/noReset.sql >/tmp/noReset1.sql;   //删除注释行
sed '/^$/d' /tmp/noReset1.sql >/tmp/noReset.sql;  //删除空行
//vi /tmp/noReset.sql得到以下的控制文件内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CHENMU" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/CHENMU/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/CHENMU/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/CHENMU/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/CHENMU/system01.dbf',
'/u01/app/oracle/oradata/CHENMU/sysaux01.dbf',
'/u01/app/oracle/oradata/CHENMU/undotbs01.dbf',
'/u01/app/oracle/oradata/CHENMU/chenmu.dbf',
'/u01/app/oracle/oradata/CHENMU/users01.dbf'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/temp01.dbf' SIZE 114294784 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

resetlogs版本,如果在线日志不可用使用RESETLOGS方式。

vi /tmp/reset.sql
:1,93d;   //删除1至93行
sed '/^--/d' /tmp/reset.sql >/tmp/reset1.sql;   //删除注释行
sed '/^$/d' /tmp/reset1.sql >/tmp/reset.sql;  //删除空行
vi /tmp/reset.sql
//得到以下的控制文件内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CHENMU" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/CHENMU/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/u01/app/oracle/oradata/CHENMU/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/u01/app/oracle/oradata/CHENMU/redo03.log'  SIZE 200M BLOCKSIZE 512
DATAFILE
  '/u01/app/oracle/oradata/CHENMU/system01.dbf',
  '/u01/app/oracle/oradata/CHENMU/sysaux01.dbf',
  '/u01/app/oracle/oradata/CHENMU/undotbs01.dbf',
  '/u01/app/oracle/oradata/CHENMU/chenmu.dbf',
  '/u01/app/oracle/oradata/CHENMU/users01.dbf'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE USING BACKUP CONTROLFILE
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/temp01.dbf' SIZE 114294784  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

(2)、控制文件实现多路存放

select name from v$controlfile;   //查看控制文件位置
show parameter control_files;  //现有oradata下control01.ctl,为实现多路径存放控制文件,将control01复制到fast_recovery_area下的control03.ctl,是静态参数
alter system set control_files='/u01/app/oracle/oradata/CHENMU/control01.ctl','/u01/app/oracle/fast_recovery_area/CHENMU/control02.ctl','/u01/app/oracle/fast_recovery_area/CHENMU/control03.ctl' scope=spfile
shutdown immediate;   //静态参数要重启才生效
cp /u01/app/oracle/oradata/CHENMU/control01.ctl /u01/app/oracle/fast_recovery_area/CHENMU/control03.ctl;  //在操作系统层面复制控制文件
startup;
show parameter control_files;  //看到control03.ctl已存在

装载数据库在mount状态时需要根据初始化文件的参数文件读写控制文件或从v$parameter查看。控制文件包括数据库名称、数据文件和重做日志文件的名称与位置、数据库创建的时间戳、当前日志序列号、检查点信息。

strings control01.ctl

 

4、数据文件(在数据库open时会读取,检查数据库的一致性,control file、datafile、redo file这三个文件的一致性)

查看表空间及对应的数据文件信息,相关数据文件管理可以查看上面的表空间的管理。

select tablespace_name,file_id,file_name,status,bytes/1024/1024 from dba_data_files;   //查看数据文件所在表空间、文件id号,名称、状态及大小

select file#,name,bytes/1024/1024 MB from v$datafile;  //vdatafile视图也可以查看视图的大小

从表空间中删除数据文件

alter tablespace CHENMU drop datafile '/u01/app/oracle/oradata/CHENMU/test.dbf';

 

5、在线重做日志文件

(1)、内容详解

在线重做日志有current、active、inactive、unused四种状态,current是当前正在使用的日志组,正在产生的变更向量会保存到这个文件,不能被删除;active是已经切换完的日志组,不是正在使用的日志,正在进行归档,不能保证检查点落盘完成,实例恢复需要用到这些日志,所以不能删除。inactive是已经归档完成了,实例恢复不需要这些文件,可以被删除。unused是还没有使用的日志组,可以被删除。最少建立两个在线重做日志组,默认是三个。

select group#,bytes/1024/1024 MB,members,status from v$log;  //查看当前正在使用的日志组,members是成员数
select group#,status,type,member from v$logfile;  //查看日志成员位置
select group#,members,a.status,member from v$log a join v$logfile using(group#);  //合起来查看在线日志信息。每组只有一个成员

alter system switch logfile这个语句强制切换日志组,不会触发检查点事件;正常日志切换是产生的检查点事件是增量检查点事件。alter system archive log current是归档当前的在线重做日志文件,不管归档有没有打开归档。

(2)、多路复用重做日志

可以为每个日志组添加多个成员,将多个成员分布在不同的磁盘下,防止单点故障;当组内一个成员丢失或损坏时不会影响其他成员的正常使用。多路复用重做日志文件方法如下:

ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/CHENMU/redo1a.log' TO GROUP 1;
ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/CHENMU/redo2a.log' TO GROUP 2;
ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oracle/oradata/CHENMU/redo3a.log' TO GROUP 3;
select group#,members,a.status,member from v$log a join v$logfile using(group#);  //查看日志组成员

 

6、归档日志文件

在线重做日志文件是循环写的,保存周期有限,所以需要在切换在线重做日志时ARCn进程对其进行备份,可用于数据库恢复、更新备库、日志挖掘。恢复控制文件时"recover database"需要归档日志文件。 

archive log list;  //查看数据库是否处于归档模式,Database log mode=Archive Mode表示处于归档模式;Database log mode=No Archive Mode表示不处于归档模式
shutdown immediate;  //关闭数据库,启动到mount阶段
startup mount;
alter database archivelog;  //打开归档模式
--alter database noarchivelog;  //关闭归档模式
alter database open;  //打开数据库
show parameter log_archive_max_processes;  //查看归档进程数

设置归档路径有三种方法。方法一是设置单一路径LOG_ARCHIVE_DUPLEX_DEST为辅助归档路径,使用最多的是方法二和方法三。

alter system set LOG_ARCHIVE_DEST = '/home/oracle/arch';
//要确保这个路径存在,否则会出现shared memory realm does not exist

方法二是设置多路归档,配置LOG_ARCHIVE_DEST_n参数,该种参数最多有31个,其中1-10既可以用于本地归档也可用于远程归档(直接将在线日志文件归档到另一个主机上),但是11-31只能用于远程归档。如果已经设置单一路径了,必须加上scope=spfile写进参数文件,否则会出现cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST错误,因为两个参数不能同时设置值

show parameter log_archive;  //可以看到有31个,log_archive_dest_1至log_archive_dest_31,可以设置1-31
alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION=/home/oracle/arch' scope=spfile;  

方法三是设置快速恢复区,同时配置方法二和方法三,优先使用方法二。

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 40G ;  //先设置快速恢复区的大小,大小推荐是数据库目前容量的两倍
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST ='/u01/app/oracle/fast_recovery_area'  scope=spfile;  //同理不能同时设置值,需要写进参数文件

 

7、告警日志文件

一般在/u01/app/oracle/diag/rdbms/chenmu/chenmu/trace下,通过 ls -lrth命令列出信息,alter_chenmu.log指向跟踪文件,查看跟踪文件可以看到错误的详细信息,告警日志文件记录数据库启动或关闭的时间、非缺省初始化参数、RMAN备份信息、补丁信息、错误信息、alert信息。

一般告警位置是在$ORACLE_BASE/diag/rdbms/dbname/sid/trace路径下。

 

 

posted @ 2022-11-11 17:03  微风徐徐$  阅读(802)  评论(0编辑  收藏  举报