Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          [Oracle10G_R2]02.可管理性特性

          ??? 由于具備自動存儲管理命令行工具、直連 SGA 訪問、支持聯(lián)機分區(qū)重定義等特性,這個自我管理的數據庫變得更加強大。
          ?
          ??? 這一部分涉及:
          ?
          ??? ● ASM 命令行工具
          ??? ● 刪除空數據文件
          ??? ● 針對掛起/低速系統(tǒng)的直連 SGA 訪問
          ??? ● 聯(lián)機重新定義分區(qū)
          ??? ● 在內存中檢查數據塊完整性,而非在磁盤上檢查
          ??? ● 聯(lián)機限制更改
          ??? ● 更快的啟動
          ??? ● 在 Oracle Enterprise Manager 中管理多個對象
          ??? ● 自動的 Segment Advisor
          ??? ● 基于事件的調度
          ?

          ASM 命令行工具
          ?
          ??? Oracle 自動存儲管 (ASM;請參閱本系列的 1 )是 Oracle 數據庫 10g 第 1 版中引入的專用文件系統(tǒng),為數據文件的管理提供了急需的支持。
          ?
          ??? ASM 通過 SQL 命令管理,必要時也可以通過 Oracle Enterprise Manager 界面管理。同樣,您也可以通過 SQL 接口或 GUI 看到它。大多數 DBA 都能接受該方法,但對那些不熟悉 SQL 的系統(tǒng)管理員來說學習 SQL 是件不大情愿的事。而作為一名 DBA,您可能不大愿意授予非 DBA Oracle Enterprise Manager 的訪問權限。
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,一個新的 ASM 命令行工具消除了這個隔閡。此接口稱為 asmcmd,通過它您可以對 ASM 磁盤組中存儲的數據文件(類似于文件系統(tǒng)和相應的文件)執(zhí)行大量操作。該工具基于 Perl,因此后者應位于相應的路徑中。如果未正確設置 Perl 的路徑,則可能需要創(chuàng)建一個指向 Perl 所在目錄的軟鏈接,或只需修改文件 asmcmd 以反映 Perl 可執(zhí)行文件的正確路徑。
          ?
          ??? 切記將 ORACLE_SID 設置為 ASM 實例(通常為 +ASM),而不是在服務器上運行的實際數據庫實例。通過鍵入以下指令調用該命令
          ?
          asmcmd -p
          ?
          ??? 使用 -p 選項可以在提示中顯示當前路徑。
          ?
          ??? 現(xiàn)在,嘗試一些非常簡單的命令。調用命令行提示 (ASMCMD >) 后,鍵入 ls 查看已掛載的所有磁盤組。
          ?
          ASMCMD [+] > ls
          DGROUP1/
          DGROUP10/
          DGROUP2/
          DGROUP3/
          DGROUP4/
          DGROUP5/
          DGROUP6/
          DGROUP7/
          DGROUP8/
          DGROUP9/
          ?
          ??? 可以在此處看到在 ASM 實例中創(chuàng)建和掛載的所有磁盤組(DGROUP1 至 DGROUP10)。
          ?
          ??? 現(xiàn)在,考察磁盤組 DGROUP1。可以使用 cd 命令像更改目錄那樣更改此磁盤組。
          ?
          ASMCMD [+] > cd dgroup1
          ?
          ??? 甚至可以像在類 UNIX 或 Windows 這樣的操作系統(tǒng)中那樣,通過鍵入 cd .. 轉到父目錄。現(xiàn)在,確認在該磁盤組中創(chuàng)建了哪些文件。
          ?
          ASMCMD [+dgroup1] > ls
          ORCL/
          ?
          ??? 好了,該磁盤組的下面增加了一個目錄 ORCL。從它后面的正斜線 (/) 即可看出它是一個目錄。使用 cd 命令進入該目錄,然后執(zhí)行命令 ls 顯示內容。
          ?
          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] >
          ?
          ??? 除了 cd 和 ls 命令外,還可以使用其他類 UNIX 的命令,如 rm(用于刪除目錄或文件)、mkdir(用于創(chuàng)建目錄)和 find(用于查找文件和目錄)。
          ?
          ??? 以下是一些其他命令:
          ?
          ??? lsdg(list diskgroup 的縮寫)—— 要查看該 ASM 實例掛載的磁盤,使用 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/
          ?
          ??? 除了顯示磁盤名稱以外,lsdg 還顯示了其他相關信息,如已分配的空間大小、可用空間大小和脫機磁盤。該信息簡化了問題的診斷。
          ?
          ??? du(disk utilization 的縮寫)—— 由于您已經在 ASM 磁盤上填充了數據,因此可能要查明磁盤組內部占用的空間大小。為此,可以像在 UNIX、Linux 或 Windows 中那樣使用 du 命令。要了解目錄內部已使用的空間大小,只需使用
          ?
          ASMCMD [+] > du /dgroup1
          Used_MB????? Mirror_used_MB
          ????? 9?????????????????? 9
          ?
          ??? 以上命令顯示已經使用了 9MB。由于您已經使用了外部鏡像,因此所使用的磁盤空間總大小仍為 9MB (Mirror_used_MB)。如果使用了 ASM 磁盤的標準冗余參數,則該數字將有所不同。
          ?
          ??? help —— 沒有幫助那還叫什么工具!您不必記住每一個命令。只需鍵入 help 即可顯示一個命令列表。然后,可以鍵入 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>".
          ?
          ??? 您可以看到,這個豐富的命令集使 ASM 成為一個可管理性很高的文件系統(tǒng),您甚至不需要研究 SQL 接口或 Oracle Enterprise Manager。還可以將這些命令輕松置于 shell 腳本中,從而為更多用戶所接受。



          刪除空數據文件
          ?
          ??? 假設您剛剛向錯誤目錄或表空間中添加了一個數據文件 —— 一個很常見的錯誤。并不會丟失一切;由于該數據文件不包含任何數據,因此您可以輕松地刪除它,是這樣嗎?
          ?
          ??? 遺憾的是,您無法刪除它。在 Oracle 數據庫 10g 第 2 版之前,刪除數據文件的唯一有效方法就是刪除整個表空間,然后在沒有該特定文件的情況下重新構建它。如果表空間包含數據,則必須通過既費時又費力的過程將數據存儲到單獨的位置并恢復它。除了不方便以外,該過程還使表空間不可用。
          ?
          ??? 幸運地是,在 Oracle 數據庫 10g 第 2 版中,該過程已得到簡化:您可以只刪除數據文件。例如,以下命令將從表空間和服務器中刪除指定的數據文件。
          ?
          alter tablespace users drop datafile '/tmp/users01.dbf'
          /
          ?
          ??? 但存在一些限制:1數據文件必須為空才能刪除。無法刪除表空間中的最后一個數據文件;必須刪除表空間本身。同時,表空間必須處于聯(lián)機和讀寫狀態(tài)。



          針對掛起/低速系統(tǒng)的直連 SGA 訪問
          ?
          ??? 當用戶經常抱怨數據庫運行速度慢并經常超時時,大多數 DBA 最先想到的就是以 SYSDBA 連接到數據庫并檢查等待事件。但如果實例掛起,甚至您無法登錄時又會怎樣?這種情況下,即使最強大、最優(yōu)秀的故障診斷查詢也無濟于事。
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,Oracle Enterprise Manager Grid Control 可以在苛刻環(huán)境下根據您的請求直接連接到 SGA,從而從進程狀態(tài)中直接收集數據。這個所謂的內存訪問模式增強了您有效使用 Oracle Enterprise Manager 的能力,即使在實例經歷嚴重問題的情況下也是如此。而最重要的是,這是在 SQL 訪問基本無法實現(xiàn)的情況下自動執(zhí)行的。
          ?
          ??? 以下是它的工作方式:在 Oracle Enterprise Manager 用戶界面中,選擇 Performance 選項卡,并向下滾動到該頁面底部標記為“Related Links”的部分,這將顯示一個如下所示的屏幕。
          ?
          ?
          ??? 注意名為“Monitor in Memory Access Mode”的鏈接。單擊該鏈接將顯示一個如下所示的屏幕。注意“View Mode”下拉菜單,其中的“Memory Access”選項處于選中狀態(tài)。
          ?
          ?
          ??? 可以使用“View Mode”下拉菜單控制 Oracle Enterprise Manager 獲取數據的方式。在本示例中,它顯示從內存獲取的數據(“Memory Access”)。還可以在此處選擇“SQL Access”以從性能視圖中進行選擇。
          ?
          ??? 請注意,內存訪問模式并不是 SQL 訪問的替代模式;它只適合在 SQL 訪問不可用的緊急情況下使用。此外,內存訪問模式只提供對分析掛起會話有幫助的數據子集。(有關該主題的詳細信息請見下個部分 — “性能”特性。)



          聯(lián)機重新定義分區(qū)
          ?
          ??? 當大多數 DBA 沒有停機時間來更改表時(如對其進行分區(qū)),他們將使用聯(lián)機重新定義工具 DBMS_REDEFINITION。使用該工具,您可以更改對象定義,同時使它們保持可訪問狀態(tài)。
          ?
          ??? 但 DBMS_REDEFINITION 有一個限制,這使它在某些情況下無法提供幫助。例如,您可能要將表分區(qū)移動到不同的表空間。為此,必須移動整個表,即使已將其分區(qū)。如果該表很大,此方法將產生大量的重做和撤消操作,且無法利用現(xiàn)有分區(qū)。但如果一次可以移動一個分區(qū),則可以顯著減少時間、空間和重做/撤消要求。
          ?
          ??? 使用 Oracle 數據庫 10g 第 2 版,您可以完全實現(xiàn)該目標:可以通過 Oracle Enterprise Manager 或命令行重新定義一個表分區(qū)。
          ?
          ??? 我們來看一個使用命令行的示例。在這里,您有一個名為 ACCOUNTS 的表,它包含 11 個分區(qū),所有這些分區(qū)都位于同一表空間 USERS 中。您要將它們移到一個專門為該表創(chuàng)建的新表空間 ACCDATA 中。您將以一次移動一個分區(qū)的方式移動該表。
          ?
          ??? 首先,創(chuàng)建一個中間表,其結構與表 ACCOUNTS 相同但現(xiàn)在將數據置于 ACCDATA 表空間上。
          ?
          SQL> create table accounts_int
          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? /
          ?
          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
          ?
          11 rows selected.
          ?
          ??? 所有分區(qū)均位于 USERS 表空間中。現(xiàn)在,將第一個分區(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? /
          ?
          PL/SQL procedure successfully completed.
          ?
          ??? 注意第 6 行,其中的 part_name 參數指定要重新組織的分區(qū)。如果省略該參數,則將同時重新定義所有分區(qū)。
          ?
          ??? 現(xiàn)在,將中間表與原始表同步。(僅當要對表 ACCOUNTS 進行更新時才需要執(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? /
          ?
          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? /
          ?
          PL/SQL procedure successfully completed.
          ?
          ??? 確認分區(qū) P1 確已移到表空間 ACCDATA 中。
          ?
          SQL> select partition_name, tablespace_name, num_rows
          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
          ?
          11 rows selected.
          ?
          ??? 行了!對其他分區(qū)重復該過程。
          ?
          ??? 相比而言,如果您重新組織了整個表,則將 (a) 需要一個大小與整個表相等的空間,(b) 為整個表生成重做(必須存在),否則將產生錯誤。但通過對單個分區(qū)執(zhí)行此過程,將減少單個分區(qū)的空間要求,并減少只為該分區(qū)生成的重做。
          ?
          ??? 使用這個強大而有用的特性,您可以聯(lián)機重新組織非常大的對象(就像大多數已分區(qū)對象一樣)。此外,還應注意如何將統(tǒng)計信息復制到已重新定義的表上(如以上查詢中的 NUM_RWS 值所示);您不必為新建的表或分區(qū)重新生成統(tǒng)計信息。



          在內存中檢查數據塊完整性,而非在磁盤上檢查
          ?
          ??? 活動的數據庫實例將大量數據從用戶會話移動到緩沖區(qū)緩存,從緩存移動到磁盤,反之亦然。這些移動可能使數據塊容易遭到損壞。
          ?
          ??? Oracle 通過在將數據塊寫入磁盤之前計算數據值的校驗和確保數據塊的完整性。同時將該檢驗和值寫入磁盤。當從磁盤中讀取該塊時,讀取過程將再次計算校驗和,然后與存儲的值進行對比。如果值已損壞,校驗和將不同,從而表明數據已經損壞。
          ?
          ??? 由于大多數操作發(fā)生在內存中,因此在源本身(即緩沖區(qū)緩存)中執(zhí)行該檢查應謹慎。在 Oracle 數據庫 10g 第 2 版中,還可以通過將初始化參數 DB_BLOCK_CHECKSUM 設置為 FULL 來執(zhí)行內存檢查。
          ?
          ??? 在進行此設置后,Oracle 將在進行任何更改之前計算校驗和并將該校驗和與存儲的值進行比較。該方法可以發(fā)現(xiàn)內存本身中的任何數據損壞,并在數據損壞時報告錯誤,這對防止磁盤級別的數據損壞以及防止將該損壞傳播到備用數據庫很幫助。
          ?
          ??? 請注意,默認情況下,該參數設置為 FALSE,這與早期版本不同,那時該參數設置為 TRUE。



          聯(lián)機限制更改
          ?
          ??? 當需要更改在創(chuàng)建數據庫期間定義的參數(MAXDATAFILES、MAXLOGFILES 等)時,您有哪些選擇?在 Oracle 數據庫 10g 第 2 版之前,唯一的選擇就是遵循以下步驟:
          ?
          ??? 1、備份要跟蹤的控制文件。
          ??? 2、在跟蹤文件中修改要更改的參數。
          ??? 3、關閉數據庫。
          ??? 4、開始掛載。
          ??? 5、重新創(chuàng)建控制文件。
          ??? 6、在RESETLOGS模式下打開數據庫。
          ?
          ??? 不用說,該方法降低了可用性。此外,由于 RMAN 將有關備份的元數據保存在控制文件和目錄中,因此該信息將在此過程中丟失。由于控制文件是在 RESETLOGS 模式下創(chuàng)建的,因此某些備份信息也將丟失。
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,您無需重新創(chuàng)建控制文件便可更改這些參數。這樣,您將不會丟失其中存儲的 RMAN 信息。



          更快的啟動
          ?
          ??? 2GB 內存即被視為夠大的年代已像恐龍一樣成為了歷史。現(xiàn)在,100GB 的大型緩沖區(qū)緩存并不鮮見。實例啟動時,初始化這樣大小的緩沖區(qū)緩存可能需要數分鐘甚至數小時。
          ?
          ??? 如果您深入研究這種情況將會發(fā)現(xiàn),在數據庫實例啟動時無需啟動整個緩沖區(qū)緩存。當實例啟動時,緩沖區(qū)緩存是空的;隨著用戶從表中選擇數據,該緩沖區(qū)緩存將逐漸填滿。因此,在實例啟動時無需初始化整個緩沖區(qū)緩存。
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,此行為在啟動邏輯中受到控制。當啟動實例時,只初始化 10% 的緩沖區(qū)緩存;剩余緩沖區(qū)緩存在檢查點進程打開數據庫之后才被初始化。這個新方法顯著減少了實例啟動的時間。
          ?
          ??? 但請注意,在初始化整個緩沖區(qū)之前,無法使用緩沖區(qū)緩存大小自動調整功能。



          在 Oracle Enterprise Manager 中管理多個對象
          ?
          ??? 如果某個模式中的多個對象均無效,您通常怎么辦?您很有可能創(chuàng)建一個 SQL 腳本來動態(tài)生成另一個編譯這些無效對象的腳本。至少,在缺少第三方工具的情況下,這個方法還不錯。
          ?
          ??? 但如果可以為此使用 Oracle Enterprise Manager Grid Control 豈不是更好?不是只選擇一個無效對象并單擊編譯,而是同時選擇多個無效對象并通過一次單擊操作編譯它們?
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,您確實可以這么做。如下所示,您所要做的就是選中對象旁邊的復選框。然后,就可以從“Actions”旁邊的下拉列表中選擇“Compile”來同時編譯所有對象。
          ?
          ?
          ??? 除了編譯以外,您還可以執(zhí)行大量其他操作,如創(chuàng)建 DDL 或刪除對象。



          XML 格式的審計跟蹤
          ?
          ??? 如果您長期以來一直在使用 Oracle 中內置的審計工具則可能會注意到,一個非常有用的特性就是能夠將審計跟蹤寫入一個文件系統(tǒng)中。將條目寫入文件系統(tǒng)而非數據庫本身中可以建立額外級別的安全性。
          ?
          ??? 您所要做的就是設置兩個初始化參數:
          ?
          audit_file_dest = '/auditfs'
          audit_trail = xml
          ?
          ??? 并重新啟動該實例。但這兩個參數不是動態(tài)的;一旦設置,將把審計跟蹤寫入目錄 /auditfs 中。參數 audit_file_dest 是可選的;默認為 $ORACLE_HOME/rdbms/audit 目錄。這些審計跟蹤文件將為擴展名為 .xml 的 XML 文件。
          ?
          ?
          ??? 這些跟蹤文件可被 XML 分析器輕松分析,從中提取有用的信息。您甚至可以將它們作為 XML 類型加載到數據庫中,然后使用 XML 查詢(詳見本系列第 1 部分中的介紹)在 SQL 內部查詢它們。
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,可以將此 XML 文件與 SQL 查詢相結合,從中進行選擇,就好像它是來自一個 SQL 源似的。還有一個預定義的動態(tài)視圖 V$XML_AUDIT_TRAIL,用于從固定表 X$XML_AUDIT_TRAIL 中進行選擇。此動態(tài)視圖在結構方面類似于常規(guī)審計跟蹤視圖 DBA_AUDIT_TRAIL。
          ?
          ??? 對于 DBA 而言,使用 XML 格式的審計跟蹤就可以通過第三方的 XML 分析器和編輯器操作文件,并可以通過接受 XML 作為輸入的工具發(fā)布報表。您不再需要編寫自己的分析器來解釋這些審計跟蹤文件。



          自動的 Segment Advisor
          ?
          ??? 您如何知道哪些段在最高使用標記下具有大量可用空間,并能從重新組織中受益?
          ?
          ??? 可以使用 Oracle 數據庫 10g 中提供的 Oracle Enterprise Manager 界面指定特定的表空間來發(fā)現(xiàn)可能的符合要求的段,但如果您的數據庫有幾百個表空間,則不可能每天執(zhí)行該操作。即使您能做,但也不是每個表空間都有需要重新組織的段的。因此,如果有一個自動工具可以提前掃描這些段并報告需要重新組織的段豈不很好?
          ?
          ??? 在 Oracle 數據庫 10g 第 2 版中,所附帶的程序包 DBMS_SPACE 提供了該功能。內置函數 ASA_RECOMMENDATIONS 顯示了段;由于這是一個管道函數,因此必須按如下所示使用它:
          ?
          select * from table (dbms_space.asa_recommendations());
          ?
          ??? 由于列數較多,因此看清楚輸出不太容易。以下只是一個以垂直格式顯示的記錄。
          ?
          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
          ?
          ??? 此處您將看到,模式 ARUP 中表 ACCOUNTS 的分區(qū) P7 包含鏈接行。執(zhí)行重新組織將幫助加快該分區(qū)全表掃描的速度。
          ?
          ??? 此信息由在預定義的維護時間窗(周末下午 10 點至早上 6 點以及周六中午 12 點至周一中午 12 點)內運行的自動調度作業(yè)收集;您可以使用 Oracle Enterprise Manager 更改這些時間窗。在此時間內,該作業(yè)將對段進行掃描以獲取符合要求的段。如果掃描無法及時完成,該作業(yè)將暫停并在第二天的時間窗繼續(xù)掃描。
          ?
          ??? 該作業(yè)存儲有關在名為 wri$_segadv_objlist 的表中檢查的段和表空間的信息。可以查看有關在視圖 DBA_AUTO_SEGADV_CTL 中檢查的段的信息。



          基于事件的調度
          ?
          ??? Oracle 數據庫 10g 第 1 版中引入的 Oracle Scheduler 是下一代作業(yè)調度系統(tǒng),它取代了 DBMS_JOB 附帶的程序包。與該程序包相比,此 Scheduler 工具有一些顯著的優(yōu)點(詳見此處最初的介紹)。
          ?
          ??? 在 Oracle Scheduler 的第一版中,作業(yè)基于時間并根據時間觸發(fā)。但如果要使觸發(fā)器基于事件該怎么辦?例如,當帳戶的 Account Manager 更改時,您可能希望一個批處理程序自動執(zhí)行以重新計算收入并重新發(fā)布報表。
          ?
          ??? 可以在 Oracle 數據庫 10g 第 2 版的 Scheduler 工具中實現(xiàn)此類基于事件的觸發(fā)。事件通過 Advanced Queueing (AQ)(其中有效載荷是一個對象類型)傳遞給 Scheduler。因此,您首先需要創(chuàng)建一個 AQ(如 proc_queue),在這里將把任意這樣的事件排隊。然后,您必須基于此事件創(chuàng)建一個調度。
          ?
          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;
          ?
          ??? 接著,您將創(chuàng)建一個作業(yè)以遵循此調度。您也可以直接調度一個作業(yè)而不用先創(chuàng)建一個調度。
          ?
          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;
          ?
          ??? 默認值是 UNLIMITED。
          ?
          ??? 如果事件(而不是特定時間)是觸發(fā)作業(yè)的決定因素,則基于事件的調度很有幫助。
          ?
          ?
          ?
          ?
          主站蜘蛛池模板: 沙洋县| 玛曲县| 彝良县| 那曲县| 珠海市| 台中县| 长寿区| 皮山县| 会理县| 绥滨县| 澄江县| 呈贡县| 满城县| 凤台县| 来安县| 北京市| 旬阳县| 平顶山市| 淮北市| 故城县| 年辖:市辖区| 思南县| 苏尼特右旗| 乐至县| 五寨县| 铜川市| 东乌珠穆沁旗| 仙桃市| 桐城市| 东兰县| 新乐市| 扬州市| 昭平县| 会理县| 玉树县| 深水埗区| 呈贡县| 建水县| 临湘市| 汉寿县| 五指山市|