PIXNET Logo登入

香蕉皮

跳到主文

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 5月 29 週六 201020:21
  • Oracle的RowID、SQL Server和Sybase的RID

對DBMS而言,如果是透過Index搜尋資料,當在Index的B-Tree中找到符合的資料時,最後都會透過該索引給予的指標,去得知實際
的Data Page(Data Block)的位置。該指標在SQL Server或Sybase ASE都是稱做RID(Row Identify),而Oracle稱做ROWID(Row Identify)。

 
(1)SQL Server
   RID ==> 檔案編號、分頁編號、在該分頁裡的資料列編號
(2)Sybase
   RID ==> 檔案編號、分頁編號、在該分頁裡的資料列編號
(3)Oracle
   範例: OOOOOOFFFBBBBBBRRR
         [ROWID Format]
         OOOOOO ===> Data object number
         FFF ======> Relative file number
         BBBBBB ===> Block number
         RRR ======> Row number(或稱為Slot number)
 
 
======================================
Oracle的RowID結構
======================================

//1、為什使用ROWID
ORACLE把ROWID作為B-樹和其內部演算法標示ROW的唯一標示。
在ORACLE8以前的版本中,ROWID標示FILE、BLOCK、ROW NUMBER,只用一個數字代
表FILE號。
在ORACLE8中,一個DATAFILE有兩個數字代表:
一個絕對值,是整個數據庫唯一的。可以看DBA_DATA_FILES中的FILE_ID。
一個相對值,在TABLESPACE中是唯一的,可以看DBA_DATA_FILES中的RELATIVE_
FNO。
新的ROWID使用相對值,所以必須存放SEGMENT的標示,否則就會混淆。所以ORAC
LE8在ROWID中加入對象的SEGMENT號,用來標示TABLE或者PARTITION。
 
//2、ROWID的結構
使用base-64代碼,包括a-z,A-Z,0-9,+,-。一共18位。
1-6位:代表OBJECT
7-9位:文件相對值
10-15:文件中的BLOCK
16-18:BLOCK中的SLOT值
 
//3、TABLESPACE-Relative尋址方式
使用的是TABLESPACE-Relative尋址方式,多個檔可以有相同的相對值,因為它
們屬不同的TABLESPACE,所以不能從新的ROWID得到絕對位址,但是這沒有問題
,因為當要處理某個OBJECT時,已經能確定它屬哪個TABLESAPCE了。在TABLES
PACE中,檔相對值是唯一的,所以ROWID還是可以唯一標示一個OBJECT。TABLE
SPACE-Relative尋址方式是ORACLE8中支援超大數據庫的關鍵技術。
 
//4、DATA OBJECT NUMBER
DATA OBJECT NUMBER用指示SEGMENT,所有SEGMENT都有DATA OBJECT NUMBER,
存放在每個DATA BLOCK中,而且不重復。
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(605)

  • 個人分類:Oracle
▲top
  • 3月 31 週三 201021:46
  • Oracle-縮小區段(Shrink Space)

通常Oracle的Table經過經年累月的Insert資料後,當做大量的Data Retention後,常常會發現效能還是不佳,那是因為High Water Mark(HWM),並
不會HWM並不會往前移動,造成Full Table Scan時,還會從第一個Data Block掃瞄到HWM的位置,此時除了Table Move或Export再Import外,別
無他法,但Oracle 10g開始支援縮小區段(Shrink Space) 這個命令‧(文章內容和範例參考至申建忠的大作)
 
//shrink space compact
這個操作需要對表格加上表格層次的共用鎖定(TM:Row Exclusive),並對搬移資料列加上獨佔鎖定(Exclusive)‧ 然後將表格的資
料列盡可能地向區段標頭(Segment Header)進中,方法是使用一組新增、刪除資料列操作‧先新增新的資料列,再刪除舊的資料列
,但新增的資料列將儘可能靠近區段標頭‧資料管理者可以線上重組表格,而不會妨礙其他使用者對該表格進行DML操作‧ 縮小區
段不會建立新的區段(Segment),因而可以減少表格重組過程中需要額外的空間需求‧
但要注意的是該操作不會移動高水位標記(High Water Mark),也不會回收位於高水位標記以後的區塊(Data Block), 所以重組後
的表格,僅僅只是改善非Full Talbe Scan以外的情形(例Index Fast Full Scan、Index Range Scan、Index Unique Scan等等)‧
語法: ALTER TABLE table_name SHRINK SPACE COMPACT
 
//shrink space
取得表格獨佔鎖定(Exclusive),將高水位標記(High Water Mark)移動到目前資料區塊(Data Block)中有資料列的最後一個資料區
塊的位置‧之後釋放新高水標記以後的資料區塊,因此,表格空間將標示那些回收的擴充區塊(Extent)為可用的擴充區塊‧
語法: ALTER TABLE table_name SHRINK SPACE
 

 
 
//[01]建立範例環境
SQL> create table scott.t3 as select * from dba_objects where object_id<=5000;
     已建立表格.
SQL> create index scott.t3_object_id_idx on scott.t3(object_id);
     已建立索引.
SQL> execute dbms_stats.gather_table_stats('scott','t3');
     已順利完成 PL/SQL 程序.
//[02]目前T2表格所在的Tablespace為USERS,以及共有4917筆資料列與使用52個Data Block
SQL> select table_name,tablespace_name,num_rows,blocks from dba_tables
  2  where owner='SCOTT' and table_name='T3';
     TABLE_NAME      TABLESPACE_NAME        NUM_ROWS     BLOCKS
     --------------- -------------------- ---------- ----------
     T3              USERS                      4917         67
//[03]目前Index的狀態為有效
SQL> select index_name,status from dba_indexes
  2  where owner='SCOTT' and index_name='T3_OBJECT_ID_IDX';
     INDEX_NAME                     STATUS
     ------------------------------ --------
     T3_OBJECT_ID_IDX               VALID
//[04]Table Move前,T3表格的物件編號為51356,以及區段編號為51356
SQL> select object_name,object_id,data_object_id from dba_objects
  2  where owner='SCOTT' and object_name='T3' and object_type='TABLE';
     OBJECT_NAME      OBJECT_ID DATA_OBJECT_ID
     --------------- ---------- --------------
     T3                   51356          51356
//[05]目前區段所使用的擴充區塊(Extent)數量為9個,共有72個Data Block
SQL> select extent_id,file_id,block_id,blocks from dba_extents
  2  where owner='SCOTT' and segment_name='T3';
      EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
     ---------- ---------- ---------- ----------
              0          4         57          8
              1          4         65          8
              2          4         73          8
              3          4         81          8
              4          4         89          8
              5          4         97          8
              6          4        105          8
              7          4        113          8
              8          4        121          8
     已選取 9 個資料列.
//[06]縮小區段前資料列的Rowid
SQL> select rowid,object_id,object_name from scott.t3
  2  where object_id=4999;
     ROWID               OBJECT_ID OBJECT_NAME
     ------------------ ---------- -----------------------------
     AAAMicAAEAAAAB7AA9       4999 ALL_SNAPSHOT_REFRESH_TIMES
//[07]object_id為4999的資料列所在的Data Block為123,資料列為該Data Block的第61筆資料列
SQL> select dbms_rowid.rowid_block_number(rowid) block_number,
  2         dbms_rowid.rowid_row_number(rowid) block_number
  3  from scott.t3 where object_id=4999;
     BLOCK_NUMBER BLOCK_NUMBER
     ------------ ------------
              123           61
//[08]進行測試的資料刪除,造成Data Block有部份空間浪費
SQL> DELETE scott.t3 where MOD(object_id,2)=0;
     已刪除 2457 個資料列.
SQL> COMMIT;
     確認完成.
SQL> execute dbms_stats.gather_table_stats('scott','t3');
     已順利完成 PL/SQL 程序.
//[09]雖然資料列筆數減少為2460筆,但所使用的Data Block數量與資料列筆數4917筆相同‧因此有Data Block空間浪費的現象
SQL> select table_name,tablespace_name,num_rows,blocks from dba_tables
  2  where owner='SCOTT' and table_name='T3';
     TABLE_NAME      TABLESPACE_NAME        NUM_ROWS     BLOCKS
     --------------- -------------------- ---------- ----------
     T3              USERS                      2460         67
//[10]進行縮小區段前,表格必須啟用資料列移動(Row Movement)功能
SQL> alter table scott.t3 enable row movement;
     已更改表格.
//[11]Shrink Space Compact只搬移資料列,但不重設高水位標記(HWM)
SQL> alter table scott.t3 shrink space compact;
     已更改表格.
SQL> execute dbms_stats.gather_table_stats('scott','t3');
     已順利完成 PL/SQL 程序.
//[12]縮小區段並不會建立一個新的區段,所以縮小區段後,區段編號並沒有改變‧
SQL> select object_name,object_id,data_object_id from dba_objects
  2  where owner='SCOTT' and object_name='T3' and object_type='TABLE';
     OBJECT_NAME      OBJECT_ID DATA_OBJECT_ID
     --------------- ---------- --------------
     T3                   51356          51356
//[13]縮小區段後資料列的Rowid已經跟進行縮小區段之前的Rowid不一樣
SQL> select rowid,object_id,object_name from scott.t3
  2  where object_id=4999;
     ROWID               OBJECT_ID OBJECT_NAME
     ------------------ ---------- -----------------------------
     AAAMicAAEAAAAA8AAo       4999 ALL_SNAPSHOT_REFRESH_TIMES
//[14]縮小區段後object_id為4999的資料列所在的Data Block為60,資料列為該Data Block的第40筆資料列
SQL> select dbms_rowid.rowid_block_number(rowid) block_number,
  2         dbms_rowid.rowid_row_number(rowid) block_number
  3  from scott.t3 where object_id=4999;
     BLOCK_NUMBER BLOCK_NUMBER
     ------------ ------------
               60           40
//[15]因為縮小區段使用新增/刪除資料列的技巧來搬移資料列,因此Index的內容也一同被維護
SQL> select index_name,status from dba_indexes
  2  where owner='SCOTT' and index_name='T3_OBJECT_ID_IDX';
     INDEX_NAME                     STATUS
     ------------------------------ --------
     T3_OBJECT_ID_IDX               VALID
//[16]縮小區段並沒有建立新的區段(Segment),所以擴充區塊(Extent)並未改變
SQL> select extent_id,file_id,block_id,blocks from dba_extents
  2  where owner='SCOTT' and segment_name='T3';
      EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
     ---------- ---------- ---------- ----------
              0          4         57          8
              1          4         65          8
              2          4         73          8
              3          4         81          8
              4          4         89          8
              5          4         97          8
              6          4        105          8
              7          4        113          8
              8          4        121          8
     已選取 9 個資料列.
//[17]Shrink Space將會搬移資料列,並會重新設定高水位標記(HWM),與釋放高水位標記以後的Data Block
SQL> alter table scott.t3 shrink space;
     已更改表格.
SQL> execute dbms_stats.gather_table_stats('scott','t3');
     已順利完成 PL/SQL 程序.
//[18]經過Shrink Space後,所使用的區塊減為27個
SQL> select table_name,tablespace_name,num_rows,blocks from dba_tables
  2  where owner='SCOTT' and table_name='T3';
     TABLE_NAME      TABLESPACE_NAME        NUM_ROWS     BLOCKS
     --------------- -------------------- ---------- ----------
     T3              USERS                      2460         27
//[19]區段所擁有的擴充區塊(Extent)也減少為4個,Data Block共32個
SQL> select extent_id,file_id,block_id,blocks from dba_extents
  2  where owner='SCOTT' and segment_name='T3';
      EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
     ---------- ---------- ---------- ----------
              0          4         57          8
              1          4         65          8
              2          4         73          8
              3          4         81          8
//[20]關閉表格必的資料列移動(Row Movement)功能
SQL> alter table scott.t3 disable row movement;
     已更改表格.
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(11,346)

  • 個人分類:Oracle
▲top
  • 3月 28 週日 201023:09
  • Oracle學習心得-V$PARAMETER、V$PARAMETER2、V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2、V$SPPARAMETER之間的差異

老實說剛碰Oracle時,對V$PARAMETER、V$PARAMETER2、V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2、V$SPPARAMETER之
間有什麼差異,有什麼不同,完全搞不清楚,結果花了點時間Try一下,大概知道他們之間的差異‧
 
 
//V$PARAMETER、V$SYSTEM_PARAMETER、V$SPPARAMETER之間的差異
在 Oracle 10g 剛裝好時,Instance預設啟動是載入SPFILE參數檔,而SPFILE內有定義 db_file_multiblock_read_count=16 ,但
沒有定義 timed_statistics 該參數值的設定,由以下三個範例,可以看出‧
範例: //v$parameter
      SQL> select name,value,isdefault from v$parameter
         2 where name in ('timed_statistics','db_file_multiblock_read_count');
           NAME                           VALUE    ISDEFAULT
           ------------------------------ -------- ---------
           timed_statistics               TRUE     TRUE
           db_file_multiblock_read_count  16       FALSE
      備註: ISDEFAULT欄位為FALSE,代表該參數是定義在SPFILE或PFILE中‧TRUE代表該參數是未定義於SPFILE或PFILE,而是由
            Instance預設設定Value值(該Value值,也可以讓使用者在Instance啟動後,動態設定)‧

      //v$system_parameter
      SQL> select name,value,isdefault from v$system_parameter
         2 where name in ('timed_statistics','db_file_multiblock_read_count');
           NAME                           VALUE    ISDEFAULT
           ------------------------------ -------- ---------
           timed_statistics               TRUE     TRUE
           db_file_multiblock_read_count  16       FALSE
      備註: ISDEFAULT欄位為FALSE,代表該參數是定義在SPFILE或PFILE中‧TRUE代表該參數是未定義於SPFILE或PFILE,而是由
            Instance預設設定Value值(該Value值,也可以讓使用者在Instance啟動後,動態設定)‧

      //v$spparameter
      SQL> select name,value,isspecified from v$spparameter
         2 where name in ('timed_statistics','db_file_multiblock_read_count');
           NAME                           VALUE    ISSPEC
           ------------------------------ -------- ---------
           timed_statistics                        FALSE
           db_file_multiblock_read_count  16       TRUE
      備註: ISSPEC欄位為TRUE,代表該參數是定義在SPFILE中‧FALSE代表該參數未定義SPFILE或PFILE之中‧如果之後曾經執行
            命令對 timed_statistics 該參數做設定,該參數的ISSPEC將會變成TRUE‧

 
 
//V$PARAMETER、V$SYSTEM_PARAMETER之間的差異
範例: //Session1
      SQL> select name,value,isdefault from v$parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     TRUE       TRUE
      SQL> select name,value,isdefault from v$system_parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     TRUE       TRUE
      SQL> alter session set timed_statistics=false;
           已更改階段作業.
      SQL> select name,value,isdefault from v$parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     FALSE      TRUE
      SQL> select name,value,isdefault from v$system_parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     TRUE       TRUE
      //Session2(該Session是在Session1執行完alter session set timed_statistics=false;命令,方登入Oracle)
      SQL> select name,value,isdefault from v$parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     TRUE       TRUE
      SQL> select name,value,isdefault from v$system_parameter where name ='timed_statistics';
           NAME                 VALUE      ISDEFAULT
           -------------------- ---------- ----------
           timed_statistics     TRUE       TRUE
 
 
 
//V$PARAMETER、V$PARAMETER2、V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2之間的差異
由下面的範例可以知道 V$PARAMETER、V$PARAMETER2這二個Dynamic Performance View結果是一樣的,差異在於 V$PARAMETER對於
該參數的Value是多個時,會合併成一筆資料,而 V$PARAMETER2則會分成數筆資料‧

同樣情形在V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2該二個Dynamic Performance View的差異也僅只是顯示是否多筆‧
範例: //V$PARAMETER
      SQL> select name,value from v$parameter where name = 'control_files';
           NAME            VALUE
           --------------- ------------------------------------------------------
           control_files   C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL,
                           C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL,
                           C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL
      //V$PARAMETER2
      SQL> select name,value from v$parameter2 where name = 'control_files';
           NAME            VALUE
           --------------- ------------------------------------------------------
           control_files   C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL
           control_files   C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL
           control_files   C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL
 
 
<結論>
(一)V$PARAMETER、V$PARAMETER2這二個View都是顯示目前該Session下的參數設定,而二個View的差異在於,對於多值設定
    的參數,V$PARAMETER就算多個值設定,永遠一個Row,而V$PARAMETER2則是多個Row‧V$PARAMETER、V$PARAMETER2該二
    個View,不管是SPFILE或PFILE,的Value欄位都是會有值的‧

(二)V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2這二個View都是顯示目前該 Instance下的參數設定,而二個View的差異在
    於,對於多值設定的參數,V$SYSTEM_PARAMETER就算多個值設定,永遠一個Row, 而V$SYSTEM_PARAMETER2則是多個Row
    ‧V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2該二個View,不管是SPFILE或PFILE,的Value欄位都是會有值的‧

(三)如果是用SPFILE參數型式啟動Instance,V$SPPARAMETER該View的Value欄位是會有值的,但如果是 PFILE參數型式啟動
    Instance,則V$SPPARAMETER該View的Value欄位是Null的‧ 要注意的是V$SPPARAMETER是顯示SPFILE上設定的參數值,
    並不代表是目前Instance上設定的參數值,如果想要查看目前Instance上的參數值,請參考V$SYSTEM_PARAMETER‧

(四)請用如下範例即可以觀察三個Dynamic Performance View的差異‧
    SELECT * FROM V$PARAMETER WHERE NAME = 'control_files'
    SELECT * FROM V$PARAMETER2 WHERE NAME = 'control_files'

    SELECT * FROM V$SYSTEM_PARAMETER WHERE NAME = 'control_files'
    SELECT * FROM V$SYSTEM_PARAMETER2 WHERE NAME = 'control_files'

    SELECT * FROM V$SPPARAMETER WHERE NAME = 'control_files'
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(2,260)

  • 個人分類:Oracle
▲top
  • 7月 26 週日 200916:16
  • Oracle學習心得-指定讀取那個參數檔

SQL> startup nomount pfile='c:\initorcl.ora'
ORACLE 執行處理已啟動.
 
SQL> startup force pfile='c:\initorcl.ora'
ORACLE 執行處理已啟動.
 
備註: 此方式只能應急,因為該Oracle Instaince每次啟動時,還是會去 Oracle_Home路徑下搜尋相關參數檔‧當然也有一種情形
         就是,當你需要嘗試參數檔內某個參數,但又不想要動到目前正常使用的參數檔,即可用這種方式,因為即使不小心設壞了
      ,只要Instance重帶即可‧
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(132)

  • 個人分類:Oracle
▲top
  • 7月 24 週五 200922:45
  • Oracle學習心得-Oracle Instance的刪除和修改

//刪除Oracle Instance
說明: net stop oracleserviceorcl
                                           ^^^^
                                              |
                                              +----------------> orcl為該Oracle中的Instance Name

步驟: C:\>net stop oracleserviceorcl
      OracleServicerockdb 服務正在停止....
      OracleServicerockdb 服務已經成功停止。
步驟: C:\>oradim -delete -srvc oracleserviceorcl
      執行處理已刪除.
 
//修改Oracle Instance的名稱
C:\>oradim -edit -sid orcl -newsid rockdb -intpwd rockdbpwd -pfile "c:\oracle\product\10.2.0\db_1\database\initrockdb.ora"
執行處理已刪除.
執行處理已建立.
備註: 當你改變Instance Name後,你需要確認,在Oracle_Home有置放相關的Initialization Parameter File、Password File,
          以本例,你就需要確定在Oracle_Home下有 initrockdb.ora 、 PWDrockdb.ORA 這二個檔案‧
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(594)

  • 個人分類:Oracle
▲top
  • 7月 23 週四 200921:18
  • Oracle學習心得-修改Client端的NLS_LANG設定

Oracle的SQL-PLUS其實是有支援多國語系的回應,只要你設定好NLS_LANG環境變數即可‧
 
 
//使用美國語系
範例: C:\>set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
      C:\>sqlplus rock_dba/123s@orcl as sysdba
      SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jul 19 16:59:13 2009
      Copyright (c) 1982, 2005, Oracle.  All rights reserved.
      Connected to:
      Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
      With the Partitioning, OLAP and Data Mining options
      SQL> archive log list
      Database log mode              No Archive Mode
      Automatic archival             Disabled
      Archive destination            USE_DB_RECOVERY_FILE_DEST
      Oldest online log sequence     11
      Current log sequence           13
      SQL>
 
//使用台灣繁體中文語系
範例: C:\>set NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
      C:\>sqlplus rock_dba/123s@orcl as sysdba
      SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 19 16:58:32 2009
      Copyright (c) 1982, 2005, Oracle.  All rights reserved.
      連線到:
      Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
      With the Partitioning, OLAP and Data Mining options
      SQL> archive log list
      資料庫日誌模式              無儲存模式
      可自動儲存             關閉
      儲存目的地            USE_DB_RECOVERY_FILE_DEST
      最早的線上日誌順序     11
      目前日誌順序           13
      SQL>
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(15,588)

  • 個人分類:Oracle
▲top
  • 7月 20 週一 200921:52
  • Oracle學習心得-參數檔載入順序(Oracle 10g for windows版)

//參數檔載入順序(Oracle 10g for windows版)
Oracle 10g 裝好後,雖然去查v$parameter,顯示的是該 "C:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\SPFILEORCL.ORA" 位置(見參考1
),但經實驗得知,其實該Instance是去 "C:\oracle\product\10.2.0\db_1\database" 該 Oracle_Home 路徑下依序找相關參數檔(見參考2),
但為什麼參數檔最終是去讀 "C:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\SPFILEORCL.ORA" 呢? 因為Oracle_Home下的參數檔
initorcl.ora的內容(PFILE型態),是指向另一個參數檔(SPFILE型態),請見參考3‧
 
如果去更改 initorcl.ora的預設的內容,或是作相關更改動作後,請見參考4,該Instance將不會間接去讀另一個路徑下的參數檔
 "C:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\SPFILEORCL.ORA" 了‧
 
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//參考1
SQL> select name,value from v$parameter where name like '%pfile%';
     NAME     VALUE
     ------   ------------------------------------------------------
     spfile   C:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\SPFILEORCL.ORA
 
//參考2
Oracle Instance會在Oracle_Home下會按照如下順序找出可以讀取的參數檔
(1)%ORACLE_HOME %\database \SPFILE<SID>.ORA
(2)%ORACLE_HOME %\database \SPFILE.ORA
(3)%ORACLE_HOME %\database \INIT<SID>.ORA
//參考3
檔案位置: C:\oracle\product\10.2.0\db_1\database\initorcl.ora
檔案內容: SPFILE='C:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora'
 
//參考4
SQL> create pfile from spfile; ==> 將c:\oracle\product\10.2.0\db_1\dbs\spfileorcl.ora的內容轉至C:\oracle\product\10.2.0\db_1\database\initorcl.ora
SQL> create spfile from pfile; ==> 將C:\oracle\product\10.2.0\db_1\database\initorcl.ora的內容轉至c:\oracle\product\10.2.0\db_1\database\spfileorcl.ora
SQL> shutdown immediate;
SQL> startup;
SQL> select name,value from v$parameter where name like '%pfile%';
     NAME     VALUE
     ------   ------------------------------------------------------
     spfile   C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\SPFILEORCL.ORA
備註: 當然你也可以不用多此一舉,直接將C:\ORACLE\PRODUCT\10.2.0\DB_1\DBS路徑下的SPFILEORCL.ORA,拷貝至Oracle_Home的
          路徑下 "c:\oracle\product\10.2.0\db_1\database" ‧
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(1,122)

  • 個人分類:Oracle
▲top
  • 9月 16 週二 200822:21
  • Oracle學習心得-調校Instance Recovery

在各種事件後的平均復原時間(Mean-Time-To-Recover:MTTR),Instance Recovery 復原會保證資料庫無毀損,但在資料庫能開啟
之前所必需作的Rolling Backup(Redo),可能會花可觀的時間‧這個時間取決於二個因素:有多少Redo已被讀取,以及在應用Redo
時,Data File上會需要多少讀/寫動作‧這二個因素都可以由Checkpoint空制‧                                           
                                                                                                                 
Checkpoint會保證在特定時點,所有接近特定SCN的資料改變,都會由DBWn寫到Data File‧在instance當機的事件中,只有SMON必
須重作(Rolling Forward)從上一個儲存點位置產生的Redo Data‧ 無論是否有COMMIT,所有在那個位置之前作的改變都已在Data
File中,所以明顯地,沒有必要使用Redo Data來重新建構在那Checkpoint之前已COMMIT或未COMMIT的交易‧ 對於未COMMIT的交易
必需Rolling Backup的Undo Data,Undo Segment可以得到(最近一次Checkpoint後所有uncommitted的都將自Rolling Forward)‧
                                                                                                                 
Checkpoint位置所包含的資料愈新,Instance Recovery就愈快‧ 如果Checkpoint位置包含完整的最近資料,Oracle就不再需要去
做Rolling Forward,而instance可以立即開啟供使用者使用,而且並行做 Rolling Backup(Undo)‧但這要付出極大的代價‧如果
要提前Checkpoint位置,DBWn必須要把更動過的Data Block(又稱Dirty Block)寫入磁碟‧過量的磁碟I/O會嚴重削弱效能‧但另一
方面,如果你讓 DBWn落後太遠,會使得SMON在當機後,必須處理數百MB的Redo Data,並在Data File上進行數百萬次的讀/寫操作
,在Instance Failure後的MTTR會延長為數個小時‧                                                                   
                                                                                                                 
MTTR常會被建立在服務層級的協議中‧它可以由instance參數「fast_start_mttr_target」控制,設定的單位是秒‧通常,這個參
數設定的時間越短,在當機後要開啟資料庫就愈快,但線上效能會比較差‧                                               
範例: ALTER SYSTEM SET fast_start_mttr_target=60;                                                                
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(508)

  • 個人分類:Oracle
▲top
  • 9月 13 週六 200816:56
  • Oracle學習心得-Instance Failure、Instance Recovery


<Instance Failure>
instance失敗就是非正常地關閉instance,通常就是指當機‧這可能是由停電、突然關掉等等原因所造成‧instance失敗的影響,
在功能上,與提出SHUTDOWN ABORT命令一樣‧你或許聽過有人說「把資料庫當掉」,其實他們是指SHUTDOWN ABORT命令‧       
                                                                                                                 
在instance失敗後,資料庫或許遺失了已提交(committed)的交易儲存至磁碟,但卻將未提交(uncommitted)的交易儲存至磁碟‧這
是已毀損之資料庫的定義‧ 此狀況是因為Oracle更新的是資料庫緩衝快取(database buffer cache)中的資料區塊(Data Block)和
復舊區段(Undo Segment)的資料區塊(Data Block),並不是磁碟上的Data Block,請記住‧                                 
                                                                                                                 
DBWn 會把被改變區塊(被稱為Dirty Block)寫到資料檔(Data File)‧DBWn會以效能為導向的演算法,去選擇將被改變區塊(被稱為
Dirty Block)寫入至磁碟‧所以會造成最少在作用中的區塊(Data Block)會先被寫入,畢竟,要寫入每秒都在持有改變的區塊,意
義比較不大‧但這意謂著,有可能已提交(committed)的交易可能還沒有寫入資料檔(Data File),而未被提交(uncommitted) 的交
易已被寫入‧                                                                                                     

 

<Instance Recovery>

如果資料庫發生Instance Failue造成資料毀壞,重新啟動Oracle後,Oracle會偵測到此事實,並自動強制執行Instance Recovery
‧Oracle會從Online Redo Log File內找出最近的Checkpoint點,逐一開始進行Rolling Forward(Redo),此時Redo Record內都會
記錄修改後的值和修改前的復舊值(Undo Data),要記住Redo Log內的新值和復舊值(Undo Data)記錄的單位都是Block‧        
                                                                                                                 
另外Redo Record也會記錄Transactions Data,所以當 Oracle做完Rolling Forward時,此時Undo Segment會有當機前完整的交易
情況,Oracle可以明確得知那些Transactions是committed和uncommitted‧                                               
範例: //Creates a 5.2 change to update transaction table in undo segment header                                  
         (1)CHANGE #1 TYP:0 CLS:25 AFN:3 DBA:0x00c0012e SCN:0x0000.0ac86eb8 SEQ:1 OP:5.2 ktudh redo: slt: 0x0010    
              sqn: 0x0000475a flg: 0x0012 siz: 96 fbi: 0 uba: 0x00c04d20.234b.0e pxid: 0x0000.000.00000000             
                                                                                                                  
         //A 5.4 change is created for a commit                                                                     
         (2)CHANGE #1 TYP:0 CLS:25 AFN:3 DBA:0x00c0012e SCN:0x0000.0ac86ebf SEQ:1 OP:5.4 ktucm redo: slt: 0x0010    
              sqn: 0x0000475a srt: 0 sta: 9 flg: 0x0                                                                  
                                                                                                                 
當Oracle做完Rolling Forward時,現行的Database Buffer Cache已回復成當機前的狀態‧Oracle將會立即開放給使用者登入‧但
是此時會有二種情況需要特別注意:                                                                                  
(1)上次當機前,已COMMIT但資料(新值和復舊值Undo Data)尚未寫入至 Data File,此情況Oracle會以相關機制和演算法,DBWn將
   選適當時間寫入至Disk中的Data File‧                                                                           
(2)上次當機前,未COMMIT的交易,但已經寫入Data File,由於Oracle之前已經先做Rolling Forward(Redo),相關 Undo Segment
   將有當機前完整的Transaction Data、Undo Data,開始針對那些未COMMIT的交易做Rolling Backup(Undo)‧由於Oracle在做完
   Rolling Forward就會立即開放資料庫讓使用者登入使用,此時如果有使用者查詢的資料剛好是當機前未COMMIT的交易,Oracle
   會將查詢導至Undo Segment‧                                                                                    
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(1,314)

  • 個人分類:Oracle
▲top
  • 9月 09 週二 200822:08
  • Oracle學習心得-操作資料庫資料

<<感謝Anne的鼓舞,不然我可能還只是懂Oracle SQL面>>
 
當使用者執行UPDATE命令,Oracle會依序做如下的動作:                                                               
(1)Oracle會先找出欲被更改的資料列的Data Block,如果該 Data Block並不存在記億體中的快取,會從Disk找出,並復製至資料
   庫緩衝快取(database buffer cache)。                                                                           
                                                                                                                 
(2)接者再將Redo Data寫入日誌緩衝區(log buffer)。Redo Log內會記錄像Redo Byte Address(RBA)、Database Block Address 
   (DBA)、Undo Block Address(UBA)等等‧                                                                          
                                                                                                                 
(3)Oracle將Undo Data寫入復舊區段(Undo Tablespace裡的某個Undo Segment)。                                          
                                                                                                                 
(4)Oracle將欲更改的新值寫入Data Block(記憶體中的)。                                                              
                                                                                                                 
(5)如果在改變中,有其他使用者在執行查詢,而且剛好查到這剛被更改的資料列但又尚未被COMMIT,此時 Oracle會把這使用者導
   至復舊區段(Undo Segment)。                                                                                    
                                                                                                                 
(6)當使用者UPDATE完後,下達COMMIT命令後。 Oracle會以近乎即時的方式,將日誌緩衝區(log buffer)的資料寫入線上重作日誌
   檔(online redo log files),但此時DBWn不見得會同步將已被改變的Data Block(或稱為Dirty Block)寫入至Data File,因為
   DBWn 會依最佳效率的演算法去做判斷,何時才將Dirty Block寫入Data File。如果此時伺服器當掉(或Instance當掉),Oracle
   的SMON 會從線上重作日誌檔(online redo log files)最近一次的Checkpoint位置,依序逐一做Rolling Forward(Redo),以便
   在Instance開起來,將相關資料修成正確的。                                                                      
                                                                                                                 
   相同地,有時DBWn的演算法會造成尚未COMMIT的Data Block寫入至Data File,如果此時伺服器當掉(或Instance當掉)。Oracle
   的SMON會從復舊區段(Undo Tablespace裡的某個Undo Segment)發現該資料尚未被COMMIT,但Data File裡的Data Block 內的資
   料列卻已經被更改,此時Oracle會從復舊區段找出Undo Data去修正此一問題‧為什麼Oracle可以從復舊找出未COMMIT的交易,
   因為Oracle會確保該交易COMMIT或ROLLBACK前,該復舊資料空間都不能被回收覆寫‧ 簡單來說復舊資料會被區分成二種:「作
   用中復舊」是倒回進行中交易所需要的復舊資料,在交易完成前,此資料絕不會被覆寫‧ 「已過期復舊」是已提交(Commit)之
   交易的復舊資料‧                                                                                              
                                                                                                                 
(繼續閱讀...)
文章標籤

香 香蕉皮 發表在 痞客邦 留言(0) 人氣(2,003)

  • 個人分類:Oracle
▲top
1

自訂側欄

自訂側欄

個人資訊

香 香蕉皮
暱稱:
香 香蕉皮
分類:
不設分類
好友:
累積中
地區:

熱門文章

  • (15,588)Oracle學習心得-修改Client端的NLS_LANG設定
  • (11,346)Oracle-縮小區段(Shrink Space)
  • (2,260)Oracle學習心得-V$PARAMETER、V$PARAMETER2、V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2、V$SPPARAMETER之間的差異
  • (1,314)Oracle學習心得-Instance Failure、Instance Recovery
  • (754)Oracle學習心得-Dynamic Performance View

文章分類

  • Oracle (10)
  • 未分類文章 (1)

最新文章

  • Oracle的RowID、SQL Server和Sybase的RID
  • 遠堂結婚的短片
  • Oracle-縮小區段(Shrink Space)
  • Oracle學習心得-V$PARAMETER、V$PARAMETER2、V$SYSTEM_PARAMETER、V$SYSTEM_PARAMETER2、V$SPPARAMETER之間的差異
  • Oracle學習心得-常用的Dynamic Performance View
  • Oracle學習心得-Dynamic Performance View
  • Oracle學習心得-指定讀取那個參數檔
  • Oracle學習心得-Oracle Instance的刪除和修改
  • Oracle學習心得-修改Client端的NLS_LANG設定
  • Oracle學習心得-參數檔(initialization parameter file)的修改

最新留言

    動態訂閱

    文章精選

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: