[Oracle10G_R2]02.可管理性特性
??? 由于具備自動(dòng)存儲(chǔ)管理命令行工具、直連 SGA 訪問、支持聯(lián)機(jī)分區(qū)重定義等特性,這個(gè)自我管理的數(shù)據(jù)庫(kù)變得更加強(qiáng)大。
?
??? 這一部分涉及:
?
??? ● ASM 命令行工具
??? ● 刪除空數(shù)據(jù)文件
??? ● 針對(duì)掛起/低速系統(tǒng)的直連 SGA 訪問
??? ● 聯(lián)機(jī)重新定義分區(qū)
??? ● 在內(nèi)存中檢查數(shù)據(jù)塊完整性,而非在磁盤上檢查
??? ● 聯(lián)機(jī)限制更改
??? ● 更快的啟動(dòng)
??? ● 在 Oracle Enterprise Manager 中管理多個(gè)對(duì)象
??? ● 自動(dòng)的 Segment Advisor
??? ● 基于事件的調(diào)度
??? ● 刪除空數(shù)據(jù)文件
??? ● 針對(duì)掛起/低速系統(tǒng)的直連 SGA 訪問
??? ● 聯(lián)機(jī)重新定義分區(qū)
??? ● 在內(nèi)存中檢查數(shù)據(jù)塊完整性,而非在磁盤上檢查
??? ● 聯(lián)機(jī)限制更改
??? ● 更快的啟動(dòng)
??? ● 在 Oracle Enterprise Manager 中管理多個(gè)對(duì)象
??? ● 自動(dòng)的 Segment Advisor
??? ● 基于事件的調(diào)度
?
ASM 命令行工具
?
???
Oracle 自動(dòng)存儲(chǔ)管理
(ASM;請(qǐng)參閱本系列的第 1 部分)是 Oracle 數(shù)據(jù)庫(kù) 10g 第 1 版中引入的專用文件系統(tǒng),為數(shù)據(jù)文件的管理提供了急需的支持。
?
??? ASM 通過 SQL 命令管理,必要時(shí)也可以通過 Oracle Enterprise Manager 界面管理。同樣,您也可以通過 SQL 接口或 GUI 看到它。大多數(shù) DBA 都能接受該方法,但對(duì)那些不熟悉 SQL 的系統(tǒng)管理員來說學(xué)習(xí) SQL 是件不大情愿的事。而作為一名 DBA,您可能不大愿意授予非 DBA Oracle Enterprise Manager 的訪問權(quán)限。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,一個(gè)新的 ASM 命令行工具消除了這個(gè)隔閡。此接口稱為 asmcmd,通過它您可以對(duì) ASM 磁盤組中存儲(chǔ)的數(shù)據(jù)文件(類似于文件系統(tǒng)和相應(yīng)的文件)執(zhí)行大量操作。該工具基于 Perl,因此后者應(yīng)位于相應(yīng)的路徑中。如果未正確設(shè)置 Perl 的路徑,則可能需要?jiǎng)?chuàng)建一個(gè)指向 Perl 所在目錄的軟鏈接,或只需修改文件 asmcmd 以反映 Perl 可執(zhí)行文件的正確路徑。
?
??? 切記將 ORACLE_SID 設(shè)置為 ASM 實(shí)例(通常為 +ASM),而不是在服務(wù)器上運(yùn)行的實(shí)際數(shù)據(jù)庫(kù)實(shí)例。通過鍵入以下指令調(diào)用該命令
?
asmcmd -p
?
??? 使用 -p 選項(xiàng)可以在提示中顯示當(dāng)前路徑。
?
??? 現(xiàn)在,嘗試一些非常簡(jiǎn)單的命令。調(diào)用命令行提示 (ASMCMD >) 后,鍵入 ls 查看已掛載的所有磁盤組。
?
ASMCMD [+] > ls
DGROUP1/
DGROUP10/
DGROUP2/
DGROUP3/
DGROUP4/
DGROUP5/
DGROUP6/
DGROUP7/
DGROUP8/
DGROUP9/
DGROUP1/
DGROUP10/
DGROUP2/
DGROUP3/
DGROUP4/
DGROUP5/
DGROUP6/
DGROUP7/
DGROUP8/
DGROUP9/
?
??? 可以在此處看到在 ASM 實(shí)例中創(chuàng)建和掛載的所有磁盤組(DGROUP1 至 DGROUP10)。
?
??? 現(xiàn)在,考察磁盤組 DGROUP1。可以使用 cd 命令像更改目錄那樣更改此磁盤組。
?
ASMCMD [+] > cd dgroup1
?
??? 甚至可以像在類 UNIX 或 Windows 這樣的操作系統(tǒng)中那樣,通過鍵入 cd .. 轉(zhuǎn)到父目錄。現(xiàn)在,確認(rèn)在該磁盤組中創(chuàng)建了哪些文件。
?
ASMCMD [+dgroup1] > ls
ORCL/
ORCL/
?
??? 好了,該磁盤組的下面增加了一個(gè)目錄 ORCL。從它后面的正斜線 (/) 即可看出它是一個(gè)目錄。使用 cd 命令進(jìn)入該目錄,然后執(zhí)行命令 ls 顯示內(nèi)容。
?
ASMCMD [+dgroup1] > cd orcl
ASMCMD [+dgroup1/orcl] > ls
CONTROLFILE/
PARAMETERFILE/
control01.ctl => +DGROUP1/ORCL/CONTROLFILE/Current.256.551928759
spfileorcl.ora => +DGROUP1/ORCL/PARAMETERFILE/spfile.257.551932189
ASMCMD [+dgroup1/orcl] >
ASMCMD [+dgroup1/orcl] > ls
CONTROLFILE/
PARAMETERFILE/
control01.ctl => +DGROUP1/ORCL/CONTROLFILE/Current.256.551928759
spfileorcl.ora => +DGROUP1/ORCL/PARAMETERFILE/spfile.257.551932189
ASMCMD [+dgroup1/orcl] >
?
??? 除了 cd 和 ls 命令外,還可以使用其他類 UNIX 的命令,如 rm(用于刪除目錄或文件)、mkdir(用于創(chuàng)建目錄)和 find(用于查找文件和目錄)。
?
??? 以下是一些其他命令:
?
???
lsdg(list diskgroup 的縮寫)—— 要查看該 ASM 實(shí)例掛載的磁盤,使用 lsdg 命令。
?
ASMCMD [+] > lsdg
State??? Type??? Rebal? Unbal? Sector? Block?????? AU? Total_MB? Free_MB? Req_mir_free_MB? Usable_file_MB? Offline_disks? Name
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 40??????????????? 0????????????? 40????????????? 0? DGROUP1/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 33??????????????? 0????????????? 33????????????? 0? DGROUP10/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 41??????????????? 0????????????? 41????????????? 0? DGROUP2/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 787??????????????? 0???????????? 787????????????? 0? DGROUP3/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 537??????????????? 0???????????? 537????????????? 0? DGROUP4/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 928??????????????? 0???????????? 928????????????? 0? DGROUP5/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 742??????????????? 0???????????? 742????????????? 0? DGROUP6/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 943??????????????? 0???????????? 943????????????? 0? DGROUP7/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 950??????????????? 0???????????? 950????????????? 0? DGROUP8/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 33??????????????? 0????????????? 33????????????? 0? DGROUP9/
State??? Type??? Rebal? Unbal? Sector? Block?????? AU? Total_MB? Free_MB? Req_mir_free_MB? Usable_file_MB? Offline_disks? Name
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 40??????????????? 0????????????? 40????????????? 0? DGROUP1/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 33??????????????? 0????????????? 33????????????? 0? DGROUP10/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 41??????????????? 0????????????? 41????????????? 0? DGROUP2/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 787??????????????? 0???????????? 787????????????? 0? DGROUP3/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 537??????????????? 0???????????? 537????????????? 0? DGROUP4/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 928??????????????? 0???????????? 928????????????? 0? DGROUP5/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 742??????????????? 0???????????? 742????????????? 0? DGROUP6/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 943??????????????? 0???????????? 943????????????? 0? DGROUP7/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576????? 1000????? 950??????????????? 0???????????? 950????????????? 0? DGROUP8/
MOUNTED? EXTERN? N????? N???????? 512?? 4096? 1048576?????? 100?????? 33??????????????? 0????????????? 33????????????? 0? DGROUP9/
?
??? 除了顯示磁盤名稱以外,lsdg 還顯示了其他相關(guān)信息,如已分配的空間大小、可用空間大小和脫機(jī)磁盤。該信息簡(jiǎn)化了問題的診斷。
?
???
du(disk utilization 的縮寫)—— 由于您已經(jīng)在 ASM 磁盤上填充了數(shù)據(jù),因此可能要查明磁盤組內(nèi)部占用的空間大小。為此,可以像在 UNIX、Linux 或 Windows 中那樣使用 du 命令。要了解目錄內(nèi)部已使用的空間大小,只需使用
?
ASMCMD [+] > du /dgroup1
Used_MB????? Mirror_used_MB
????? 9?????????????????? 9
Used_MB????? Mirror_used_MB
????? 9?????????????????? 9
?
??? 以上命令顯示已經(jīng)使用了 9MB。由于您已經(jīng)使用了外部鏡像,因此所使用的磁盤空間總大小仍為 9MB (Mirror_used_MB)。如果使用了 ASM 磁盤的標(biāo)準(zhǔn)冗余參數(shù),則該數(shù)字將有所不同。
?
???
help —— 沒有幫助那還叫什么工具!您不必記住每一個(gè)命令。只需鍵入 help 即可顯示一個(gè)命令列表。然后,可以鍵入 help <command> 查看特定命令的信息。例如,在此您要查看 mkalias 命令。
?
ASMCMD [+] > help mkalias
mkalias <system_alias> <user_alias>
?
Create the specified user_alias for the system_alias.The user_alias
must reside in the same diskgroup as the system_alias, and only one
user_alias is permitted per file.The SQLPLUS equivalent is "alter
diskgroup <dg_name> add alias <user_alias> for <system_alias>".
mkalias <system_alias> <user_alias>
?
Create the specified user_alias for the system_alias.The user_alias
must reside in the same diskgroup as the system_alias, and only one
user_alias is permitted per file.The SQLPLUS equivalent is "alter
diskgroup <dg_name> add alias <user_alias> for <system_alias>".
?
??? 您可以看到,這個(gè)豐富的命令集使 ASM 成為一個(gè)可管理性很高的文件系統(tǒng),您甚至不需要研究 SQL 接口或 Oracle Enterprise Manager。還可以將這些命令輕松置于 shell 腳本中,從而為更多用戶所接受。
刪除空數(shù)據(jù)文件
?
??? 假設(shè)您剛剛向錯(cuò)誤目錄或表空間中添加了一個(gè)數(shù)據(jù)文件 —— 一個(gè)很常見的錯(cuò)誤。并不會(huì)丟失一切;由于該數(shù)據(jù)文件不包含任何數(shù)據(jù),因此您可以輕松地刪除它,是這樣嗎?
?
??? 遺憾的是,您無法刪除它。在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版之前,刪除數(shù)據(jù)文件的唯一有效方法就是刪除整個(gè)表空間,然后在沒有該特定文件的情況下重新構(gòu)建它。如果表空間包含數(shù)據(jù),則必須通過既費(fèi)時(shí)又費(fèi)力的過程將數(shù)據(jù)存儲(chǔ)到單獨(dú)的位置并恢復(fù)它。除了不方便以外,該過程還使表空間不可用。
?
??? 幸運(yùn)地是,在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,該過程已得到簡(jiǎn)化:您可以只刪除數(shù)據(jù)文件。例如,以下命令將從表空間和服務(wù)器中刪除指定的數(shù)據(jù)文件。
?
alter tablespace users drop datafile '/tmp/users01.dbf'
/
/
?
??? 但存在一些限制:1數(shù)據(jù)文件必須為空才能刪除。無法刪除表空間中的最后一個(gè)數(shù)據(jù)文件;必須刪除表空間本身。同時(shí),表空間必須處于聯(lián)機(jī)和讀寫狀態(tài)。
針對(duì)掛起/低速系統(tǒng)的直連 SGA 訪問
?
??? 當(dāng)用戶經(jīng)常抱怨數(shù)據(jù)庫(kù)運(yùn)行速度慢并經(jīng)常超時(shí)時(shí),大多數(shù) DBA 最先想到的就是以 SYSDBA 連接到數(shù)據(jù)庫(kù)并檢查等待事件。但如果實(shí)例掛起,甚至您無法登錄時(shí)又會(huì)怎樣?這種情況下,即使最強(qiáng)大、最優(yōu)秀的故障診斷查詢也無濟(jì)于事。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,Oracle Enterprise Manager Grid Control 可以在苛刻環(huán)境下根據(jù)您的請(qǐng)求直接連接到 SGA,從而從進(jìn)程狀態(tài)中直接收集數(shù)據(jù)。這個(gè)所謂的內(nèi)存訪問模式增強(qiáng)了您有效使用 Oracle Enterprise Manager 的能力,即使在實(shí)例經(jīng)歷嚴(yán)重問題的情況下也是如此。而最重要的是,這是在 SQL 訪問基本無法實(shí)現(xiàn)的情況下自動(dòng)執(zhí)行的。
?
??? 以下是它的工作方式:在 Oracle Enterprise Manager 用戶界面中,選擇 Performance 選項(xiàng)卡,并向下滾動(dòng)到該頁(yè)面底部標(biāo)記為“Related Links”的部分,這將顯示一個(gè)如下所示的屏幕。
?
?
??? 注意名為“Monitor in Memory Access Mode”的鏈接。單擊該鏈接將顯示一個(gè)如下所示的屏幕。注意“View Mode”下拉菜單,其中的“Memory Access”選項(xiàng)處于選中狀態(tài)。
?
?
??? 可以使用“View Mode”下拉菜單控制 Oracle Enterprise Manager 獲取數(shù)據(jù)的方式。在本示例中,它顯示從內(nèi)存獲取的數(shù)據(jù)(“Memory Access”)。還可以在此處選擇“SQL Access”以從性能視圖中進(jìn)行選擇。
?
??? 請(qǐng)注意,內(nèi)存訪問模式并不是 SQL 訪問的替代模式;它只適合在 SQL 訪問不可用的緊急情況下使用。此外,內(nèi)存訪問模式只提供對(duì)分析掛起會(huì)話有幫助的數(shù)據(jù)子集。(有關(guān)該主題的詳細(xì)信息請(qǐng)見下個(gè)部分 — “性能”特性。)
聯(lián)機(jī)重新定義分區(qū)
?
??? 當(dāng)大多數(shù) DBA 沒有停機(jī)時(shí)間來更改表時(shí)(如對(duì)其進(jìn)行分區(qū)),他們將使用聯(lián)機(jī)重新定義工具 DBMS_REDEFINITION。使用該工具,您可以更改對(duì)象定義,同時(shí)使它們保持可訪問狀態(tài)。
?
??? 但 DBMS_REDEFINITION 有一個(gè)限制,這使它在某些情況下無法提供幫助。例如,您可能要將表分區(qū)移動(dòng)到不同的表空間。為此,必須移動(dòng)整個(gè)表,即使已將其分區(qū)。如果該表很大,此方法將產(chǎn)生大量的重做和撤消操作,且無法利用現(xiàn)有分區(qū)。但如果一次可以移動(dòng)一個(gè)分區(qū),則可以顯著減少時(shí)間、空間和重做/撤消要求。
?
??? 使用 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版,您可以完全實(shí)現(xiàn)該目標(biāo):可以通過 Oracle Enterprise Manager 或命令行重新定義一個(gè)表分區(qū)。
?
??? 我們來看一個(gè)使用命令行的示例。在這里,您有一個(gè)名為 ACCOUNTS 的表,它包含 11 個(gè)分區(qū),所有這些分區(qū)都位于同一表空間 USERS 中。您要將它們移到一個(gè)專門為該表創(chuàng)建的新表空間 ACCDATA 中。您將以一次移動(dòng)一個(gè)分區(qū)的方式移動(dòng)該表。
?
??? 首先,創(chuàng)建一個(gè)中間表,其結(jié)構(gòu)與表 ACCOUNTS 相同但現(xiàn)在將數(shù)據(jù)置于 ACCDATA 表空間上。
?
SQL> create table accounts_int
2? tablespace accdata
3? as
4? select * from accounts
5? where 1=2
6? /
2? tablespace accdata
3? as
4? select * from accounts
5? where 1=2
6? /
?
??? 注意分區(qū)現(xiàn)在所在的位置:
?
SQL> select partition_name, tablespace_name, num_rows
2? from user_tab_partitions
3? /
2? from user_tab_partitions
3? /
?
PARTITION_NAME???????????????? TABLESPACE_NAME????????????????? NUM_ROWS
------------------------------ ------------------------------ ----------
P1???????????????????????????? USERS??????????????????????????????? 1014
P2???????????????????????????? USERS??????????????????????????????? 1042
P3???????????????????????????? USERS??????????????????????????????? 1002
P4???????????????????????????? USERS???????????????????????????????? 964
P5???????????????????????????? USERS???????????????????????????????? 990
P6???????????????????????????? USERS??????????????????????????????? 1042
P7???????????????????????????? USERS???????????????????????????????? 915
P8???????????????????????????? USERS???????????????????????????????? 983
P9???????????????????????????? USERS??????????????????????????????? 1047
P10??????????????????????????? USERS??????????????????????????????? 1001
PMAX?????????????????????????? USERS?????????????????????????????????? 0
------------------------------ ------------------------------ ----------
P1???????????????????????????? USERS??????????????????????????????? 1014
P2???????????????????????????? USERS??????????????????????????????? 1042
P3???????????????????????????? USERS??????????????????????????????? 1002
P4???????????????????????????? USERS???????????????????????????????? 964
P5???????????????????????????? USERS???????????????????????????????? 990
P6???????????????????????????? USERS??????????????????????????????? 1042
P7???????????????????????????? USERS???????????????????????????????? 915
P8???????????????????????????? USERS???????????????????????????????? 983
P9???????????????????????????? USERS??????????????????????????????? 1047
P10??????????????????????????? USERS??????????????????????????????? 1001
PMAX?????????????????????????? USERS?????????????????????????????????? 0
?
11 rows selected.
?
??? 所有分區(qū)均位于 USERS 表空間中。現(xiàn)在,將第一個(gè)分區(qū) P1 移到表空間 ACCDATA 中。
?
SQL> begin
2???? dbms_redefinition.start_redef_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
2???? dbms_redefinition.start_redef_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
?
PL/SQL procedure successfully completed.
?
??? 注意第 6 行,其中的 part_name 參數(shù)指定要重新組織的分區(qū)。如果省略該參數(shù),則將同時(shí)重新定義所有分區(qū)。
?
??? 現(xiàn)在,將中間表與原始表同步。(僅當(dāng)要對(duì)表 ACCOUNTS 進(jìn)行更新時(shí)才需要執(zhí)行該操作。)
?
SQL> begin
2???? dbms_redefinition.sync_interim_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
2???? dbms_redefinition.sync_interim_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
?
PL/SQL procedure successfully completed.
?
??? 最后,完成重新定義過程。
?
SQL> begin
2???? dbms_redefinition.finish_redef_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
2???? dbms_redefinition.finish_redef_table (
3??????? uname => 'ARUP',
4??????? orig_table => 'ACCOUNTS',
5??????? int_table? => 'ACCOUNTS_INT',
6??????? part_name? => 'P1'
7???? );
8? end;
9? /
?
PL/SQL procedure successfully completed.
?
??? 確認(rèn)分區(qū) P1 確已移到表空間 ACCDATA 中。
?
SQL> select partition_name, tablespace_name, num_rows
2? from user_tab_partitions
3? /
2? from user_tab_partitions
3? /
?
PARTITION_NAME???????????????? TABLESPACE_NAME????????????????? NUM_ROWS
------------------------------ ------------------------------ ----------
P1???????????????????????????? ACCDATA????????????????????????????? 1014
P2???????????????????????????? USERS??????????????????????????????? 1042
P3???????????????????????????? USERS??????????????????????????????? 1002
P4???????????????????????????? USERS???????????????????????????????? 964
P5???????????????????????????? USERS???????????????????????????????? 990
P6???????????????????????????? USERS??????????????????????????????? 1042
P7???????????????????????????? USERS???????????????????????????????? 915
P8???????????????????????????? USERS???????????????????????????????? 983
P9???????????????????????????? USERS??????????????????????????????? 1047
P10??????????????????????????? USERS??????????????????????????????? 1001
PMAX?????????????????????????? USERS?????????????????????????????????? 0
------------------------------ ------------------------------ ----------
P1???????????????????????????? ACCDATA????????????????????????????? 1014
P2???????????????????????????? USERS??????????????????????????????? 1042
P3???????????????????????????? USERS??????????????????????????????? 1002
P4???????????????????????????? USERS???????????????????????????????? 964
P5???????????????????????????? USERS???????????????????????????????? 990
P6???????????????????????????? USERS??????????????????????????????? 1042
P7???????????????????????????? USERS???????????????????????????????? 915
P8???????????????????????????? USERS???????????????????????????????? 983
P9???????????????????????????? USERS??????????????????????????????? 1047
P10??????????????????????????? USERS??????????????????????????????? 1001
PMAX?????????????????????????? USERS?????????????????????????????????? 0
?
11 rows selected.
?
??? 行了!對(duì)其他分區(qū)重復(fù)該過程。
?
??? 相比而言,如果您重新組織了整個(gè)表,則將 (a) 需要一個(gè)大小與整個(gè)表相等的空間,(b) 為整個(gè)表生成重做(必須存在),否則將產(chǎn)生錯(cuò)誤。但通過對(duì)單個(gè)分區(qū)執(zhí)行此過程,將減少單個(gè)分區(qū)的空間要求,并減少只為該分區(qū)生成的重做。
?
??? 使用這個(gè)強(qiáng)大而有用的特性,您可以聯(lián)機(jī)重新組織非常大的對(duì)象(就像大多數(shù)已分區(qū)對(duì)象一樣)。此外,還應(yīng)注意如何將統(tǒng)計(jì)信息復(fù)制到已重新定義的表上(如以上查詢中的 NUM_RWS 值所示);您不必為新建的表或分區(qū)重新生成統(tǒng)計(jì)信息。
在內(nèi)存中檢查數(shù)據(jù)塊完整性,而非在磁盤上檢查
?
??? 活動(dòng)的數(shù)據(jù)庫(kù)實(shí)例將大量數(shù)據(jù)從用戶會(huì)話移動(dòng)到緩沖區(qū)緩存,從緩存移動(dòng)到磁盤,反之亦然。這些移動(dòng)可能使數(shù)據(jù)塊容易遭到損壞。
?
??? Oracle 通過在將數(shù)據(jù)塊寫入磁盤之前計(jì)算數(shù)據(jù)值的校驗(yàn)和確保數(shù)據(jù)塊的完整性。同時(shí)將該檢驗(yàn)和值寫入磁盤。當(dāng)從磁盤中讀取該塊時(shí),讀取過程將再次計(jì)算校驗(yàn)和,然后與存儲(chǔ)的值進(jìn)行對(duì)比。如果值已損壞,校驗(yàn)和將不同,從而表明數(shù)據(jù)已經(jīng)損壞。
?
??? 由于大多數(shù)操作發(fā)生在內(nèi)存中,因此在源本身(即緩沖區(qū)緩存)中執(zhí)行該檢查應(yīng)謹(jǐn)慎。在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,還可以通過將初始化參數(shù) DB_BLOCK_CHECKSUM 設(shè)置為 FULL 來執(zhí)行內(nèi)存檢查。
?
??? 在進(jìn)行此設(shè)置后,Oracle 將在進(jìn)行任何更改之前計(jì)算校驗(yàn)和并將該校驗(yàn)和與存儲(chǔ)的值進(jìn)行比較。該方法可以發(fā)現(xiàn)內(nèi)存本身中的任何數(shù)據(jù)損壞,并在數(shù)據(jù)損壞時(shí)報(bào)告錯(cuò)誤,這對(duì)防止磁盤級(jí)別的數(shù)據(jù)損壞以及防止將該損壞傳播到備用數(shù)據(jù)庫(kù)很幫助。
?
??? 請(qǐng)注意,默認(rèn)情況下,該參數(shù)設(shè)置為 FALSE,這與早期版本不同,那時(shí)該參數(shù)設(shè)置為 TRUE。
聯(lián)機(jī)限制更改
?
??? 當(dāng)需要更改在創(chuàng)建數(shù)據(jù)庫(kù)期間定義的參數(shù)(MAXDATAFILES、MAXLOGFILES 等)時(shí),您有哪些選擇?在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版之前,唯一的選擇就是遵循以下步驟:
?
??? 1、備份要跟蹤的控制文件。
??? 2、在跟蹤文件中修改要更改的參數(shù)。
??? 3、關(guān)閉數(shù)據(jù)庫(kù)。
??? 4、開始掛載。
??? 5、重新創(chuàng)建控制文件。
??? 6、在RESETLOGS模式下打開數(shù)據(jù)庫(kù)。
??? 2、在跟蹤文件中修改要更改的參數(shù)。
??? 3、關(guān)閉數(shù)據(jù)庫(kù)。
??? 4、開始掛載。
??? 5、重新創(chuàng)建控制文件。
??? 6、在RESETLOGS模式下打開數(shù)據(jù)庫(kù)。
?
??? 不用說,該方法降低了可用性。此外,由于 RMAN 將有關(guān)備份的元數(shù)據(jù)保存在控制文件和目錄中,因此該信息將在此過程中丟失。由于控制文件是在 RESETLOGS 模式下創(chuàng)建的,因此某些備份信息也將丟失。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,您無需重新創(chuàng)建控制文件便可更改這些參數(shù)。這樣,您將不會(huì)丟失其中存儲(chǔ)的 RMAN 信息。
更快的啟動(dòng)
?
??? 2GB 內(nèi)存即被視為夠大的年代已像恐龍一樣成為了歷史。現(xiàn)在,100GB 的大型緩沖區(qū)緩存并不鮮見。實(shí)例啟動(dòng)時(shí),初始化這樣大小的緩沖區(qū)緩存可能需要數(shù)分鐘甚至數(shù)小時(shí)。
?
??? 如果您深入研究這種情況將會(huì)發(fā)現(xiàn),在數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)時(shí)無需啟動(dòng)整個(gè)緩沖區(qū)緩存。當(dāng)實(shí)例啟動(dòng)時(shí),緩沖區(qū)緩存是空的;隨著用戶從表中選擇數(shù)據(jù),該緩沖區(qū)緩存將逐漸填滿。因此,在實(shí)例啟動(dòng)時(shí)無需初始化整個(gè)緩沖區(qū)緩存。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,此行為在啟動(dòng)邏輯中受到控制。當(dāng)啟動(dòng)實(shí)例時(shí),只初始化 10% 的緩沖區(qū)緩存;剩余緩沖區(qū)緩存在檢查點(diǎn)進(jìn)程打開數(shù)據(jù)庫(kù)之后才被初始化。這個(gè)新方法顯著減少了實(shí)例啟動(dòng)的時(shí)間。
?
??? 但請(qǐng)注意,在初始化整個(gè)緩沖區(qū)之前,無法使用緩沖區(qū)緩存大小自動(dòng)調(diào)整功能。
在 Oracle Enterprise Manager 中管理多個(gè)對(duì)象
?
??? 如果某個(gè)模式中的多個(gè)對(duì)象均無效,您通常怎么辦?您很有可能創(chuàng)建一個(gè) SQL 腳本來動(dòng)態(tài)生成另一個(gè)編譯這些無效對(duì)象的腳本。至少,在缺少第三方工具的情況下,這個(gè)方法還不錯(cuò)。
?
??? 但如果可以為此使用 Oracle Enterprise Manager Grid Control 豈不是更好?不是只選擇一個(gè)無效對(duì)象并單擊編譯,而是同時(shí)選擇多個(gè)無效對(duì)象并通過一次單擊操作編譯它們?
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,您確實(shí)可以這么做。如下所示,您所要做的就是選中對(duì)象旁邊的復(fù)選框。然后,就可以從“Actions”旁邊的下拉列表中選擇“Compile”來同時(shí)編譯所有對(duì)象。
?
?
??? 除了編譯以外,您還可以執(zhí)行大量其他操作,如創(chuàng)建 DDL 或刪除對(duì)象。
XML 格式的審計(jì)跟蹤
?
??? 如果您長(zhǎng)期以來一直在使用 Oracle 中內(nèi)置的審計(jì)工具則可能會(huì)注意到,一個(gè)非常有用的特性就是能夠?qū)徲?jì)跟蹤寫入一個(gè)文件系統(tǒng)中。將條目寫入文件系統(tǒng)而非數(shù)據(jù)庫(kù)本身中可以建立額外級(jí)別的安全性。
?
??? 您所要做的就是設(shè)置兩個(gè)初始化參數(shù):
?
audit_file_dest = '/auditfs'
audit_trail = xml
audit_trail = xml
?
??? 并重新啟動(dòng)該實(shí)例。但這兩個(gè)參數(shù)不是動(dòng)態(tài)的;一旦設(shè)置,將把審計(jì)跟蹤寫入目錄 /auditfs 中。參數(shù) audit_file_dest 是可選的;默認(rèn)為 $ORACLE_HOME/rdbms/audit 目錄。這些審計(jì)跟蹤文件將為擴(kuò)展名為 .xml 的 XML 文件。
?
??? 以下是一個(gè) XML 格式的審計(jì)跟蹤示例:
?
- <Audit xmlns="xmlns:xsi="xsi:schemaLocation="<Version>10.2</Version>
- <AuditRecord>
<Audit_Type>8</Audit_Type>
<EntryId>1</EntryId>
<Extended_Timestamp>2005-03-05T20:52:51.012045</Extended_Timestamp>
<DB_User>/</DB_User>
<OS_User>oracle</OS_User>
<Userhost>oradba</Userhost>
<OS_Process>18067</OS_Process>
<Terminal>pts/0</Terminal>
<Instance_Number>0</Instance_Number>
<Returncode>0</Returncode>
<OS_Privilege>SYSDBA</OS_Privilege>
<Sql_Text>CONNECT</Sql_Text>
</AuditRecord>
</Audit>
?
- <Audit xmlns="xmlns:xsi="xsi:schemaLocation="<Version>10.2</Version>
- <AuditRecord>
<Audit_Type>8</Audit_Type>
<EntryId>1</EntryId>
<Extended_Timestamp>2005-03-05T20:52:51.012045</Extended_Timestamp>
<DB_User>/</DB_User>
<OS_User>oracle</OS_User>
<Userhost>oradba</Userhost>
<OS_Process>18067</OS_Process>
<Terminal>pts/0</Terminal>
<Instance_Number>0</Instance_Number>
<Returncode>0</Returncode>
<OS_Privilege>SYSDBA</OS_Privilege>
<Sql_Text>CONNECT</Sql_Text>
</AuditRecord>
</Audit>
?
??? 這些跟蹤文件可被 XML 分析器輕松分析,從中提取有用的信息。您甚至可以將它們作為 XML 類型加載到數(shù)據(jù)庫(kù)中,然后使用 XML 查詢(詳見本系列第 1 部分中的介紹)在 SQL 內(nèi)部查詢它們。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,可以將此 XML 文件與 SQL 查詢相結(jié)合,從中進(jìn)行選擇,就好像它是來自一個(gè) SQL 源似的。還有一個(gè)預(yù)定義的動(dòng)態(tài)視圖 V$XML_AUDIT_TRAIL,用于從固定表 X$XML_AUDIT_TRAIL 中進(jìn)行選擇。此動(dòng)態(tài)視圖在結(jié)構(gòu)方面類似于常規(guī)審計(jì)跟蹤視圖 DBA_AUDIT_TRAIL。
?
??? 對(duì)于 DBA 而言,使用 XML 格式的審計(jì)跟蹤就可以通過第三方的 XML 分析器和編輯器操作文件,并可以通過接受 XML 作為輸入的工具發(fā)布報(bào)表。您不再需要編寫自己的分析器來解釋這些審計(jì)跟蹤文件。
自動(dòng)的 Segment Advisor
?
??? 您如何知道哪些段在最高使用標(biāo)記下具有大量可用空間,并能從重新組織中受益?
?
??? 可以使用 Oracle 數(shù)據(jù)庫(kù) 10g 中提供的 Oracle Enterprise Manager 界面指定特定的表空間來發(fā)現(xiàn)可能的符合要求的段,但如果您的數(shù)據(jù)庫(kù)有幾百個(gè)表空間,則不可能每天執(zhí)行該操作。即使您能做,但也不是每個(gè)表空間都有需要重新組織的段的。因此,如果有一個(gè)自動(dòng)工具可以提前掃描這些段并報(bào)告需要重新組織的段豈不很好?
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,所附帶的程序包 DBMS_SPACE 提供了該功能。內(nèi)置函數(shù) ASA_RECOMMENDATIONS 顯示了段;由于這是一個(gè)管道函數(shù),因此必須按如下所示使用它:
?
select * from table (dbms_space.asa_recommendations());
?
??? 由于列數(shù)較多,因此看清楚輸出不太容易。以下只是一個(gè)以垂直格式顯示的記錄。
?
TABLESPACE_NAME?????? :USERS
SEGMENT_OWNER???????? :ARUP
SEGMENT_NAME????????? :ACCOUNTS
SEGMENT_TYPE????????? :TABLE PARTITION
PARTITION_NAME??????? :P7
ALLOCATED_SPACE?????? : 0
USED_SPACE??????????? : 0
RECLAIMABLE_SPACE???? : 0
CHAIN_ROWEXCESS?????? : 17
RECOMMENDATIONS?????? :The object has chained rows that can be removed
by re-org.
C1??????????????????? :
C2??????????????????? :
C3??????????????????? :
TASK_ID?????????????? : 261
MESG_ID?????????????? : 0
SEGMENT_OWNER???????? :ARUP
SEGMENT_NAME????????? :ACCOUNTS
SEGMENT_TYPE????????? :TABLE PARTITION
PARTITION_NAME??????? :P7
ALLOCATED_SPACE?????? : 0
USED_SPACE??????????? : 0
RECLAIMABLE_SPACE???? : 0
CHAIN_ROWEXCESS?????? : 17
RECOMMENDATIONS?????? :The object has chained rows that can be removed
by re-org.
C1??????????????????? :
C2??????????????????? :
C3??????????????????? :
TASK_ID?????????????? : 261
MESG_ID?????????????? : 0
?
??? 此處您將看到,模式 ARUP 中表 ACCOUNTS 的分區(qū) P7 包含鏈接行。執(zhí)行重新組織將幫助加快該分區(qū)全表掃描的速度。
?
??? 此信息由在預(yù)定義的維護(hù)時(shí)間窗(周末下午 10 點(diǎn)至早上 6 點(diǎn)以及周六中午 12 點(diǎn)至周一中午 12 點(diǎn))內(nèi)運(yùn)行的自動(dòng)調(diào)度作業(yè)收集;您可以使用 Oracle Enterprise Manager 更改這些時(shí)間窗。在此時(shí)間內(nèi),該作業(yè)將對(duì)段進(jìn)行掃描以獲取符合要求的段。如果掃描無法及時(shí)完成,該作業(yè)將暫停并在第二天的時(shí)間窗繼續(xù)掃描。
?
??? 該作業(yè)存儲(chǔ)有關(guān)在名為 wri$_segadv_objlist 的表中檢查的段和表空間的信息。可以查看有關(guān)在視圖 DBA_AUTO_SEGADV_CTL 中檢查的段的信息。
基于事件的調(diào)度
?
??? Oracle 數(shù)據(jù)庫(kù) 10g 第 1 版中引入的 Oracle Scheduler 是下一代作業(yè)調(diào)度系統(tǒng),它取代了 DBMS_JOB 附帶的程序包。與該程序包相比,此 Scheduler 工具有一些顯著的優(yōu)點(diǎn)(詳見此處最初的介紹)。
?
??? 在 Oracle Scheduler 的第一版中,作業(yè)基于時(shí)間并根據(jù)時(shí)間觸發(fā)。但如果要使觸發(fā)器基于事件該怎么辦?例如,當(dāng)帳戶的 Account Manager 更改時(shí),您可能希望一個(gè)批處理程序自動(dòng)執(zhí)行以重新計(jì)算收入并重新發(fā)布報(bào)表。
?
??? 可以在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版的 Scheduler 工具中實(shí)現(xiàn)此類基于事件的觸發(fā)。事件通過 Advanced Queueing (AQ)(其中有效載荷是一個(gè)對(duì)象類型)傳遞給 Scheduler。因此,您首先需要?jiǎng)?chuàng)建一個(gè) AQ(如 proc_queue),在這里將把任意這樣的事件排隊(duì)。然后,您必須基于此事件創(chuàng)建一個(gè)調(diào)度。
?
begin
dbms_scheduler.create_event_schedule (
schedule_name?? => 'accadmin.acc_mgr_change',
start_date????? => systimestamp,
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''',
queue_spec????? => 'proc_queue');
end;
dbms_scheduler.create_event_schedule (
schedule_name?? => 'accadmin.acc_mgr_change',
start_date????? => systimestamp,
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''',
queue_spec????? => 'proc_queue');
end;
?
??? 接著,您將創(chuàng)建一個(gè)作業(yè)以遵循此調(diào)度。您也可以直接調(diào)度一個(gè)作業(yè)而不用先創(chuàng)建一個(gè)調(diào)度。
?
begin
dbms_scheduler.create_job (
job_name??????? => acc_mgr_change,
program_name??? => acc_mgr_change_procs,
start_date????? => 'systimestamp,
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''',
queue_spec?????? => 'proc_queue'
enabled????????? => true);
end;
dbms_scheduler.create_job (
job_name??????? => acc_mgr_change,
program_name??? => acc_mgr_change_procs,
start_date????? => 'systimestamp,
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''',
queue_spec?????? => 'proc_queue'
enabled????????? => true);
end;
?
??? 默認(rèn)值是 UNLIMITED。
?
??? 如果事件(而不是特定時(shí)間)是觸發(fā)作業(yè)的決定因素,則基于事件的調(diào)度很有幫助。
?
?
?