1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换,将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器一般产生不同的执行计划
6)选择连接方式,ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。
7)选择连接顺序,对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8)选择数选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9)运行“执行计划”
维护窗口自动执行SQL Tuning Advisor,收集SQL语句辅助统计信息和局部执行统计信息,放在SQL Profile中,帮助查询优化器因为缺乏足够的信息,生成糟糕的执行计划。
1、查询优化器
2、统计信息
查询优化器使用统计信息(存放在数据字典)来设计执行计划,oracle多达859种统计信息,其中对象统计信息最重要
对象统计信息(静态,oracle维护窗口自动执行Optimizer Statistics Gathering收集对象统计信息)
表统计信息,显示在DBA_TABLES
行数、分配块数、正在使用的块的空闲空间数、行平均长度、链接行数
表的列统计信息,显示在DBA_TAB_COLUMNS
不同值数目、最大值最小值、NULL值数目、平均列长度、
索引统计信息(行删除时,索引键保留),显示在DBA_INDEXES
B-tree深度、不同键值数目、聚合因子
与索引相关的统计信息,显示在INDEX_STATS(对索引的分析填充此视图)
引用现有行的索引数、引用被删除行的索引数
analyze table st compute statistics
dbms_stats
begin
dbms_stats.gather_table_stats(
ownname=> 'HR',
tabname=> 'EMPLOYEES' ,
estimate_percent=> DBMS_STATS.AUTO_SAMPLE_SIZE,
cascade=> DBMS_STATS.AUTO_CASCADE, -- 是否收集索引
degree=> null, -- 搜索统计信息变行度
no_invalidate=> DBMS_STATS.AUTO_INVALIDATE,
granularity=> 'AUTO',
method_opt=> 'FOR ALL COLUMNS SIZE AUTO');
dbms_stats.lock_table_stats(ownname=> 'HR', tabname=> 'EMPLOYEES' );
end;
optimizer_use_pending_statistics
收集操作结束自动发布统计信息(默认)
保存新的统计信息,待定(暂不发布pending)
alter session set optimizer_use_pending_statistics = TRUE;
session级别内使用待定的统计信息编译sql语句并且生成查询计划
参数 STATISTICS_LEVEL = BASIC|TYPICAL|ALL
TYPICAL自我管理和调整功能需要的统计信息,维护窗口运行自动对象统计分析任务
BASIC禁用日常分析,无法使用各种性能和调整顾问,警报系统不起作用
ALL所有可能的统计信息,对性能产生负面影响
控制两个级别的统计信息的收集
实例相关活动中收集的统计信息MMON后台进程转储到AWR
数据库对象中的对象统计信息DBMS_STATS
3、sql profile
4、sql plan baseline
AWR Automatic Workload Repository10g新推功能
自动负载信息库,由MMON完成,帮助DBA发现数据库性能瓶颈
统计信息存在SYSAUX表空间的SYS模式下,默认保留7天
指标 Metrics
基准 Baseline一段时间内的性能数据,baseline永久保留,
用于与其他工作负载(awr snapshot或其他baseline)比较
Fixed baseline手工指定的一个固定连续时间段snapshot集合
Moving Windows Baselineawr保留周期内所有awr数据,默认窗口=awr保留期
Baseline Template分为single baseline template、repeating baseline template
single baseline template将来某个固定连续时间段建baseline
repeating baseling template自动持续地捕获某个连续时间段
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT
(flush_level IN VARCHAR2 DEFAULT 'TYPICAL');
select SNAP_ID,BEGIN_INTERVAL_TIME,FLUSH_ELAPSED,SNAP_LEVEL
from dba_hist_snapshot order by snap_id;
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS
( retention => 43200,
interval => 30, topnsql => 100,
dbid => 220853307);
DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE
(low_snap_id => 1,
high_snap_id => 20, dbid => 220853307);
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE
(start_snap_id => 21,
end_snap_id => 25, baseline_name => 'peak baseline',
dbid => 220853307, expiration => 30);
DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE
(baseline_name => 'peak baseline',
bascade => FALSE, dbid => 3310949047);
DBMS_WORKLOAD_REPOSITORY.SELECT_BASELINE_METRICS
( baseline_name => 'peak maomi',
dbid => 220853307,
instance_num => '1');
DBMS_WORKLOAD_REPOSITORY.MODIFY_BASELINE_WINDOW_SIZE
(window_size => 30,
dbid => 220853307);
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE
( start_time => '2013-03-10 17:00:00',
end_time => '2013-03-10 20:00:00',
baseline_name => 'baseline_130310',
template_name => 'template_130310', expiration => 30,
dbid => 220853307);
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE
(day_of_week => 'monday', hour_in_day => 17,
duration => 3, expiration => 30,
start_time => '2013-03-10 17:00:00',
end_time => '2013-12-31 20:00:00',
baseline_name_prefix => 'baseline_2013_mondays_',
template_name => 'template_2013_mondays',
dbid => 220853307);
Automatic Database Diagnostic Monitor 自动数据库诊断监,Oracle内部的一个顾问系统,通过AWR信息能自动完成数据库的一些优化建议
SQL优化
索引的创建
统计量的收集
ADDM报告基于AWR库,默认保存30天
CPU 瓶颈
Oracle Net 连接管理不佳
锁争用
输入/输出(I/O) 能力差
数据库实例内存结构大小不足
SQL 语句的负载过高
PL/SQL 和Java 时间过高
检查点负载过高及原因(例如,日志文件太小)
DECLARE
task_name VARCHAR2(30) := 'DEMO_ADDM01';
task_desc VARCHAR2(30) := 'ADDM Feature Test';
task_id NUMBER;
BEGIN
dbms_advisor.create_task('ADDM', task_id, task_name, task_desc, null);
dbms_advisor.set_task_parameter(task_name, 'START_SNAPSHOT', 65);
dbms_advisor.set_task_parameter(task_name, 'END_SNAPSHOT', 66);
dbms_advisor.set_task_parameter(task_name, 'INSTANCE', 1);
dbms_advisor.set_task_parameter(task_name, 'DB_ID', 1712582900);
dbms_advisor.execute_task(task_name);
END;
set_task_parameter是用来设置任务参数的。START_SNAPSHOT是起始快照ID,END_SNAPSHOT是结束快照ID,INSTANCE是实例号,对于单实例,一般是1,在RAC环境下,可以通过查询视图v$instance得到,DB_ID是数据库的唯一识别号,可以通过查询v$database查到。
SELECT dbms_advisor.get_task_report('DEMO_ADDM01', 'TEXT', 'ALL') FROM DUAL;--查看ADDM报告
……
遇到错误时自动收集有关故障信息。主动运行Data Recovery Advisor,通常可以在用户查询或备份操作检查到故障前检测和修复故障。Data Recovery Advisor可以检测到诸如块受损的相对较小的错误,也可以检测到导致数据库无法成功启动的错误,如缺少联机重做日志文件,数据文件等。
list failure:列出Data Recovery Advisor记录的故障;
advise failure:显示建议修复的选项;
repair failure:使用rman的建议和关闭故障;
change failure:更改状态或关闭故障
5、内存管理 & 顾问
MMAM协调各组件内存大小的变化
⑴、自动内存管理AMMAutomatic Memory Management
MEMORY_TARGET操作系统的角度上 Oracle 所能使用的最大内存值,动态参数。MEMORY_MAX_TARGETMEMORY_TARGET所能设定的最大值,静态参数。
AMM通过MEMORY_TARGET动态控制SGA、PGA,自动在PGA、SGA之间转换内存
alter system set MEMORY_MAX_TARGET = xxx默认=MEMORY_TARGET
alter system set MEMORY_TARGET =xxx
alter system SGA_TARGET = 0或非0指定值为最小大小
alter system PGA_TARGET = 0或非0指定值为最小大小
⑵、自动共享内存(SGA)管理 ASMAutomatic Shared Memory Management
SGA_MAX_TARGET,默认= SGA_MAX_TARGET
SGA_TARGET >0
设置为0或指定值为最小大小
ASSM条件,以下参数手动管理
DB_nK_CACHE_SIZE
LOG_BUFFER
buffer_pool_keep非常频繁使用的表,将表放在keep中,尽量减少检索表中的块需要的IO数量
buffer_pool_recycle
⑶、PGA自动管理,无论怎样,都自动管理
WORKAREA_SIZE_POLICYAUTO
PGA_AGGREGATE_TARGET10MB默认大小,可优化此值
不建议手动调整以下值
内存顾问(通过EM或动态性能视图)
V$MEMORY_DYNAMIC_COMPONENTS
V$MEMORY_RESIZE_OPS
V$MEMORY_TARGET_ADVICE
segment management auto,有关表空间存储参数
Segment Advisor 根据对象内的空间碎片化程度,给出是否应该对对象执行新的在线收缩操作的建议。提供关于段的历史增长趋势的报告,能为容量规划提供有效的信息
undo_management auto|manual
帮助管理员在 flashback 和非 flashback 特性中调整撤消表空间大小时做出正确的判断。它为管理员适当地设置 UNDO_RETENTION 提供建议,以避免快照过于陈旧的问题
根据FAST_START_MTTR_TARGET设置和统计分析出最佳重做日志文件大小
V$INSTANCE_RECOVERY VIEW.
实例崩溃之后恢复时间,实例参数FAST_START_RECOVERY_TARGET控制MTTR
主要区别(考点): Tuning Advisor 调整每条SQL语句,Access Advisor调整所有SQL语句
SQL Tuning Advisor Recommendation维护窗口期间自动运行
分析统计信息检查陈旧或缺失的统计信息,并给出刷新或创建的建议
分析SQL收集SQL语句辅助统计信息和局部执行统计信息,放在SQL profile(自动执行)
访问路径分析新建索引、物化视图、分区的影响
分析结构重建SQL语句以查看是否生成更合适的查询计划(有限Tuning不执行此部分)
SQL Tuning Advisor源
当前缓存在共享池库缓存中的SQL语句(dbconsole Top Activity)
预先创建的一组语句(SQL Tuning Sets)
从AWR中检索的语句(dbconsole Historical SQL)
单独的单条语句
SQL Access Advisor Recommendation
partitioning
index:bitmap、function-based、B-tree,不包括 index-organized table
materialized view、materialized view log
SQL Access Advisor源
当前缓存在共享池库缓存中的SQL语句(dbconsole Top Activity)
预先创建的一组语句(SQL Tuning Sets)
单独的单条语句
统计信息
模式对象
SQL Tuning Advisor示例
--授予advisor权限
grant advisor to dave
--创建sql tuning task
SQL> DECLARE
my_task_name VARCHAR2(30);
my_sqltext CLOB;
BEGIN
my_sqltext := 'select count(*) from bigtab a, smalltab b where a.object_name=b.table_name';
my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => my_sqltext,
user_name => 'DAVE',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'tuning_sql_test',
description => 'Task to tune a query on a specified table');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'tuning_sql_test');
END;
调整 sql tuning task 参数
begin
dbms_sqltune.set_tuning_task_parameter
(task_name => 'xcl_sql_tuing_task',
parameter => 'TIME_LIMIT',
value => 30
);
end;
--执行sql tuning task
SQL> exec dbms_sqltune.execute_tuning_task('tuning_sql_test');
或
begin
dbms_sqltune.execute_tuning_task
(task_name => 'xcl_sql_tuing_task');
end;
--查看优化任务的当前状态
user_advisor_tasks/dba_advisor_tasks
--查看优化结果
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'tuning_sql_test') from DUAL;
--删除sql tuning task
exec dbms_sqltune.drop_tuning_task('tuning_sql_test');
SQL Access Advisor示例
创建sql access advisor task
DECLARE
task_name VARCHAR2(200);
BEGIN
task_name := 'LI_TASK_9';
DBMS_ADVISOR.QUICK_TUNE(DBMS_ADVISOR.SQLACCESS_ADVISOR, task_name,
'select * from litest.litest_8 where created>sysdate-50 and created<sysdate-30 and object_id=79420');
END;
或
SQL> execute DBMS_ADVISOR.QUICK_TUNE(DBMS_ADVISOR.SQLACCESS_ADVISOR,'LI_TASK_9',
'select * from litest.litest_8 where created>sysdate-50 and created<sysdate-30 and object_id=79420');
显示task
SQL> SELECT rec_id, action_id, substr(command,1,30) AS command
2 FROM user_advisor_actions
3 WHERE task_name='LI_TASK_9';
REC_ID ACTION_ID COMMAND
1 1 CREATE MATERIALIZED VIEW
1 2 GATHER TABLE STATISTICS
--如表缺少统计信息或SQL Access Adviso无优化建议,不会生成TASK
查看report
createdirectoryEXPDP_DIRas'/dba/soft'--创建存放recommanded目录
exec DBMS_ADVISOR.CREATE_FILE(DBMS_ADVISOR.GET_TASK_SCRIPT('LI_TASK_9'),'EXPDP_DIR', 'LI_TASK_9.sql');
cat LI_TASK_9.sql
Rem SQL Access Advisor: Version 11.2.0.3.0 - Production
Rem
Rem Username: SYS
Rem Task: LI_TASK_9
Rem Execution date:
Rem
CREATE INDEX "LITEST"."LITEST_8_IDX$$_03660000"-- recommanded
ON "LITEST"."LITEST_8"
("OBJECT_ID","CREATED")
COMPUTE STATISTICS;
删除task
exec DBMS_ADVISOR.DELETE_TASK('LI_TASK_9');
捕获每条客户端请求,记录在独立于平台的二进制文件中
SQL文本
绑定值
事务信息(含时间戳),可使重放快于、慢于、或与原始工作量持平的速度
不包括
SQL Loader 直接路径加载
Oracle stream操作、高级复制流
未基于PL/SQL的高级排队操作
闪回查询
OCI对象
未基于SQL的对象访问
分布式事务(捕获任何分布式事务,但重放时假设为本地事务)
远程DECRIBE、COMMIT
Database Replay示例
create db_replay_dir AS ‘/u01/app/oracle/db_replay_capture/’在捕获数据库创建捕获数据存放目录
shutdown immediate; startup确保捕获时完成或回滚活动事务(可捕获正在进行的事务,但无法重放)
begin
dbms_workload_capture.ADD_FILTER
(fname =>'FILTER_TEST',
fattribute =>'USER',
fvalue =>'TEST');
dbms_workload_capture.ADD_FILTER-- 可选项,捕获进行某些过滤操作
(fname =>'FILTER_INST1',
fattribute =>'INSTANCE_NUMBER',
fvalue =>'1');
end;
BEGIN
DBMS_WORKLOAD_CAPTURE.start_capture -- 开始捕获
(name => 'test_capture_1',
dir =>'DB_REPLAY_CAPTURE_DIR',
duration => NULL); -- 设置为NULL,需手工停止
END;
………数据库执行一些DML SELECT等负载操作
BEGIN
DBMS_WORKLOAD_CAPTURE.finish_capture;
END;
BEGIN
DBMS_WORKLOAD_REPLAY.process_capture-- 捕获数据转换为重放数据库可接受的格式
('DB_REPLAY_CAPTURE_DIR');
END;
运行第一个重放前,须执行预备检查
确保重放数据库能访问重放目录
重新映射对其他生产系统的引用(数据库链接、外部表、目录对象、URL、EMAIL通知等)
从生产系统将连接字符串重新映射到重放系统
BEGIN
EXEC DBMS_WORKLOAD_REPLAY.initialize_replay -- 开始重放
(replay_name => 'test_capture_1',
replay_dir => 'DB_REPLAY_CAPTURE_DIR');
EXEC DBMS_WORKLOAD_REPLAY.start_replay ;
END
declare
capture_dir_id number;
curr_replay_id number;
replay_report clob;
begin
capture_dir_id := dbms.workload_replay.get_replay_info
(dir => ‘REP_CAP_DIR’);
select max(id) into curr_replay_id
from dba_workload_replays
where capture_id = capture_dir_id;
replay_report := dbms_workload_replay.report
(replay_id=> curr.replay_id,
format => dbms_workload_replay.type_text);
end;
ASM实例后台进程RBAL 协调磁盘组的磁盘活动
ARBn磁盘组的磁盘之间执行实际的区间移动操作
RDBMS实例后台进程ASMB执行数据库与ASM实例间的通信
RBAL 代表数据库打开和关闭磁盘组中的磁盘
ASM实例
有初始化参数文件spfile、密码文件,没有数据字典,实例处于nomount、mount状态,不能open
仅操作系统认证,用操作系统组dba用户,以sysdba sysasm sysoper权限连接connect / as sysasm
11g ASM存储管理权限sysasm(osasm组用户)与数据库管理权限sysdba分离
11g sysasm、sysdba的操作系统组:dba,未来版本,估计会分离
v$pwfile_users哪些用户拥有ASM实例的sysdba、sysasm、sysoper权限
安装数据据时,指定ASM为数据库的文件存储选项,自动创建ASM实例
export ORACLE_SID=orcl数据库实例
sqlplus / as sysdba
export ORACLE_SID=+asmASM实例
sqlplus / as sysasm,或sysdba
实装grid架构(grid、oracle可以共owner、也可以分owner),先安装ASM实例,后安装数据库
su - osasm
sqlplus / as sysasm
su - oracle
sqlplus / as sysdba
v$asm_diskgroup
v$asm_file
v$asm_template
v$asm_client
v$asm_alias
startup nomount启动实例,未加载磁盘组
startup mount加载磁盘组
startup restrict临时阻止数据库实例连接到ASM实例
ASM磁盘管理
粗略条带化所有磁盘分配条带化,分配单元 1MB
精细条带化所有磁盘分配条带化,分配单元 128K
物理磁盘 -->故障组 --> 磁盘组
引入故障组的意义:例如PC服务器的RAID卡,如果卡失败,则卡上的磁盘都将失败。同一个RAID
卡磁盘分到一个磁盘组,镜像在磁盘故障时是有用的,但卡故障时是无用的。引入故障组,将卡1的磁
盘分到故障组1和卡2的磁盘分到故障组2,然后故障组1 2分到磁盘组1,则磁盘组1的镜像是可靠的。
镜像的分布是跨故障组的,默认每个磁盘隐性分配到自己的故障组中。
外部冗余:无镜像
普通冗余:1份镜像,磁盘组内至少2个故障组
高度冗余:2份冗余,磁盘组内3个故障组
自动平衡,初始化参数 asm_power_limit 设较低,可控制对正在进行的数据库IO操作的影响
快速镜像同步,设置一个时间窗口,在此期间如果计划内或外故障时,ASM不会自动删除磁盘组中
的磁盘。ASM跟踪所有已经更改的数据块,当磁盘重新联机时,仅重新镜像已更改的块,不需重新镜
像整块磁盘
alter diskgroup data set attribute 'compatible.asm' = '11.1.0.0.0'
alter diskgroup data set attribute 'compatible.rdbms' = '11.1.0.0.0'
alter diskgroup data set attribute 'disk_repair_time' = '2.5h'
alter diskgroup data online disk data_0001
添加磁盘
alter diskgroup data add failgroup data_fg1 disk '/dev/sda8' name data_fg1_disk4
alter diskgroup data mount
alter diskgroup data dismount
alter diskgroup data check all
ASM 工具程序 asmcmd
使用者组
用户可以属于多个组,但仅一个组是用户初始使用者组,同一时间每个会话只能有一个组作为有效使用者组。用户首次创建会话时,默认初始使用者组作为用户的有效使用者组,可手动或自动切换用户的有效使用者组。
系统缺省使用者组
资源管理计划
应用到整个实例,控制使用者组之间的资源分配。资源管理计划可以控制组所有会话的总CPU使用率、可用的并行程度、活动会话数量、撤销空间量、空闲会话时间、一次调用的最长执行时间。数据库可以存在多个计划,任一时间只能有一个计划被激活,资源管理计划可手工或用调度程序自动激活。
系统缺省资源理计划
alter system set resource_manager_plan
该参数可手动、scheduler自动、编程方式DBMS_RESOURCE_MANAGER.SWITCH_PLAN
考点:与参数resource_limits无关,此参数通过用户profile控制资源
资源管理器管理工具database control或pl/sql API
dbms_resource_mananger_privs将用户放到使用者组、授予管理资源管理器必需的权限
dbms_resource_manager创建使用者组、计划、指令、挂起区域
考点:ADMINISTATOR RESOURCE MANAGER用dbms_resource_manager_privs授予和取消,grant revoke不能
案例1
创建用户
create user bob identified 1234
grant connect to bob
create user alice identified 1234
grant connect to alice
create user mike identified 1234
grant connect to mike
create user smith identified 1234
grant connect to smith
创建使用者组
exec dbms_resource_manager.create_cosumer_group('oltp','telephone sales')
exec dbms_resource_manager.create_cosumer_group('dss','analyst')
exec dbms_resource_manager.create_cosumer_group('batch','admin')
exec dbms_resource_manager.delete_consumer_group('dss')删除使用者组
将用户添加到使用者组
exec dbms_resource_manager_privs.grant_switch_consumer_group(
grantee_name=>'bob',consumer_group=>'oltp',grant_option=>false)
将bob用户添加到oltp使用者组,未授予bob向此组添加其他用户权限
exec dbms_resource_manager_privs.grant_switch_consumer_group(
grantee_name=>'bob',consumer_group=>'dss',grant_option=>false)
设置用户初始使用者组
exec dbms_resource_manager.set_initial_consumer_group('bob','oltp')
bob用户属于oltp dss,为其指定初始使用者组
exec dbms_resource_manager.set_initial_consumer_group('alice','dss')
exec dbms_resource_manager.set_initial_consumer_group('mike','batch')
exec dbms_resource_manager.set_initial_consumer_group('smith','oltp')
创建挂起区域
exec dbms_resource_manager.create_pending_area;--
创建资源管理计划 daytime
exec dbms_resource_manager.create_plan(
plan=>'daytime',comment=>'plan for normal working hours');
exec dbms_resource_manager.create_directive(
plan=>'daytime',group_or_subplan=>'sys_group',cpu_p1=>100,comment=>'sys_group users top priority');--daytime资源管理计划中,sys_group优先级第一,CPU使用率100%
exec dbms_resource_manager.create_directive(
plan=>'daytime',group_or_subplan=>'oltp',cpu_p2=>100,comment=>'oltp users next priority');
--daytime资源管理计划中,oltp组优先级第二,CPU使用率100%
exec dbms_resource_manager.create_directive(
plan=>'daytime',group_or_subplan=>'dss',cpu_p3=>50,comment=>'dss users third priority');
exec dbms_resource_manager.create_directive(
plan=>'daytime',group_or_subplan=>'batch',cpu_p3=>50,comment=>'batch users third priority too');
--daytime资源管理计划中,dss batch组优先级并列第三,CPU使用率各50%
exec dbms_resource_manager.create_directive(
plan=>'daytime',group_or_subplan=>'other_groups',cpu_p4=>100,comment=>'other users last priority');
考点:每个级别总CPU不能>100%,否则挂起区域无法验证,无法保存到数据字典,允许少于100%
每个计划须包括一条针对other_groups组指令,否则挂起区域无法验证,也无法保存到数据字典
创建资源管理计划 nighttime
exec dbms_resource_manager.create_plan(
plan=>' nighttime ',comment=>'plan for night');
exec dbms_resource_manager.create_directive(
plan=>'nodaytime',group_or_subplan=>'sys_group',cpu_p1=>100,comment=>'sys_group users top priority');--nighttime资源管理计划中,sys_group优先级第一,CPU使用率100%
exec dbms_resource_manager.create_directive(
plan=>'nighttime',group_or_subplan=>'dss',cpu_p2=>50,comment=>'dss users next priority');
exec dbms_resource_manager.create_directive(
plan=>'nighttime',group_or_subplan=>'batch',cpu_p2=>25,comment=>'batch users next priority too');
exec dbms_resource_manager.create_directive(
plan=>'nighttime',group_or_subplan=>'oltp',cpu_p2=>25,comment=>'oltp also users next priority');
--nighttime资源管理计划中,dss batch oltp组并列第三,dss CPU使用率各50%,oltp batch各25%
exec dbms_resource_manager.create_directive(
plan=>'nodaytime',group_or_subplan=>'other_groups',cpu_p3=>100,comment=>'other users last priority');
验证和保存资源管理计划
exec dbms_resource_manager.validate_pending_area验证挂起区域
exec dbms_resourece_manager.submit_pedning_area验证通过后,才能将计划保存到数据字典
激活资管理计划
alter system set resource_manager_plan=daytime手工激活daytime计划
切换用户使用者组
dbms_resource_manager.switch_consumer_group_for_sess(
session_id => '56',
session_serial => '106',
consumer_group => 'low_group');
基于会话的唯一标识(session_id 和 session_serial 共同组成)切换,v$session 视图中可查
dbms_resource_manager.switch_consumer_group_for_user(
user => 'user1',
consumer_group => 'low_group')
基于会话所属的用户切换(将用户下的所有会话切)
以上两种办法需资源管理器管理权限,通常由DBA执行
dbms_session.switch_current_consumer_group(
new_consumer_group => 'low_group');
用户切换自己当前会话,需特定权限
dbms_resource_manager_privs.grant_switch_consumer_group(-- 授权
grantee_name => 'user1',
consumer_group => 'low_group',
grant_option => 'false');
dbms_resource_manager_privs.revoke_switch_consumer_group(--取消授权
grantee_name => 'user1',
consumer_group => 'low_group');
自动切换(基于CPU或IO阈值)
永久性切换一个会话,适用最终用户有一个专用会话的客户端--服务器环境
一次调用期间切换,适用于用户连接到应用服务器,应用服务器连接数据库的环境
使用者组自适应映射
基于会话的属性将会话动态分配给使用者组
dbms_resource_manager.set_consumer_group_mapping(
attribute => oracle_user,
value => 'user1,
consumer_group => 'oltp');
当会话的oracle用户属性值为user1时,将其分配给使用者组oltp
由于可能会出现某会话的两个属性分别满足两个不同的映射规则,可以设定各个属性的优先权dbms_resource_manager.set_mapping_priority(
oracle_user => 1,
client_os_user => 2);
活动会话池
限制并行程度
执行时间控制作业
空闲时间终止会话
撤销数据
调度作业存储在数据字典的一个表中,DBA_SCHEDULER_JOBS可查询此表。作业队列协调器后台进程CJQ0监视此表,根据需要启动作业队列进程Jnnn运行作业。如有任何定义的、活动的调度程序作业,总是自动启动CJQ0进程。参数 JOB_QUEUE_PROCESSES=0,调度程序无法运行,默认1000。
调度程序对象
作业由执行的动作和执行动作的时间组成
程序作业中执行的动作,多个作业可调用同一个程序
时间表作业中执行的时间,多个作业可调用同一个时间表
窗口指定时间打开,持续一段时间之后关闭。
作业类一个或多个作业集合,常与Resource Manager使用者组关联或用于控制日志记录级别
权限创建job的权限
作业链一组有依赖关系程序
实例一:作业的第一种形式,基于时间表的作业
begin
dbms_scheduler.create_job(
job_name=>'backup',
job_style=>
job_type=>'stored_procedure',plsql_block|stored_procedure|executable|chain
job_action=>'backup_procedure',
-- plsql_blockjob_action是单条SQL语句或PL/SQL块
stored_procedurejob_action是一个存储过程
executablejob_action 能够在操作系统命令运行
chainjob_action 是chain
start_date=>'',
repeat_interval=>'',
end_date=>
job_class=>与优化权有关,且集成调度程和Resource Manager
enable=>'',默认flase,须先启用后执行
auto_drop=>'',默认true,到期立即删除
comments=>'');
end;
实例二:作业的第二种形式,基于事件的作业
begin
dbms_scheduler.create_job(
job_name=>'backup',
job_style=>
job_type=>'stored_procedure',
job_action=>'backup_procedure',
start_date=>'',
event_condition
queue_spec
end_date=>
job_class=>与优化权有关,且集成调度程和Resource Manager
enable=>'',默认flase,须先启用后执行
auto_drop=>'',默认true,到期立即删除
comments=>'');
end;
实例三:作业的第三种形式,动作详细信息替换为程序,时间表详细信息替换为调度
创建程序
procedure create_program(
)
创建时间表
procedure create_schedule(
)
begin
dbms_scheduler.create_job(
job_name=>'backup',
program_name
schedule_name
job_class=>与优化权有关,且集成调度程和Resource Manager
enable=>'',默认flase,须先启用后执行
auto_drop=>'',默认true,到期立即删除
comments=>'');
end;
exec dbms_scheduler.disable(' 作业名 ')
exec dbms_scheduler.enable(' 作业名 ')
exec dbms_scheduler.drop(' 作业名 ')
作业链举例
创建一个链
exec dbms_scheduler.create_chain(chain_name=> 'mychain');
定义链步骤
exec dbms_scheduler.define_chain_step(chain_name=>'mychain',
step_name=>'step1',program_name=>'prg1');
exec dbms_scheduler.define_chain_step(chain_name=>'mychain',
step_name=>'step2',program_name=>'prg2');
exec dbms_scheduler.define_chain_step(chain_name=>'mychain',
step_name=>'step3',program_name=>'prg3');
定义执行步骤的规则
exec dbms_scheduler.define_chain_rule(chain_name=>'mychain',
rule_name=>'rule1',condition=>'step1 succeeded'
action=>'start step2');
exec dbms_scheduler.define_chain_rule(chain_name=>'mychain',
rule_name=>'rule2',condition=>'step1 faild'
action=>'start step3');
启用链
exec dbms_scheduler.enable('mychain')
创建作业(引用链)
exec dbms_scheduler.create_job(job_name='job1',
job_type=>'chain',
job_action=>'mychain'
......
关于窗口
作业可通过指定的时间或时间表启动。oracle推出一个维护窗口概念,窗口在特定时间打开,持续一段时间之后关闭。指定某个窗口中运行的作业可根据oracle的判断在该窗口的任何时刻启动。窗口本身可通过时间表重复打开。窗口结合Resource Manager....
考点:窗口和时间表共享名称空间,不能同名
相同优先权的多个重叠窗口,先打开的得取优先权
关于轻量级作业
创建和启动作业涉及数据字典,不可能短时间创建大量作业(几秒数百个),可能过创建轻量级作业,比标准作业简单,必须基于程序。不能Database control仅create job,auto_drop总为true,end_date默认为当前时间戳。
轻量级作业例子
exec dbms_scheduler.create_job(
job_name
program_name=>
job_style=>'lightweight'
enable=>true创建后立即运行
end_date=
repeat_innterval);
使用类、窗口与Resource Manager
考点:create_job创建作业时无法指派优先权,须在后面用API的set_attribute
job1在其类中优先权1,job2在其类中优先权5,job2的类位于拥有更高Resource Manager优先权的使用者组内,job2优先执行
oracle支持全球化,可在5个级别上设置。
数据库、实例、客户端环境、会话、语句全球化设置的各个级别的优先顺序
在服务器端实例>会话
在客户端语句>会话>客户端环境
oracle用户进程启动时,进程查看其所运行的环境获得全球化的默认设置。用户进程按环境变量nls_lang(完整规范语言、地区、字符集)显示消息和格式化数据,用户进程用nls_lang标准输入,服务器按数据库的全球化设置存储。服务器与客户端全球化设置之间的转换由Oracle Net(双任务层 two-task command layer)完成。
数据库级别nls_database_parameters
实例级别nls_instance_parameters 静态参数
客户端级别nls_lang
会话级别会话级别的规范优先于服务器端的数据库和实例级别的设置,重写用户的环境变量
v$nls_parameters
nls_session_parameters
alter session set nls_language='american'修改会话级别的语言
Locale Bulder 自定义全球化环境
1、字符集
数据库存储的数据必须被编码为字符集,软件产品可以用操作系统提供的字符集,或用自己的字符集。
oracle提供数据库字符集和National Character Set。
数据库字符集
默认用7位的ASCII或EBCDIC。
create database 数据库字符集US7ASCII National Character Set字符集AL16UTF16
DBCA 数据库字符集=操作系统字符集
也可用Unicode字符集作为实际的数据库字符集,支持UTF8 AL32UTF8(oracle推荐)
须将US7ASCII或EBCDIC作为数据库字符集的子集,因存储SQL与PL/SQL是用这两种字符编写
National Character Set
用于存储nvarchar2 nclob nchar数据类型列,仅支持AL16UTF16UTF8两种Unicode字符集
修改字符集(理论上可以,实际无人敢搞)
数据库字符集扫描程序 database character set scanner,csscan 扫描数据文件
语言与字符集文件扫描程序 language and character set file scanner,lcsscan仅适用纯文本
2、语言
语言支持:语言决定默认显示错误消息的语言、默认的日期语言、默认排序顺序
地区支持:地区决定默认日周编号、借贷符号、日期格式、数字分隔符、组分隔符、货币符号
排序:oracle默认用二进制排序
v$nls_valid_values显示可支持的语言、排序、地区
nls_language变量,设置显示错误消息的语言
nls_date_language变量,设置日期与月份格式
nls_sort变量,设置语言排序
nls_territory变量,设置地区
v$nls_valid_values查看支持的语言和地区
3、时区v$timezone_names
创建数据库时如未指定时区,则用主机操作系统时区
alter database set time_zone=
客户端默认用客户端操作系统时区
ora_stdz
会话级别改变时区 alter session set time_zone=
语句级别 timestamp with local time zone存储为数据库时区,显示时转换为客户端时区
timestamp with time zone存储是不用数据库时区,带时间标识符
用户设置的阈值存在AWR,MMON后台进程实时监视服务器,将当前状态和阈值比较,超出即报警
v$metricname200多个指标及阈值信息
execute dbms_server_alert.set_threshold(
)
警报种类
有状态警报
基于持久保存且可修复的条件,如表空间使用、挂起会话数量、执行完SQL语句需要的平均时间
默认显示在database console,和写入DBA_OUTSTANDING_ALERTS视图
DBA修改了问题或自然发展过程中消失,写入DBA_ALERT_HISTORY
无状态警报
基于事件,事件发生后又消失了,如查询因快照过旧而失败、形成死锁的事务
直接进入DBA_ALERT_HISTORY
警报通知
默认显示在database console 首页
查询DBA_OUTSTANDING_ALERTS、DBA_ALERT_HISTORY视图
database control中配置smtp或sms通知
考点:由MMON进程引发,Enterprise Manager仅是读取(接收)警报,也可通过第三方程序读取
11g 实例诊断信息,目录 DIAGNOSTIC_DEST,每个实例、ASM实例、RAC中的单个实例都有自己的ADR_BASE。
如指定DIAGNOSTIC_DEST ,ADR_BASE为指定位置
如未指定则ORACLE_BASE为ADR_BASE位置,
如未设oracle_base,则ADR_BASE为ORACLE_HOME/log
ADR_HOME/alertXML格式副本alertSID.log
ADR_HOME/trace
Alert.log
数据库启动,关闭时间
非默认初始化参数
LGWR正在写的日志序列号
日志的切换信息
所执行的ALTER 语句
创建的表空间和还原段
后台进程追踪文件:记录所有后台进程遇到的错误
用户进程追踪文件:用户进程创建,跟踪用户SQL语句的统计信息,包含用户的错误信息
ADR_HOME/cdump核心转储,特定于平台的一次性二进制内存转储
与跟踪文件不同,路路文件包含诊断运行进程的问题的连续输出信息
ADR_HOME/incident/incdir_n事件转储
ADRCI
ADR 命令行工具。
查询ADR内容,创建脚本,将事件和问题信息打ZIP包发送给Oracle Support。显示所有问题和
数据库健康监视,11g新特性。检查数据库组件比如文件系统、内存、事务完整性、检查数据文件坏块,redo检查,验证数据字典完整性等方面。严重错误发生时,数据库会自动运行Health Monitor诊断问题,也可以手工运行,健康监视日志放入ADR中。
nomount运行DB Structure Integrity,检查控制文件完整性
mount运行DB Structure Integrity,检查控制文件、联机重做日志文件、数据文件头完整性
运行Redo Integrity Check,检查联机和归档日志文件完整性及是否受损
open扫描每个数据块是否受损检查,并检查数据字典和撤销段的完整性
BEGIN
DBMS_HM.RUN_CHECK('Dictionary Integrity Check', 'my_run');
END;
或
BEGIN
DBMS_HM.RUN_CHECK (
check_name => 'Transaction Integrity Check',
run_name => 'my_run',
input_params => 'TXN_ID=7.33.2');
END;
SQL>SELECT DBMS_HM.GET_RUN_REPORT('HM_RUN_1061') FROM DUAL;--相看HM报告
adrci> show hm_run-- ADRCI查看HM报告
Advisor Central -》Checkers-》Runs -》View Report-- OEM查看HM报告
V$HM_RUN
V$HM_FINDING
V$HM_RECOMMENDATION
查看问题和事件的详细信息
被动或主动运行Health Monitor
为服务请求生成附加诊断数据
运行顾问程序帮助解决问题或事件
打包所有必需的诊断和支持数据,以便用MetaLink服务提交给Oracle Support
跟踪服务请求,问题或事件解决后将其关闭
问题关键错误,一个或多个事件组成,每个问题有问题关键词(一个文本字符串,含错误代码)
事件出现的问题,如多个事件的问题关键字相匹配,可认为这些事件有相同的根源
事件发生时,数据执行以下动作:
在alert.log中记录
EM显示警报
电邮发送(可选)
收集跟踪文件和其他事件信息
为所有事件添加事件ID标记
创建并转储在ADR_HOME/incident/incdir_n
事件包一个或多个事件和问题的数据集合,以ZIP格式用为SR上载的到oracle support service
临时(Interim)补丁程序
为数据库精确版本级别修复一个具体问题,不必完全集成也不必回归测试
CPU(Critical Patch Update关键补丁更新)补丁程序,常包含安全补丁程序
特定发布版级别的累积补丁程序,包含所有附属补丁程序,应全面集成和回归测试
补丁程序集(Patch sets)
累积的产品修补集合,增加产品的发布版本级别 11.1.0.6à11.1.0.7
Patch Advisor,database console集成,需和oracle连通
Opatch补丁管理程序,命令或database console
Pach advisor需与oracle连接,定期执行检查作业
Hot Patching不停机
利用oradebug接口安装和启用
消耗部分内存
IPS:创建、添加、生成ZIP包