ORA-01219:database not open:queries allowed on fixed tables/views only

本文解决了一个在尝试删除无用表空间时遇到的ORA-01219错误。通过检查数据库状态发现数据库处于挂起状态,并通过追踪错误到特定的数据文件。最终通过离线并删除问题文件,成功解决了此问题。

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

在删除一些没用的表空间时,报ORA-01219:database not open:queries allowed on fixed tables/views only错误,经网络查找方案终解决问题,这里记录下来做个总结。

ORA-01219错误解决方案:
ORA-01219:database not open:queries allowed on fixed tables/views only
“ORA-01219:数据库未打开:仅允许在固定表/视图中查询”的警告窗口!    
解决办法:


这一段是找出打开数据库的时候报错的地方
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 18 - see DBWR trace file
ORA-01110: data file 18: 'D:/qhms_db/EAS_D_EASDEV_STANDARD.dbf'
 
这里就是讲'D:/qhms_db/EAS_D_EASDEV_STANDARD.dbf'这个文件出问题
我们要做的就是删掉这个残留文件
进行下一步:
SQL> alter database datafile 'D:/qhms_db/EAS_D_EASDEV_STANDARD.dbf' offline drop;
Database altered.
SQL> alter database open;
Database altered.

<think>我们正在解决ORA-01109错误:数据库未打开。这个错误通常发生在尝试关闭数据库时,但数据库实际上并未处于打开状态。根据引用[2]的描述,用户可能手动删除了数据文件,导致数据库状态异常。但我们的问题是在执行`SHUTDOWN IMMEDIATE`时出现ORA-01109。 实际上,ORA-01109错误信息是“database not open”(数据库未打开)。当我们尝试关闭数据库时,数据库必须处于打开状态(OPEN)才能执行关闭操作。如果数据库已经处于未打开的状态(比如MOUNT或NOMOUNT),那么执行关闭命令就会出现这个错误。 因此,解决这个问题的关键是要先确认数据库当前的状态,然后根据状态执行相应的关闭操作。 步骤: 1. 首先,我们需要以sysdba身份连接到数据库实例(即使数据库没有打开,我们也可以连接到空闲实例)。 2. 查询数据库当前的状态。 3. 根据状态执行关闭命令。 具体操作如下: 步骤1:以sysdba身份连接 ```bash sqlplus / as sysdba ``` 如果上述命令因为权限问题无法执行(如报ORA-01031),则需要使用操作系统认证或者使用密码文件认证,例如: ```bash sqlplus sys/<password> as sysdba ``` 步骤2:查看数据库状态 ```sql SQL> SELECT status FROM v$instance; ``` 或者,如果无法查询,也可以尝试查看实例的运行状态,使用: ```sql SQL> SELECT instance_name, status, database_status FROM v$instance; ``` 可能的状态: - STARTED:实例已启动,但未加载控制文件(NOMOUNT状态) - MOUNTED:实例已加载控制文件,但未打开数据库(MOUNT状态) - OPEN数据库已打开 - OPEN MIGRATE:数据库以迁移模式打开 如果数据库处于MOUNTED或STARTED状态,那么执行`SHUTDOWN`命令时就不需要先打开数据库,而是可以直接关闭。 步骤3:根据状态关闭数据库 情况1:如果查询结果显示数据库状态为`OPEN`,那么重新尝试关闭命令: ```sql SQL> SHUTDOWN IMMEDIATE; ``` 情况2:如果数据库状态为`MOUNTED`或`STARTED`(即未打开),那么我们可以直接关闭: ```sql SQL> SHUTDOWN IMMEDIATE; ``` 或者,如果`SHUTDOWN IMMEDIATE`无效,可以尝试: ```sql SQL> SHUTDOWN ABORT; ``` 然后再次启动并正常关闭(用于清理状态): ```sql SQL> STARTUP; SQL> SHUTDOWN IMMEDIATE; ``` 注意:`SHUTDOWN ABORT`相当于强制关闭,可能会造成数据丢失,所以只有在其他方法无效时才使用。执行`SHUTDOWN ABORT`后,下次启动时数据库会进行实例恢复。 另外,如果数据库处于非正常状态(比如在启动过程中卡住),我们可以尝试先中止当前实例,然后再关闭。 如果上述方法都不能解决,那么可能是数据库内部存在错误,需要查看告警日志(alert log)来获取详细信息。 如何查看告警日志? 告警日志的位置由参数`background_dump_dest`决定,可以通过以下命令查询(即使数据库未打开,在NOMOUNT或MOUNT状态下也可以查询): ```sql SQL> SHOW PARAMETER background_dump_dest; ``` 在找到的目录中,查找`alert_<SID>.log`文件(SID为实例名)。 在告警日志中,我们可以查找最近的操作记录和错误信息,从而判断导致数据库无法正常关闭的原因。 总结步骤: 1. 连接到sysdba 2. 查看数据库状态 3. 根据状态执行关闭命令 4. 如果无法关闭,尝试使用`SHUTDOWN ABORT` 5. 如果问题持续,查看告警日志分析原因 注意:在执行任何关闭操作前,确保没有重要的业务在运行,避免数据丢失。 下面给出一个完整的例子: 假设我们遇到ORA-01109错误,尝试关闭数据库: ```sql SQL> SHUTDOWN IMMEDIATE; ORA-01109: database not open ``` 然后我们执行: ```sql SQL> SELECT status FROM v$instance; STATUS ------------ MOUNTED ``` 发现状态为MOUNTED,那么我们可以直接关闭: ```sql SQL> SHUTDOWN IMMEDIATE; Database closed. Database dismounted. ORACLE instance shut down. ``` 如果状态为NOMOUNT(在v$instance中显示为STARTED),同样可以关闭。 如果状态为OPEN,但是关闭时仍然报错,那么可能是数据库内部有活动的事务或者进程无法终止,此时可以尝试多次执行`SHUTDOWN IMMEDIATE`,或者使用`SHUTDOWN ABORT`。 如果以上步骤都无法解决,请检查告警日志。 引用说明: 引用[1]提到执行shutdown需要sysdba权限,所以我们在操作时确保使用sysdba连接。 引用[2]提到用户删除了数据文件导致数据库状态异常,因此如果我们的数据库因为文件损坏而无法打开,那么可能需要先进行恢复操作,然后再关闭。但我们的目标是关闭数据库,所以如果不需要修复,可以直接强制关闭(SHUTDOWN ABORT),然后在重新启动后进行恢复操作。 因此,我们优先尝试关闭数据库,如果因为文件损坏导致无法关闭,也可以使用SHUTDOWN ABORT强行关闭。 最后,生成相关问题:</think>要解决 Oracle 数据库执行 `SHUTDOWN IMMEDIATE` 时出现 ORA-01109: "database not open" 错误的问题,请按照以下步骤操作: ### 解决步骤 1. **确认数据库状态** 首先连接到空闲实例: ```bash sqlplus / as sysdba ``` 查询当前状态: ```sql SELECT status FROM v$instance; ``` - 如果返回 `MOUNTED`:数据库已加载控制文件但未打开 - 如果返回 `STARTED`:实例已启动但未加载控制文件 2. **尝试强制关闭数据库** 无论当前状态如何,执行强制关闭: ```sql SHUTDOWN ABORT; ``` > 注意:`ABORT` 是最高优先级的关闭方式,会立即终止所有会话[^1] 3. **重启并正常关闭** ```sql STARTUP; -- 正常启动 SHUTDOWN IMMEDIATE; -- 再次尝试正常关闭 ``` 4. **检查后台进程(如果问题持续)** 在操作系统层面检查 Oracle 进程: ```bash ps -ef | grep pmon # Linux tasklist | grep oracle # Windows ``` 如果发现残留进程,手动终止: ```bash kill -9 <PID> # Linux taskkill /F /PID <PID> # Windows ``` 5. **验证关闭结果** 最终确认实例状态: ```sql SELECT status FROM v$instance; -- 应返回 "SHUTTED DOWN" 或查询失败 ``` ### 常见原因分析 | 原因 | 解决方案 | |------|----------| | 数据库未完全打开 | 使用 `SHUTDOWN ABORT` 强制关闭 | | 存在挂起的恢复操作 | 重启后执行 `RECOVER DATABASE` | | 控制文件损坏 | 从备份恢复控制文件 | | 实例进程异常 | 手动终止残留进程后重启 | ### 预防措施 1. 避免直接删除数据文件等危险操作[^2] 2. 关键操作前备份控制文件: ```sql ALTER DATABASE BACKUP CONTROLFILE TO TRACE; ``` 3. 使用监控工具定期检查数据库状态 > 提示:如果数据库因文件损坏无法关闭,可能需要先进行恢复操作(`RECOVER DATABASE`)再关闭[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值