ORA-01586: 对于此操作, 数据库必须以 EXCLUSIVE 模式装载且不打开

本文详细介绍了在Oracle RAC环境下,如何正确地关闭和删除数据库实例的步骤。面对在exclusive模式下删除数据库时遇到的ORA-01586错误,以及在尝试设置SPFILE参数时出现的ORA-32000错误,文章提供了具体的解决方案,包括调整集群参数、处理资源争抢问题等关键操作。

问题描述

删除rac实例的时候,关库后,在一个节点mount exclusive restrict后drop数据库时报错:

SQL> drop database;
drop database
*
ERROR at line 1:
ORA-01586: 对于此操作, 数据库必须以 EXCLUSIVE 模式装载且不打开

以为是需要两个节点都需要mount exclusive restrict。所以讲两个节点都mount到了exclusive模式,但是drop db依旧报这个错。

问题解决

1.先停止所有节点实例
2.在其中一节点操作,先关闭rac模式

SQL> startup nomount;
SQL> alter system set CLUSTER_DATABASE=FALSE scope=spfile;
SQL> shutdown immediate;

3.启动mount restric模式

SQL> startup mount restrict;

4.删除数据库

drop database;

节点1:

SQL> shutdown abort
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
[oracle@testrac1 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期四 5月 28 10:42:52 2020

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

Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 6.4137E+10 bytes
Fixed Size            2269072 bytes
Variable Size         3.6776E+10 bytes
Database Buffers     2.7246E+10 bytes
Redo Buffers          112762880 bytes
SQL> alter system set CLUSTER_DATABASE=FALSE scope=spfile;
alter system set CLUSTER_DATABASE=FALSE scope=spfile
*
ERROR at line 1:
ORA-32000: ????? SPFILE, ?? SPFILE ????


SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
[oracle@testrac1 dbs]$ export NLS_LANG=american_america.zhs16gbk
[oracle@testrac1 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu May 28 10:45:18 2020

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> alter system set CLUSTER_DATABASE=FALSE scope=spfile;
alter system set CLUSTER_DATABASE=FALSE scope=spfile
*
ERROR at line 1:
ORA-32000: write to SPFILE requested but SPFILE is not modifiable

报了ORA-32000: write to SPFILE requested but SPFILE is not modifiable肯定是参数文件有问题

因为当时要恢复一套rac在这套rac上,所以节点1的pfile已经不是需要删除的实例的pfile了,所以在节点2手动修改pfile:

#*.cluster_database=TRUE
*.cluster_database=FALSE

修改后通过pfile创建spfile

[oracle@testrac2 dbs]$ !sql
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期四 5月 28 10:55:51 2020

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

Connected to an idle instance.

SQL> create spfile ='+racdb_data/racdb/spfileracdb.ora' from pfile;

File created.

直接在节点2操作:

SQL> startup mount restrict;
ORA-01102: cannot mount database in EXCLUSIVE mode

看到一篇博客也报这个错但是是通过删除 lk{$ORACLE_SID}解决 (未核验) :ORA-01102: cannot mount database in EXCLUSIVE mode解决
这个问题的原因是资源争抢。想到节点1并没有关闭,因此肯定无法将库以restrict模式打开。

节点1释放:

[oracle@testrac1 dbs]$ !sql
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu May 28 11:04:33 2020

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> shutdown immediate
ORA-01507: database not mounted


ORACLE instance shut down.

节点2重新开库:

SQL> startup mount exclusive restrict;
ORACLE instance started.

Total System Global Area 5.3447E+10 bytes
Fixed Size            2265864 bytes
Variable Size         3.0870E+10 bytes
Database Buffers     2.2549E+10 bytes
Redo Buffers           26480640 bytes
Database mounted.

再次确认实例名是不是要删掉的那个

SQL> show parameter instance;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
active_instance_count             integer
cluster_database_instances         integer     1
instance_groups              string
instance_name                 string     racdb2
instance_number              integer     2
instance_type                 string     RDBMS
open_links_per_instance          integer     4
parallel_instance_group          string
parallel_server_instances         integer     1

删库

SQL> alter system enable restricted session;

System altered.

SQL> drop database;

Database dropped.

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> exit
[oracle@testrac2 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期四 5月 28 11:28:01 2020

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

Connected to an idle instance.

SQL> exit
Disconnected
<think> 我们正在处理一个Oracle数据库错误:当尝试创建表空间时,系统提示“ORA-01501: CREATE DATABASE 失败”和“ORA-01100: 数据库已安装”。根据引用[1]和引用[2],问题在于数据库已经装载(或已安装),因此在创建表空间前需要确保数据库处于正确的状态。 引用[1]中的解决方法是:在创建表空间之前,先关闭数据库,然后重新启动数据库,再以DBA权限登录,但这样做之后问题依旧。后来,该用户通过恢复tnsnames.ora文件中的EXTPROC_CONNECTION_DATA配置,然后成功创建了表空间。 引用[2]提到,常见的解决方案包括在建库时使用“C##”前缀(这是Oracle 12c及之后版本的多租户特性要求)或修改可插拔数据库(PDB)的状态,但这个问题可能由于其他原因引起。 我们注意到错误信息中的“ORA-01100: 数据库已安装”意味着数据库已经装载(mounted)或打开(open),此时能执行创建数据库操作。但是,用户的操作是创建表空间(tablespace),而是创建数据库。因此,我们需要分析为什么创建表空间会触发创建数据库的错误。 实际上,在Oracle中,创建表空间通常需要重新创建数据库。然而,错误信息提示“ORA-01501: CREATE DATABASE 失败”和“ORA-01100: 数据库装载”可能是由于数据库状态异常或配置问题导致的。 根据引用[1]的经验,问题可能与Oracle的网络配置(tnsnames.ora)有关。具体来说,缺少EXTPROC_CONNECTION_DATA条目可能导致数据库服务异常,进而影响表空间创建。 因此,解决步骤可能包括: 1. 检查tnsnames.ora文件,确保EXTPROC_CONNECTION_DATA配置存在正确。 2. 如果该配置缺失,从备份中恢复或手动添加(如引用[1]所示)。 3. 重启数据库服务,然后重试创建表空间。 另外,我们也要考虑数据库当前的状态。如果数据库已经打开,那么创建表空间是允许的,但出现该错误可能意味着内部状态异常。因此,也可以尝试重启数据库到mount状态再创建表空间?但注意,表空间创建通常是在数据库打开状态下进行的。 然而,根据Oracle官方文档,ORA-01100错误表示数据库已经装载(mounted),而创建数据库操作只能在实例启动但数据库装载时进行。所以,这里可能是由于某种原因,创建表空间的命令被错误地解析为创建数据库?或者是因为数据库状态异常? 另一种可能性是,用户可能在创建表空间之前执行了创建数据库的命令,而该命令因为数据库已经存在而失败。但用户的问题描述中,他们是在安装数据库后创建表空间时出错,所以可能是数据库安装未完成或安装异常。 但根据引用[1]的解决过程,修复tnsnames.ora文件后问题解决。因此,我们优先按照这个思路来解决。 具体步骤: 1. 检查$ORACLE_HOME/network/admin/tnsnames.ora文件,查看是否有EXTPROC_CONNECTION_DATA的配置。 2. 如果没有,则添加以下配置(根据引用[1]的配置): ``` EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) ``` 3. 保存文件,并重启数据库实例(以及监听器,如果需要的话): ```bash lsnrctl stop lsnrctl start sqlplus / as sysdba SQL> shutdown immediate SQL> startup ``` 4. 再次尝试创建表空间。 如果问题仍然存在,则考虑以下步骤: 5. 检查数据库状态:`select status from v$instance;`,正常应该是OPEN。 6. 尝试重新运行数据库创建脚本(如果数据库安装完全)?但这有一定风险,需谨慎。 然而,引用[2]中提到,该错误可能是因为在创建数据库时没有遵循多租户架构的命名规则(即没有使用C##前缀)?但注意,这个错误是在创建表空间时出现的,而是创建用户。因此,这个原因可能适用。 因此,我们优先按照网络配置修复的方法。 最后,如果以上方法无效,可能需要检查Oracle的日志文件(alert.log和跟踪文件)以获取更详细的错误信息。 总结解决方案: 1. 修复tnsnames.ora文件,确保EXTPROC_CONNECTION_DATA存在。 2. 重启数据库和监听器。 3. 重试创建表空间。 根据引用[1]的经验,这个方法通常可以解决问题。 注意:在修改配置文件前,建议备份原文件。 下面给出详细步骤: </think>### 解决ORA-01501/ORA-01100创建数据库错误的方法 #### 错误原因分析 当Oracle提示以下错误时: ```sql ORA-01501: CREATE DATABASE 失败 ORA-01100: 数据库装载 ``` 表示数据库实例已启动处于装载状态(MOUNTED),此时无法执行`CREATE DATABASE`操作。常见原因包括: 1. **数据库已存在**:实例已关联现有数据库文件 2. **安装完整**:数据库安装过程异常中断 3. **配置冲突**:监听器配置(tnsnames.ora)缺失或损坏[^1] --- ### 解决方案步骤 #### 1️⃣ 检查数据库状态 ```sql SQL> SELECT status FROM v$instance; ``` - 若返回 **`MOUNTED`** 或 **`OPEN`** → 需关闭现有实例 - 若返回 **`STARTED`** → 继续创建流程 #### 2️⃣ 关闭现有数据库实例 ```sql SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP NOMOUNT; --装载启动实例 ``` #### 3️⃣ 创建数据库(关键步骤) ```sql SQL> CREATE DATABASE YXGTCS 2 USER SYS IDENTIFIED BY your_password 3 USER SYSTEM IDENTIFIED BY your_password 4 LOGFILE GROUP 1 ('/u01/oradata/YXGTCS/redo01.log') SIZE 100M 5 MAXLOGFILES 5 6 MAXDATAFILES 100 7 CHARACTER SET AL32UTF8; -- 推荐UTF8字符集 ``` #### 4️⃣ 修复监听配置 检查`$ORACLE_HOME/network/admin/tnsnames.ora`,确保包含: ```ini EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (CONNECT_DATA = (SID = PLSExtProc)) ) ``` 缺失时需从备份恢复或手动添加[^1] #### 5️⃣ 重启验证 ```sql SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP; SQL> SELECT name, open_mode FROM v$database; -- 验证状态 ``` --- ### 注意事项 1. **权限要求**:需以`SYSDBA`身份操作 ```sql SQL> CONN / AS SYSDBA ``` 2. **文件路径**:确保数据文件目录存在有写入权限 3. **多租户环境**:若使用CDB/PDB架构,需添加`C##`前缀[^2] 4. **日志分析**:检查`alert_<SID>.log`获取详细错误信息 ### 预防措施 - 首次安装后勿跳过数据库创建向导 - 定期备份`tnsnames.ora`和`listener.ora` - 使用DBCA(Database Configuration Assistant)可视化建库 > 通过以上步骤,可解决因数据库状态冲突导致的创建失败问题。若仍报错,需检查存储空间和文件权限[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值