一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

史上最強的FQA for ORACLE(備份與恢復(fù)部分)

 duduwolf 2005-09-26

[Q]如何開啟/關(guān)閉歸檔
[A]如果開啟歸檔,請保證log_archive_start=true開啟自動歸檔,否則只能手工歸檔,如果是關(guān)閉了歸檔,則設(shè)置該參數(shù)為false
注意:如果是OPS/RAC環(huán)境,需要先把parallel_server = true注釋掉,然后執(zhí)行如下步驟,最后用這個參數(shù)重新啟動
1、開啟歸檔
a. 關(guān)閉數(shù)據(jù)庫shutdown immediate
b. startup mount
c. alter database archivelog
d. alter database opne
2、禁止歸檔
a. 關(guān)閉數(shù)據(jù)庫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:\oracle\ora92\database\archive
Oldest online log sequence 131
Next log sequence to archive 133
Current log sequence 133

[Q]怎樣設(shè)置定時歸檔
[A]9i以上版本,保證歸檔的最小間隔不超過n秒
設(shè)置Archive_lag_target = n
單位:秒 范圍:0~7200

[Q]不同版本怎么導(dǎo)出/導(dǎo)入
[A]導(dǎo)出用低版本,導(dǎo)入用當(dāng)前版本
如果版本跨越太大,需要用到中間版本過渡

[Q]不同的字符集之前怎么導(dǎo)數(shù)據(jù)
[A]a.前條件是保證導(dǎo)出/導(dǎo)入符合其他字符集標(biāo)準(zhǔn),如客戶環(huán)境與數(shù)據(jù)庫字符集一致。
b.修改dmp文件的2、3字節(jié)為目標(biāo)數(shù)據(jù)庫的字符集,注意要換成十六進(jìn)制。
參考函數(shù)(以下函數(shù)中的ID是十進(jìn)制的):
nls_charset_name 根據(jù)字符集ID獲得字符集名稱
nls_charset_id 根據(jù)字符集名稱獲得字符集ID

[Q]怎么樣備份控制文件
[A]再線備份為一個二進(jìn)制的文件
alter database backup controlfile to ‘$BACKUP_DEPT/controlfile.000‘ [reuse];
備份為文本文件方式
alter database backup controlfile to trace [resetlogs|noresetlogs];

[Q]控制文件損壞如何恢復(fù)
[A]1、如果是損壞單個控制文件
只需要關(guān)閉數(shù)據(jù)庫,拷貝一個好的數(shù)據(jù)文件覆蓋掉壞的數(shù)據(jù)文件即可
或者是修改init.ora文件的相關(guān)部分
2、如果是損失全部控制文件,則需要創(chuàng)建控制文件或從備份恢復(fù)
創(chuàng)建控制文件的腳本可以通過alter database backup controlfile to trace獲取。

[Q]怎么樣熱備份一個表空間
[A]Alter tablespace 名稱 begin backup;
host cp 這個表空間的數(shù)據(jù)文件 目的地;
Alter tablespace 名稱 end backup;
如果是備份多個表空間或整個數(shù)據(jù)庫,只需要一個一個表空間的操作下來就可以了。

[Q]怎么快速得到整個數(shù)據(jù)庫的熱備腳本
[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(‘a(chǎn)lter 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(‘a(chǎn)lter tablespace ‘||bk_ts.name||‘ end backup;‘);
end loop;
end;
/

[Q]丟失一個數(shù)據(jù)文件,但是沒有備份,怎么樣打開數(shù)據(jù)庫
[A]如果沒有備份只能是刪除這個數(shù)據(jù)文件了,會導(dǎo)致相應(yīng)的數(shù)據(jù)丟失。
SQL>startup mount
--ARCHIVELOG模式命令
SQL>Alter database datafile ‘file name‘ offline;
--NOARCHIVELOG模式命令
SQL>Alter database datafile ‘file name‘ offline drop;
SQLl>Alter database open;
注意:該數(shù)據(jù)文件不能是系統(tǒng)數(shù)據(jù)文件

[Q]丟失一個數(shù)據(jù)文件,沒有備份但是有該數(shù)據(jù)文件創(chuàng)建以來的歸檔怎么恢復(fù)
[A]保證如下條件
a. 不能是系統(tǒng)數(shù)據(jù)文件
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]聯(lián)機日志損壞如何恢復(fù)
[A]1、如果是非當(dāng)前日志而且歸檔,可以使用
Alter database clear logfile group n來創(chuàng)建一個新的日志文件
如果該日志還沒有歸檔,則需要用
Alter database clear unarchived logfile group n
2、如果是當(dāng)前日志損壞,一般不能clear,則可能意味著丟失數(shù)據(jù)
如果有備份,可以采用備份進(jìn)行不完全恢復(fù)
如果沒有備份,可能只能用_allow_resetlogs_corruption=true來進(jìn)行強制恢復(fù)了,但是,這樣的方法是不建議的,最好在有Oracle support的指導(dǎo)下進(jìn)行。

[Q]怎么樣創(chuàng)建RMAN恢復(fù)目錄
[A]首先,創(chuàng)建一個數(shù)據(jù)庫用戶,一般都是RMAN,并給予recovery_catalog_owner角色權(quán)限
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;
然后,用這個用戶登錄,創(chuàng)建恢復(fù)目錄
rman catalog rman/rman
RMAN> create catalog tablespace tools;
RMAN> exit;
最后,你可以在恢復(fù)目錄注冊目標(biāo)數(shù)據(jù)庫了
rman catalog rman/rman target backdba/backdba
RMAN> register database;

[Q]怎么樣在恢復(fù)的時候移動數(shù)據(jù)文件,恢復(fù)到別的地點
[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)中恢復(fù)(restore)控制文件與數(shù)據(jù)文件
[A]可以使用如下方法,在RMAN中恢復(fù)備份片的控制文件
restore controlfile from backuppiecefile;
如果是9i的自動備份,可以采用如下的方法
restore controlfile from autobackup;
但是,如果控制文件全部丟失,需要指定DBID,如SET DBID=?
自動備份控制文件的默認(rèn)格式是%F,這個格式的形式為
c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII就是DBID
至于恢復(fù)(restore)數(shù)據(jù)文件,oracle 816開始有個包dbms_backup_restore
在 nomount 狀態(tài)下就可以執(zhí)行,可以讀 815甚至之前的備份片,讀出來的文件用于恢復(fù)
可以在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:\Oracle\oradata\penny\control01.ctl‘);
8 dbms_backup_restore.restoreDataFileto(1,‘E:\Oracle\oradata\penny\system01.dbf‘);
9 dbms_backup_restore.restoreDataFileto(2,‘E:\Oracle\oradata\penny\UNDOTBS01.DBF‘);
10 dbms_backup_restore.restoreDataFileto(3,‘E:\ORACLE\ORADATA\PENNY\USERS01.DBF‘);
11 dbms_backup_restore.restorebackuppiece(‘D:\orabak\BACKUP_1_4_04F4IAJT.PENNY‘,done=>done);
12 END;
13 /
PL/SQL 過程已成功完成。
SQL> alter database mount;

[Q]Rman的format格式中的%s類似的東西代表什么意義
[A]可以參考如下
%c 備份片的拷貝數(shù)
%d 數(shù)據(jù)庫名稱
%D 位于該月中的第幾天 (DD)
%M 位于該年中的第幾月 (MM)
%F 一個基于DBID唯一的名稱,這個格式的形式為c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII為該數(shù)據(jù)庫的DBID,YYYYMMDD為日期,QQ是一個1-256的序列
%n 數(shù)據(jù)庫名稱,向右填補到最大八個字符
%u 一個八個字符的名稱代表備份集與創(chuàng)建時間
%p 該備份集中的備份片號,從1開始到創(chuàng)建的文件數(shù)
%U 一個唯一的文件名,代表%u_%p_%c
%s 備份集的號
%t 備份集時間戳
%T 年月日格式(YYYYMMDD)

[Q]執(zhí)行exec dbms_logmnr_d.build(‘Logminer.ora‘,‘file directory‘),提示下標(biāo)超界,怎么辦
[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: 下標(biāo)超出限制
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]執(zhí)行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‘)失敗,將導(dǎo)致以上錯誤
所以解決辦法可以為
1、Alter session set NLS_LANGUAGE=American
2、用類似如下的方法執(zhí)行
execute dbms_logmnr.start_logmnr (DictFileName=> ‘f:\temp2\TESTDICT.ora‘, starttime => TO_DATE(
‘01-01-1988‘,‘DD-MM-YYYY‘), endTime=>TO_DATE(‘01-01-2988‘,‘DD-MM-YYYY‘));


__________________
if not now,when?
if not me,who?

歡迎訪問我的Blog

天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚

由 piner 于 04-01-17 09:53 最后編輯

03-12-11 10:25        

piner
that‘s life

注冊日期: 2003 Feb
來自: 西子湖畔
發(fā)帖數(shù)量: 2527

第四部分、性能調(diào)整
[Q]如果設(shè)置自動跟蹤
[A]用system登錄
執(zhí)行$ORACLE_HOME/rdbms/admin/utlxplan.sql創(chuàng)建計劃表
執(zhí)行$ORACLE_HOME/sqlplus/admin/plustrce.sql創(chuàng)建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);
如果跟蹤別人的會話,需要調(diào)用一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟蹤的信息在user_dump_dest 目錄下可以找到或通過如下腳本獲得文件名稱(適用于Win環(huán)境,如果是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 原文件 目標(biāo)文件 sys=n


[Q]怎么設(shè)置整個數(shù)據(jù)庫系統(tǒng)跟蹤
[A]其實文檔上的alter system set sql_trace=true是不成功的
但是可以通過設(shè)置事件來完成這個工作,作用相等
alter system set events
‘10046 trace name context forever,level 1‘;
如果關(guān)閉跟蹤,可以用如下語句
alter system set events
‘10046 trace name context off‘;
其中的level 1與上面的8都是跟蹤級別
level 1:跟蹤SQL語句,等于sql_trace=true
level 4:包括變量的詳細(xì)信息
level 8:包括等待事件
level 12:包括綁定變量與等待事件

[Q]怎么樣根據(jù)OS進(jìn)程快速獲得DB進(jìn)程信息與正在執(zhí)行的語句
[A]有些時候,我們在OS上操作,象TOP之后我們得到的OS進(jìn)程,怎么快速根據(jù)OS信息獲得DB信息呢?
我們可以編寫如下腳本:
$more whoit.sh
#!/bin/sh
sqlplus /nolog > connect / as sysdba
col machine format a30
col program format a40
set line 200
select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,‘yyyy/mm/dd hh24:mi:ss‘)
from v\$session where paddr in
( select addr from v\$process where spid in($1));

select sql_text from v\$sqltext_with_newlines
where hash_value in
(select SQL_HASH_value from v\$session where
paddr in (select addr from v\$process where spid=$1)
)
order by piece;

exit;
EOF
然后,我們只要在OS環(huán)境下如下執(zhí)行即可
$./whoit.sh Spid

[Q]怎么樣分析表或索引
[A]命令行方式可以采用analyze命令
如Analyze table tablename compute statistics;
Analyze index|cluster indexname estimate statistics;
ANALYZE TABLE tablename COMPUTE STATISTICS
FOR TABLE
FOR ALL [LOCAL] INDEXES
FOR ALL [INDEXED] COLUMNS;
ANALYZE TABLE tablename DELETE STATISTICS
ANALYZE TABLE tablename VALIDATE REF UPDATE
ANALYZE TABLE tablename VALIDATE STRUCTURE
[CASCADE]|[INTO TableName]
ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName]
等等。
如果想分析整個用戶或數(shù)據(jù)庫,還可以采用工具包,可以并行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以后提供的工具包)

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
這是對命令與工具包的一些總結(jié)
1、對于分區(qū)表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以并行進(jìn)行,對多個用戶,多個Table
b) 可以得到整個分區(qū)表的數(shù)據(jù)和單個分區(qū)的數(shù)據(jù)。
c) 可以在不同級別上Compute Statistics:單個分區(qū),子分區(qū),全表,所有分區(qū)
d) 可以倒出統(tǒng)計信息
e) 可以用戶自動收集統(tǒng)計信息
2、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 默認(rèn)不對索引進(jìn)行Analyze,因為默認(rèn)Cascade是False,需要手工指定為True
3、對于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集信息。

[Q]怎么樣快速重整索引
[A]通過rebuild語句,可以快速重整或移動索引到別的表空間
rebuild有重建整個索引數(shù)的功能,可以在不刪除原始索引的情況下改變索引的存儲參數(shù)
語法為
alter index index_name rebuild tablespace ts_name
storage(……);
如果要快速重建整個用戶下的索引,可以用如下腳本,當(dāng)然,需要根據(jù)你自己的情況做相應(yīng)修改
SQL> set heading off
SQL> set feedback off
SQL> spool d:\index.sql
SQL> SELECT ‘a(chǎn)lter 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 owner = 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會根據(jù)統(tǒng)計值選一個索引;
如果索引名或表名寫錯了,那這個hint就會被忽略;

[Q]怎么樣快速復(fù)制表或者是插入數(shù)據(jù)
[A]快速復(fù)制表可以指定Nologging選項
如:Create table t1 nologging
as select * from t2;
快速插入數(shù)據(jù)可以指定append提示,但是需要注意
noarchivelog模式下,默認(rèn)用了append就是nologging模式的。
在archivelog下,需要把表設(shè)置程Nologging模式。
如insert /*+ append */ into t1
select * from t2
注意:如果在9i環(huán)境中并設(shè)置了FORCE LOGGING,則以上操作是無效的,并不會加快,當(dāng)然,可以通過如下語句設(shè)置為NO FORCE LOGGING。
Alter database no force logging;
是否開啟了FORCE LOGGING,可以用如下語句查看
SQL> select force_logging from v$database;

[Q]怎么避免使用特定索引
[A]在很多時候,Oracle會錯誤的使用索引而導(dǎo)致效率的明顯下降,我們可以使用一點點技巧而避免使用不該使用的索引,如:
表test,有字段a,b,c,d,在a,b,c上建立聯(lián)合索引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會用到哪個索引呢?在分析數(shù)據(jù)不正確(很長時間沒有分析)或根本沒有分析數(shù)據(jù)的情況下,oracle往往會使用索引inx_b。通過執(zhí)行計劃的分析,這個索引的使用,將大大耗費查詢時間。
當(dāng)然,我們可以通過如下的技巧避免使用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是數(shù)字
通過這樣簡單的改變,往往可以是查詢時間提交很多倍
當(dāng)然,我們也可以使用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),當(dāng)查詢條件為
where b=?的時候,可能會使用到索引index(a,b,c)
如,執(zhí)行計劃中出現(xiàn)如下計劃:
INDEX (SKIP SCAN) OF ‘TEST_IDX‘ (NON-UNIQUE)
Oracle的優(yōu)化器(這里指的是CBO)能對查詢應(yīng)用Index Skip Scans至少要有幾個條件:
1 優(yōu)化器認(rèn)為是合適的。
2 索引中的前導(dǎo)列的唯一值的數(shù)量能滿足一定的條件(如重復(fù)值很多)。
3 優(yōu)化器要知道前導(dǎo)列的值分布(通過分析/統(tǒng)計表得到)。
4 合適的SQL語句
等。

[Q]怎么樣創(chuàng)建使用虛擬索引
[A]可以使用nosegment選項,如
create index virtual_index_name on table_name(col_name) nosegment;
如果在哪個session需要測試虛擬索引,可以利用隱含參數(shù)來處理
alter session set "_use_nosegment_indexes" = true;
就可以利用explain plan for select ……來看虛擬索引的效果
利用@$ORACLE_HOME/rdbms/admin/utlxpls查看執(zhí)行計劃
最后,根據(jù)需要,我們可以刪除虛擬索引,如普通索引一樣
drop index virtual_index_name;
注意:虛擬索引并不是物理存在的,所以虛擬索引并不等同于物理索引,不要用自動跟蹤去測試虛擬索引,因為那是實際執(zhí)行的效果,是用不到虛擬索引的。

[Q]怎樣監(jiān)控?zé)o用的索引
[A]Oracle 9i以上,可以監(jiān)控索引的使用情況,如果一段時間內(nèi)沒有使用的索引,一般就是無用的索引
語法為:
開始監(jiān)控:alter index index_name monitoring usage;
檢查使用狀態(tài):select * from v$object_usage;
停止監(jiān)控:alter index index_name nomonitoring usage;
當(dāng)然,如果想監(jiān)控整個用戶下的索引,可以采用如下的腳本:
set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT ‘a(chǎn)lter index ‘||owner||‘.‘||index_name||‘ monitoring usage;‘
FROM dba_indexes
WHERE owner = 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 ‘a(chǎn)lter index ‘||owner||‘.‘||index_name||‘ nomonitoring usage;‘
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on

[Q]怎么樣能固定我的執(zhí)行計劃
[A]可以使用OUTLINE來固定SQL語句的執(zhí)行計劃
用如下語句可以創(chuàng)建一個OUTLINE
Create oe replace outline OutLn_Name on
Select Col1,Col2 from Table
where ……
如果要刪除Outline,可以采用
Drop Outline OutLn_Name;
對于已經(jīng)創(chuàng)建了的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互換了
如果想利用已經(jīng)存在的OUTLINE,需要設(shè)置以下參數(shù)
Alter system/session set Query_rewrite_enabled = true
Alter system/session set use_stored_outlines = true

[Q]v$sysstat中的class分別代表什么
[A]統(tǒng)計類別
1 代表事例活動
2 代表Redo buffer活動
4 代表鎖
8 代表數(shù)據(jù)緩沖活動
16 代表OS活動
32 代表并行活動
64 代表表訪問
128 代表調(diào)試信息

[Q]怎么殺掉特定的數(shù)據(jù)庫會話
[A] Alter system kill session ‘sid,serial#‘;
或者
alter system disconnect session ‘sid,serial#‘ immediate;
在win上,還可以采用oracle提供的orakill殺掉一個線程(其實就是一個Oracle進(jìn)程)
在Linux/Unix上,可以直接利用kill殺掉數(shù)據(jù)庫進(jìn)程對應(yīng)的OS進(jìn)程

[Q]怎么快速查找鎖與鎖等待
[A]數(shù)據(jù)庫的鎖是比較耗費資源的,特別是發(fā)生鎖等待的時候,我們必須找到發(fā)生等待的鎖,有可能的話,殺掉該進(jìn)程。
這個語句將查找到數(shù)據(jù)庫中所有的DML語句產(chǎn)生的鎖,還可以發(fā)現(xiàn),任何DML語句其實產(chǎn)生了兩個鎖,一個是表鎖,一個是行鎖。
可以通過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
如果發(fā)生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表,而誰在等待。
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
以上查詢結(jié)果是一個樹狀結(jié)構(gòu),如果有子節(jié)點,則表示有等待發(fā)生。如果想知道鎖用了哪個回滾段,還可以關(guān)聯(lián)到V$rollname,其中xidusn就是回滾段的USN

[Q] 如何有效的刪除一個大表(extent數(shù)很多的表)
[A] 一個有很多(100k)extent的表,如果只是簡單地用drop table的話,會很大量消耗CPU(Oracle要對fet$、uet$數(shù)據(jù)字典進(jìn)行操作),可能會用上幾天的時間,較好的方法是分多次刪除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]如何收縮臨時數(shù)據(jù)文件的大小
[A]9i以下版本采用
ALTER DATABASE DATAFILE ‘file name‘ RESIZE 100M類似的語句
9i以上版本采用
ALTER DATABASE TEMPFILE ‘file name‘ RESIZE 100M
注意,臨時數(shù)據(jù)文件在使用時,一般不能收縮,除非關(guān)閉數(shù)據(jù)庫或斷開所有會話,停止對臨時數(shù)據(jù)文件的使用。

[Q]怎么清理臨時段
[A]可以使用如下辦法
1、 使用如下語句查看一下認(rèn)誰在用臨時段
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、 那些正在使用臨時段的進(jìn)程
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、 執(zhí)行清理操作
alter session set events ‘immediate trace name DROP_SEGMENTS level TS#+1‘
說明:
temp表空間的TS# 為 3*, So TS#+ 1= 4
如果想清除所有表空間的臨時段,則
TS# = 2147483647

[Q]怎么樣dump數(shù)據(jù)庫內(nèi)部結(jié)構(gòu),如上面顯示的控制文件的結(jié)構(gòu)
[A]常見的有
1、分析數(shù)據(jù)文件塊,轉(zhuǎn)儲數(shù)據(jù)文件n的塊m
alter system dump datafile n block m
2、分析日志文件
alter system dump logfile logfilename;
3、分析控制文件的內(nèi)容
alter session set events ‘immediate trace name CONTROLF level 10‘
4、分析所有數(shù)據(jù)文件頭
alter session set events ‘immediate trace name FILE_HDRS level 10‘
5、分析日志文件頭
alter session set events ‘immediate trace name REDOHDR level 10‘
6、分析系統(tǒng)狀態(tài),最好每10分鐘一次,做三次對比
alter session set events ‘immediate trace name SYSTEMSTATE level 10‘
7、分析進(jìn)程狀態(tài)
alter session set events ‘immediate trace name PROCESSSTATE level 10‘
8、分析Library Cache的詳細(xì)情況
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系統(tǒng)上,事件信息放在一個文本文件里
$ORACLE_HOME/rdbms/mesg/oraus.msg
可以用如下腳本查看事件信息
event=10000
while [ $event -ne 10999 ]
do
event=`expr $event + 1`
oerr ora $event
done
對于已經(jīng)確保的/正在跟蹤的事件,可以用如下腳本獲得
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以上提供的一個非常好的性能監(jiān)控與診斷工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息
可以參考附帶文檔$ORACLE_HOME/rdbms/admin/spdoc.txt。
安裝Statspack:
cd $ORACLE_HOME/rdbms/admin
sqlplus "/ as sysdba" @spdrop.sql -- 卸載,第一次可以不需要
sqlplus "/ as sysdba" @spcreate.sql -- 需要根據(jù)提示輸入表空間名
使用Statspack:
sqlplus perfstat/perfstat
exec statspack.snap; -- 進(jìn)行信息收集統(tǒng)計,每次運行都將產(chǎn)生一個快照號
-- 獲得快照號,必須要有兩個以上的快照,才能生成報表
select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
@spreport.sql -- 輸入需要查看的開始快照號與結(jié)束快照號
其他相關(guān)腳本s:
spauto.sql - 利用dbms_job提交一個作業(yè),自動的進(jìn)行STATPACK的信息收集統(tǒng)計
sppurge.sql - 清除一段范圍內(nèi)的統(tǒng)計信息,需要提供開始快照與結(jié)束快照號
sptrunc.sql - 清除(truncate)所有統(tǒng)計信息

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    91人妻人人精品人人爽| 日韩精品中文字幕在线视频| 九九九热视频免费观看| 五月婷婷六月丁香在线观看| 久久99热成人网不卡| 最近日韩在线免费黄片| 日韩熟妇人妻一区二区三区 | 日韩精品一区二区三区射精| 日本欧美视频在线观看免费| 久久99国产精品果冻传媒| 欧美丝袜诱惑一区二区| 国产精品二区三区免费播放心| 婷婷九月在线中文字幕| 在线观看国产成人av天堂野外| 内用黄老外示儒术出处| 亚洲综合香蕉在线视频| 中国美女偷拍福利视频| 欧洲精品一区二区三区四区| 亚洲精品中文字幕一二三| 免费观看潮喷到高潮大叫| 成人午夜免费观看视频| 人妻乱近亲奸中文字幕| 欧美人妻少妇精品久久性色| 激情少妇一区二区三区| 又大又紧又硬又湿又爽又猛| 亚洲国产一级片在线观看| 欧美黑人在线精品极品| 99久久人妻中文字幕| 国产在线视频好看不卡| 精品人妻少妇二区三区| 91后入中出内射在线| 午夜精品福利视频观看| 国产原创中文av在线播放| 日韩aa一区二区三区| 大香蕉伊人一区二区三区 | 午夜精品成年人免费视频| 日韩日韩日韩日韩在线| 麻豆印象传媒在线观看| 午夜成年人黄片免费观看| 香蕉网尹人综合在线观看| 国产成人午夜福利片片|