oracle筆記(七)

三、內存結構:
1、系統全局區SGA(System Glbal Area):共享的系統內存區域。SGA由三部分組成:數據緩衝區、日誌緩衝區、共享池。
(1) 數據緩衝區(Database Buffer Cache): 存儲由磁盤數據文件讀入的數據,所有用戶共享。數據緩衝區大小由參數db_block_buffers確定。
 。數據緩衝區大小:db_block_buffers * db_block_size
 。參數文件位置:
 Windows NT: D:/oracle/admin/db_name/pfile/init.ora
 UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora
 
 // Dirty: 數據被修改而未寫盤。Pinned: 未修改的數據
 。LRU( Least Recently Used): 最近最少使用原則
 
(2) 日誌緩衝區(Log Buffer Cache): 存儲數據庫修改信息,由LGWR將日誌緩衝區數據寫入磁盤日誌文件組。
 。大小由參數log_buffer確定
 
(3) 共享池(Shared Pool): SQL 緩衝區及數據字典區。對於SQL、PL/SQL程序進行語法分析、編譯的內存區域。
 。大小由參數SHARED_POOL_SIZE來確定。(在參數文件中,單位爲字節)
 。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)
 。
 
 [C*] SQL 語句執行計劃:
  Rule_Based: 基於規則,只考慮語句運行效率,不考慮成本。
  Cost_Based: 基於成本,考慮代價,硬件資源佔用小。
。SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size

[在實用情況中,SGA當然是越大越好,但最大不要超過系統可用內存的55%~57%。]

。查詢SGA及數據參數取值:
SVRMGR> show sga
SVRMGR> show parameter
SVRMGR> show parameter db
SVRMGR> show parameter log
SVRMGR> show parameter 參數名稱

SQL> select * from v$sga;
SQL>select * from v$sgastat;

查詢數據庫名稱:SQL> select name from v$database;
查詢數據庫實例名稱:SQL> select instance_name from v$instance;

2、程序全局區PGA(Pragram Global Area): 非共享區域,主要是用戶編程時變量、數組工作區域。

3、排序區SORT AREA:用戶使用order by排序、彙總時臨時工作區域。排序區大小由參數SORT_AREA_SIZE確定。

4、大區(Large Pool): 使用於數據備份工具Rman, 只用在Oracle8以上的版本數據庫,大區的大小由參數:Large_Pool_size確定。

5、Java語言區(Java Pool): 用於Oracle 8i、Oracle9i中的Java語言。Java區的大小由參數Java_Pool_Size確定。

四、Oracle 實例的進程結構:
1、什麼是Oracle實例?
  數據庫啓動時,系統分配SGA內存區域,同時啓動後臺進程,該SGA與後臺進程合稱爲一個Oracle實例(Instance)。
Instance ==> SGA + Background Processes

數據庫與實例相聯繫,有一個數據庫就有一個實例。實例名用參數instance_name表示,數據庫名用參數db_name表示。

 。數據庫實例名:
 instance_name (Oracle參數)
 ORACLE_SID(操作系統環境變量)
 在Unix系統中選擇數據庫實例:
 $ORACLE_SID=ora8i
 $export ORACLE_SID
 存取另一個數據庫時:
 $ ORACLE_SID=ora835
 $ export ORACLE_SID
 $ svrmgrl
 在Windows NT/2000中選擇數據庫實例:
 c:/> set ORACLE_SID=ora8i
 C:/> svrmgrl
 C:/> set ORACLE_SID=ora835
 C:/> svrmgrl
 [*] 在Windows NT/2000中,數據庫實例名定義在註冊表中。
 
2、Oracle實例的進程結構:
 Oracle進程:單進程
    多進程==> 用戶進程、服務器進程、後臺進程。
 Dnnn(Dispatcher): 調度進程
 ARCH:歸檔進程
 PMON: 進程監控
 SMON: 系統監控
 CKPT: checkpoint
 RECO: Recovery
 
 [*] 進程數量的限制參數:Processes,Oracle數據庫進程數Processes < Unix 操作系統核心參數SEMMNS(這個參數指定Unix的最大進程數)。
 
 // 查詢後臺進程及說明
 SQL> select name, description from v$bgprocess;
(1) 用戶與服務器進程
 。用戶進程(User Precess)在用戶運行應用程序時自動產生。

[*] 數據存取方法:
a. 用戶發出查詢命令,產生user進程,server進程查找內存。
b. server 進程在內存沒有找到數據時,則server進程從數據文件中讀數據,則server進程在LRU找空閒塊。
c. 將LRU中的dirty塊--> Dirty List
d. Dirty List超長(threshold), 通知DBWR刷新緩衝區。
e. 從磁盤讀數據進入空閒內存。

(2) 後臺進程:
 [A]DBWR:數據寫入進程。該進程將數據緩衝區數據寫入磁盤數據文件,是進行數據緩衝區管理的後臺進程。
 
 設置DBWR進程數量參數:DB_WRITE_PROCESSES=1-10
 進程名稱依次爲:DBW0, DBW1, ... DBW9
 
 [B]LGWR:日誌寫入進程。將日誌緩衝區日誌信息寫入磁盤日誌文件組,在日誌切換時,再將日誌信息由歸檔進程ARCH寫入磁盤或磁帶,產生歸檔日誌。一個數據庫只有一個LGWR日誌寫入進程。
 
 [C]PMON(Process Monitor): 進程監控。在用戶進程中斷時,負責清理該用戶所佔用的硬件資源。
 
 [D]SMON(System Monitor):系統監控。負責清理用戶不再使用的臨時段。
 
 [E]ARCH:歸檔進程。該進程在日誌切換時,負責將日誌信息寫到指定的磁盤存儲目錄,產生歸檔日誌,是與數據庫備份有關的一個後臺進程。在缺少狀態下該進程不存在(因爲oracle默認安裝狀態爲下日誌爲非歸檔方式)。
 [*] 與ARCH有關的數據庫參數:
 。啓動歸檔進程參數:log_archive_start=true (缺省爲false)
 。確定歸檔日誌文件磁盤存儲目錄:log_archive_dest=目錄名
 log_archive_dest=/home/oracle/archive
 log_archive_dest=d:/oracle/archive
 。確定歸檔文件存儲格式:log_archive_format=%t.%s.arc  
 /* %t:表示線程號 %s:表示日誌序列號,這樣文件不會同名。可以不要%t, 擴展名自己給,也可以不要擴展名。如%s.log。如果寫成%S(大寫的S),則文件名前面加零對齊。如123.log 會變成00123.log這種形式。*/
 
 。確定歸檔日誌文件鏡象目錄:
 log_archive_duplex_dest=鏡像目錄名 (Oracle8以上)
 log_archive_duplex_dest=/home1/oracle/archive
 
 。Oracle8i啓用新的日誌文件存儲目錄:
 log_archive_dest_n = 'Location=目錄名'(Oracle8i以上) n<=5 // 在oracle9i,n <= 10
 
 log_archive_dest_1 = 'location=/home1/oracle/archive'
 log_archive_dest_2 = 'location=/home2/oracle/archive'
 ...
 log_archive_dest_5 = 'location=/home5/oracle/archive'
 
 [注意:]歸檔日誌存儲目錄要麼爲2個,即使用dest and duplex_dest這種方式,要麼爲5個,即使用dest_n這種方式,兩種方式不能混用。
 
 。失效參數(Oracle8i):
 log_archive_dest_state_n=DEFER(失效)
 log_archive_dest_state_n=ENABLE(生效)
 
 //使相應目錄失效:log_archive_dest_state_1 = DEFER
 [*]也可以在線設置失效:SQL> alter system set log_archive_dest_state_1=defer;
 
 。啓動多個歸檔進程參數:log_archive_max_processes = 1~10  //要啓動幾個就寫幾
 歸檔進程名稱依次爲:ARCH0, ARCH1, ... ARCH9
 
 // 以上參數查詢請在svrmgrl中使用:show parameter log
 
 [SVRMGR> shutdown abort 是比shutdown immediate更有效的關閉數據庫的命令]
 
 [F] CKPT:檢驗點(Checkpoint)進程,用來同步各個數據文件。Checkpoint_Change#。
 
 a. checkpoint產生的六個條件[參考PowerPiont教程:dba_結構.ppt P61]。
 
 // DBA強制產生檢驗點:SQL> alter system checkpoint;
 
 b. 檢驗點的幾個參數
/* SVRMGR> show parameter checkpoint
NAME                                TYPE    VALUE
----------------------------------- ------- ------------------------------
log_checkpoint_interval             ??    10000
log_checkpoint_timeout              ??    1800
log_checkpoints_to_alert            ???  FALSE
*/

五、Oracle連接配置結構

3、多線程服務器體系結構MTS(Multithreaded Server)

SVRMGR> show parameter mts;

[第二章 數據庫啓動與關閉]

一、數據庫啓動:
Unix:
 login: oracle
 Password: xxxx
 $
 $ORACLE_HOME: /home/app/oracle/product/8.1.7
 $ svrmgrl
 SVRMGR>connect internal
 SVRMGR> startup
 SVRMGR> exit
 [*]啓動監聽進程:
 $lsnrctl start
 如果在啓動時報錯,檢查:/home/app/oracle/product/8.1.7/network/admin/listener.ora
 $lsnrctl stop  // 停止監聽進程
 $lsnrctl status  // 顯示監聽進程狀態
 
二、數據庫啓動過程:
1、啓動數據庫實例: ORACLE instance started
 。讀取參數文件
 。分配SGA區
 。啓動後臺進程
 // 如果啓動出現問題,有可能是因爲參數文件有問題或者內存不足。
2、數據庫安裝:Database mounted
 。讀取控制文件
 。打開控制文件
 // 如果啓動出現問題,可能是控制文件出現問題。
3、打開數據庫:Database opened
 。打開全部數據文件
 。打開全部日誌文件
 // 如果有一個文件出現問題,則數據庫不能啓動。
 
數據庫文件讀取順序:參數文件 ==> 控制文件 ==> 日誌、數據文件,三類文件中不能有一個文件損壞,否則數據庫不能啓動。

4、數據庫啓動過程中可以使用的選項:

SVRMGR> startup OPEN --1、2、3 // 加OPEN與不加OPEN效果相同,1、2、3指三個步驟:啓動實例 ==> 安裝數據庫 ==> 打開數據庫
SVRMGR> startup MOUNT --1、2 啓動實例=> 安裝數據庫
SVRMGR> startup NOMOUNT -- 1  只啓動數據庫實例

(1) OPEN用於數據庫的正常啓動(或不加OPEN)。
(2) MOUNT的使用方式:
 。用於修改數據庫歸檔方式
 。用於數據庫恢復。Recovery命令在mount狀態使用。
在mount狀態,所有v$xxxx 數據字典可以使用,所有alter database命令可以使用。

(3) NOMOUNT的使用方式:
 。創建控制文件
 。創建新的數據庫
 
(4) 數據庫在MOUNT下可以使用的選項:
SVRMGR> startup MOUNT
SVRMGR> Alter database ARCHIVELOG;  // 將數據庫由非歸檔方式修改爲歸檔方式
[*] SVRMGR> Alter database NOARCHIVELOG; // 將數據庫由歸檔方式修改爲非歸檔方式
// SVRMGR> archive log list
// SVRMGR> select log_mode from v$database;
SVRMGR> Alter database OPEN;   // 將數據庫由MOUNT直接到OPEN狀態。
SVRMGR> Alter database OPEN READ ONLY; // 整個數據庫以只讀方式打開
SVRMGR> Alter database OPEN READ WRITE; // 整個數據庫以讀寫方式打開(系統缺省方式,不需要寫上READ WRITE)

[2002.05.14]
//=====================================================================================================================

(5) 數據庫在OPEN下可以使用的選項:
[A]
SVRMGR> startup PFILE=參數文件名稱及路徑

// 在有兩個數據庫存在的情況下,可以用如下方法同時啓動兩個數據庫。
SVRMGR> startup PFILE=第一個數據庫的參數文件名稱及路徑
SVRMGR> startup PFILE=第二個數據庫的參數文件名稱及路徑

[B]
SVRMGR> startup RESTRICT // 限制性數據庫啓動命令,以這種方式啓動數據庫後,具有restricted session權限的用戶可以連接數據庫,其他用戶不能連接。

DBA可以指定用戶連接:
SQL> grant restricted session to scott;  // 指定權限
SQL> revoke restricted session from scott; // 收回權限

修改限制:
SQL> Alter system disable restricted session; // 解禁
SQL> alter system enable restricted session;  // 禁止

[C]
SVRMGR> startup FORCE // 強制性數據庫啓動命令

[D*] 允許多個選項同時使用,順序沒有關係:
SVRMGR> startup PFILE=c:/init.ora FORCE MOUNT
SVRMGR> startup force restrict pfile=c:/init.ora

三、數據庫關閉命令:
在關閉服務器之前,必須使用shutdown命令先關閉數據庫,再關閉操作系統。

SVRMGR> shutdown normal  // 正常關機。系統等待所有用戶從數據庫中正常退出,很難關掉。
SVRMGR> shutdown immediate // 立即關機。中斷現在連接,回退未提交事務,不再接收用戶的連接請求。(有的用戶數據會丟失)
SVRMGR> shutdown abort  // 異常關機。只關閉實例,釋放內存,不保證數據完整性。儘量少用。
SVRMGR> shutdown transactional // 事務終結後關機。等待用戶提交數據後關閉數據庫。

[補充內容]
四、數據庫啓動過程中失敗恢復方法:

1、第一步不啓動(實例):參數文件錯誤:參數錯誤、路徑、文件名、參數設置錯誤等。

2、第二步不能mount:控制文件壞。檢查有沒有鏡像文件,如果沒有,需要重新創建控制文件。

3、第三步,數據庫不能Open。數據文件或日誌損壞。

(1) 數據文件(Datafile)被破壞或被誤刪除時數據庫的恢復方法。
SVRMGR> startup mount

[A]如果數據庫運行在ARCHIVELOG模式下,使用以下命令:
SVRMGR> alter database datafile '被刪數據文件名及路徑' OFFLINE;
// 在歸檔方式下,這個被刪的文件可能通過歸檔日誌恢復數據。

打開數據庫:SVRMGR> Alter database open;

[B]如果數據庫運行在NOARCHIVELOG模式下,使用以下命令:
SVRMGR> alter database datafile '被刪數據文件名及路徑' OFFLINE DROP;
// 在非歸檔方式下,被刪數據文件的內容絕對不可能恢復,所以只好DROP掉。

打開數據庫:SVRMGR> Alter database open;

(2) 日誌文件(Redo Log Files)被破壞或被誤刪除時數據庫的恢復方法。
SVRMGR> startup mount

刪除被物理破壞的日誌文件組:
SVRMGR> Alter database drop logfile group n;

增加已經被物理破壞的日誌文件組:
SVRMGR> Alter database add logfile group n('日誌成員文件', '日誌成員文件') size xxM;

SVRMGR> Alter database open;

// 如果當前日誌被破壞,則恢復操作將比較複雜,必須通過數據庫備份來恢復(不完全恢復)。

4、重新創建控制文件(Control Files):
創建控制文件的語法:
SVRMGR> startup nomount
    Create controlfile database 數據庫名稱
    logifle
    group 1 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    group 2 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    ...
    noresetlogs
    datafile
    '第一個數據文件名稱及路徑' size xxM,  // xxM中不能出現小數點兒,如果有小數,就使用K,如果仍然有小數,則使用字節。
    '第二個數據文件名稱及路徑' size xxM,
    ...
    character set zhs16gbk;
   
SVRMGR> startup nomount
  Create controlfile database ora8i
  logfile
  group 1 ('d:/oracle/oradata/ora8i/redo01.dbf') size 1M,   
  group 2 ('d:/oracle/oradata/ora8i/redo02.dbf') size 1M,
  group 3 ('d:/oracle/oradata/ora8i/redo03.dbf') size 1M,
  noresetlogs
  datafile
  'd:/oracle/oradata/ora8i/system01.dbf' size 70M,
  'd:/oracle/oradata/ora8i/rbs01.dbf' size 520M,
  ...
  character set zhs16gbk;
 
 

SQL> select bytes/1024/1024, blocks, file_name from dba_data_files;
// 通過這個命令來查詢數據文件的大小,以Oracle中查詢的數據爲準,不要根據操作系統顯示的文件大小來決定,建議事先做好備份。

[*C] 修改數據庫名稱時,需要重新創建數據庫控制文件,語法如下(注意與上面的語法稍有不同):
SVRMGR> startup nomount
    Create controlfile set database 新數據庫名稱  // 這一行有不同,注意:數據庫的名稱一般不要超過5個字符。
    logifle
    group 1 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    group 2 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    ...
    resetlogs       // 這一行也有不同
    datafile
    '第一個數據文件名稱及路徑' size xxM,  // xxM中不能出現小數點兒,如果有小數,就使用K,如果仍然有小數,則使用字節。
    '第二個數據文件名稱及路徑' size xxM,
    ...
    character set zhs16gbk;
   
五、檢測數據庫文件工具:DBVerify

使用方法:
C:/> dbv file=文件名及路徑 logfile=輸出結果文件名 blocksize=數據塊大小(缺省是2K,否則指出) start=起始數據塊 end=終止數據塊

可以檢測數據、日誌及控制文件等。如果不加start 和 end,則默認檢測整個數據文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章