1,範式java
7大範式:1NF, 2NF,3NF,BCNF,4NF,5NF,6NFmysql
什麼叫normalization?Denormalization?程序員
Normalization是數據庫規範化,denormalization是數據庫逆規範化。算法
在設計和操做維護數據庫時,關鍵的步驟就是要確保數據正確地分佈到數據庫的表中。使用正確的數據結構,不只便於對數據庫進行相應的存取操做,並且可 以極大地簡化應用程序的其餘內容(查詢、窗體、報表、代碼等)。正確進行表設計的正式名稱就是」數據庫規範化」。目的:減小數據庫中數據冗餘,增進數據的 一致性。sql
範式概念:數據庫
1)1NF:目標就是表中每列都不可分割;
2)2NF:目標就是表中的每行都是有標識的。前提是知足了1NF. 當關鍵字爲單field時,必定知足2NF。當關鍵字爲組合field時(即超過一個field),不能存在組合關鍵字中有某個字段可以決定非關鍵字段的 某部分。非主field非部分依賴於主field,即非關鍵字段必須徹底依賴於一組 組合關鍵字,而不是組合關鍵字的某一部分。
3)3NF:目標是一個table裏面全部的列不依賴於另一個table裏面非關鍵的列。前提是知足了2NF,不存在某個非關鍵字段決定另一個非關鍵字段。即:不存在傳遞依賴(關鍵字x->非關鍵屬性y->非關鍵屬性z)
4)BCNF:前提是知足了2NF,不存在某個非關鍵字段決定另一個非關鍵字段。也不存在某個關鍵字段決定另一個關鍵字段。即:在3NF基礎上,加上約束:不存在某個關鍵字段決定另一個關鍵字段。
1 第一範式(1NF)
在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。所謂第一範式(1NF)是指數 據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。若是出現重複的屬性,就可能須要 定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。在第一範式(1NF)中表的每一行只包含一個實例的信息。例如,對於圖 3-2 中的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表 中只出現一次。簡而言之,第一範式就是無重複的列。
2 第二範式(2NF)
第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表 中的每一個實例或行必須能夠被唯一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。如圖3-2 員工信息表中加上了員工編號(emp_id)列,由於每一個員工的員工編號是唯一的,所以每一個員工能夠被唯一區分。這個唯一屬性列被稱爲主關鍵字或主鍵、主 碼。第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這 一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二 範式就是非主屬性非部分依賴於主關鍵字。
3 第三範式(3NF)
知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例 如,存在一個部門信息表,其中每一個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那麼在圖3-2的員工信息表中列出部門編號後就不能再將 部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。若是不存在部門信息表,則根據第三範式(3NF)也應該構建它,不然就會有大量的數據冗餘。簡 而言之,第三範式就是屬性不依賴於其它非主屬性。
例子:
第一範式(1NF):數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。
例如,以下的數據庫表是符合第一範式的:字段1 字段2 字段3 字段4
而這樣的數據庫表是不符合第一範式的:字段1 字段2 字段3 字段4 字段31字段32
很顯然,在當前的任何關係數據庫管理系統(S)中,傻瓜也不可能作出不符合第一範式的數據庫,由於這些S不容許你把數據庫表的一列再分紅二列或多列。所以,你想在現有的S中設計出不符合第一範式的數據庫都是不可能的。
第二範式(2NF):數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些字段決定非關鍵字段的狀況),也即全部非關鍵字段都徹底依賴於任意一組候選關鍵字。
假定選課關係表爲Ss(學號, 姓名, 年齡, 課程名稱, 成績, 學分),關鍵字爲組合關鍵字(學號, 課程名稱),由於存在以下決定關係:
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
這個數據庫表不知足第二範式,由於存在以下決定關係:
(課程名稱) → (學分)
(學號) → (姓名, 年齡)
即存在組合關鍵字中的字段決定非關鍵字的狀況。
因爲不符合2NF,這個選課關係表會存在以下問題:1) 數據冗餘:同一門課程由n個學生選修,」學分」就重複n-1次;同一個學生選修了門課程,姓名和年齡就重複了-1次。2) 更新異常:若調整了某門課程的學分,數據表中全部行的」學分」值都要更新,不然會出現同一門課程學分不一樣的狀況。3) 插入異常:假設要開設一門新的課程,暫時尚未人選修。因爲尚未」學號」關鍵字,課程名稱和學分也沒法記錄入數據庫。4) 刪除異常:假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。可是,與此同時,課程名稱和學分信息也被刪除了。很顯然,這也會致使插 入異常。
把選課關係表Ss改成以下三個表:
學生:Sn(學號, 姓名, 年齡);
課程:s(課程名稱, 學分);
選課關係:Ss(學號, 課程名稱, 成績)。
這樣的數據庫表是符合第二範式的,消除了數據冗餘、更新異常、插入異常和刪除異常。
另外,全部單關鍵字的數據庫表都符合第二範式,由於不可能存在組合關鍵字。
第三範式(3NF):在第二範式的基礎上,數據表中若是不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三 範式。所謂傳遞函數依賴,指的是若是存在」A → → 「的決定關係,則傳遞函數依賴於A。所以,知足第三範式的數據庫表應該不存在以下依賴關係:關鍵字段 → 非關鍵字段x → 非關鍵字段y
假定學生關係表爲Sn(學號, 姓名, 年齡, 所在[]學院[], 學院地點, 學院電話),關鍵字爲單一關鍵字」學號」,由於存在以下決定關係:
(學號) → (姓名, 年齡, 所在[]學院[], 學院[]地點, []學院[]電話)
這個數據庫是符合2NF的,可是不符合3NF,由於存在以下決定關係:
(學號) → (所在[]學院[]) → ([]學院[]地點, []學院[]電話)
即存在非關鍵字段」[]學院[]地點」、」[]學院[]電話」對關鍵字段」學號」的傳遞函數依賴。
它也會存在數據冗餘、更新異常、插入異常和刪除異常的狀況,讀者可自行分析得知。
把學生關係表分爲以下兩個表:
學生:(學號, 姓名, 年齡, 所在[]學院[]);
[]學院[]:([]學院[], 地點, 電話)。
這樣的數據庫表是符合第三範式的,消除了數據冗餘、更新異常、插入異常和刪除異常。
鮑依斯-科得範式(BCNF):在第三範式的基礎上,數據庫表中若是不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合BCNF.
假設倉庫管理關係表爲Ssanag(倉庫, 存儲物品, 管理員, 數量),且有一個管理員只在一個倉庫工做;一個倉庫能夠存儲多種物品。這個數據庫表中存在以下決定關係:
(倉庫, 存儲物品) →(管理員, 數量)
(管理員, 存儲物品) → (倉庫, 數量)
因此,(倉庫, 存儲物品)和(管理員, 存儲物品)都是Ssanag的候選關鍵字,表中的惟一非關鍵字段爲數量,它是符合第三範式的。可是,因爲存在以下決定關係:
(倉庫) → (管理員)
(管理員) → (倉庫)
即存在關鍵字段決定關鍵字段的狀況,因此其不符合BCNF範式。它會出現以下異常狀況:1) 刪除異常:當倉庫被清空後,全部」存儲物品」和」數量」信息被刪除的同時,」倉庫」和」管理員」信息也被刪除了。2) 插入異常:當倉庫沒有存儲任何物品時,沒法給倉庫分配管理員。3) 更新異常:若是倉庫換了管理員,則表中全部行的管理員都要修改。
把倉庫管理關係表分解爲二個關係表:
倉庫管理:Ssanag(倉庫, 管理員);
倉庫:Ss(倉庫, 存儲物品, 數量)。
這樣的數據庫表是符合BCNF範式的,消除了刪除異常、插入異常和更新異常。
簡言之數據庫五大範式:
第一範式:對於表中的每一行,必須且僅僅有惟一的行值.在一行中的每一列僅有惟一的值而且具備原子性.
(第一範式是經過把重複的組放到每一個獨立的表中,把這些表經過一對多關聯聯繫起來這種方式來消除重複組的)
第二範式:第二範式要求非主鍵列是主鍵的子集,非主鍵列活動必須徹底依賴整個主鍵。主鍵必須有惟一性的元素,一個主鍵能夠由一個或更多的組成惟一值的列組 成。一旦建立,主鍵沒法改變,外鍵關聯一個表的主鍵。主外鍵關聯意味着一對多的關係.(第二範式處理冗餘數據的刪除問題。當某張表中的信息依賴於該表中其 它的不是主鍵部分的列的時候,一般會違反第二範式)
第三範式:第三範式要求非主鍵列互不依賴.(第三範式規則查找以消除沒有直接依賴於第一範式和第二範式造成的表的主鍵的屬性。咱們爲沒有與表的主鍵關聯的全部信息創建了一張新表。每張新表保存了來自源表的信息和它們所依賴的主鍵)
第四範式:第四範式禁止主鍵列和非主鍵列一對多關係不受約束
第五範式:第五範式將表分割成儘量小的塊,爲了排除在表中全部的冗餘。c#
2,索引:windows
什麼叫 revised key index?設計模式
反鍵索引是B*Tree索引的一個分支,它的設計是爲了運用在某些特定的環境下的。Oracle推出它的主要目的就是爲了下降在並行服務器 (Oracle Parallel Server)環境下索引葉塊的爭用。當B*Tree索引中有一列是由遞增的序列號產生的話,那麼這些索引信息基本上分佈在同一個葉塊,當用戶修改或訪問 類似的列時,索引塊很容易產生爭用。反向索引中的索引碼將會被分佈到各個索引塊中,減小了爭用.緩存
例子:有一個字段id,他的值落在一個很小的區間,好比從9000-9999,若是建b-tree索引,那麼值過於緊密,反鍵的原理是把值取反,那麼id的區間就從0009-9999,區間就被放大,這個時候經過索引來查找數據效率會比較高(oracle這麼說的)。
好處是:解決了樹的傾斜問題,並且能夠解決在大量IO操做的狀況下,防止硬盤在某個區域操做過於頻繁,引發」熱點」問題。
樹的分支:由於索引通常是按樹這個數據結構來組織,因此有不少分支,把不一樣類別或範圍的數據存放在分支裏,在符合條件的分支裏查詢比在全表查詢效率高不少。
樹的傾斜:樹的某個分支過與龐大,而其餘分支內容卻不多,這樣的索引很是不健康的,查詢速度也很慢,如上面的示例數據,都在10000-20000 的分支,而20000-30000或者以上的分支是空的。反轉後把這些數據均勻分佈到不一樣的分支,能夠使索引更加健康,也更有效率。
熱點問題:因爲系統在表數據的增刪改查的同時,同時要承擔索引開支,而這主要是硬盤的IO操做,若是樹是傾斜的,並且數據的增長是按必定順序增加的,這種狀況會致使硬盤對某一固定區域操做頻繁,會出現熱點問題,並且出現瓶頸。
Oracle五種索引:
1)b*tree index:幾乎全部的關係型數據庫中都有b*tree類型索引,也是被最多使用的。其樹結構與二叉樹比較相似,根據rid快速定位所訪問的行。 B-Tree索引是基於二叉樹的,由分支塊(branch block)和葉塊(leaf block)組成。在樹結構中,位於最底層底塊被稱爲葉塊,包含每一個被索引列的值和行所對應的rowid。在葉節點的上面是分支塊,用來導航結構,包含了 索引列(關鍵字)範圍和另外一索引塊的地址。
2)反向索引:反轉了b*tree索引碼中的字節,是索引條目分配更均勻,多用於並行服務器環境下,用於減小索引葉的競爭。 反向索引又一個缺點就是不能在全部使用常規索引的地方使用。在範圍搜索中其不能被使用。
3)降序索引:8i中新出現的索引類型,針對逆向排序的查詢。
4)位圖索引:使用位圖來管理與數據行的對應關係,多用於OLAP系統。 位圖索引最好用於低cardinality列(即列的惟一值除以行數爲一個很小的值,接近零),例如又一個「性別」列,列值有 「Male」,「Female」,「Null」等3種,但一共有300萬條記錄,那麼3/3000000約等於0,這種狀況下最適合用位圖索引。位圖以一 種壓縮格式存放,所以佔用的磁盤空間比B-Tree索引要小得多。
5)函數索引:這種索引中保存了數據列基於function返回的值,在select * from table where function(column)=value這種類型的語句中起做用。基於函數的索引也是8i以來的新產物,它有索引計算列的能力,它易於使用而且提供 計算好的值,在不修改應用程序的邏輯上提升了查詢性能。使用基於函數的索引有幾個先決條件:
(1)必須擁有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其餘模式下)權限。
(2)必須使用基於成本的優化器,基於規則的優化器將被忽略。
(3)必須設置如下兩個系統參數:
QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED
能夠經過alter system set,alter session set在系統級或線程級設置,也能夠經過在init.ora添 加實現。
五種索引的建立:
(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位圖索引。
Create BITMAP index indexname on tablename(columnname[columnname...])
(5)函數索引。
Create index indexname on tablename(functionname(columnname))
注意:建立索引後分析要索引才能起做用。
五種索引的使用場所:
(1)B*Tree索引。
常規索引,多用於oltp系統,快速定位行,應創建於高cardinality列(即列的惟一值除以行數爲一個很大的值,存在不多的相同值)。
(2)反向索引。
B*Tree的衍生產物,應用於特殊場合,在ops環境加序列增長的列上創建,不適合作區域掃描。
(3)降序索引。
B*Tree的衍生產物,應用於有降序排列的搜索語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。
(4)位圖索引。
位圖方式管理的索引,適用於OLAP(在線分析)和DSS(決策處理)系統,應創建於低cardinality列,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節省的空間。
(5)函數索引。
B*Tree的衍生產物,應用於查詢語句條件列上包含函數的狀況,索引中儲存了通過函數計算的索引碼值。能夠在不修改應用程序的基礎上能提升查詢效率。
索引無論用的時候:
(1)RBO&CBO。
Oracle有兩種執行優化器,一種是RBO(Rule Based Optimizer)基於規則的優化器,這種優化器是基於sql語句寫法選擇執行路徑的;另外一種是CBO(Cost Based Optimizer)基於規則的優化器,這種優化器是Oracle根據統計分析信息來選擇執行路徑,若是表和索引沒有進行分析,Oracle將會使用RBO代替CBO;若是表和索引好久未分析,CBO也有可能選擇錯誤執行路徑,不過CBO是Oracle發展的方向,自8i版原本已經逐漸取代RBO.
(2)AUTOTRACE。
要看索引是否被使用咱們要藉助Oracle的一個叫作AUTOTRACE功能,它顯示了sql語句的執行路徑,咱們能看到Oracle內部是怎麼執行sql的,這是一個很是好的輔助工具,在sql調優裏普遍被運用。咱們來看一下怎麼運用AUTOTRACE:
① 因爲AUTOTRACE自動爲用戶指定了Execution Plan,所以該用戶使用AUTOTRACE前必須已經創建了PLAN_TABLE。若是沒有的話,請運行utlxplan.sql腳本(它在$ORACLE_HOME/rdbms/admin目錄中)。
② AUTOTRACE能夠經過運行plustrce.sql腳本(它在$ORACLE_HOME/sqlplus/admin目錄中)來設置,用sys用戶 登錄而後運行plustrce.sql後會創建一個PLUSTRACE角色,而後給相關用戶授予PLUSTRACE角色,而後這些用戶就能夠使用 AUTOTRACE功能了。
③ AUTOTRACE的默認使用方法是set autotrace on,可是這方法不老是適合各類場合,特別當返回行數不少的時候。Set autotrace traceonly提供了只查看統計信息而不查詢數據的功能。
3,死鎖
是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去.此時稱系統處於死鎖狀態或系 統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程.因爲資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程在無外力協助下,永遠分配不到必需 的資源而沒法繼續運行,這就產生了一種特殊現象死鎖。
產生死鎖的緣由主要是:
(1) 由於系統資源不足。
(2) 進程運行推動的順序不合適。
(3) 資源分配不當等。
若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
(3) 不剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。
(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不知足,就不會發生死鎖。
例子:
運行事務 1 的線程 T1 具備學生基本信息表上的排它鎖。運行事務2的線程 T2 具備系部表上的排它鎖,而且以後須要學生基本信息表上的鎖。事務2 沒法得到這一鎖,由於事務 1 已擁有它。事務2 被阻塞,等待事務 1。而後,事務1 須要 系部表的鎖,但沒法得到鎖,由於事務 2 將它鎖定了。事務在提交或回滾以前不能釋放持有的鎖。由於事務須要對方控制的鎖才能繼續操做,因此它們不能提交或回滾。
4,BYTE[] buf = BYTE[1024];in.read(buf);
in是一個接收圖像數據的網絡IO流,請指出這段代碼有什麼問題,並請用java代碼改進它。
答:流操做均可能會跑出IOException,應該對該異常進行捕獲處理。且當buf沒有被初始化的時候使用會拋出NullPointerException。
byte [] buf = new byte[1024];
try {
System.in.read(buf);
} catch (IOException e) {
e.printStackTrace();
}
5,設計模式:Facade
你正在分析一個子系統的接口,發現接口不少。而後你同事勸你用Fecade, 問你用Fecade有什麼好處?
Facade(外觀)模式爲子系統中的各種(或結構與方法)提供一個簡明一致的界面,隱藏子系統的複雜性,使子系統更加容易使用。Facade模式 正是這樣一個「門面」:咱們原本須要與後臺的多個類或者接口打交道,而Facade模式是客戶端和後臺之間插入一箇中間層——門面,這個門面跟後臺的多個 類或接口打交道,而客戶端只須要跟門面打交道便可。使用Facade模式能夠說是後臺設計和編碼人員的一個必備素質。我不止碰到過一個這樣的後臺開發人 員,他們認爲只要把後臺功能完成了就萬事大吉,而沒有站在後臺使用者的角度來看一看本身寫出來的代碼。其實,咱們寫出來的後臺代碼是要給別人使用的,因此 咱們提供給使用者的接口要越簡單越好,這不單是對使用者好,同時對開發者也是好處多多的,至少你的接口簡單了,你和使用者的交流就容易了。
區分Façade模式、Adapter模式、Bridge模式與Decorator模式。Façade模式注重簡化接口,Adapter模式注重轉換接口,Bridge模式注重分離接口(抽象)與其實現,Decorator模式注重穩定接口的前提下爲對象擴展功能
在遇到如下狀況使用Facade模式:
1)當你要爲一個複雜子系統提供一個簡單接口時。子系統每每由於不斷演化而變得愈來愈複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更 具可重用性,也更容易對子系統進行定製,但這也給那些不須要定製子系統的用戶帶來一些使用上的困難。 Facade能夠提供一個簡單的缺省視圖,這一視圖 對大多數用戶來講已經足夠,而那些須要更多的可定製性的用戶能夠越過Facade層。
2)客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入Facade將這個子系統與客戶以及其餘的子系統分離,能夠提升子系統的獨立性和可移植性。
3)當你須要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點,若是子系統之間是相互依賴的,你可讓它們僅經過Facade進行通信,從而簡化了它們之間的依賴關係。
優缺點:
1)它對客戶屏蔽子系統組件,於是減小了客戶處理的對象的數目並使得子系統使用起來更加方便。
2)它實現了子系統與客戶之間的鬆耦合關係,而子系統內部的功能組件每每是緊耦合的。
鬆耦合關係使得子系統的組件變化不會影響到它的客戶。Facade模式有助於創建層次結構系統,也有助於對對象之間的依賴關係分層。Facade模 式能夠消除複雜的循環依賴關係。這一點在客戶程序與子系統是分別實現的時候尤其重要。在大型軟件系統中下降編譯依賴性相當重要。在子系統類改變時,但願盡 量減小重編譯工做以節省時間。用Facade能夠下降編譯依賴性,限制重要系統中較小的變化所需的重編譯工做。Facade模式一樣也有利於簡化系統在不 同平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統。
6,冷備份與熱備份
冷備份:
冷備份發生在數據庫已經正常關閉的狀況下,當正常關閉時會提供給咱們一個完整的數據庫。冷備份是將關鍵性文件拷貝到另外位置的一種說法。對於備份Oracle信息而言,冷備份是最快和最安全的方法。
冷備份的優勢是:
1.是很是快速的備份方法(只需拷貝文件)
2.容易歸檔(簡單拷貝便可)
3.容易恢復到某個時間點上(只需將文件再拷貝回去)
4.能與歸檔方法相結合,做數據庫「最新狀態」的恢復。
5.低度維護,高度安全。
冷備份也有以下不足:
1.單獨使用時,只能提供到「某一時間點上」的恢復。
2.在實施備份的全過程當中,數據庫必需要做備份而不能做其它工做。也就是說,在冷備份過程當中,數據庫必須是關閉狀態。
3.若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。
4.不能按表或按用戶恢復。
若是可能的話(主要看效率),應將信息備份到磁盤上,而後啓動數據庫(使用戶能夠工做)並將所備份的信息拷貝到磁帶上(拷貝的同時,數據庫也能夠工做)。
冷備份中必須拷貝的文件包括:
1.全部數據文件
2.全部控制文件
3.全部聯機REDO LOG文件
4.Init.ora文件(可選)。
下面是作冷備份的完整例子:
(1) 關閉數據庫$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >shutdown normal;
(2) 用拷貝命令備份所有的時間文件、重作日誌文件、控制文件、初始化參數文件
SQLDBA >! cp < file > < backup directory >
(3) 重啓Oracle數據庫
$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >startup;
熱備份
熱備份是在數據庫運行的狀況下,採用archivelog mode方式備份數據的方法。因此,若是你有昨天夜裏的一個冷備份並且又有今天的熱備份文件,在發生問題時,就能夠利用這些資料恢復更多的信息。
熱備份的要求是:
1. 熱備份工做必須要求數據庫在Archivelog 方式下操做,在SQLDBA狀態下用alter database archivelog|noarchivelog命令可改變備份的模式。
2. 熱備份只能在數據庫不使用或使用率低的狀況下進行。
3. 熱備份須要大量的檔案空間。
通常狀況,Oracle 以循環的方式寫入Online redo log 文件,當填滿第一個redo log文件後寫第二個,直至最後一個,最後一個被填滿後,後臺進程LGWR就覆蓋第一個,在Archivelog方式下,後臺進程ARCH在每個 redo log 文件被覆蓋前,給它做一個拷貝,通常,這些文檔的redo log 文件被寫入磁盤或磁帶中。若是磁盤空間夠用,建議使用磁盤,這樣可大大減小完成備份所需的時間。
在做熱備份以前,要將config.ora文件中的log_archive_start 設爲true 將log_archive_dest一旦數據庫運行在archivelog狀態下,就能夠作備份了。
熱備份的命令文件由三部分組成:
1.數據文件一個表空間一個表空間地備份。
(1)設置表空間爲備份狀態
(2)備份表空間的數據文件
(3)恢復表空間爲正常狀態
2.備份歸檔log文件。
(1)臨時中止歸檔進程
(2)log下那些在archive redo log目標目錄中的文件
(3)從新啓動archive進程
(4)備份歸檔的redo log 文件
3.用alter database backup controlfile命令來備份拷貝文件
熱備份的優勢是:
1.可在表空間或數據文件級備份,備份時間短。
2.備份時數據庫仍可以使用。
3.可達到秒級恢復(恢復到某一時間點上)。
4.可對幾乎全部數據庫實體做恢復。
5.恢復是快速的,在大多數狀況下在數據庫仍工做時恢復。
熱備份的不足是:
1.不能出錯,不然後果嚴重。
2.若熱備份不成功,所得結果不可用於時間點的恢復。
3.因難於維護,因此要特別仔細當心,不容許「以失敗而了結」。
7,你必須利用備份恢復數據庫,可是你沒有控制文件,該如何解決問題呢?
重建控制文件,用帶backup control file 子句的recover 命令恢復數據庫。
recover dbname using backup controlfile;
8,如何轉換init.ora到spfile?
create spfile from pfile=’init.ora’;
9,oracle體系結構:
Oracle物理結構
由控制文件、數據文件、重作日誌文件、參數文件、歸檔文件、密碼文件組成
控制文件:包含維護和驗證數據庫完整性的必要信息、例如,控制文件用於識別數據文件和重作日誌文件,一個數據庫至少須要一個控制文件
數據文件:存儲數據的文件
重作日誌文件:含對數據庫所作的更改記錄,這樣萬一出現故障能夠啓用數據恢復。一個數據庫至少須要兩個重作日誌文件
參數文件:定義Oracle 例程的特性,例如它包含調整SGA 中一些內存結構大小的參數
歸檔文件:是重作日誌文件的脫機副本,這些副本可能對於從介質失敗中進行恢復很必要。
密碼文件:認證哪些用戶有權限啓動和關閉Oracle例程
oracle邏輯結構
表空間、段、區、塊
表空間:是數據庫中的基本邏輯結構,一系列數據文件的集合。
段:是對象在數據庫中佔用的空間
區:是爲數據一次性預留的一個較大的存儲空間
塊:ORACLE最基本的存儲單位,在創建數據庫的時候指定
oracle內存分配
SGA和PGA
SGA:是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle 服務器的數據和控制信息, 它是在Oracle 服務器所駐留的計算機的實際內存中得以分配,若是實際內存不夠再往虛擬內存中寫。
PGA:包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反PGA 是隻被一個進程使用的區域,PGA 在建立進程時分配在終止進程時回收
oracle後臺進程
(數據寫進程、日誌寫進程、系統監控、進程監控、檢查點進程、歸檔進程、服務進程、用戶進程)
數據寫進程:負責將更改的數據從數據庫緩衝區高速緩存寫入數據文件
日誌寫進程:將重作日誌緩衝區中的更改寫入在線重作日誌文件
系統監控:檢查數據庫的一致性若有必要還會在數據庫打開時啓動數據庫的恢復
進程監控:負責在一個Oracle 進程失敗時清理資源
檢查點進程:負責在每當緩衝區高速緩存中的更改永久地記錄在數據庫中時,更新控制文件和數據文件中的數據庫狀態信息。
歸檔進程:在每第二天志切換時把已滿的日誌組進行備份或歸檔
服務進程:用戶進程服務。
用戶進程:在客戶端,負責將用戶的SQL 語句傳遞給服務進程,並從服務器段拿回查詢數據。
Oracle Instance
Oracle 例程由SGA 內存結構和用於管理數據庫的後臺進程組成。例程一次只能打開和使用一個數據庫。
SCN(System Change Number):系統改變號
一個由系統內部維護的序列號。當系統須要更新的時候自動增長,他是系統中維持數據的一致性和順序恢復的重要標誌。
實例和SID的關係是什麼?
常常有人問SID 是什麼?在Oracle 系統中SID 是一個常常出現的變量,如環境變量ORACLE_SID, 初始化文件initSID.ora,那究竟什麼是SID 呢?其實SID 就是Oracle 實例的標識,不一樣的SID 對應不一樣的內存緩衝(SGA)和不一樣的後臺進程。這樣一來咱們就能夠得當在一臺物理的服務器上能夠有多個SID 的數據庫實例
Oracle數據庫和實例的關係是什麼?
數據庫是由物理文件和存取數據文件的實例組成,當存取數據文件的實例是一個的時候,數據庫被稱作單節點數據庫。這是咱們看到的最多的數據庫形式。當 然還有一種多節點數據庫,就是一個以上的實例共同訪問一個數據庫(或者說共同訪問一組數據文件), 更好的提供穩定性和並行處理能力。這在8i中被稱爲OPS(Oracle Parallel Server ),在Oracle9i 中被稱爲RAC(real application cluster)。在這種數據庫中。兩個/多個實例分別在不一樣服務器上,全部Oracle 數據文件在共享的磁盤陣列上,多個服務器上的實例能夠同時工做,他們經過一個內部的網絡進行通訊。若是一臺服務器不能提供服務的話,另外一臺會接管它的工 做,特別是在關鍵的業務有很大的潛力。
在運行的數據庫中數據文件中是否是可能存在沒有被提交的數據?
這是可能存在的,由於用戶數據文件的數據是由DBWR寫入的,DBWR是一個很底層的後臺進程,不負責與用戶交互。用戶的交互是由LGWR完成的。
在問題10中,若是存在沒有寫入的數據,那麼機器忽然斷電,數據完整性會不會損壞?
不會的,由於數據庫的完整性是LGWR來保證的,並且ORACLE保證了DBWR寫入數據文件的任何修改已經被記錄在重作日誌文件中。當系統再次啓 動的時候,經過讀取重作日誌文件就能夠知道那些數據沒有被提交。這時候ORACLE 會自動回滾那些數據。因此說聯機日誌的損壞,特別是當前聯機日誌的損壞,對數據庫的影響是巨大的,可能會致使數據庫的不完整。
Oracle安裝完成後的初始用戶名與密碼?
sys/change_on_install
system/manager
scott/tiger
sysman/oem_temp
建立Sequence
create sequence zxk increment by 10 start with 10 maxvalue 1000 cycle ;
數據字典
數據字典是ORACLE數據庫的最重要的部分之一,是由一組只讀的表及其視圖所組成。這些表和視圖是數據庫被創建同時由數據庫系統創建起來的,起着 系統狀態的目錄表的做用。數據字典描述表、列、索引、用戶、訪問權以及數據庫中的其它實體,當其中的一個實體被創建、修改或取消時,數據庫將自動修改數據 字典。所以,數據字典老是包含着數據庫的當前描述,可用SQL存取數據字典,因爲數據字典爲只讀,只容許查詢。數據字典中所有基本表和用戶可存取視圖爲 ORACLE用戶SYS所持有,全部對象包含在SYS模式中。當ORACLE數據庫系統啓動後,數據字典老是可用,它駐留在SYSTEM表空間中。數據字 典包含視圖集,在許多狀況下,每一視圖集有三種視圖包含有相似信息,彼此之前綴相區別,前綴爲USER、ALL和DBA。
10,給出兩個檢查表結構的方法
1)DESCRIBE命令
sql>desc dbname;
2)DBMS_METADATA.GET_DDL 包
11,怎樣查看數據庫引擎的報錯
alert log.
12,比較truncate和delete 命令
一、在功能上,truncate是清空一個表的內容,它至關於delete from table_name。
二、 delete是dml操做,truncate是ddl操做;所以,用delete刪除整個表的數據時,會產生大量的roolback,佔用不少的rollback segments, 而truncate不會。
三、在內存中,用delete刪除數據,表空間中其被刪除數據的表佔用的空間還在,便於之後的使用,另外它是「假相」的刪除,至關於windows 中用delete刪除數據是把數據放到回收站中,還能夠恢復,固然若是這個時候從新啓動系統(OS或者RDBMS),它也就不能恢復了!而用 truncate清除數據,內存中表空間中其被刪除數據的表佔用的空間會被當即釋放,至關於windows中用shift+delete刪除數據,不可以 恢復!
四、truncate 調整high water mark 而delete不;truncate以後,TABLE的HWM退回到 INITIAL和NEXT的位置(默認)delete 則不能夠。
五、truncate 只能對TABLE,delete 能夠是table,view,synonym。
六、TRUNCATE TABLE 的對象必須是本模式下的,或者有drop any table的權限 而 DELETE 則是對象必須是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的權限。
七、在外層中,truncate或者delete後,其佔用的空間都將釋放。
八、truncate和delete只刪除數據,而drop則刪除整個表(結構和數據)。
在刪除大數據量時(一個表中大部分數據時),能夠採用如下步驟:
一、先將不須要刪除的數據複製到一個臨時表中
二、trunc table 表
三、將不須要刪除的數據複製回來。
不一樣:DELETE語句執行刪除的過程是每次從表中刪除一行,而且同時將該行的的刪除操做做爲事務記錄在日誌中 保存以便進行進行回滾操做。TRUNCATE TABLE 則一次性地從表中刪除全部的數據頁並不把單獨的刪除操做記錄記入日誌保存,刪除行是不能恢復的。而且在刪除的過程當中不會激活與表有關的刪除觸發器。執行速 度快。
truncate的功能能夠拆分爲:dropping + re-creating a table,但truncate的效率要高。由於truncate無須考慮表索引、約束、觸發器等的重建。另外truncate執行後,沒法回滾(roll back)
HWM(high water mark,最高水位線):The high water mark is divides a segment into used blocks and free blocks。Blocks below the high water mark (used blocks) have at least once contained data. This data might have been deleted. Since Oracle knows that blocks beyond the high water mark don’t have data, it only reads blocks up to the high water mark in a full table scan(FTS).在oracle10g中增長了調整HWM的命令:alter table xxx shrink space。
13,歸檔模式與非歸檔模式:
非歸檔模式:只能作冷備份,而且恢復時只能作徹底備份.最近一次徹底備份到系統出錯期間的數據不能恢復。非歸檔模式只能離線備份,並且必須備份全部的數據文件,控制文件,日誌文件!
歸檔模式:能夠作熱備份,而且能夠作增量備份,能夠作部分恢復.歸檔模式,能夠在線或者離線備份數據庫,能夠是 全備份或者是部分備份(單個表空間,數據文件).歸檔模式可以作到零數據丟失。固然歸檔會消耗一些存儲和性能資源。歸檔模式,數據庫的日誌能夠長時間保 存,有了歸檔日誌,能夠隨時恢復歸檔日期內任什麼時候間點的數據,便於數據庫數據安全保護。
RMAN備份:必須使用archivelog,對因而否使用ARCHIVELOG,得看應用具體狀況的.數據庫歸檔模式,能夠使用rman或手工在線備份數據。
用ARCHIVE LOG LIST 能夠查看期模式狀態時歸檔模式仍是非歸檔模式.
sql>archive log list;
sql>alter dbname archivelog;
sql>alter dbname noarchivelog;
14,如何創建備份控制文件?
SQL> alter database backup controlfile to trace;
15,數據庫的狀態:
四種狀態:open,close,mount,nomount
打開數據庫:
STARTUP NOMOUNT – 啓動instance,可是不裝載數據庫
STARTUP MOUNT – 啓動instance,並裝載數據庫,可是不打開數據庫
STARTUP OPEN – 啓動instance,並裝載數據庫,而後打開數據庫
1)啓動&裝載&打開&限制僅DBA訪問:STARTUP RESTRICT;
取消:ALTER SYSTEM DISABLE RESTRICTED SESSION;
2)強制啓動:STARTUP FORCE;
3)只讀方式打開數據庫:STARTUP OPEN READ ONLY;
關閉數據庫:
SHUTDOWN NORMAL;
SHUTDOWN IMMEDIATE;
SHUTDOWN TRANSACTIONAL;
SHUTDOWN ABORT;
16,解釋$ORACLE_HOME和$ORACLE_BASE的區別?
ORACLE_BASE是oracle的根目錄,ORACLE_HOME是oracle產品的目錄。
17,如何判斷數據庫的時區?
SQL> select dbtimezone from dual;
SQL> select sessiontimezone from dual;
SQL> select sysdate from dual;
SQL> select systimestamp from dual;
SQL> select current_date from dual;
SQL> select current_timestamp from dual;
18,解釋GLOBAL_NAMES
GLOBAL_NAME:Global name of the database,是數據庫的一個持久性設置.
GLOBAL_NAMES:用於設定數據庫連接名稱是否必須與遠程數據庫的GLOBAL_NAME匹配,默認爲false。若是這個參數設置爲TRUE,在創建數據庫連接時就必須用相同的名字連結遠程數據庫。
19,物化視圖:materialized view
Oracle數據庫中有兩種view,一種是存儲爲pure SQL,一種是維護一張表。是一種特殊的物理表,「物化」(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的侷限性大,任 何對視圖的查詢,Oracle都實際上轉換爲視圖SQL語句的查詢。這樣對總體查詢性能的提升,並無實質上的好處。物化視圖是包括一個查詢結果的數據庫 對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的彙總表。物化視圖存儲基於遠程表的數據,也能夠稱爲快照。
物化視圖對於前臺數據庫使用者來講如同一個實際的表,具備和表相通的通常select操做,而其其實是一個視圖,一個按期刷新數據的視圖(具體刷 新時間在定義物化視圖的時候已有定義),使用物化視圖能夠實現視圖的全部功能,而物化視圖確不是在使用時纔讀取,大大提升了讀取速度,特別適用抽取大數據 量表某些信息以及數據鏈鏈接表使用.
具體語法以下:
CREATE MATERIALIZED VIEW an_user_base_file_no_charge
REFRESH COMPLETE START WITH SYSDATE
NEXT TRUNC(SYSDATE+29)+5.5/24
as
select distinct user_no
from cw_arrearage t
where (t.mon = dbms_tianjin.getLastMonth or
t.mon = add_months(dbms_tianjin.getLastMonth, -1))
drop materialized view an_user_base_file_no_charge;
補充:
Oracle的物化視圖提供了強大的功能,能夠用於預先計算並保存錶鏈接或彙集等耗時較多的操做的結果,這樣,在執行查詢時,就能夠避免進行這些耗 時的操做,而從快速的獲得結果。物化視圖有不少方面和索引很類似:使用物化視圖的目的是爲了提升查詢性能;物化視圖對應用透明,增長和刪除物化視圖不會影 響應用程序中SQL語句的正確性和有效性;物化視圖須要佔用存儲空間;當基表發生變化時,物化視圖也應當刷新。
物化視圖能夠分爲如下三種類型:包含彙集的物化視圖;只包含鏈接的物化視圖;嵌套物化視圖。三種物化視圖的快速刷新的限制條件有很大區別,而對於其餘方面則區別不大。建立物化視圖時能夠指定多種選項,下面對幾種主要的選擇進行簡單說明:
建立方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED兩種。BUILD IMMEDIATE是在建立物化視圖的時候就生成數據,而BUILD DEFERRED則在建立時不生成數據,之後根據須要在生成數據。默認爲BUILD IMMEDIATE。
查詢重寫(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出建立的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷可否經過查詢物化視圖 來獲得結果,若是能夠,則避免了彙集或鏈接操做,而直接從已經計算好的物化視圖中讀取數據。默認爲DISABLE QUERY REWRITE。
刷新(Refresh):指當基表發生了DML操做後,物化視圖什麼時候採用哪一種方式和基表進行同步。刷新的模式有 兩種:ON DEMAND和ON COMMIT。ON DEMAND指物化視圖在用戶須要的時候進行刷新,能夠手工經過DBMS_MVIEW.REFRESH等方法來進行刷新,也能夠經過JOB定時進行刷新。 ON COMMIT指出物化視圖在對基表的DML操做提交的同時進行刷新。刷新的方法有四種:FAST、COMPLETE、FORCE和NEVE*。**ST刷 新採用增量刷新,只刷新自上次刷新之後進行的修改。COMPLETE刷新對整個物化視圖進行徹底的刷新。若是選擇FORCE方式,則Oracle在刷新時 會去判斷是否能夠進行快速刷新,若是能夠則採用FAST方式,不然採用COMPLETE的方式。NEVER指物化視圖不進行任何刷新。默認值是FORCE ON DEMAND。
在創建物化視圖的時候能夠指定ORDER BY語句,使生成的數據按照必定的順序進行保存。不過這個語句不會寫入物化視圖的定義中,並且對之後的刷新也無效。
物化視圖日誌:若是須要進行快速刷新,則須要創建物化視圖日誌。物化視圖日誌根據不一樣物化視圖的快速刷新的須要,能夠創建爲ROWID或PRIMARY KEY類型的。還能夠選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
能夠指明ON PREBUILD TABLE語句將物化視圖創建在一個已經存在的表上。這種狀況下,物化視圖和表必須同名。當刪除物化視圖時,不會刪除同名的表。這種物化視圖的查詢重寫要 求參數QUERY_REWRITE_INTEGERITY必須設置爲trusted或者stale_tolerated。
物化視圖能夠進行分區。並且基於分區的物化視圖能夠支持分區變化跟蹤(PCT)。具備這種特性的物化視圖,當基表進行了分區維護操做後,仍然能夠進 行快速刷新操做。對於彙集物化視圖,能夠在GROUP BY列表中使用CUBE或ROLLUP,來創建不一樣等級的彙集物化視圖。
20,當用戶進程出錯,哪一個後臺進程負責清理它?PMON:進程監控進程
21,哪一個後臺進程刷新materialized views?The Job Queue Processes:做業隊列進程
22,如何判斷哪一個session正在連結以及它們等待的資源?V$SESSION / V$SESSION_WAIT
23,如何分辨某個用戶是從哪臺機器登錄ORACLE的:SELECT machine , terminal FROM V$SESSION
24,如何查看系統被鎖的事務時間:select * from v$locked_object ;
25. 如何以archivelog的方式運行oracle:在init.Ora中,log_archive_start = true,重啓。
26. 怎麼獲取有哪些用戶在使用數據庫:select username from v$session;
27. 數據表中的字段最大數是多少:表或視圖中的最大列數爲 1000
28. 怎樣查得數據庫的SID :select name from v$database; 也能夠直接查看 init.ora文件
29,建立Sequence:create sequence zxk increment by 10 start with 10 maxvalue 1000 cycle ;
30,oracle日誌
Oracle9i中有2種日誌,一種稱爲Redo Log(重作日誌),另外一種叫作Archive Log(歸檔日誌)。重作日誌redo log file是LGWR進程(日誌寫入進程)從Oracle實例中的redo log buffer寫入的,是循環利用的。就是說一個redo log file(group) 寫滿後,才寫下一個。歸檔日誌archive log是當數據庫運行在歸檔模式下時,一個redo log file(group)寫滿後,由ARCn進程(歸檔進程)將重作日誌的內容備份到歸檔日誌文件下,而後這個redo log file(group)才能被下一次使用。無論數據庫是不是歸檔模式,重作日誌是確定要寫的。而只有數據庫在歸檔模式下,重作日誌纔會備份,造成歸檔日 志。歸檔日誌結合全備份,用於數據庫出現問題後的恢復使用。
31,如何強制進行 Log Switch?
當一個redo log file被寫滿了以後要換另一個redo log file,這個時候要用到的操做叫log switch。
SQL>ALTER SYSTEM SWITCH LOGFILE;
32,Coalescing作了什麼?
Coalescing針對於字典管理的tablespace進行碎片整理,將臨近的小extents合併成單個的大extent.
33,oracle表空間
Oracle數據庫(tablespace)是由若干個表空間構成的。任何數據庫對象在存儲時都必須存儲在某個表空間中。表空間對應於若干個磁盤文件,即表空間是由一個或多個磁盤文件構成的。表空間至關於操做系統中的文件夾,也是數據庫邏輯結構與物理文件之間的一個映射。每一個數據庫至少有一個表空間,表空間的大小等於全部從屬於它的數據文件大小的總和。
在Oracle 10g中有如下幾種比較特殊的表空間:
(1)系統表空間
系統表空間(system tablespace)是每一個Oracle數據庫都必須具有的。其功能是在系統表空間中存放諸如表空間名稱、表空間所含數據文件等數據庫管理所需的信息。 系統表空間的名稱是不可更改的。系統表空間必須在任什麼時候候均可以用,也是數據庫運行的必要條件。所以,系統表空間是不能脫機的。系統表空間包括數據字典、存儲過程、觸發器和系統回滾段。爲避免系統表空間產生存儲碎片以及爭用系統資源的問題,應建立一個獨立的表空間用來單獨存儲用戶數據。
(2)SYSAUX表空間
SYSAUX表空間是隨着數據庫的建立而建立的,它充當SYSTEM的輔助表空間,主要存儲除數據字典之外的其餘對象。SYSAUX也是許多Oracle 數據庫的默認表空間,它減小了由數據庫和DBA管理的表空間數量,下降了SYSTEM表空間的負荷。
(3)臨時表空間
相對於其餘表空間而言,臨時表空間(temp tablespace)主要用於存儲Oracle數據庫運行期間所產生的臨時數據。數據庫能夠創建多個臨時表空間。當數據庫關閉後,臨時表空間中全部數據將所有被清除。除臨時表空間外,其餘表空間都屬於永久性表空間。
(4)撤銷表空間
用於保存Oracle數據庫撤銷信息,即保存用戶回滾段的表空間稱之爲回滾表空間(或簡稱爲RBS撤銷表空間(undo tablespace))。在Oracle8i中是rollback tablespace,從Oracle9i開始改成undo tablespace。在Oracle 10g中初始建立的只有6個表空間sysaux、system、temp、undotbs一、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。
34,建立用戶時,須要賦予新用戶什麼權限才能使它聯上數據庫。CONNECT
35,如何在tablespace裏增長數據文件?ALTER TABLESPACE ADD DATAFILE SIZE
36,如何變更數據文件的大小?ALTER DATABASE DATAFILE RESIZE ;
37,哪一個VIEW用來檢查數據文件的大小? DBA_DATA_FILES
38,哪一個VIEW用來判斷tablespace的剩餘空間?DBA_FREE_SPACE
39,如何判斷誰往數據庫裏面插入了一條記錄?
三種方法:事先打開審計功能或者在表上創建觸發器,過後能夠經過logmnr查看。
1)數據庫審計功能:
先設置audit_trail參數,決定審計結果保存地點; 而後執行audit insert on schema.table_name whenever successful; 這樣就好了,在有人作insert操做後,根據audit_trail參數到相應位置去看審計結果就好了。
2)觸發器:
create or replace trigger tgname
after insert
on tbname –>判斷此表是否被插入記錄
for each row
begin
insert into ta(日期) values(sysdate) ;
commit;
end ;
建觸發器其實也是審計,是基於值的審計,比數據庫審計慢,不過審計的內容能夠更詳細。
3)logmnr查看日誌
35,如何重構索引?
SQL>ALTER INDEX indexname REBUILD;
快速重建索引:
alter session set workarea_size_policy=manual;
oracle 10G以上默認auto,修改爲manual才能設置排序區大小。
alter session set sort_area_size=1073741824;
alter session set sort_area_retained_size=1073741824;
設置排序區大小爲1G
alter session set db_file_multiblock_read_count=128;
alter index IDX_POI_ID_NAME rebuild online parallel 4 nologging—4個並行操做。
須要注意的是在並行重構完成之後,必定要取消索引的並行度,不然,在OLTP環境中,可能會由於意外的使用並行而出現嚴重性能問題。alter index IDX_POI_ID_NAME noparallel;
36,oracle partitioning
Oracle 分區是 Oracle9i 企業版的一個選項,能夠加強各類應用程序的可管理性、性能和可用性。分區容許將表、索引以及索引編排表細分爲更小的段,從而能在更細的粒度級管理和訪問這些數據庫對象。Oracle 提供豐富的分區模式來知足每一種商務需求。並且,因爲它在 SQL 語句中是徹底透明的,分區幾乎可應用於任何應用程序。
分區的優勢
分區能改善各類應用程序的可管理性、性能和可用性,具備很是多的優勢。分區每每根據數量級提升某些查詢或維護操做的性能。另外,分區能夠極大地簡化 常見的管理任務。 分區還能夠使數據庫設計人員和管理人員可以處理一些最前沿的應用程序而引起的最棘手的難題。分區在構建 TB 級的系統或對可用性要求極高的系統時很是關鍵。
分區的基本知識
分區容許將表、索引或索引編排表細分爲更小的段。數據庫對象的每一個段就叫一個區。每一個區有本身的名稱,也能夠具有本身的存儲特徵。從數據庫管理員的 角度看,分區的對象有多個段,既能夠一塊兒管理也可單獨管理。這就賦予管理人員至關大的靈活性來管理分區的對象。然而,從應用的角度看,分區的表與不分區的 表是一致的;在經過 SQL DML 命令訪問分區表時不須要作任何的修改。
表經過使用‘分區鍵’分區;分區鍵是肯定某個行所在區的一組列。
Oracle9i 提供四種表的分區技術:
1)範圍分區:每一個區由一系列分區鍵的值來指定(對於將日期列做爲分區鍵的表,‘1 月-2001年’區包含分區鍵值爲‘01-1 月-2001’至‘31-1 月-2001’的全部行)
2)列表分區:每一個區由一列分區鍵值指定(對於將區域列做爲分區鍵值的表,‘北美州’區可能包含的值有‘加拿大’、‘美國’以及‘墨西哥’)
3)哈希分區:哈希算法應用於分區鍵值,來肯定某個行的區
4)範圍-哈希組合分區:即範圍和哈希分區技術的結合。表首先進行範圍分區,而後每一個範圍區再單獨經過哈希分區技術進行分區。
索引編排表既可作範圍分區也可作哈希分區。
Oracle9i 還提供三種類型的分區索引:
1)本地索引:本地索引是分區表中的一種索引,分區方法與基本分區表的徹底同樣。本地索引的每一個區只對應於基表的一個區。
2)全局分區索引:全局分區索引是分區或非分區表中的索引,經過該表中的不一樣分區鍵分區。全局分區索引只能採用範圍分區法。例如,表可根據月份進行範圍分區,這樣就有 12 個區,而該表的索引使用不一樣的分區鍵進行範圍分區,就會有不一樣數量的區。
3)全局非分區索引:全局非分區索引基本上與非分區表的索引一致。索引結構未被分區。
Oracle 提供一套強健的技術用於表、索引和索引編排表的分區,所以分區功能可最優地應用於任何商務環境中的任何應用程序。 Oracle 還另外提供了一組完整的 SQL 命令用於管理分區表。其中的命令包括添加新區、刪除區、拆分分區以及合併分區。
經過限制要檢查或操做的數據量和啓用並行執行,Oracle 分區選項提供許多性能的優勢。這些特性包括:
1)分區修剪 (Partitioning Pruning):分區修剪是最簡單也是最有效的經過分區改善性能的方法。分區修剪一般根據幾個數量級改善查詢性能。例如,假定一個應用程序中有一個包含 訂單歷史記錄的訂單表,並且該表已經按周進行了分區。請求一週內定單的查詢只會訪問訂單表的一個區。若是訂單表有 2 年的歷史數據,該查詢將訪問一個區而不是 104 個區。僅僅因爲分區修剪功能的做用,該查詢的執行速度實際上快了 100 倍。分區修剪與 Oracle 其它全部的性能特性一塊兒發揮做用。Oracle 將分區修剪功能與任何的索引技術、鏈接技術或並行訪問方法一塊兒使用。
2)智能化分區鏈接 (Partition-wise Join):分區也可經過使用被稱爲智能化分區鏈接的技術改善多表鏈接的性能。智能化分區鏈接可用於將兩個錶鏈接在一塊兒,並且這兩個表都在鏈接鍵上分區。 智能化分區鏈接將大型的鏈接拆分爲小的鏈接,在每一個區間執行,減小了整個鏈接的時間。這顯著地提升了串行和並行執行的性能。
3)更新和刪除的並行執行:分區可以並行執行 UPDATE、DELETE 和 MERGE 語句。當訪問分區和非分區的數據庫對象時,Oracle 會並行化 SELECT 語句和 INSERT 語句。不過,爲了並行化 UPDATE、DELETE 和 MERGE 語句,目標表必須進行分區。並行執行這些 SQL 操做可極大地改善性能,尤爲是對涉及大量數據的 UPDATE、DELETE 或 MERGE 操做。
37,剛編譯了一個PL/SQL Package可是有錯誤報道,如何顯示出錯信息?
SHOW ERRORS
38,如何蒐集表的各類狀態數據?
ANALYZE:用於分析表或者索引結構的一致性,判斷索引與表間是否匹配<cascade>,有沒有壞塊,數據是否是正確分佈在正確 的分區中,索引壓縮效率等。DBMS_UTILITY.ANALYZE_SCHEMA是等同於analyze的,只是DBMS_UTILITY是在 PLSQL中調用了analyze命令。另外ORACLE提供了dbms_stats,該包提供了分析優化相關的信息的更強的功能,可是他不能分析非優化 相關的信息。
analyze命令分兩種,一種是分析優化相關的信息,語句爲analyze table [index] compute[estimate] statistics [for 語句];若是要分析非優化相關的信息,語句如analyze index … validate structure;analyze table … validate structure [cascade]等。
39,oracle trace
SQL Trace主要是對數據庫進行SQL監測,能夠隨時監測和調整做用於數據的應用程序。好比ERP系統它的應用界面不少,涉及的底層操做也不少,若是想知道 在某個界面的操做在底層數據庫執行了哪些SQL語句,就須要開啓Trace功能記錄下這些SQL操做,方便開發人員瞭解上層應用程序對數據庫作了哪些動 做。
alter session set sql_trace = true; /*開啓*/
alter session set sql_trace = false; /*關閉*/
DBMS_SESSION.SET_SQL_TRACE也能夠啓動session級別的sql trace。
40,IMPORT和SQL*LOADER 這2個工具的不一樣點?
這兩個ORACLE工具都是用來將數據導入數據庫的。區別是:IMPORT工具只能處理由另外一個ORACLE工具EXPORT生成的數據。而SQL*LOADER能夠導入不一樣的ASCII格式的數據源。
41,用於網絡鏈接的2個文件?
TNSNAMES.ORA , SQLNET.ORA
42,有一個A 數據庫,分別複製到B和C。 B 要求每次A數據更新B也同時更新,C 天天更新一次就行,如何制定複製策略!
a->b
1)、若是使用SQL Server複製功能,那麼讓a->b使用事務性複製方式(同步複製)。
2)、若是表很少,也能夠本身寫觸發器,利用linkserver+distribute transaction。
a->c
1)、若是使用SQL Server複製功能,那麼讓a->b使用快照複製方式,在某一時間點進行一次性複製。
2)、也能夠本身寫bat,將a備份後,經過ftp傳輸備份介質,恢復c。(比較麻煩,不推薦)
43, 有一個數據庫200G大小,天天增長50M 容許用戶隨時訪問,制定備份策略(詳細說明)。
這種狀況能夠採用增量備份方式。每週日作一次全備份,週一到週六做增量備份(因爲數據量較少,能夠考慮每30分鐘增量備份一次)。這樣能夠儘可能減小性能消耗,並且若是transaction log丟失的狀況下,能夠保證最多丟失30分鐘數據。
44,管理50臺數據庫,平常工做是檢查數據庫做業是否完成,你該如何完成這項檢查工做?
在每臺機器上創建linkserver,而後在DBA管理服務器上作個分佈式視圖,每次查詢該視圖,各個機器上的做業狀況一目瞭然。分佈式視圖寫法:
create view vw_job
as
select ‘機器一’ as MName,* from linkserver1..sysjobactivity
union all
select ‘機器二’ as MName,* from linkserver2..sysjobactivity
union all
select ‘機器三’ as MName,* from linkserver3..sysjobactivity
。。。
45,數據庫三級模式:
數據庫結構分爲3級:面向用戶或應用程序員的用戶級、面向創建和維護數據庫人員的概念級、面向系統程序員的物理級。用戶級對應外模式,概念級對應模 式,物理級對應內模式,使不一樣級別的用戶對數據庫造成不一樣的視圖。所謂視圖,就是指觀察、認識和理解數據的範圍、角度和方法,是數據庫在用戶「眼中」的反 映,很顯然,不一樣層次(級別)用戶所「看到’’的數據庫是不相同的。
1)模式.
模式又稱概念模式或邏輯模式,對應於概念級。它是由數據庫設計者綜合全部用戶的數據,按照統一的觀點構造的全局邏輯結構,是對數據庫中所有數據的邏 輯結構和特徵的整體描述,是全部用戶的公共數據視圖(全局視圖)。它是由數據庫管理系統提供的數據模式描述語言(Data Description Language,DDL)來描述、定義的,體現、反映了數據庫系統的總體觀。
2)外模式
外模式又稱子模式,對應於用戶級。它是某個或某幾個用戶所看到的數據庫的數據視圖,是與某一應用有關的數據的邏輯表示。外模式是從模式導出的一個子 集,包含模式中容許特定用戶使用的那部分數據。用戶能夠經過外模式描述語言來描述、定義對應於用戶的數據記錄(外模式),也能夠利用數據操縱語言 (Data Manipulation Lang uage,DML)對這些數據記錄進行。外模式反映了數據庫的用戶觀。
3)內模式
內模式又稱存儲模式,對應於物理級,它是數據庫中全體數據的內部表示或底層描述,是數據庫最低一級的邏輯描述,它描述了數據在存儲介質上的存儲方式 翱物理結構,對應着實際存儲在外存儲介質上的數據庫。內模式由內模式描述語言來描述、定義,它是數據庫的存儲觀。 在一個數據庫系統中,只有惟一的數據庫, 於是做爲定義 、描述數據庫存儲結構的內模式和定義、描述數據庫邏輯結構的模式,也是唯一的,但創建在數據庫系統之上的應用則是很是普遍、多樣的,因此對應的外模式不是 唯一的,也不多是唯一的。
三級模式間的映射
數據庫的三級模式是數據庫在三個級別 (層次)上的抽象,使用戶可以邏輯地、抽象地處理數據而沒必要關心數據在計算機中的物理表示和存儲。實際上 ,對於一個數據庫系統而言一有物理級數據庫是客觀存在的,它是進行數據庫操做的基礎,概念級數據庫中不過是物理數據庫的一種邏輯的、抽象的描述(即模 式),用戶級數據庫則是用戶與數據庫的接口,它是概念級數據庫的一個子集(外模式)。 用戶應用程序根據外模式進行數據操做,經過外模式一模式映射,定義和創建某個外模式與模式間的對應關係,將外模式與模式聯繫起來,當模式發生改變時,只 要改變其映射,就能夠使外模式保持不變,對應的應用程序也可保持不變;另外一方面,經過模式一內模式映射,定義創建數據的邏輯結構(模式)與存儲結構(內模 式)間的對應關係,當數據的存儲結構發生變化時,只需改變模式一內模式映射,就能保持模式不變,所以應用程序也能夠保持不變。
46, 關係數據庫管理系統能實現的專門關係運算?
選擇、鏈接和投影
47,oracle RBO, CBO
ORACLE 提供了CBO、RBO兩種SQL優化器。RBO是Rule Based Optimizer。CBO是Cost Based Optimizer。CBO在ORACLE7 引入,但在ORACLE8i 中才成熟。ORACLE 已經明確聲明在ORACLE9i以後的版本中(ORACLE 10G ),RBO將再也不支持。所以選擇CBO 是必然的趨勢。CBO和 RBO做爲不一樣的SQL優化器,對SQL語句的執行計劃產生重大影響,若是要對現有的應用程序從RBO向CBO移植,則必須充分考慮這些影響,避免SQL 語句性能急劇降低;可是,對新的應用系統,則能夠考慮直接使用CBO,在CBO模式下進行SQL語句編寫、分析執行計劃、性能測試等工做,這須要開發者對 CBO的特性比較熟悉。
在CBO下寫SQL語句的注意事項:
1)RBO自ORACLE 6版以來被採用,有着一套嚴格的使用規則,只要你按照它去寫SQL語句,不管數據表中的內容怎樣,也不會影響到你的「執行計劃」,也就是說對數據不「敏 感」;CBO計算各類可能「執行計劃」的「代價」,即cost,從中選用cost最低的方案,做爲實際運行方案。各「執行計劃」的cost的計算根據,依 賴於數據表中數據的統計分佈,ORACLE數據庫自己對該統計分佈並不清楚,必需要分析表和相關的索引(使用ANALYZE 命令),才能蒐集到CBO所需的數據。
2)使用CBO 時,編寫SQL語句時,沒必要考慮」FROM」 子句後面的表或視圖的順序和」WHERE」 子句後面的條件順序;ORACLE自7版以來採用的許多新技術都是基於CBO的,如星型鏈接排列查詢,哈希鏈接查詢,函數索引,和並行查詢等。
3)通常而言,CBO所選擇的「執行計劃」都不會比RBO的「執行計劃」差,並且相對而言,CBO對程序員的要求沒有RBO那麼苛刻,節省了程序員 爲了從多個可能的「執行計劃」中選擇一個最優的方案而花費的調試時間,但在某些場合下也會存在問題。較典型的問題有:有時,代表明建有索引,但查詢過程顯 然沒有用到相關的索引,致使查詢過程耗時漫長,佔用資源巨大,這時就須要仔細分析執行計劃,找出緣由。例如,能夠看鏈接順序是否容許使用相關索引。假設表 emp的deptno列上有索引,表dept的列deptno上無索引,WHERE語句有emp.deptno=dept.deptno條件。在作NL連 接時,emp作爲外表,先被訪問,因爲鏈接機制緣由,外表的數據訪問方式是全表掃描,emp.deptno上的索引顯然是用不上,最多在其上作索引全掃描 或索引快速全掃描。
4)若是一個語句使用 RBO的執行計劃確實比CBO 好,則能夠經過加 」 rule」 提示,強制使用RBO。
5)使用CBO 時,SQL語句 「FROM」 子句後面的表,必須所有使用ANALYZE 命令分析過,若是」FROM」 子句後面的是視圖,則此視圖的基礎表,也必須所有使用ANALYZE 命令分析過;不然,ORACLE 會在執行此SQL語句以前,自動進行ANALYZE 命令分析,這會極大致使SQL語句執行極其緩慢。
6)使用CBO 時,SQL語句 「FROM」 子句後面的表的個數不宜太多,由於CBO在選擇錶鏈接順序時,會對」FROM」 子句後面的表進行階乘運算,選擇最好的一個鏈接順序。假如」FROM」 子句後有6個表,則其可選擇的鏈接順序就是6*5*4*3*2*1 = 720 種,CBO 選擇其中一種,而若是」FROM」 子句後有12個表,則其可選擇的鏈接順序就是12*11*10*9*8*7*6*5*4*3*2*1= 479001600 種,能夠想象從中選擇一種,會消耗多少CPU 時間?若是實在是要訪問不少表,則最好使用 ORDER 提示,強制使用」FROM」 子句表固定的訪問順序。
7)使用CBO 時,SQL語句中不能引用系統數據字典表或視圖,由於系統數據字典表都未被分析過,可能致使極差的「執行計劃」。可是不要擅自對數據字典表作分析,不然可能致使死鎖,或系統性能嚴重降低。
8)使用CBO 時,要注意看採用了哪一種類型的錶鏈接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO 有時會偏重於SMJ 和 HJ,但在OLTP 系統中,NL 通常會更好,由於它高效的使用了索引。在兩張錶鏈接,且內表的目標列上建有索引時,只有Nested Loop纔能有效地利用到該索引。SMJ即便相關列上建有索引,最多隻能因索引的存在,避免數據排序過程。HJ因爲須作HASH運算,索引的存在對數據查 詢速度幾乎沒有影響。
9)使用CBO 時,必須保證爲表和相關的索引蒐集足夠的統計數據。對數據常常有增、刪、改的表最好按期對錶和索引進行分析,可用SQL語句「analyze table xxx compute statistics for all indexes;」ORACLE掌握了充分反映實際的統計數據,纔有可能作出正確的選擇。
10)使用CBO 時,要注意被索引的字段的值的數據分佈,會影響SQL語句的執行計劃。例如:表emp,共有一百萬行數據,但其中的emp.deptno列,數據只有4種 不一樣的值,如十、20、30、40。雖然emp數據行有不少,ORACLE缺省認定表中列的值是在全部數據行均勻分佈的,也就是說每種deptno值各 有25萬數據行與之對應。假設SQL搜索條件DEPTNO=10,利用deptno列上的索引進行數據搜索效率,每每不比全表掃描的高,ORACLE理所 固然對索引「視而不見」,認爲該索引的選擇性不高。
優化模式包括Rule、Choose、First rows、All rows四種方式:
1)Rule:基於規則的方式。
2)Choose:默認的狀況下Oracle用的即是這種方式。指的是當一個表或或索引有統計信息,則走CBO的方式,若是表或索引沒統計信息,表又不是特別的小,並且相應的列有索引時,那麼就走索引,走RBO的方式。
3)First Rows:它與Choose方式是相似的,所不一樣的是當一個表有統計信息時,它將是以最快的方式返回查詢的最早的幾行,從整體上減小了響應時間。
4)All Rows:也就是咱們所說的Cost的方式,當一個表有統計信息時,它將以最快的方式返回表的全部的行,從整體上提升查詢的吞吐量。沒有統計信息則走RBO的方式。
設定選用哪一種優化模式:
1)Instance級別咱們能夠經過在initSID.ora文件中設定
OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
若是沒設定OPTIMIZER_MODE參數則默認用的是Choose方式。
2)Sessions級別經過ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS來設定。
3)語句級別用Hint(/*+ … */)來設定
爲何表的某個字段明明有索引,但執行計劃卻不走索引?
1)優化模式是all_rows的方式
2)表做過analyze,有統計信息(最可能的就是統計信息有誤)
3)表很小,上文提到過的,Oracle的優化器認爲不值得走索引。
48,oracle訪問數據庫的存取方式:
1)全表掃描:(Full Table Scans, FTS)
爲實現全表掃描,Oracle讀取表中全部的行,並檢查每一行是否知足語句的WHERE限制條件。一個多塊讀操做能夠使一次I/O能讀取多塊數據塊 (db_block_multiblock_read_count參數設定),而不是隻讀取一個數據塊,這極大的減小了I/O總次數,提升了系統的吞吐 量,因此利用多塊讀的方法能夠十分高效地實現全表掃描,並且只有在全表掃描的狀況下才能使用多塊讀操做。在這種訪問模式下,每一個數據塊只被讀一次。使用 FTS的前提條件:在較大的表上不建議使用全表掃描,除非取出數據的比較多,超過總量的5% — 10%,或你想使用並行查詢功能時。
2)經過ROWID的表存取(Table Access by ROWID或rowid lookup)
行的ROWID指出了該行所在的數據文件、數據塊以及行在該塊中的位置,因此經過ROWID來存取數據能夠快速定位到目標數據上,是Oracle存 取單行數據的最快方法。這種存取方法不會用到多塊讀操做,一次I/O只能讀取一個數據塊。咱們會常常在執行計劃中看到該存取方法,如經過索引查詢數據。
3)索引掃描(Index Scan或index lookup)
咱們先經過index查找到數據對應的rowid值(對於非惟一索引可能返回多個rowid值),而後根據rowid直接從表中獲得具體的數據,這 種查找方式稱爲索引掃描或索引查找(index lookup)。一個rowid惟一的表示一行數據,該行對應的數據塊是經過一次i/o獲得的,在此狀況下該次i/o只會讀取一個數據庫塊。
在索引中,除了存儲每一個索引的值外,索引還存儲具備此值的行對應的ROWID值。索引掃描能夠由2步組成:(1) 掃描索引獲得對應的rowid值。 (2) 經過找到的rowid從表中讀出具體的數據。每步都是單獨的一次I/O,可是對於索引,因爲常用,絕大多數都已經CACHE到內存中,因此第1步的 I/O常常是邏輯I/O,即數據能夠從內存中獲得。可是對於第2步來講,若是表比較大,則其數據不可能全在內存中,因此其I/O頗有多是物理I/O,這 是一個機械操做,相對邏輯I/O來講,是極其費時間的。因此若是多大表進行索引掃描,取出的數據若是大於總量的5% — 10%,使用索引掃描會效率降低不少。
根據索引的類型與where限制條件的不一樣,有4種類型的索引掃描:
1)索引惟一掃描(index unique scan)
2)索引範圍掃描(index range scan)
3)索引全掃描(index full scan)
4)索引快速掃描(index fast full scan)
49,查看Oracle sql語句執行計劃:
SQL>EXPLAIN PLAN FOR select * from dual;
50,pctused與pctfree
pctused(percent used)與pctfree(percent free)是Oracle的兩個與性能相關的塊級存儲參數。
pctused:已用百分比,一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操做。 pctfree:空閒百分比,用來爲一個塊保留的空間百分比,以防止在從此的更新操做中增長一列或多列值的長度。 freelist:可用列表是表中的一組可插入數據的可用塊。
行鏈接:指一行存儲在多個塊中的狀況,這是由於該行的長度超過了一個塊的可用空間大小,即行連接是跨越多塊的行。 行遷移:指一個數據行不適合放入當前塊而被從新定位到另外一個塊(那裏有充足的空間)中,但在原始塊中保留一個指針的情形。原始塊中的指針是必需的,由於索 引的ROWID項仍然指向原始位置。
計算公式:
PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
51,oracle表空間管理
表空間(Tablespace)——爲數據庫提供使用空間的邏輯結構,其對應物理結構是數據文件,一個表空間能夠包含多個數據文件。本地管理表空間 (Locally Managed Tablespace簡稱LMT)——8i之後出現的一種新的表空間的管理模式,經過本地位圖來管理表空間的空間使用。 字典管理表空間(Dictionary-Managed Tablespace簡稱DMT)——8i之前包括之後都還能夠使用的一種表空間管理模式,經過數據字典管理表空間的空間。
本地化管理:
就是指Oracle再也不利用數據字典表來記錄Oracle表空間裏面的區的使用情況,而是在每一個表空間的數據文件的頭部加入了一個位圖區,在其中記 錄每一個區的使用情況。每當一個區被使用,或者被釋放以供從新使用時,Oracle都會更新數據文件頭部的這個記錄,反映這個變化。
本地化管理的表空間的建立過程:
語法:CREATE TABLESPACE 表空間名字
DATAFILE ’數據文件詳細信息’
[EXTENT MANAGEMENT { LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
關鍵字EXTENT MANAGEMENT LOCAL 指定這是一個本地化管理的表空間。對於系統表空間,只 能在建立數據庫的時候指定EXTENT MANGEMENT LOCAL,由於它是數據庫建立時創建的第一個表空間。 在8i中,字典管理仍是默認的管理方式,當選擇了LOCAL關鍵字,即代表這是一個本地管理的表空間。固然還能夠繼續選擇更細的管理方式:是 AUTOALLOCATE 仍是 UNIFORM.。若爲AUTOALLOCATE,則代表讓Oracle來決定區塊的使用辦法;若選擇了UNIFORM,則還能夠詳細指定每一個區塊的大 小,若不加指定,則爲每一個區使用1M大小。
本地管理表空間與字典管理表空間相比大大提升了管理效率和數據庫性能,其優勢以下:
1)減小了遞歸空間管理
本地管理表空間是本身管理分配,而不是象字典管理表空間須要系統來管理空間分配,本地表空間是經過在表空間的每一個數據文件中維持一個位圖來跟蹤在此 文件中 塊的剩餘空間及使用狀況。並及時作更新。這種更新只對表空間的額度狀況作修改而不對其餘數據字典表作任何update操做,因此不會產生任何回退信息,從 而大大減小了空間管理,提升了管理效率。同時因爲本地管理表空間能夠採用統一大小分配方式(UNIFORM),所以也大大減少了空間管理,提升了數據庫性 能。
2)系統自動管理extents大小或採用統一extents大小
本地管理表空間有自動分配(AUTOALLOCATE)和統一大小分配(UNIFORM)兩種空間分配方式,自動分配方式 (AUTOALLOCATE)是 由系統來自動決定extents大小,而統一大小分配(UNIFORM)則是由用戶指定extents大小。這兩種分配方式都提升了空間管理效率。
3)減小了數據字典之間的競爭
由於本地管理表空間經過維持每一個數據文件的一個位圖來跟蹤在此文件中塊的空間狀況並作更新,這種更新只修改表空間的額度狀況,而不涉及到其餘數據字典表,從而大大減小了數據字典表之間的競爭,提升了數據庫性能。
4)不產生回退信息
由於本地管理表空間的空間管理除對錶空間的額度狀況作更新以外不修改其它任何數據字典表,所以不產生回退信息,從而大大提升了數據庫的運行速度。
5)不需合併相鄰的剩餘空間
由於本地管理表空間的extents空間管理會自動跟蹤相鄰的剩餘空間並由系統自動管理,於是不須要去合併相鄰的剩餘空間。同時,本地管理表空間的全部extents還能夠具備相同的大小,從而也減小了空間碎片。
6)減小了空間碎片
7)對臨時表空間提供了更好的管理
表空間管理方式轉換:
字典管理表空間每當表或其餘對象須要擴大的時候都檢查其數據字典以確保有可用的空間分配給對象,而後給對象分配一個新區段並更新其可用空間信息。本 地管理表空間保存數據文件自己的空間管理信息,並且表空間自動跟蹤每一個數據文件塊的可用或已用狀態。 在事務比較多的數據庫中顯然字典管理每次插入數據時 都會檢查數據字典,這就使得數據庫性能有所損耗。
1)命令方式轉移。
首先你要新建一個oracle表空間,在oracle 10g之後默認都是採用本地管理表空間的。
對於表空間的轉移使用命令: ALTER TABLE temp MOVE TABLESPACE new_temp;
對於索引你須要重建: ALTER TABLE index REBUILD TABLESPACE new_index;
顯然上面的方法並不適用於對system表進行轉換,由於你不能創建2個同名的system表。
2)採用oracle提供的PL/SQL數據包中的DBMS_SPACE_ADMIN.
在轉換system表前,你必須把全部的其餘表空間轉換爲本地管理。
EXECUTE dbms_space_admin.tablespace_migrate_to_local(」tablespace」); ——轉行表空間
而後一樣的方法將system表空間也進行轉換。
EXECUTE dbms_space_admin.tablespace_migrate_to_local(」system」);
使用這種方法很好,可是它創建的表空間沒有automatic segment space managerment選項,全部字典管理表空間都是用默認手動段空間管理,並且在轉換爲本地管理的表空間是不能進行修改。還有一個缺點,就是表空間若是 存在空間碎片的話,此方法也不能解決碎片問題。
=======》oracle建議採用第一種方法。
52,Oracle ASSM
Oracle 自動段空間管理。從10g開始,oracle開始提供Shrink的命令,假如咱們的表空間中支持自動段空間管理 (ASSM),就能夠使用這個特性縮小段,即下降HWM。
建立一個本地管理的表空間,採用段自動管理方式
create tablespace demo
datafile /ora01/oem/demo01.dbf
size 50m
EXTENT MANAGEMENT LOCAL –必定是本地管理
SEGMENT SPACE MANAGEMENT AUTO. –ASSM管理的標誌
53,若是一個表在2004-08-04 10:30:00 被drop,在有完善的歸檔和備份的狀況下,如何恢復?
手工拷貝回全部備份的數據文件
startup mount;
alter database recover automatic until time ’2004-08-04:10:30:00′;
alter database open resetlogs;
54,rman是什麼,有何特色?
RMAN(Recovery Manager)是DBA的一個重要工具,用於備份、還原和恢復oracle數據庫, RMAN 能夠用來備份和恢復數據庫文件、歸檔日誌、控制文件、系統參數文件,也能夠用來執行徹底或不徹底的數據庫恢復。RMAN有三種不一樣的用戶接口:
COMMAND LINE方式、GUI 方式(集成在OEM 中的備份管理器)、API 方式(用於集成到第三方的備份軟件中)。
具備以下特色:
1)功能相似物理備份,但比物理備份強大N倍;
2)能夠壓縮空塊;
3)能夠在塊水平上實現增量;
4)能夠把備份的輸出打包成備份集,也能夠按固定大小分割備份集;
5)備份與恢復的過程能夠自動管理;
6)能夠使用腳本(存在Recovery catalog 中)
7)能夠作壞塊監測
55,standby的特色
備用數據庫(standby database):ORACLE推出的一種高可用性(HIGH AVAILABLE)數據庫方案,在主節點與備用節點間經過日誌同步來保證數據的同步,備用節點做爲主節點的備份,能夠實現快速切換與災難性恢復,從 920開始,還開始支持物理與邏輯備用服務器。
Oracle 9i中的三種數據保護模式分別是:
1)、MAXIMIZE PROTECTION :最大數據保護與無數據分歧,LGWR將同時傳送到備用節點,在主節點事務確認以前,備用節點也必須徹底收到日誌數據。若是網絡很差,引發LGWR不能傳送數據,將引發嚴重的性能問題,致使主節點DOWN機。
2)、MAXIMIZE AVAILABILITY :無數據丟失模式,容許數據分歧,容許異步傳送。正常狀況下運行在最大保護模式,在主節點與備用節點的網絡斷開或鏈接不正常時,自動切換到最大性能模式, 主節點的操做仍是能夠繼續的。在網絡很差的狀況下有較大的性能影響。
3)、MAXIMIZE PERFORMANCE:這種模式應當能夠說是從8i繼承過來的備用服務器模式,異步傳送,無數據同步檢查,可能丟失數據,可是能得到主節點的最大性能。9i在配置DATA GUARD的時候默認就是MAXIMIZE PERFORMANCE。
56,SGA主要有那些部分,主要做用是什麼
db_cache:
數據庫緩存(Block Buffer)對於Oracle數據庫的運轉和性能起着很是關鍵的做用, 它佔據Oracle數據庫SGA(系統共享內存區)的主要部分。Oracle數據庫經過使用LRU 算法,將最近訪問的數據塊存放到緩存中,從而優化對磁盤數據的訪問.
shared_pool:
共享池的大小對於Oracle 性能來講都是很重要的。共享池中保存數據字典高速緩衝和徹底解析或編譯的的PL/SQL 塊和SQL 語句及控制結構
large_pool:
使用MTS配置時,由於要在SGA中分配UGA來保持用戶的會話,就是用Large_pool來保持這個會話內存。 使用RMAN作備份的時候,要使用Large_pool這個內存結構來作磁盤I/O緩存器
java_pool:
爲java procedure預備的內存區域,若是沒有使用java proc,java_pool不是必須的
57,statspack有何認識
Oracle有提供一個用於診斷性能問題的工具包(statspack).固然,可能也有一些第三方的用於oracle性能診斷的工具,可是我想沒 有其它工具比ORACLE自己提供的工具更全面,更準確了。STATSPACK須要安裝。安裝後咱們須要設置一下檢查的時間間隔,實際上就是建立一個 oracle的JOB。Statspack或根據咱們設定的時間間隔來從oracle的動態性能視圖中捕捉一些與性能相關的數據,而後根據必定的公式進行 計算,生成一個有關於oracle各項性能指標的報告。報告羅列了一些實際的活動情況(負載,內存命中率等等),最高等待事件,以及TOP SQL等內容,是咱們進行性能診斷的一個比較綜合的一個工具。
58,若是系統如今須要在一個很大的表上建立一個索引,你會考慮哪些因素,如何作以儘可能減少對應用的影響。
在系統比較空閒時: 使用nologging選項(若是有dataguard則不能夠使用nologging), 建索引時,Oracle會對數據按照索引進行排序,因此要增大的 sort_ared_size(workarea_size_policy=manual)或 pga_aggregate_target(workarea_size_policy=auto)
59,關於oracle自帶的表
emp:
empno:員工編號; ename:員工名字; job:員工工種; mgr: 上司; hiredate:入職時間;sal: 基本工資; comm: 補貼; deptno:所屬部門編號;
dept:
deptno:部門編號; dname:部門名稱; loc:地理位置;
salgrade:
grade: 工資等級; losal:最低限額; hisal:最高限額;
dual:
系統自帶的一張空表; 可用於計算數據:select 2*3 from dual;
60, 回滾段的做用是什麼
事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務(ROLLBACK)時,ORACLE將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。
事務恢復:當事務正在處理的時候,例程失敗,回滾段的信息保存在undo表空間中,ORACLE將在下次打開數據庫時利用回滾來恢復未提交的數據。
讀一致性:當一個會話正在修改數據時,其餘的會話將看不到該會話未提交的修改。當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的 修改(語句級讀一致性)。當ORACLE執行Select語句時,ORACLE依照當前的系統改變號(SYSTEM CHANGE NUMBER-SCN)來保證任何前於當前SCN的未提交的改變不被該語句處理。能夠想象:當一個長時間的查詢正在執行時,若其餘會話改變了該查詢要查詢 的某個數據塊,ORACLE將利用回滾段的數據前影像來構造一個讀一致性視圖。
61, 綁定變量是什麼?綁定變量有什麼優缺點?
綁定變量是相對文本變量來說的,所謂文本變量是指在SQL直接書寫查詢條件,這樣的SQL在不一樣條件下須要反覆解析,綁 定變量是指使用變量來代替直接書寫條件,查詢bind value在運行時傳遞,而後綁定執行。優勢是減小硬解析,下降CPU的爭用,節省shared_pool ;缺點是不能使用histogram,sql優化比較困難。
62,不借助第三方工具,怎樣查看sql的執行計劃
1)使用Explain Plan,查詢PLAN_TABLE;
SQL> EXPLAIN PLAN
SET STATEMENT_ID=’QUERY1′
FOR
SELECT *
FROM a
WHERE aa=1;
SQL> SELECT operation, options, object_name, object_type, ID, parent_id
FROM plan_table
WHERE STATEMENT_ID = ‘QUERY1′
ORDER BY ID;
2)SQLPLUS中的SET TRACE 便可看到Execution Plan Statistics
SET AUTOTRACE ON;
63,如何定位重要(消耗資源多)的SQL
使用CPU多的用戶session
SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog, a.terminal,a.SQL_TEXT,
osuser, VALUE / 60 / 100 VALUE
FROM v$session a, v$process b, v$sesstat c
WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr
ORDER BY VALUE DESC;
64,如何跟蹤某個session的SQL
利用TRACE 跟蹤
ALTER SESSION SET SQLTRACE ON;
COLUMN SQL format a200;
SELECT machine, sql_text SQL
FROM v$sqltext a, v$session b
WHERE address = sql_address
AND machine = ‘&A’
ORDER BY hash_value, piece;
65,Oracle學習兩大塊:
一塊是開發,一塊是管理。開發主要是寫寫存儲過程、觸發器什麼的,還有就是用Oracle的Develop工具作form。有點相似於程序員,須要 有較強的邏輯思惟和創造能力,是青春飯J;管理則須要對oracle數據庫的原理有深入的認識,有全局操縱的能力和緊密的思惟,責任較大,由於一個小的失 誤就會down掉整個數據庫,相對前者來講,後者更看重經驗。
===>IF 走數據庫路線:數據庫管理的責任重大,不多公司願意請一個剛剛接觸oracle的人去管理數據庫。對於剛剛畢業的年輕人來講,能夠先選擇作開發,有必定經驗後轉型,去作數據庫的管理
===>深刻學習的方向:
管理:能夠考OCP(Oracle9i Certified Professional)證書,對oracle先有一個系統的學習,而後看Oracle Concepts、oracle online document,對oracle的原理會有更深刻的瞭解,同時能夠開始進行一些專題的研究如:RMAN、RAS、STATSPACT、 DATAGUARD、TUNING、BACKUP&RECOVER等等。
開發:對於想作Oracle開發的,在瞭解完Oracle基本的體系結構以後,能夠重點關注PL/SQL及Oracle的開發工具這一部分。 PL/SQL主要是包括怎麼寫SQL語句,怎麼使用Oracle自己的函數,怎麼寫存儲過程、存儲函數、觸發器等。 Oracle的開發工具主要就是Oracle本身的Developer Suite(Oracle Forms Developer and Reports Developer這些),學會如何熟練使用這些工具。
66,oracle中的動態性能表:
表名 | 說明 |
V$ACCESS | 顯示數據庫中的對象信息 |
V$ARCHIVE | 數據庫系統中每一個索引的歸檔日誌方面的信息 |
V$BACKUP | 全部在線數據文件的狀態 |
V$BGPROCESS | 描述後臺進程 |
V$CIRCUIT | 有關虛擬電路信息 |
V$DATABASE | 控制文件中的數據庫信息 |
V$DATAFILE | 控制文件中的數據文件信息 |
V$DBFILE | 構成數據庫全部數據文件 |
V$DB_OBJECT_CACHE | 表示庫高速緩存中被緩存的數據庫對象 |
V$DISPATCHER | 調度進程信息 |
V$ENABLEDPRIVS | 那些特權接通 |
V$FILESTAT | 文件讀/寫統計信息 |
V$FIXED_TABLE | 顯示數據庫中全部固定表、視圖和派生表 |
V$INSTANCE | 當前實例狀態 |
V$LATCH | 每類閂鎖的信息 |
V$LATCHHOLDER | 當前閂鎖佔有者的信息 |
V$LATCHNAME | 在V$LATCH表中表示的閂鎖的譯碼閂鎖名 |
V$LIBRARYCACHE | 庫高速緩衝存儲管理統計 |
V$LICENSE | 許可限制信息 |
V$LOADCSTAT | SQL*Loader在直接裝入執行過程當中的編譯統計 |
V$LOCK | 有關封鎖和資源信息,不包含DDL封鎖 |
V$LOG | 控制文件中的日誌文件信息 |
V$LOGFILE | 有關日誌文件信息 |
V$LOGHIST | 控制文件中的日誌歷史信息 |
V$LOGHISTORY | 日誌歷史中全部日誌的歸檔日誌名 |
V$NLS_PARAMETERS | NLS參數的當前值 |
V$OPEN_CURSOR | 每個用戶會話期當前已打開和分析的光標 |
V$PARAMETER | 當前參數值的信息 |
V$PROCESS | 當前活動進程的信息 |
V$QUEUE | 多線索信息隊列的信息 |
V$REVOVERY_LOG | 須要完成介質恢復的歸檔日誌 |
V$RECOVERY_FILE | 須要介質恢復的文件狀態 |
V$REQDIST | 請求時間直方圖,分爲12個範圍 |
V$RESOURCE | 有關資源信息 |
V$ROLLNAME | 全部在線回滾段的名字 |
V$ROLLSTAT | 全部在線回滾段的統計信息 |
V$ROWCACHE | 數據字典活動的統計信息(每個包含一個數據字典高速緩存的統計信息) |
V$SESSION | 每個當前會話期的會話信息 |
V$SESSION_WAIT | 列出活動會話等待的資源或事件 |
V$SESSTAT | 對於每個當前會話的當前統計值 |
V$SESS_IO | 每個用戶會話的I/O統計 |
V$SGA | 系統全局區統計信息 |
V$SGASTAT | 系統全局區的詳細信息 |
V$SHARED_SERVER | 共享服務器進程信息 |
V$SQLAREA | 共享光標高速緩存區的統計信息,每個有一個共享光標的統計信息 |
V$SQLTEXT | 屬於SGA中的共享SQL光標的SQL語句文本 |
V$STATNAME | 在V$SESSTAT表中表示的統計信息的譯碼統計名 |
V$SYSSTAT | 表V$SESSETA中當前每一個統計的全面的系統值 |
V$THREAD | 從控制文件中獲得線索信息 |
V$TIMER | 以百分之一秒爲單位的當前時間 |
V$TRANSACTION | 有關事務的信息 |
V$TYPE_SIZE | 各類數據庫成分的大小 |
V$VERSION | ORACLE Server中核心庫成員的版本號,每一個成員一行 |
V$WAITSTAT | 塊競爭統計,當時間統計可能時,才能更新該表 |
67,SQL 經常使用命令:
數據檢索: Select
數據維護(DML): insert、update、delete
數據定義(DDL) :create、drop、alert、rename、truncate
事務處理控制:commit、rollback 、savepoint
數據控制(DCL) :Grant、revoke
68,SQL*Plus 的使用:
1)文件命令
a) SAVE filename 把當前SQL緩衝區的內容存儲在文件filename 中
b) GET filename 把文件filename 中的內容寫入當前SQL緩衝區
c) START filename 執行存儲在filename中的內容
d) @ filename 執行存儲在 filename 中的內容
e) EDIT filename 打開文本編輯器,把當前SQL 緩衝區的內容寫入文件afiedt.buf
f) SPOOL filename 把查詢的數據結果存儲在filename 中
g) EXIT 退出SQL*Plus
2)文本編輯命令
a) A[PPEND] text
b) C[HANGE]/old/new
c) CL[EAR]buff[ER]
d) DEL
e) I[NPUT] text
f) L[IST] n
g) N text
69,oracle數據字典的四大視圖類型:
- user 用戶擁有的對象
- all 用戶可訪問對象
- DBA 全部數據對象
- v$ 服務器性能對象
70,oracle通用數據類型:
1)BINARY_INTEGER: 基本數值整型,-2147483647 —–2147483647
2)NUMBER[(precision,scale):] 基本浮點數值型
3)CHAR[(maximun_length)]: 固定長度的字符型,最大值爲32760
4)LONG :可變常字符型,最大長度爲32760
5)LONG RAW:二進制型,最大長度爲32760
6)VARCHAR2(maximum_length): 可變長字符型,最大長度爲32767
7)DATE :日期和時間類型
8)BOOLEAN: 邏輯型(TRUE、FALSE 或NULL)
71,數據庫引擎
數據庫引擎是用於存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限並快速處理事務,從而知足企業內大多數須要處理大量數據的應用程序 的要求。使用數據庫引擎建立用於聯機事務處理或聯機分析處理數據的關係數據庫。這包括建立用於存儲數據的表和用於查看、管理和保護數據安全的數據庫對象 (如索引、視圖和存儲過程)。
78,Mysql引擎:
在缺省狀況下,MySQL支持三個引擎:ISAM、MyISAM和HEAP。另外兩種類型InnoDB和Berkley(BDB),也經常能夠使用。
ISAM
ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到數 據庫被查詢的次數要遠大於更新的次數。所以,ISAM執行讀取操做的速度很快,並且不佔用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不支 持事務處理,也不可以容錯:若是你的硬盤崩潰了,那麼數據文件就沒法恢復了。若是你正在把ISAM用在關鍵任務應用程序裏,那就必須常常備份你全部的實時 數據,經過其複製特性,MySQL可以支持這樣的備份應用程序。
MyISAM
MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM 裏所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個併發的讀寫操做。其代價是你須要常常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMChk工具和用來恢復浪費空間的 MyISAMPack工具。MyISAM強調了快速讀取操做,這可能就是爲何MySQL受到了Web開發如 此青睞的主要緣由:在Web開發中你所進行的大量數據操做都是讀取操做。因此,大多數虛擬主機提供商和Internet平臺提供商(Internet Presence Provider,IPP)只容許使用MyISAM格式。
HEAP
HEAP容許只駐留在內存裏的臨時表格。駐留在內存裏讓HEAP要比ISAM和 MyISAM都快,可是它所管理的數據是不穩定的,並且若是在關機以前沒有進行保存,那麼全部的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費 大量的空間。HEAP表格在你須要使用SELECT表達式來選擇和操控數據的時候很是有用。要記住,在用完表格以後就刪除表格。讓我再重複一遍:在你用完 表格以後,不要忘記刪除表格。
InnoDB和Berkley DB
InnoDB和Berkley DB(BDB)數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MySQL++ API。在使用MySQL的時候,你所面對的每個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理也不支持外來鍵。儘管要比ISAM和 MyISAM引擎慢不少,可是InnoDB和BDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,若是你的設計須要這些特性 中的一者或者二者,那你就要被迫使用後兩個引擎中的一個了。
數據庫引擎設定與切換:
1)CREATE TABLE tblMyISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
)TYPE=MyISAM;
2)ALTER TABLE tblMyISAM CHANGE TYPE=InnoDB;
3)SHOW TABLE STATUS FROM tblInnoDB;
79,Mysql6的新特性:(與mysql5比較)
1)新Falcon事務存儲引擎(「Falcon存儲引擎」 ) 。
2)支持更多的Unicode字符集: utf16 , utf32 ,和4字節utf8 。 這些字符集支持這些附加的Unicode字符集,也就是那些在基礎多語言基礎以外的字符 。
3)增長了 BACKUP DATABASE 和 RESTORE 語句來進行備份和還原操做. 見第6.3節, 「使用MySQL備份」 。
4)改進INFORMATION_SCHEMA數據庫,並增長了INFORMATION_SCHEMA.PARAMETERS 表,INFORMATION_SCHEMA.ROUTINES 增長了