与时俱进:ASM内存管理与创建表空间之ORA-569错误解决

杨廷琨(yangtingkun)

云和恩墨 CTO

高级咨询顾问,Oracle ACE总监,ITPUB Oracle数据库管理版版主

在一个测试数据库上创建表空间出现了ORA-569错误。由于环境比较复杂,首先简单描述一下数据库环境信息。这个测试环境安装的是Oracle 11g for Solaris 10 sparc 64bit的RAC环境,使用ASM作为共享数据文件的存储机制。

在RAC环境的一个节点上还建立了一个单实例的数据库,并把这个数据库的数据文件也放到了ASM实例上。

在这个单实例数据库上添加新的表空间时报错,代码如下:

SQL> select file_namefrom dba_data_files;

FILE_NAME

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

+DATA/test/datafile/system.533.668281219

+DATA/test/datafile/sysaux.534.668281227

+DATA/test/datafile/undotbs1.535.668281229

+DATA/test/datafile/users.537.668281241

SQL> create tablespacetest datafile '+DATA/test/datafile/test01.dbf' size 4096m;

create tablespace testdatafile '+DATA/test/datafile/test01.dbf' size 4096m

*

第 1 行出现错误:

ORA-01119: 创建数据库文件'+DATA/test/datafile/test01.dbf' 时出错

ORA-17502: ksfdcre: 4未能创建文件+DATA/test/datafile/test01.dbf

ORA-00569: Failed to acquire global enqueue.

这个错误很少见,查了一下Oracle的官方报错文档的描述:

ORA-00569: Failed toacquire global enqueue. Cause: A prior error occurred on one of the instances in the cluster. Typically errors are caused by shared pool resource contention. Action: Check for and resolve prior errors on all instances in the cluster. If there is shared pool resource contention, increase the SHARED_POOL_SIZE,DML_ LOCKS, PROCESSES, TRANSACTIONS, CLUSTER_DATABASE_INSTANCES and PARALLEL_MAX_SERVERS initialization parameters.

文档虽然对问题进行了描述,不过从对错误信息和问题描述中看不出导致问题的真正原因。

查询了一下MOS,从中找到了一些关于ORA-569的错误说明。不过这些问题都和当前错误有很大的不同:大部分出现这个错误的同时都会伴随ORA-600错误和ORA-4031错误。

看来借助Metalink解决这个问题的希望落空,只能自己想办法了。

前面已经提到当前环境比较复杂,这个节点上启动了两个实例。一个是单实例的数据库,另一个是RAC数据库中的一个节点,而且两个数据库的数据文件都存储在相同的ASM磁盘组中。

问题都有两面性,环境复杂也有复杂的好处,现在有一个简单的方法可以确定到底是数据库产生的问题还是ASM实例导致的问题:只需要登录RAC实例,执行类似的添加表空间的操作,就可检查是否会出现相同的错误。

bash-3.00$ export ORACLE_SID=ractest1

bash-3.00$ sqlplus "/as sysdba"

已连接到空闲例程。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 1603887104 bytes

数据库装载完毕。

数据库已经打开。

SQL> CREATE TABLESPACETEST DATAFILE '+DATA/ractest/datafile/test01.dbf' SIZE 4096M;

CREATE TABLESPACE TESTDATAFILE '+DATA/ractest/datafile/test01.dbf' SIZE 4096M

*

第 1 行出现错误:

ORA-01119: 创建数据库文件'+DATA/ractest/datafile/test01.dbf' 时出错

ORA-17502: ksfdcre: 4未能创建文件+DATA/ractest/datafile/test01.dbf

ORA-00569: Failed to acquire global enqueue.

相同的错误产生了,说明问题多半与ASM实例的状态有关系。登录ASM实例进行简单的检查:

bash-3.00$ export ORACLE_SID=+ASM1

bash-3.00$ sqlplus "/as sysdba"

SQL> set pages 100 lines 120

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS

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

+ASM1 STARTED

由于ASM实例可以用来检查的动态视图太少了,从现有的视图也看不到什么特别的地方。实在没有什么太好的查错办法,只能重启数据库和ASM实例,再次检查问题:

bash-3.00$ export ORACLE_SID=test

bash-3.00$ sqlplus "/as sysdba"

SQL> shutdown immediate

SQL> exit

bash-3.00$ export ORACLE_SID=ractest1

SQL> shutdown immediate

SQL> exit

bash-3.00$ export ORACLE_SID=+ASM1

bash-3.00$ sqlplus "/as sysdba"

SQL> shutdown immediate

^CORA-01013: user requestedcancel of current operation

SQL> CONN / AS SYSDBA

已连接。

SQL> shutdown abort

ASM 实例已关闭

SQL> startup

ASM 实例已启动

Total System Global Area 284008448 bytes

ASM diskgroups mounted

bash-3.00$ export ORACLE_SID=test

bash-3.00$ sqlplus "/as sysdba"

SQL> startup

ORACLE 例程已经启动。

数据库装载完毕。

数据库已经打开。

SQL> create tablespacetest datafile '+DATA/test/datafile/test01.dbf' size 4096m;

create tablespace testdatafile '+DATA/test/datafile/test01.dbf' size 4096m

*

第 1 行出现错误:

ORA-01119: 创建数据库文件'+DATA/test/datafile/test01.dbf' 时出错

ORA-17502: ksfdcre: 4未能创建文件+DATA/test/datafile/test01.dbf

ORA-00569: Failed toacquire global enqueue.

可以看到重启ASM实例后问题仍然出现。不过ASM实例也是在两个节点上同时运行的,莫非是在另一个节点的ASM实例出现了问题:

bash-3.00$ export ORACLE_SID=+ASM2

bash-3.00$ sqlplus "/as sysdba"

SQL> set pages 100 lines 120

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS

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

+ASM2 STARTED

检查ASM实例未发现异常,尝试重启ASM实例:

bash-3.00$ srvctl stop instance-d ractest -i ractest2 bash-3.00$ srvctl stop asm -n ser2 bash-3.00$ srvctl start asm -n ser2

再次登录test数据库,执行CREATE TABLESPACE语句:

bash-3.00$ export ORACLE_SID=test bash-3.00$ sqlplus "/as sysdba" SQL> set pages 100 lines 120 SQL> create tablespace test datafile '+DATA/test/datafile/test01.dbf' size 4096m; 表空间已创建。

看来问题果然和ASM实例状态不正常有关。

检查ASM实例2的alert文件,发现在运行CREATE TABLESPACE语句对应的时间点出现了ORA-4031错误:

Errors in file /data/oracle/diag/asm/+asm/+ASM2/trace/+ASM2_lmd0_3099.trc (incident=2412):

ORA-04031: unable toallocate 3512 bytes of shared memory ("shared pool","unknown object","sgaheap(1,0)","ges enqueues")

Incident details in:/data/oracle/diag/asm/+asm/+ASM2/incident/incdir_2412/+ASM2_lmd0_3099_i2412.trc

Trace dumping is performingid=[cdmp_20090218155005]

WARNING: ran out of sharedpool for GES enqueue object.

Errors in file /data/oracle/diag/asm/+asm/+ASM2/trace/+ASM2_lmd0_3099.trc (incident=2413):

ORA-04031: unable toallocate 3512 bytes of shared memory ("shared pool","unknown object","sgaheap(1,0)","ges enqueues")

Incident details in:/data/oracle/diag/asm/+asm/+ASM2/incident/incdir_2413/+ASM2_lmd0_3099_i2413.trc

Trace dumping is performingid=[cdmp_20090218155013]

前面ORA-569报错再加上这个ORA-4031报错,现在已经和Metalink里面的问题描述一致了,而且这个ORA-4031报错信息也很明显,问题在于分配全局队列资源时出现了错误。

检查ASM实例的sga,发现:

SQL> show sga Total System Global Area 284008448 bytes Fixed Size 2087944 bytes Variable Size 256754680 bytes ASM Cache 25165824 bytes

对于同时支持多个数据库实例的ASM实例而言,200MB的SGA显然太小了,和大部分其他Oracle默认参数一样,默认的ASM实例参数也是偏小的。

前面的文中还描述过:由于ASM实例的PROCESS参数太小导致ASM实例无法登录的问题。因此在选择ASM作为产品数据库的存储方式时,就要求ASM实例在建立时就要仔细地设置,很多的默认参数须要调整后才能满足正式环境的需要,使用一项技术,就要尊重一项技术。

在MOS后来补充的以下文档上,明确提出了关于ASM的SGA配置建议:

Things to Consider Before Upgrading to 11.2.0.3 Grid Infrastructure/ASM [ID 1363369.1]

其中指出:自11.2.0.3开始,由于初始化参数Processes的缺省值上升为“CPU Cores * 80 +40”,缺省的MEMORY_TARGET参数可能不足够,尤其是当CPU cores较多或者ASM磁盘组较多时,可能会导致ORA-4031错误,推荐增加ASM的MEMORY_TARGET至少到1536M。原文引用如下:

ASM memory_max_target and memory_target In 11.2.0.3, init.ora parameter "processes" will be default to "available CPU cores * 80 + 40". As the default value for "memory_target" is based on "processes", it can be insufficient if there's large number of CPU cores or large number of diskgroups which could cause issues (i.e. GI stack fails to stop with ORA-04031 etc), it's recommended to increase the value of memory_max_target and memory_target before upgrading to 11.2.0.3(does not apply to 10g ASM): Log in to ASM: SQL> show parameter memory_target If the value is smaller than 1536m, issue the following: SQL> alter system set memory_max_target=4096m scope=spfile; SQL> alter system set memory_target=1536m scope=spfile; The number 1536m has proven to be sufficient for most environment, the change will not be effective until next restart.

此时我们再回头看看ORA-00569错误的提示:

ORA-00569: Failed toacquire global enqueue.

Cause: A prior error occurred on one of the instances in the cluster. Typically errors are caused by shared pool resource contention.

Action: Check for and resolve prior errors on all instances in the cluster. If there is shared pool resource contention, increase the SHARED_POOL_SIZE,DML_ LOCKS, PROCESSES, TRANSACTIONS, CLUSTER_DATABASE_INSTANCES and PARALLEL_MAX_SERVERS initialization parameters.

这里已经提到的ORA-00569典型的是由于Shared Pool资源竞争导致的,往往山重水复之后,我们看到柳暗花明的还是最初的起点,很多学习的过程,就是如此。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

Linux 系统与数据库安全

Linux 系统与数据库安全 目录 1. 帐号安全 1.1. Shell 安全 1.2. .history 文件 2. 临时文件安全 3. 其他安全问题 4. ...

35910
来自专栏Titan框架

使用Titan Framework搭建一个集群Demo

Titan Framework是一款分布式微服务框架,因其具有简单的配置方式,良好的集成性、多样化的支持、丰富的自定义扩展功能,所以它是非常值得我们去应用的。也...

750
来自专栏杨建荣的学习笔记

一天内碰到的3个rac节点问题 (r6笔记第36天)

说到问题,真是层出不穷,自己也算搭建了也不少的rac环境的,但是在本地试验的时候总是会碰到一些问题,昨晚铲掉旧环境,搭建了两遍rac环境,终于在凌晨搭建好了环境...

3117
来自专栏北京马哥教育

【深度解析】Linux系统启动流程

Linux系统启动流程大概总结下来是这么一个过程: POST-->BootLoader(MBR)-->Kernel(硬件探测、加载驱动、挂载根文件系统、/sbi...

2686
来自专栏散尽浮华

部署Zipkin分布式性能追踪日志系统的操作记录

Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务。 部署Z...

3896
来自专栏cs

linux学习笔记五

笔记摘抄自《linux操作系统基础及应用》 ---- 作业控制 正在执行的一个或者多个程序可形成一个作业。使用管道命令和重定向命令,一个作业可以启动多个进程...

2916
来自专栏喵了个咪的博客空间

原 EMQ百万级MQTT消息服务(ACL鉴权)

虽然EMQ已经搭建起来了,但是投入到业务使用中还面临着一些问题,当然MQTT设计之初也考虑了这一点,比如不是任何一个客户端都能链接到服务器和限制客户端能够对to...

3174
来自专栏性能与架构

体验 MySQL InnoDB Cluster

Mysql高可用环境的搭建比较麻烦,这使很多人都不去搭建高可用环境,等到有问题时再说 最近Mysql的动作很快,新版本的发布频繁,推出很多新的好用功能及插件,其...

4518
来自专栏陈本布衣

布衣之路(二):虚拟机的文件共享和网络模式

除夕之夜,当别的大神都在和家人一起辞旧岁,迎新年的时候,博主这样的小喽啰不敢懈怠,想着一年之计,当早做谋划,趁着别人嗨的时间,笔耕不辍的写篇日志,以此颇觉有意...

2607
来自专栏乐沙弥的世界

使用dbms_backup_restore包修改dbname及dbid

      修改dbname以及dbid通常在使用RMAN还原到异机之后需要更改dbname以及dbid的情形。对于这个修改我们可以借助于命令行下的nid工具来...

452

扫描关注云+社区