OCP 052 課堂筆記css
目錄html
第一部分: Oracle體系架構... 4java
第一章:實例與數據庫... 4node
一、Oracle 網絡架構及應用環境... 4linux
二、Oracle 體系結構... 4ios
三、 SGA. 5web
4 Oracle的進程: 9sql
5 PGA. 12數據庫
六、用戶與Oracle服務器的鏈接方式... 12windows
第二章:實例管理及數據庫的啓動/關閉... 14
2.1 實例和參數文件... 14
2.2 數據庫啓動與關閉:... 16
2.3 告警日誌:alert_SID.log. 18
2.4 口令文件... 19
2.5 添加scott 案例... 21
第三章:控制文件... 22
3.1 控制文件的功能和特色:... 22
3.2 控制文件的內容... 22
3.3 控制文件多元化... 24
3.4 控制文件的重建與備份... 24
3.5 控制文件手工恢復... 25
第四章: redo 日誌... 26
4.1 redo (重作) log 的功能:數據recovery. 27
4.2 redo log 特徵:... 27
4.3 redo 日誌組... 27
4.4 如何添加日誌組... 27
4.5 如何添加日誌組的成員... 29
4.6 如何查看日誌信息... 30
4.7 redo 日誌成員重命名或遷移... 31
第五章: 歸檔日誌 archivelog. 40
5.1 歸檔和非歸檔的區別... 40
5.2 查看歸檔模式:... 41
5.3 設置歸檔模式... 41
5.四、歸檔日誌的路徑及命名方法... 41
5.5 在liunx下查看歸檔進程... 43
5.6 日誌歸檔:... 44
第六章 日誌挖掘 log miner. 45
6.1 log miner的做用:... 45
6.2 有兩種日誌挖掘方法 針對DML和DDL,整理以下 :... 45
第七章: 管理undo. 49
7.1 undo做用... 49
7.2 undo 的管理模式:... 49
7.3 undo 表空間管理... 49
7.4 查看當前正在使用的undo tablespace. 50
7.5 切換undo. 51
7.6 刪除undo tablespace. 52
7.7 undo block的4種狀態... 52
7.8 關於undo_retention 參數... 53
7.9 undo 信息的查詢... 54
7.10 system表空間的undo. 55
7.11 測試:模擬數據庫open下的undo損壞和修復。... 55
第八章 檢查點(checkpoint) 59
8.1 什麼是checkpoint. 59
8.2 checkpoint主要2個做用:... 60
8.3 checkpoint分類... 60
8.4 設置合理的MTTR參數... 63
8.5 局部檢查點的觸發條件:... 64
第九章 實例恢復機制... 64
第二部分 Oracle的存儲架構... 65
第十章 數據字典... 65
10.1 數據字典... 65
10.2 動態性能表(V$)... 66
第十一章: Oracle的存儲架構... 67
11.1 TABLESPACE(表空間)特色... 67
11.2 SEGMENT(段)... 73
11.3 EXTENT(區)... 75
11.4 BLOCK(數據塊)... 79
11.5 臨時表空間... 84
11.6 如何調整表空間的尺寸(表空間的大小等同它下的數據文件大小之和)... 88
11.7 Oracle的Resumable功能... 90
第十二章: Oracle中表的幾種類型... 90
12.1 分區表及其種類(10g) 90
12.2 索引組織表... 95
12.3 簇表(cluster table):... 96
12.4 臨時表:... 97
12.5 只讀表 (11g新特性)... 97
第十三章: 數據庫審計audit. 98
13.4 審計的對象:... 99
13.5 舉例:... 99
第十四章: 數據裝載 sql loader. 101
第十五章: oracle 網絡... 105
15.1 Oracle Net 基本要素:... 105
15.2 客戶端連接:... 106
15.3 lisenter 註冊:... 106
第三部分: 管理ORACLE數據庫... 111
第十六章:Oracle ASM 管理(ppt-II:602-636) 111
16.1 什麼是ASM.. 111
16.2 系統級的磁盤管理... 111
16.3 ASM和LSM的比較... 111
16.4 ASM體系結構... 112
16.5 在Linux上建立ASM實例的範例... 114
第十七章:邏輯備份與恢復... 124
17.1 傳統的導入導出exp/imp:... 125
第十八章 物化視圖... 133
看ppt,Oracle結構的基本單元、術語
1)oracle server :database + instance
2)database:data file 、control file 、 redolog file
3)instance: an instance access a database
//一個實例訪問一個數據庫
4)oracle memory: sga + pga
5)instance : sga + backgroud process
//sga+後臺進程
6)sga組成:sga 在一個instance只有一個sga,sga爲全部session共享,隨着instance啓動而分配,instance down ,sga被釋放。
//system groble areas
1) shared pool
共享池是對SQL、PL/SQL程序進行語法分析、編譯、執行的內存區域。
共享池由庫緩存(library cache),和數據字典緩存(data dictionary cache)組成。
共享池的大小直接影響數據庫的性能。
關於shared pool中的幾個重要概念
library cache: sql和plsql的解析場所,存放着全部編譯過的sql語句代碼,以備全部用戶共享。
sql語句解析過程:
硬解析:
1)分析:包括SQL語句的語法和語義檢驗,並檢查所執行活動的對象權限。
2)優化:Oracle優化程序在評估了幾種備選方案後,得出如何以最低成本(COST )處理相應語句的最終方案。
軟解析:
3)執行:Oracle執行這個執行計劃。(這個成本最低的執行計劃也包括訪問路徑,也存在庫緩存中)
4)取數據:只用於select語句,這個步驟在非查詢語句中不須要。
data dictionary cache: 存放重要的數據字典信息,以備數據庫使用
2) database buffer cache
用於存儲從磁盤數據文件中讀入的數據,全部用戶共享。
服務器進程(server process)將讀入的數據保存在數據緩衝區中,當後續的請求須要這些數據時能夠在內存中找到,則不須要再從磁盤讀取。
數據緩衝區中被修改的數據塊(髒塊)由後臺進程DBWR將其寫入磁盤。
數據緩衝區的大小對數據庫的讀取速度有直接的影響。
考點:服務器進程對數據文件執行讀操做,而DBWN負責對數據文件執行寫操做。
db buffer中的幾個cache參數:
db_cache_size //指定標準塊大小內存空間,好比標準塊是8k,LRU 默認數據塊放到default cache
db_nk_cache_size //指定非標準塊大小內存空間,好比2k、4k、16k、32k。
db_keep_cache_size //keep 存放常常訪問的小表或索引等
db_recycle_cache_size //與keep相反,存放偶爾作全表掃描的大表的數據
注意:
2.1)keep cache和recycle cache是可選的。所有buffer cache的大小就是以上參數的總合。即沒有分配到keep cache和recycle cache的任何數據庫對象都將分配給default cache。說的更清楚些就是default, keep, recycle 相互獨立,對於某一個對象(表)來講,它只能屬於它們之中的一種。
SQL> alter table scott.emp1 storage(buffer_pool keep);
SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';
SEGMENT_NAME BUFFER_
--------------------------------------------------------------------------------- -------
EMP1 KEEP
2.2)default_cache_szie和標準塊default block是配套的,若是default block是8k, db_cache_size這個參數將代替db_8k_cache_size。
若是要創建非標準塊的表空間,先前要設定db buffer中的與之對應的nk_cache_size。
09:50:46 SQL> alter system set db_16k_cache_size=8m; //改參數,先把db buffer裏的16k cache建上。
09:50:49 SQL> create tablespace tbs_16k datafile '/u01/oradata/timran11g/tbs16k01.dbf' size 10m blocksize 16k;
09:51:29 SQL> select TABLESPACE_NAME,block_size from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
SYSTEM 8192
UNDOTBS1 8192
SYSAUX 8192
TEMP 8192
USERS 8192
EXAMPLE 8192
TBS_16K 16384
2.3)查看buffer cache命中率:
18:28:20 SQL>select (1-(sum(decode(name, 'physical reads',value,0))/(sum(decode(name, 'db block gets',value,0))+sum(decode(name,'consistent gets',value,0))))) * 100 "Hit Ratio" from v$sysstat;
Hit Ratio
----------
97.6811923
3)redo log buffer
日誌條目(redo entries )記錄了數據庫的全部修改信息(包括DML和DDL),用於數據庫恢復,日誌條目首先產生於日誌緩衝區。
日誌緩衝區較小,它是以字節爲單位的,它極其重要。
18:29:04 SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 7057408
*考點:日誌緩衝區的大小是不變的,啓動時就是固定值,只能手動設置,不能由SGA自動管理!
若是想讓它是一個最小值,這樣能夠作:
18:30:24 SQL> alter system set log_buffer =1 scope=spfile; //修改動態參數文件,下次啓動有效。
18:31:20 SQL> startup force
18:31:35 SQL> show parameter log_buffer;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 2927616 //這就是最小值了
4) large pool(可選)
爲了進行大的後臺進程操做而分配的內存空間,與shared pool管理不一樣,主要用於並行查詢,RMAN備份恢復、以及共享鏈接方式等。
5) java pool(可選)
爲了java虛擬機及應用而分配的內存空間,包含大量JAVA代碼。
6) stream pool(可選)
爲了stream應用而分配的內存空間。stream技術是爲了在不一樣數據庫之間共享數據,所以,它只對使用了stream數據庫特性的系統是重要的。
從Oracle10g有了SGA自動管理,有關的pool能夠動態自動調整
a)sga_max_size:SGA最大物理空間
b)sga_target: SGA實際可達最大空間,sga_target<=sga_max_size,設定這個值>0時就使能了SGA的自動管理。
c)granules(顆粒):組成oracle內存的最小單位
sga_max_size <1G ,4m
sga_max_size >1G ,16m
20:12:30 SQL> select name ,bytes/1024/1024 "Size(M)" from v$sgainfo; //在oracle裏查看SGA分配狀況
NAME Size(M)
-------------------------------- ----------
Fixed SGA Size 1.2401123
Redo Buffers 1.84765625
Buffer Cache Size 56
Shared Pool Size 152
Large Pool Size 4
Java Pool Size 12
Streams Pool Size 4
Shared IO Pool Size 0
Granule Size 4
Maximum SGA Size 403.089844
Startup overhead in Shared Pool 40
Free SGA Memory Available 172
三種process: 1)user process、 2)server process 、3)background process
user process:屬於客戶端的process,通常分爲三種形式,1)sql*plus, 2)應用程序,3)web方式(OEM)
客戶端請求,sqlplus是客戶端命令,oracle不允許user process直接訪問oracle server。
*考點:由user process形成的會話終止,系統將自動回滾這個會話上的處於活動狀態的事務。
若是windows做爲客戶端:能夠經過查看任務管理器看到sqlplus用戶進程:
C:\Documents and Settings\timran>sqlplus sys/system@timran11g as sysdba
linux做爲客戶端時能夠使用ps看到sqlplus關鍵字:
[oracle@timran ~]$ ps -ef |grep sqlplus
oracle 2353 2325 0 17:02 pts/0 00:00:00 rlwrap sqlplus / as sysdba
oracle 2354 2353 0 17:03 pts/1 00:00:00 sqlplus as sysdba
oracle 2603 2445 0 17:25 pts/2 00:00:00 grep sqlplus
server process:這是服務器端的進程,user process不能直接訪問Oracle,必須經過相應的server process訪問實例,進而訪問數據庫。
[oracle@timran ~]$ ps -ef |grep LOCAL
oracle 2399 2354 1 17:03 ? 00:00:04 oracletimran11g (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 2503 1 0 17:05 ? 00:00:00 oracletimran11g (LOCAL=NO)
oracle 2512 2445 0 17:07 pts/2 00:00:00 grep LOCAL
[oracle@timran ~]$
//注意:在linux下看到的server process, (LOCAL=YES)是本地鏈接,(LOCAL=NO)是遠程鏈接。
backgroud process :
很是重要!有許多後臺進程,先掌握六個。查看方法 ps 、v$process 、v$bgprocess
----------查看後臺進程
[oracle@timran ~]$ ps -ef |grep ora_
oracle 2617 1 0 01:26 ? 00:00:00 ora_pmon_timran
oracle 2619 1 0 01:26 ? 00:00:00 ora_psp0_timran
oracle 2621 1 0 01:26 ? 00:00:00 ora_mman_timran
oracle 2623 1 0 01:26 ? 00:00:00 ora_dbw0_timran
oracle 2625 1 0 01:26 ? 00:00:00 ora_lgwr_timran
oracle 2627 1 0 01:26 ? 00:00:00 ora_ckpt_timran
oracle 2629 1 0 01:26 ? 00:00:00 ora_smon_timran
oracle 2631 1 0 01:26 ? 00:00:00 ora_reco_timran
oracle 2633 1 0 01:26 ? 00:00:00 ora_cjq0_timran
oracle 2635 1 0 01:26 ? 00:00:01 ora_mmon_timran
oracle 2637 1 0 01:26 ? 00:00:00 ora_mmnl_timran
oracle 2639 1 0 01:26 ? 00:00:00 ora_d000_timran
oracle 2641 1 0 01:26 ? 00:00:00 ora_s000_timran
oracle 2645 1 0 01:26 ? 00:00:00 ora_p000_timran
oracle 2647 1 0 01:26 ? 00:00:00 ora_p001_timran
oracle 2649 1 0 01:26 ? 00:00:01 ora_arc0_timran
oracle 2651 1 0 01:26 ? 00:00:00 ora_arc1_timran
oracle 2653 1 0 01:26 ? 00:00:00 ora_arc2_timran
oracle 2655 1 0 01:26 ? 00:00:00 ora_qmnc_timran
oracle 2661 1 0 01:26 ? 00:00:00 ora_q000_timran
oracle 2663 1 0 01:26 ? 00:00:00 ora_q001_timran
oracle 2676 1 0 01:29 ? 00:00:00 ora_j000_timran
oracle 2678 2486 0 01:29 pts/2 00:00:00 grep ora_
六個後臺進程(background process)
smon:系統監控進程
在實例崩潰以後,Oracle會自動恢復實例。另外一個做用是整理數據文件的自由空間,將相鄰區域結合起來。釋放再也不使用的臨時段。
pmon:進程監控進程
process monitor(監控session)清理出現故障的進程。 釋放全部當前掛起的鎖定。釋放故障進程使用的資源。
dbwr: 數據寫入進程
一、將修改後的緩衝區(髒buffer)數據寫入數據文件中。寫髒塊。
二、釋放data buffer空間。
注意:如下幾種狀況發生時 dbwr都會寫
1)ckpt發生,2)髒塊太多時,3)db_buffer自由空間不夠時,4)延遲發生,5)表空間redo only/offline/backup等
考點:commit時dbwn有何舉動?答案是:它什麼也不作!
lgwr:寫日誌條目,從redo log buffer到redo logfile (必須在dbwr寫髒塊以前寫入日誌)
負責將日誌緩衝區中的日誌條目寫入日誌文件。 系統有多個日誌文件,該進程以循環的方式將數據寫入文件。
注意:如下5個情況發生時, lgwr都會寫
1)commit, 2)三分之一滿,3)1m滿,4)3秒, 5)先於dbwr寫而寫(先記後寫,即dbwn正好要執行寫入前)
ckpt:生成檢查點, 通知或督促dbwr寫髒塊
徹底檢查點:保證數據一致性。增量檢查點:不斷更新控制文件中的檢查點位置,當發生實例崩潰時,能夠儘可能縮短實例恢復的時間,。
arcn:歸檔模式下,發生日誌切換時,把當前日誌組中的內容寫入歸檔日誌,做爲備份歷史日誌。
考點:lgwr負責對聯機日誌文件寫操做,arcn負責讀取聯機日誌文件。其餘進程與日誌文件不接觸。
11g裏又強調了其餘幾個後臺進程,它們都和數據庫性能有關,有關內容將在053課程介紹:
MMON: oracle自我監視和自我調整的支持進程(與AWR有關)
MMNL:MMON的輔助進程(與ASH有關)
MMAN:內存自動管理,10g時推出,11g獲得增強,在11g裏這個進程負責Oracle內存結構(SGA+PGA)的自動調整。
CJQN: 與job隊列有關
屬於oracle內存結構,存放用戶遊標、變量、控制、數據排序、存放hash值。與SGA不一樣,PGA是獨立的,非共享
從Oracle9i開始有了pga 的自動管理:
workarea_size_policy =auto ;
pga_aggregate_target >0
因爲是pga的自動管理 hash_area_size,sort_area_size 這兩個參數如今已經不用了。
對於客戶端的每一個user process,服務器端都會出現一個server process,會話與專用服務器之間存在一對一的映射。
對專用鏈接來講,用戶在客戶端啓動了一個應用程序,例如sql*plus,就是在客戶端啓動一個用戶進程;與oracle服務器端鏈接成功後,會在服務器端生成一個服務器進程,該服務器進程做爲用戶進程的代理進程,代替客戶端執行各類命令並把結果返回給客戶端。用戶進程一旦停止,與之對應的服務器進程馬上停止。
專用鏈接的PGA的管理方式是私有的。如今,大多狀況下,oracle缺省採用專用鏈接模式。
多個user process共享一個server process。它經過調度進程(dispatcher)與共享服務器鏈接,共享服務器實際上就是一種鏈接池機制(connectionpooling),鏈接池能夠重用已有的超時鏈接,服務於其它活動會話。但容易產生鎖等待。此種鏈接方式如今已經不多見了,可是在OCP11g考試中有幾個考點與其有關:
用戶進程1 用戶進程2 用戶進程3
. |-----------------------| . | .
. | . | .
....... 調度進程1............ 調度進程2
. | | .
. |--------------- -----------------| .
. | | .
. | | .
調度響應隊列1 | | 調度響應隊列2
. 公共請求隊列 .
. | .
. | .
. 服務器進程 .
. | .
..................|...................
*考點:
1)全部調度進程共享一個公共的輸入隊列,可是每一個調度進程都有與本身響應的隊列。
2)在共享服務器中會話是在SGA中的(UGA)存儲信息,而不像專用鏈接那樣在PGA中存儲信息,這時的PGA的存儲結構爲堆棧空間。
適用於必須維持數據庫的永久鏈接。結合了專用服務器模式和共享服務器模式的特色,它提供了服務器鏈接池,可是放入鏈接池的是專用服務器。它使用鏈接代理(而不是專用服務器)鏈接客戶機到數據庫,優勢是能夠用不多的內存處理大量併發鏈接(11g新特性,特別針對Apache的PHP應用環境)。
一、instance 功能:用於管理和訪問database。
二、init parameter files :管理實例相關啓動參數 。位置:$ORACLE_HOME/dbs
三、pfile :靜態參數文件。1)文本文件,能夠經過編輯器進行修改參數。 2)修改參數必須關閉實例,下次重啓實例才生效。
命名方式:init+SID.ora
四、spfile :動態參數文件。 1)二進制文件,不能夠經過編輯器修改。 2)Linux 下strings能夠查看
命名方式: spfile+SID.ora
修改動態參數文件方式:
alter system set 參數=值 默認是第三種
alter session set 參數=值
第一種scope=memory 參數修改馬上生效,但不修改spfile文件。
第二種scope=spfile 修改了spfile文件,重啓後生效。
第三種scope=both 前兩種都要知足。
若是不寫scope,即缺省,那就是第三種。
*考點:若是不將scope=spfile,將沒法更改靜態參數。
經過查看v$parameter ,能夠肯定那些參數能夠在memory修改,制定scope
10:38:35 SQL> desc v$parameter;
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NUMBER
NAME VARCHAR2(80)
TYPE NUMBER
VALUE VARCHAR2(512)
DISPLAY_VALUE VARCHAR2(512)
ISDEFAULT VARCHAR2(9)
ISSES_MODIFIABLE VARCHAR2(5)
ISSYS_MODIFIABLE VARCHAR2(9)
ISINSTANCE_MODIFIABLE VARCHAR2(5)
ISMODIFIED VARCHAR2(10)
ISADJUSTED VARCHAR2(5)
ISDEPRECATED VARCHAR2(5)
DESCRIPTION VARCHAR2(255)
UPDATE_COMMENT VARCHAR2(255)
HASH NUMBER
其中:
ISSYS_MODIFIABLE參數:對應alter system 命令,即系統級修改
10:38:35 SQL> select distinct issys_modifiable from v$parameter;
ISSYS_MODIFIABLE
----------------
IMMEDIATE //對應scope=memory
FALSE //只能scope=spfile,即修改spfile文件,下次啓動才生效。
DEFERRED //其餘session有效
ISSES_MODIFIABLE參數:對應alter session命令,即session級修改
10:38:35 SQL> select distinct isses_modifiable from v$parameter;
ISSES_MODIFIABLE
----------------
TRUE //表示能夠修改
FALSE //表示不能修改
10:38:35 select isses_modifiable,issys_modifiable from v$parameter where lower(name)='log_buffer';
ISSES_MODIFIABLE ISSYS_MODIFIABLE
---------------- ----------------
FALSE FALSE
這個結果表示 log_buffer參數在session方式不能改,
在system方式memory不能改,both固然也不行,只能是spfile下次有效。
五、startup時讀取參數文件,找到$ORACLE_HOME/dvs目錄,順序是優先spfile啓動,沒有spfile 才從pfile啓動。
pfile和spfile能夠相互生成:
SQL>create pfile from spfile
SQL>create spfile from pfile(使用spfile啓動後不能在線生成spfile,ORA-32002: 沒法建立已由實例使用的 SPFILE)
*考點:若是使用pfile啓動,設置scope=spfile將失敗!
能夠經過當前內存參數生成pfile和spfile(11g新特性):
SQL>create pfile from memory;
SQL>create spfile from memory;
有了spfile,pfile通常留作備用,特殊狀況也能夠使用pfile啓動,命令以下:
10:38:35 SQL> startup pfile=$ORACLE_HOME/dbs/inittimran.ora
10:38:35 SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/10.2.0
/db_1/dbs/spfileprod.ora
//若是value有值,說明數據庫啓動時讀的是spfile
1)nomount階段:讀取init parameter
10:38:35 SQL> select status from v$instance; (這條命令很實用,是看當前數據庫啓動的狀態,有三個 stated,mounted,open.)
STATUS
------------
STARTED
2)mount階段: 讀取控制文件
20:32:53 SQL> select status from v$instance;
STATUS
------------
MOUNTED
3)open階段: 一、檢查全部的datafile、redo log、 group 、password file。
二、檢查數據庫的一致性(controlfile、datafile、redo file的檢查點是否一致)
10:38:35 SQL> select file#,checkpoint_change# from v$datafile; //從控制文件讀出
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 570836
2 570836
3 570836
4 570836
5 570836
6 570836
6 rows selected.
10:38:35 SQL> select file#,checkpoint_change# from v$datafile_header; //從datafile header 讀出來
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 570836
2 570836
3 570836
4 570836
5 570836
6 570836
6 rows selected.
數據庫open以前要檢查controlfile所記錄SCN和datafile header 記錄的SCN是否一致;一致就正常打開庫,不一致須要作media recover
10:38:35 SQL> select status from v$instance;
STATUS
------------
OPEN
shutdown normal: 拒絕新的鏈接,等待當前事務結束,等待當前會話結束,生成檢查點
shutdown transaction :拒絕新的鏈接,等待當前事務結束,生成檢查點
shutdown immediate: 拒絕新的鏈接,未提交的事務回滾,生成檢查點 //默認
shutdown abort(startup force) :事務不回滾,不生成檢查點,下次啓動須要作instance recovery
*考點:shutdown abort 不會損壞database。
10:38:35 SQL> show parameter dump //這是Oracle11g的。
SQL> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
core_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
在oracle 11g中,故障診斷及跟蹤的文件路徑改變較大,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。
這兩份log文件的位置分別是V$DIAG_INFO中的Diag Alert 和Diag Trace 對應的目錄。
SQL> select * from v$diag_info;
INST_ID NAME VALUE
---------- ---------------------------------------- -----------------------------------------------------------------
1 Diag Enabled TRUE
1 ADR Base /u01
1 ADR Home /u01/diag/rdbms/timran11g/timran11g
1 Diag Trace /u01/diag/rdbms/timran11g/timran11g/trace
1 Diag Alert /u01/diag/rdbms/timran11g/timran11g/alert
1 Diag Incident /u01/diag/rdbms/timran11g/timran11g/incident
1 Diag Cdump /u01/diag/rdbms/timran11g/timran11g/cdump
1 Health Monitor /u01/diag/rdbms/timran11g/timran11g/hm
1 Default Trace File /u01/diag/rdbms/timran11g/timran11g/trace/timran11g_ora_3381.trc
1 Active Problem Count 0
1 Active Incident Count 0
其中Diag Trace對應的目錄爲文本格式的告警日誌,及咱們在10g中常常習慣使用的日誌
[oracle@timran trace]$ tail -f /u01/diag/rdbms/timran11g/timran11g/trace/alert_timran11g.log
space available in the underlying filesystem or ASM diskgroup.
Tue Sep 04 09:12:19 2012
Completed: ALTER DATABASE OPEN
Tue Sep 04 09:16:41 2012
Starting background process CJQ0
Tue Sep 04 09:16:41 2012
CJQ0 started with pid=29, OS id=2483
Tue Sep 04 10:19:11 2012
drop tablespace tb1
Completed: drop tablespace tb1
oracle登陸認證方式有多種
sys的兩種經常使用的登陸認證方式:OS認證和口令文件認證,
1)OS認證:Oracle不驗證用戶密碼,條件:用戶必須屬於DBA組,且使用本地登陸
如:sqlplus / as sysdba
2)口令文件認證:是一種遠程認證方式,只有sysdba權限的用戶能夠使用口令文件,必須輸入密碼和網路鏈接符。
如:sqlplus sys/oracle@timran11g as sysdba
普通用戶,沒有sysdba權限的用戶,好比system 、scott,或者是tim什麼的,登陸時都必須輸入口令,無論是本地仍是遠程,它們的口令密碼不是以文件形式存放的,它們存放在oracle內部的數據字典裏。
經過設置這個參數爲TURE,可讓口令是大小寫敏感的(11g新特性)
本節討論的口令文件是sysdba用戶的遠程登陸認證密碼文件,主要用於sys用戶遠程登陸的認證。
位置:$ORACLE_HOME/dbs/orapwSID.
SQL> show parameter case
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon boolean TRUE
因此口令文件,指的就是sys的口令文件,能夠經過remote_login_passwordfile參數控制是否生效
參數remote_login_passwordfile的三種模式:
1) none 拒絕sys用戶從遠程鏈接
2)exclusive sys用戶能夠從遠程鏈接
3)share 多個庫能夠共享口令文件
[oracle@timran ~]$ cd /u01/oracle/dbs
[oracle@timran dbs]$ ll
總計 52
-rw-rw---- 1 oracle oinstall 1544 08-17 07:19 hc_timran11g.dat
-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora
-rw-r--r-- 1 oracle oinstall 8385 1998-09-11 init.ora
-rw-r--r-- 1 oracle oinstall 1024 08-17 13:23 inittimran11g.ora
-rw-r----- 1 oracle oinstall 24 08-17 07:21 lkTIMRAN11
-rw-r----- 1 oracle oinstall 24 08-17 10:36 lkTIMRAN11G
-rw-r----- 1 oracle oinstall 1536 08-31 10:47 orapwtimran11g
-rw-r----- 1 oracle oinstall 3584 09-04 17:49 spfiletimran11g.ora
這裏是放參數文件和(sys)口令文件的地方,orapwtimran11g就是個人sys口令文件
使用orapwd命令建立sys口令文件:
你能夠先刪掉它,再建立它,在linux下作:
[oracle@timran dbs]$ rm orapwtimran11g //把sys口令文件刪了
[oracle@timran dbs]$ ll
總計 48
-rw-rw---- 1 oracle oinstall 1544 08-17 07:19 hc_timran11g.dat
-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora
-rw-r--r-- 1 oracle oinstall 8385 1998-09-11 init.ora
-rw-r--r-- 1 oracle oinstall 1024 08-17 13:23 inittimran11g.ora
-rw-r----- 1 oracle oinstall 24 08-17 07:21 lkTIMRAN11
-rw-r----- 1 oracle oinstall 24 08-17 10:36 lkTIMRAN11G
-rw-r----- 1 oracle oinstall 3584 09-04 17:54 spfiletimran11g.ora
[oracle@timran dbs]$orapwd file=orapwtimran11g password=oracle entries=5 force=y //從新創建口令文件
注意:file=orapw+sid的寫法
entries的含義是表示口令文件中能夠存放的最大用戶數,對應於容許以SYSDBA/SYSOPER權限登陸數據庫的最大用戶數,若是用戶數超過這個值只能重建口令文件。
有時候,scott用戶被誤刪掉了,沒關係,能夠經過執行下列腳本從新創建。
10:38:35 SQL> @$ORACLE_HOME/rdbms/admin/utlsampl.sql
你們能夠試一下:先刪除scott用戶,再執行一下腳本便可。(不是全部案例都有恢復腳本,HR就沒有)
1)定義數據庫當前物理狀態
2)維護數據的一致性
3)二進制文件
4)在mount階段被讀取
5)記錄RMAN備份恢復信息
查看database控制文件位置:
19:02:27 SQL> show parameter control_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/oradata/timran11g/control01.
ctl, /u01/oradata/timran11g/contr
ol02.ctl, /u01/oradata/timran11g/
control03.ctl
19:02:42 SQL> select name from v$controlfile;
NAME
-----------------------------------------------------------------------------------------------------
/u01/oradata/timran11g/control01.ctl
/u01/oradata/timran11g/control02.ctl
/u01/oradata/timran11g/control03.ctl
19:02:59 SQL> alter database backup controlfile to trace; //生成了重作控制文件腳本,存放的位置:注意10g和11g有很大不一樣。
19:03:18 SQL> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
core_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
能夠看到11g的dump路徑和命名方式較10g改動較大,
10g中的bdump與udump合併到了一塊兒,目錄都是 /u01/diag/rdbms/timran11g/timran11g/trace
trace的內容存放在該目錄的最新的那個.trc裏。
[oracle@timran trace]$ $ ls -trl *.trc //在linux下,-trl參數能夠按時間排列出.trc名字
[oracle@timran trace]$ $ cat timran11g_ora_2407.trc //顯示出在這個.trc文件裏的一段內容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TIMRAN11" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/timran11g/redo01.log' SIZE 50M,
GROUP 2 '/u01/oradata/timran11g/redo02.log' SIZE 50M,
GROUP 3 '/u01/oradata/timran11g/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u01/oradata/timran11g/system01.dbf',
'/u01/oradata/timran11g/sysaux01.dbf',
'/u01/oradata/timran11g/undotbs01.dbf',
'/u01/oradata/timran11g/users01.dbf',
'/u01/oradata/timran11g/example01.dbf'
CHARACTER SET ZHS16GBK
;
1)配置多個control_files,控制文件最好有三個,是相互鏡像的(shutdown下cp命令複製便可),而後修改spfile中的control_files參數,Oracle建議分配在不一樣的物理磁盤上。
*考點:最多能夠有8個control files多路複用。
19:10:25 SQL> alter system set control_files='/u01/oradata/timran11g/control01.ctl','/u01/disk1/control02.ctl','/u01/disk1/control03.ctl' scope=spfile;
System altered.
2)三個control文件要一致(同一版本,scn相同),原本就是鏡像關係
-rw-r----- 1 oracle oinstall 7356416 07-16 20:00 control01.ctl
-rw-r----- 1 oracle oinstall 7356416 07-16 20:01 control02.ctl
-rw-r----- 1 oracle oinstall 7356416 07-16 20:01 control03.ctl
3)控制文件查看:v$controlfile 、show parameter controlfile、 v$parameter
1.trace: 用於控制文件重建 (生成的trace 文件在udump)
19:59:24 SQL> alter database backup controlfile to trace;
或者 SQL>alter database backup controlfile to trace as '/u01/oradata/timran11g/con.trace'; //存到本身起的文件名裏。
Database altered.
2.binary 文件:控制文件的備份
20:00:20 SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak';
Database altered.
1)單個文件,假設使用的是spfile指定的控制文件之一損壞了:
數據庫關閉下,使用操做系統命令複製其副本到指定的位置。
2)全部的控制文件丟失,(正常關閉,shutdown immediate後刪除控制文件)
假設控制文件的備份也沒有,利用前面作的trace文件從新生成控制文件
在nomount 狀態下執行前面曾作過的trace腳本
15:37:16 SQL> startup force nomount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 113247848 bytes
Database Buffers 163577856 bytes
Redo Buffers 7168000 bytes
15:37:49 SQL> CREATE CONTROLFILE REUSE DATABASE "TIMRAN" NORESETLOGS ARCHIVELOG
15:37:52 2 MAXLOGFILES 16
15:37:52 3 MAXLOGMEMBERS 3
15:37:52 4 MAXDATAFILES 100
15:37:52 5 MAXINSTANCES 8
15:37:52 6 MAXLOGHISTORY 292
15:37:52 7 LOGFILE
15:37:52 8 GROUP 1 '/u01/oradata/timran11g/redo01.log' SIZE 50M,
15:37:52 9 GROUP 2 '/u01/oradata/timran11g/redo02.log' SIZE 50M,
15:37:52 10 GROUP 3 '/u01/oradata/timran11g/redo03.log' SIZE 50M
15:37:52 11 -- STANDBY LOGFILE
15:37:52 12 DATAFILE
15:37:52 13 '/u01/oradata/timran11g/system01.dbf',
15:37:52 14 '/u01/oradata/timran11g/undotbs01.dbf',
15:37:52 15 '/u01/oradata/timran11g/sysaux01.dbf',
15:37:52 16 '/u01/oradata/timran11g/users01.dbf',
15:37:52 17 '/u01/oradata/timran11g/example01.dbf',
15:37:52 18 '/u01/oradata/timran11g/test01.dbf'
15:37:52 19 CHARACTER SET ZHS16GBK
15:37:52 20 ;
Control file created. //三個控制文件又從新創建了。
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 5629150
2 5629150
3 5629150
4 5629150
5 5629150
6 5629150
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 5629150
2 5629150
3 5629150
4 5629150
5 5629150
6 5629150
15:39:49 SQL> alter database open;
2)全部的控制文件丟失,利用控制文件備份恢復控制文件(非正常關閉,shutdown abort 後刪除控制文件或直接操做系統下刪除,有點複雜,留在053備份恢復中再介紹吧)
1)記錄數據庫的變化(DML、DDL)
2) 用於數據塊的recover
3)以組的方式管理redo file ,最少兩組redo ,循環使用
4)和數據文件存放到不一樣的磁盤上,需讀寫速度快的磁盤(好比採用RAID10)
日誌切換:
1)歸檔模式:將歷史日誌進行保存
2)非歸檔: 歷史日誌被覆蓋
3)併產生checkpoint,通知redo log 所對應的 dirty block 從data buffer寫入到datafile,而且更新控制文件
1)最少兩組(考點),最好每組有兩個成員(考點),並存放到不一樣的磁盤上,大小形同,互相鏡像
2)日誌在組寫滿時發生切換,或手工切換: alter system switch logfile ;
3)在歸檔模式,日誌進行歸檔,並把相關的信息寫入controlfile
15:49:43 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 1 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 1 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 1 YES INACTIVE 2113981 17-7月 -12
15:50:31 SQL> col member for a50;
15:50:47 SQL> select group#, member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
3 /u01/oradata/timran11g/redo03.log
2 /u01/oradata/timran11g/redo02.log
增長一個組group4,
15:53:53 SQL> alter database add logfile '/u01/oradata/timran11g/redo04.log' size 50m;
15:53:56 SQL> select group#, member from v$logfile order by group#;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
2 /u01/oradata/timran11g/redo02.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/oradata/timran11g/redo04.log
15:55:27 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 1 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 1 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 1 YES INACTIVE 2113981 17-7月 -12
4 1 0 52428800 1 YES UNUSED 0
//切換日誌組
alter system switch logfile;
加member爲每一個組(一共是4個組)
先建好目錄,準備放在/u01/disk2/timran/下
[oracle@timran timran]$ mkdir -p /u01/disk2/timran
[oracle@timran timran]$
16:00:39 SQL> alter database add logfile member
'/u01/disk2/timran/redo01b.log' to group 1,
'/u01/disk2/timran/redo02b.log' to group 2,
'/u01/disk2/timran/redo03b.log' to group 3,
'/u01/disk2/timran/redo04b.log' to group 4;
Database altered.
SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------------------------------------- -------
3 /u01/oradata/timran11g/redo03.log
2 /u01/oradata/timran11g/redo02.log
1 /u01/oradata/timran11g/redo01.log
4 /u01/oradata/timran11g/redo04.log
1 /u01/disk2/timran/redo01b.log INVALID
2 /u01/disk2/timran/redo02b.log INVALID
3 /u01/disk2/timran/redo03b.log INVALID
4 /u01/disk2/timran/redo04b.log INVALID
16:01:54 SQL> select * from v$log; //看到MEMBERS列已是2了
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 0 52428800 2 YES UNUSED 0
16:03:06 SQL> alter system switch logfile; //多作幾回切換,消除invalid //同步組裏的member,這步很重要。
16:03:13 SQL> select * from v$log;
歸檔日誌排的號
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 YES ACTIVE 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 145 52428800 2 NO CURRENT 2146613 17-7月 -12
說明一下v$log這個重要的視圖
status有四個狀態:
unused: 新添加的日誌組,尚未使用
inactive: 日誌組對應的髒塊已經從data buffer寫入到data file ,能夠覆蓋
active: 日誌組對應的髒塊尚未從data buffer寫入到data file,不能被覆蓋
current: 當前日誌組,日誌組對應的髒塊尚未從data buffer寫入到data file,不能被覆蓋
thread: 線程(經過後臺進程lgwr 啓動),在單實例的環境下,thread# 永遠是1
sequence: 日誌序列號。在日誌切換時會遞增。
FIRST_CHANGE#: 在當前日誌中記錄的首個數據塊的scn。(當事務完成的時候會在數據塊上寫入一個scn,表明數據塊的變化)。
16:11:08 SQL> select group#,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
1 /u01/disk2/timran/redo01b.log
2 /u01/oradata/timran11g/redo02.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/disk2/timran/redo04b.log
4 /u01/oradata/timran11g/redo04.log
假設/u01/oradata/timran11g/目錄下的4個log文件都損壞了,看如何遷移改名。
16:12:03 SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
16:12:30 SQL>
創建目錄/u01/disk3/timran/
[oracle@timran timran]$ mkdir -p /u01/disk3/timran
[oracle@timran timran]$
[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo02b.log /u01/disk3/timran/redo02a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo03b.log /u01/disk3/timran/redo03a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo04b.log /u01/disk3/timran/redo04a.log
[oracle@timran timran]$
16:15:19 SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 117442152 bytes
Database Buffers 159383552 bytes
Redo Buffers 7168000 bytes
Database mounted.
16:15:26 SQL>
16:16:05 SQL> col member for a50;
16:16:08 SQL> select group# ,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
1 /u01/disk2/timran/redo01b.log
2 /u01/oradata/timran11g/redo02.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/disk2/timran/redo04b.log
4 /u01/oradata/timran11g/redo04.log
16:18:05 SQL> alter database rename file '/u01/oradata/timran11g/redo01.log' to '/u01/disk3/timran/redo01a.log';
16:18:34 SQL> alter database rename file '/u01/oradata/timran11g/redo02.log' to '/u01/disk3/timran/redo02a.log';
16:18:45 SQL> alter database rename file '/u01/oradata/timran11g/redo03.log' to '/u01/disk3/timran/redo03a.log';
16:20:16 SQL> alter database rename file '/u01/oradata/timran11g/redo04.log' to '/u01/disk3/timran/redo04a.log';
16:21:35 SQL> select group# ,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/disk3/timran/redo01a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk3/timran/redo02a.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/disk3/timran/redo03a.log
4 /u01/disk2/timran/redo04b.log
4 /u01/disk3/timran/redo04a.log
16:21:55 SQL> alter database open;
23:52:06 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 YES INACTIVE 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 145 52428800 2 NO CURRENT 2146613 17-7月 -12
23:52:15 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log STALE
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log STALE
4 /u01/disk2/timran/redo04b.log
23:52:25 SQL> alter system switch logfile; //出現stale沒關係,代表文件內容不徹底,作幾回切換就能夠了。
23:52:28 SQL> /
23:52:30 SQL> /
23:52:32 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
4.八、日誌恢復
例一、多元化成員中,單個成員(inactive)丟失
00:06:15 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 6 52428800 2 YES INACTIVE 2152079 18-7月 -12
2 1 7 52428800 2 YES ACTIVE 2152084 18-7月 -12
3 1 8 52428800 2 NO CURRENT 2152087 18-7月 -12
4 1 5 52428800 2 YES INACTIVE 2152076 18-7月 -12
[oracle@timran ~]$ cd /u01/disk3/timran
[oracle@timran timran]$ ll
鎬昏 205040
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo01a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo02a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo03a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:52 redo04a.log
[oracle@timran timran]$ rm redo01a.log
00:10:11 SQL> startup force
00:18:29 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 6 52428800 2 YES INACTIVE 2152079 18-7月 -12
2 1 7 52428800 2 YES INACTIVE 2152084 18-7月 -12
3 1 8 52428800 2 YES INACTIVE 2152087 18-7月 -12
4 1 9 52428800 2 NO CURRENT 2172107 18-7月 -12
00:19:02 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 INVALID //invalid代表該文件不可訪問
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
00:19:12 SQL>
告警日誌:
Linux Error: 2: No such file or directory
Additional information: 3
Wed Jul 18 00:16:25 2012
Errors in file /u01/admin/timran/bdump/timran_lgwr_2807.trc:
ORA-00321: log 1 of thread 1, cannot update log file header
ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'
Wed Jul 18 00:16:25 2012
解決:
直接在open方式下複製這個member,爲什麼能夠?由於是這個group是inactive狀態!
[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log
00:25:54 SQL> alter system switch logfile; //切換時會同步,把invalid狀態消除掉。
00:25:57 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
例2 非當前日誌組全部成員丟失
00:32:47 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 14 52428800 2 YES INACTIVE 2172644 18-7月 -12
2 1 15 52428800 2 NO CURRENT 2172646 18-7月 -12
3 1 12 52428800 2 YES INACTIVE 2172247 18-7月 -12
4 1 13 52428800 2 YES INACTIVE 2172250 18-7月 -12
00:33:45 SQL> shutdown immediate
[oracle@timran timran]$ rm /u01/disk3/timran/redo04a.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo04b.log
SQL> startup
ORA-00313: open failed for members of log group 4 of thread 1
ORA-00312: online log 4 thread 1: '/u01/disk3/timran/redo04a.log'
ORA-00312: online log 4 thread 1: '/u01/disk2/timran/redo04b.log'
00:37:31 SQL> alter database clear logfile group 4; //注意:這一步使剛纔在os裏刪掉的那兩個group4的文件又創建上了。
[oracle@timran timran]$ ll
總計 205040
-rw-r----- 1 oracle oinstall 52429312 07-18 00:44 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo03b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:43 redo04b.log
00:45:02 SQL> alter database open;
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 25 52428800 2 YES INACTIVE 7025904 2013-2-19 2
2 1 26 52428800 2 YES INACTIVE 7025907 2013-2-19 2
3 1 27 52428800 2 NO CURRENT 7025955 2013-2-19 2
4 1 0 52428800 2 YES UNUSED 7025902 2013-2-19 2
例3 當前日誌組丟失。非正常關庫,直接從os下刪除當前日誌組的全部member,模擬數據庫open狀態下 current log損壞
[oracle@timran timran]$ rm /u01/disk3/timran/redo01a.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo01b.log
[oracle@timran timran]$
01:10:11 SQL> alter system switch logfile; 切一下,觸動它一下。
System altered.
告警日誌
Wed Jul 18 01:11:04 2012
Errors in file /u01/admin/timran/bdump/timran_arc1_3269.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/disk2/timran/redo01b.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
01:13:33 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
01:13:40 SQL> alter system switch logfile;
System altered.
01:13:53 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 5 52428800 2 NO ACTIVE 2194945 18-7月 -12
2 1 6 52428800 2 NO ACTIVE 2195228 18-7月 -12
3 1 7 52428800 2 NO CURRENT 2195296 18-7月 -12
4 1 4 52428800 2 YES INACTIVE 2194943 18-7月 -12
暫時好像沒有什麼問題發生,繼續切換,當current 又轉會到group1時,死機!
01:17:44 SQL> startup force
ORA-00313: 沒法打開日誌組 1 (用於線程 1) 的成員
ORA-00312: 聯機日誌 1 線程 1: '/u01/disk3/timran/redo01a.log'
ORA-00312: 聯機日誌 1 線程 1: '/u01/disk2/timran/redo01b.log'
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
第 1 行出現錯誤:
ORA-00350: 日誌 1 (實例 timran11g 的日誌, 線程 1) 須要歸檔
ORA-00312: 聯機日誌 1 線程 1: '/u01/disk3/timran/redo01a.log'
ORA-00312: 聯機日誌 1 線程 1: '/u01/disk2/timran/redo01b.log'
SQL> alter database clear unarchived logfile group 1;
SQL> alter database open;
說明以下:當前日誌損壞是一種嚴重的故障,面臨的狀況也比較複雜。
1)若是數據庫模式是archived的,當前日誌損壞,能夠先嚐試強制清除。
alter database clear unarchived logfile group n;
這步若是能成功,打開數據庫後要作數據庫全備(考點)。由於open前的當前日誌已經壞掉沒法真正歸檔,那麼未來的前滾可能會有問題。
2)若是clear unarchived不能成功嘗試,只好準備把當前日誌甩掉,去作基於日誌的不徹底恢復。
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3)若是嚴重到使用resetlogs也不能打開數據庫,能夠試試下面的最後一招:
修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE
該參數的含義是:容許在破壞一致性的狀況下強制重置日誌,打開數據庫。_allow_resetlogs_corruption將使用全部數據文件最舊的SCN打開數據庫,因此一般來說須要保證SYSTEM表空間擁有最舊的SCN。在強制打開數據庫以後,可能由於各類緣由會有ora-600錯誤。
[oracle@work dbs]$ vi inittest11g.ora
_allow_resetlogs_corruption=TRUE
*.background_dump_dest='$ORACLE_BASE/admin/test/bdump'
*.control_files='/u01/app/oracle/oradata/test/control01.ctl','/disk1/oradata/test/control02.ctl','/disk2/oradata/test/control03.ctl'
*.core_dump_dest='$ORACLE_BASE/admin/test/cdump'
*.db_block_size=8192
*.db_cache_size=80M#DEMO
*.db_file_multiblock_read_count=16
*.db_name='test'
*.optimizer_mode='choose'
*.parallel_threads_per_cpu=4#SMALL
*.pga_aggregate_target=10485760
*.query_rewrite_enabled='true'
*.query_rewrite_integrity='trusted'
*.shared_pool_size=60M#DEMO
*.star_transformation_enabled='true'
*.undo_management='auto'
*.undo_tablespace='rtbs'
*.user_dump_dest='$ORACLE_BASE/admin/test/udump'
//再以pfile 啓動instance 到mount狀態,而後 alter database open resetlogs
//這是在不一致狀態下強行打開了數據庫,建議作一個邏輯全備。
4.9 使日誌恢復到原來的配置
嘗試使用OEM方式恢復原狀。最後,驗證無誤後刪掉/u01/disk2和/u01/disk3目錄。
[oracle@timran timran]$ rm -rf /u01/disk2
[oracle@timran timran]$ rm -rf /u01/disk3
1)歸檔會在日誌切換時,備份歷史日誌,用於OLTP(dml操做比較多),能夠進行冷備(mont下)份和熱備份(數據庫打開),能夠實現數據庫徹底恢復、不徹底恢復(基於時間點)
2)歸檔會啓用arcn的後臺進程、佔用磁盤空間
3)非歸檔用於OLAP/DSS,只能冷備份,只能恢復到最後一次備份狀態
補充:olap (select操做比較多)
02:34:50 SQL>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/disk1/timran/
Oldest online log sequence 1
Next log sequence to archive 2
Current log sequence 2
02:35:50 SQL> shutdown immediate //這裏shutdown 必定要immediate方式
Database closed.
Database dismounted.
ORACLE instance shut down.
02:36:40 SQL> startup mount //到mount下設置
02:37:50 SQL>alter database noarchivelog;
Database altered.
02:37:55 SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/disk1/timran/
Oldest online log sequence 1
Current log sequence 2
02:38:15 SQL> alter database archivelog; //換回來,不要No Archive Mode
02:38:30 SQL> alter database open;
指定歸檔日誌存放處及命名
注意:另外指定並不意味着你要取消閃回恢復區的參數,由於這個閃回恢復區不只歸檔日誌,還有RMAN的備份及閃回日誌等等。
02:39:20 SQL> show parameter archive
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
log_archive_config string
log_archive_dest string
log_archive_dest_1 string location=/u01/disk1/timran/ ma
ndatory
log_archive_dest_10 string
log_archive_dest_2 string
log_archive_dest_3 string
log_archive_dest_4 string
log_archive_dest_5 string
log_archive_dest_6 string
log_archive_dest_7 string
log_archive_dest_8 string
log_archive_dest_9 string
log_archive_dest_state_1 string enable
log_archive_dest_state_10 string enable
log_archive_dest_state_2 string enable
log_archive_dest_state_3 string enable
log_archive_dest_state_4 string enable
log_archive_dest_state_5 string enable
log_archive_dest_state_6 string enable
log_archive_dest_state_7 string enable
log_archive_dest_state_8 string enable
log_archive_dest_state_9 string enable
log_archive_duplex_dest string
log_archive_format string arch_%t_%r_%s.log
log_archive_local_first boolean TRUE
log_archive_max_processes integer 2
log_archive_min_succeed_dest integer 1
log_archive_start boolean FALSE
log_archive_trace integer 0
remote_archive_enable string true
standby_archive_dest string ?/dbs/arch
主要看這兩個參數:
log_archive_dest_n
log_archive_format
log_archive_dest_n (n:1-10) 表示能夠有10個目標路徑存放歸檔日誌(鏡像關係),便可以多路複用10個歸檔日誌的備份。如上顯示我只使用了log_archive_dest_1,也就是說只有一套歸檔日誌,沒有作鏡像,如果生產系統最好能再作一個鏡像。
若是你沒有指定log_archive_dest_n,那麼系統隱含的將log_archive_dest_10指向了閃回恢復區(flashback revovery area),這個閃回恢復區不只默認的存放歸檔日誌,還有RMAN的備份及閃回日誌等等。
使用log_archive_dest_n就不要使用log_archive_dest參數了
SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran';
//把歷史日誌歸檔到本機目錄下 (location 表明本機)
SQL> alter system set log_archive_dest_2='service=test';
//遠程備份,把歷史日誌備份到服務名爲test的另外的數據庫上。(service 表明遠程),配置雙機時有用。
SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran mandatory';
//mandatory 強制,日誌歸檔未完成以前不容許覆蓋redo log file。(考點)
//默認optional(日誌在沒有歸檔完成前能夠被覆蓋redo log file。
log_archive_format 是定義命名格式的,我使用了下面三個內置符號,其含義是:
%t ,thread# , 日誌線程號
%s ,sequence ,日誌序列號
%r ,resetlog ,表明數據庫的週期
SQL> alter system set log_archive_format ='arch_%t_%r_%s.log' scope=spfile;
[oracle@timran bdump]$ ps -ef |grep ora_|grep -v grep
oracle 3458 1 0 01:30 ? 00:00:00 ora_pmon_timran
oracle 3460 1 0 01:30 ? 00:00:00 ora_psp0_timran
oracle 3462 1 0 01:30 ? 00:00:00 ora_mman_timran
oracle 3464 1 0 01:30 ? 00:00:00 ora_dbw0_timran
oracle 3466 1 0 01:30 ? 00:00:00 ora_lgwr_timran
oracle 3468 1 0 01:30 ? 00:00:00 ora_ckpt_timran
oracle 3470 1 0 01:30 ? 00:00:01 ora_smon_timran
oracle 3472 1 0 01:30 ? 00:00:00 ora_reco_timran
oracle 3474 1 0 01:30 ? 00:00:00 ora_cjq0_timran
oracle 3476 1 0 01:30 ? 00:00:01 ora_mmon_timran
oracle 3478 1 0 01:30 ? 00:00:00 ora_mmnl_timran
oracle 3480 1 0 01:30 ? 00:00:00 ora_d000_timran
oracle 3482 1 0 01:30 ? 00:00:00 ora_s000_timran
oracle 3490 1 0 01:32 ? 00:00:00 ora_arc0_timran
oracle 3492 1 0 01:32 ? 00:00:00 ora_arc1_timran
oracle 3496 1 0 01:32 ? 00:00:00 ora_qmnc_timran
oracle 3506 1 0 01:32 ? 00:00:00 ora_q000_timran
oracle 3508 1 0 01:32 ? 00:00:00 ora_q001_timran
oracle 3542 1 0 01:41 ? 00:00:00 ora_j000_timran
ARCn就是歸檔進程,這裏啓動了兩個arc0和arc1,最多可達30個,由log_archive_max_processes參數指定。
1)自動歸檔,日誌切換時
2)手工
3)在歸檔時,會把歸檔信息寫入到控制文件
02:44:00 SQL> alter system switch logfile; //手工歸檔方法一。
02:46:30 SQL> alter system archive log current; //手工歸檔方法二,此方式僅限於Archive mode。 【此方法只能在歸檔模式下用】
查看已經歸檔日誌:
02:48:08 SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------------------------------
/u01/disk1/timran/arch_1_782662700_141.log
/u01/disk1/timran/arch_1_782662700_142.log
/u01/disk1/timran/arch_1_782662700_143.log
/u01/disk1/timran/arch_1_782662700_144.log
/u01/disk1/timran/arch_1_782662700_145.log
/u01/disk1/timran/arch_1_788918717_1.log
/u01/disk1/timran/arch_1_788918717_2.log
/u01/disk1/timran/arch_1_788918717_3.log
05:47:10 SQL>
數據庫恢復中有時會須要對Redo log進行分析, 要會使用log miner,以便肯定要恢復的時間點
1)添加database補充日誌
SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS; //10g和11g中這一步仍是挺重要的。
2)肯定要分析的日誌範圍,添加日誌,分析
SQL>
execute dbms_logmnr.add_logfile(logfilename=>'日誌',options=>dbms_logmnr.new);
eg: /u01/disk1/timran/arch_1_804874397_20.log
//第一個要加載的日誌文件
SQL>
execute dbms_logmnr.add_logfile(logfilename=>'補充日誌',options=>dbms_logmnr.addfile); //能夠反覆添加補充多個日誌文件
3)執行logmnr 分析
SQL>execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
4)查詢分析結果,能夠設置時間格式,也能夠在顯示方式裏再肯定格式.
SQL>select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='表名';
5)關閉日誌分析
SQL>execute dbms_logmnr.end_logmnr;
例
scott:
09:44:08 SQL> create table a (id int);
09:44:20 SQL> insert into a values(1);
09:44:29 SQL> update a set id=5;
09:44:45 SQL> commit;
09:44:47 SQL> delete a;
09:44:51 SQL> commit;
Commit complete.
sys:
11:32:12 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 26 52428800 2 NO CURRENT 2257870 2012-7-23 9
2 1 25 52428800 2 YES INACTIVE 2257866 2012-7-23 9
3 1 23 52428800 2 YES INACTIVE 2257862 2012-7-23 9
4 1 24 52428800 2 YES INACTIVE 2257864 2012-7-23 9
//上面a 表的DML操做都寫進了current組裏,記住sequence#是26號。而後手工切換當前日誌進archive裏。
11:32:18 SQL> alter system switch logfile;
11:33:00 SQL> /
11:33:02 SQL> /
11:33:02 SQL> /
11:33:09 SQL> select name from v$archived_log;
/u01/disk1/timran/arch_1_789252862_21.log
/u01/disk1/timran/arch_1_789252862_22.log
/u01/disk1/timran/arch_1_789252862_23.log
/u01/disk1/timran/arch_1_789252862_24.log
/u01/disk1/timran/arch_1_789252862_25.log
/u01/disk1/timran/arch_1_789252862_26.log
/u01/disk1/timran/arch_1_789252862_27.log
/u01/disk1/timran/arch_1_789252862_28.log
/u01/disk1/timran/arch_1_789252862_29.log
62 rows selected
//切換後,sequence#26的日誌的應該對應的是/u01/disk1/timran/arch_1_789252862_26.log
11:33:20 SQL> alter database add supplemental log data;
11:33:48 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_789252862_26.log',options=>dbms_logmnr.new);
11:34:13 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
11:34:49 SQL>select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') timestamp,sql_redo from v$logmnr_contents where seg_name='A';
SCN TIMESTAMP SQL_REDO
---------- ------------------- --------------------------------------------------------------------------------
2258232 2012-07-23 09:43:16 drop table a purge;
2258334 2012-07-23 09:44:20 create table a (id int);
2258341 2012-07-23 09:44:28 insert into "SCOTT"."A"("ID") values ('1');
2258349 2012-07-23 09:44:46 update "SCOTT"."A" set "ID" = '5' where "ID" = '1' and ROWID = 'AAANBAAAEAAAAGEA
2258353 2012-07-23 09:44:52 delete from "SCOTT"."A" where "ID" = '5' and ROWID = 'AAANBAAAEAAAAGEAAA';
另外,也能夠採用OEM方式進行logmnr,設定scn或timestamp一個範圍,查出須要的DML語句,比較方便。不過,OEM是針對已提交的事務的。
6.2.2 對DDL的操做的log miner:
1)若是是第一次作,先要建好logmnr目錄,
設置logmnr 參數,存放數據字典文件dict.ora
$ mkdir /home/oracle/logmnr
SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;
2)創建數據字典文件dict.ora
SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
3)添加日誌分析
SQL> execute dbms_logmnr.add_logfile(logfilename=>'日誌文件',options=>dbms_logmnr.new);
SQL> execute dbms_logmnr.add_logfile(logfilename=>'追加日誌',options=>dbms_logmnr.addfile);
4)執行分析
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
5)查看分析結果
SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE USERNAME ='SCOTT' and lower(sql_redo) like '%table%';
6)關閉日誌分析
SQL> execute dbms_logmnr.end_logmnr;
例子將在053的不徹底恢復一節中演示。
使用undo tablespace 存放從datafiles 讀出的數據塊的前鏡像【老值】,提供如下四種狀況所須要的信息
1)回滾事務:rollback
2)讀一致性:正在作DML操做的數據塊,事務結束前,其餘用戶讀undo裏面的數據前鏡像
3)實例的恢復:instance recover(undo -------->rollback)
4)閃回查詢 :flashback query、flashback table
1)manaual 手工:roll segment //做廢了
2)auto 自動:undo tablespace (init parameter :undo_management = auto)
1)能夠創建多個undo表空間,但一個時刻只有一個處於active
2)處於active狀態的undo tablespace 不能offline 和 drop
01:08:31 SQL> select tablespace_name,status ,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
EXAMPLE ONLINE PERMANENT
TEST ONLINE PERMANENT
09:47:08
SQL>
create undo tablespace undotbs2 datafile '/u01/oradata/timran11g/undotbs02.dbf' size 100m autoextend on;
09:47:55 SQL> select tablespace_name,status,contents from dba_tablespaces;
SQL> select tablespace_name,status ,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
UNDOTBS2 ONLINE UNDO
EXAMPLE ONLINE PERMANENT
TEST ONLINE PERMANENT
09:48:00 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
00:20:50 SQL> SQL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
11 _SYSSMU11_1357956213$
12 _SYSSMU12_1357956213$
13 _SYSSMU13_1357956213$
14 _SYSSMU14_1357956213$
15 _SYSSMU15_1357956213$
16 _SYSSMU16_1357956213$
17 _SYSSMU17_1357956213$
18 _SYSSMU18_1357956213$
19 _SYSSMU19_1357956213$
20 _SYSSMU20_1357956213$
11 rows selected.
09:50:10 SQL> alter system set undo_tablespace=undotbs2; //memory動態修改
09:50:28 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
00:22:29 SQL> SQL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
1 _SYSSMU1_1363316212$
2 _SYSSMU2_1363316212$
3 _SYSSMU3_1363316212$
4 _SYSSMU4_1363316212$
5 _SYSSMU5_1363316212$
6 _SYSSMU6_1363316212$
7 _SYSSMU7_1363316212$
8 _SYSSMU8_1363316212$
9 _SYSSMU9_1363316212$
10 _SYSSMU10_1363316212$
11 rows selected.
SQL> drop tablespace undotbs1 including contents and datafiles;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
4 USERS YES NO YES
6 EXAMPLE YES NO YES
8 TEST YES NO YES
3 TEMP NO NO YES
5 UNDOTBS2 YES NO YES
1)active: 表示使用這個undo block的 transaction還未提交
2)unexpired: undo block上沒有活動事務,能夠被覆蓋(可是未過時expired)
3)expired: undo block狀態爲inactive的時間 超過了undo_retention
4)free: 空閒的
//這個參數只對已提交的undo狀態有效
01:10:46 SQL>
select tablespace_name,status,contents,retention from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
SYSTEM ONLINE PERMANENT NOT APPLY
SYSAUX ONLINE PERMANENT NOT APPLY
TEMP ONLINE TEMPORARY NOT APPLY
USERS ONLINE PERMANENT NOT APPLY
EXAMPLE ONLINE PERMANENT NOT APPLY
TEST ONLINE PERMANENT NOT APPLY
UNDOTBS2 ONLINE UNDO NOGUARANTEE
guarantee屬性隨undo表空間創建, 能夠修改
09:52:22 SQL> alter tablespace undotbs2 retention guarantee; //保證在retention 期間不容許被覆蓋
01:11:16 SQL> select tablespace_name,status ,contents,retention from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
SYSTEM ONLINE PERMANENT NOT APPLY
SYSAUX ONLINE PERMANENT NOT APPLY
TEMP ONLINE TEMPORARY NOT APPLY
USERS ONLINE PERMANENT NOT APPLY
EXAMPLE ONLINE PERMANENT NOT APPLY
TEST ONLINE PERMANENT NOT APPLY
UNDOTBS2 ONLINE UNDO GUARANTEE
缺省配置下undo retention是 noguarantee,
SQL> alter tablespace undotbs2 retention noguarantee;
1) v$session 查看用戶創建的session
2) v$transaction 當前的事務
3) v$rollname undo段的名稱
4) v$rollstat undo段的狀態
5) dba_rollback_segs 數據字典裏記錄的undo段狀態
通常來講,一個session只能對應一個事務,創建了session未必有事務,只有事務處於中間態時,v$transaction才能看到這個事務。
換句話說,若是看到了事務(在 v$transaction裏),那必定有個session和它對應,將兩個視圖裏連在一塊兒,信息看得更爲清楚。
cmd下scott登陸:
10:03:28 SQL> select username,sid,serial# from v$session where username is not null; //看看有幾個session連上來了。
USERNAME SID SERIAL#
------------------------------ ---------- ----------
SCOTT 131 18
SYS 170 5
cmd下 update emp set sal=1000 where empno=7788; // 產生一個活動事務
SQL> select a.sid,a.serial#,a.username,b.xidusn,xidslot,b.ubablk,b.status from v$session a,v$transaction b where a.saddr=b.ses_addr;
10:08:29 SQL> col name for a10
SID SERIAL# USERNAME XIDUSN XIDSLOT UBABLK STATUS
---------- ---------- -------------------- ---------- ---------- ---------- ----------------
131 18 SCOTT 8 17 305 ACTIVE
//兩表聯查,sid和serial#在v$session裏,在v$transaction裏 XIDUSN是undo segment 的id ,XIDSLOT 是事務槽的id,UBABLK是undo塊號
對照上面看,下面語句顯示出_SYSSMU8$是一個活動段, 與XIDUSN=8吻合, 說明這個段被讀進buffer了.
SQL> select b.name,a.xacts from v$rollstat a, v$rollname b where a.usn=b.usn;
NAME XACTS
------------------------------ ----------
SYSTEM 0
_SYSSMU1_1363316212$ 0
_SYSSMU2_1363316212$ 0
_SYSSMU3_1363316212$ 0
_SYSSMU4_1363316212$ 0
_SYSSMU5_1363316212$ 0
_SYSSMU6_1363316212$ 0
_SYSSMU7_1363316212$ 0
_SYSSMU8_1363316212$ 1
_SYSSMU9_1363316212$ 0
_SYSSMU10_1363316212$ 0
默認system表空間會有一個undo segment(usn爲0)。system下的undo是系統須要的(好比數據字典),其餘表空間的事務不能使用它。缺省下undo tablespace 會被分配10個undo segment,若是數據庫啓動時碰到undo數據文件損壞或不一樣步,能夠將其offline, 只有一個系統表空間的undo也能進入系統,但不能作其餘表空間的DML操做。
若是在數據庫打開的狀況下,當前undo壞掉的話,好比如今UNDOTBS2出現了介質損壞,那麼數據庫就不能作DML操做了。若是UNDOTBS2表空間上還有活動的事務,Oracle會將其下的全部段標誌爲NEEDS RECOVERY,這時若沒有備份或沒有可替代UNDO來切換的話,那麼這種錯誤將是嚴重的,會丟失了原來的事務。必須從新啓動,而後重建一個undo表空間,再將NEEDS RECOVERY處理後,纔可將該表空間刪除。咱們模擬一下這種狀況:
[oracle@timran timran]$ mv undotbs02.dbf undotbs02.bak
00:29:28 SQL>alter system checkpoint;
cmd端再作update 語句時會報錯
ORA-01116: 打開數據庫文件 3 時出錯
ORA-01110: 數據文件 3: '/u01/oradata/timran11g/undotbs02.dbf'
ORA-27041: 沒法打開文件
00:29:28 SQL> startup force
ORA-01157: 沒法標識/鎖定數據文件 3 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 3: '/u01/oradata/timran11g/undotbs02.dbf'
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 6708724
2 6708724
3 6708724
4 6708724
5 6708724
6 6708724
//磁盤上去讀數據文件
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 6708724
2 6708724
3 0
4 6708724
5 6708724
6 6708724
SQL> alter database datafile 3 offline;
SQL> alter database open;
SQL> select * from v$rollname;
//只剩下系統表空間 undo端
USN NAME
---------- ------------------------------
0 SYSTEM
SQL>
create undo tablespace undotbs1 datafile '/u01/oradata/timran11g/undotbs01.dbf' size 100m autoextend on;
SQL> show parameter undo;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
8 TEST YES NO YES
5 UNDOTBS2 YES NO YES
SQL> alter system set undo_tablespace=UNDOTBS1;
注意:此時原有的事務可能仍然在UNDOTBS2, 只能刷掉了。
SQL> drop tablespace undotbs2 including contents and datafiles;
drop tablespace undotbs2 including contents and datafiles
*
第 1 行出現錯誤:
ORA-01548: 已找到活動回退段 '_SYSSMU1_1363316212$', 終止刪除表空間
//這個UNDOTBS2刪不掉是由於Oracle把其下的全部段都標誌成 NEEDS RECOVERY了,查看一下相關的數據字典:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU20_1363319420$ ONLINE
_SYSSMU19_1363319420$ ONLINE
_SYSSMU18_1363319420$ ONLINE
_SYSSMU17_1363319420$ ONLINE
_SYSSMU16_1363319420$ ONLINE
_SYSSMU15_1363319420$ ONLINE
_SYSSMU14_1363319420$ ONLINE
_SYSSMU13_1363319420$ ONLINE
_SYSSMU12_1363319420$ ONLINE
_SYSSMU11_1363319420$ ONLINE
_SYSSMU10_1363316212$ NEEDS RECOVERY
_SYSSMU9_1363316212$ NEEDS RECOVERY
_SYSSMU8_1363316212$ NEEDS RECOVERY
_SYSSMU7_1363316212$ NEEDS RECOVERY
_SYSSMU6_1363316212$ NEEDS RECOVERY
_SYSSMU5_1363316212$ NEEDS RECOVERY
_SYSSMU4_1363316212$ NEEDS RECOVERY
_SYSSMU3_1363316212$ NEEDS RECOVERY
_SYSSMU2_1363316212$ NEEDS RECOVERY
_SYSSMU1_1363316212$ NEEDS RECOVERY
解決有兩個辦法:1)使用備份恢復,2)使用oracle提供的隱含參數_CORRUPTED_ROLLBACK_SEGMENTS
咱們使用第2種方法
SQL>create pfile from spfile; //創建靜態參數文件
SQL>shutdown abort
#vi /u01/oracle/dbs/inittimran11g.ora //在靜態參數文件裏第一行插入如下內容
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1_1363316212$,_SYSSMU2_1363316212$,_SYSSMU3_1363316212$,_SYSSMU4_1363316212$,_SYSSMU5_1363316212$,_SYSSMU6_1363316212$,_SYSSMU7_1363316212$,_SYSSMU8_1363316212$,_SYSSMU9_1363316212$,_SYSSMU10_1363316212$)
而後存盤,再使靜態參數文件啓動數據庫
SQL> startup pfile='/u01/oracle/dbs/inittimran11g.ora'
SQL> drop rollback segment "_SYSSMU1_1363316212$";
回退段已刪除。
......
SQL> drop rollback segment "_SYSSMU10_1363316212$";
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU20_1363319420$ ONLINE
_SYSSMU19_1363319420$ ONLINE
_SYSSMU18_1363319420$ ONLINE
_SYSSMU17_1363319420$ ONLINE
_SYSSMU16_1363319420$ ONLINE
_SYSSMU15_1363319420$ ONLINE
_SYSSMU14_1363319420$ ONLINE
_SYSSMU13_1363319420$ ONLINE
_SYSSMU12_1363319420$ ONLINE
_SYSSMU11_1363319420$ ONLINE
已選擇11行。
SQL> drop tablespace undotbs2 including contents and datafiles;
表空間已刪除。
若是還刪除不了,則嘗試修改字典
select * from v$tablespace; 記下要刪除的undo對應的ts#號,好比是=2,則執行下行語句:
update seg$ set type# = 3 where ts#=2;
而後再刪除該表空間便可。
checkpoint是數據庫的一個內部事件,檢查點激活時會觸發數據庫寫進程(DBWR),將數據緩衝區裏的髒數據塊寫到數據文件中。
因爲DBWR與事務提交的無關性,數據庫在某個時刻會存在已提交的事務沒有來及寫到磁盤,而未提交的事務卻已經寫到了磁盤的狀況,也就是說內存中的數據和磁盤中的數據不一致。
1)保證數據庫的一致性,這是指將髒數據寫出到硬盤,保證內存和硬盤上的數據是同樣的;
2)縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬盤的髒數據經過日誌進行恢復。若是髒塊過多,實例恢復的時間也會很長,檢查點的發生能夠減小髒塊的數量,從而提升實例恢復的時間。
徹底檢查點 full checkpoint
增量檢查點 incremental checkpoint
局部檢查點 partial checkpoint
記下當前的scn, 將此scn以前全部的髒塊一次性寫完,再將該scn號同步更新控制文件和數據文件頭。
能夠引發徹底檢查點的兩個動做
a)正常關閉數據庫:shutdown immediate
b)手動檢查點切換:alter system checkpoint;
補充:實例b
查詢:當前文件scn號
select file#,checkpoint_change# from v$datafile_header;
alter system checkpoint;
select file#,checkpoint_change# from v$datafile_header;
1)通常來講增量檢查點不會更新數據文件頭和控制文件的SCN,它只是根據策略計算一個SCN(未必是當前SCN),將此SCN前的髒塊刷新到磁盤,這個SCN點也叫檢查點位置,而後將與此scn有關的信息記錄到控制文件。
2)當增量檢查點發生時,Oracle會寫一部分髒塊,使檢查點位置前移。進而縮短實例恢復時運用日誌起點和終點之間的距離,也就意味着縮短了實例恢復時間
如下相關知識已超出OCP考試範疇,僅供參考吧:
什麼是檢查點隊列?
被修改過的塊,在oracle中都被統稱爲髒塊.全部的髒塊被一個雙向鏈表串起來,稱作檢查點隊列.
什麼是檢查點位置?
髒塊按照首次變髒的時間順序排列,DBWR每到必定的時機,就會被觸發,沿着檢查點隊列的順序將髒塊刷新到磁盤上。檢查點位置以前的塊,都是已被DBWR刷新到磁盤上的塊。而最後的檢查點位置(也就是最後的RBA)老是被記錄在控制文件中。若是發生系統崩潰的話,這個最後一次的檢查點位置就是實例恢復的起點。
什麼是RBA? LRBA? HRBA? TARGET RBA?
RBA就是redo塊地址,好比說,用戶發出了一條update命令,更新了塊A,塊A如今變成了髒塊,oracle會爲他生成一條redo條目.這個條目在redo日誌文件中的位置就是rba(redo byte address).過了一下子,假如:塊A依然仍是髒塊,此時.用戶又發出一條更新塊A的命令,這又會生成一條redo條目.第一條更新命令對應的redo條目的RBA被稱爲塊A的LRBA(low rba),第二條更新命令對應的RBA,被稱爲HRBA(high rba).
其實,按照LRBA來排列,就是按照塊首次被修改的順序來排列. LRBA在髒塊的塊頭有指針。
TARGET RBA是增量檢查點發生時要求髒塊寫到一個RBA爲止,這個RBA就是Target RBA。
1)FAST_START_MTTR_TARGET:
這個參數是考點。如何有效的縮短最近檢查點位置與聯機重作日誌尾部之間的距離,正是設計此參數目的。
此參數單位爲秒,缺省值900,範圍0-3600秒,斷定依據是當內存中產生的dirty buffer所需的日誌恢復時間 (estimated_mttr)若是到達該參數指定時間,則增量檢查點進程被觸發。fast_start_mttr_target若是爲0,這時是根據DBWN進程自身須要儘可能減小寫入量。雖然實現性能最大化,但實例恢復時間可能後比較長。
*考點:若是將fast_start_mttr_target設置爲非0,將啓用檢查點自動調整機制。
驗證以上概念的一個有效的方法,能夠研究一下日誌切換:alter system switch logfile; 這個動做比較特殊,其特徵是徹底檢查點和增量檢查點綜合的效果。
若是FAST_START_MTTR_TARGET有值,v$log視圖中的active狀態幾分鐘後會變成inactive狀態,而後更新了控制文件和日誌文件頭部的SCN(這彷佛是徹底檢查點的特徵)
若是FAST_START_MTTR_TARGET=0,在沒有檢查點機制的狀況下,只能靠DBWN進程自身機制寫髒塊,若是沒有事務發生active很長時間狀態不變。
還有如下三個參數,它們是:
2)FAST_START_IO_TARGET: 實例恢復所須要讀取的redo blocks數量,
3)LOG_CHECKPOINT_TIMEOUT:2次增量檢查點的時間間隔。
4)LOG_CHECKPOINT_INTERVAL:最後一次增量檢查點與當前日誌文件末尾所差的redo block數量。(淘汰)
這三個參數已經被FAST_START_MTTR_TARGET取代了。若是fast_start_io_target or log_checkpoint_interval被指定,他們會自動覆蓋由fast_start_mttr_target參數計算出來的值。
演示:
ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;
alter system set LOG_CHECKPOINT_TIMEOUT=30;
增量checkpoint信息將會被記錄到告警日誌alert_$SID.log文件中
注意:並非將髒列表中的全部髒塊都寫出到數據文件中,而是寫出一部分,保證知足條件便可。
5)90% OF SMALLEST REDO LOG(Oarcle 內部參數),將重作日誌文件末尾前面90%的位置設爲檢查點位置。
6)每3s檢查checkpoint隊列,查看髒塊的寫入狀況,記錄此刻的那個RBA,並將其做爲檢查點位置寫入到controlfile
1)STATISTICS_LEVEL -->置爲typical(缺省) 或者all
2)FAST_START_MTTR_TARGET -->置爲非零值
有兩個視圖可供參考
v$instance_recovery
v$mttr_target_advice
SQL>select recovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,
estimated_mttr from v$instance_recovery;
RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR
---------------------- ---------------- ---------------- ----------- --------------
72 333 3700 33 12
//系統計算出來的target_mttr爲33秒,當前估算的恢復時間是12秒。
SQL>select mttr_target_for_estimate tar_est,dirty_limit,estd_cache_writes est_c_w,
estd_cache_write_factor est_c_w_f,estd_total_writes est_t_w,estd_total_write_factor est_t_w_f from v$mttr_target_advice;
TAR_EST DIRTY_LIMIT EST_C_W EST_C_W_F EST_T_W EST_T_W_F
---------- ----------- ---------- ---------- ---------- ----------
16 1821 7659 1.0635 7659 1.0635
20 4516 7202 1 7202 1
22 5825 7202 1 7202 1
25 7616 7202 1 7202 1
18 3208 7202 1 7202 1
//mttr_target_for_estimate裏的25秒(最接近設定的目標時間30秒)那行記錄的有關字段,值得參考。
對於某些操做,局部檢查點是必須的,並會自動執行。
好比:表空間offline,數據文件offline,刪除extent,表truncate,begin backup(將表空間置於備份模式)等。Oracle會根據須要自動執行。
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
有了redo,undo和ckpt概念後,有助於更好的理解實例恢復(ppt:404-408)
因爲引入了增量檢查點,當實例須要恢復的時候,oracle首先從控制文件裏找到最後一次檢查點位置,這個位置就是實例恢復的起點
而後是smon的一系列動做:
1) roll forward :利用redo,將檢查點位置之後的更改,包括提交的和未提交的數據重作一遍。
2) open:
3) roll back :經過undo機制 把寫入磁盤裏的未提交的事務回滾掉。
重點理解實例恢復的概念
爲什麼要使用redo前滾?由於abort時有可能丟失了在內存中(未寫到數據文件)的已提交的事務。
爲什麼要使用undo回滾?由於abort前有可能有未提交的事務已經寫到了數據文件裏。
爲什麼要open? 打開數據庫意味着用戶會話能夠創建了。
Oracle提供了大量的內部表,它們記錄了數據庫對象的更改和修正。能夠將這些內部表劃分爲兩種主要類型:靜態數據字典表和動態性能表。
這些內部表是由oracle維護的,能夠說它們是隻讀表。用戶包括sys都不能修改,只能查看。
1) central of database //數據庫的核心
2)read_only table and views
3)owner :sys
4)oracle server 維護,ddl操做會更新
5)經過select 訪問
6)記錄數據庫的物理、邏輯結構和全部對象的定義的信息
7)存放在system tablesapce
經過dict view 能夠了解數據字典的組成
SQL> select * from dict where table_name='DBA_OBJECTS';
TABLE_NAME COMMENTS
--------------------------------------------- ------------------------------------------------------------
DBA_OBJECTS All objects in the database
SQL> select count(*) from dict;
COUNT(*)
----------
2323
1)數據庫的邏輯和物理的架構
2)用戶及對象的定義和存儲信息
3)權限、角色、審計等
4)database的狀態
static :在數據庫open狀態下訪問,能夠經過靜態視圖瞭解database的架構(記錄database的架構,object的數據定義和存儲等信息)
dba_ : 存儲全部用戶對象的信息(默認只能有sys/system 用戶訪問)
all_ : 存儲當前用戶可以訪問的對象(包括用戶所擁有的對象和別的用戶受權訪問的對象)的信息。
user_:存儲當前用戶所擁有的對象的相關信息。
是維護當前實例信息的,因爲不斷的更新,因此也叫動態視圖。其底層是一組虛擬的動態表稱爲X$表,oracle不容許直接訪問X$表,而是在這些表上建立視圖,而後再建立這些視圖的同義詞。
Eg:
SQL> set autotrace on; //打開解析
SQL> set autotrace off; //關閉解析
基表(x$)-------------視圖(v_$)--------------同義詞v$-------User access
能夠經過v$fixed_table 視圖 查到全部的動態視圖的名稱;用於調優和數據庫監控。從Oracle8開始, GV$視圖開始被引入,其含義爲Global V$,GV$的產生是爲了知足OPS環境的須要,除了一些特例之外,每一個V$視圖都有一個GV$視圖存在。
SQL> desc v$fixed_table;
SQL> select count(object_id) from v$fixed_table;
SQL> select name from v$fixed_table where name like'V$%DATA%';
SQL> select checkpoint_change# from v$database;
SQL> select checkpoint_change# from v$datafile;
*考點:動態性能視圖填充了來自實例和控制文件的信息,前綴爲DBA_、ALL_、_USER_的視圖則填充了來自數據字典的信息,此差別決定了能夠 在不一樣啓動階段查詢那些視圖。
補充:
DATABASE-->TABLESPACES-->SEGMENTS-->EXENTS-->BLOCKS (DBA-I-PPT36-)
1)字典管理:在數據字典中管理表空間的空間分配。Oracle 8i之前只有經過uet$和fet$的字典管理。
缺點:某些在字典管理方式下的存儲分配有時會產生遞歸操做,而且容易產生碎片,從而影響了系統的性能,如今已經淘汰了。
2)本地管理:在每一個數據文件中使用位圖管理空間的分配。表空間中全部區(extent)的分配信息都保存在該表空間對應的數據文件的頭部。
優勢:速度快,存儲空間的分配和回收只是簡單地改變數據文件中的位圖,而不像字典管理方式還須要修改數據庫。無碎片,更易於DBA維護。
03:32:36
SQL> select tablespace_name,contents ,extent_management,segment_space_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN SEGMEN
------------------------------ --------- ---------- ------
SYSTEM PERMANENT DICTIONARY MANUAL
SYSAUX PERMANENT LOCAL AUTO
TEMP TEMPORARY LOCAL MANUAL
USERS PERMANENT LOCAL AUTO
EXAMPLE PERMANENT LOCAL AUTO
UNDO_TBS01 UNDO LOCAL MANUAL
TMP01 TEMPORARY LOCAL MANUAL
TBS_16K PERMANENT LOCAL AUTO
BIG_TBS PERMANENT LOCAL AUTO
TEST PERMANENT DICTIONARY MANUAL
注意兩點:
1)若是system表空間是數據字典管理,其餘表空間能夠是數據字典管理或local管理(默認)
2)字典管理能夠轉換成本地管理,可是對於系統表空間,要求執行一些附加步驟,比較麻煩。
execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');
建一個最簡單的表空間
SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m;
利用oracle提供的dbms_metadata.get_ddl包看看缺省值都給的是什麼?
SQL> set serverout on;
//把顯示打開
SQL>
declare
aa varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLESPACE','A') into aa FROM dual;
dbms_output.put_line(aa);
end;
/
結果:
CREATE TABLESPACE "A" DATAFILE
'/u01/oradata/timran11g/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE
8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
//區是自動
SEGMENT SPACE MANAGEMENT AUTO
//段自動
PL/SQL 過程已成功完成。
關注最後一行,兩個重要信息是:(1)區本地管理且自動分配空間,(2)段自動管理。
區默認本地管理,並且我也沒法指定它爲字典管理,由於個人system表空間是本地管理
SQL>
create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m
extent management local uniform size 128k
segment space management manual;
同上,調dbms_metadata.get_ddl包看oracle對該語句的ddl操做是:
CREATE TABLESPACE "A" DATAFILE
'/u01/oradata/timran11g/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE
8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 SEGMENT SPACE MANAGEMENT MANUAL
最後一行信息是:區本地管理且統一分配128K, 段手動管理。若是在建表時使用缺省說明,則該表將服從其表空間的這些定義,
SQL>create table scott.t1(id int) tablespace a;
調dbms_metadata.get_ddl包看oracle對SCOTT.T1表的ddl操做是:
SQL> set serverout on;
SQL>
declare
aa varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLE','T1','SCOTT') into aa FROM dual;
dbms_output.put_line(aa);
end;
/
結果:
CREATE TABLE "SCOTT"."T1"
( "ID" NUMBER(38,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS
LOGGING
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "A"
注意兩個地方:1)由於表空間指定了MSSM方式,表這邊就有了PCTUSED值,缺省是40,存儲子句(storage)沿用了表空間的uniform 128k.
can not drop :
1)system
2)active undo tablespace
3) default temporary tablespace
4)default的永久表空間
09:43:11 SQL> DROP TABLESPACE SYSTEM;
DROP TABLESPACE SYSTEM
*
ERROR at line 1:
ORA-01550: cannot drop system tablespace
09:44:38 SQL> drop tablespace test including contents and datafiles;
Tablespace dropped.
09:44:59
//產看數據文件和表空間的關係
SQL> select file_id,file_name,tablespace_name,AUTOEXTENSIBLE ,bytes/1024/1024 "size" from dba_data_files;
SQL> col file_name format a50;
//修改某一列顯示寬度
FILE_ID FILE_NAME TABLESPACE_NAME AUTOEXTENSIBLE size
---------- ------------------------------------------ ------------------------------ -------------- ----------
4 /u01/oradata/timran11g/users01.dbf USERS YES 51.25
3 /u01/oradata/timran11g/sysaux01.dbf SYSAUX YES 260
2 /u01/oradata/timran11g/undotbs01.dbf UNDOTBS1 YES 100
1 /u01/oradata/timran11g/system01.dbf SYSTEM YES 480
5 /u01/oradata/timran11g/example01.dbf EXAMPLE YES 100
查看錶空間空閒大小
09:47:04 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
UNDOTBS1 98.4375
SYSAUX 14.625
USERS 48.1875
SYSTEM 1.875
EXAMPLE 31.25
1)small file,在一個表空間能夠創建多個數據文件
2)bigfile :在一個表空間只能創建一個數據文件 (8k的block ,datafile maxsize 能夠 32T),能夠簡化對數據文件管理
09:54:49
SQL>
create bigfile tablespace big_tbs datafile '/u01/oradata/timran11g/bigtbs01.dbf' size 100m;
Tablespace created.
09:55:01
SQL> alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m;
alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m
*
ERROR at line 1:
ORA-32771: cannot add file to bigfile tablespace
09:55:46 SQL> select name,bigfile from v$tablespace;
NAME BIG
------------------------------ ---
SYSTEM NO
UNDOTBS1 NO
SYSAUX NO
USERS NO
TEMP NO
EXAMPLE NO
TBS_16K NO
BIG_TBS YES
一個段屬於一個表,一個表能夠有多個段(帶有段、大對象)。
一個segment只屬於一個模式(schema)對象,模式對象如表、索引,一個段比較大時能夠跨多個數據文件。
建立一個模式對象時,ORACLE爲這個對象建立一個(或多個)段,在這個段中保存這個對象的全部數據,當這個段數據增長時,爲這個段分配新的區(extent)存儲數據。段中至少有一個初始區。
段管理也有兩種方式:
1)自動管理方式(ASSM(Auto Systemt Space Management)) --採用位圖管理段的存儲空間
簡單說就是每一個段的段頭都有一組位圖(5個位圖),位圖描述每一個塊的滿度,根據滿度的不一樣將每一個塊對應到相應的位圖上,位圖自動跟蹤每一個塊的使用空間,這5個位圖的滿度按以下定義:一個位圖位於滿塊,其他位圖分別用於滿度爲75%-100%、50%-75%、25%-50%和0%-25%的塊,好比塊大小爲8k,你要插入一行是3k的錶行,那麼oracle就給你對應到25%-50%的那個位圖指定的塊上去。
2)手工管理方式(MSSM(Manual Segment Space Management)) --採用FREELIST(空閒列表)管理段的存儲空間
這個是傳統的方法,如今仍然在使用,未被淘汰,它與pctfree和pctused的概念有關,後面再介紹block時再討論。
段的管理方式只有在建立表空間時設置,一經肯定不能改變。
在ORACLE9I中,缺省狀態爲自動管理方式
segment space management { manual | auto}
通常來說 一個單純的表就分配一個段,但每每表沒那麼單純,好比表上常常會有主鍵約束,那麼就會有索引,索引也是表,要求單獨分一個段,還有,例如分區表,每一個分區會有獨立的段,再有就是oracle的大對象, 若是你的表裏引用blob,clob,那麼這個表就又被分出多個段來。
SQL> conn / as sysdba
SQL> create user tim identified by tim;
SQL> grant connect,resource to tim;
SQL> conn tim/tim
SQL> select * from user_segments;
未選定行
SQL> create table t1 (id int);
SQL> select segment_name from user_segments;
SEGMENT_NAME
---------------------------------------------------------------------------------
T1
SQL> create table t2 (id int constraint pk_t2 primary key, b blob, c clob);
SQL> select segment_name from user_segments;
SEGMENT_NAME
---------------------------------------------------------------------------------
T1
T2
SYS_LOB0000074368C00002$$
SYS_IL0000074368C00002$$
SYS_LOB0000074368C00003$$
SYS_IL0000074368C00003$$
PK_T2
區是ORACLE進行存儲空間分配的最小單位。是由一系列邏輯上連續的Oracle數據塊組成的邏輯存儲結構。段中第一個區叫初始區,隨後分配的區叫後續區。當段中全部的空間使用完後,ORACLE自動爲該段分配一個新的區。
根據表空間的管理方法不一樣,區的分配方法也不一樣。
1)本地管理方式下的區的分配方法。
自動分配和統一分配(見表空間一節)
2)字典管理方式下的區的分配方法。逐步淘汰了
考點:區分配管理方式在建立表空間時肯定,建完後,不容許更改。
當創建表的時候,創建段,而後自動分配相應的extent(1個或者多個),亦能夠手工提早分配extent(用於需大量插入數據的表)
區是段分配存儲的單位。當創建一個表段時,Oracle爲該段分配初始區,初始區究竟是多少個block?實驗代表:
ASSM下autoallocat方式通常是8個block,而uniform能夠使它最小5個block,MSSM方式下uniform最小能夠是2個block,一句話,所謂initial_extent最小能夠5個或2個必定是uniform形式下的。
SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 1m extent management local uniform size 40k segment space management auto;
SQL> select * from dba_tablespaces; //看initial_extent是多少
SQL> create tablespace b datafile '/u01/oradata/timran11g/b01.dbf' size 1m extent management local uniform size 5k segment space management manual;
SQL> select * from dba_tablespaces; //看initial_extent是多少?我只給了5k(一個block是8k) oracle隱性補全到16k。
若是以後因爲數據的插入,初始區裝滿後,將繼續分配下一個區。
scott:
SQL> create table t1 tablespace test as select * from dept;
SQL> col segment_name for a20;
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
------------------- ---------- ----------
T1 0 65536
能夠看到段T1的初始區ID爲0,大小爲 65536 bytes;
向表段中自插表數據,看Oracle爲該段分配更多的區
SQL> insert into t1 select * from t1;
已建立2048行。
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此時看到隨着數據的插入,T1段動態擴展爲三個區;
SQL> delete t1;
已刪除4096行。
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此時表段的數據已經刪除,但全部extent依然健在,沒法回收T1段的區(這是高水位線問題);
能夠再擴展表:
sys:
alter table scott.t1 allocate extent (datafile '/u01/oradata/timran11g/test01.dbf' size 5m);
查看
SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID FILE_ID BYTES
-------------------- ---------- ---------- ----------
T1 0 6 65536
T1 1 6 65536
T1 2 6 65536
T1 3 6 1048576
T1 4 6 1048576
T1 5 6 1048576
T1 6 6 1048576
T1 7 6 1048576
回收空閒extent
SQL> alter table scott.t1 deallocate unused;
表已更改。
SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID FILE_ID BYTES
-------------------- ---------- ---------- ----------
T1 0 6 65536
T1 1 6 65536
T1 2 6 65536
順便提一句:如何查看一個表所對應的數據文件及表空間的關係呢?
抓住上面dba_extents中的file_id字段(user_extents裏沒有這個字段),而後;
SQL> select file_id,file_name,tablespace_name from dba_data_files;
補充:
查看視圖
Block 是 oracle進行IO操做的最小單位,block 的管理方法是區的管理和段管理的具體體現。
數據塊的管理方法也分兩種:
一、自動管理方式 如建立表空間時設置爲本地管理方式,而且將段的存儲空間方式設置爲AUTO(即ASSM),該表空間的全部塊均採用自動管理方式。這是系統默認的。
二、手工管理方式 是傳統的管理方式,主要經過PCTFREE和PCTUSED兩個存儲參數控制可用存儲區的大小,避免行遷移現象的發生。這兩個參數可在建立表空間時設置,也可在創建數據庫的模式對象(表,索引)中設置。模式對象中設置的優先級比表空間的要高。就是說;如表和索引中沒有設置,則按表空間的設置,如表空間也沒設置,則按自動管理方式管理塊。
data block :oracle 11g 標準塊:8k,支持2-32k,
有block header 、free space 、data 組成
數據塊併發訪問:由數據塊的事務槽來分配
ITL :事務槽,能夠有多個ITL以支持併發事務,每當一個事務要更新數據時,必須先獲得一個ITL槽,而後將當前事務ID,事務所用的undo塊兒,
initrans :初始化事務槽的個數(1·255),表默認1,index 默認爲2;
maxtrans: 最大的事務槽個數 (默認255)
pctfree:預留給update 操做的空間,free space 大於pctfree 能夠insert,小於,不容許insert
數據塊的free space 管理:
pctfree:用來爲一個塊保留的空間百分比,以防止在從此的更新操做中增長一列或多列值的長度。達到該值,從freelist清除該塊信息。
pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操做。達到該值,該塊信息加入freelist
freelist:可用列表中登記了能夠插入數據的可用塊,位置在段頭,插入錶行數據時首先查找該列表。
行連接:指一行存儲在多個塊中的狀況,這是由於該行的長度超過了一個塊的可用空間大小,即行連接是跨越多塊的行。
行遷移:指一個數據行因爲update語句致使當前塊被從新定位到另外一個塊(那裏有充足的空間)中,但在原始塊中保留一個指針的情形。原 始塊中的指針是必需的,由於索引的ROWID項仍然指向原始位置。(pctfree問題)注意行遷移與insert和delete語句無關(考點)。
如何可以知道發生了行連接或行遷移?
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,當CHAIN_CNT有值時,看AVG_ROW_LEN,它表示行的平均長度,若是小於塊大小,那麼行是遷移行,若是大於塊大小,那麼是連接行。
SQL> create table t1 (c1 varchar2(20));
SQL> begin
2 for i in 1..1000 loop
3 insert into t1 values(null);
4 end loop;
5 end;
6 /
分析t1表肯定無行遷移
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
3 0
填充這些空列,再分析t1,有了行遷移
SQL> update t1 set c1='timran is my name';
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
26 865
使用段重組(即move),再分析t1,行遷移消失
SQL> alter table t1 move;
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
21 0
考點:對於大部分目的而言,應該用DBMS_STATS包中的過程分析表,但要查看行連接或行遷移信息,只能經過ANALYZE命令檢測。
1)什麼是高水位線?
高水位線(high-water mark,HWM)
顧名思義,高水位線有點類型於水文監測站裏測水深度的標杆同樣,當水漲的時候,水位線隨之上升,並在標杆留下一個水印痕,這個水印痕就是高水位線。在數據庫中,上述比喻很恰當。若是把表想象成一個平面結構,或者想象成從左到右依次排開的一系列塊,高水位線就是包含了數據的最右邊的塊。
原則上HWM只會增大,不會縮小,即便將表中的數據所有刪除,HWM仍是爲原值。
HWM對數據庫的操做有以下影響:
a) 全表掃描一般要讀出直到HWM標記的全部的屬於該表數據庫塊,即便該表中沒有任何數據。
b) 即便HWM如下有空閒的數據庫塊,鍵入在插入數據時使用了append關鍵字,則在插入時使用HWM以上的數據塊,此時HWM會自動增大。
2)兩個解決辦法
2.1)移動表move, 從一個表空移動到另外一個表空間(也能夠在本表空間內move), 能夠清除表裏的碎片。
語法:alter table t1 move [tablespace users];
優勢:能夠清除數據塊中的碎片,下降高水位線
缺點:move過程當中,表上的不能作DML或DDL操做。
move以後, 相關索引都不可用了,表上的索引須要重建(考點)。
create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m;
create table scott.t2 tablespace timran as select * from dba_objects;
select max(rownum) from t2;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T2';
analyze table t2 compute statistics;
delete t2 where rownum<=40000;
commit;
analyze table t2 compute statistics for table;
select table_name, blocks, num_rows from user_tables where table_name='T2';
這時候,num_rows已經減掉了40000條, 但 blocks 並無減小, 說明HWM沒有降低。
alter table t2 move tablespace users;
select * from user_tables where table_name='T2';
select table_name, blocks, num_rows from user_tables where table_name='T2';
能夠看到blocks減小了,
2.2)收縮表shrink,將數據行從一個數據塊移動到另外一個數據塊。
表收縮的底層實現的是經過匹配的INSERT和DELETE操做,它分兩個不一樣的階段:壓縮階段和DDL命令階段。
語法:alter table t2 shrink space [cascade][compact];
前提:1)表所在的表空間使用了ASSM,由於位圖方法才記錄有關塊實際有多滿的信息(考點)。2)表上啓用了row movement
drop table t2 purge;
....重複上面步驟
alter table t2 enable row movement;
alter table t2 shrink space;
analyze table t2 compute statistics for table;
考點1:表收縮操做生成undo和redo數據,索引能夠獲得維護,由於收縮實現爲一組DML事務,在壓縮期間不鎖表,但在移動單獨行時將鎖行。
考點2:SHRINK SPACE COMPACT 命令重組段的內容,它執行第一階段,不返回空間給表空間。
考點3:表必須遵照前面所說的兩個前提,不然不能收縮,若是不知足前提,MOVE就是重組表的惟一方式。
考點4:使用位圖管理塊,不能收縮MSSM管理,或有LONG列表或是有refresh_on_commit物化視圖的表。
用於排序,能夠創建多個臨時表空間,但默認的臨時表空間也只能有一個,default temporary tablespace不能offline和drop。若是未指定默認的臨時表空間,oracle 將會使用system做爲臨時表空間。 只有temp表空間是nologing 其餘表空間都是logging的。
【當臨時表空間爲空時】
09:00:53
SQL> alter tablespace temp add tempfile '/u01/oradata/timran11g/temp01.dbf' size 100m reuse;
這等於在原地重置了臨時表空間
09:01:14 SQL> select file_id,file_name,tablespace_name from dba_temp_files;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
1 /u01/oradata/timran11g/temp01.dbf TEMP
09:01:17 SQL> col name for a60;
09:01:19 SQL> select file#,name ,bytes/1024/1024 from v$tempfile;
FILE# NAME BYTES/1024/1024
---------- -------------------------------------------------- ---------------
1 /u01/oradata/timran11g/temp01.dbf 100
09:04:18
SQL> create temporary tablespace temp2 tempfile '/u01/oradata/timran11g/temp02.dbf' size 10m extent management local uniform size 128k;
09:06:17 SQL> select file#,name from v$tempfile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/oradata/timran11g/temp01.dbf
2 /u01/oradata/timran11g/temp02.dbf
09:06:52 SQL> col PROPERTY_VALUE for a30
09:06:59 SQL> col description for a40
09:07:04 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
.....
27 rows selected.
20:55:00 SQL> alter user scott temporary tablespace temp2;
09:07:05 SQL> alter database default temporary tablespace temp2;
09:07:34 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TMP01 Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA
...
09:07:41 SQL>
在不少狀況下,會有多個session 使用一個用戶名去訪問Oracle,而臨時表空間又是基於用戶的,那麼能夠創建一個臨時表空間組,其中若干臨時表空間組成,從而能夠提升表空間的使用效率。
1)臨時表空間組沒法顯式建立,當第一個臨時表空間分配給該組時自動建立。
09:07:41 SQL> alter tablespace temp tablespace group tmpgrp;
09:09:33 SQL> alter tablespace temp2 tablespace group tmpgrp;
09:09:38 SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TMPGRP TEMP
TMPGRP TEMP2
2)將臨時表空間組設成默認臨時表空間,能夠實現負載均衡。
09:09:52 SQL> alter database default temporary tablespace tmpgrp;
Database altered.
09:10:10 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TMPGRP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
3)要移除表空間組時,該組不能是缺省的臨時表空間。
SQL>alter database default temporary tablespace temp;
05:36:11 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
05:38:11 SQL> alter tablespace temp tablespace group '';
05:38:16 SQL> alter tablespace tmp01 tablespace group '';
Tablespace altered.
4)當組內全部臨時表空間被移除時,組也被自動刪除。
05:38:23 SQL> select * from dba_tablespace_groups;
no rows selected
SQL> drop tablespace tmp01 including contents and datafiles;
【乾淨刪除表空間】
當發生表空間不足的問題時經常使用的3個解決辦法:
1)增長數據文件大小(resize),
alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 5m;
2)增長數據文件(add datafile),
alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;
3)設置表空間自動增加(autoextend),
alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;
例
SQL> create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 5m;
05:46:08 SQL> create table scott.test1 (id int) tablespace timran;
05:47:11 SQL> insert into scott.test1 values(1);
05:47:15 SQL> insert into scott.test1 select * from scott.test1;
05:47:19 SQL> /
05:47:29 SQL> /
32768 rows created.
05:47:23 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 8 in tablespace TIMRAN
//用第一種方法擴充表空間
05:47:23 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 10m;
05:48:18 SQL> insert into scott.test1 select * from scott.test1;
05:48:25 SQL> /
131072 rows created.
05:48:26 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN
//用第二種方法擴充表空間:
05:48:57 SQL> alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;
05:49:04 SQL> insert into scott.test1 select * from scott.test1;
05:49:13 SQL> /
524288 rows created.
05:49:14 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN
//用第三種方法擴充表空間:
05:49:15 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;
05:49:33 SQL> insert into scott.test1 select * from scott.test1;
05:49:37 SQL> drop tablespace timran including contents and datafiles;
當咱們執行一個事務操做,好比要創建一個大表,或往表裏面插入大量數據時,若是中途由於表空間剩餘空間不足而且沒有開啓自動擴展的話,會報 OUT-OF-SPACE錯誤,事務會中斷,白白浪費了時間及數據庫資源。那麼,Oracle還爲咱們提供了一個很好的功能:resumable。
在resumable開啓的狀況下,若是Oracle執行某一個SQL申請不到空間了,會停頓下來(時間能夠由TIMEOUT來控制),將相關事務的該語句掛起(suspended),可是不會報OUT-OF-SPACE這個錯誤。等你把空間的問題解決了,事務自動恢復運行,Oracle會繼續從停下來的部分開始剛纔的SQL。
待補充 :例子
一、表的功能:存儲、管理數據的基本單元(二維表:有行和列組成)
二、表的類型:
1)普通表:heap table :數據存儲時,無序的,對它的訪問採用全表掃描。
2)分區表:(>2G)對大表進行優化 (Range Partitioning,Hash Partitioning,List Partitioning,Composite Partitioning)
1.表的功能 ,存儲、管理數據的的基本單位(二維表:有行和列組成)
二、表的類型:
1) 堆表:heap table,數據存儲時,無序的,對它的訪問採用全表掃描
2)分區表 表>2G
3)索引組織表(IOT)
4)簇表
5)臨時表
6)嵌套表
三、如何將普通錶轉換爲分區表:
1)range分區
create table sale(
product_id varchar2(5), sales_count number(10,2)
)
partition by range(sales_count)
(
partition p1 values less than(1000),
partition p2 values less than(2000),
partition p3 values less than(3000)
);
查看信息:
select * from user_tab_partitions where table_name='SALE';
insert into sale values('1',600);
insert into sale values('2',1000);
insert into sale values('3',2300);
insert into sale values('4',6000);
commit;
select * from sale partition(p1);
select * from sale partition(p2);
增長一個分區
alter table sale add partition p4 values less than(maxvalue);
再看一下, 能夠插入6000值了
select * from user_tab_partitions where table_name='SALE';
insert into sale values('4',6000);
會報錯——ORA-14402: 。若是必定要改,能夠經過打開表的row movement屬性來完成。
SQL> select rowid,t1.* from sale partition(p1) t1;
ROWID PRODU SALES_COUNT
------------------ ----- -----------
AAASvUAAEAAAAGVAAA 1 600
SQL> update sale set sales_count=1200 where sales_count=600;
update sale set sales_count=1200 where sales_count=600
*
第 1 行出現錯誤:
ORA-14402: 更新分區關鍵字列將致使分區的更改
SQL> alter table sale enable row movement;
SQL> update sale set sales_count=1200 where sales_count=600;
已更新 1 行。
SQL> select rowid,t1.* from sale partition(p2) t1;
ROWID PRODU SALES_COUNT
------------------ ----- -----------
AAASvVAAEAAAAGdAAA 2 1000
AAASvVAAEAAAAGdAAB 1 1200
SQL>create index sale_idx on sale(sales_count) local;
SQL>select * from user_ind_partitions;
若是還想建全表索引(不分區)則(不能與分區表索引同時存在)
SQL>create index sale_idx on sale(sales_count) global
SQL>select * from user_indexes;
create table my_emp(
empno number, ename varchar2(10)
)
partition by hash(empno)
(
partition p1, partition p2
);
select * from user_tab_partitions where table_name='MY_EMP';
插入幾個值,看是否均勻插入。
insert into my_emp values(1,'A');
insert into my_emp values(2,'B');
insert into my_emp values(3,'C');
select * from my_emp partition(P1);
select * from my_emp partition(P2);
create table personcity(
id number, name varchar2(10), city varchar2(10)
)
partition by list(city)
(
partition east values('tianjin','dalian'),
partition west values('xian'),
partition south values ('shanghai'),
partition north values ('herbin'),
partition other values (default)
);
insert into personcity values(1,'sohu','tianjin');
insert into personcity values(2,'sina','herbin');
insert into personcity values(3,'yahoo','dalian');
insert into personcity values(4,'360','zhengzhou');
insert into personcity values(5,'baidu','xian');
看結果
select * from personcity partition(east);
把範圍分區和散列分區相結合或者 範圍分區和列表分區相結合。
create table student(
sno number, sname varchar2(10)
)
partition by range(sno)
subpartition by hash(sname)
subpartitions 4
(
partition p1 values less than(1000),
partition p2 values less than(2000),
partition p3 values less than(maxvalue)
);
有三個range分區,對每一個分區會有4個hash分區,共有12個分區。
SQL> select * from user_tab_partitions where table_name='STUDENT';
SQL> select * from user_tab_subpartitions where table_name='STUDENT';
用OEM查看,看scott的student table子分區裏的名字是oracle取名。
Oracle11g新增分區
Partition(分區),一直是Oracle數據庫引覺得傲的一項技術,正是分區的存在讓Oracle高效的處理海量數據成爲可能。在Oracle11g在10g的分區技術基礎上又有了新的發展,使分區技術在易用性和可擴展性上再次獲得了加強。
也稱爲間隔分區,其實是由range分區引伸而來,最終實現了range分區的自動化。
間隔分區的特色:
1).以定長寬度建立分區(好比年、月、具體的數字(好比100、500等))
2).分區字段必須是number或date類型
3).必須至少指定一個range分區(永久分區)
4).當有記錄插入時,系統根據須要自動建立新的分區和本地索引
5).已有的範圍分區可被轉換成間隔分區(經過ALTER TABLE SET INTERVAL選項完成)
又一我的性化的分區類型,System Partitioning,在這個新的類型中,咱們不須要指定任何分區鍵,數據會進入哪一個分區徹底由應用程序決定,實際上也就是由SQL來決定,終於,咱們在Insert語句中能夠指定插入哪一個分區了。
在10g中,咱們知道複合分區只支持Range-List和Range-Hash,而在在11g中複合分區的類型大大增長,如今Range,List,Interval均可以做爲Top level分區,而Second level則能夠是Range,List,Hash,也就是在11g中能夠有3*3=9種複合分區,知足更多的業務需求。
所謂的虛擬列,是指該列數據並不實際存儲於磁盤上,只有當讀取的時候才實時計算。
(IOT表:若是表常常以主鍵爲索引查詢,可創建索引組織表,加快表的訪問速度
heap table 數據的存放也是隨機的,獲取表中的數據時沒有明確的前後之分,在進行全表掃描的時候,並非先插入的數據就先獲取。而IOT 就是相似一個全是索引的表,表結構按照索引(主鍵)有序組織,所以數據存放是按照嚴格規定的,在數據插入之前就已經肯定了其位置,因此無論插入的前後順序,它在那個物理上的那個位置與插入的前後順序無關。
因爲IOT表是把普通表與其索引合二而一了,這樣在進行查詢的時候就能夠少訪問不少blocks,可是插入的時候,速度就比普通的表要慢一些。
IOT表的葉子節點存儲了全部表列,由於按主鍵排序,不須要存儲rowid。
設置溢出段將主鍵和溢出數據分開來存儲以提升效率。
說明:pctthreshold制定了在葉子節點中主鍵和其餘列的百分比,當行數據在葉子節點佔用大小超出時,將該行的其餘列放入溢出段,即overflow到指定的存儲空間去,溢出段不是必選的。
create table iot_timran(id int, name char(50), sal int,
constraint pk_timran primary key (id))
organization index pctthreshold 30 overflow tablespace users;
使用select * from user_indexes 查看是否單獨有索引。
SQL> select index_name,index_type,table_name from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME
------------------------------ --------------------------- ------------------------------
PK_TIMRAN IOT - TOP IOT_TIMRAN
PK_EMP NORMAL EMP
PK_DEPT NORMAL DEPT
兩個相互關聯的表的數據,同時放到一個簇數據塊中,當之後進行關聯讀取時,只要掃描一個數據塊就能夠了,極大地提升了效率。
創建簇表的三個步驟:
1)創建簇段cluster segment
2)基於簇,建立兩個相關表,每一個表都關聯到cluster segment上。
3)爲簇建立索引。
create cluster cluster1(code_key number);
create table student(sno1 number, sname varchar2(10)) cluster cluster1(sno1);
create table address(sno2 number,zz varchar2(10)) cluster cluster1(sno2);
create index index1 on cluster cluster1;
查看簇的信息:
select * from user_clusters;
select * from user_clu_columns;
刪除簇:
drop table student;
drop table address;
drop cluster cluster1;
用於電子商務的網上購物
臨時表用於存放臨時數據, 臨時表被每一個session單獨使用,即:不一樣session看到的臨時表中的數據可能不同。
臨時表在臨時表空間中存儲。沒有約束,索引,日誌,節省資源,訪問數據快。
兩種模式:
1)在事務提交時,就會自動刪除記錄,on commit delete rows。
2)當用戶退出session 時,纔會自動刪除記錄, on commit preserve rows。
例:scott:
create global temporary table tmp_student(sno int,sname varchar2(10), sage int) on commit preserve rows;
再用Scott開一個session
兩邊插入記錄看看, 你能夠在兩個session裏插入一樣的記錄,井水不犯河水!
要刪除臨時表,先要斷開鏈接,使用disconnect命令,這時臨時表消失了,再來刪除。
drop table tmp_table
在之前版本中,有隻讀表空間但沒有隻讀表。11g中增長了新特性----只讀表。
SQL> alter table t read only;
SQL> update t set id=2;
update t set id=2
*
第 1 行出現錯誤:
ORA-12081: 不容許對錶 "SCOTT"."T" 進行更新操做
SQL> alter table t read write;
13.1 審計的功能:監控用戶在database 的 action (操做)
13.2 審計分類:
1) session :在同一個session,相同的語句只產生一個審計結果(默認)
2) access : 在同一個session,每個語句產生一個審計結果
13.3 啓用審計(默認不啓用)
09:54:18 SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/admin/timran/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE (不啓用)
09:54:56 SQL> alter system set audit_trail=db scope=spfile;
09:55:02 SQL> startup force;
09:55:23 SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/admin/timran/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string DB
09:55:29 SQL>
audit_trail參數三個選項
1)none 不啓用audit
2)db 將審計結果放在數據字典裏(database),只有dba 能夠訪問
3)os 將審計結果存放到操做系統的文件裏(由audit_file_dest指定的位置)
啓用audit ,默認不審計sys用戶的action
audit_sys_operations=true ,啓用對於sys 用戶的審計
(默認狀況:session ,對成功和不成功的同時審計)
oracle 提供的審計種類:語句審計、權限審計、對象審計、精細審計(FGA)、應用審計(觸發器審計)等。
精細審計Fine Grained Auditing (FGA),操做能夠使用dbms_fga包或OEM。
1)添加一個精細度審計策略
sys:
begin
dbms_fga.add_policy(
object_schema=>'scott',
object_name=>'emp',
policy_name=>'chk_emp',
audit_condition =>'deptno=20',
audit_column =>'sal',
statement_types =>'update,select');
end
/
11:31:28 SQL> conn scott/scott
2)測試一下步驟,再查看審計結果
11:31:35 SQL> select * from emp;
11:31:41 SQL> select * from emp where deptno=20;
11:31:48 SQL> update emp set deptno=10 where empno=7788;
11:32:12 SQL> update emp set sal=8000 where deptno=20;
16:04:54 SQL> update emp set sal=8000 where deptno=10;
11:32:21 SQL> commit;
3)驗證審計結果
11:32:24 SQL> conn /as sysdba
11:33:52 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;
DB_USER time SQL_TEXT
---------- ------------------- --------------------------------------------------
SCOTT 2011-08-11 11:31:42 select * from emp
SCOTT 2011-08-11 11:31:49 select * from emp where deptno=20
SCOTT 2011-08-11 11:32:12 update emp set sal=8000 where empno=7788
SCOTT 2011-08-11 11:32:21 update emp set sal=8000 where deptno=20
精細審計結果存放到fga_log$的基表裏,經過dba_fga_audit_trail 查看。
11:34:36 SQL> select count(*) from fga_log$;
COUNT(*)
----------
4
11:36:20 SQL> delete from fga_log$;
11:36:26 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;
no rows selected
4)禁止、激活、刪除FGA的PL/SQL API命令
禁止精細審計
04:08:08 SQL>
exec dbms_fga.disable_policy(-
object_schema=>'scott',
object_name=>'emp',-
policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
激活精細審計
04:10:33 SQL>
exec dbms_fga.enable_policy(-
object_schema=>'scott',
object_name=>'emp',-
policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
刪除FGA策略
04:11:52 SQL>
exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
刪除精細審計的結果
04:12:43 SQL> delete from sys.fga_log$;
commit;
(好比文本型)數據導入oracle database。(用於數據導入、不一樣類型數據庫數據遷移)
在段(segment 表)insert 記錄
1)normal:將記錄插入到segment的HWM(高水位線)如下的塊,要首先訪問bitmap ,來肯定那些block 有free space
2)direct: 將記錄插入到segment的HWM(高水位線)以上的從未使用過的塊,加快插入速度
SQLLDR keyword=value [,keyword=value,...]
看幫助信息
$/u01/oracle/bin/sqlldr(回車)
*考點:sql*loader與data dump的一個區別:data dump只能讀取由它導出的文件,而sql*loader能夠讀取任何它能解析的第三方文件格式
1)模擬生成數據源
SQL> set time on
11:02:13
SQL>select empno||','||ename||','||job||','||mgr||','||hiredate||','||sal||','||comm||','||deptno from scott.emp;
EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||DEPTNO
------------------------------------------------------------------------------------------------------------------------
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
14 rows selected.
2)建個目錄
[oracle@timran]$mkdir -p /home/oracle/sqlload
[oracle@timran]$cd /home/oracle/sqlload
[oracle@timran sqlload]$vi emp.dat --生成外部表
--------查看數據源
[oracle@timran sqlload]$ more emp.dat
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
3)普通模式導入
創建控制文件
[oracle@work sqlldr]$ vi emp.ctl
load data
infile '/home/oracle/sqlload/emp.dat'
insert --insert 插入表必須是空表,非空表用append
into table emp1
fields terminated by ','
optionally enclosed by '"'
(
empno,
ename,
job,
mgr,
hiredate,
comm,
sal,
deptno)
4)在scott下創建emp1表(內部表),只要結構不要數據
11:10:13 SQL> create table emp1 as select * from emp where 1=2;
5)執行導入(normal)
[oracle@timran timran]$ sqlldr scott/scott control=emp.ctl log=emp.log
SQL*Loader: Release 10.2.0.1.0 - Production on Thu Aug 11 12:18:36 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Commit point reached - logical record count 14
5)驗證:
11:07:12 SQL>
11:07:12 SQL> select * from emp1;
上例的另外一種形式是將數據源和控制文件合併在.ctl裏描述
[oracle@work sqlldr]$ vi emp.ctl
load data
infile *
append
into table emp1
fields terminated by ','
optionally enclosed by '"'
(
empno,
ename,
job,
mgr,
hiredate,
comm,
sal,
deptno)
begindata
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
[oracle@timran sqlload]$ sqlldr scott/scott control=emp.ctl log=emp.log
Commit point reached - logical record count 15
[oracle@timran sqlload]$
[oracle@timran sqlload]$
[oracle@timran sqlload]$
[oracle@timran sqlload]$ ll
總計 12
-rw-r--r-- 1 oracle oinstall 1 07-17 11:09 emp.bad
-rw-r--r-- 1 oracle oinstall 782 07-17 11:09 emp.ctl
-rw-r--r-- 1 oracle oinstall 2055 07-17 11:09 emp.log
[oracle@timran sqlload]$ more emp.bad
11:09:34 SQL>SQL> select count(*) from emp1;
COUNT(*)
----------
28
1)listener:在oracle server 上啓動,負責接收client process 並派生server process ,與client process 創建session
2)創建listener :經過 netca
3)listener 配置
4)lsnrctl start|stop|status
5)$ORACLE_HOME/network/admin/listener.ora 配置程序,動態註冊能夠不使用這個配置程序。
1)$ORACLE_HOME/network/admin/tnsnames.ora 配置文件。
如:
myoracle =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = timran11g)
)
)
2) 注意幾個地方
2.1 HOST=目標機的IP,若是是windows平臺,習慣使用主機名。PORT=1521這是動態註冊的默認端口號。
2.2 SERVICE_NAME 是目標機的instance名,不能寫錯。
2.3 myoracle是鏈接符,表明的是等號後面整個網絡鏈接字符串,爲了便於記憶,它經常和SERVICE_NAME同名。但含義不一樣。
C:\Documents and Settings\timran>sqlplus sys/oracle@myoracle as sysdba
告訴listener ,database的instance name 和 service name
1)動態註冊:listener 採用的是默認端口(1521),當實例啓動時,由pmon 自動將instance name 和service name 註冊到listener
2)靜態註冊:當listener 使用的是非標準端口(1521),在listener.ora的文件裏手工註冊(添加instance name 和 service name)
靜態註冊:
1)靜態註冊不須要監聽器啓動,數據庫關閉時能夠完成靜態註冊,於是能夠進行遠程啓動/關閉數據庫的任務。
2)靜態註冊使用用戶指定的端口號(非1521),相對隱蔽,安全。
3)靜態註冊須要listener.ora描述。
動態註冊:
1)須要監聽器啓動,而監聽器依賴數據庫打開才能開啓。因此動態註冊沒法遠程啓動數據庫。
2)使用標準1521端口,自動註冊。
3)能夠不使用listener.ora
例子:動態註冊和靜態註冊搭配使用
[oracle@timran admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/oracle/network/admin/listener.ora
# Generated by Oracle configuration tools.
LSN2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1522))
)
)
SID_LIST_LSN2 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME= timran11g)
(ORACLE_HOME = /u01/oracle)
(SID_NAME = timran11g)
)
)
--以上是靜態監聽描述
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = timran.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
--以上是動態監聽默認描述
[oracle@timran admin]$
--啓動lsn2
[oracle@timran admin]$ netstat -an|grep 1522
tcp 0 0 0.0.0.0:1522 0.0.0.0:* LISTEN
tcp 0 0 192.168.8.240:1522 192.168.8.248:3371 ESTABLISHED
tcp 0 0 192.168.8.240:33187 192.168.8.240:1522 ESTABLISHED
tcp 0 0 192.168.8.240:1522 192.168.8.240:33187 ESTABLISHED
啓動靜態監聽器
[oracle@timran admin]$ lsnrctl start lsn2
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:13:33
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/oracle/network/admin/listener.ora
Log messages written to /u01/oracle/network/log/lsn2.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias lsn2
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 12-AUG-2011 11:13:33
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/oracle/network/admin/log/lsn2.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Services Summary...
Service "prod" has 1 instance(s).
Instance "prod", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
----------查看lsn2 status
[oracle@timran admin]$ lsnrctl status lsn2
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:16:18
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias lsn2
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 12-AUG-2011 11:13:33
Uptime 0 days 0 hr. 2 min. 44 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/oracle/network/log/lsn2.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Services Summary...
Service "prod" has 1 instance(s).
Instance "prod", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
//status unknown 表示instance 是以靜態註冊方式註冊
客戶端的tnsnames.ora配置文件
lsn2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.88)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME =timran11g)
)
)
timran11g =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = timran11g)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
說明:lsn2是靜態註冊連接,端口號1522。timran11g是動態註冊連接,端口號1521.
*考點:
1)若是沒有使用RAC,那麼監聽器必須與實例在同一臺主機上運行。在RAC環境下,集羣中任何主機的任何監聽器均可以任何主機的任何實例。
2)若是監聽器中止運行,那麼不能啓動任何新的服務器進程,但不會影響先前已經創建的會話。
3)共享鏈接方式下,會話與調度進程在會話期間持久存在,而與監聽器的鏈接是短暫的。
自動存儲管理即ASM(Automatic Storage Management),是Oracle提供的一項管理磁盤的功能,它是一種以純軟件方式實現的邏輯卷管理器,功能上提供了基於Oracle數據文件的條帶化和可選的鏡像。ASM的知識同時涉及了數據庫管理和系統管理兩大領域。
物理卷:指的是獨立磁盤,或磁盤分區或磁盤RAID結構。
邏輯卷:LVM(Logical Volume Manager),以軟件方式將虛擬磁盤呈現給用戶,LVM是操做系統級別的。提供了磁盤管理的靈活性,可靠性,具 有條帶,鏡像和快照等功能。
磁盤陣列上的RAID技術:但願經過多個物理卷加強性能和容錯性,經常使用的有4個級別,RAID0,RAID1,RAID5,RAID0+1。
1)ASM瞭解Oracle特性,它提供的條帶和鏡像功能是基於文件的,而不像LVM是基於物理卷的。因此ASM能夠作到不一樣的數據文件有不一樣的條帶大小,這對提升系統性能來講是一個優點。
2)因爲基於文件的條帶,ASM能夠針對數據文件制定不一樣的容錯方案,好比system表空間的數據文件能夠採用3個副本的鏡像,而臨時表空間的數據文件根本不須要鏡像。
3)ASM增長/刪除磁盤後會使磁盤組上的文件從新均衡分佈,這個過程是自動完成的。除了高級存儲如EMC或EVA之外,通常的LVM是不提供的,
4)ASM是Oracle綁定的,不一樣的平臺上可移植性好,不像LVM依賴硬件廠商提供的OS,各有各的LVM技術,而有些OS上並無捆綁LVM,那麼要使用的話還要從第三方購買。
(如下概念全是考點)
ASM數據庫須要啓動ASM實例,非ASM數據庫實例(又叫標準實例)的默認參數INSTANCE_TYPE是RDBMS,此參數設置成ASM將啓動ASM實例,ASM實例負責定位數據文件,注意僅僅是定位,數據文件的IO讀寫操做仍是由RDBMS實例完成的。
ASM實例合法參數不多,應該設置ASM_DISKTRING表示ASM磁盤和ASM_DISKGROUP參數來標識ASM磁盤組,這些參數在RDBMS實例中是沒有的。
ASM能夠管理的文件有數據文件,臨時文件,控制文件,聯機和歸檔日誌文件,spfile,及RMAN備份集和映像副本等,ASM不支持口令文件、跟蹤文件、告警文件和Oracle二進制文件(考點)。
ASM磁盤能夠是實際的磁盤,也能夠是磁盤的某個分區,或LVM管理的邏輯卷,ASM磁盤應該使用沒有文件系統的磁盤(就是說未格式化的磁盤)
ASM磁盤組由ASM磁盤組成,能夠包含一個或多個ASM磁盤
磁盤組中建立的文件由跨越組中全部的ASM磁盤分佈的1M大小的分配單元(AU)構成。注意,AU是基於ASM磁盤的。
只能使用RMAN備份ASM文件,操做系統命令對ASM文件不可知。
能夠向磁盤組動態添加磁盤,磁盤組會自動再平衡,即會從新條帶化文件的分配單元,注意,條帶(stripting)是基於ASM文件的。
能夠經過ALTER DISKGROUP MOUNT手動加載ASM磁盤,也能夠經過指定參數ASM_DISKGROUP動態加載。
AU是創建磁盤組時肯定的,缺省是1M,能夠指定爲1,2,4,8,16,32或64M。
striping分爲粗粒度條帶(coarse),細粒度條帶(fine),相對1M的AU,粗粒度也是1U,而細粒度是128K,它們是針對不一樣的數據文件制定的不一樣的條帶策略,這些策略已由Oracle模板缺省定義了,好比datafile是粗粒度,control file是細粒度,如有特殊需求,可自定義模板,而後在創建表空間時引用自定義模板,
AU是跨一個磁盤組中的全部磁盤。
striping是跨一個磁盤組中全部磁盤文件。
ASM的鏡像是創建在striping上的,是extent級的。這也是對LVM的一個優點。
缺省ASM容錯有點相似RAID0+1,磁盤鏡像是normal redundancy(兩個副本),還能夠調整爲EXTERNAL REDUNDANCY(無鏡像),以及HIGH REDUNDANCY(三個副本)。ASM不能禁用條帶化。
一個磁盤組能夠由兩個或多個故障組(failgroup)組成,一個故障組由一個或多個ASM磁盤組成
故障組是在標準冗餘的基礎上指定鏡像策略,它是一種鏡像功能的補充,此考慮經常是出於想指定一對鏡像分配在兩路磁盤控制器下,以便在提供了更安全的共享相同資源的冗餘,
假定有磁盤組DG1,且建立了兩個故障組fgroup1,fgroup2,每一個故障組由個ASM磁盤組成,則對標準冗餘而言,指定兩個故障組互爲鏡像
failgroup1 --> asmdiskA , asmdiskB
failgroup2 --> asmdiskC , asmdiskD
注意:failgroup1和failgroup2互爲鏡像,這是以每一個組中全部磁盤統一考慮的,內部工做機制是鏡像extent。
假定文件datafileA大小爲4MB,則個4extent均勻分佈到asmdiskA,asmdiskB,一樣asmdiskC,asmdiskD也包含該文件的每一個extent
即只要有一個extent在故障組fgroup1中存在,一定有一個鏡像的extent存在於fgroup2中,反之亦然,兩個組的extent互爲鏡像。
當一個故障組中的某個磁盤損壞,假定爲asmdiskA ,則asmdiskA中原來保存的extent將會從failgroup2中複製到asmdiskB中。
總之,故障組failgroup1和failgroup2一定有相同的extent副本
要求claster服務,即便不是RAC配置,單實例工做方式也要使用CSS部分功能,另外還須要瞭解ASM也有後臺進程,如SMON,PMON,LGWR,DBWR,CKPT等,此外還增添了兩個新進程,一個是RBAL,一個是ARBn
RBAL:用於協調和管理磁盤組之間的動態平衡
ARBn:能夠爲多個,用於完成AU的移動
特別注意 RBAL在ASM實例和RDBMS實例中各有一個,但功能不一樣,前者是負責協調ASM再平衡活動,後者負責打開和關閉ASM磁盤。
1)只能在nomount 下啓動ASM實例,它永遠不能mount控制文件,也不能打開datafile
2)啓動:ASM實例先啓動,RDBMS實例後啓動。退出:RDBMS實例先shutdwon immediate,ASM實例後退出.
3) 若是ASM實例崩潰,RDBMS也崩潰。若是RDBMS shutdown abort,ASM實例什麼也不作。
1)創建條帶是必須的,而鏡像則是可選的。但ASM文件的默認特性是:同時條帶化和鏡像文件。
2)ASM文件是由RDBMS實例打開,不是ASM實例打開。
1).Oracle ASMlib 安裝
ASMlib是Oracle針對linux 操做系統作的ASM管理套件,ASMlib 簡化磁盤管理,取代原來咱們在linux 上經常使用rawdevices 服務。
根據linux不一樣的內核版本,對應有不一樣的ASMlib包,下載地址:http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html
真正須要安裝的ASMlib通常是三個包,以下:
oracleasm-kernel-version.arch.rpm
oracleasmlib- version .arch.rpm
oracleasm-support-version.arch.rpm
好比,個人linux內核版本是:
[root@timran ~]# uname -a
Linux timran.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 athlon i386 GNU/Linux
根據上面的kernel版本,我找到的三個對應的ASMlib包應該是:
oracleasm-2.6.18-53.el5-2.0.4-1.el5.i686.rpm
oracleasmlib-2.0.4-1.el5
oracleasm-support-2.1.7-1.el5
將這三個包加載到linux kernel中
[root@timran oracle]# rpm -qa |grep asm
[root@timran oracle]# rpm -ivh *.rpm
warning: oracleasmlib-2.0.4-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.18-53.el5########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
[root@timran oracle]# reboot //重啓一下,看看主控臺顯示ASM驅動可否正常加載.
Broadcast message from root (pts/1) (Thu Nov 15 16:23:30 2012):
The system is going down for reboot NOW!
ASMlib包裝好後會在/etc/init.d/下出現oracleasm這個service,它能夠支持不少關於ASM的操做。
2).啓用css服務(Cluster Synchronization Services ),用於同步ASM實例與RDBMS實例
使用root賬戶進行配置,配置程序位於$ORACLE_HOME/bin
[root@timran ~]# /u01/oracle/bin/localconfig add
/u01/oracle/bin/localconfig add
/etc/oracle does not exist. Creating it now.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initialized
Cleaning up Network socket directories
Setting up Network socket directories
Adding to inittab
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
Cluster Synchronization Services is active on these nodes.
timran
Cluster Synchronization Services is active on all the nodes.
Oracle CSS service is installed and running under init(1M)
[root@timran ~]#
3).建立ASM參數文件(使用VI或VIM)
[root@timran dbs]# cat /u01/oracle/dbs/init+ASM.ora
#*.asm_diskgroups='DG1' --這行先註釋掉,等到建完磁盤組後再去掉#號
*.asm_diskstring='' --這裏有個技巧,設成空表示能夠搜索任意的ASM磁盤
*.diagnostic_dest='/u01'
*.instance_type='ASM'
*.instance_name='+ASM'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.asm_power_limit=1
存盤後改一下屬主:
[root@timran dbs]# chown oracle:oinstall init+ASM.ora
4).建立密碼文件
[oracle@timran ~]$orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=redhat entries=5
[oracle@timran ~]$export ORACLE_SID=+ASM
[oracle@timran ~]$sqlplus / as sysdba
Connected to an idle instance.
SQL> startup
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1299428 bytes
Variable Size 258100252 bytes
ASM Cache 25165824 bytes
ORA-15110: no diskgroups mounted
實例啓動了,能夠在linux下看一下+ASM進程
[root@timran dbs]# ps -ef |grep +ASM
oracle 3993 1 0 14:31 ? 00:00:00 asm_pmon_+ASM
oracle 3995 1 0 14:31 ? 00:00:00 asm_vktm_+ASM
oracle 3999 1 0 14:31 ? 00:00:00 asm_diag_+ASM
oracle 4001 1 0 14:31 ? 00:00:00 asm_psp0_+ASM
oracle 4005 1 0 14:31 ? 00:00:00 asm_dia0_+ASM
oracle 4007 1 0 14:31 ? 00:00:00 asm_mman_+ASM
oracle 4009 1 0 14:31 ? 00:00:00 asm_dbw0_+ASM
oracle 4011 1 0 14:31 ? 00:00:00 asm_lgwr_+ASM
oracle 4013 1 0 14:31 ? 00:00:00 asm_ckpt_+ASM
oracle 4015 1 0 14:31 ? 00:00:00 asm_smon_+ASM
oracle 4017 1 0 14:31 ? 00:00:00 asm_rbal_+ASM
oracle 4019 1 0 14:31 ? 00:00:00 asm_gmon_+ASM
oracle 4021 3988 0 14:31 ? 00:00:00 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 4032 3235 0 14:37 pts/2 00:00:00 grep +ASM
若是實例不能啓動,能夠使用DBCA工具中-Configure Automatic-Storage-Management項去建立一個+ASM實例。
5).建立ASM磁盤及配置ASMlib驅動
建立ASM磁盤能夠基於三種平臺,1)磁盤,2)磁盤分區,3)邏輯卷。
此例我就選磁盤分區的示例一下:
在Vbox裏增長一塊4G虛盤,(注意,Vbox不支持熱插虛盤,加盤須要將linux關閉)而後啓動linux,看是否已經認出了/dev/sdb這個盤。
使用fdisk /dev/sdb 命令將/dev/sdb作四個同等大小的分個,分別是sdb1,sdb2,sdb3,sdb4.(linux基礎知識,這裏很少述)
你也能夠接下來作格式化,(如:mkfs.ext3 /dev/sdb*)將四個分區分別格式化成ext3文件系統,可是咱們作的是基於分區的,格式化就沒必要作了。
Command (m for help): p
Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 123 987966 83 Linux
/dev/sdb2 124 246 987997+ 83 Linux
/dev/sdb3 247 369 987997+ 83 Linux
/dev/sdb4 370 492 987997+ 83 Linux
Command (m for help): w
The partition table has been altered!
[root@timran init.d]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [OK]
[root@timran init.d]# reboot
若是你前面加的ASMlib包正確的話,你將有上面的顯示,不然有初始化ASMlib driver失敗的提示。
[root@timran dev]#ls /dev/oracleasm/disks //如今尚未建立ASM磁盤,因此沒有顯示。
建立ASM磁盤,執行下面四行命令:
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1
Marking disk "VOL1" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb2
Marking disk "VOL2" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb3
Marking disk "VOL3" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb4
Marking disk "VOL4" as an ASM disk: [ OK ]
[root@timran disks]#
[root@timran dev]# ls /dev/oracleasm/disks
VOL1 VOL2 VOL3 VOL4
此時ASM磁盤已經建好,接下來能夠建ASM磁盤組了。
6).建立ASM磁盤組
建磁盤組有兩個辦法,一個是使用DBCA工具,另外一個是使用sqlplus命令
使用sqlplus命令:
注意:加磁盤組必須在+ASM啓動之後
#su - oracle
$export ORACLE_SID=+ASM
$sqlplus / as sysdba
SQL>
SQL> startup
[oracle@timran ~]$export ORACLE_SID=+ASM
[oracle@timran ~]$sqlplus as sysdba
Connected to an idle instance.
SQL> startup
ASM instance started
ORA-15110: no diskgroups mounted
加磁盤組前要改一下這個參數
SQL> alter system set asm_diskstring='/dev/oracleasm/disks/VOL*';
create diskgroup DG1 normal redundancy
failgroup FG1 disk '/dev/oracleasm/disks/VOL1'name VOL1,'/dev/oracleasm/disks/VOL2' name VOL2
failgroup FG2 disk '/dev/oracleasm/disks/VOL3'name VOL3,'/dev/oracleasm/disks/VOL4' name VOL4;
SQL> col name for a10;
SQL> select NAME,STATE,FREE_MB,REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB from v$asm_diskgroup;
NAME STATE FREE_MB USABLE_FILE_MB
---------- ----------- ---------- --------------
DG1 MOUNTED 3750 964
SQL> col failgroup for a10;
SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MB from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME FAILGROUP STATE TOTAL_MB
------------ ----------- ---------- ---------- -------- ----------
1 3 VOL4 FG2 NORMAL 964
1 2 VOL3 FG2 NORMAL 964
1 1 VOL2 FG1 NORMAL 964
1 0 VOL1 FG1 NORMAL 964
從新啓動前將參數文件的第一行#去掉
[root@timran dbs]# vi /u01/oracle/dbs/init+ASM.ora
*.asm_diskgroups='DG1'
到此,創建ASM的基本內容已經完成了。重啓系統,檢查一下看看磁盤組是否可以自動mounted了。
SQL> exit
[oracle@timran ~]$ export ORACLE_SID=timran11g
[oracle@timran ~]$ sqlplus / as sysdba
[root@timran ~]# su - oracle
[oracle@timran ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:11:29 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1299428 bytes
Variable Size 258100252 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted
SQL>
7)測試ASM是否能夠工做
啓動了+ASM實例正常後,再啓動RDBMS實例,而後創建一個+ASM上的表空間testasm作測試。
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:26:00 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1300352 bytes
Variable Size 339740800 bytes
Database Buffers 75497472 bytes
Redo Buffers 6131712 bytes
Database mounted.
Database opened.
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
6 rows selected.
SQL> create tablespace testasm datafile '+DG1';
Tablespace created.
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
7 TESTASM YES NO YES
7 rows selected.
SQL>select file#,name from v$datafile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/oradata/timran11g/system01.dbf
2 /u01/oradata/timran11g/sysaux01.dbf
3 /u01/oradata/timran11g/undotbs01.dbf
4 /u01/oradata/timran11g/users01.dbf
5 /u01/oradata/timran11g/example01.dbf
6 +DG1/timran11g/datafile/testasm.256.803235039
6 rows selected.
SQL> conn scott/scott
SQL> create table test(id int) tablespace testasm;
SQL> insert into test values(1);
SQL> commit;
SQL> select * from test;
ID
----------
1
8)刪除ASM
SQL> drop tablespace testasm including contents and datafiles;
[root@timran ~]# su - oracle
[oracle@timran ~]$ export ORACLE_SID=+ASM
[oracle@timran ~]$ sqlplus / as sysdb
SQL> drop diskgroup dg1 including contents; //刪除ASM組和ASM磁盤要在實例啓動時作。
#/etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
#/etc/init.d/oracleasm deletedisk vol1
#/etc/init.d/oracleasm deletedisk vol2
#/etc/init.d/oracleasm deletedisk vol3
#/etc/init.d/oracleasm deletedisk vol4
SQL>shutdown abort //關閉ASM實例
#/u01/oracle/bin/localconfig delete //刪除css信息
#rm /u01/oracle/dbs/*ASM* //刪除ASM參數文件及口令文件
#vi /etc/oratab //刪除/etc/oratab文件中的ASM實例相關行
[root@timran init.d]# rpm -qa |grep asm //查詢asm有關的rpm包,
oracleasm-2.6.18-53.el5-2.0.4-1.el5
oracleasm-support-2.1.7-1.el5
oracleasmlib-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasmlib-2.0.4-1.el5 //刪除這三個rpm包
[root@timran init.d]# rpm -e oracleasm-2.6.18-53.el5-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasm-support-2.1.7-1.el5
[root@timran init.d]#
[root@timran init.d]# ll /etc/init.d/oracleasm //確信oracleasm文件刪掉了
ls: /etc/init.d/oracleasm: No such file or directory
[root@timran init.d]# shutdown -h now 關閉系統, 去window下直接刪除小魔方(後加入的虛盤)。
重啓系統 看看sdb已經沒有了。
[root@timran dev]# ll /dev/sd*
brw-r----- 1 root disk 8, 0 Dec 28 17:35 sda
brw-r----- 1 root disk 8, 1 Dec 28 17:35 sda1
brw-r----- 1 root disk 8, 2 Dec 28 17:35 sda2
[root@timran dev]#
9)安裝測試完成後碰到了一個問題:當啓動ASM實例後再啓動RDBMS實例時報錯:
ORA-00845: MEMORY_TARGET not supported on this system
這個問題是因爲設置SGA的大小超過了操做系統/dev/shm的大小:
查看並更改/etc/fstab文件後,問題解決。
[root@timran ~]# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 506M 158M 348M 32% /dev/shm
[root@timran ~]#
[root@timran ~]#
[root@timran ~]#
[root@timran ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
tmpfs /dev/shm tmpfs defaults,size=800m 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
*再強調一下如下考點:
1)ASM只能存儲數據庫文件,不能存儲二進制文件。即只能用於數據庫和恢復文件,所以Oracle的主目錄以及跟蹤、告警、口令及靜態參數文 件務必保存在常規文件系統上。
2)ASM使用RAC,但不是必須的,由於能夠使用第三方的集羣卷管理器,ASM不只僅使用RAC,由於它一樣適用於單實例的非集羣數據庫。
3)ASM鏡像默認是單鏡像,可是能夠設置爲無鏡像或雙鏡像,不能禁用條帶化。
4)常規的磁盤活動不涉及ASM實例,ASM的功能是實現對文件可用性管理和控制,它不執行實際的I/O操做。
expdp/impdp:數據泵
傳統的導出導入程序指的是exp/imp,用於實施數據庫的邏輯備份和恢復。
導出程序exp將數據庫中的對象定義和數據備份到一個操做系統二進制文件中。
導入程序imp讀取二進制導出文件並將對象和數據載入數據庫中
傳統的導出導入程序是客戶端工具。在$ORACLE_HOME/bin下
導出和導入實用程序的特色有:
1)能夠按時間保存表結構和數據
2)容許導出指定的表,並從新導入到新的數據庫中
3)能夠把數據庫遷移到另一臺異構服務器上
4)在兩個不一樣版本的Oracle數據庫之間傳輸數據
5)在聯機狀態下進行備份和恢復
6)能夠從新組織表的存儲結構,減小連接及磁盤碎片
使用如下三種方法調用導出和導入實用程序:
1,交互提示符:以交互的方式提示用戶逐個輸入參數的值。
2,命令行參數:在命令行指定執行程序的參數和參數值。
3,參數文件:容許用戶將運行參數和參數值存儲在參數文件中,以便重複使用參數
導出和導入數據庫對象的四種模式是:
1,數據庫模式:導出和導入整個數據庫中的全部對象
2,表空間模式:導出和導入一個或多個指定的表空間中的全部對象
3,用戶模式:導出和導入一個用戶模式中的全部對象
4,表模式:導出和導入一個或多個指定的表或表分區
1)scott導入導出本身的表,通常是從服務器導出到客戶端(在cmd下操做)
SQL> create table emp1 as select * from emp;
SQL> create table dept1 as select * from dept;
C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:empdept1.dmp tables=(emp1,dept1)
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即將導出指定的表經過常規路徑...
. . 正在導出表 EMP1導出了 14 行
. . 正在導出表 DEPT1導出了 4 行
成功終止導出, 沒有出現警告。
sysdba下導入導出其餘用戶的表
再導入server裏
SQL> drop table emp1 purge;
SQL> drop table dept1 purge;
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:empdept1.dmp
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
經由常規路徑由 EXPORT:V10.02.01 建立的導出文件
已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入
. 正在將 SCOTT 的對象導入到 SCOTT
. 正在將 SCOTT 的對象導入到 SCOTT
. . 正在導入表 "EMP1"導入了 14 行
. . 正在導入表 "DEPT1"導入了 4 行
成功終止導入, 沒有出現警告。
使用sys導出scott的兩個表
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:scott.dmp tables=(scott.emp1, scott.dept1)
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即將導出指定的表經過常規路徑...
當前的用戶已更改成 SCOTT
. . 正在導出表 EMP1導出了 14 行
. . 正在導出表 DEPT1導出了 4 行
成功終止導出, 沒有出現警告。
SQL> drop table emp1 purge;
SQL> drop table dept1 purge;
使用sys再導入scott的這兩個表
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott
Import: Release 11.1.0.6.0 - Production on 星期一 7月 30 21:59:58 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
經由常規路徑由 EXPORT:V10.02.01 建立的導出文件
已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入
. 正在將 SYS 的對象導入到 SYS
. 正在將 SCOTT 的對象導入到 SCOTT
. . 正在導入表 "EMP1"導入了 14 行
. . 正在導入表 "DEPT1"導入了 4 行
成功終止導入, 沒有出現警告。
sys導出scott表, scott導入(報錯)
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:sysscott.dmp tables=(scott.emp1,scott.dept1)
Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 14:34:52 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即將導出指定的表經過常規路徑...
當前的用戶已更改成 SCOTT
. . 正在導出表 EMP1導出了 14 行
. . 正在導出表 DEPT1導出了 4 行
成功終止導出, 沒有出現警告。
scott導入
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:sysscott.dmp
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
經由常規路徑由 EXPORT:V10.02.01 建立的導出文件
IMP-00013: 只有 DBA 才能導入由其餘 DBA 導出的文件
IMP-00000: 未成功終止導入
C:\Documents and Settings\timran>
當前用戶scott導出本身的全部對象, 注意僅僅導出的是schema的object,也就是說這個導出不包括數據字典中的信息,好比用戶帳戶,及原有的一些系統權限等等。
C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:scott.dmp owner=scott
SQL> drop user scott cascade;
SQL> create user scott identified by scott;
SQL> grant connect,resource to scott;
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:scott.dmp
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
經由常規路徑由 EXPORT:V10.02.01 建立的導出文件
已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入
. 正在將 SCOTT 的對象導入到 SCOTT
. . 正在導入表 "BONUS"導入了 0 行
. . 正在導入表 "DEPT"導入了 4 行
. . 正在導入表 "DEPT1"導入了 4 行
. . 正在導入表 "EMP"導入了 14 行
. . 正在導入表 "EMP1"導入了 14 行
. . 正在導入表 "SALGRADE"導入了 5 行
即將啓用約束條件...
成功終止導入, 沒有出現警告。
//若是用sys來完成也能夠使用以下命令:
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott touser=scott
//sys用戶也能夠將導出的scott的內容導入給其餘用戶
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott touser=tim
17.1.3 導入導出表空間
Oracle10g後,引入了導入導出可傳輸表空間技術,使表空間的遷移更加快速高效
模擬場景:xp/orcl到linux/timran11g(中文字符集)可傳輸表空間的導入導出:
1)在xp/orcl上創建表空間
sys:
create tablespace tb1 datafile 'd:/mytb1.dbf' size 5m;
scott:
create table 測試 (姓名 char(10),年齡 int) tablespace tb1;
insert into 測試 values('張三',20);
insert into 測試 values('王小二',18);
commit;
2)導出tb1表空間,先設爲只讀;
sys:
alter tablespace tb1 read only;
xp:cmd下
exp 'sys/system@orcl as sysdba' tablespaces=tb1 transport_tablespace=y file=d:\exp_tb1.dmp
Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 16:11:25 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 將不導出表數據 (行)
即將導出可傳輸的表空間元數據...
對於表空間 TB1...
. 正在導出簇定義
. 正在導出表定義
. . 正在導出表 測試
. 正在導出引用完整性約束條件
. 正在導出觸發器
. 結束導出可傳輸的表空間元數據
成功終止導出, 沒有出現警告。
3)以xmanager把exp_tb1.dmp和MYTB1.DBF都傳輸到linux/timran裏
目錄以下:/u01/oradata/timran11g
4)在linux的$下執行導入
[oracle@timran ~]$ imp userid=\'sys/system as sysdba\' tablespaces=tb1 file=/u01/oradata/timran11g/exp_tb1.dmp transport_tablespace=y datafiles=/u01/oradata/timran11g/MYTB1.DBF
Import: Release 11.1.0.6.0 - Production on 星期五 8月 2 22:19:50 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Export file created by EXPORT:V10.02.01 via conventional path
About to import transportable tablespace(s) metadata...
import done in ZHS16GBK character set and UTF8 NCHAR character set
export server uses AL16UTF16 NCHAR character set (possible ncharset conversion)
. importing SYS's objects into SYS
. importing SYS's objects into SYS
. importing SCOTT's objects into SCOTT
. . importing table "測試"
. importing SYS's objects into SYS
Import terminated successfully without warnings.
5)進入linux/timran下驗證
sys:
select tablespace_name,status from dba_tablespaces;
6)重設回讀寫方式
alter tablespace tb1 read write;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
EXAMPLE ONLINE
TB1 ONLINE
TEXT ONLINE
TEST1 ONLINE
TIMRAN ONLINE
6)驗證
scott:
select * from tab;
select * from 測試;
select table_name,tablespace_name from user_tables;
17.1.4 導出整個數據庫的對象
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:full.dmp full=y //這個過程太長,就不作了。
17.2 數據泵的導入導出--expdp/impdp(10g/11g新特性)
exp/imp的缺點是速度太慢,在大型生產庫中尤爲明顯。從10g開始,Oracle設計了數據泵,這是一個服務器端的工具,它爲Oracle提供了高速並行的大數據遷移方法。
expdp/impdp的工做方式體如今須要在server端建立一個 Directory 即操做MT表。
舉例
1)server端先建好一個存放MT表的物理目錄
[oracle@timran ~]$mkdir -p /u01/oradata/timran11g/dir1
2)server端用SYS創建目錄對象:
SQL> create directory MY_DIR as '/u01/oradata/timran11g/dir1';
3)爲scott授予目錄權限
SQL> grant read,write on directory MY_DIR to scott;
4)導出scott的emp dept表, 導出過程當中在server端有MT表出現SYS_EXPORT_TABLE_01,導出完成後MT表自動消失
C:\Documents and Settings\timran>expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept)
Export: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 9:54:45
Copyright (c) 2003, 2005, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Starting "SCOTT"."SYS_EXPORT_TABLE_01": scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,de
pt)
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 128 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "SCOTT"."DEPT" 5.648 KB 4 rows
. . exported "SCOTT"."EMP" 7.812 KB 14 rows
Master table "SCOTT"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_TABLE_01 is:
/u01/oradata/timran11g/dir1/expdp_scott1.dmp
Job "SCOTT"."SYS_EXPORT_TABLE_01" successfully completed at 09:51:14
看看目錄下的導出的文件
[oracle@timran dir1]$ ll /
總計 132
-rw-r----- 1 oracle oinstall 126976 07-30 09:51 expdp_scott1.dmp
-rw-r--r-- 1 oracle oinstall 1387 07-30 09:51 export.log
[oracle@timran dir1]$
5)導入expdp_scott1.dmp實驗 先刪掉原來的emp,dept 兩個表
SQL> conn scott/scott
SQL> drop table emp purge;
SQL> drop table dept purge;
C:\Documents and Settings\timran>impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp
Import: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 10:16:04
Copyright (c) 2003, 2005, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Master table "SCOTT"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SCOTT"."SYS_IMPORT_FULL_01": scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."DEPT" 5.648 KB 4 rows
. . imported "SCOTT"."EMP" 7.812 KB 14 rows
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "SCOTT"."SYS_IMPORT_FULL_01" successfully completed at 10:04:37
6)導出scott的emp detp的數據,但不導出結構
expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept) content=data_only reuse_dumpfiles=y
impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp
7)導出scott用戶
expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp schemas=scott //注意與exp的區別,schemas代替了owner的寫法
impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp
18.一、物化視圖做用
1) 數據倉庫中的物化視圖主要用於預先計算並保存錶鏈接或彙集等耗時較多的操做的結果,這樣,在執行查詢時,就能夠避免進行這些耗時的操做,從而快速的獲得結果。
2) 物化視圖和表同樣能夠直接進行查詢。物化視圖還用於複製、移動計算等方面。
18.2 物化視圖建立時的權限
若是建立基於主鍵的物化視圖,則必須具備訪問主表、訪問主表的日誌、create MATERIALIZED VIEW這三個權限。
若是建立基於rowid的物化視圖,則必須具備訪問主表、create MATERIALIZED VIEW這兩個權限。
18.3 建立物化視圖語法
create materialized view [view_name]
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{建立物化視圖用的查詢語句}
18.4 物化視圖建立時的選項
1) 查詢重寫(Query Rewrite):查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷可否經過查詢物化視圖來獲得結果。默認爲DISABLE QUERY REWRITE。
2) 物化視圖日誌:若是須要進行快速刷新,則須要創建物化視圖日誌。物化視圖日誌根據不一樣物化視圖的快速刷新的須要,能夠創建爲ROWID或PRIMARY KEY類型的。
3) 刷新(Refresh):指當基表發生了DML操做後,物化視圖什麼時候採用哪一種方式和基表進行同步。刷新的模式有兩種:ON DEMAND和ON COMMIT。ON DEMAND指物化視圖在用戶須要的時候進行刷新,能夠手工經過DBMS_MVIEW.REFRESH等方法來進行刷新,也能夠經過JOB定時進行刷新。ON COMMIT指出物化視圖在對基表的DML操做提交的同時進行刷新。刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST刷新採用增量刷新,只刷新自上次刷新之後進行的修改。COMPLETE刷新對整個物化視圖進行徹底的刷新。若是選擇FORCE方式,則Oracle在刷新時會去判斷是否能夠進行快速刷新,若是能夠則採用FAST方式,不然採用COMPLETE的方式。NEVER指物化視圖不進行任何刷新。默認值是FORCE ON DEMAND。
18.5 示例
測試環境:生產庫(linux)+備份庫(xp)
1)創建link鏈接
備份庫:
C:\Documents and Settings\timran>sqlplus sys/system@orcl as sysdba
sys:
SQL> create public database link my_link connect to scott identified by scott using 'timran11g';
//若是之前創建過,提示重名的話能夠使用下面語句刪掉 SQL> drop public database link my_link;
若想查看全部的數據庫連接,進入系統管理員SQL>操做符下,運行命令:
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER OBJECT_NAME
---------------------------------- ---------------------------------------
PUBLIC MY_LINK.REGRESS.RDBMS.DEV.US.ORACLE.COM
2)在備份庫上測試與生產庫(啓動監聽)的訪問鏈接是否成功。
scott:
SQL> select * from tab; //看備份庫(本身)
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
測試 TABLE
SQL> select * from tab@my_link; //看生產庫(別人)
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
範例1 基於主鍵的物化視圖
生產庫:(遠端linux)
scott:
SQL>create table test(id int primary key,name char(10));
SQL>create materialized view log on test;
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
MLOG$_TEST TABLE
RUPD$_TEST TABLE
SALGRADE TABLE
TEST TABLE
備份數據庫(本地xp)
sys:
SQL>grant create materialized view to scott;
scott:
SQL>create materialized view test_view refresh
fast
start with sysdate
next sysdate+1/2880
with primary key
as select * from scott.test@my_link;
//1440分鐘時24小時,1/1440是1分鐘,1/2880是30秒。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
TEST_VIEW TABLE
測試 TABLE
生產庫 scott:
SQL>insert into test values(1,'sina');
SQL>commit;
備份庫 scott:
SQL> select * from test_view;
未選定行
---30秒之後...
SQL> select * from test_view;
ID NAME
---------- ----------
1 sina
生產庫 scott:
SQL> insert into test values(2,'sohu');
SQL> commit;
備份庫 scott:
SQL> select * from test_view;
ID NAME
---------- ----------
1 sina
2 sohu
範例2 基於rowid的物化視圖
生產庫 scott:
SQL>drop table test purge;
SQL>SQL> create table emp1 as select * from emp;
備份庫 scott:
SQL>drop materialized view test_view;
SQL>create materialized view emp1_view refresh with rowid
start with sysdate
next sysdate+1/2880
as select deptno,sum(sal),avg(sal) from scott.emp1@my_link group by deptno;
備份庫 scott:
SQL> select * from emp1_view;
DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 9400 1566.66667
20 10875 2175
10 8750 2916.66667
生產庫 scott:
SQL> update emp1 set sal=sal+100;
SQL>commit;
備份庫 scott:
SQL> select * from emp1_view;
DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 10000 1666.66667
20 11375 2275
10 9050 3016.66667
範例3 使用job, 執行基於primary key 的物化視圖
生產庫 scott:
SQL>drop table test purge;
SQL>create table test(id int primary key,name char(10));
SQL>create materialized view log on test;
備份庫 scott:
SQL>drop materialized view test_view
SQL>create materialized view test_view
as select * from scott.test@my_link;
create or replace procedure testview as
begin
dbms_mview.refresh('TEST_VIEW');
end;
/
variable job1 number;
begin
dbms_job.submit(:job1,'testview;',sysdate,'sysdate+1/2880');
end;
/
begin
dbms_job.run(:job1);
end;
/
測試結果:
生產庫 scott:
SQL> insert into test values(1,'tim');
SQL> commit;
備份庫 scott:
SQL> select *from test_view;
ID NAME
---------- ----------
1 tim
生產庫 scott:
SQL> insert into test values(2,'ran');
SQL> commit;
備份庫 scott:
SQL> select *from test_view;
SQL> commit;
ID NAME
---------- ----------
1 tim
2 ran
生產庫 scott:
SQL> delete test where id=2;
SQL> update test set name='timran' where id=1;
SQL> commit;
備份庫 scott:
SQL> select * from test_view;
ID NAME
---------- ----------
1 timran