您的位置:首页 > 数据库 > Oracle

oracle的内存spa与pga

2014-04-23 00:00 330 查看
######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;

###########################################
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息