ORA-00845: MEMORY_TARGET 深度处理

本文解决Oracle 11g在azure云上降低配置后启动报错ORA-00845的问题,详细介绍了MEMORY_TARGET参数的含义及调整方法,并提供了修改/etc/fstab配置的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 简介图
这里写图片描述

<think>嗯,用户问的是Oracle如何创建新数据库。首先,我需要回忆一下Oracle数据库创建的步骤。通常来说,创建数据库可以使用DBCA(Database Configuration Assistant)工具,这是图形化的方式,比较适合新手。或者也可以通过手动编写SQL脚本,但这种方法需要更深入的知识,适合有经验的DBA。 用户可能是刚接触Oracle,所以应该先介绍DBCA的方法,因为更直观。不过也有可能用户需要自动化或者脚本化的方法,所以也应该提到手动创建的方式。需要分步骤说明,确保清晰易懂。 另外,我需要考虑不同操作系统下的情况,比如Windows和Linux,但Oracle的DBCA在两者上都有,所以步骤大致相同。可能需要注意路径的差异,比如在Linux下可能需要运行dbca命令,而Windows可能有快捷方式或者通过开始菜单启动。 在步骤中,需要详细说明每个选项的作用,比如数据库的名称、管理口令、存储类型等。特别是SID和全局数据库名的区别,可能需要解释清楚。还有字符集的选择,这对应用的支持很重要,如果选错了可能会导致乱码问题。 另外,初始化参数如内存分配、进程设置这些,可能需要根据实际环境调整。对于手动创建部分,需要提到创建参数文件、启动实例、运行建库脚本等步骤,以及后续的数据字典创建和网络配置。 还需要提醒用户创建后的必要操作,比如修改密码、备份初始数据库、配置监听器等。这些都是确保数据库可用性和安全性的重要步骤。 用户可能的需求是什么?可能是需要搭建新环境,或者学习Oracle数据库的创建过程。如果是生产环境,可能需要更详细的配置指导,比如存储规划、备份策略等,但当前问题可能更偏向基础操作。因此,回答需要全面但不过于深入,保持简洁明了。 总结下来,回答的结构应该是先介绍两种方法,详细说明DBCA的步骤,然后简要提一下手动方法,最后补充创建后的注意事项。这样既覆盖了主要使用场景,又提供了足够的信息供用户参考。</think>在 Oracle 数据库中,创建一个新的数据库通常可以通过以下两种方式实现:使用 **图形化工具(DBCA)** 或 **手动编写 SQL 命令**。以下是两种方法的简要说明: --- ### **方法一:使用 DBCA(Database Configuration Assistant,推荐)** DBCA 是 Oracle 提供的图形化工具,适合新手和快速创建标准数据库。 #### **步骤示例(以 Linux/Windows 为例)**: 1. **启动 DBCA**: - **Linux**: 终端输入 `dbca`。 - **Windows**: 在开始菜单搜索 `Database Configuration Assistant`。 2. **选择操作**: - 选择 **Create a Database** → 点击下一步。 3. **配置数据库模板**: - 选择 **General Purpose or Transaction Processing**(通用模板),或根据需要自定义。 4. **设置数据库标识**: - 输入 **全局数据库名**(如 `orcl`)和 **SID**(系统标识符,通常与全局名一致)。 5. **管理选项**: - 默认跳过(除非需要 Enterprise Manager 等高级管理)。 6. **设置管理员密码**: - 为 `SYS`、`SYSTEM` 等账户设置统一或独立密码。 7. **配置存储和文件位置**: - 选择存储类型(文件系统/ASM),指定数据文件、控制文件、日志文件的位置(默认即可)。 8. **初始化参数**: - **内存分配**:调整内存大小(如 SGA、PGA)。 - **字符集**:重要!通常选 `AL32UTF8`(支持多语言)。 - **连接模式**:默认专用服务器模式。 9. **创建数据库**: - 确认配置后,点击完成,等待数据库创建完成(可能需要 10-30 分钟)。 --- ### **方法二:手动创建数据库(SQL*Plus)** 适用于高级用户或需要深度定制的场景。 #### **步骤示例**: 1. **创建初始化参数文件(`init.ora`)**: ```sql CREATE PFILE='/u01/app/oracle/product/12.2.0/dbhome_1/dbs/initNEWDB.ora' FROM SPFILE; ``` 修改参数文件中的配置(如 `db_name=NEWDB`, `memory_target`, `control_files` 等)。 2. **启动实例到 `NOMOUNT` 状态**: ```sql STARTUP NOMOUNT PFILE='/path/to/initNEWDB.ora'; ``` 3. **执行 `CREATE DATABASE` 命令**: ```sql CREATE DATABASE NEWDB USER SYS IDENTIFIED BY password USER SYSTEM IDENTIFIED BY password LOGFILE GROUP 1 ('/u01/oradata/NEWDB/redo01a.log') SIZE 100M, GROUP 2 ('/u01/oradata/NEWDB/redo02a.log') SIZE 100M MAXLOGFILES 5 MAXDATAFILES 100 CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16 EXTENT MANAGEMENT LOCAL DATAFILE '/u01/oradata/NEWDB/system01.dbf' SIZE 1G AUTOEXTEND ON SYSAUX DATAFILE '/u01/oradata/NEWDB/sysaux01.dbf' SIZE 1G DEFAULT TABLESPACE users DATAFILE '/u01/oradata/NEWDB/users01.dbf' SIZE 500M DEFAULT TEMPORARY TABLESPACE temp TEMPFILE '/u01/oradata/NEWDB/temp01.dbf' SIZE 500M UNDO TABLESPACE undotbs DATAFILE '/u01/oradata/NEWDB/undotbs01.dbf' SIZE 500M; ``` 4. **运行数据字典脚本**: ```sql @?/rdbms/admin/catalog.sql -- 创建数据字典 @?/rdbms/admin/catproc.sql -- 创建PL/SQL环境 @?/sqlplus/admin/pupbld.sql -- 支持SQL*Plus ``` 5. **配置监听和网络**: - 在 `tnsnames.ora` 和 `listener.ora` 中添加新数据库的网络配置。 --- ### **创建后的必要操作** 1. **修改默认密码**: ```sql ALTER USER SYS IDENTIFIED BY new_password; ALTER USER SYSTEM IDENTIFIED BY new_password; ``` 2. **创建用户和表空间**: ```sql CREATE TABLESPACE app_data DATAFILE '/path/to/app_data.dbf' SIZE 1G; CREATE USER myuser IDENTIFIED BY mypassword DEFAULT TABLESPACE app_data; GRANT CONNECT, RESOURCE TO myuser; ``` 3. **备份初始数据库**(建议立即执行全备)。 --- ### **注意事项** - **权限要求**:需以 `SYSDBA` 权限登录。 - **字符集和时区**:确保与应用需求一致。 - **资源分配**:根据服务器硬件调整内存和存储参数。 - **监听配置**:确保客户端能通过监听器连接到新数据库。 推荐优先使用 **DBCA** 简化流程,手动创建适合对 Oracle 架构有深入了解的用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值