聲明:版本11gR2,CentOS5.8
1 物理結構(文件)
主要性能影響在IO上
(1)controlfile
select * from v$controlfile
(2)datafile
select * from dba_data_files
(3)redo (online logfile)
select * from v$logfile
select * from v$log
(4)password file(sys)
select * from dba_users
(從11g開始password項裏變爲空了,以免被破解)
2 邏輯結構
2.1 實例
instance(memory[sga]+process[background])
實例=內存(sga)+後臺進程(background)
查看內存,可以通過以下視圖
select * from v$sga_dynamic_components
後臺進程,可以通過下面視圖查看
select * fromv$bgprocess where paddr!='00';
我們只關心paddr不等於0的就可以了,等於0的都是沒啓用
2.2實例的管理
參數文件spfilesid.ora,initsid.ora
兩個文件可以互相轉化
create spfile from pfile;
create pfile from spfile;
(1)開啓實例分爲nomount,mount,open三個階段
l nomount階段
在開啓到nomount階段需要使用到參數文件,而從9i版本開始默認優先使用spfile參數文件,如果spfile文件沒有就去使用pfile文件,如果pfile文件還沒有,就會報找不到pfile文件的錯誤。
11g有一個新功能,也許是我才發現吧!!!首先先說下數據庫開啓時,如果參數文件丟失或者損壞,不會導致數據庫直接宕掉,但是如果數據庫重新啓動的話,就會報錯,而且如果要是沒有個好的備份的話,那是非常麻煩的事情,如果數據庫在運行時及時發現了參數文件丟失或者損壞,可以使用如下方法處理:
create pfile from memory;
所以參數文件一定要有個良好的備份。
可以通過v$instance視圖查看數據庫狀態
select status from v$instance;
通過v$bgprocess視圖可以查看後臺進程的情況
select * from v$bgprocess where paddr<>’00’;
l mount階段
開啓mount階段需要用到控制文件
可以使用參數control_files查看控制文件所在位置:
show parameter control_files
如果控制文件損壞,在開啓數據庫的時候就會報錯,而且告訴你去alert_sid.log裏看具體錯誤信息,而這個文件所在位置,可以通過background_dump_dest參數去查看:
show parameter background
注:alert_sid.log最大支持到2G大小,所以當業務特殊繁忙或者文件變的比較大的時候需要備份。
l open階段
11gR2版本—經測試,其他版本不確定
可以從open階段到mount階段在到nomount階段
alter database close;
alter database dismount;
shutdown immediate
(2)關閉實例
1.normal
2.transactional
系統有事務的時候就關閉不了
系統有沒有事務可以查看v$transaction視圖
3.immediate
4.abort
2.3 參數的粗略概述
用db_cache_size和processes兩個參數舉例
首先查看v$parameter視圖可以查看是否是靜態參數或者是動態
select name,issys_modifiablefromv$parameter wherename in ('db_cache_size','processes');
NAME ISSYS_MOD
-------------------- ---------
processes FALSE
db_cache_size IMMEDIATE
從ISSYS_MOD字段可以看出db_cache_size參數是立即生效,所以從這個可以看出db_cache_size字段是動態參數。
注意:其中processes參數如果過多比如更改爲50000個數量的時候,數據庫在重新啓動的時候會掛住。
2.4 session(process)
A)process
select * from v$process;
包含v$bgprocess
l 通過如下以下方法可以追溯到OS系統的進程
SQL> select distinct sid fromv$mystat;
SID
----------
37
SQL> select sid,paddr fromv$session where sid=37;
SID PADDR
---------- --------
37 43BC365C
SQL> select addr,pid,spidfrom v$process where addr='43BC365C';
ADDR PID SPID
-------- ----------------------------------
43BC365C 20 11633
[root@elvis ~]# ps -ef | grepora
root 3762 3732 0 May30 ? 00:01:02 hald-addon-storage: polling/dev/hdc
oracle 4604 1 0 May30 ? 00:00:02/u01/oracle/product/11.2.0/dbhome_1/bin/tnslsnr LISTENER -inherit
oracle 7624 1 0 06:22 ? 00:00:07 ora_pmon_elvis
oracle 7628 1 0 06:22 ? 00:00:35 ora_vktm_elvis
oracle 7634 1 0 06:22 ? 00:00:00 ora_gen0_elvis
oracle 7638 1 0 06:22 ? 00:00:01 ora_diag_elvis
oracle 7642 1 0 06:22 ? 00:00:00 ora_dbrm_elvis
oracle 7646 1 0 06:22 ? 00:00:01 ora_psp0_elvis
oracle 7650 1 0 06:22 ? 00:00:35 ora_dia0_elvis
oracle 7654 1 0 06:22 ? 00:00:05 ora_mman_elvis
oracle 7658 1 0 06:22 ? 00:00:03 ora_dbw0_elvis
oracle 7662 1 0 06:22 ? 00:00:02 ora_lgwr_elvis
oracle 7666 1 0 06:22 ? 00:00:16 ora_ckpt_elvis
oracle 7670 1 0 06:22 ? 00:00:06 ora_smon_elvis
oracle 7674 1 0 06:22 ? 00:00:00 ora_reco_elvis
oracle 7678 1 0 06:22 ? 00:00:11 ora_mmon_elvis
oracle 7682 1 0 06:22 ? 00:00:07 ora_mmnl_elvis
oracle 7686 1 0 06:23 ? 00:00:00 ora_d000_elvis
oracle 7690 1 0 06:23 ? 00:00:00 ora_s000_elvis
oracle 9125 1 0 10:26 ? 00:00:00 ora_arc0_elvis
oracle 9129 1 0 10:26 ? 00:00:00 ora_arc1_elvis
oracle 9133 1 0 10:26 ? 00:00:00 ora_arc2_elvis
oracle 9137 1 0 10:26 ? 00:00:00 ora_arc3_elvis
oracle 9177 1 0 10:31 ? 00:00:00 ora_smco_elvis
root 11596 11564 0 16:36 pts/0 00:00:00 su - oracle
oracle 11597 11596 0 16:36 pts/0 00:00:00 -bash
oracle 11629 11597 0 16:36 pts/0 00:00:00 rlwrapsqlplus / as sysdba
oracle 11630 11629 0 16:36 pts/1 00:00:00sqlplus as sysdba
oracle 11633 11630 0 16:36 ? 00:00:00oracleelvis (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 11637 1 0 16:36 ? 00:00:01 oracleelvis (LOCAL=NO)
oracle 11678 1 0 16:38 ? 00:00:00 oracleelvis (LOCAL=NO)
oracle 11682 1 0 16:39 ? 00:00:00 ora_w000_elvis
root 11735 11695 0 16:42 pts/2 00:00:00 grep ora
注:如果是windows環境下情況較複雜,具體的進程ID需要去查看線程,而Windows不能直接查看進程下的線程必須通過第三方工具去查看。
l 從進程資源佔用情況追溯到session
這種情況下,可以查找到是哪個session在佔用大量資源,甚至能查找到
B)session
l 資源視圖—重要
select * from v$resource_limit;
l 命令類型視圖,根據v$session視圖裏的command列判斷
select * from audit_actions;
l 通過session視圖的sql_id列,查看到sql語句
select * from v$sql where sql_id=’ ’;
模擬消耗資源的死循環的語句
declare
number:=0;
begin loop
i:=1;
end loop:
end;
找到後Kill掉session
alter system kill session ’67,23’;
或者直接Kill掉進程
Window下是orakill命令,服務器端具備
Linux下是kill,top,ps –ef | grep ora等命令
Kill用法
--kill -9 sid 強制kill掉
C)connection
專有連接
共享連接
基本不使用,瞭解即可
池中連接
3 深入邏輯結構
3.1 表空間
database->tablespace->segments->extents->osblocks
===============================================
selelct * from dba_tablespaces;
select * from dba_data_files;
select * from dba_temp_files;
select * from dba_segment;
--一個表空間可以包含最多1023個數據文件
注:從11g開始有延遲段的概念,就是表中無數據的話,Oracle不分配空間
通過參數deferred_segment_creation查看延遲段的開啓情況
--show parameterdeferred_segment_creation
===============================================
創建一個表空間
create tablespace orcl datafile 'E:\ORADATA\orcl\orcl01.dbf' size 10M;
然後創建一個表並指定存到orcl表空間中
create table t(id int) tablespace orcl;
表空間的分配方式 (extent爲單位)
autoallocate(默認)
<=1m 64k 8blocks
<=64m 1m 128blocks
<=1g 8m 1024blocks
>1g 64m 8096blocks
Uniform [指定增長大小]
始終都會按指定的大小增長
分配方式可以查看dba_tablespace視圖中allocate_type字段爲system就是默認
在關掉這個表空間
alter tablespace orcl offline;
->notes:雖然表不能訪問和修改了,但可以刪除,相當於數據庫
關閉了,只不過這是局部關閉。
回收站命令 show recyclebin 可以查詢,但不可以對回收站裏的表執行DDL/DML
select * from " BIN$wHUg/RiVRxuXtwyypSxnTw==$0 TABLE" ;
從回收站裏拿出來 閃回
flashback table t to before drop;
================================================
可以使用EM來觀察表空間的使用率
--登錄->administration->tablespace
3.2 表空間和數據文件的管理
創建一個表
create table tt tablespace orcl as select * from dba_objects;
持續插入數據
insert into tt select * from tt;
當表空間大小不足時,擴展表空間大致有以下幾種方式:
1.直接擴展數據文件大小
alter database datafile file_id resize 20M;
2.自動擴展數據文件大小
alter database datafile 5 autoextend on next 1M maxsize 1024M;
3.手動擴展表空間的大小
alter tablespace orcl add datafile 'D:\oradata\orcl\orcl02.dbf'
autoextend on next 1M maxsize 1024M;
爲tt表分配了40M的空間大小且會顯示但裏面沒有數據是空的(插入會遵循有空間的優先插入)
alter table tt allocate extent(datafile'D:\oradata\orcl\orcl02.dbf' size 40M);
查看錶中塊的使用情況方法:
1.包的方式
execdbms_stats.gather_table_stats(‘table’,’TEST’);
2.分析表—這種更準確
analyze table tt computestatistics;
從10g開始可以爲tt表緊縮
alter table t shrink space;
但緊縮需要行移動(row movement)
alter table t shrink space;
這樣就可以緊縮了。。。
查看row movement 是否可以移動
select * from dba_tables where table_name='T';
===============================================================
把表t移動到表空間2裏,觀察會有什麼變化
alter table t move tablespace orcl02;
案例一:
優化問題,觀察磁盤讀取速率及各個文件的讀取情況。
視圖:
--dba打頭的屬於靜態數據來自於system裏的數據字典
--v$打頭的屬於動態,一般來自於控制文件等,且存儲在內存中,所以服務器儘量不要重啓,重啓後,動態信息會消失,當然從10g
開始oracle已經每隔一個小時會存儲下動態信息
select * from v$filestat;
3.3 undo表空間
創建undo表空間
create undo tablespace undotbs2 database'E:\oradata\orcl\undotbs02.dbf' size 10M;
在表t中加入一列
alter table t add name varchar2(10) default 'a';
insert into t values(1,'elvis');
insert into t values(2,'elvis');
commit;
然後更新下列值
updata t set name='c' where id=1;
select * from t;
不提交通過另外一個窗口同一個用戶身份去查詢觀察。
--當然不會看到,因爲沒有提交