######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