Oracle11g   性能调优(OCP版)

第一部分  性能调优方法论

第一章:调优介绍

一、谁来调优

数据库管理员

应用架构师

应用设计师

应用开发人员

OS系统管理员

存储系统管理员

二、DBA在调优中做什么

1)应用调优(DBA和开发人员合作)

SQL statement performance Change management

2)实例调优(DBA负责)

MemoryDatabase structure

Instance configuration

3)操作系统(DBA与系统管理员合作)

I/O

Swap

Parameters

三、调优方法论

OWI全称 Oracle Wait Interface,即基于等待事件的调优方法。等待事件到11g已发展到近1000个。从10g开始,性能调优的重点已经不再单纯是提高缓存击中率了。

OWI是一种用于定位process bottlenecks(即wait events)的方式:

包括I/O、locks、latches、bk process activities、network latencies等等。它记录了所有这些事件的等待次数和总的等待时间。

在OWI之前,要定位问题必须将checklist上的所有项目都执行一遍,再根据经验判断问题所在,这往往浪费大量的时间而且容易产生错误。

通过解除或者降低Wait Events,可以直接提高系统工作效率。这些数据都被记录在动态视图中或AWR报告里。

Oracle 推荐使用OWI方法,通过等待事件的分析,直接消除问题。

 

调整目标具有三个特征:

1)具体的(Specific)

2)可测的(Measurable)

3)可实现的(Achievable)

 

OWI方法论总结起来就是三点:

1)自顶向下,抓主要矛盾

2)选择可获得最大收益的事件入手

3)目标达到后见好就收

 

第二章:基本调优工具

一、性能调优工具

1)Dynamic performance views--动态性能视图

 

2)AWR或Statspack

Load Profile--系统负荷

Instance Efficiency Percentages--实例有效率

Shared Pool Statistics--共享池统计

Time Model Statistics--时间模型统计

Top wait events--突出的等待事件

SQL statistics

等等

3)告警日志

Alert log文件和Trace files文件

4)Enterprise Manager Pages--OEM

5)诊断包和调优包

二、DB Time model

1、什么是DB Time model

"The most important of the time model statistics is DB time. This statistics represents the total time spent in database calls and is a indicator of the total instance workload. It is calculated by aggregating the CPU and wait times of all sessions not waiting on idle wait events (non-idle user sessions). DB time is measured cumulatively from the time that the instance was started."

 

 

数据库消耗的总时间包括 DB time+background elapsed time

DB time反应的是所有user使用的数据库资源的总和, 即:DB time=DB CPU+ DB Wait time(no-idle time)。

background elapsed time指数据库后台进程消耗的时间,比如PMON进程本身,或RMAN备份恢复。

idle time 比如处于连接状态的空闲session不包括在DB Wait time。

在一个正常的系统中一般来说DB time要远远大于background elapsed time。

 

2、调优时,很重要的是把DB Wait time(不包括idle wait)和DB CPU time对比,看看谁占的比例大,这决定了多少时间是花在有用的工作上,多少时间消耗在等待其他进程释放占用的资源。作为一般规则,调整DB Wait time比调整DB CPU time更为迫切,然而,较高的CPU time也可能表明SQL本身写的很差。

而Wait time的急剧增加又可能反映了一个资源争用的迹象。

注意,资源争用通过增加更多的处理器,或集群节点,其作用往往是非常有限的,有时甚至可能适得其反。

 

在DB time的统计信息中,sql execute elapsed time 和parse time elapsed 以及DB CPU,这三项常常会占据90%以上的DB time,而其中sql execute elapsed time又应该会在95%以上,值得注意的是DB CPU和sql execute elapsed time是有交集的,因此你会看到在一份AWR报告中有出现DB CPU + sql execute elapsed time超过DB time的情况。

 

3、两个直接反应DB time统计信息的视图

v$sys_time_model

v$sess_time_model

v$sys_time_model中的STAT_NAME的db time时间单位是以微妙(microseconds)为单位,也就是百万分之一秒。

视图中常用的时间单位有:

Secord   秒

Centisecond   厘秒--百分之一秒

Millisecond   毫秒--千之一秒

Microsecond   微秒--百万分之一秒

三、统计信息和等待事件

在Oracle数据库中,“统计信息”和“等待事件”是性能优化目标的重要原始数据。它们都是累计的信息。

一)统计信息的概念:

数据库的活动在内存中产生了大量的信息,把这些信息分门别类的统计出来,就是所谓的统计信息。

统计信息的值是自实例启动以来至当前的累计值,单一的统计值往往不能说明什么,而两个累计值的差才能反应那段时间内数据库的活动。

SYS@ prod>select count(distinct name) statistcs from v$sysstat;

 STATISTCS

----------

       604

 

二)等待事件的概念

先要弄清楚什么是事件

Oracle根据数据库各类活动的特性定义了许多事件(Event),

每个事件对应一个事件name, 每个数据库版本的事件数量是不同的。

本版本是11.2.0.1的, 总共有多少个事件呢?

SYS@ prod>select count(distinct name) events from v$event_name;

    EVENTS

----------

      1118

 

现在回答什么是等待事件:

当一个进程无法顺利执行,那么只能通过排队等待某种资源,因为有堵塞才有等待。等待一定发生在共享资源上,一般分两种原因:

(1)资源不足

(2)资源争用

 

SYS@ prod>select count(distinct event) from v$system_event;

COUNT(DISTINCTEVENT)

--------------------

                  80

本系统没跑业务,这里有等待事件80个,它是自上次实例启动后到目前为止一共记录了80个等待event,它们都是累计值。

如果你这时跑一个大的并发访问的应用,出现资源不足或资源争用,那么还可能增加其他的等待事件,一些事件的统计值也会累计叠加。

 

资源不足的解决方案可以增加硬件,如CPU、MEMORY等

资源争用的解决方案需要从应用层面和数据库结构层面想办法

 

资源争用不能用资源不足的办法解决:

"When contention is evidenced by increased wait time,adding more CPUs to a node, or nodes to a cluster, would provide very limited benefit. "

 

统计信息和等待事件之间有一定的关系,但也不是包含关系,更不是一对一关系,它们侧重点不同,细分后命名方法也不同。从下面两个视图的对比就可说明问题。

select * from v$statname;

select * from v$event_name;

 

三)统计视图和等待视图

 

从三个方面(维度)反映重要的统计视图

1)基于系统级

v$sysstat

2)基于session级

v$sesstat   所有session分别列出统计信息,每一行是某个session对应的某种统计信息

v$mystat   当前session统计信息

3)基于service级

v$service_stats

此外还有一个常用的视图

v$statname   此视图提供一个统计信息的完整列表,每行对应一种统计信息

 

四)示例:查询日志累计统计信息

 

第一步, 确定session1的sid号

[oracle@cuug ~]$ sqlplus / as sysdba

SYS@ prod>grant select on v_$mystat to scott;

SYS@ prod>conn scott/scott

SCOTT@ prod>select sid from v$mystat where rownum=1;

       SID

----------

        46

第二步,在plsql develop端查看该session下的有关redo的两项统计信息

观察 desc v$sesstat,该视图中没有name字段,可以和v$statname联查,以便确定相关信息。

SQL>

select ss.sid,sn.name,ss.value from v$sesstat ss,v$statname sn

where ss.STATISTIC#=sn.statistic#

and sn.name in('redo entries','redo size') and ss.sid=46;

SID  NAME            VALUE

---------------------------------------------

46   redo entries 630

46   redo size      80264

 

第三步,在该session下做一个dml操作

观察update 前后日志的变化

SCOTT@ prod>update emp set sal=sal+1000 where empno=7788

SCOTT@ prod>commit;

 

第四步,重复第二步并查看结果

SID  NAME            VALUE

---------------------------------------------

46   redo entries 631

46   redo size      80780

 

可以看到46号session的update的动作产生的日志统计信息:

产生redo entries=1          (631-630=1)

产生redo size=516            (80780-80264)

 

五)从三个方面反映重要的等待事件视图

1)基于系统级

v$system_event 

2)基于session级

v$session_event ----所有session分别列出等待事件,每一行是某个session对应的某种等待事件

v$session_wait    ----所有session当前正在等待的事件

3)基于service级

v$service_event

另外提供一个等待事件的完整列表,每行对应一种等待事件

v$event_name

理解事件的三个参数

select name,parameter1,parameter2,parameter3 from v$event_name where name like '%buffer busy%';

 

四、常见的几个等待事件

 

1、Buffer busy waits等待事件

这个等待事件的产生说明了一个会话曾经等待一个Buffer(数据块)

有两种情形是:

(1)当一个会话试图修改一个Buffer,但这个Buffer正在被另一个会话修改时。

热块是典型的是资源争用,分析热块产生原因,才可对症下药:以下为热块发生的部位:

①表块,②索引块,段头块(free list),undo块等

(2)当一个会话需要读取一个Buffer,而这个Buffer正在被另一个会话从磁盘读取到内存中时。

在11g的版本中,这种等待已经被独立出来,以read by other session命名等待事件。

Buffer busy waits等待事件常见于数据库中存在热块的时候,当多个用户频繁地读取或者修改同样的数据块时,这个等待事件就会产生。

 

2、Free buffer waits等待事件

当一个会话将数据块从磁盘读到db buffer中时,它需要找到空闲的内存空间来存放这些数据块,

当内存中没有空闲的空间时,就会产生这个等待;

会话在做一致性读时,需要构造数据块在某个时刻的前映像(image),

此时需要申请内存来存放这些新构造的数据块,但内存中无法找到这样的可用内存块。

当数据库中出现比较严重的free buffer waits等待事件时,可能的原因是:

(1)database buffer cache太小,

(2)内存中的脏数据太多,DBWR无法及时将这些脏数据写到磁盘中以释放空间

 

3、Read waits的几个等待事件

①db file scattered read

这里指的是读取的数据块在内存中是以连续的方式存放的。全表扫描和index full scan 是其典型的代表。这是在一次性读取多个连续的BLOCK的时候,产生的等待事件。db file sequential read是数据库中最常见的等待事件,一个状态良好的系统,这个等待应该占比较高的比重。

②)db file sequential read

当Oracle 需要每次I/O只读取单个数据块这样的操作时,最常见的情况有索引的访问,以ROWID的方式访问表中的数据.

③db file paralle read

同步的multiblock  read, 需要多CPU支持。

④direct path read (11g新特性)

大表走全表扫描可能使用direct path read方式,即全表扫描全部采用物理读,绕过SGA,以减轻对buffer cache的压力

隐含参数:_serial_direct_read = trun|false可以开关此功能。

 

4、Enq: TX - row lock contention

Enqueue 是lock 的另一种描述语。

当我们在AWR 报告中发现长时间的enqueue 等待事件时,说明数据库中的一个事务的行锁阻塞了另一个事务。

可以关联AWR报告中的enqueue activity部分来确定是哪一种锁定出现了长时间等待。

 

5、log file switch:

通常是因为归档速度不够快。表示所有的提交(commit)的请求都需要等待"日志文件切换"的完成。Log file Switch 主要包含两个子事件:

①log file switch (archiving needed)

这个等待事件出现时通常是因为日志组循环写满以后,第一个日志归档尚未完成,出现该等待。

②log file switch (checkpoint incomplete)

当日志组都写完以后,LGWR 试图写第一个log file,如果这时数据库没有完成写出记录在第一个log file中的dirty 块时(例如第一个检查点未完成),即没有Inactive日志组可重用,该等待事件通常表示你的DBWR 写出速度太慢或者IO 存在问题。

 

6、log file sync:

表现为commit很慢,原因还是LGWR无法迅速写出这些日志条目。如果这个等待事件影响到数据库性能,那么就需要修改应用程序的提交频率, 为减少这个等待事件,须一次提交更多记录,或将重做日志置于较快的磁盘上,以降低归档对LGWR的影响。

 

五、热块争用实验

Buffer busy waits等待事件的测试

 

1)create table scott.emp1 as select * from scott.emp;

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn, dbms_rowid.rowid_block_number(rowid) bl, emp1.rowid,emp1.empno from scott.emp1 where empno in (7788,7900);

        FN         BL ROWID                                   EMPNO

---------- ---------- ------------------ ----------

         4        396 AAARW6AAEAAAAGMAAH       7788

         4        396 AAARW6AAEAAAAGMAAL       7900

 

证明两行记录都在386号块上。

session1

SQL> select sid from v$mystat where rownum=1;

       SID

----------

       125

session2

SQL> select sid from v$mystat where rownum=1;

       SID

----------

       132

 

 

测试写/写:

 

SESSION 1运行:

 

----------------------------------------------------------------

session1 运行:

begin

for i in 1 ..4000000 loop

UPDATE scott.emp1 SET sal=sal+0 where empno=7788;

commit;

end loop;

end;

/

 

session 2运行:

begin

for i in 1 ..400000 loop

UPDATE scott.emp1 SET sal=sal+0 where empno=7900;

commit;

end loop;

end;

/

查看buffer_busy_wait和latch: cache buffers chains

select event,total_waits from v$system_event where event in ('buffer busy waits','latch: cache buffers chains');

 

第二部分  AWR报告及相关工具

第三章 使用AWR

一、什么是AWR

 

AWR(Automatic Workload Repository)架构是从oracle 10g开始的,它的前身Statspack,AWR的作用是提供一个时间段内整个系统资源使用情况的报告,它以快照形式自动收集并存储重要的累计统计信息。并可以通过AWR报告的形式反映系统在某个时间段内的运行情况。

 

AWR工作时是由后台进程MMON负责,缺省下于每1小时生成一个内存统计的快照,并写入磁盘上的sysaux表空间,快照不能移动到其他位置,快照也会作为ADDM的原始数据,默认情况下,Oracle将快照保留8天。

 

生成AWR报告的方法可以通过调用DBMS包或OEM,报告反应的是从起始快照至结束快照之间(一个连续时间段)的信息。

 

二、AWR的内容

1) AWR收集数据库有关性能信息:它是新的数据库自动调优机制的核心,这些信息包括以下内容:

*基本统计数据,也是v$sysstat和v$sesstat视图中收集的系统和会话的统计信息;

*SQL统计数据,v$sql,v$sqlarea,v$sqltext分别按执行时间、cpu时间、执行次数等标准来统计

*对象的统计信息,

*时间模型统计信息,告知每个数据库活动要花多长时间。(在v$sys_time_model和v$sess_time_model视图中查看);

*等待统计数据,v$system_event等(来自V$session视图中的几个新添加的字段)

*ASH统计信息,包含近期会话活动的历史记录

*数据库特性利用的统计数据

*各种管理顾问会话的结果,如ADDM、Segment Advisor、Sql Access Adivisor等

*操作系统的统计数据,如I/O和内存的利用率

 

2)与AWR有关的参数

SQL> show parameter statistics_level

NAME                            TYPE        VALUE

------------------------------------ ----------- ------------------------------

statistics_level                     string      TYPICAL

SQL>

若参数STATISTICS_LEVEL设置为TYPICAL或ALL将启用AWR采集数据库统计信息。ALL参数收集信息最全,参数的默认值是TYPICAL,

如果STATISTICS_LEVEL设为BASIC,将禁用自动收集快照和运行顾问。但你仍可以通过DBMS_WORKLOAD_REPOSITORY包来手动获得AWR统计信息。

三、AWR报告(OEM提供)

 

 

 

 

 

 

四、手动生成AWR快照和报告

第一步,列出数据库中有多少快照

SYS@ prod>select * from dba_hist_snapshot order by 1 desc;

第二步,创建一个快照

SYS@ prod>exec dbms_workload_repository.create_snapshot;

第三步,根据两个快照建立一个AWR报告

SYS@ prod>@/u01/oracle/rdbms/admin/awrrpt.sql

看到提示:Specify the number of days of snapshots to choose from Snap

Instance     DB Name        Snap Id    Snap Started    Level

------------ ------------ --------- ------------------ -----

prod         PROD                 7 07 8月  2015 13:46     1

                                    8 07 8月  2015 15:00     1

                                    9 07 8月  2015 16:00     1

                                      10 07 8月  2015 17:00     1

 

                                      11 08 8月  2015 12:15     1

                                      12 08 8月  2015 13:00     1

                                      13 08 8月  2015 14:00     1

 

注意:有空行的地方是数据库关闭过,再次启动后所有统计重置,所以报告使用的起始和结束快照之间不能跨越空行。

 

第四步、得到html格式的报告,缺省的路径是/home/oracle, 可以在Linux下进入图形界面使用缺省的火狐浏览器查看,也可以把它下载到win7下使用浏览器看。

 

 

第四章    定位问题

一、如何看AWR报告.pdf

 

 

Execute to Parse:是语句执行与分析的比例,SQL重用率越高该比例越高

Parse CPU to Parse Elapse:解析实际运行时间/(解析实际运行时间+解析过程中等待资源时间),越高越好

Non-Parse CPU:SQL实际运行时间/(SQL实际运行时间+SQL解析时间),越高越好,太低表示消耗解析时间过多。

 

 

 

 

 

二、AWR顾问(Advisor)

一)概念:顾问就是通过分析AWR捕获的数据,提出改进性能的建议。ADDM本身就是顾问,它的报告里还会建议你找其他的顾问。具体病症还要看专科。

 

二)Oracle 11g 主要的一些Advisor

1)SQL Advisors 其中包括:

SQL Tuning Advisor:   对单个SQL语句提供调优建议,生成sql profile,sql语句执行路径分析,sql语句结构分析

SQL Access Advisor:   评估SQL语句对数据库负荷的影响,提供建议。如index,partition, materializer view等

SQL Repair Advisor:   对可能的oracle内部错误,如ORA-600需要的patch(补丁)提出建议

2)Memory Advisors   可以对Oraclen内存结构(SGA+PGA)做自动调整,以适应数据库在不同时间段的工作量变化。

3)Segment Advisor:    提供段收缩命令(shrink)。释放未使用的空间

4)Undo Advisor:    为undo表空间的大小提供建议,如避免快照太旧的问题。从v$undostat取数据。

5)MTTR Advisor   为实例恢复的时间提供建议。

 

三)Advisor的API's程序包

首先是DBMS_ADVISOR: 不过,它只是顾问管理中一部分包的套件,有一些Advisor有它们自己的包,如:

Automatic Database Diagnostic Monitor (DBMS_ADDM)

SQL Performance Analyzer (DBMS_SQLPA)

SQL Repair Advisor (DBMS_SQLDIAG)

SQL Tuning Advisor (DBMS_SQLTUNE)

 

第五章    使用度量和预警

一、AWR度量(metric):

两个或多个统计数据综合的结果。它是衡量累计性能统计数据变化率的统计指标。

度量有两个主要作用:

(1)几乎所有的advisor都使用metrics诊断性能问题并给出调优建议。

(2)基线的metrics是服务器产生预警特性的基础。

 

 

 

二、Oracle自动预警机制

 

自适应阈值可以帮你以最低的开销来监控和检测性能问题。自适应阈值只能从系统移动窗口基线(system moving window)捕获到的metric值里得到的统计信息

为系统metric自动设置预警和关键预警(warning and critical alert)的阈值。这些统计信息每周会重新生成,并可能随系统性能变化而改变,产生新的阈值。

 

阈值的呈现方式:

1)重要性级别(概率):为了体现异常程度,阈值被设为一个统计学中的百分位来观察基于移动窗口基线数据的阈值以上的值。通俗的理解就是触发红线(或黄线)的概率,百分位能指定为以下几种:高(0.95),非常高(0.99);严重的(0.999);极端的(0.9999)。计算出的阈值概率越低,越不容易达到,也就越不容易触发告警。

2)最大值的百分比:阈值以最大值的百分比方式设计,

3)固定值

 

第六章    AWR基线

一)基线的作用

系统中的度量用来衡量系统工作状态,但到底是好还是不好,基线的度量就是性能好坏的参考标准。

Oracle数据库中包含了二种类型的基线:

第一类,动态基线:

即移动窗口基线(Moving Window Baseline)

Oracle设计移动窗口基线是为了让系统动态的获得基线的度量。

只有一个移动窗口基线,即Oracle内置的system moving baseline,

system moving baseline的作用:使用保留期内所有AWR数据,可以产生并调整自适应阈值(Adaptive Thresholds)

system moving baseline的默认窗口大小必须小于等于当前AWR保留的时间默认为8天。

如果你要使用自适应阈值,可以考虑使用更大的移动窗口,例如30天,可便更精确地计算出阈值。首先需要增加AWR的保留时间至30天

第二类:静态基线

即用户自定义的基线,又可以分为两种

1)静态基线(使用已有的一对快照,过去时)

 

2)基线模板(Baseline Templates)(结束快照还未生成,将来时)

可以创建一个基线,作为未来一个时间连续的时间段可以使用的基线模板。有两种类型的基线模板:

①单一(Single):

例如,你安排好要在周末进行一个系统测试,并准备获取AWR数据,这种情况下,你可以创建一个单一基线模板,用以在测试时自动获取该时间。

②重复的(Repeating):

例如,你可能希望在一个月里的每周一早晨获取AWR数据,这种情况下,你可以创建一个重复基线模板来自动为每个周一创建基线,并且在设置了过期时间(例如一个月)后,自动删除过期的基线。

 

二、基线示例

1)建立一个singe基线模板的例子

begin

DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE(

START_TIME => TO_TIMESTAMP(SYSDATE+2),

END_TIME => TO_TIMESTAMP(SYSDATE+10),

BASELINE_NAME => 'Mybase1',

TEMPLATE_NAME => 'Mytemp1',

EXPIRATION => NULL);

end;

/

 

2)建立一个repeat基线模板的例子

BEGIN

DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE (

day_of_week => 'monday',

hour_in_day => 17,

duration => 3, expiration => 30,

start_time => '2018-06-01 17:00:00',

end_time => '2018-12-31 20:00:00',

baseline_name_prefix => 'baseline_2017_mondays_',

template_name => 'template_2017_mondays');

END;

/

 

 

第七章    使用AWR的工具

一、Oracle的自动维护任务(Autotask)

资源管理和任务调度的概念:

 

1) Autotask的三个job:

通过OEM->Server->Oracle Scheduler->Automated Maintenance Tasks查看。

 

Automatic Optimizer Statistics Collection,

Automatic Segment Advisor,

Automatic SQL Tuning Advisor。

 

2) 预定义维护窗口

有7种预定义窗口,通过OEM->Server->Oracle Scheduler->Window Groups可以查看,当一个维护窗口打开时,

数据库激活DEFAULT_MAINTENANCE_PLAN,3个自动维护任务运行在ORA$AUTOTASK_SUB_PLAN子计划之下。

 

3) Autotask使用的程序包

Oracle不给3种自动维护任务分配永久的Scheduler作业,所以不能用DBMS_SCHEDULER程序包管理这些任务。

如果想修改Autotask必须使用DBMS_AUTO_TASK_ADMIN程序包。

 

二、ADDM (Automatic Database Dianostic Monitor)

一)概念:

ADDM根据AWR每小时采集的数据,自动发现快照间隔期间的性能问题。

它通常建议调用各个相关的指导(Advisor),比如建议做SQL Tuning Advisor, 或SQL Access Advisor,或者建议创建相关索引。

如果ADDM发现问题,会自动生成的ADDM报告,如果想要ADDM跨越更长的时间段生成报告,也可以手动调用ADDM生成包括任意两个快照间的时间段。

 

与ADDM有关的参数:

control_management_pack_access 缺省是DIAGNOSTIC+TUNING,如果设成NONE,则ADDM关闭。

 

默认情况下ADDM报告保存30天。

 

 

 

三、SQL advisor和Segment advisor

 

 

 

 

 

 

 

四、OEM顾问实验

一)ADDM 报告生成:

SQL> @/u01/oracle/rdbms/admin/addmrpt.sql   这是单独生成ADDM报告的脚本

 

二)ADDM测试示例:

1)在OEM中了解最新AWR快照号和ADDM报告

 

2)模拟业务高峰

2.1)建立一个大表和小表,分别叫bigtable, smalltable.

sys:

grant connect,resource to tim identified by tim;

 

tim:

create table bigtable (id number(10),name varchar2(100));

create table smalltable (id number(10),name varchar2(100));

 

2.2)大表中插入3百万行记录

begin

for i in 1..2500000 loop

insert into bigtable values(i,'test'||i);

if mod(i, 100)=0 then

commit;

end if;

end loop;

end;

/

 

analyze table bigtable compute statistics;

 

2.3)小表中插入1000条记录

begin

for i in 1..1000 loop

insert into smalltable values(i,'test'||i);

if mod(i, 100)=0 then

commit;

end if;

end loop;

commit;

end;

/

 

3)清除shared pool,buffer cache

sys:

alter system flush shared_pool;

alter system flush buffer_cache;

 

tim:退出重新登录

 

关联查询

select count(*) from smalltable a where a.id=(select b.id from bigtable b where b.id=a.id);   需要1.5--2分钟左右

 

4)手工即时生成AWR快照

sys:

exec dbms_workload_repository.create_snapshot;

 

查看ADDM

OEM:Server-->Advisor Central-->Advisor Task Results(画面下方)已经显示了一个ADDM结果,

 

 

我们可以尝试单独生成一个ADDM报告。方法:

Server-->Advisor Central--> ADDM-->Run ADDM to analyze past performance

 

结合图型高峰段选择Period Start Time和Period End Time-->ok

可以看到报告生成的名称是task_nn,然后有Impact(%),Finding,Occurrences等信息

进入第一行,即Finding是Top SQL by DB Time,里面是Recommendations,

 

 

 

 

 

 

5)可以通过SQL Tuning Advisor分析该语句,得到推荐是在bigtable上建立索引。

6)可以通过SQL Access Advisor分析该语句,得到推荐是在bigtable上建物化视图。

7)可以通过Segment Advisor 做表空间级shrink

 

到底如何优化,最后还是自己拿主意。

五、什么是ASH(Active Session History)

 

 

Oracle的会话状态可以分为3种,

1)on cpu,

2)waiting,

3)idle(非活动状态)

 

实验1:测试on cpu

session1:取SID

SYS@ prod>select sid from v$mystat where rownum=1;

       SID

----------

        49

session2:观察结果inatcive

SYS@ prod>select sid,serial#,status from v$session where sid=49;

 

session1:制造一个死循环

declare

a int;

begin

loop

a :=a+1;

end loop;

end;

/

session2:观察结果atcive

SYS@ prod>select sid,serial#,status from v$session where sid=49;

SYS@ prod>alter system kill session '49,157';

session1:重新登录

 

实验2:测试waiting

Session1:  观察session1状态为inactive

SYS@ prod>select sid,serial#,status from v$session where sid=1;

       SID      SERIAL#    STATUS

-----------------------------------------

        49        157     INACTIVE

SYS@ prod>update scott.emp1 set sal=10000;

Session2:

SYS@ prod>select sid,serial# from v$session where sid=1;

       SID    SERIAL#      STATUS

--------------------------------------------------------

        139      120      INACTIVE

SYS@ prod>update scott.emp1 set sal=5000 where empno=7788;   被锁住

Session3:  观察session2状态为active,阻塞session2的是session1

SYS@ prod>select sid,serial#,status,BLOCKING_SESSION from v$session where sid=139;

       SID    SERIAL# STATUS   BLOCKING_SESSION

---------- ---------- -------- -------------------------------------------

       139      120 ACTIVE                 49

 

ASH收集的是活动会话的样本数据

v$session包括了所有的(三种状态)当前会话,它每秒采样一次,那么ASH就以v$session为数据源,只记录活动会话信息,不活动的会话不会记录,记录数据在SGA缓冲区中。最终将ASH信息存入了AWR库。有关ASH数据采集由后台进程MMNL来完成的。

 

手动生成ASH报告

ASH反映的是内存中active session的状态,它对v$session每秒采样一次,ASH信息就在内存,可以从v$active_session_history看到。

 

PERFSTAT@ prod>select count(*) from v$active_session_history;

  COUNT(*)

----------

      1877

 

生成ASH报告:

SQL> @/u01/oracle/rdbms/admin/ashrpt.sql

ASH Samples in this Workload Repository schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Oldest ASH sample available:  09-8月 -15 15:11:56  [    105 mins in the past]

Latest ASH sample available:  09-8月 -15 16:55:49  [      1 mins in the past]

 

Specify the timeframe to generate the ASH report

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enter begin time for report:

--    Valid input formats:

--      To specify absolute begin time:

--        [MM/DD[/YY]] HH24:MI[:SS]

--        Examples: 02/23/03 14:30:15

--                  02/23 14:30:15

--                  14:30:15

--                  14:30

--      To specify relative begin time: (start with '-' sign)

--        -[HH24:]MI

--        Examples: -1:15  (SYSDATE - 1 Hr 15 Mins)

--                  -25    (SYSDATE - 25 Mins)

 

Defaults to -15 mins

Enter value for begin_time: -5

Report begin time specified:

 

Enter duration in minutes starting from begin time:

Defaults to SYSDATE - begin_time

Press Enter to analyze till current time

Enter value for duration: <CR>

 

The default report file name is ashrpt_1_0809_1705.html.  To use this name,

press <return> to continue, otherwise enter an alternative.

Enter value for report_name: /home/oracle

 

第三部分 SQL性能分析

第八章    使用SQL性能分析

一)真正应用测试一览

 

二)一个SPA的示例

示例包括两项内容:

1、预测参数在不同值下的性能表现。

2、评估走全表和走索引两种访问路径性能差异

 

1)准备工作

(1)改sh用户口令,解锁账户

SYS@ prod>alter user sh identified by sh account unlock;

(2)建scott.emp1表,该表没有索引。

SYS@ prod>create table scott.emp1 as select * from scott.emp;

SYS@ prod>insert into scott.emp1 select * from scott.emp1;

SYS@ prod>/

3584 rows created.

SYS@ prod>commit;

 

SYS@ prod>grant select on scott.emp1 to public;

(3)保证cursor_sharing 参数是EXACT

SYS@ prod>show parameter cursor_sharing

NAME                               TYPE        VALUE

------------------------------------ ----------- ------------------------------

cursor_sharing                       string      EXACT

(4)建立一个shell脚本,产生SQL工作负荷。

$ vi mysts.sh

#!/bin/bash

CNT=1

while [ $CNT -lt 20 ]

do

sqlplus sh/sh <<EOF

SELECT

ch.channel_class, c.cust_city, t.calendar_quarter_desc,

SUM(s.amount_sold) sales_amount

FROM sales s, times t, customers c, channels ch

WHERE s.time_id=t.time_id AND

s.cust_id=c.cust_id AND

s.channel_id=ch.channel_id AND

c.cust_state_province='CA' AND

ch.channel_desc in ('Internet','Catalog') AND

t.calendar_quarter_desc IN ('1999-01','1999-02','2000-03','2000-04')

GROUP BY ch.channel_class,c.cust_city,t.calendar_quarter_desc;

 

select * from scott.emp1 where empno=$CNT;

exit

EOF

CNT=`expr $CNT + 1`

done

---------------------------------------------------------------------

 

2)改optimizer_features_enable参数

这个会影响一组性能特性,设的越高支持的特性越多,我们先把它设成10g的参数,然后运行调优集后再升到11g 再对比前后的变化。

SYS@ prod>alter system set optimizer_features_enable='10.1.0.3';

 

3)EM建立调优集job叫my_sts,采集数据

(1)Load Methods

incrementally capture active SQL statement and load SQL statements ito the SQL tuning set

  Specify the duration with in which the SQL statements will be collected...

    Duration 项选 5 minutes

    Frequency 项选 5 seconds

 

(2)Filter Options

Parsing Schema Name------>Value项下选 sh

(3)Review

------------------------------------------------------------------------------------------------------------------

        SQL Tuning Set Name        MY_STS

        Owner                           SYS

        Description          

        Create an empty SQL tuning set     No

        Load Methods                     Incrementally capture active SQL statements over a period of time from the cursor cache

        Duration                                5 MINUTES

        Frequency                    5 SECONDS

        Filter Conditions                 UPPER(PARSING_SCHEMA_NAME) = 'SH'

        Job Name                      CREATE_STS_MonSep7_165617_191

        Scheduled Start Time         Run Immediately

--------------------------------------------------------------------------------------------------------------------

(4)Submit

 

3)执行 mysts.sh脚本

$sh mysts.sh

Refresh EM里SQL Tuning Sets---》MYSTS--》SQL Count看到已经有捕捉到的SQL语句数量

 

4)把采集下STS数据打包,然后传到测试系统下:

SYS@ prod>exec DBMS_SQLTUNE.CREATE_STGTAB_SQLSET('MY_STS_TAB','SH');   其实就是在sh用户下建一个表叫MY_STS_TAB

SYS@ prod>exec DBMS_SQLTUNE.PACK_STGTAB_SQLSET('MY_STS','SYS','MY_STS_TAB','SH');   把调优集的数据放到这个表中

 

5) 用数据泵把sh下的所有对象都导出来叫sh.dmp

[oracle@cuug ~]$ expdp system/oracle DUMPFILE=sh.dmp DIRECTORY=DATA_PUMP_DIR SCHEMAS=sh

 

在EM中删了调优集

 

6) 模拟在新的环境做测试,假设新环境下没有sh用户, 导入数据泵的sh.dmp

 

(1)SYS@ prod>drop user sh cascade;

(2)在新的测试系统下是没有MY_STS的,所以EM下删除MY_STS调优集

[oracle@cuug ~]$ impdp system/oracle DUMPFILE=sh.dmp DIRECTORY=DATA_PUMP_DIR SCHEMAS=sh

 

7)测试系统下把调优集解开

 

(1)先把优化器参数optimizer_features_enable改成11.2.0.1

SYS@ prod>alter system set optimizer_features_enable='11.2.0.1';

(2)解开调优集

SYS@ prod>exec DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET('MY_STS','SYS',TRUE, 'MY_STS_TAB','SH');

(3)在EM中Refresh一下,MY_STS出现了

(4)整理一下调优集,删除不必要的sql语句(仅剩下select ...emp1相关的语句)

 

8)进入SPA做SQL分析

Related Links--->SQL Performance Analyzer

Parameter Change--》

Task Information

*Task Name--》选MY_TASK

*SQL Tuning Set--》选SYS.MY_STS

 

Parameter Change

*Parameter Name--》选 optimizer_features_enable

*Base Value--》10.1.0.3

*Change Values--》11.2.0.1

选Submit

 

点击MY_STS---》SQL Trials

INITIAL_SQL_TRIAL

SECOND_SQL_TRIAL

 

SQL Train Comparisons

INITIAL_SQL_TRIAL 点击小眼镜,看性能比较

 

9)进阶Guided Workflow

目的:测试emp1无索引(初始环境)和有索引(改变环境)下的性能比较

 

SQL Performance Analyzer Task: SYS.MY_TASK1

第一步Create SQL Performance Analyzer Task based on SQL Tuning Set

name 选调优集:MY_STS

 

第二步 Create SQL Trial in Initial Environment

注意在右端最下面一行,勾选方框Trial environment established,然后summit

这步比较慢,原始环境下,scott.emp1表没有索引,它要把我们调优集中的所有sql都分析一遍

 

第三步 Create SQL Trial in Changed Environment

我们先在 scott.emp1上建个索引,

SYS@ prod>create index scott.emp1_empno_ind on scott.emp1(empno);

然后再Execute

 

第四步Compare Step 2 and Step 3

 

第五步View Trial Comparison Report

第九章    SQL性能管理

一、11g新特性-SPM的引入

SQL的一些顾问可以调优SQL语句,但最多是一种被动的机制,而且需要DBA干预。

SPM(SQL Plan Management)可以提供一种预防性的机制,为保持执行计划始终处于最优状态。

Oracle引入SQL计划基线的概念,目的是使SQL执行计划得以进化。

 

二、SQL计划基线的概念

如果一条语句经常被使用,Oracle为了防止因数据库环境的变化造成原执行计划出现性能退化,又会生成新的执行计划。

累积的这些计划组成了一部计划历史,在其中有标记为accepted的计划,这样的计划是比较优异的(成本较低的),

计划基线就是计划历史中那些accepted的执行计划。标记为unaccepted的计划是非计划基线中的计划。

生成一条语句的最初的计划肯定是accepted, 因为它无从比较。以后再生成的计划就可以同计划基线中的计划去比较了。

 

三、执行计划成为计划基线的方法

1)自动捕获;

设OPTIMIZER_CAPTURE_SQL_PLAN_BASELINE参数为TRUE,数据库自动捕获新计划,但新计划不管是否优异,暂不列入accepted计划行列,要以观后效, 一个未认可的计划必须优于认可的计划才能进化为计划基线。

 

2)手动装载;

手动在数据库中装载它们,一般是升级或已经测试过的,新计划直接列入accepted。因为你装载的计划是你自认为最优的计划。

 

四、管理SPM

SMB(SQL Management Base),又叫SQL管理库,所有的sql计划基线,sql profile等信息都保存在SYSAUX表空间。

SMB占用SYSAUX的比例缺省是10%,可以在1%-50%任意设置它,数据库执行每周一次的定期清除以删除不使用的SQL基线.

可以利用Oracle提供了DBMS_SPM程序包或EM管理SQL计划基线。

管理视图:DBA_SQL_PLAN_BASELINES

五、11g新特性Result Cache

结果cache是11g的新特性,将查询结果集保存在shared pool以备其他session共享,这样减少物理读和逻辑读。

1)观察物理读和逻辑读,逻辑读总是有值,说明数据源来自db buffer

SYS@ prod>set autotrace on;

SYS@ prod>select deptno,sum(sal) from scott.emp group by deptno;

Statistics

----------------------------------------------------------

        214  recursive calls

          0  db block gets

         48  consistent gets

          6  physical reads   第一次有物理读

 

2)/   再次执行,观察物理读消失,但有逻辑读,反复执行,都有逻辑读。

Statistics

----------------------------------------------------------

          1  recursive calls

          0  db block gets

          7  consistent gets

          0  physical reads

 

3)使用 hint提示,使能result_cache功能

SYS@ prod>select /*+ result_cache */ deptno,sum(sal) from scott.emp group by deptno;

----------------------------------------------------------

          1  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

观察逻辑读为0了,说明直接从shared pool中的result cache取到结果集

换一个session做同样的查询,结果是一样的,共享了结果集

 

4)清除result cache 中缓存的结果集

SYS@ prod>exec DBMS_RESULT_CACHE.FLUSH();

 

 

第四部分ASM

第十章ASM存储管理

一、GRID安装

一)创建用户和组及其目录

[root@cuug ~]#

groupadd asmadmin

groupadd asmdba

groupadd asmoper

[root@cuug ~]#

useradd -g oinstall -G asmadmin,asmdba,asmoper,dba grid

usermod -g oinstall -G asmdba,dba oracle

 

passwd grid

二)创建grid 的安装目录,并修改属性

root用户:

mkdir -p /u02/grid

chown -R grid:oinstall /u02/grid

chmod -R 775 /u02/

三)修改grid用户资源限制

[root@cuug ~]# vi /etc/security/limits.conf

增加下列行:

grid  soft    nproc   2047

grid  hard    nproc   16384

grid  soft    nofile  1024

grid  hard    nofile  65536

grid  soft    stack   10240

 

修改grid的环境文件.bash_profile

[grid@cuug ~]#vi .bash_profile

ORACLE_BASE=/u01

ORACLE_HOME=/u02/grid

GRID_HOME=/u02/grid

ORACLE_SID=+ASM

PATH=$ORACLE_HOME/bin:$PATH

export ORACLE_BASE ORACLE_HOME GRID_HOME ORACLE_SID PATH

 

alias sqlplus='rlwrap sqlplus'

alias asmcmd='rlwrap asmcmd'

 

NLS_LANG="simplified chinese"_china.AL32UTF8

export NLS_LANG

export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

export NLS_TIMESTAMP_FORMAT='yyyy-mm-dd HH24:MI:SSXFF'

export NLS_TIMESTAMP_TZ_FORMAT='yyyy-mm-dd HH24:MI:SSXFF  TZR'

 

四)安装GRID软件

1)Xmanager FTP上传grid软件

[root@cuug ~]# cd /soft

[root@cuug ~]# unzip linux_11gR2_grid.zip

 

[root@cuug ~]# su - grid

[grid@cuug ~]$ cd /soft/grid

 

2)启动Xmanager Passive

[grid@cuug grid]$ export DISPLAY=192.168.3.100:0.0

[grid@cuug grid]$ ./runInstaller

 

 

 

 

 

[root@cuug ~]# /u02/grid/root.sh

root 用户执行:

/Grid_home/perl/bin/perl -I Grid_home/perl/lib -I Grid_home/crs/install Grid_home/crs/install/roothas.pl

用实际的目录代替Grid_home,这里是/u02/grid

/u02/grid/perl/bin/perl -I /u02/grid/perl/lib -I /u02/grid/crs/install /u02/grid/crs/install/roothas.pl

 

grid用户:

到Grid_home/oui/bin目录下,这里是/u02/grid/oui/bin

cd /u02/grid/oui/bin

运行:./runInstaller -updateNodeList ORACLE_HOME=Grid_home -defaultHomeName用实际目录代替grid_home

./runInstaller -updateNodeList ORACLE_HOME=/u02/grid  -defaultHomeName

OK结束图形安装,安装完毕。

 

3)启动cssd,查看状态

[grid@cuug bin]$ crs_start ora.cssd

Attempting to start `ora.cssd` on member `cuug`

Attempting to start `ora.diskmon` on member `cuug`

Start of `ora.diskmon` on member `cuug` succeeded.

Start of `ora.cssd` on member `cuug` succeeded.

[grid@cuug bin]$ crs_stat -t

名称         类型         目标    状态    主机     

------------------------------------------------------------

ora.cssd       ora.cssd.type  ONLINE    ONLINE    cuug       

ora.diskmon    ora....on.type ONLINE    ONLINE    cuug

[grid@cuug ~]

 

 

 

二、创建ASM实例

一)配置ASM磁盘

1)在linux里增加1个8G的虚盘/dev/sdb,

关闭Linux,加盘后分区sdb1--sdb4各1G

[root@cuug ~]#fdisk -l /dev/sdb

 

2)提供ASM磁盘的方法

在Linux上创建ASM磁盘有两种方法:

ASMlib方法:Linux 5版之前支持

Udev方法:Linux5版(包括5版)之后推荐使用.

下面我们使用Udev方法提供ASM磁盘:

[root@cuug ~]# ll /dev/sdb*

brw-r----- 1 root disk 8, 16 Jun 16 21:28 /dev/sdb

brw-r----- 1 root disk 8, 17 Jun 16 21:28 /dev/sdb1

brw-r----- 1 root disk 8, 18 Jun 16 21:28 /dev/sdb2

brw-r----- 1 root disk 8, 19 Jun 16 21:28 /dev/sdb3

brw-r----- 1 root disk 8, 20 Jun 16 21:28 /dev/sdb4

3)编辑udev配置文件

[root@cuug ~]#vi /etc/udev/rules.d/60-raw.rules          按照example编写如下:

ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="17",RUN+="/bin/raw /dev/raw/raw1 %M %m"

ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="18",RUN+="/bin/raw /dev/raw/raw2 %M %m"

ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="19",RUN+="/bin/raw /dev/raw/raw3 %M %m"

ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="20",RUN+="/bin/raw /dev/raw/raw4 %M %m"

KERNEL=="raw[1-4]", OWNER="grid", GROUP="dba", MODE="660"

 

4)映射udev裸设备

[root@cuug ~]# start_udev

[root@cuug ~]# ll /dev/raw/*

crw-rw---- 1 grid dba 162, 1 Jun 16 21:30 /dev/raw/raw1

crw-rw---- 1 grid dba 162, 2 Jun 16 21:30 /dev/raw/raw2

crw-rw---- 1 grid dba 162, 3 Jun 16 21:30 /dev/raw/raw3

crw-rw---- 1 grid dba 162, 4 Jun 16 21:30 /dev/raw/raw4

 

二)ASMCA创建asm实例

asmca创建asm实例时,要先修改$ORACLE_BASE目录下的cfgtoollog目录的权限,使grid用户可以写该目录。

[root@cuug ~]# ll -d /u01/cfgtoollogs

Drwxr-x--- 5 oracle oinstall 4096 May 24  2015 /u01/cfgtoollogs

[root@cuug ~]# chmod g+w /u01/cfgtoollogs

[grid@cuug ~]$ export DISPLAY=192.168.3.100:0.0

[grid@cuug ~]$ asmca

 

 

 

 

[root@cuug ~]# mkdir -p /u01/admin/+ASM/pfile

[root@cuug ~]# chown -R grid:dba /u01/admin/+ASM/pfile

再次Create ASM

 

 

[root@cuug ~]# ps -ef |grep asm_

[grid@cuug ~]$ crs_stat -t

名称         类型         目标    状态    主机     

------------------------------------------------------------

ora.DG1.dg     ora....up.type ONLINE    ONLINE    cuug       

ora.asm        ora.asm.type   ONLINE    ONLINE    cuug       

ora.cssd       ora.cssd.type  ONLINE    ONLINE    cuug       

ora.diskmon    ora....on.type ONLINE    ONLINE    cuug

三、ASM概念和术语

 

一)ASM实例及参数文件

[root@tim1 ~]# su - grid

[grid@tim1 ~]$ sqlplus / as sysasm

SQL> show parameter instance_type

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

instance_type                        string      asm

SQL> show parameter spfile

 

NAME                                 TYPE                              VALUE

------------------------------------ --------------------------------- ------------------------------

spfile                               string                            +DG1/asm/asmparameterfile/regi

                                                                       stry.253.946984797

SQL> create pfile from

SQL> create pfile from spfile;

[grid@tim1 dbs]$ cat init+ASM1.ora   ASM的参数文件

*.asm_power_limit=1

*.diagnostic_dest='/u01'

*.instance_type='asm'

*.large_pool_size=12M

*.remote_login_passwordfile='EXCLUSIVE'

[

二)ASM磁盘、ASM磁盘组以及ASM文件

1)ASM disk可以是实际的磁盘,也可以是磁盘的某个分区,或LVM管理的逻辑卷,实际工作中ASM disk一般不使用文件系统格式化的磁盘。

2)ASM diskgroup由ASM disk组成,可以包含一个或多个ASM disk。

3)建立ASM diskgroup时会将所有ASM disk划分成单元(AU)。AU大小缺省1M。也可指定其属性为2,4,8,16,32或64M。

4)ASM文件有数据文件,临时文件,控制文件,联机日志和归档日志文件,spfile,及RMAN备份集和映像副本等。ASM文件不支持口令文件、静态参数文件,跟踪文件、告警文件和Oracle二进制文件。

5)ASM file会依据文件的动态增长分配ASM extent,ASM extent是(可变长)基于一个或多个ASM AU ,一个ASM file会分布到一个ASM diskgroup的所有ASM disk上。

6)可以通过ALTER DISKGROUP 磁盘组名 MOUNT手动加载ASM disk,也可以通过指定参数ASM_DISKGROUP自动加载。

7)当ASM diskgroup组中的ASM disk发生增减后,ASM diskgroup会自动再平衡,目的是使IO均衡在ASM diskgroup的所有ASM disk上。

三)ASM条带和镜像

1)ASM striping (条带)

为了提高IO读写性能,ASM需要进行条带化处理,注意striping(条带)是基于AU的。

ASM不能禁用striping。有两种类型的条带化方式:粗粒度条带(coarse)和细粒度条带(fine)。粗粒度条带大小=AU大小,一般来说相对1M的AU,粗粒度条带也是1M, 而细粒度条带总是128K, 条带策略已由Oracle模板缺省定义了。若有特殊需求,你可自定义模板,然后在建立表空间时使用模板子句引用你自定义的文件模板。

 

细粒度条带主要用于controlfile和logfile

粗粒度条带用于个头较大的datafile

2)ASM镜像及故障组

1、ASM镜像提供了数据的冗余支持,镜像有三种模式:

EXTERNAL REDUNDANCY(无镜像,使用RAID)

NORMAL REDUNDANCY(两路),

HIGH REDUNDANCY(三路),

2、ASM的镜像与操作系统提供的镜像有所不同。操作系统镜像是基于整个盘(分区)的镜像。而ASM是对ASM文件的extent做镜像,当ASM在某个磁盘上分配了一个primary extent时,必定在另一个磁盘上分配一个与之对应的secondary extent(镜像)。

3、对于双路磁盘控制器,为防止单路控制器同时损毁主副extent,ASM又引入故障组容错概念,使主副extent分布在不同的故障组下,即主extent和副extent分别属于不同的故障组。如果不设故障组,则每个磁盘就是一个独立的故障组。

 

 

 

4、一个磁盘组可有两个或多个故障组(failgroup),一个故障组由一个或多个ASM磁盘组成,故障组只能在两路或三路镜像模式下进行。

故障组是在标准冗余的基础上指定镜像策略,它是一种镜像功能的补充。假定有磁盘组DG1,且创建了两个故障组controller1,controller2,每个故障组由2个ASM磁盘组成,则对标准冗余而言,指定两个故障组互为镜像

 

 

3)磁盘组动态再平衡

1、无论是向磁盘组加盘还是减盘,只要改变了磁盘组中磁盘的数量,ASM就会重新分布磁盘上的数据。如果是增加磁盘还会为其划分au, 进而划分条带,这样,文件会立即分布到新加的ASM disk上。

2、自动重新平衡会消耗系统资源,有条件的话应该选择系统比较空闲的时段加减磁盘。

ASM_POWER_LIMIT这个参数值取0-11,0表示关闭动态平衡功能,此值越高平衡时消耗服务器资源越多,也可以在增加磁盘时在语句后中指定power的力度。

 

四)ASM别名(ASM alias)

ASM别名是一个选项,目的就是为ASM文件默认的系统路径和命名起一个“外号”,便于用户适用于文件系统的命名方式。

1)加别名

SQL> alter diskgroup dg1 add alias '+data/test2_01.dbf' for '+data/prod/datafile/test2.257.977760221 ';

修改控制文件和字典信息

SYS@ prod1>alter database datafile 7 offline;

SYS@ prod1>alter tablespace test2 rename datafile '+DATA/prod/datafile/test2.268.959100175' to '+DATA/test2_01.dbf';

SYS@ prod1>recover datafile 7;  可能需要recover一下

SYS@ prod1>alter database datafile 7 online;

 

 

2)删别名

SQL> select name,file_incarnation from v$asm_alias where name like '%omf%';

SQL> alter diskgroup kel drop alias '+kel/ipap/datafile/omf.dbf';

3)查看别名

SYS@ prod> select file_incarnation from v$asm_alias where name like '%timran%';

 

FILE_INCARNATION

----------------

       977760367

 

SYS@ prod> select name from v$asm_alias where file_incarnation=977760367;

 

NAME

----------------------------------------------------------------------

TIMRAN.258.977760367

timran01.dbf

 

四、磁盘组及磁盘的操作

一)建立ASM磁盘

SYS@ +ASM1> col name for a10

SYS@ +ASM1> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB ,FREE_MB from v$asm_diskgroup;

GROUP_NUMBER NAME       STATE                             TYPE                 TOTAL_MB    FREE_MB

------------ ---------- --------------------------------- ------------------ ---------- ----------

           1 DG1        MOUNTED                      EXTERN                    964        904

SYS@ +ASM1>col path for a30

SYS@ +ASM1>col name for a20

SYS@ +ASM1>select GROUP_NUMBER,NAME,DISK_NUMBER,PATH,TOTAL_MB,FREE_MB from v$asm_disk;

GROUP_NUMBER NAME                 DISK_NUMBER PATH                             TOTAL_MB    FREE_MB

------------ -------------------- ----------- ------------------------------ ---------- ----------

           0                                0 /dev/raw/raw4                           0          0

           0                                1 /dev/raw/raw3                           0          0

           0                                2 /dev/raw/raw2                           0          0

           1 DG1_0000                       0 /dev/raw/raw1                         964        904

6.4数据库文件在ASM上的命名

 

建立ASM磁盘组

1)建立DG2磁盘组

SQL> create diskgroup dg2 external redundancy disk '/dev/raw/raw2’;

SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,PATH from v$asm_disk;

2)删除DG2磁盘组

SQL> drop diskgroup dg2 including contents;

 

建立表空间

SYS@ prod>show parameter create_file

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_create_file_dest                  string      +dg1

方法1:

SQL> create tablespace test1;   默认路径,100M

方法2:数据文件自动命名

SQL> create tablespace test2 datafile '+DG1' size 10m;  

方法3:数据文件指定别名

SQL> create tablespace test3 datafile '+DG1/prod/datafile/test3_01.dbf' size 10m;  

SQL> select tablespace_name,file_name from dba_data_files;

在dg1上建个表试试

SQL> create table scott.t1(id int) tablespace test1;

SQL> insert into scott.t1 values(1);

SQL>commit;

 

建立DG2磁盘组   两路容错

create diskgroup DG2 normal redundancy

failgroup CON1 disk '/dev/raw/raw3'

failgroup CON2 disk '/dev/raw/raw4';

 

SQL> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB ,FREE_MB from v$asm_diskgroup;

 

GROUP_NUMBER NAME         STATE                 TYPE                 TOTAL_MB    FREE_MB

------------ -------------------- --------------------------------- ------------------ ---------- ----------

           1 DG1           MOUNTED              EXTERN                    964        904

           2 DG2           MOUNTED              NORMAL                   1928       1826

 

SQL> select GROUP_NUMBER,NAME,DISK_NUMBER,PATH,TOTAL_MB,FREE_MB from v$asm_disk;

 

GROUP_NUMBER NAME                      DISK_NUMBER PATH                       TOTAL_MB    FREE_MB

------------ -------------------- ----------- ------------------------------ ---------- ----------

           0                                2 /dev/raw/raw2                           0          0

           1 DG1_0000                       0 /dev/raw/raw1                         964        904

           2 DG2_0001                       1 /dev/raw/raw4                         964        913

           2 DG2_0000                       0 /dev/raw/raw3                         964        913

SQL> alter diskgroup dg2 rebalance power 3;

1)添加磁盘

SQL> alter diskgroup dg2 add failgroup con1 disk '/dev/raw/raw2';

2)删除磁盘

alter diskgroup dg2 drop disk DG2_0002;   删除磁盘要使用name

3)删除磁盘组DG2(磁盘组上不能有表空间)

SQL> drop diskgroup dg2 [force] including contents;

注意:无法删除dg1,因为Spfile文件在dg1上。

posted on 2022-08-26 17:20  root-123  阅读(1163)  评论(0编辑  收藏  举报