文章目录
1 Oracle 11g
1.1 版本顺序
- i 就是Internet
- grid 是格子,而放在计算机专业词汇⾥面就是网格计算
网格计算就是统一的把网络上各计算机的各种资源整合起来,虚拟成一个大的资源池,跟据各种的请求动态的分配计算机资源,消除资源的冗余以及资源利用程度不够的现象,达到申请与分配的均衡点。 - c 就是cloud的云计算
1.2 中间键
本地有一个连接数据库就有一个LOCAL=YES的进程:
1.3 Oracle 数据库
Oracle DataBase是一款关系型数据库管理系统(RDBMS),同类的产品还有MySQL,SQLServer,ACCESS等。
我们会把那个承载我们核心数据的系统笼统地称为数据库服务器
严格意义上来讲Oracle DataBase是由两个部分组成:
实例instance+数据库database=database server(提供应用程序工作)
2 Oracle Server
Oracle instance:一组后台进程和内存结构
Oracle database:存放在操作系统上的物理文件
2.1 database
- 查看数据文件、控制文件、日志文件
2.1.1 datafile 数据文件
数据文件最多100个
2.1.2 control file 控制文件
控制文件记录了数据文件、日记文件的位置等一切信息。
数据库控制文件是数据库启动和成功操作所必需的⼀个小型二进制文件。在数据库使用过程中,Oracle数据库会不断更新控制⽂文件,因此⽆论何时打开数据库,它都必须能够用于编写。如果由于某种原因控制文件不可访问,那么数据库就不能正常运行。
每个控制文件只与一个oracle数据库关联
控制文件包含有关实例访问所需的关联数据库的信息,这些信息在启动时和正常操作时都需要。控制文件信息只能通过Oracle数据库修改;没有数据库管理员或用户可以编辑控件文件
1.功能和特点:
1)记录数据库当前物理状态 ,记录了数据文件datafile和日志文件logfile的所有信息。
2)维护数据库的一致性(SCN#)
3)是一个二进制小文件
4)在mount阶段被读取
5)记录RMAN备份的元数据
控制文件记录了所有文件的文件头信息,可以将控制文件想象成一个管理士兵的长官,要保证数据库中每个成员的SCN#号一致
如果在数据库启动的时候,发现某个不是read only或者offline的数据文件的SCN#号比别的数据文件少一点的话,控制文件会对这个文件进行recover操作,以维护数据文件的一致性,CKPT帮助完成
每个控制文件只与⼀个oracle数据库相关联。
控制文件信息只能通过oracle数据库修改;没有数据库管理员或用户可以编辑控制文件。
- controlfile不能在操作系统层看到,必须手动生成控制文件到操作系统层面:
2.查看控制文件信息
SQL> select * from v$controlfile;
SQL> show parameter control_files
- 显式:数据文件,redo log文件
- 隐式:LGWR 负责把当前日志序列号记录到控制文件中,CKPT 负责把校验点的信息记录到控制文件中,ARCN 负责把归档日志的信息记录到控制文件中
3.控制文件更新机制
1)当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle 服务器进程(Server Process)会立即更新控制文件以反映数据库结构的变化。
2)日志写进程 LGWR 负责把当前日志序列号记录到控制文件中。
3)检查点进程 CKPT 负责把校验点的信息记录到控制文件中。
4)归档进程 ARCN 负责把归档日志的信息记录到控制文件中。
通过视图 v$controlfile_record_section
可以了解到控制文件中记录了大量的数据库当前状态信息
4.控制文件多元化(多路复用)
为了避免数据库出现故障,把多个文件存放在不同位置,数据库应具备:
两个控制文件副本(最好三个)
每个磁盘上一个副本
至少在单独的磁盘控制器上有一个副本
5.手动添加控制文件:
1)先备份参数文件
SQL> create pfile from spfile;
服务器参数文件SPFILE:是一个二进制文件
文本初始化参数文件PFILE:与SPFILE内容一样,服务器启动的时候默认使用SPFILE启动
这个命令可以依据限制的spfile创建一个pfile
2)查看当前控制文件信息
SQL> show parameter control_files;
3)修改控制文件,并在参数中增加一个新的控制文件
SQL> alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl',
'/u01/app/oracle/oradata/orcl/control02.ctl',
'/u01/app/oracle/oradata/orcl/control03.ctl' scope=spfile;
4)修改后查看
SQL> show parameter control_files;
重启后才生效
5)复制控制文件,Oracle 建议分配在不同的物理磁盘上
[oracle@vm01 ~]$ cd /u01/app/oracle/oradata/orcl
[oracle@vm01 orcl]$ cp control01.ctl control03.ctl
6)重启数据库
SQL> shutdown immediate
SQL> startup
6.恢复控制文件的方法
控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,重建控制文件必须使系统在NOMOUNT状态下
- 单个文件损坏了:通过简单复制解决。
- 所有的控制文件丢失:
- 如果有 binary 控制文件备份,利用备份恢复控制文件,
- 如果没有备份,利用 trace 脚本文件重新创建控制文件(代价:丢失归档记录信息和 RMAN 备份信息)
1)正常关库,模拟全部控制文件丢失
SQL> shutdown immediate
[oracle@vm01 orcl]$ rm control0[1-3].ctl
2)启动数据库实例报错
SQL> startup
3)重建控制文件
- mount或open下,先生成一个脚本
SQL> alter database backup controlfile to trace as '/u01/app/oracle/oradata/oradb/ control.trc';
- nomount 状态执行重建控制文件中的创建语句
[oracle@vm01 oradb]$ more control.trc
STARTUP NOMOUNT CREATE CONTROLFILE REUSE
DATABASE "oradb" NORESETLOGS MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100
MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1
'/u01/app/oracle/oradata/oradb/redo01.log' GROUP 2
'/u01/app/oracle/oradata/oradb/redo02.log' GROUP 3
'/u01/app/oracle/oradata/oradb/redo03.log' -- STANDBY LOGFILE DATAFILE
'/u01/app/oracle/oradata/oradb/system01.dbf','/u01/app/oracle/oradata/oradb/sysaux01.dbf',
'/u01/app/oracle/oradata/oradb/undotbs 01.dbf','/u01/app/oracle/oradata/oradb/users01.dbf',
'/u01/app/oracle/oradata/oradb/example01.dbf','/u01/app/oracle/oradata/oradb/tbs 16k.dbf'
CHARACTER SET ZHS16GBK ;
可以看到执行后,三个控制文件又重新建立了。这时数据库已在mount下,说明重建控制文件的过程有两大部分内容:
第一部分是脚本中的可见信息:
- 定义db_name
- 指定几个参数限定控制文件的最大值
- 在线日志的物理信息
- 数据文件的物理信息
- 使用的字符集
第二部分是隐含的不可见信息,比如SCN信息,重建复制了当前所有数据文件头部最新SCN信息复制到了控制文件中,以便接下来打开数据库。
- 查看SCN
SQL> select file#,checkpoint_change# from v$datafile;
SQL> select file#,checkpoint_change# from v$datafile_header;
2.1.3 redo log file 重做日志文件
1.记录了:
- REDO条目(redo entries) 记录SQL语句本身,
- 执行后对数据库中某个文件某个块做的修改。包括DML、DDL操作。
2.作用:实例恢复 instance recovery
3.特征
- 日志条目+记录数据库中块的变化(DML、DDL):由LGWR写入
- 用于数据块的 recover
- 以组的方式管理 redo file,最少两组 redo,循环使用
- 和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用 RAID10)
- 日志的 block 和数据文件的 block 不一样
4.redo file group
三组循环使用,每组就一个文件。如果有文件坏了,风险会变大,所以会增加第二个member。一个组里的所有文件的内容是同步的。所以部署在不同的磁盘上。
5.重要的三个视图
1)v$log
SQL> select group#,sequence#,bytes/1034/1024 size_M,blocksize,members,status from v$log;
GROUP# SEQUENCE# SIZE_M BLOCKSIZE MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
1 10 49.516441 512 1 INACTIVE
2 11 49.516441 512 1 INACTIVE
3 12 49.516441 512 1 CURRENT
第一组只有一个成员member,就是说第一组只有一个redo log
最大的序列号就是当前正在被使用的,如果现在用到3了,那么3的号会变为102
默认大小是50M,数据块字节是512
2)v$filelog
3)v$archived_log
(归档模式下查看)
THREAD#: 线程在单实例的环境下,thread# 永远是 1
SEQUENCE# 日志序列号。在日志切换时会递增,每一个节点有一个自己的编号
FIRST_CHANGE# 在每个日志组对应一个 sequence 号,其中首条日志条目的第一个的 scn。
6.工作原理
STATUS 列有四种状态:
- current: 当前日志组对应的脏块还没有全部从 data buffer 写入到 data file,含有实例恢复需要的信息,不能被覆盖
- active: 日志组对应的脏块还没有完全从 data buffer 写入到 data file,含有实例恢复需要 的信息,不能被覆盖
- inactive: 日志组对应的脏块已经从 data buffer 写入到 data file,可以覆盖(如果循环回来是active,那么数据库要等到inactive才能用)
- unused:新添加的日志组,还没有使用
只要redo log的状态不是current和active就都会被用
7.添加日志组
如果redo特别忙,切换的过程一直是active,就会一直没有可用的,要一直等
切换日志组:
SQL> alter system switch logfile;
- 查看当前信息
- 添加日志组
- 查看状态
- 切换日志组
4个组并不是按顺序循环的
8.添加成员文件
- 为每个组增加一个 member(一共是 4 个组) 先建好目录,准备放在/u01/app/
oracle/oradata/log_member1下(假设这个目录是一块新的磁盘)
- 为group 1 添加成员文件
- 为所有group添加1个成员
STATUS 是 INVALID,说明 member 还没有同步好。 - 切换日志组,完成同步,消除invalid
- 一次添加2个成员文件
9.删除日志组
SQL> alter database drop logfile group5;
SQL> select group#,status,archived from v$log;
drop logfile group不会删除磁盘上文件,删除物理文件需要rm
删除日志组的时候,控制文件也被更新
- current和active状态下的group不能删
- 把active变为inactive的办法:手动发起检查点
- 删除日志组
- 手动删除物理文件
10.日志成员文件的迁移 - 方法一:关库-移动
- 方法二:先删后加
11.修改现有的日志文件大小
先删再建
2.1.4 archived log files 归档日志文件
是处于非活动(INACTIVE)的状态的重做日志文件的备份。是在线日志的离线拷贝版本,当在线日志切换的时候,ARCH进程就会将这个刚刚关闭的在线日志文件的内容复制到磁盘上,长期保存
1.查看是否是归档模式
archive log list
日志模式:归档
是否自动:是
路径:备份文件在哪里
最老的在线日志序列号:136
下一个被归档的序列:139
当前日志序列号:139
手动切换一下序列后,在以上路径查询,看到139已经被归档
select name,log_mode from v$database;
SCN号和时间的相互转换
- 查看归档后台进程
2.归档VS非归档
- 归档会在日志切换时,备份历史日志,对于 OLTP 系统都应考虑归档模式,以便数据库能支持热备 ,并提供数据库完全恢复和不完全恢复(基于时间点)
- 归档会启用 arcn 的后台进程、也会占用磁盘空间
- 非归档适用某种静态库、测试库、或者可由远程提供数据恢复的数据库。非归档只能冷备, 且仅能还原最后一次全备。归档可以恢复到最后一次 commit
3.归档日志命名格式
log_archive_format
是定义命名格式的,一般考虑使用下面三个内置符号(模板)
%t thread# 日志线程号(我们目前是单机,所以节点都是1,如果是多机,一般都有)
%s sequence 日志序列号
%r resetlog 代表数据库的周期
- 文件名
- 设置归档文件命名格式(静态参数,scope=spfile,重启后生效)
4.归档路径
归档日志默认的存放路径 : $ORACLE_HOME/dbs
Oracle 配置归档路路径有以下几个参数:
- 方法1:通过
log_archive_dest
参数指定归档文件存放的路径,该路径只能是本地磁盘 - 方法2:通过
log_archive_dest_n
参数Oracle最多支持把日志文件归档到10个地方,n是从1到10。
归档地址可以为本地磁盘,或者网络设备。
1)创建专门存放归档日志的目录
2)在数据库中修改归档日志存放路径
3)手动切换日志
4)在操作系统上的arch目录中查看是否有arch生成
- 方法3(推荐):
db_recovery_file_dest
参数指定的位置快速恢复区,并将归档日志保存至闪回区(有管理的功能,相当于画一个圈,只能用这么多,不能无休止的归档)
通过配置闪回区保存归档日志,修改db_recover_file_dest
参数。
闪回:提供了将整个数据库回退到过去某个时刻的能力
涉及以下两个参数
db_recovery_file_dest_size
: 设置闪回区的大小
db_recovery_file_dest
: 设置闪回区的位置
1)创建目录
2)设置闪回区的大小和位置
并不校验操作系统是否有这么大
3)查看规定情况及信息
4)配置让归档路径使⽤闪回区
5)查看归档信息
说明使用了闪回区,想知道闪回区的地址,就查询这个参数:
5.删除归档日志
不建议手工删除磁盘上的归档日志文件,建议使用rman工具来删除
因为人为的操作非常容易有误操作。
使用rman工具登录数据库
- 方法一:删除到 n号归档文件
- 方法二:删除 n天前的归档文件
delete NOPROMPT archivelog all completed before 'SYSDATE-1';
NOPROMPT:不进行交互
没有可删除的文件
- 删除某个Sequence之前(包含该Sequence)的归档日志
RMAN>delete archivelog until sequence xxx;
RMAN>delete archivelog from sequence xxx until sequence xxx;
- 删除系统时间1天以前的归档日志,不会删除闪回区有效的归档日志(可以指定删除多久日志)
RMAN>delete archivelog all completed before ‘sysdate-1‘;
- force参数表示会删除有效归档日志
RMAN>delete force archivelog all completed before 'sysdate-1';
- 删除某个时间段的归档日志,例如删除20天前到2天前的归档日志。
RMAN>delete noprompt archivelog from time 'sysdate-20' until time 'sysdate-2';
2.1.5 parameter file 参数文件
2.1.6 password file 口令文件
2.2 实例 instance
instance=内存结构(SGA+PGA)+后台进程background processes
2.2.1 memory structure 内存结构
oracle memory= SGA + PGA
SGA:system global area 系统全局区
共享的:所有 server process 和 background process 共享
PGA:program global area 程序全局区,
私有的:每⼀个 server process 和 background process 拥有⾃⼰的 pga
- 查看分配给数据库的内存大小
- 查看数据库中分配给SGA的大小
- 查看当前系统物理内存的大小
- sga_target : SGA 可动态调整的尺寸
- sga_max_size : SGA 最大值
- pga_aggregate_target : PGA 累计的最大值
- memory_target : 内存可动态调整的尺寸 sga_target + pga_aggregate_target
- memory_max_target :oracle 服务器可使用最大内存大小(SGA+PGA)
3 SGA global area 系统全局区
SGA 6 个基本组件:
1.shared pool共享池
2.database buffer cache数据库缓冲区
3.redo log buffer重做日志缓冲区
4.large pool
5.java pool
6.streams pool流池
3.1 shared pool 共享池
3.1.1 作用
共享池是对 SQL、PL/SQL 程序进行语法分析、编译、执行的内存区域。
分析敲得命令,然后编译给执行。
- 最近执行的SQL
- 最近执行SQL所用的数据的定义
3.1.2 组成
高速缓冲区和数据字典缓冲区
3.1.3 参数 SHARED_POOL_SIZE
- 查看共享池参数
SQL> show parameter shared_pool_size
- 查看视图
SQL> select * from v$sgainfo;
3.1.4 Library Cache 高速缓冲区
存储了所有编译过的SQL语句、PL\SQL 语句由所有用户共享使用
1.软解析 soft parse:
发起一条SQL时,首先检查Library Cache中是否有一条已经解析过的且准备执行相同语句。若有,Oracle就直接调用,执行速度快。
2.硬解析 hard parse:
如果Oracle 未发现Library Cache有此SQL代码的执行版本,则必须建立新的可执行代码(第一次编译的过程)
如果没有,那么就要先编译这个select语句,产生的结果对应一个hash_value编号(SQL_ID)(注意这个编译结果不是输出内容的结果,而是将命令语句转换成计算机执行的依据),那么这个编译结果和其对应的编号(SQL_ID)就存在了share pool里。这个过程叫硬解析。
类似database buffer cache,使用最近最少使用的算法进行管理 ( LRU )
在一些极端的情况下,一个SQL会对应两个hash_value,
例如,前后执行两次完全一样的SQL,但是中途增加或删除了对象的索引,那么Oracle有可能会为这个SQL语句生成两个hash_value值。
补充:例如select * from emp where enmae='XXX';
这样的语句,如果执行多个这样的查询,不如将XXX部分设成变量
这样的话select * from emp where enmae= ' &name';
这个语句就会被作为一个经常使用的语句。
3.1.5 Data Dictionary Cache 数据字典缓冲区
主要存储对象定义、用户名、角色、权限等信息。
当执行一段SQL代码时: Oracle 首先需检查你是否具有执行该操作的权限。
在Data Dictionary Cache
中查看是否有相关的对象信息
若无,Oracle把对象信息从数据字典表读到Data Dictionary Cache
中。
没有直接调整Library cache
和Data Dictionary Cache
大小的方法,只能通过增加或减少Shared pool
3.2 database buffer cache
3.2.1 作用
存储从恢复了的数据文件中拷贝数据块的副本
在读取和更新数据时,能够获得更大的性能提升
通过LRU算法进行管理:为经常使用的表缓存数据
通过块读,DB_BLOCK_SIZE
用于确定主块大小
3.2.2 功能
1)缓存数据
用于缓存从磁盘数据文件中读⼊的数据块,为所有用户共享。
服务器进程(server process)负责将数据文件的数据从磁盘读入到数据缓冲区中,当后续的请求需要这些数据时,如果在内存中找到,则不需要再从磁盘读取。
2)延迟写数据文件
对数据的修改在内存缓冲区中进行,减少写磁盘的次数,提高 I/O 能力。 数据缓冲区中被修改的数据块(脏块 dirty block)由后台进程 DBWR 将其写入磁盘。(系统自动或我们手动发起check point的时候)
数据缓冲区的⼤小对数据库的读取速度有直接的影响。
LRU list least recently used LRU-W list(write list / dirty list)
3.2.3 组成
两个管理列表:写列表和最近最少使用的(LRU)列表
内存缓冲区分成三部分:
1)free buffer
空闲缓冲区不包含任何有用的数据,数据库可以重用他们保存从磁盘读取的新数据,随时可用
2)dirty buffer
脏缓冲区,包含已修改但尚未写到磁盘的数据(进程DBWR把脏块写入datafile,在checkpoint时)
3)pinned buffer
保留缓冲区,是用户会话当前正在激活使用的数据缓冲区,正在使用的
3.2.4 default pool
Buffer pool = default pool + nodefault pool
default pool 参数:db_cache_size
1)一个标准块存放的内存空间⼤小
2)SGA 自动管理时此参数 不用设置,使用LRU算法清理空间
3)标准块⼤小(默认 8K)
3.2.5 nodefault pool
1.nodefault pool参数
-
db_nk_cache_size
指定非标准块⼤小内存空间,2k、4k、16k、32k -
db_keep_cache_size
keep pool
存放经常访问的小表或索引等 -
db_recycle_cache_size
使用后立即将数据从缓存中删除。用来存放偶尔做全表扫描的大表的数据。这样一来,大表就不占用default区了
如果没有分配keep和recycle 那么,所有数据库对象都将分配给默认缓冲区,该值的size根据DB_CACHE_SIZE初始化参数的值而定
2.配置
如需使用非标准块那么,需要进行以下配置
- 在
buffer cache
中配置相应的非标准块高速缓存 - 创建非标准块尺寸的表空间 tbs_32,datafile
- 将相应数据保存在非标准块存储空间上
create table xxx tablespace tbs_32;
3.2.6 命中率
- 缓冲区读取比磁盘读取快得多
- 命中率是测量用户从
buffer cache
中访问到所需数据的量的百分比,不包括请求从磁盘读取所需数据。 - 命中率 = ( 1 - (物理读)/(逻辑读)) 100*
物理读:从磁盘读取数据
逻辑读:从内存读取数据
3.3 Redo Log Buffer 重做日志缓冲区
3.3.1 目的
- 重做日志缓冲区是SGA中的一个循环使用的缓冲区,它保存有关对数据库所做更改的信息。此信息存储在REDO条目中。REDO条目包含通过插入、更新、删除、创建、更改或删除操作重新构造或重做数据库更改所需的信息。
- REDO条目(redo entries)记的不仅是SQL语句句本身,还包括执行后对数据库中某个文件某个块做的修改。包括DML、DDL操作。
- 重做条目占用缓冲区中连续的、顺序的空间。后台进程LGWR将重做日志缓冲区写到磁盘上的活动重做日志文件(或文件组)。
- 记录所有REDO条目,目的是用于数据库恢复。
- 记录内容:日志条目+更改的数据
3.3.2 触发LGWR写入的条件
日志条目先记录在内存上,然后通过后台进程LGWR写入data log file,写入的时间:
1)当事务被commit,LGWR开始工作
2)Redo log buffer每3秒会写一下
3)Redo log buffer的容量达到三分之一时
4)当DBWR把脏块写入磁盘时,也会触发
3.3.3 内存分配
LGWR将REDO条目从Redo log buffer写入redo log file。那么服务器进程可以将新的日志项覆盖写入。因此数据库给Redo log buffer分配了较小的内存,大约5MB。(但DB buffer需要大一些的空间)
较大的Redo log buffer将减少redo log file 的IO操作,但是提交处理将花费较长的时间。
较小的Redo log buffer将会使LGWR过于繁忙的进行写入,会造成系统CPU压力。
nologging选项。该选项可以绕过redo log不进行记录。减少资源争用。
3.3.4 查看log buffer
3.4 Large pool
数据库管理员可以配置⼀个称为大池的可选内存区域,作用为
1.用于共享服务器和Oracle XA接口的会话内存(用于事务与多个数据库交互的地方)
2.I / O服务器进程
3.Oracle数据库备份和恢复操作
将整个Oracle数据库的内容备份于大池,用于I/O服务器进程。
大池没有LRU列表,它与共享池中的保留空间不同,共享池中的保留空间使用与从共享池中分配的其他内存相同的LRU列表
通过LARGE_POOL_SIZE
查看大小
3.5 Java pool
Java池内存在服务器内存中用于JVM中所有特定于会话的Java代码和数据。Java池内存的使用方式不同,具体取决于Oracle数据库运行的模式
3.6 streams pool
stream 技术是为了在不同数据库之间共享数据。是为了支持实例中的streams活动而分配的内存
3.7 result cache结果高速缓存(oracle 11g)
1)启用Result cache ,数据库将在其中存储SQL查询和PL/SQL的结果集。
当数据库再次执行相同的SQL 查询时,可以从Result cache 中检索出结果而不用再次执行查询。极大提高性能
2)与data buffer cache的区别:data buffer cache储存的是原表的,result cache储存计算结果
只有通过计算才能得到的结果集:例如查询所有工资大于本部门平均工资。那么各部门平均工资这个结果集就是一个只有通过计算才能得到的结果集
4 SQL在oracle内部的处理流程
4.1 解析
语法检查——>语义检查(对象和列是否存在)——>共享池检查
1.软解析和硬解析
- 软解析(库缓存命中)
输入sql后得到sql_id
,到共享池Oracle首先会检查是否具有权限
查看library cache
有无相同的sql_id
,有的话获取相应的hash_value
,得到解析结果(解析结果可能有多个版本)
开始执行。 - 硬解析(库缓存未命中)
library cache
无相同的sql_id
oracle把对象信息从数据字典表读到Data Dictionary Cache
中
建立新的可执行代码
数据库对DDL始终执行硬解析
在硬解析期间,数据库多次访问库缓存和数据字典缓存以检查数据字典。当数据库访问这些区域时,它在所需对象上使用一个叫做闩锁的串行化设备,以便它们的定义不会被更改。闩锁的争用会增加语句的执行时间,并降低并发性(只能串行)
2.server process连接server 是有两种模式
- 专用模式 :user process 与 server process 之间⼀对⼀的关系
多一个连接到服务器上的客户端,服务器上多一个连接进程 - 共享模式 :user process 与 server process 之间多对一的关系
不管多少个客户端连接到服务器,服务器上都只有共享链接那一个进程。
4.2 SQL优化
结合统计信息查询优化是选择执行SQL语句的最有效手段的过程。
数据库对查询的优化基于对正在访问的实际数据收集的统计信息。
优化器使用行数、数据集大小和其他因素来生成各种可能的执行计划,并为每个计划分配⼀个成本值。
数据库会使用具有最低成本的计划。数据库对每个唯一的DML语句必须至少执行一次硬解析,并在硬解析期间执行优化。
DDL永远不会被优化,除非他包括需要优化的DML组件,如子查询。
4.3 SQL行源生成,生成执行计划
4.4 SQL执行
- 分析表 查看统计信息
SQL> analyze table emp compute statistics;
Table analyzed.
SQL> select num_rows , blocks , avg_row_len , empty_blocks
2 from user_tables
3 where table_name='EMP';
NUM_ROWS BLOCKS AVG_ROW_LEN EMPTY_BLOCKS
---------- ---------- ----------- ------------
17 5 37 37
- 查看软解析⽐率
软件系⽐率可以查看AWR报告,也可以使⽤SQL进⾏能查询
SQL> col name for a30
SQL> select * from v$sysstat where name like ‘%parse%’;
STATISTIC# NAME CLASS VALUE STAT_ID
---------- ------------------------------ ---------- ---------- ----------
264 ADG parselock X get attempts 1 0 564381705
265 ADG parselock X get successes 1 0 3808229129
622 parse time cpu 64 2578 206905303
623 parse time elapsed 64 3595 1431595225
624 parse count (total) 64 158817 63887964
625 parse count (hard) 64 25893 143509059
626 parse count (failures) 64 467 1118776443
627 parse count (describe) 64 248 469016317
8 rows selecte
- OLAP 和 OLTP
OLAP 联机分析处理系统 On-Line Analytical ProcessingSQL
执行的次数少,涉及数据量⼤。
OLTP 联机事务处理系统 On-Line Transaction Processing SQL
执行次数多,涉及数据量小,客户要求响应时间短
5 PGA program global area 程序全局区
PGA是⼀个内存区域,它包含服务器进程的数据和控制信息
client想连接到数据库服务端时会有PGA做接待工作
它是在启动服务器进程时由 Oracle数据库创建的非共享内存,对PGA的访问是服务器进程独有的。
每个服务器进程有一个PGA。后台进程也分配它们自己的PGA
1.实例PGA
实例PGA:单个PGA的集合
所有单个PGA使用的总内存称为总实例 PGA内存
使用数据库初始化参数来设置实例PGA的大小,而不是单个PGA。
- 查看分配给数据库的内存大小
SQL> show parameter memory
- 查看数据库中分配给SGA的内存大小
SQL> show parameter sga_
2.存储内容
会话内存:是分配给存储会话变量(登录信息)和与会话相关的其他信息。
(对于共享服务器,会话内存是共享的,而不是私有的。)
私有SQL区域:包含绑定变量值、查询执行状态信息和查询执行工作区域等数据。
发出SQL语句的每个会话都有⼀个私有SQL区域
6 UGA user global area 用户全局区
用户全局区(User Global Area)简称 UGA,存放与用户会话相关信息,如登录信息、会话状态等。
• 专⽤服务器模式下,UGA 在 PGA 中;
• 共享服务器模式下,UGA 在 SGA 中⼤池(large pool) ,没有⼤池在共享池(shared pool)
server process连接server 是有两种模式
- 专用模式 :user process 与 server process 之间⼀对⼀的关系(默认),UGA 在 PGA 中
- 共享模式 :user process 与 server process 之间多对一的关系(少见),UGA 在 SGA 中大池(large pool) ,没有⼤池在共享池(shared pool)中
7 Oracle实例管理
- 查看进程:
SQL> select pname,spid from v$process where pname is not null;
[oracle@vm01 ~]$ ps -ef | grep ora_
- 杀掉进程:
[oracle@vm01 ~]$ kill -9 [进程号]
8 进程
8.1 DBWn(database write process数据库写进程)
n代表可以是并行的,可以同时启用多个后台进程
-
作用
从database buffer cache
查不到数据,利用DBWn将硬盘中的data files中的内容读取到database buffer cache
当中去。
在database buffer cache
里修改数据后,利用DBWn写入磁盘
同时,内存中的脏块也是通过这个进程写入到database当中去的 -
触发点:
1.checkpoint 触发
2.脏块达到临界值
3.没有空闲的缓冲区
4.超时(用户链接超时)
5.tablespace offline或者read only
6.table drop或者truncate
7.表空间开始备份
8.2 LGWR(log writer日志写进程)
对于所有的操作都是优先写日志,先写日志后执行
把redo log buffer
里的redo条目写到日志文件
把当前日志序列号记录到控制文件中
- 触发点:
1.commit
2.redo log buffer 满1/3
3.每三秒触发一次
4.在DBWn前
这个进程非常忙碌
8.3 SMON(system monitor 系统监控进程)
-
作用:
1.实例恢复instance recovery
2.合并free extents space区空闲空间
3.回收临时段和临时表空间 -
实例恢复的过程:
假设我们做出了一系列insert操作,时间很长,这些操作记录会被存储在redo buffer
并写入到redo log当中 ,即使insert into还没有做完。如果这个时候我的数据库被关掉,正在进行的insert into 这个行为将被中断。
再次启动数据库后,数据库会忠实的的按照日志的记录,完成insert into进行数据插入工作,但是,插入完事以后数据库会回滚掉。
如果伴随着insert into这个操作进行的同时,其他用户也在进行一系列小的DML操作,只要是成功完成并commit了,在recover的过程当中,这个进程也会按照日志的记录保证这些操作的完成与提交。 -
异常关机后重新开机
1.开始打开数据库
2.前滚查看redo log file并执行一次
3.回滚掉第一步里没有commit的事务
4.打开数据库成功
[oracle@vm01 trace]$ pwd
/u01/app/oracle/diag/rdbms/orcl/orcl/trace # 告警日志所在位置
[oracle@vm01 trace]$ tail -f alert_orcl.log # 实时监控告警日志
8.4 PMON(process monitor监控所有的进程)
- 作用
1.协调PGA与SGA间的使用
2.对于用户进程来说:
如果用户连结的进程被杀掉
–回滚事务
–解锁
–清除所有用户资源
–重启已失效的调度程序
8.5 CKPT(checkpoint检查点)
作用:
触发DBWn/
更新数据文件header中的概要描述和SCN号(checkpoint号)
更新控制文件的SCN号
更新日志文件的SCN号
8.6 ARCn(archiver 归档进程)
redo log file写满之后会进行自动不压缩归档
ARCn会把归档日志的信息记录到控制文件中
1.查看当前数据库是否为归档模式
archive log list;
2.开启归档模式
- 需要正常关闭数据
SQL> shutdown immediate
- 数据库启动到mount状态
SQL> startup mount
- 打开归档模式
SQL> alter database archivelog;
- 打开数据库
SQL> alter database open
- 查看后台进程
[oracle@vm01 ~]$ ps -ef | grep ora_ | grep arc
- ARCn 最多 30 个,受
log_archive_max_processes
参数影响 - 关闭归档模式
SQL> alter database noarchivelog;】
8.7 MMON and MMNL(可管理性监控流程)
- MMON执行与自动工作负载存储库(AWR)相关的任务,AWR最多存储八天的数据
- MMNL将统计信息从SGA中的活动会话历史(ASH)缓冲区写到磁盘,当ASH缓冲区满时,MMNL写入磁盘
- 数据库最先生成ASH性能数据报告(以秒为单位),ASH生成AWR报告(默认以小时为单位)