Oracle顧問程序體系
SQL語句執行步驟
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
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);
ADDM
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報告
……
DRA Data Recovery Advisor 數據恢復顧問
遇到錯誤時自動收集有關故障信息。主動運行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 Advisor
segment management auto,有關表空間存儲參數
Segment Advisor 根據對象內的空間碎片化程度,給出是否應該對對象執行新的在線收縮操作的建議。提供關於段的歷史增長趨勢的報告,能爲容量規劃提供有效的信息
Undo Advisor
undo_management auto|manual
幫助管理員在 flashback 和非 flashback 特性中調整撤消表空間大小時做出正確的判斷。它爲管理員適當地設置 UNDO_RETENTION 提供建議,以避免快照過於陳舊的問題
Redo Logfile Size Advisor
根據FAST_START_MTTR_TARGET設置和統計分析出最佳重做日誌文件大小
V$INSTANCE_RECOVERY VIEW.
MTTR Advisor
實例崩潰之後恢復時間,實例參數FAST_START_RECOVERY_TARGET控制MTTR
SQL Tuning Advisor & SQL Access Advisor
主要區別(考點): 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');
Database Replay
捕獲每條客戶端請求,記錄在獨立於平臺的二進制文件中
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;
http://blog.csdn.net/rlhua/article/details/16119193
ASM體系結構
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僅是讀取(接收)警報,也可通過第三方程序讀取
Automatic Diagnostic Repository ADR
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。顯示所有問題和
Health Monitor
數據庫健康監視,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
Support Workbench
查看問題和事件的詳細信息
被動或主動運行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包