Oracle的體系結構概覽

聲明:版本11gR2CentOS5.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三個階段


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’;

mount階段

開啓mount階段需要用到控制文件

可以使用參數control_files查看控制文件所在位置:

show parameter control_files

如果控制文件損壞,在開啓數據庫的時候就會報錯,而且告訴你去alert_sid.log裏看具體錯誤信息,而這個文件所在位置,可以通過background_dump_dest參數去查看:

show parameter background

注:alert_sid.log最大支持到2G大小,所以當業務特殊繁忙或者文件變的比較大的時候需要備份。

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;

不提交通過另外一個窗口同一個用戶身份去查詢觀察。

 --當然不會看到,因爲沒有提交


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章