【ORA-16196】一个实例在其生命周期里最多只能装载和打开一个数据库

简介: 如果使用“alter database open;”命令打开一个曾经被“alter database close;”命令关闭的数据库时,您将会收到如下的报错信息:"ORA-16196: database has been previously opened and closed"这个报错的原因是什么呢?原因是:一个实例在其生存期中最多只能装载和打开一个数据库。


如果使用“alter database open;”命令打开一个曾经被“alter database close;”命令关闭的数据库时,您将会收到如下的报错信息:

"ORA-16196: database has been previously opened and closed"
这个报错的原因是什么呢?

原因是:
一个实例在其生存期中最多只能装载和打开一个数据库。
要想再打开此数据库,必须先停掉这个实例再重新启动数据库。

基于上面的报错信息和原因,我来通过一个实验来展示一下这个过程,以便有一个感性上的认识。

1.为了保证实验环境的“纯洁”,先重新启动一下数据库(这里我使用的Oracle版本是10.2.0.3)
ora10g@secDB /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Sun Oct 25 23:07:57 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size                  2074152 bytes
Variable Size             637536728 bytes
Database Buffers         1493172224 bytes
Redo Buffers               14700544 bytes
Database mounted.
Database opened.
sys@ora10g>

2.在数据库启动成功之后,我们通过v$database视图和v$instance视图查看一下当前数据库的状态,以便和close后的状态进行比较
sys@ora10g> select open_mode from v$database;

OPEN_MODE
----------
READ WRITE

sys@ora10g> select status from v$instance;

STATUS
------------
OPEN

可以看到现在的数据库状态是open并且是可读写操作的状态。

3.此时我们使用“alter database close;”命令关闭数据库(注意这里我的用词,关闭的是“数据库”不是“实例”)
执行这个命令需要等待一段时间才能完成,存在一个数据库连接清理的过程。如果在Oracle 9i的环境下使用这个close命令,若数据库中存在其他的连接,命令将无法完成,会收到“ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected”报错信息,这里的演示环境时10g,在10g中即使是存在着其他的连接也同样可以完成close过程。
sys@ora10g> alter database close;

Database altered.

4.再次查询v$database视图和v$instance视图中有关数据库状态的信息,与上面的信息进行比较
sys@ora10g> select open_mode from v$database;

OPEN_MODE
----------
MOUNTED

sys@ora10g> select status from v$instance;

STATUS
------------
MOUNTED

可以看到,此时数据库的状态已经变为“MOUNTED”的状态

进一步检查一下此时数据库服务器有关该实例的后台数据库进程信息。通过下面的结果信息可以进一步确信,“alter database close;”操作并没有将数据库的实例关闭,仅仅是将数据库的状态从“OPEN”状态带到了“MOUNT”状态
sys@ora10g> !ps -ef | grep 'ora_.*ora10g' | grep -v grep
oracle     867     1  0 22:31 ?        00:00:00 ora_pmon_ora10g
oracle     869     1  0 22:31 ?        00:00:00 ora_psp0_ora10g
oracle     871     1  0 22:31 ?        00:00:00 ora_mman_ora10g
oracle     873     1  0 22:31 ?        00:00:00 ora_dbw0_ora10g
oracle     875     1  0 22:31 ?        00:00:00 ora_dbw1_ora10g
oracle     877     1  0 22:31 ?        00:00:00 ora_lgwr_ora10g
oracle     879     1  0 22:31 ?        00:00:00 ora_ckpt_ora10g
oracle     881     1  0 22:31 ?        00:00:00 ora_smon_ora10g
oracle     883     1  0 22:31 ?        00:00:00 ora_reco_ora10g
oracle     887     1  0 22:31 ?        00:00:00 ora_mmon_ora10g
oracle     889     1  0 22:31 ?        00:00:00 ora_mmnl_ora10g

5.既然数据库的状态现在是mount状态,我们尝试使用open命令重新开启该数据库。结果很显然,在这样的状态下,我们是无法再次open该数据库的。
sys@ora10g> alter database open;
alter database open
*
ERROR at line 1:
ORA-16196: database has been previously opened and closed

6.使用oerr工具查看一下“ORA-16196”报错信息含义。从原因信息描述中可以非常清晰的得到具体的原因和后续的处理方法
sys@ora10g> ! oerr ora 16196
16196, 00000, "database has been previously opened and closed"
// *Cause:  The instance has already opened and closed the database,
//          which is allowed only once in its lifetime.
// *Action: Shut down the instance.

7.此时如果想要重新使用该数据库,只有按照上面提示信息中“Action:”部分描述的操作:关闭数据库并重新开启。
sys@ora10g> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup ;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size                  2074152 bytes
Variable Size             637536728 bytes
Database Buffers         1493172224 bytes
Redo Buffers               14700544 bytes
Database mounted.
Database opened.
sys@ora10g>
sys@ora10g> select open_mode from v$database;

OPEN_MODE
----------
READ WRITE

sys@ora10g> select status from v$instance;

STATUS
------------
OPEN

OK,到此,数据库又一个崭新的生命周期开始了。

8.小结
通过上面的演示,大家应该对“
一个实例在其生存期中最多只能装载和打开一个数据库。”这句话有了一个更加具体的理解。其实Oracle数据库的每一个状态都很值得认真研究,其中充满了N多令人神往的细节。

Good luck.

-- The End --
相关文章
|
1月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
1月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
114 61
|
1月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
109 57
|
1月前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
87 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
88 0
|
4月前
|
存储 Serverless API
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
33 0
|
4月前
|
数据库连接 数据库
Thinkphp6多数据库实例跨库操作
Thinkphp6多数据库实例跨库操作
77 0
|
4月前
|
前端开发 Java 关系型数据库
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
278 0
下一篇
DataWorks