Oracle 11g AMM与ASMM切换

来源:互联网 发布:java socket通信协议 编辑:程序博客网 时间:2024/05/17 04:54

Oracle 11g AMM与ASMM切换(转载)  


转载http://space.itpub.net/17203031/viewspace-774928

现在的Oracle正在往智能化方向发展。如果我们现在找一些8i/9i时代的Oracle书籍,怎么样配置合适的数据库各内存池大小是非常重要的话题。但是进入10g之后,自动内存池调节成为一个重要Oracle特性。

 

10g时,Oracle推出了ASMMAutomatic SharedMemory Management),实现了Oracle SGAPGA内部结构的自调节。进入11g之后,AMMAutomatic Memory Management)实现了参数MEMORY_TARGET,将SGAPGA的规划全部统筹起来对待。

 

默认情况下,Oracle 11g是使用AMM的。我们在安装过程中,指定Oracle使用内存的百分比,这个取值就作为MEMORY_TARGETMEMORY_MAX_TARGET的初始取值使用。如果这两个参数设置为非零取值,那么Oracle就是采用AMM管理策略的。

 

同时,如果我们设置这两个参数为0,则AMM自动关闭。对应的SGA_TARGETPGA_AGGREGATE_TARGET参数取值非零之后,Oracle自动退化使用ASMM特性。

 

本篇简单介绍一下AMMASMM的相互切换。

 

1、实验环境介绍

 

我们选择11.2.0.3进行试验,当前状态为ASMM

 

 

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

PL/SQL Release 11.2.0.3.0 - Production

CORE       11.2.0.3.0        Production

 

 

当前MEMORY_TARGET设置为零,AMM没有启用。

 

 

SQL> show parameter target

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                  integer    0

db_flashback_retention_target       integer    1440

fast_start_io_target                integer    0

fast_start_mttr_target              integer    0

memory_max_target                   big integer 0

memory_target                       big integer 0

parallel_servers_target             integer    16

pga_aggregate_target                big integer 108M

sga_target                          big integer 252M

 

 

2、从ASMMAMM

 

11g中,如果使用ASMM,对应的内存共享段是(在物理内存上)真实(分配)的共享段。

 

 

[oracle@SimpleLinux ~]$ ipcs -m

 

------ Shared Memory Segments --------

key       shmid     owner     perms     bytes     nattch    status     

0x00000000 32768     oracle   640       4194304   32                     

0x00000000 65537     oracle   640       260046848 32                     

0x01606d30 98306     oracle   640       4194304   32  

 

 

下面进行参数的调整,这里笔者有一个建议,很多时候启动umount阶段故障都是由于不当的参数修改造成的。在进行参数修改之前,可以使用createpfile进行一下参数备份,可以加快故障出现时候的系统修复速度。

 

 

SQL> show parameterspfile

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

spfile                              string     /u01/app/oracle/dbs/spfileora11g.ora

 

SQL> create pfile from spfile;

Done

 

 

修改系统参数,将sgapgatarget值设置为0memorytarget设置非0注意,这个过程很多参数是静态的参数,可以都在spfile可见性中进行修改,之后重启服务器生效。

 

 

SQL> alter system set memory_max_target=360m scope=spfile;

System altered

 

SQL> alter system set memory_target=360m scope=spfile;

System altered

 

SQL> alter system set sga_target=0m scope=spfile;

System altered

 

SQL> alter system set sga_max_size=0 scope=spfile;

System altered

 

SQL> alter system set pga_aggregate_target=0 scope=spfile;

System altered

 

 

重新启动数据库服务器,查看参数配置。

 

 

SQL> conn / as sysdba

Connected.

SQL> startup force

ORACLE instance started.

 

Total System Global Area 263651328 bytes

Fixed Size                 1344284 bytes

Variable Size            176164068 bytes

Database Buffers          83886080 bytes

Redo Buffers               2256896 bytes

Database mounted.

Database opened.

 

SQL> show parameter target

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                  integer    0

db_flashback_retention_target       integer    1440

fast_start_io_target                integer    0

fast_start_mttr_target              integer    0

memory_max_target                   big integer 360M

memory_target                       big integer 360M

parallel_servers_target             integer    16

pga_aggregate_target                big integer 0

sga_target                          big integer 0

 

 

AMM启动之后,系统共享段变为“虚拟”共享段。

 

[oracle@SimpleLinux dbs]$ ipcs -m

 

------ Shared Memory Segments --------

key       shmid     owner     perms     bytes     nattch    status     

0x00000000 163840    oracle   640       4096      0                      

0x00000000 196609    oracle   640       4096      0                      

0x01606d30 229378    oracle   640       4096      0  

 

 

3、从AMMASMM

 

下面是如何从AMMASMM要完全关闭AMM,一定将MEMORY_TARGETMEMORY_MAX_TARGET都设置为0才行。

 

 

SQL> alter system set memory_max_target=0 scope=spfile;

System altered

 

SQL> alter system set memory_target=0 scope=spfile;

System altered

 

SQL> alter system set pga_aggregate_target=100m scope=spfile;

System altered

 

SQL> alter system set sga_target=260m scope=spfile;

System altered

 

SQL> alter system set sga_max_size=260m scope=spfile;

System altered

 

 

注意,此时如果重新启动系统,会报错。

 

 

SQL> startup force

ORA-00843: Parameter not taking MEMORY_MAX_TARGET into account

ORA-00849: SGA_TARGET 272629760 cannot be set to more than MEMORY_MAX_TARGET 0.

SQL>

 

 

这个问题的原因是Oracle启动过程中对于参数的内部检查。因为MEMORY_MAX_TARGET“显示”的赋值(即变量的赋值),与SGA_TARGET赋值相冲突。

 

解决的方法就是使用参数默认值(即变量的初始化值)。创建出pfile之后,将显示赋值为0MEMORY_TARGETMEMORY_MAX_TARGET记录行删除掉。再利用pfile启动数据库,重建spfile

 注释:变量的赋值和初始化的区别?

 

SQL> create pfile from spfile

 2 ;

 

File created.

 

--修改前

*.db_recovery_file_dest='/u01/app/fast_recovery_area'

*.db_recovery_file_dest_size=10737418240

*.diagnostic_dest='/u01/app'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'

*.log_checkpoints_to_alert=TRUE

*.memory_max_target=0

*.memory_target=0

*.open_cursors=300

*.pga_aggregate_target=104857600

*.processes=150

 

--修改后

*.db_recovery_file_dest='/u01/app/fast_recovery_area'

*.db_recovery_file_dest_size=10737418240

*.diagnostic_dest='/u01/app'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'

*.log_checkpoints_to_alert=TRUE

*.open_cursors=300

*.pga_aggregate_target=104857600

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

 

 

使用pfile启动数据库,重建spfile

 

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup pfile=/u01/app/oracle/dbs/initora11g.ora

ORACLE instance started.

 

Total System Global Area 272011264 bytes

Fixed Size                 1344372 bytes

Variable Size            176163980 bytes

Database Buffers          88080384 bytes

Redo Buffers               6422528 bytes

Database mounted.

Database opened.

SQL> show parameter target

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                  integer    0

db_flashback_retention_target       integer    1440

fast_start_io_target                integer    0

fast_start_mttr_target              integer    0

memory_max_target                   big integer 0

memory_target                       big integer 0

parallel_servers_target             integer    16

pga_aggregate_target                big integer 100M

sga_target                          big integer 260M

 

SQL> create spfile from pfile

 2 ;

 

File created.

 

 

重新启动之后,ASMM切换完成。

 

 

SQL> startup force

ORACLE instance started.

 

Total System Global Area 272011264 bytes

Fixed Size                 1344372 bytes

Variable Size            176163980 bytes

Database Buffers          88080384 bytes

Redo Buffers               6422528 bytes

Database mounted.

Database opened.

 

--真实的共享内存段结构

[oracle@SimpleLinux dbs]$ ipcs -m

 

------ Shared Memory Segments --------

key       shmid     owner     perms     bytes     nattch    status     

0x00000000 425984    oracle   640       8388608   25                     

0x00000000 458753    oracle   640       264241152 25                     

0x01606d30 491522    oracle   640       4194304   25 

 

--HugePage使用情况

[oracle@SimpleLinux dbs]$ grep Huge /proc/meminfo

HugePages_Total:   67

HugePages_Free:     1

HugePages_Rsvd:     0

Hugepagesize:    4096 kB

[oracle@SimpleLinux dbs]$

 

 

4、结论

 

AMMASMM是我们管理数据库非常重要的工具,借助自我调节的机制,我们可以做到数据库自我管理。11gAMM应该说是很方便的,但是在一些情况下,如HugePage,我们可能需要切换回ASMM。权当记录,留需要的朋友待查。

0 0