了解Oracle体系结构(超详细)

学习oracle的目的:
一致性
性能
一致性的要求优先于性能

处理模型
C/S模型
客户端:用户和用户进程
服务器端:服务器进程、实例和数据库本身

概念:
实例/instance: 后台进程+共享内存 用于管理和控制数据库
数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等
数据库服务器/database server: 软件+实例+数据库

oracle数据库环境有以下两部分:
oracle软件,存放在服务器本地硬盘上
oracle数据库,存放在共享存储上

实例
oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭
一个数据库可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做oracle的RAC技术。

查看oracle实例

[oracle@localhost ~]$ ps -ef | grep ora

查看相关内存

[oracle@localhost ~]$ ipcs

启动数据库

SQL> startup;

然后再次查看进程和内存相关的信息,即可发现进程和内存中有了oracle相关的信息
oracle启动后在内存中独享一块内存区域。

连接/connection:
连接是从客户端到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。

会话/session:
会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存
中的数据结构.提到”数据库连接”时,大多数人首先想到的就是“会话”。在服务器中的会话上执行SQL、提交事务和运行存储过程。

进程/process:
指定了一个实例在操作系统级别能同时运行的进程数,包括后台进程与服务器进程。
由上面的分析可知,一个服务器/前台进程可能同时对应对个会话,因此通常sessions的值是大于processes的值
通常的设置公式
Oracle 11g R1以及之前版本
sessions=(1.1 * processes) + 5

Oracle 11g R2
sessions=(1.5 * processes) + 22
这里写图片描述

无连接、无会话、无进程

SQL> shutdown immediate;
[oracle@localhost ~] sqlplus/nolog[oracle@localhost ] s q l p l u s / n o l o g [ o r a c l e @ l o c a l h o s t   ] ps -ef | grep ora

有连接,有会话,有进程

SQL> CONN SCOTT/orcle;
SQL> SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE USERNAME IS NOT NULL;
SQL> ho ps -ef | grep ora

查看进程和会话之间的关系

SQL> select name,value from v parameterwherename=processes;SQL>selectname,valuefromv p a r a m e t e r w h e r e n a m e = ′ p r o c e s s e s ′ ; S Q L > s e l e c t n a m e , v a l u e f r o m v parameter where name=’sessions’;
SQL> select (1.5*150)+22 from dual;

320 504

oracle的体系结构主要分三类
内存结构
进程结构
存储结构
这里写图片描述

概览:

内存结构
SGA: 系统/共享全局区
Shared Pool/共享池
Database Buffer Cache/数据库缓冲区高速缓存
Redo Log Buffer/重做日志缓冲区
Large Pool/大池
Java Pool/JAVA池
Streams Pool/流池

PGA: 进程/私有全局区
Private SQL area
Session memory

amm 自动内存管理
asm 自动存储管理
这里写图片描述

存储结构
物理存储结构
控制文件
日志文件
数据文件
逻辑存储结构 表空间,,段 区,,块
这里写图片描述
进程结构
服务器进程(前台进程): Server Process
后台进程:
DBWn/数据库写进程
LGWR/日志写进程
ARCn/归档写进程
SMON/系统监视器
PMON/进程监视器
RECO/恢复进程
CKPT/检查点进程
这里写图片描述

内存结构

查看oracle能使用的最大物理内存,动态参数

SQL> SHOW PARAMETER MEMORY_TARGET

查看MEMORY_TARGET所能设定的最大值,静态参数

SQL> show parameter memory_max_target

AMM在后台会启动一个内存管理(Memory Manager,mman)的进程

########### #####
留存,。。。

#

内存管理形式
自动内存管理
自动SGA管理
手工SGA管理
自动PGA管理
手动PGA管理

建议不要使用手动管理内存

自动内存管理

SQL> show parameter target;

如果该参数为true,则AMM是不可用的

SQL> show parameter lock_sga

自动共享内存管理

SQL> alter system set sga_target=1024 scope=both;
SQL> alter system set memory_target=0 scope=both;
SQL> show parameter target;

手动共享内存管理,这种情况必须手工指定sga中的内存参数

SQL> alter system set sga_target=0 scope=both;
SQL> alter system set memory_target=0 scope=both;
SQL> show parameter target;

自动PGA内存管理,auto为自动

SQL> show parameter workarea_size_policy

手动PGA管理,manual为手动,忘掉吧

SQL> show parameter workarea_size_policy

alter system set memory_max_target=100 scope=sfile;

SGA 系统/共享全局区,所有的进程可以访问,共享访问。
最容易出问题的就是共享池和高速缓存。

查看SGA

SQL> SHOW PARAMETER SGA;
NAME TYPE VALUE


lock_sga boolean FALSE #是否锁定在物理内存上
pre_page_sga boolean FALSE #实例启动时,是否加载所有的内存
sga_max_size big integer 1584M #最大的sga内存
sga_target big integer 0 #表示进行自动内存管理

Shared Pool 实现代码的共享和重用
包含三部分:
库缓存(Library Cache)
用于存储SQL语句及相关的解析,执行计划,PL/SQL程序块等
共享SQL区
存放语法分析结果和执行计划等
私有SQL区
存放绑定变量,环境和会话信息等

数据字典缓存(Data Dictionary Cache)
存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限信息,按行(row)存储,所以也叫Row Cache

结果集(Result Cache)
缓存查询的结果,可以在服务器端缓存,也可以在客户端缓存

Database Buffer Cache
服务器进程,针对每一个连接启动一个服务器进程
数据在buffer cache,如果没有,就找dbf/数据文件
server process读取数据
dbw将修改后的数据写入数据文件
缓冲区状态:

    已连接:正在进行读/写的瞬间
    干净: 数据文件和内存中一致,该内存可以重用
    空闲: 未使用的内存空间,该内存可以重用
    脏: 内存中的数据发生了修改,需要写回dbf   dirty block   
    如果没有空闲和干净的内存空间,则触发dbwn

Redo Log Buffer
buffer cache中的数据一旦有修改就会产生该日志
log buffer通过LGWR写入到redo log中,写满后会进行切换
ARCn将redo log归档到归档日志

Large Pool
RMAN备份恢复的时候
执行并行查询的时候
执行大量排序操作的时候
共享服务器的时候

Java Pool
存储过程可以使用java写
数据库内部存在jvm

Streams Pool
由Oracle Streams使用

查看sga内存详情

SQL> col component for a30;
SQL> select component,current_size,min_size,max_size from v$sga_dynamic_components;

PGA 进程/私有全局区

作用:

 PGA是服务器进程使用的内存空间,后台进程也有PGA
 在PGA中进行数据排序
 PGA只有服务器进程可以访问,独享内存空间
 PGA和服务器进程是关键点

构成:
1、private SQL area
静态区: 会话结束释放
动态区: sql执行结束释放
2、Session Memory
3、SQL Work Areas(主要)

  1、sort_area_size   排序空间大小
  2、sort_area_retained_size 排序空间释放到的最小空间大小
  3、hash_area_size   多表访问需要哈希空间
  4、hash_join_enable   哈希空间相关
  5、bitmap_merge_area_size 位图区
  6、create_bitmap_area_size 位图区创建
  7、open_cursors    一个会话可以执行的SQL的数量
  8、_pga_max_size   每一个会话能分配的最大的PGA大小

手动指定空间时,如果在排序时需要的排序空间不够时,服务器进程会在临时数据文件上拿到空间再进行排序,在PGA中的排序叫内存排序,在临时数据文件中的排序叫磁盘排序,如果一次磁盘排序不够,还需要多次排序。

建议使用自动管理,我们只需要分配一个PGA总空间,其他的自动调整,但是在自动管理中,每个服务器进程能够使用的PGA空间仍然要有限制。

查看当前配置

SQL> SHOW PARAMETER AREA;
可以看出,默认为自动

查看当前pga的分配情况

SQL> select name,value from v$pgastat where name in(‘maximum PGA allocated’,’total PGA allocated’);

查看_pga_max_size的值

SQL> col name for a20
SQL> col value for a20
SQL> col desc for a20

SQL> SELECT KSPPINM “Name”,ksppstvl/1024/1024 ||’M’ “Value”,
ksppdesc “Desc” from x ksppix,x k s p p i x , x ksppcv y
where x.indx = y.indx
and ksppinm = ‘_pga_max_size’;

生产环境中可根据上述查询结果来估算PGA空间大小。

修改内存大小

SQL> alter system set 内存参数=大小

ora_XXXX_orcl
功能 实例名 sid

进程结构

生产环境中,前台进程远远多于后台进程。

后台进程
DBWn: 将buffer cache中的脏数据写入到dbf中,只写不读。
执行时间点:

  1. 没有任何可用缓冲区
  2. 脏缓冲区过多
  3. 三秒超时
  4. 遇到检查点

查看当前的DBWn数量

SQL> show parameter db_writer_processes;

修改数量

SQL> alter system set db_writer_processes=20 scope=spfile;

alter system set db_writer_processes=20 scope=both;

设置检查点

SQL> alter system checkpoint;

socket 插槽数
core

  • LGWR: 将log buffer中的数据写入到redo log中。

    LGWR触发条件:
    1、用户提交
    2、有三分之一的log buffer未被写入磁盘
    3、有大于1M的log buffer未被写入磁盘
    4、每隔三秒
    5、DBWn需要写入的数据的SCN大于LGWR记录的SCN,触发LGWR写入,日志写入优先(Write-Ahead-Log)

  • CKPT: 周期性触发,更新检查点信息,更新到控制文件和每个数据文件头部。

    检查点类型
    完全检查点
    执行ALTER SYSTEM CHECKPOINT
    正常关闭实例
    增量检查点

    检查点队列
    该队列是脏数据块所对应的buffer header,dbwn按照这个写

  • SMON: 主内,监控实例内部,实例恢复,如整理碎片,清理不使用的临时段。

  • PMON: 主外,监控用户连接

    在用户进程失败时执行进程恢复
    清除数据库缓冲区高速缓存
    释放该用户进程使用的资源
    监视会话是否发生空闲会话超时
    将数据库服务动态注册到监听程序

  • ARCn: 将写满后的redo log写入到归档日志中。

    可以收集事物处理重做数据,并将该数据传输到备用目标位置

  • MMON: 自我监视和自我管理支持进程

  • MMNL: MMON辅助进程

  • ADDM: 自动数据库诊断监视器

  • MMAN: 自动内存管理

  • LREG: 监听注册进程

前台进程
服务器进程
应用程序服务器产生到数据库服务器的连接,多个连接形成一个连接池。

模拟应用程序服务器到数据库服务器的连接

sqlplus / as sysdba
此时,加上之前的那个连接总共两个连接。

用户的信息到达应用程序服务器后,由应用程序服务器随机选择连接到达数据库服务器,执行完成后,把执行结果返回给用户。

用户进程
用户客户端产生的进程,我们不关心。

存储结构

逻辑结构

段、区、块
Segments/Extents/DataBlocks
从存储的角度只有段
记录到数据字典
创建段
这里写图片描述
表空间 tablespace
表空间是数据库的最大逻辑存储结构,和物理数据文件相对应,一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间
主要的几个表空间:
SYSTEM: 系统表空间,用于存放内部表和数据字段的数据,如表名、列名、用户名。
#查看数据字典的信息
SQL> COL TABLE_NAME FOR A30
SQL> COL COMMENTS FOR A30
SQL> SELECT * FROM DICT;

#查看数据库内部表的信息
SQL> COL VIEW_NAME FOR A30
SQL> COL VIEW_DEFINITION FOR A30
SQL> SELECT * FROM V$FIXED_VIEW_DEFINITION;

SYSAUX: 系统辅助表空间,由ORACLE自行维护
UNDO: 存放撤销信息的表空间
USERS; 建议用户使用的表空间,scott用户的表就在这个表空间上
建议:不同应用系统存放在不同的表空间上,不同的表空间的文件放在不同的磁盘上,减少并发,提高性能。

段 一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的对象,一个段只能属于一个数据库对象
有以下几种段:
数据段
数据段存放的是数据表中的数据,数据段的增大时向数据段增加区,创建表时,系统自动创建一个同名的段
索引段
包含了用于提高系统性能的索引,一旦建立索引,系统自动创建一个同名的索引段
回滚段
也叫撤销段,该段保存了回滚的条目,oracle将修改前的旧数据存放在回滚段中,利用这个,可以撤销未提交的操作
临时段
当执行创建索引、查询等操作时,系统会使用一些临时空间用来保存解析过的查询语句以及在排序过程中产生的临时数据
区 段空间分配时最小的单位,由连续的数据块组成
块 组成区的最小单位,通常是操作系统数据块的整数倍,ORACLE支持同时使用多种大小

#查看标准数据库块大小
SQL> COL NAME FOR A30
SQL> COL VALUE FOR A30
SQL> SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME=’db_block_size’;

块组成部分:
块头 存放数据块的基本信息,如块的物理地址,块所属段的类型
表目录 如果是数据表,存放数据表的相关信息
行目录 如果有行数据,那么存储行信息
空余空间 新行插入和存在行的更新
行数据 存放表数据和索引数据

表空间: 大于数据文件的逻辑概念

分类:
基本表空间: 一般为用户使用的永久性表空间,存储用户永久性数据
临时表空间: 临时表空间是一个磁盘空间,存储用户在执行ORDER BY等语句进行排序或汇总时产生的临时数据,默认情况下所有用户都使用temp作为默认的临时表空间,也允许使用其他临时表空间作为默认临时表空间,需要在创建用户时指定
大文件表空间: 存储大型数据
非标准数据块表空间:在一个实例中创建数据库大小不同的表空间
撤销表空间:存储事务的撤销数据,在数据恢复时使用,一个数据库中可以有多个撤销表空间,但是数据库一次只能使用一个,默认使用自动创建的undotbs撤销表空间。

默认:
SYSTEM: 数据字典
SYSAUX: 辅助系统表空间
UNDOTBS1: UNDO回滚段,存储修改前的数据
TEMP: 临时表空间,会话使用
USERS:

状态属性:
ONLINE: 在线,允许访问该表空间中的数据
OFFLINE: 离线,不允许访问该表空间的数据
READ ONLY: 只读,只允许读
必须处于ONLINE状态
不能包含任何事务的回滚段
不能处于在线备份期间
READ WRITE: 读写,可以读写
必须处于ONLINE状态

查看表空间

SQL> select tablespace_name,contents from dba_tablespaces;

查看表空间对应的数据文件

SQL> col file_name for a50
SQL> set linesize 300
SQL> select distinct file_name,tablespace_name from dba_data_files;

查看USERS表空间

SQL> SELECT SEGMENT_TYPE,SEGMENT_NAME,OWNER FROM DBA_SEGMENTS WHERE TABLESPACE_NAME=’USERS’;

创建一个表

SQL> create table hehe (c1 varchar2(10)) segment creation immediate;

查询该表的段的表空间,区id等信息

SQL> select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name=’HEHE’;

根据文件编号查找对应的数据文件

SQL> select name from v$datafile where file#=&file_id;

根据块id和和块大小来计算块的起始位置

SQL> select block_size * &block_id from dba_tablespaces where tablespace_name=’&tablespace_name’;

创建表空间newtab

SQL> create tablespace newtab datafile ‘/u01/app/oracle/oradata/orcl/newtab01.dbf’ size 10m extent management local autoallocate segment space management auto;

创建表newtable到表空间newtab

SQL> create table newtable(c1 date) tablespace newtab;

查看该表的相关段信息,确定第一个区大小

SQL> select extent_id,segment_name,segment_type,tablespace_name,bytes from dba_extents where segment_name=’NEWTABLE’;

手动增加区,重复执行,然后再次查看相关区的信息

SQL> alter table newtable allocate extent;

让该表空间脱机

SQL> alter tablespace newtab offline;

插入数据到表newtable;

SQL> insert into newtable values(sysdate);

如果报错,说明正常,现在将表空间上线

SQL> alter tablespace newtab online;

再次插入数据正常

SQL> insert into newtable values(sysdate);

将表空间设置为只读,进行观察

SQL> alter tablespace newtab read only;

插入数据到表newtable,提示错误;

SQL> insert into newtable values(sysdate);

将表空间设置为读写,再次进行观察

SQL> alter tablespace newtab read write;

插入数据到表newtable,正常;

SQL> insert into newtable values(sysdate);

?将表空间脱机或者只读后,可以删除表吗?

查看表空间状态

SQL> select tablespace_name,status from dba_tablespaces;

向表空间newtab中增加数据文件

SQL> alter tablespace newtab add datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ size 50m;

查看新增的数据文件

SQL> select distinct file_name,tablespace_name,autoextensible from dba_data_files;

修改数据文件

SQL> alter database datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ autoextend on next 50m maxsize 2g;

修改数据文件大小

SQL> alter database datafile ‘/u01/app/oracle/oradata/orcl/newtab02.dbf’ resize 70m;

删除表空间newtab;

SQL> drop tablespace newtab including contents and datafiles;

段管理
使用自动段管理,使用位图进行管理

查看表空间的段管理方式

SQL> select tablespace_name,segment_space_management from dba_tablespaces;

手动转换自动请新创建表空间。

区管理
区管理方法为每个表空间设置,应用于表空间中的所有段,可使用字典管理或者本地管理,但是请不要使用字典管理。
字典管理:
使用两张表对区进行管理
本地管理:
使用位图来管理区

使用uniform size指定每次分配的区大小

创建一个区大小为150m的表空间dabiao

SQL> create tablespace dabiao datafile ‘/u01/app/oracle/oradata/orcl/dabiao_01.dbf’ size 5g extent management local uniform size 150m;

查看创建好的表空间中数据文件的大小

SQL> select name,bytes/1024/1024 from v$datafile

查看表空间的信息

SQL> select tablespace_name,next_extent,min_extlen from dba_tablespaces;

创建一个区大小为150K的表空间xiaobiao

SQL> create tablespace xiaobiao datafile ‘/u01/app/oracle/oradata/orcl/xiaobiao_01.dbf’ size 2g extent management local uniform size 150k;

查看创建好的表空间中数据文件的大小

SQL> select name,bytes/1024/1024 from v$datafile;

查看表空间的信息

SQL> select tablespace_name,next_extent,min_extlen from dba_tablespaces;

ORACLE公司建议使用autoallocate关键字

SQL> create tablespace xiaobiao1 datafile ‘/u01/app/oracle/oradata/orcl/all_01.dbf’ size 2g extent management local autoallocate;

物理结构
数据文件
操作系统块 os blocks

数据库的几类文件

 CONTROL FILE  控制文件  在线
 DATA FILE   数据文件  在线
 REDO LOG FILE  重做日志文件 在线
 PARAMETER FILE  参数文件  在线

 ARCHIVE LOG FILE 归档日志文件 离线
 PASSWORD FILE  密码文件  离线
 alert file   告警文件
 trace file    追踪文件

在线文件 文件实时改变,不能进行操作
离线文件 文件生成后不会改变
安全:
复用:一个不行就两个
分散:一个地方不保险就整两个地方

control file

作用:
用于记录数据库的物理结构,属于重要角色,没有控制文件,实例立即崩溃,数据库的启动和正常运行都离不开控制文件。
包含的内容:
数据库物理结构信息
数据库归档历史信息
各个数据文件的SCN号和系统检查点信息
RMAN元数据

性质:
控制文件是一个二进制文件,不可以通过文本编辑器编辑,该文件由oracle自行维护,oracle建议至少有两份冗余,并且放在不同的磁盘上。

查看:
SQL> show parameters control_files;
SQL> select * from v$controlfile;
默认块大小为16K

数据文件:

作用:
用来存储实际数据,数据文件是存储数据的物理概念。

查看:
SQL> col name for a50
SQL> select file#,name,status from v$datafile;
SQL> select * from dba_data_files;
SQL> select * from dba_temp_files;

数据文件的状态
ONLINE: 联机状态
OFFLINE: 脱机状态
OFFLINE DROP: 删除数据文件

将数据文件OFFLINE时,不影响表空间的状态,但是表空间的状态会影响到数据文件的状态。

redo log

作用:记录数据文件的每一个变化过程,保证数据库一致性

包含:
三组redo log
每组中有多个成员
成员和成员之间是完全相同的关系
无需备份,无法备份
使用复用来保护

状态:
unused 刚启用的时候,还没有循环过来
inactive 没有启用
ctive 启用
current 当前

丢失:
unused 不影响
inactive 不影响
active 数据库不会立即崩溃,此时,如果数据库正常关闭,则没有影响
数据库立即崩溃则会存在问题
current 数据库立即崩溃,会导致数据库损坏

数据库运行时,数据文件严重不一致。
数据文件的一致性依赖于redo log,当数据库异常崩溃时,需要使用redo log来构造脏块进行实例恢复。

产生过程:
当有连接到数据库,服务器进程会将数据文件中的数据读取到buffer cache,服务器进程会忠实地严格按照时间点将buffer cache中的数据块的改变记录到PGA,当满足条件时,写入到log buffer,lgwr会将log buffer中的数据记录到redo log中,redo log有三份,写满第一份,然后切换到第二份,写满继续切换,而arcn进程将redo log再写入到归档日志中。

记录的东西:
1、buffer数据块地址
2、时间点
3、做了什么改变,增加/删除,有修改吗?

oracle会产生大量的日志,日志会有I/O,也会存在性能问题。

日志工作机制:归档

所有已提交事务,oracle保证不丢失。

日志写入优先。

事务:一条或者多条增删改语句组成事务,事务的范围为两个commit之间的范围。
事务的一致性非常重要。

1)在提交事务的时候写入dbf数据文件,但是会有性能和用户体验的问题
2)提交事务会产生大量日志,日志通过PGA到达log buffer,而log buffer因为时间和空间大小等限制通过lgwr快速写入到redo log。
3)提交的时候触发lgwr将log buffer写入到redo log。

授权sh.sales权限给scott用户

SQL> grant select on sh.sales to scott;

创建一张表

SQL> create table mysales as select * from sh.sales;

删除该表的内容

SQL> delete from mysales;

提交,注意速度

SQL> COMMIT;

日志实现了快速提交。

缓存有两种:
读缓存:读取数据的时候可以在缓存中找,写的时候必须直接修改磁盘,将会产生磁盘I/O
写缓存:oracle通过日志实现了写缓存,buffer cache提高了读和写的性能。
oracle只有buffer cache和存储的缓存提供了写缓存,而硬盘只有读缓存。
lgwr会绕过文件系统的缓存直接写入到存储的缓存。

  buffer   缓冲区
  cache   缓存处

优化:
1、日志写入频繁需要磁盘的IOPS较高,上千次起。
2、每次写入量小
3、顺序写,无需条带化,可以raid10和raid01

大小:
9i以前一般为3M
10g以后会自动调整

查询语句

SQL> select * from v$sgainfo where name in (‘Fixed SGA Size’,’Redo Buffers’,’Granule Size’);

v$sgainfo?

日志组

查询语句

SQL> SET LINESIZE 300
SQL> select * from v$log;
通过查询发现,默认有三个日志组,每个组有一个成员。

查询语句

SQL> COL MEMBER FOR A50
SQL> select * from v$logfile;
通过查询可以查看日志组的成员路径。

每组中可配置多个,每个成员完全一样,互为备份。
日志文件的重要性高于数据文件。

redo log切换时间尽可能不低于10-20分钟

查看语句

SQL> SELECT TO_CHAR(FIRST_TIME,’YYYY-MM-DD HH24:MI:SS’) F_TIME,SEQUENCE# FROM V$LOG_HISTORY;
通过调整大小来测试日志文件的切换时间。
如果没有结果,说明日志还没切换,使用手工多切换几次。

手工切换日志

SQL> ALTER SYSTEM SWITCH LOGFILE;

相关操作语句

添加日志组

SQL> ALTER DATABASE ADD LOGFILE GROUP 5 ‘/u01/app/oracle/oradata/orcl/redo05_1.log’ SIZE 50M;

添加组成员到日志组

SQL> ALTER DATABASE ADD LOGFILE MEMBER ‘/u01/app/oracle/oradata/orcl/redo05_2.log’ TO GROUP 5;

切换日志组

SQL> ALTER SYSTEM SWITCH LOGFILE;

查看日志组的情况

SQL> select * from v$logfile;

select GROUP#,SEQUENCE#,BYTES,BLOCKSIZE,MEMBERS,STATUS,FIRST_CHANGE#,NEXT_CHANGE#,NEXT_TIME from v$log;

初始化参数/参数文件

查看参数文件

[oracle@localhost ~] ll l l ORACLE_HOME/dbs
动态参数文件为spfileorcl.ora

静态:9i之前,文本文件
在启动的时候读取该文件,根据该文件设置实例,读取内容到内存,关闭该文件,不再使用,如果要改参数,只能重启数据库才能生效。
动态:9i之后,二进制文件,不要用vim编辑该文件
可以动态修改,不是所有的参数都可以动态修改。

查找顺序:
启动的时候根据 ORACLESIDSIDdbsspfile O R A C L E S I D 设 置 的 S I D 的 名 称 在 d b s 目 录 下 查 找 到 s p f i l e ORACLE_SID.ora文件,如果没有就查找init ORACLESID.ora O R A C L E S I D . o r a 文 件 。 环 境 变 量 ORACLE_SID在oracle用户的~/.bash_profile文件中配置。

查看当前参数值

SQL> select name,value from v$parameter;

查看spfile文件中参数的值

SQL> select name,value from v$spparameter;

查看基本参数

SQL> select name,value from v$parameter where isbasic=’TRUE’;

重新给$ORACLE_SID赋值

[oracle@localhost dbs] exportORACLESID=haha[oracle@localhostdbs] e x p o r t O R A C L E S I D = h a h a [ o r a c l e @ l o c a l h o s t d b s ] echo $ORACLE_SID

启动数据库实例

[oracle@localhost dbs]$ sqlplus / as sysdba
SQL> startup;
可以发现实例启动失败,因为没有找到参数文件

修改参数文件
ALTER SYSTEM SET = SCOPE = MEMORY | SPFILE | BOTH
默认为both,静态参数要指定spfile

静态参数文件和动态参数文件的互相转换

动态生成静态

SQL> create pfile from spfile;

查看静态参数文件

[oracle@localhost ~] ll l l ORACLE_HOME/dbs
initorcl.ora为静态参数文件

静态生成动态

SQL> create spfile from pfile;

查看动态参数文件

[oracle@localhost ~] ll l l ORACLE_HOME/dbs
spfileorcl.ora为动态参数文件

参数类型
详情见官方手册All Books–>Reference–>V$PARAMETER
选项ISSYS_MODIFIABLE定义了值变更后如何才能生效
IMMEDIATE为立即生效
DEFERRED为新建会话生效
FALSE为重启实例生效

查看该数据字典

强烈建议使用sql developer工具
SQL> select name,value,issys_modifiable from v$parameter; 没看成 ,,,

修改参数

因为参数在动态参数文件和内存中都有,所以语法如下:
ALTER SYSTEM SET PARAMETER_NAME=parameter_value [comment=’注释’] scope=[memory|spfile|both] [sid=’sid’|’*’]

memory表示只修改内存中的参数值,重启实例后就消失。
spfile表示只修改参数文件,下次重启生效
both表示两个都修改,默认。

会话级别:

修改日期格式,会话有效

SQL> alter session set nls_date_format=’yyyy-mm-dd’;

查看日期格式

SQL> select sysdate from dual;

登出

SQL> exit

登入

[oracle@localhost ~]$ sqlplus / as sysdba

再次查询日期格式

SQL> select sysdate from dual;

系统级别:

修改如下参数的值

alter system set sga_max_size=2048000000 scope=both;
返回错误提示,表示不能两个都修改

修改语句后再执行

alter system set sga_max_size=2048000000 scope=spfile;
语句执行正常。

删除静态参数文件后,重启实例

[oracle@localhost dbs]$ rm -rf initorcl.ora
SQL> startup;
返回错误提示,表示SGA_MAX_SIZE的值不能超过MEMORY_TARGET的值
我们需要修改参数文件,而数据库无法启动便无法修改参数文件,出现矛盾。

解决办法为由动态参数文件生成静态参数文件,修改静态参数文件即可

动态产生静态

SQL> create pfile from spfile;

修改静态参数文件

[oracle@localhost ~] ll l l ORACLE_HOME/dbs
initorcl.ora为静态参数文件
修改SGA_MAX_SIZE的值符合要求,保存退出。

静态产生动态

SQL> create spfile from pfile;

启动数据库实例

SQL> startup;
即可正常启动

找一个参数

SQL> col IN_EFFECT FOR A20;
SQL> COL IN_FILE FOR A20;
SQL> select p.value in_effect,s.value in_file from v parameterpjoinv p a r a m e t e r p j o i n v spparameter s on p.name=s.name where p.name=’db_file_multiblock_read_count’;

修改内存中的值

SQL> alter system set db_file_multiblock_read_count=16 scope=memory;

修改文件中的值

SQL> alter system set db_file_multiblock_read_count=64 scope=spfile;

再看下

SQL> select p.value in_effect,s.value in_file from v parameterpjoinv p a r a m e t e r p j o i n v spparameter s on p.name=s.name where p.name=’db_file_multiblock_read_count’;

改回去

SQL> alter system set db_file_multiblock_read_count=16 [scope=all];
OR 重设
SQL> alter system reset db_file_multiblock_read_count;

更改日志缓冲区

SQL> alter system set log_buffer=10m;
这是一个静态参数,所以会失败

环境变量

配置环境变量

编辑oracle用户家目录的.bash_profile文件,追加以下内容:

export ORACLE_BASE=/u01/app/oracle 所有oracle软件安装的路径
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 所有软件安装的目录
export ORACLE_SID=orcl
export PATH= PATH: P A T H : ORACLE_HOME/bin
export NLS_LANG=”SIMPLIFIED CHINESE_CHINA.UTF8”
注意sqlplus登录时的提示语言
无需再使用. oraenv来配置环境变量

  • hash 实现缓存管理

    哈希
    缓存,命中率相当高,在hash表中保存了执行过的所有的路径,当缓存很大时,一定比PATH查找速度快吗?

  • hash 命令哈希

 -p /bin/ls haha   添加哈希表
 -t ls   查看指定命令的哈希表
 -d ls   删除指定命令的哈希表
 -r 清空所有的hash表

启动和关闭

实例启动:

第一阶段:启动实例
SQL> startup nomount;
找到参数文件,根据参数文件,划分内存空间和启动数据库进程

查看进程

[oracle@localhost ~]$ ps -ef

查看内存

[oracle@localhost ~]$ ipcs -a

参数文件也可以访问

SQL> desc v$parameter;

查看控制文件

SQL> show parameter control;

第二阶段:打开控制文件
SQL> alter database mount;
根据参数文件中的设置,找到控制文件,打开控制文件.

第三阶段:打开数据库
SQL> alter database open;
根据控制文件打开数据文件和redo log文件。

实例关闭
有四个选项可以选择
默认是normal
1、abort
模拟突然掉电
内存被清空、内存中的数据没有写入数据文件
事务被立即中断
没有提交、没有回滚

2、immediate
强制中断当前正在运行的所有事务,回滚这些事务
回滚完毕,强制中断所有的连接
将实例中的所有数据写入数据文件

3、transactional
等待正在运行的事务,一直到他们提交或者回滚
所有事务主动结束以后(提交或者回滚),强行中断连接
将实例里面的数据写入数据文件
清空缓存
如果有事务一直没有提交或者回滚,实例无法关闭

4、normal
等待事务的主动提交或者回滚
等待用户主动断开连接
如果有一个用户没有断开连接,那么数据库无法关闭

通常,2/3/4被认为是干净的,一致的,有序的关闭,关闭时,PMON会回滚未结束的事务,CKPT进程会执行完全检查点,通知DBWn进程将所有脏块写入数据文件,LGWR将log buffer中的内容写入redo log

startup force命令是先执行shutdown abort,再执行startup,被认为是不安全的

归档日志

查看归档模式

SQL> select log_mode from v$database;

查看归档日志文件所在路径

SQL> SHOW PARAMETER LOG_ARCHIVE_DEST;

查看当前归档配置

SQL> show parameter log_archive;
在root 下
mkdir /data/archive/2 -p
chown oracle:oinstall /data/ -R
chmod 777 /data/
在oracle下
cd /u01/app/oracle/
mkdir data
mkdir data/archive/1 -p
mkdir data/archive/3 -p

配置本地归档目标

SQL> alter system set log_archive_dest_1=’location=/u01/app/oracle/data/archive/1’ scope=spfile;
SQL> alter system set log_archive_dest_2=’location=/data/archive/2’ scope=spfile;
SQL> alter system set log_archive_dest_3=’location=/u01/app/oracle/data/archive/3’ scope=spfile;

启用数据库归档模式

完整关闭数据库

SQL> shutdown immediate;

启动到mount阶段

SQL> startup mount;

更改数据库到归档模式

SQL> alter database archivelog;

打开数据库

SQL> alter database open;

进行确认

SQL> select log_mode from v database;SQL>selectarchiverfromv d a t a b a s e ; S Q L > s e l e c t a r c h i v e r f r o m v instance;

强制切换日志

SQL> alter system switch logfile;

查看归档日志文件

SQL> select name from v$archived_log;

通过操作系统查看

[oracle@localhost dbs]$ ll /data/archive/{1,2}

配置归档进程个数

SQL> alter system set log_archive_max_processes=3;

禁止某个归档目标

SQL> alter system set log_archive_dest_state_1=defer scope=pfile;

alter system set log_archive_dest_state_2=defer;
alter system set log_archive_dest_state_3=defer;

启用某个归档目标

SQL> alter system set log_archive_dest_2=enable;

服务器参数文件
SQL> SELECT NAME,VALUE,ISMODIFIED FROM V$PARAMETER;
SQL> SHOW PARAMETER;

其他文件
密码文件
作用:主要进行DBA权限的身份认证
DBA用户:具有sysdba,sysoper权限的用户被称为dba用户。默认情况下sysdba角色中存在sys用户,sysoper角色中存在system用户
Oracle的两种认证方式;
1.使用与操作系统集成的身份验证
2.使用Oracle数据库的密码文件进行身份认证
密码文件的位置
Linux下的存放位置: ORACLEHOME/dbs/orapw O R A C L E H O M E / d b s / o r a p w ORACLE_SID
即:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl
Windows下的存放位置:$ORACLE_HOME/database/PWD%ORACLE_SID%.ora

警告文件
作用:记录oracle的运行信息和错误信息,如数据库启动、关闭,建立表空间,增加数据文件,空间扩展失败,实例启动失败等
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

告警日志是应用于实例和数据库的关键操作的连续记录,名称为alert_SID.log.
包括的关键操作:
所有启动和关闭命令,包括中间命令,如ALTER DATABASE MOUNT
实例的所有内部错误
任何检测到的数据块损坏情况
任何已经发生的记录锁定死锁
影响数据库物理结构的所有操作,如创建或重命名数据文件
调整初始化参数的操作
所有日志开关和日志归档

追踪日志
追踪日志由各个后台进程生成,一般在遇到错误时生成,所在目录和告警日志一起

查看告警日志目标

SQL> select value from v$parameter where name=’background_dump_dest’;

使用工具查看相关文档

[oracle@localhost trace]$ tail -f alert_orcl.log

关闭和启动实例,然后注意告警日志

SQL> shutdown immediate;
SQL> startup;

跟踪文件
后台进程跟踪文件
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/.trc
用户进程跟踪文件
SQL> show parameter background
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora.trc
这里写图片描述

评论 4 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

angelxf520

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值