Oracle12cR2学习记录3
体系结构
学习oracle的目的
数据一致性和优化性能,但是数据一致性的要求优先于性能
处理模型
C/S模型 客户端:用户和用户进程 服务器端:服务器进程、实例和数据库本身
概念
实例/instance: 后台进程+共享内存 用于管理和控制数据库 数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等 数据库服务器/database server: 软件+实例+数据库
数据库环境分为两部分:
oracle软件,存放在服务器本地硬盘上 oracle数据库,存放在共享存储上
实例
oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭 一个数据库可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做RAC技术
查看oracle实例
ps -ef | grep ora
查看相关内存
ipcs #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
无连接、无会话、无进程
shutdown immediate; exit sqlplus /nolog !ps -ef | grep ora
有连接,有会话,有进程
SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE USERNAME IS NOT NULL; !ps -ef | grep ora
#查看进程和会话之间的关系
select name,value from v$parameter where name='processes'; select name,value from v$parameter where name='sessions'; select (1.5*150)+22 from dual;
物理存储结构
数据库的几类文件
CONTROL FILE 控制文件 在线 DATA FILE 数据文件 在线 REDO LOG FILE 重做日志文件 在线 PARAMETER FILE 参数文件 在线 ARCHIVE LOG FILE 归档日志文件 离线 PASSWORD FILE 密码文件 离线 ALERT FILE 告警文件 TRACE FILE 追踪文件 在线文件 文件实时改变,不能进行操作 离线文件 文件生成后不会改变
安全
复用:尽可能不要单点 分散:尽可能多地存放
控制文件
作用:用于记录数据库的物理结构,属于重要角色,没有控制文件,实例立即崩溃,数据库的启动和正常运行都离不开控制文件 包含的内容:数据库物理结构信息,数据库归档历史信息,各个数据文件的SCN号和系统检查点信息,RMAN元数据 性质:控制文件是一个二进制文件,不可以通过文本编辑器编辑,该文件由oracle自行维护,oracle建议至少有两份冗余,并且放在不同的磁盘上。 默认块大小为16K 查看: show parameters control_files; select * from v$controlfile;
数据文件
作用:用来存储实际数据,数据文件是存储数据的物理概念 数据文件的状态: ONLINE: 联机状态 OFFLINE: 脱机状态 OFFLINE DROP: 删除数据文件 将数据文件OFFLINE时,不会影响表空间的状态,但是表空间的状态会影响到数据文件的状态 查看: col name for a30 select file#,name,status from v$datafile; select * from dba_data_files; select * from dba_temp_files;
逻辑存储结构
段Segments、区Extents、块DataBlocks
从存储的角度只有段,记录到数据字典 段Segments: 一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的对象,一个段只能属于一个数据库对象 有以下几种段: 数据段:数据段存放的是数据表中的数据,数据段的增大时向数据段增加区,创建表时,系统自动创建一个同名的段 索引段:包含了用于提高系统性能的索引,一旦建立索引,系统自动创建一个同名的索引段 回滚段:也叫撤销段,该段保存了回滚的条目,oracle将修改前的旧数据存放在回滚段中,利用这个,可以撤销未提交的操作 临时段:当执行创建索引、查询等操作时,系统会使用一些临时空间用来保存解析过的查询语句以及在排序过程中产生的临时数据 区Extents: 段空间分配时最小的单位,由连续的数据块组成 块DataBlocks 组成区的最小单位,通常是操作系统数据块的整数倍,ORACLE支持同时使用多种大小 块组成部分: 块头:存放数据块的基本信息,如块的物理地址,块所属段的类型 表目录:如果是数据表,存放数据表的相关信息 行目录:如果有行数据,那么存储行信息 空余空间:新行插入和存在行的更新 行数据:存放表数据和索引数据 #查看标准数据库块大小 COL NAME FOR A30 COL VALUE FOR A30 SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME='db_block_size';
表空间tablespace
表空间是数据库的最大逻辑存储结构,和物理数据文件相对应,一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间 分类: 基本表空间: 一般为用户使用的永久性表空间,存储用户永久性数据 临时表空间: 临时表空间是一个磁盘空间,存储用户在执行ORDER BY等语句进行排序或汇总时产生的临时数据,默认情况下所有用户都使用temp作为默认的临时表空间,也允许使用其他临时表空间作为默认临时表空间,需要在创建用户时指定大文件表空间: 存储大型数据 非标准数据块表空间:在一个实例中创建数据库大小不同的表空间 撤销表空间:存储事务的撤销数据,在数据恢复时使用,一个数据库中可以有多个撤销表空间,但是数据库一次只能使用一个,默认使用自动创建的undotbs撤销表空间 主要的几个表空间: SYSTEM: 系统表空间,用于存放内部表和数据字段的数据,如表名、列名、用户名 SYSAUX: 系统辅助表空间,由ORACLE自行维护 UNDO:存放撤销信息的表空间 USERS:建议用户使用的表空间,scott用户的表就在这个表空间上 状态属性: ONLINE: 在线,允许访问该表空间中的数据 OFFLINE: 离线,不允许访问该表空间的数据 READ ONLY: 只读,只允许读,必须处于ONLINE状态,不能包含任何事务的回滚段,不能处于在线备份期间 READ WRITE: 读写,可以读写,必须处于ONLINE状态 建议:不同应用系统存放在不同的表空间上,不同的表空间的文件放在不同的磁盘上,减少并发,提高性能
#查看数据字典的信息 COL TABLE_NAME FOR A30 COL COMMENTS FOR A30 SELECT * FROM DICT;
#查看数据库内部表的信息 COL VIEW_NAME FOR A30 COL VIEW_DEFINITION FOR A30 SELECT * FROM V$FIXED_VIEW_DEFINITION;
#查看表空间 select tablespace_name,contents from dba_tablespaces;
#查看表空间对应的数据文件 col file_name for a80 set linesize 600 select distinct file_name,tablespace_name from dba_data_files;
#查看USERS表空间 SELECT SEGMENT_TYPE,SEGMENT_NAME,OWNER FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='USERS';
#创建一个表 create table hehe (c1 varchar2(10)) segment creation immediate; #查询该表的段的表空间,区id等信息 select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name='HEHE';
#根据文件编号查找对应的数据文件 select name from v$datafile where file#=&file_id;
#根据块id和和块大小来计算块的起始位置 select block_size * &block_id from dba_tablespaces where tablespace_name='&tablespace_name';
1
#创建表空间newtab create tablespace newtab datafile '/u01/app/oracle/oradata/orcl/newtab01.dbf' size 10m extent management local autoallocate segment space management auto; #创建表newtable到表空间newtab create table newtable(c1 date) tablespace newtab; #查看该表的相关段信息,确定第一个区大小 select extent_id,segment_name,segment_type,tablespace_name,bytes from dba_extents where segment_name='NEWTABLE';
#手动增加区,重复执行4次,然后再次查看相关区的信息 alter table newtable allocate extent; select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name='NEWTABLE';
#让表空间脱机 alter tablespace newtab offline; #插入数据到表newtable; insert into newtable values(sysdate);
#将表空间上线 alter tablespace newtab online; #再次插入数据 insert into newtable values(sysdate);
#将表空间设置为只读 alter tablespace newtab read only; #插入数据到表newtable insert into newtable values(sysdate);
#将表空间设置为读写 alter tablespace newtab read write; #插入数据到表newtable insert into newtable values(sysdate);
#查看表空间状态 select tablespace_name,status from dba_tablespaces;
#向表空间newtab中增加数据文件 alter tablespace newtab add datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' size 50m; #查看新增的数据文件 select distinct file_name,tablespace_name,autoextensible from dba_data_files;
#修改数据文件 alter database datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' autoextend on next 50m maxsize 2g; #修改数据文件大小 alter database datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' resize 70m; #删除表空间newtab; drop tablespace newtab including contents and datafiles;
段管理
使用自动段管理,使用位图进行管理
#查看表空间的段管理方式 #手动转换自动请新创建表空间 select tablespace_name,segment_space_management from dba_tablespaces;
区管理
区管理方法为每个表空间设置,应用于表空间中的所有段,可使用字典管理或者本地管理,但是请不要使用字典管理
字典管理:使用两张表对区进行管理
本地管理:使用位图来管理区
使用uniform size指定每次分配的区大小
#创建一个区大小为150m的表空间dabiao create tablespace dabiao datafile '/u01/app/oracle/oradata/orcl/dabiao_01.dbf' size 5g extent management local uniform size 150m; #查看创建好的表空间中数据文件的大小 select name,bytes/1024/1024 from v$datafile
#查看表空间的信息 select tablespace_name,next_extent,min_extlen from dba_tablespaces;
#创建一个区大小为150K的表空间xiaobiao create tablespace xiaobiao datafile '/u01/app/oracle/oradata/orcl/xiaobiao_01.dbf' size 2g extent management local uniform size 150k; #查看创建好的表空间中数据文件的大小 select name,bytes/1024/1024 from v$datafile;
#查看表空间的信息 select tablespace_name,next_extent,min_extlen from dba_tablespaces;
#ORACLE公司建议使用autoallocate关键字 create tablespace xiaobiao1 datafile '/u01/app/oracle/oradata/orcl/all_01.dbf' size 2g extent management local autoallocate; #删除 drop tablespace dabiao including contents and datafiles; drop tablespace xiaobiao including contents and datafiles; drop tablespace xiaobiao1 including contents and datafiles;
内存结构
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内存详情
col component for a30; 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空间仍然要有限制
#查看当前配置 #默认为自动 SHOW PARAMETER AREA;
#查看当前pga的分配情况 select name,value from v$pgastat where name in('maximum PGA allocated','total PGA allocated');
#查看_pga_max_size的值 col name for a20 col value for a20 col desc for a20 SELECT KSPPINM "Name",ksppstvl/1024/1024 ||'M' "Value",ksppdesc "Desc" from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm = '_pga_max_size'; #生产环境中可根据上述查询结果来估算PGA空间大小 #修改内存大小 alter system set 内存参数=大小
进程结构
生产环境中,前台进程远远多于后台进程
后台进程
DBWn: 将buffer cache中的脏数据写入到dbf中,只写不读 执行时间点:没有任何可用缓冲区、脏缓冲区过多、三秒超时、遇到检查点
#查看当前DBWn数量 show parameter db_writer_processes;
#修改DBWn数量 alter system set db_writer_processes=20 scope=spfile; alter system set db_writer_processes=20 scope=both; #收到错误提示ORA-02095: specified initialization parameter cannot be modified #有些参数不能动态修改,需要使用ALTER SYSTEM SET parameter = value scope = spfile, 然后重新启动数据库才能生效
#设置检查点 alter system checkpoint;
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
周期性触发,更新检查点信息,更新到控制文件和每个数据文件头部。 检查点类型: 1、完全检查点,执行ALTER SYSTEM CHECKPOINT,正常关闭实例 2、增量检查点 检查点队列:该队列是脏数据块所对应的buffer header,dbwn按照这个写
SMON
主内,监控实例内部,实例恢复,如整理碎片,清理不使用的临时段
PMON
主外,监控用户连接。 1、在用户进程失败时执行进程恢复 2、清除数据库缓冲区高速缓存 3、释放该用户进程使用的资源 4、监视会话是否发生空闲会话超时 5、将数据库服务动态注册到监听程序
ARCn
将写满后的redo log写入到归档日志中。可以收集事物处理重做数据,并将该数据传输到备用目标位置
MMON
自我监视和自我管理支持进程
MMNL
MMON辅助进程,
ADDM
自动数据库诊断监视器
MMAN
自动内存管理
LREG
监听注册进程
前台进程
服务器进程,应用程序服务器产生到数据库服务器的连接,多个连接形成一个连接池
本站所有文章均可随意转载,转载时请保留原文链接及作者。