oracle的內存spa與pga


######Orcale的內存pga sga
database(數據庫):指存在磁盤上的一組物理文件。
instance(實例):指一組後臺進程和一塊共享區域。

查看閃回恢復區目錄:
show parameter db_recovery_file_dest;
SHOW parameter db_recovery_file_dest_size;
alter system set db_recovery_file_dest_size=4g scope=memory;
memory ,both及時生效 spfile 重啓數據庫生效

oracle內存結構有SGA和PGA組成。

show sga;
Total System Global Area 1653518336 bytes
Fixed Size            2213896 bytes
Variable Size         1006635000 bytes
Database Buffers      637534208 bytes
Redo Buffers            7135232 bytes

select component,granule_size from v$sga_dynamic_components;

#############################SGA組成部分:
 SGA相關視圖:
   v$sga:V$SGA這個視圖包括了SGA的的整體狀況,只包含兩個字段:name(SGA內存區名字)和value(內存區的值,單位爲字節)。它的結果和show sga的結果一致。
   v$sgastat:10g以前用於查看各SGA組件大小。V$SGAINFO的做用基本和V$SGA同樣,只不過把Variable size的部分更細化了一步
   v$sgainfo:10g及10g以後纔有的。用於查看SGA組件大小更簡便。
   v$sga_dynamic_components:這個視圖記錄了SGA各個動態內存區的狀況,它的統計信息是基於已經完成了的,針對SGA動態內存區大小調整的操做。
   v$sga_dynamic_free_memory:這個視圖只有一個字段就是用來表示SGA當前能夠用於調整各個組件的剩餘大小。
   v$sga_target_advice:該視圖可用於建議SGA大小設置是否合理。
1.數據庫緩衝區高速緩存(database buffer cache)
用於存儲最近使用的數據塊,減小磁盤I/O操做。
desc v$buffer_pool;
select id,name,block_size,current_size,target_size from v$buffer_pool;
2.fixd sag(sga固定部分):包含一些小的數據結構,LATCH或者地址指針等。

查詢系統內存
sga_target +pga_aggregate_target<= memory_max_target
show parameter memory_max_target;
show parameter sga_target;
show parameter pga_aggregate_target;

修改系統參數
SYS@orcl 08:22:19>alter system set sga_target=800m scope=spfile;
查詢後仍是0,重啓生效
SYS@orcl 08:24:32>shutdown immediate;
SYS@orcl 08:24:58>startup nomount;
SYS@orcl >alter database mount;
SYS@orcl >alter database open;

出現錯誤
恢復:
startup pfile='.../initorcl.ora'
create spfile from memory;

3.共享池(shared pool)
實現SQL共享,減小代碼的硬解析,從而提升數據庫的性能。
由庫緩存(library cache)和數據字典(data dictionary cache)
library cache:用於存儲SQL語句,SQL語句相關解析樹
data dictionary cache:存儲數據字典信息,包括表和視圖等對象的結構信息,用戶以及權限信息。
硬解析:綁定變量。
show parameter shared_pool_size;

oracle 11g開始,share pool中劃出一塊內存用於存儲SQL查詢結果集爲result cache memory.
show parameter result_cache;

4.日誌緩衝區(redo buffer cache)
redo:事務被恢復。
undo:保障事務回滾。

5.jave pool(java池):爲JVM分配一段固定大小的內存。
6.large pool(大池):
(1)共享服務器連接,用於在SGA中分配UGA區
(2)用於協調並行查詢服務器,語句在並行執行時,容許分配進程間的消息緩衝區

7.streams pool(流池):用於複製。


######PGA是服務器進程使用的一塊包含數據庫和控制信息的內存區域。

PGA的兩種模式:dedicated server(專用服務器模式),shared server(共享服務器模式)

dedicated server:爲每一個會話建立一個oracle進程
share sever:服務器端會啓動必定數量的服務器進程,而後由多個客戶端請求共享一個oracle服務進程。

PGA在內存分配與使用上分固定PGA和可變PGA

可變PGA包含兩個部分:
(1)會話內存:用於存放會話的登陸信息以及其餘相關信息。
(2)私有SQL區域:包含綁定變量信息,查詢的執行狀態信息以及查詢工做等。每一個發出SQL查詢的會話都擁有一塊私有SQL區域,對於dedicated server,這部份內存由PGA分配。對於shared server模式,這部份內存在SGA中分配。


私有SQL區域包含兩部分:
(1)永久區域(persistent area):包含綁定變量等信息,這部份內存只有在遊標關閉時纔會被釋放。
(2)運行區域(runtime area):該區域存放SQL語句運行時所需的信息,在執行請求時建立,其中包含查詢的狀態信息(如全表掃描,則記錄全表掃描的進度等)。

oracle11g 開始,oracle內存可使用兩種技術實現:
1.經過設置pga_aggregate_target初始化參數,告訴oracle可使用多少PGA內存。
2.經過設置memory_target初始化參數,告訴oracle數據庫實例應當爲SGA和PGA總共使用多少內存。
show parameter pga_aggregate_target;
show parameter memory_target;

pga_aggregate_target+sga_targe<=memory_targe
##########################################
redo:用來保障在故障時事務能夠被恢復。
undo:保障事務能夠被回滾或者撤銷。

redo
redo的功能主要有3個組件來實現:redo log buffer,lgwr後臺進程,redo log file(在歸檔模式下,redo log file最終會由ARCn進程寫爲歸檔日誌文件)。

redo log buffer位於SGA中,是一塊循環使用的內存區域。oracle會經過LGWR進程不斷的把redo log buffer的內容寫出到redo log file中。

查看默認日誌組:
日誌視圖:
desc v$log;
 Name           Null?    Type
 ----------------- -------- ------------
 GROUP#             NUMBER
 THREAD#            NUMBER
 SEQUENCE#            NUMBER
 BYTES                NUMBER
 BLOCKSIZE            NUMBER
 MEMBERS            NUMBER
 ARCHIVED            VARCHAR2(3)
 STATUS             VARCHAR2(16)
 FIRST_CHANGE#            NUMBER
 FIRST_TIME            DATE
 NEXT_CHANGE#            NUMBER
 NEXT_TIME            DATE

select group#,members from v$log;


select a.group#,a.bytes,a.blocksize,a.status,b.member from v$log a join v$logfile b on a.group#=b.group#;

默認建立三個日誌組

1.current:活動狀態,當前正在被使用。
2.active:日誌是活動的非當前日誌,該日誌可能已經完成歸檔也可能沒有完成歸檔。
3.inactive:是非活動日誌,該日誌在實例恢復時不須要,在介質恢復時可能用到。INACTIVE狀態的日誌可能已經完成歸檔也可能沒有完成歸檔。在歸檔模式下,未完成歸檔以前,日誌文件不容許被覆蓋。
4.unused:該日誌未被寫入,這類日誌可能剛添加到數據庫或者resetlog以後被重置。
查看是否有log file switch等待時間
select sid,event,state from v$session_wait where event like '%log%';

log file switch的多個緣由:
(1)日誌文件太小,致使日誌切換過於頻繁。
(2)日誌組太少,不能知足正常事務量的需求
(3)日誌文件所在磁盤I/O存在瓶頸,致使寫出緩慢,阻塞數據庫正常運行。
(4)因爲數據文件磁盤I/O瓶頸,DBWR寫出過於緩慢。
(5)因爲事務量大,DBWR負荷太高,不堪重負。

解決方法:
(1)適當增長日誌大小
(2)適當增長日誌組數
(3)使用快速磁盤存儲日誌文件
(4)改善I/O性能
(5)使用多個DBWn進程或使用異步I/O等




//日誌塊的大小:
redo block sizes是源碼固定的,與操做系統無關,從X$kccle
select max(lebsz) from x$kccle;
MAX(LEBSZ)
----------
       512


//獲取表結構
set long 9999;
select dbms_metadata.get_ddl('TABLE','EMP') from dual;

表建立基於tablespace建立
建立表前先建立表空間

select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';
NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                  0
create table s01(id int,name varchar(50),addr varchar(100),primary key(id));

select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';

NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                  22024



###############################
LISN@orcl>select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';
select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';

NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                712

LISN@orcl>create table s01(id int,name varchar(50),addr varchar(100),primary key(id));
create table s01(id int,name varchar(50),addr varchar(100),primary key(id));

Table created.

LISN@orcl>select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';
select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';

NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                  16976


LISN@orcl>insert into s01(id)  select rownum from dual connect by level < 1000;
insert into s01(id)  select rownum from dual connect by level < 1000;

999 rows created.

LISN@orcl>select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';
select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';

NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                  89088


LISN@orcl>delete from  s01;
delete from  s01;

999 rows deleted.

LISN@orcl>select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';
select a.name,b.value from v$statname a join v$mystat b on a.statistic#=b.statistic# where a.name='redo size';

NAME                                      VALUE
---------------------------------------------------------------- ----------
redo size                                 546636


insert into s01 select rownum from dual connect by level < 100000;

//建立即增長redo日誌logfile
alter database add logfile group 4 '/u01/app/oracle/oradata/orcl/redo04.log' size 50m;


select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
     1 ACTIVE
     2 INACTIVE
     3 INACTIVE
     4 CURRENT
//手動強制切換日誌文件
alter system switch logfile;
查看
select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
     1 ACTIVE
     2 CURRENT
     3 INACTIVE
     4 ACTIVE


//刪除日誌:
LISN@orcl>alter database drop logfile group 3;

//手動刪除日誌文件,釋放存儲空間:
[root@nan86 orcl]# pwd
/u01/app/oracle/oradata/orcl
[root@nan86 orcl]# rm -f redo03.log


//歸檔日誌的查詢:
系統管理員可查
desc v$archived_log
查詢歸檔日誌名 歸檔時間  大小 blocks爲塊數
select name,completion_time,blocks*block_size/1024/1024 size_mb from v$archived_log;


###undo
undo詳解:認爲undo用於數據庫物理恢復到執行語句或事務以前的樣子,其實數據庫只是邏輯地恢復到原來的樣子,全部修改都是邏輯的取消。可是數據結構以及數據庫自己在回滾後可能大不相同。

set autotrace on explain;

set autotrace on;
create table t as select * from all_objects where 1=0;
select * from t;
insert into t select * from all_objects;
select count(*) from t;

  COUNT(*)
----------
     71498

rollback;
事務的混滾是邏輯回滾
select count(*) from t;
  COUNT(*)
----------
     0
set autotrace on statistics;





//查看alter trace日誌
SYS@orcl>show parameter user_dump_dest;
show parameter user_dump_dest;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                 string     /u01/app/oracle/diag/rdbms/orcl/orcl/trace

alter日誌命名方式:alter_$ORACLE_SID.log


########################################
//用戶權限
desc role_sys_privs;



SYS@orcl>show parameter sga_target;
        --0則沒修改
SYS@orcl>show parameter pga_aggregate_target;
        --0則沒修改
SYS@orcl>show parameter memory_target;
        --
SYS@orcl>show parameter memory_max_target;
        --最大


alter system set sga_target=800m scope=spfile;
        --sga_target<memory_target


//查看用戶所屬的表空間
select tablespace_name,segment_name from user_segments;

###########################################

java

相關文章
相關標籤/搜索