ORACLE技術文件
如何開啟/關閉歸檔
如果開啟歸檔,請保證log_archive_start=true開啟自動歸檔,否則只能手工歸檔,如果是關閉了歸檔,則設定該引數為false
注意:如果是OPS/RAC環境,需要先把parallel_server = true註釋掉,然後執行如下步驟,最後用這個引數重新啟動
1、開啟歸檔
a. 關閉資料庫shutdown immediate
b. startup mount
c. alter database archivelog
d. alter database opne
2、禁止歸檔
a. 關閉資料庫shutdown immediate
b. startup mount
c. alter database noarchivelog
d. alter database open
歸檔資訊可以通過如下語句檢視
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination E:oracleora92databasearchive
Oldest online log sequence 131
Next log sequence to archive 133
Current log sequence 133
[Q]怎樣設定定時歸檔
[A]9i以上版本,保證歸檔的最小間隔不超過n秒
設定Archive_lag_target = n
單位:秒 範圍:0~7200
[Q]不同版本怎麼匯出/匯入
[A]匯出用低版本,匯入用當前版本
如果版本跨越太大,需要用到中間版本過渡
[Q]不同的字符集之前怎麼導資料
[A]a.前條件是保證匯出/匯入符合其他字符集標準,如客戶環境與資料庫字符集一致。
b.修改dmp檔案的2、3位元組為目標資料庫的字符集,注意要換成十六進位制。
參考函式(以下函式中的ID是十進位制的):
nls_charset_name 根據字符集ID獲得字符集名稱
nls_charset_id 根據字符集名稱獲得字符集ID
[Q]怎麼樣備份控制檔案
[A]再線備份為一個二進位制的檔案
alter database backup controlfile to '$BACKUP_DEPT/controlfile.000' [reuse];
備份為文字檔案方式
alter database backup controlfile to trace [resetlogs|noresetlogs];
[Q]控制檔案損壞如何恢復
[A]1、如果是損壞單個控制檔案
只需要關閉資料庫,拷貝一個好的資料檔案覆蓋掉壞的資料檔案即可
或者是修改init.ora檔案的相關部分
2、如果是損失全部控制檔案,則需要建立控制檔案或從備份恢復
建立控制檔案的指令碼可以通過alter database backup controlfile to trace獲取。
[Q]怎麼樣熱備份一個表空間
[A]Alter tablespace 名稱 begin backup;
host cp 這個表空間的資料檔案 目的地;
Alter tablespace 名稱 end backup;
如果是備份多個表空間或整個資料庫,只需要一個一個表空間的操作下來就可以了。
[Q]怎麼快速得到整個資料庫的熱備指令碼
[A]可以寫一段類似的指令碼
SQL>set serveroutput on
begin
dbms_output.enable(10000);
for bk_ts in (select distinct t.ts#,t.name from v$tablespace t,v$datafile d where t.ts#=d.ts#) loop
dbms_output.put_line('--'||bk_ts.name);
dbms_output.put_line('alter tablespace '||bk_ts.name||' begin backup;');
for bk_file in (select file#,name from v$datafile where ts#=bk_ts.ts#) loop
dbms_output.put_line('host cp '||bk_file.name||' $BACKUP_DEPT/');
end loop;
dbms_output.put_line('alter tablespace '||bk_ts.name||' end backup;');
end loop;
end;
/
[Q]丟失一個資料檔案,但是沒有備份,怎麼樣開啟資料庫
[A]如果沒有備份只能是刪除這個資料檔案了,會導致相應的資料丟失。
SQL>startup mount
--ARCHIVELOG模式命令
SQL>Alter database datafile 'file name' offline;
--NOARCHIVELOG模式命令
SQL>Alter database datafile 'file name' offline drop;
SQLl>Alter database open;
注意:該資料檔案不能是系統資料檔案
[Q]丟失一個資料檔案,沒有備份但是有該資料檔案建立以來的歸檔怎麼恢復
[A]保證如下條件
a. 不能是系統資料檔案
b. 不能丟失控制檔案
如果滿足以上條件,則
SQL>startup mount
SQL>Alter database create datafile 'file name' as 'file name' size ... reuse;
SQL>recover datafile n; -檔案號
或者
SQL>recover datafile 'file name';
或者
SQL>recover database;
SQL>Alter database open;
[Q]聯機日誌損壞如何恢復
[A]1、如果是非當前日誌而且歸檔,可以使用
Alter database clear logfile group n來建立一個新的日誌檔案
如果該日誌還沒有歸檔,則需要用
Alter database clear unarchived logfile group n
2、如果是當前日誌損壞,一般不能clear,則可能意味著丟失資料
如果有備份,可以採用備份進行不完全恢復
如果沒有備份,可能只能用_allow_resetlogs_corruption=true來進行強制恢復了,但是,這樣的方法是不建議的,最好在有Oracle support的指導下進行。
[Q]怎麼樣建立RMAN恢復目錄
[A]首先,建立一個資料庫使用者,一般都是RMAN,並給予recovery_catalog_owner角色許可權
sqlplus sys
SQL> create user rman identified by rman;
SQL> alter user rman default tablespace tools temporary tablespace temp;
SQL> alter user rman quota unlimited on tools;
SQL> grant connect, resource, recovery_catalog_owner to rman;
SQL> exit;
然後,用這個使用者登入,建立恢復目錄
rman catalog rman/rman
RMAN> create catalog tablespace tools;
RMAN> exit;
最後,你可以在恢復目錄註冊目標資料庫了
rman catalog rman/rman target backdba/backdba
RMAN> register database;
[Q]怎麼樣在恢復的時候移動資料檔案,恢復到別的地點
[A]給一個RMAN的例子
run {
set until time 'Jul 01 1999 00:05:00';
allocate channel d1 type disk;
set newname for datafile '/u04/oracle/prod/sys1prod.dbf'
to '/u02/oracle/prod/sys1prod.dbf';
set newname for datafile '/u04/oracle/prod/usr1prod.dbf'
to '/u02/oracle/prod/usr1prod.dbf';
set newname for datafile '/u04/oracle/prod/tmp1prod.dbf'
to '/u02/oracle/prod/tmp1prod.dbf';
restore controlfile to '/u02/oracle/prod/ctl1prod.ora';
replicate controlfile from '/u02/oracle/prod/ctl1prod.ora';
restore database;
sql "alter database mount";
switch datafile all;
recover database;
sql "alter database open resetlogs";
release channel d1;
}
[Q]怎麼從備份片(backuppiece)中恢復(restore)控制檔案與資料檔案
[A]可以使用如下方法,在RMAN中恢復備份片的控制檔案
restore controlfile from backuppiecefile;
如果是9i的自動備份,可以採用如下的方法
restore controlfile from autobackup;
但是,如果控制檔案全部丟失,需要指定DBID,如SET DBID=?
自動備份控制檔案的預設格式是%F,這個格式的形式為
c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII就是DBID
至於恢復(restore)資料檔案,oracle 816開始有個包dbms_backup_restore
在 nomount 狀態下就可以執行,可以讀 815甚至之前的備份片,讀出來的檔案用於恢復
可以在SQLPLUS中執行,如下
SQL>startup nomount
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype := dbms_backup_restore.deviceallocate('', params=>'');
6 dbms_backup_restore.restoresetdatafile;
7 dbms_backup_restore.restorecontrolfileto('E:Oracleoradatapennycontrol01.ctl');
8 dbms_backup_restore.restoreDataFileto(1,'E:Oracleoradatapennysystem01.dbf');
9 dbms_backup_restore.restoreDataFileto(2,'E:OracleoradatapennyUNDOTBS01.DBF');
10 dbms_backup_restore.restoreDataFileto(3,'E:ORACLEORADATAPENNYUSERS01.DBF');
11 dbms_backup_restore.restorebackuppiece('D:orabakBACKUP_1_4_04F4IAJT.PENNY',done=>done);
12 END;
13 /
PL/SQL 過程已成功完成。
SQL> alter database mount;
[Q]Rman的format格式中的%s類似的東西代表什麼意義
[A]可以參考如下
%c 備份片的拷貝數
%d 資料庫名稱
%D 位於該月中的第幾天 (DD)
%M 位於該年中的第幾月 (MM)
%F 一個基於DBID唯一的名稱,這個格式的形式為c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII為該資料庫的DBID,YYYYMMDD為日期,QQ是一個1-256的序列
%n 資料庫名稱,向右填補到最大八個字元
%u 一個八個字元的名稱代表備份集與建立時間
%p 該備份集中的備份片號,從1開始到建立的檔案數
%U 一個唯一的檔名,代表%u_%p_%c
%s 備份集的號
%t 備份集時間戳
%T 年月日格式(YYYYMMDD)
[Q]執行exec dbms_logmnr_d.build('Logminer.ora','file directory'),提示下標超界,怎麼辦
[A]完整錯誤資訊如下,
SQL> exec dbms_logmnr_d.build('Logminer.ora','file directory')
BEGIN dbms_logmnr_d.build('Logminer.ora','file directory'); END;
*
ERROR 位於第 1 行:
ORA-06532: 下標超出限制
ORA-06512: 在"SYS.DBMS_LOGMNR_D", line 793
ORA-06512: 在line 1
解決辦法為:
1.編輯位於"$ORACLE_HOME/rdbms/admin"目錄下的檔案"dbmslmd.sql"
改變行:
TYPE col_desc_array IS VARRAY(513) OF col_description;
為
TYPE col_desc_array IS VARRAY(700) OF col_description;
並儲存檔案
2. 執行改變後的指令碼
SQLPLUS> Connect internal
SQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
3.重新編譯該包
SQLPLUS> alter package DBMS_LOGMNR_D compile body;
[Q]執行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:無效的月份,這個是什麼原因
[A]我們分析start_logmnr包
PROCEDURE start_logmnr(
startScn IN NUMBER default 0 ,
endScn IN NUMBER default 0,
startTime IN DATE default TO_DATE('01-jan-1988','DD-MON-YYYY'),
endTime IN DATE default TO_DATE('01-jan-2988','DD-MON-YYYY'),
DictFileName IN VARCHAR2 default '',
Options IN BINARY_INTEGER default 0 );
可以知道,如果TO_DATE('01-jan-1988','DD-MON-YYYY')失敗,將導致以上錯誤
所以解決辦法可以為
1、Alter session set NLS_LANGUAGE=American
2、用類似如下的方法執行
execute dbms_logmnr.start_logmnr (DictFileName=> 'f:temp2TESTDICT.ora', starttime => TO_DATE(
'01-01-1988','DD-MM-YYYY'), endTime=>TO_DATE('01-01-2988','DD-MM-YYYY'));
四部分、效能調整
[Q]如果設定自動跟蹤
[A]用system登入
執行$ORACLE_HOME/rdbms/admin/utlxplan.sql建立計劃表
執行$ORACLE_HOME/sqlplus/admin/plustrce.sql建立plustrace角色
如果想計劃表讓每個使用者都能使用,則
SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果想讓自動跟蹤的角色讓每個使用者都能使用,則
SQL> grant plustrace to public;
通過如下語句開啟/停止跟蹤
SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
[Q]如果跟蹤自己的會話或者是別人的會話
[A]跟蹤自己的會話很簡單
Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);
如果跟蹤別人的會話,需要呼叫一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟蹤的資訊在user_dump_dest 目錄下可以找到或通過如下指令碼獲得檔名稱(適用於Win環境,如果是unix需要做一定修改)
SELECT p1.value||''||p2.value||'_ora_'||p.spid||'.ora' filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID')
最後,可以通過Tkprof來解析跟蹤檔案,如
Tkprof 原檔案 目標檔案 sys=n
[Q]怎麼設定整個資料庫系統跟蹤
[A]其實文件上的alter system set sql_trace=true是不成功的
但是可以通過設定事件來完成這個工作,作用相等
alter system set events
'10046 trace name context forever,level 1';
如果關閉跟蹤,可以用如下語句
alter system set events
'10046 trace name context off';
其中的level 1與上面的8都是跟蹤級別
level 1:跟蹤SQL語句,等於sql_trace=true
level 4:包括變數的詳細資訊
level 8:包括等待事件
level 12:包括繫結變數與等待事件
[Q]怎麼樣根據OS程式快速獲得DB程式資訊與正在執行的語句
[A]有些時候,我們在OS上操作,象TOP之後我們得到的OS程式,怎麼快速根據OS資訊獲得DB資訊呢?
我們可以編寫如下指令碼:
$more whoit.sh
#!/bin/sh
sqlplus /nolog 100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
這是對命令與工具包的一些總結
1、對於分割槽表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以並行進行,對多個使用者,多個Table
b) 可以得到整個分割槽表的資料和單個分割槽的資料。
c) 可以在不同級別上Compute Statistics:單個分割槽,子分割槽,全表,所有分割槽
d) 可以倒出統計資訊
e) 可以使用者自動收集統計資訊
2、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的資訊,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 預設不對索引進行Analyze,因為預設Cascade是False,需要手工指定為True
3、對於oracle 9裡面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集資訊。
[Q]怎麼樣快速重整索引
[A]通過rebuild語句,可以快速重整或移動索引到別的表空間
rebuild有重建整個索引數的功能,可以在不刪除原始索引的情況下改變索引的儲存引數
語法為
alter index index_name rebuild tablespace ts_name
storage(……);
如果要快速重建整個使用者下的索引,可以用如下指令碼,當然,需要根據你自己的情況做相應修改
SQL> set heading off
SQL> set feedback off
SQL> spool d:index.sql
SQL> SELECT 'alter index ' || index_name || ' rebuild '
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 )
)
AND wner = USER
SQL>spool off
另外一個合併索引的語句是
alter index index_name coalesce,這個語句僅僅是合併索引中同一級的leaf block
消耗不大,對於有些索引中存在大量空間浪費的情況下,有一些作用。
[Q]如何使用Hint提示
[A] 在select/delete/update後寫/*+ hint */
如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*和+之間不能有空格
如用hint指定使用某個索引
select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
select /*+ index(a cbotab1) */ col1 from cbotab a;
其中
TABLE_NAME是必須要寫的,且如果在查詢中使用了表的別名,在hint也要用表的別名來代替表名;
INDEX_NAME可以不必寫,Oracle會根據統計值選一個索引;
如果索引名或表名寫錯了,那這個hint就會被忽略;
[Q]怎麼樣快速複製表或者是插入資料
[A]快速複製表可以指定Nologging選項
如:Create table t1 nologging
as select * from t2;
快速插入資料可以指定append提示,但是需要注意
noarchivelog模式下,預設用了append就是nologging模式的。
在archivelog下,需要把表設定程Nologging模式。
如insert /*+ append */ into t1
select * from t2
注意:如果在9i環境中並設定了FORCE LOGGING,則以上操作是無效的,並不會加快,當然,可以通過如下語句設定為NO FORCE LOGGING。
Alter database no force logging;
是否開啟了FORCE LOGGING,可以用如下語句檢視
SQL> select force_logging from v$database;
[Q]怎麼避免使用特定索引
[A]在很多時候,Oracle會錯誤的使用索引而導致效率的明顯下降,我們可以使用一點點技巧而避免使用不該使用的索引,如:
表test,有欄位a,b,c,d,在a,b,c上建立聯合索引inx_a(a,b,c),在b上單獨建立了一個索引Inx_b(b)。
在正常情況下,where a=? and b=? and c=?會用到索引inx_a,
where b=?會用到索引inx_b
但是,where a=? and b=? and c=? group by b會用到哪個索引呢?在分析資料不正確(很長時間沒有分析)或根本沒有分析資料的情況下,oracle往往會使用索引inx_b。通過執行計劃的分析,這個索引的使用,將大大耗費查詢時間。
當然,我們可以通過如下的技巧避免使用inx_b,而使用inx_a。
where a=? and b=? and c=? group by b||'' --如果b是字元
where a=? and b=? and c=? group by b+0 --如果b是數字
通過這樣簡單的改變,往往可以是查詢時間提交很多倍
當然,我們也可以使用no_index提示,相信很多人沒有用過,也是一個不錯的方法:
select /*+ no_index(t,inx_b) */ * from test t
where a=? and b=? and c=? group by b
[Q]Oracle什麼時候會使用跳躍式索引掃描
[A]這是9i的一個新特性跳躍式索引掃描(Index Skip Scan).
例如表有索引index(a,b,c),當查詢條件為
where b=?的時候,可能會使用到索引index(a,b,c)
如,執行計劃中出現如下計劃:
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
Oracle的優化器(這裡指的是CBO)能對查詢應用Index Skip Scans至少要有幾個條件:
1 優化器認為是合適的。
2 索引中的前導列的唯一值的數量能滿足一定的條件(如重複值很多)。
3 優化器要知道前導列的值分佈(通過分析/統計表得到)。
4 合適的SQL語句
等。
[Q]怎麼樣建立使用虛擬索引
[A]可以使用nosegment選項,如
create index virtual_index_name on table_name(col_name) nosegment;
如果在哪個session需要測試虛擬索引,可以利用隱含引數來處理
alter session set "_use_nosegment_indexes" = true;
就可以利用explain plan for select ……來看虛擬索引的效果
利用@$ORACLE_HOME/rdbms/admin/utlxpls檢視執行計劃
最後,根據需要,我們可以刪除虛擬索引,如普通索引一樣
drop index virtual_index_name;
注意:虛擬索引並不是物理存在的,所以虛擬索引並不等同於物理索引,不要用自動跟蹤去測試虛擬索引,因為那是實際執行的效果,是用不到虛擬索引的。
[Q]怎樣監控無用的索引
[A]Oracle 9i以上,可以監控索引的使用情況,如果一段時間內沒有使用的索引,一般就是無用的索引
語法為:
開始監控:alter index index_name monitoring usage;
檢查使用狀態:select * from v$object_usage;
停止監控:alter index index_name nomonitoring usage;
當然,如果想監控整個使用者下的索引,可以採用如下的指令碼:
set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
FROM dba_indexes
WHERE wner = USER;
spool off
set heading on
set echo on
set feedback on
------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
FROM dba_indexes
WHERE wner = USER;
spool off
set heading on
set echo on
set feedback on
[Q]怎麼樣能固定我的執行計劃
[A]可以使用OUTLINE來固定SQL語句的執行計劃
用如下語句可以建立一個OUTLINE
Create oe replace outline OutLn_Name on
Select Col1,Col2 from Table
where ……
如果要刪除Outline,可以採用
Drop Outline OutLn_Name;
對於已經建立了的OutLine,存放在OUTLN使用者的OL$HINTS表下面
對於有些語句,你可以使用update outln.ol$hints來更新outline
如update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)
where ol_name in ('TEST1','TEST2');
這樣,你就把Test1 OUTLINE與Test2 OUTLINE互換了
如果想利用已經存在的OUTLINE,需要設定以下引數
Alter system/session set Query_rewrite_enabled = true
Alter system/session set use_stored_outlines = true
[Q]v$sysstat中的class分別代表什麼
[A]統計類別
1 代表事例活動
2 代表Redo buffer活動
4 代表鎖
8 代表資料緩衝活動
16 代表OS活動
32 代表並行活動
64 代表表訪問
128 代表除錯資訊
[Q]怎麼殺掉特定的資料庫會話
[A] Alter system kill session 'sid,serial#';
或者
alter system disconnect session 'sid,serial#' immediate;
在win上,還可以採用oracle提供的orakill殺掉一個執行緒(其實就是一個Oracle程式)
在Linux/Unix上,可以直接利用kill殺掉資料庫程式對應的OS程式
[Q]怎麼快速查詢鎖與鎖等待
[A]資料庫的鎖是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該程式。
這個語句將查詢到資料庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
可以通過alter system kill session ‘sid,serial#’來殺掉會話
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表,而誰在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。如果想知道鎖用了哪個回滾段,還可以關聯到V$rollname,其中xidusn就是回滾段的USN
[Q] 如何有效的刪除一個大表(extent數很多的表)
[A] 一個有很多(100k)extent的表,如果只是簡單地用drop table的話,會很大量消耗CPU(Oracle要對fet$、uet$資料字典進行操作),可能會用上幾天的時間,較好的方法是分多次刪除extent,以減輕這種消耗:
1. truncate table big-table reuse storage;
2. alter table big-table deallocate unused keep 2000m ( 原來大小的n-1/n);
3. alter table big-table deallocate unused keep 1500m ;
....
4. drop table big-table;
[Q]如何收縮臨時資料檔案的大小
[A]9i以下版本採用
ALTER DATABASE DATAFILE 'file name' RESIZE 100M類似的語句
9i以上版本採用
ALTER DATABASE TEMPFILE 'file name' RESIZE 100M
注意,臨時資料檔案在使用時,一般不能收縮,除非關閉資料庫或斷開所有會話,停止對臨時資料檔案的使用。
[Q]怎麼清理臨時段
[A]可以使用如下辦法
1、 使用如下語句檢視一下認誰在用臨時段
SELECT username,sid,serial#,sql_address,machine,program,
tablespace,segtype, contents
FROM v$session se,v$sort_usage su
WHERE se.saddr=su.session_addr
2、 那些正在使用臨時段的程式
SQL>Alter system kill session 'sid,serial#';
3、把TEMP表空間回縮一下
SQL>Alter tablespace TEMP coalesce;
還可以使用診斷事件
1、 確定TEMP表空間的ts#
SQL> select ts#, name FROM v$tablespace;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
……
2、 執行清理操作
alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'
說明:
temp表空間的TS# 為 3*, So TS#+ 1= 4
如果想清除所有表空間的臨時段,則
TS# = 2147483647
[Q]怎麼樣dump資料庫內部結構,如上面顯示的控制檔案的結構
[A]常見的有
1、分析資料檔案塊,轉儲資料檔案n的塊m
alter system dump datafile n block m
2、分析日誌檔案
alter system dump logfile logfilename;
3、分析控制檔案的內容
alter session set events 'immediate trace name CONTROLF level 10'
4、分析所有資料檔案頭
alter session set events 'immediate trace name FILE_HDRS level 10'
5、分析日誌檔案頭
alter session set events 'immediate trace name REDOHDR level 10'
6、分析系統狀態,最好每10分鐘一次,做三次對比
alter session set events 'immediate trace name SYSTEMSTATE level 10'
7、分析程式狀態
alter session set events 'immediate trace name PROCESSSTATE level 10'
8、分析Library Cache的詳細情況
alter session set events 'immediate trace name library_cache level 10'
[Q]如何獲得所有的事件程式碼
[A] 事件程式碼範圍一般從10000 to 10999,以下列出了這個範圍的事件程式碼與資訊
SET SERVEROUTPUT ON
DECLARE
err_msg VARCHAR2(120);
BEGIN
dbms_output.enable (1000000);
FOR err_num IN 10000..10999
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
/
在Unix系統上,事件資訊放在一個文字檔案裡
$ORACLE_HOME/rdbms/mesg/oraus.msg
可以用如下指令碼檢視事件資訊
event=10000
while [ $event -ne 10999 ]
do
event=`expr $event + 1`
oerr ora $event
done
對於已經確保的/正在跟蹤的事件,可以用如下指令碼獲得
SET SERVEROUTPUT ON
DECLARE
l_level NUMBER;
BEGIN
FOR l_event IN 10000..10999
LOOP
dbms_system.read_ev (l_event,l_level);
IF l_level > 0 THEN
dbms_output.put_line ('Event '||TO_CHAR (l_event)||
' is set at level '||TO_CHAR (l_level));
END IF;
END LOOP;
END;
/
[Q]什麼是STATSPACK,我怎麼使用它?
[A]Statspack是Oracle 8i以上提供的一個非常好的效能監控與診斷工具,基本上全部包含了BSTAT/ESTAT的功能,更多的資訊
可以參考附帶文件$ORACLE_HOME/rdbms/admin/spdoc.txt。
安裝Statspack:
cd $ORACLE_HOME/rdbms/admin
sqlplus "/ as sysdba" @spdrop.sql -- 解除安裝,第一次可以不需要
sqlplus "/ as sysdba" @spcreate.sql -- 需要根據提示輸入表空間名
使用Statspack:
sqlplus perfstat/perfstat
exec statspack.snap; -- 進行資訊收集統計,每次執行都將產生一個快照號
-- 獲得快照號,必須要有兩個以上的快照,才能生成報表
select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
@spreport.sql -- 輸入需要檢視的開始快照號與結束快照號
其他相關指令碼s:
spauto.sql - 利用dbms_job提交一個作業,自動的進行STATPACK的資訊收集統計
sppurge.sql - 清除一段範圍內的統計資訊,需要提供開始快照與結束快照號
sptrunc.sql - 清除(truncate)所有統計資訊
ORACLE(2) |
orafaq--( ORACLE構架體系 )
發表人:lijietz | 發表時間: 2005年四月23日, 22:39
二部分、ORACLE構架體系 |
oracle(PL/SQL) |
如何在procedure返回結果集(zz)
發表人:lijietz | 發表時間: 2005年四月23日, 21:48
在很多時候我們需要通過bind var來提高整個DB的performance,在我們用第三次開發軟體做對結果集的查詢。我們如何在procedure中完成對結果集的查詢呢,從 oracle7.3才被支援,在9i以後又有新的變化,在9i以前要define一個type才可以。而在9i以後oracle引入了一個新的型別為 sys_refcursor,這樣就不需要我們重新定義。我們來看一個例子吧。 C:oracleora92sqlplusdemo>sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on 星期六 4月 2 11:09:06 2005 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> conn scott/tiger@vongates 已建立程式. SQL> var rset refcursor; PL/SQL 程式順利完成. SQL> print rset; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SQL> 根據rowid dump資料塊 根據rowid dump資料塊,可以用下面的方法實現。 SQL> SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) R_FILE_NO, R_FILE_NO BLOCK_NO 一部分、SQL&PL/SQL |
ORACLE學習東東(效能調整) |
把別人的BLOG上的東東直接拉到自己這裡來,為了自己以後也好查一些。。希望別人不要對我拍磚!! 之所以這麼做是怕有一天給忘記大師的地址,自己使用起來方便!! 大師的地址:http://blog.itpub.net/category/4988/9259 什麼是繫結變數?
通過sql查詢獲得當前session的trace檔名稱 SELECT d.VALUE || '' || LOWER (RTRIM (i.INSTANCE, CHR (0))) || '_ora_' || p.spid || '.trc' trace_file_name FROM (SELECT p.spid FROM v$mystat m, v$session s, v$process p WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p, (SELECT t.INSTANCE FROM v$thread t, v$parameter v WHERE v.NAME = 'thread' AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i, (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d 跳躍式索引的一個例子. 發表人:lijietz | 發表時間: 2005年四月19日, 19:52
從Oracle9i開始,索引跳躍式掃描特性可以允許優化器使用組合索引,即便索引的前導列沒有出現在WHERE子句中。索引跳躍式掃描比全索引掃描要快的多。下面的程式清單顯示出效能的差別:
發表人:lijietz | 發表時間: 2005年四月22日, 21:43
可以用以下幾點對high-water mark進行理解。
這樣看來high-wate mark就是用來標識最後一個被用過的block的 另外我的理解如下: 1 如果為表分配了大量的extents , 但這些extent 還沒使用可以手工收回。並且有如下兩種情況 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742223/viewspace-310323/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於技術文件
- 技術文件歸檔
- gitBook 寫技術文件Git
- 如何撰寫技術文件
- 雲端計算技術文件
- 蘋果ios 技術文件 中文蘋果iOS
- QRC20整合技術文件
- C-部落格,技術文件
- 有Jdon的技術文件嗎?
- 什麼是好的技術文件?
- 技術文件畫圖工具箱
- Red Flag 技術文件下載(轉)
- oracle Parallel技術OracleParallel
- Oracle技術網Oracle
- 中文技術文件的寫作規範
- IT技術文件搜尋 - slideshare, wordpressIDE
- DL動態載入框架技術文件框架
- 視屏教程、電子書、技術文件
- Oracle技術專題 - Oracle瑣Oracle
- 墨天輪高分技術文件分享——Oracle升級遷移篇(共96個)Oracle
- Oracle EBS R12 電子技術參考手冊 - eTRM (電子文件)Oracle
- oracle壓縮技術Oracle
- Oracle Stream Replication 技術Oracle
- 索引@oracle索引技術索引Oracle
- Oracle中文技術中心Oracle
- Oracle 中文技術網Oracle
- unix ,oracle技術區Oracle
- 如何寫好一篇技術型文件?
- 百度文件智慧技術與應用
- seajs和requirejs技術指導文件JSUI
- 如何在 Oracle 技術網上發表技術文章Oracle
- Oracle實時同步技術Oracle
- Oracle流複製技術Oracle
- oracle flashback技術詳解Oracle
- 零散技術oracleOracle
- Oracle的Sharding技術Oracle
- oracle、sql技術部落格OracleSQL
- Oracle 分割槽(partition)技術Oracle