使用SQL來分析資料庫引數(二)(r10筆記第82天)
拖延症的我終於接下來第二篇資料庫引數的分析。
資料庫的引數分析一直以來是調優中的重要一環,而感覺有時候卻感覺找不到一些方法,我分析了一下,還是蠻有意思。資料庫的引數分析基於下面的幾個環境。
10gR2(10.2.0.5.0)
11gR2(11.2.0.4.0)
12cR1(12.1.0.2.0)
大體來說資料庫的引數在Oracle中還有很大一部分沒有開放,而在很多部落格,技術分析中,總是會自然而然的分析到隱含引數,通過這些引數可以讓我們一窺Oracle對的執行機制。
那麼公開和未公開的比例有多大呢,保守的演算法,不到10%的比例。我們來上兩個圖。
第一個圖是資料庫所有的引數在10g,11g,12c中的變化情況,可以大體感覺到引數隨著版本是越來越多。
而開放的引數呢,就是我們通過v$parameter,show parameter能夠檢視到的,在10g,11g,12c中大體是這樣的一個演進圖。
這裡你可以很明顯看到一個拐點,在11g到12c的過程中,公開的引數相對在減少。
而怎麼分析這些引數呢,能不能挖掘出一些重要的資訊呢。
下面是引數情況的資料。在10g,11g,12c中大體是這樣的一個比例,GENERAL的代表可以通過v$parameter檢視到,為ALL的則代表是能夠檢視到的所有引數。
DB_VERSION PARAM_TYPE COUNT(*) -------------------- -------------------- ---------- 10.2.0.5.0 ALL 1618 10.2.0.5.0 GENERAL 259 11.2.0.4.0 ALL 2912 11.2.0.4.0 GENERAL 351 12.1.0.2.0 ALL 3975 12.1.0.2.0 GENERAL 380
我們來簡單分析一下。
我丟擲了下面的幾個問題,如果沒有對比資料,這些很難回答,而又了資料,這些就可以輕鬆應答。
哪些引數是11g新增的? 哪些是12c新增的? 哪些11g的隱含引數,在12c正式引入? 哪些是11g的隱含引數,在12c中被廢棄? 哪些是10g的隱含引數,在11g被廢棄? 哪些是10g的隱含引數,在11g被正式引入? 哪些是10g預設的引數,在11g有所變化? 哪些是11g預設的引數,在12c中有所變化?
要得到這些資料方法也很直白,就是查詢檢視資料轉儲。具體方法參見:使用SQL來分析資料庫引數(一)(r10筆記第68天)
我們首先建立一個表來存放這些引數資訊。
create table db_param (db_version varchar2(30),param_type varchar2(10),name varchar2(80),value varchar(512),isdefault varchar2(9),isdeprecated varchar2(5),description varchar2(255));
然後使用下面的控制檔案匯入資料
load data
infile *
append into table db_param_all
fields terminated by '|'
(db_version,param_type,name,value,isdefault,isdeprecated,description)
如果匯入有個別的引數失敗,也不必失望,哪些很可能是歸檔路徑引數等。
資料得到了,我們來通過SQL進行簡單分析。
1)哪些引數是11g新增的?
select name from db_param where db_version='11.2.0.4.0' and param_type='GENERAL' and name not in (select name from db_param where db_version='10.2.0.5.0' and param_type='GENERAL');
這樣的引數有104個,我舉幾個例子。 log_archive_dest_31這個引數是歸檔相關的,在11g中進行了擴充套件,原本10g裡面是10個,11g裡面擴充套件了不少。
限於篇幅就不一一列舉了,我舉出幾個說明即可。
ddl_lock_timeout
deferred_segment_creation
sec_max_failed_login_attempts
diagnostic_dest
2)那些是12c新增的?
select name from db_param where db_version='12.1.0.2.0' and param_type='GENERAL' and name not in (select name from db_param where db_version='11.2.0.4.0' and param_type='GENERAL')
這個輸出結果只有31條,而縱觀引數的變化,主要就是在兩個方面,PDB和IMO,可見這兩個特性是12c裡深入骨髓了。
3)哪些11g的隱含引數,在12c正式引入?
select name from db_param where db_version='12.1.0.2.0' and param_type='GENERAL'
and '_'||name in
(select name from db_param where db_version='11.2.0.4.0' and param_type='ALL'
minus
select name from db_param where db_version='11.2.0.4.0' and param_type='GENERAL'
);
這些代表著那些隱含引數已經轉正了,不過數量確實很少。
active_instance_count
db_block_buffers
parallel_degree_level
resource_manager_plan
4)哪些是11g的隱含引數,在12c中被廢棄?
select name from db_param where db_version='12.1.0.2.0' and param_type='GENERAL' and ISDEPRECATED='TRUE'
and '_'||name in
(select name from db_param where db_version='11.2.0.4.0' and param_type='ALL'
minus
select name from db_param where db_version='11.2.0.4.0' and param_type='GENERAL'
)
經過一番查詢,還真找到一個。
active_instance_count
5)哪些是10g的隱含引數,在11g被正式引入?
select name from db_param where db_version='11.2.0.4.0' and param_type='GENERAL'
and '_'||name in
(select name from db_param where db_version='10.2.0.5.0' and param_type='ALL'
minus
select name from db_param where db_version='10.2.0.5.0' and param_type='GENERAL'
)涉及的引數只有
db_block_buffers
6)哪些是10g預設的引數,在11g有所變化?
這部分內容就尤其需要注意了,這些引數的設計在11g有了重大的變化
sga_max_size TRUE FALSE
audit_trail FALSE TRUE
db_keep_cache_size FALSE TRUE
db_recycle_cache_size FALSE TRUE
db_writer_processes TRUE FALSE
log_archive_dest_3 FALSE TRUE
log_archive_dest_state_2 FALSE TRUE
log_archive_dest_state_3 FALSE TRUE
log_archive_min_succeed_dest FALSE TRUE
fal_server FALSE TRUE
log_archive_trace FALSE TRUE
log_archive_config FALSE TRUE
log_archive_format FALSE TRUE
log_archive_max_processes FALSE TRUE
archive_lag_target FALSE TRUE
db_file_multiblock_read_count TRUE FALSE
standby_file_management FALSE TRUE
undo_management TRUE FALSE
undo_retention TRUE FALSE
utl_file_dir TRUE FALSE
job_queue_processes TRUE FALSE
background_dump_dest TRUE FALSE
user_dump_dest TRUE FALSE
core_dump_dest TRUE FALSE
7)哪些是11g預設的引數,在12c中有所變化?
select db_12c.name,db_11g.name,db_12c.isdefault,db_11g.isdefault--,db_12c.value,db_11g.value
from (select name,value,isdefault from db_param where db_version='12.1.0.2.0' and param_type='GENERAL' ) db_12c,
(select name,value,isdefault from db_param where db_version='11.2.0.4.0' and param_type='GENERAL' ) db_11g
where db_12c.name=db_11g.name and db_12c.isdefault!=db_11g.isdefault;輸出如下,大概有20個
standby_file_management TRUE FALSE
sec_case_sensitive_logon FALSE TRUE
local_listener TRUE FALSE
dg_broker_start TRUE FALSE
db_keep_cache_size TRUE FALSE
db_recycle_cache_size TRUE FALSE
log_archive_dest_1 TRUE FALSE
log_archive_dest_state_2 TRUE FALSE
log_archive_dest_state_3 TRUE FALSE
log_archive_min_succeed_dest TRUE FALSE
fal_server TRUE FALSE
log_archive_trace TRUE FALSE
log_archive_config TRUE FALSE
log_archive_format TRUE FALSE
log_archive_max_processes TRUE FALSE
archive_lag_target TRUE FALSE
我重點想說的是兩個引數standby_file_management 和sec_case_sensitive_logon,大小寫登入敏感在11g是一個新特性,但是到了12c裡面竟然引數被廢棄了。
由此可見資料庫中,我們只是一瞥其中的奧妙,裡面還有很多很多的未知問題等待著我們。