ORA-00845: MEMORY_TARGET 深度处理

1,启动报错

azure云上oracle备库降低配置,从DS12降低到DS11后,需要重启服务器,但是之后在开启oracle服务的时候,报错如下
	SQL> startup;
	ORA-00845: MEMORY_TARGET not supported on this system
	SQL> 

官方MEMORY_TARGET介绍

Starting with Oracle Database 11g, the Automatic Memory Management feature requires more shared memory (/dev/shm)and file descriptors. The size of the shared memory should be at least the greater of MEMORY_MAX_TARGET and MEMORY_TARGET for each Oracle instance on the computer. If MEMORY_MAX_TARGET or MEMORY_TARGET is set to a non zero value, and an incorrect size is assigned to the shared memory, it will result in an ORA-00845 error at startup.

就是说MEMORY_MAX_TARGET的设置不能超过/dev/shm的大小,在oracle11g中新增的内存自动管理的参数MEMORY_TARGET,它能自动调整SGA和PGA,这个特性需要用到/dev/shm共享文件系统,而且要求/dev/shm必须大于MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小就会报错。

2,解决办法:

修改/etc/fstab配置, 查看/etc/fstab

	[oracle@oracle2~]$ more /etc/fstab

	#
	# /etc/fstab
	# Created by anaconda on Wed Jan 15 04:45:47 2014
	#
	# Accessible filesystems, by reference, are maintained under '/dev/disk'
	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
	#
	UUID=6d089360-3e14-401d-91d0-378f3fd09332 /                       ext4    defaults        1 1
	/dev/sdc                /oracle                   ext4    defaults        0 0
	tmpfs                   /dev/shm                tmpfs   defaults        0 0
	devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
	sysfs                   /sys                    sysfs   defaults        0 0
	proc                    /proc                   proc    defaults        0 0
	[oracle@oracle2~]$ 

看到里面没有tmpfs的默认值,所以需要在里面修改tmpfs的值,设置一个默认值size大小

	tmpfs                   /dev/shm                tmpfs   defaults        0 0
	换成
	tmpfs                   /dev/shm                tmpfs   defaults,size=10G        0 0

需要重新mount生效

	[root@oracle2~]#  mount -o remount,size=10G /dev/shm
	[root@oracle2~]# 
	[root@oracle2~]# 
	[root@oracle2~]# df -h
	Filesystem      Size  Used Avail Use% Mounted on
	/dev/sda1        29G  8.8G   19G  33% /
	tmpfs            10G     0   10G   0% /dev/shm
	/dev/sdc       1007G  425G  531G  45% /oracle
	/dev/sdb1        28G  172M   26G   1% /mnt/resource
	[root@oracle2~]# 

再去启动oracle实例,startup成功,如下

[root@oracle2~]# su - oracle
[oracle@oracle2~]$ rlwrap sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 16 10:20:33 2017

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup;
ORACLE instance started.

Total System Global Area 8551575552 bytes
Fixed Size                  2215064 bytes
Variable Size            2818573160 bytes
Database Buffers         5704253440 bytes
Redo Buffers               26533888 bytes
Database mounted.
Database opened.
SQL> 

3,扩展问题

关于自动内存管理,自动内存管理是用两个初始化参数进行配置的:

MEMORY_TARGET:动态控制SGA和PGA时,Oracle总共可以使用的共享内存大小,这个参数是动态的,因此提供给Oracle的内存总量是可以动态增大,也可以动态减小的。它不能超过MEMORY_MAX_TARGET参数设置的大小。默认值是0。
	  
使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。	
	    
但是memory_target这个参数是可以动态调节的...也就是说不需要重新启动DB,就可以让其生效。
		  
MEMORY_MAX_TARGET 是设定Oracle能占OS多大的内存空间
	
SGA_MAX_SIZE是Oracle SGA 区最大能占多大内存空间
		 
11g MEMORY_MAX_TARGET 参数包含SGA和PGA两部分。
	在手动创建数据库时,只需要在创建数据库之前设置合适的MEMORY_TARGET和MEMORY_MAX_TARGET初始化参数。
	在一个系统上启用自动内存管理其实很简单,不需要事先做太多的事情,可以使用下面的计算公式来计算:       MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximumPGAallocated");

查看状态

	SQL> SELECT
	  2    NAME,
	  3    VALUE
	  4  FROM
	  5    v$parameter
	  6  WHERE NAME IN (
	  7      'pga_aggregate_target',
	  8      'sga_target'
	  9    )
	 10  UNION
	 11  SELECT
	 12    'maximum PGA allocated' AS NAME,
	 13    to_char(VALUE) AS VALUE
	 14  FROM
	 15    v$pgastat
	 16  WHERE NAME = 'maximum PGA allocated' ;
	NAME                                                                             VALUE
	-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
	maximum PGA allocated                                                            41652878336
	pga_aggregate_target                                                             11897856102
	sga_target                                                                       60666413056

	SQL> 	

如果需要监视Memory_target 的状况则可以使用下面三个动态试图:

  V$MEMORY_CURRENT_RESIZE_OPS
  V$MEMORY_DYNAMIC_COMPONENTS
  V$MEMORY_RESIZE_OPS
  V$MEMORY_TARGET_ADVICE

下面来看看在11g 中Memory_target 设置和不设置对SGA/PGA 的影响:
如果Memory_target 设置为非0 值

1、sga_target 和 pga_aggregate_target 已经设置大小
	Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和 memory_max_size 一致

2、sga_target 设置大小, pga_aggregate_target 没有设置大小

3、sga_target 没有设置大小, pga_aggregate_target 设置大小 
	sga_target 初始化值=memory_target-pga_aggregate_target

4、sga_target 和 pga_aggregate_target 都没有设置大小
	两个值没有最小值和默认值,Oracle 将根据数据库运行状况进行分配大小,但在数据库启动是会有一个固定比例来分配:
	sga_target =memory_target *60%
	pga_aggregate_target=memory_target *40%

查看所有的target状态值

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     128
	pga_aggregate_target                 big integer 11897856102
	sga_target                           big integer 57856M

SQL> 

MEMORY_TARGET 简介图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值