Oarcle學習筆記之--- FAQ收集
2024-07-21 02:40:33
供稿:網友
1、實例和SID的關系是什么?實例和數據庫是怎樣的關系?
經常有人問SID 是什么?在Oracle 系統中SID 是一個經常出現的變量,如環境變量ORACLE_SID, 初始化文件initSID.ora,那究竟什么是SID 呢?其實SID 就是Oracle 實例的標識,不同的SID 對應不同的內存緩沖(SGA)和不同的后臺進程。這樣一來我們就可以得當在一臺物理的服務器上可以有多個SID 的數據庫實例。
一個運行著的ORACLE數據庫就可以看成是一個ORACLE SERVER,該SERVER由數據庫(Database)和實例(Instance)組成,在一般的情況下一個ORACLE SERVER包含一個實例和一個與之對應的數據庫,但是在非凡情況下,如8i的OPS,9i的RAC,一個SERVER中一個數據庫可以對應多個實例。
一系列物理文件(數據文件,控制文件,聯機日志等)的集合或與之對應的邏輯結構(表空間,段等)被稱為數據庫,簡單的說,就是一系列與磁盤有關系的物理文件的組成。ORACLE內存結構和后臺進程被成為數據庫的實例,一個實例最多只能安裝(Mount)和打開(Open)在一個數據庫上,負責數據庫的相應操作并與用戶交互。
2、Oracle數據庫和實例的關系是什么?
數據庫是由物理文件和存取數據文件的實例組成,當存取數據文件的實例是一個的時候,數據庫被稱做單節點數據庫。這是我們看到的最多的數據庫形式。當然還有一種多節點數據庫,就是一個以上的實例共同訪問一個數據庫(或者說共同訪問一組數據文件), 更好的提供穩定性和并行處理能力。這在8i中被稱為OPS(Oracle Parallel Server ),在Oracle9i 中被稱為RAC(real application cluster)。在這種數據庫中。兩個/多個實例分別在不同服務器上,所有Oracle 數據文件在共享的磁盤陣列上,多個服務器上的實例可以同時工作,他們通過一個內部的網絡進行通信。假如一臺服務器不能提供服務的話,另一臺會接管它的工作,非凡是在要害的業務有很大的潛力。
3、在運行的數據庫中數據文件中是不是可能存在沒有被提交的數據?
這是可能存在的,因為用戶數據文件的數據是由DBWR寫入的,DBWR是一個很底層的后臺進程,不負責與用戶交互。用戶的交互是由LGWR完成的。
4、在問題3中,假如存在沒有寫入的數據,那么機器忽然斷電,數據完整性會不會損壞?
不會的,因為數據庫的完整性是LGWR來保證的,而且ORACLE保證了DBWR寫入數據文件的任何修改已經被記錄在重做日志文件中。當系統再次啟動的時候,通過讀取重做日志文件就可以知道那些數據沒有被提交。這時候ORACLE 會自動回滾那些數據。所以說聯機日志的損壞,非凡是當前聯機日志的損壞,對數據庫的影響是巨大的,可能會導致數據庫的不完整。
5、數據文件損壞會丟失數據嗎?
可以這么說,假如你有備份和歸檔,就不會。因為所有對數據修改的記錄都在重做日志中有記錄,所以不會丟失數據,你只要恢復以前的備份再用歸檔日志文件恢復和當前的在線重做日志就可以恢復所有數據。
6、在線重做日志損壞會丟失數據嗎?
在線日志對數據庫的損壞是極大的,所以不僅可能丟失數據,還可能引起數據庫的不同步。在重做日志中的所有commit的記錄都會丟失,這也是Oracle 為什么要對在線重做日志文件做鏡像的原因。任何的數據丟失都是不答應的。
7、我在事務能不能指定不寫回滾段?
不可以的,寫回滾段是ORACLE保證一致性讀和事務一致性的根本?;貪L段是高寫入段,建議把它放到單獨的設備上來。 對于DDL語句,如DROP,TRUNCATE卻可以不寫回滾段(沒有UNDO信息),所以對于整個表的刪除,假如數據量比較大,建議用Truncate Table的方法。 不寫聯機日志也是不可能的,但可以在某些特定操作中,可以寫很少的聯機日志,如以NOLOGGING的方式通過Create table tablename as select創建表,或以Append的方式Insert數據到表,或直接載入等操作。