您可以更改数据库的可用性。您可能希望这样做是为了出于维护原因限制访问或使数据库只读。
将数据库挂载到实例
在执行特定的管理操作时,必须启动数据库并将其挂载到实例,但必须关闭数据库。您可以通过启动实例并挂载数据库来实现此场景。
-
要将数据库挂载到一个已启动但未打开的实例上,请使用
ALTER DATABASE
语句和MOUNT
子句,如下所示:ALTER DATABASE MOUNT;
打开已关闭的数据库
当数据库已挂载但已关闭时,您可以打开它,使其可供一般使用。
-
打开已挂载的数据库,使用
ALTER DATABASE
SQL语句和OPEN
子句:ALTER DATABASE OPEN;
执行此语句后,任何具有 CREATE SESSION
系统权限的 Oracle 数据库用户都可以连接数据库。
以只读模式打开数据库
以只读模式打开数据库使您能够查询打开的数据库,同时消除在线数据内容更改的任何可能性。
虽然以只读模式打开数据库可以保证不写入数据文件和重做日志文件,但它不会限制数据库恢复或在不生成重做的情况下更改数据库状态的操作。例如,您可以将数据文件脱机或联机,因为这些操作不会影响数据内容。
如果对只读模式下的数据库的查询使用临时表空间(例如执行磁盘排序),则查询的发出者必须将本地管理的表空间分配为默认临时表空间。否则,查询将失败。
下面的语句以只读模式打开数据库:
ALTER DATABASE OPEN READ ONLY;
还可以以读/写模式打开数据库:
ALTER DATABASE OPEN READ WRITE;
但是,读/写是默认模式。
只读数据库的限制
- 应用程序在对只读数据库执行时不能写入数据库对象。例如,应用程序在插入、删除、更新或合并数据库表(包括全局临时表)中的行时写入数据库对象。应用程序在操作数据库序列时写入数据库对象。应用程序在锁行、运行 EXPLAIN PLAN 或执行 DDL 时写入数据库对象。Oracle 提供的 PL/SQL 包中的许多函数和过程,比如 DBMS_SCHEDULER,都是写数据库对象的。如果应用程序调用这些函数和过程中的任何一个,或者执行上述任何操作,则应用程序写入数据库对象,因此不是只读的。
- 在只读数据库上执行时,在使用另一个数据库链接之前,必须提交或回滚涉及一个数据库链接的任何正在进行的事务。即使在第一个数据库链接上执行通用
SELECT
语句并且事务当前是只读的,也是如此。 - 不能在只读数据库上编译或重新编译 PL/SQL 存储过程。为了最小化由于远程过程调用而导致的 PL/SQL 无效,请在对只读数据库进行远程过程调用的任何会话中使用
REMOTE_DEPENDENCIES_MODE=SIGNATURE
。 - 如果从未在数据库上调用过远程过程,则不能从只读数据库调用远程过程(甚至是只读远程过程)。此限制适用于匿名 PL/SQL 块和 SQL 语句中的远程过程调用。您可以将远程过程调用放在存储过程中,也可以在数据库变为只读之前在数据库中调用远程过程。
限制对开放数据库的访问
当数据库处于受限模式时,只有具有 RESTRICTED
SESSION
权限的用户才能发起新的连接。以 SYSDBA
身份连接或与 DBA
角色连接的用户具有此特权。
将一个已经运行的实例置于受限模式:
- 运行 SQL 语句
ALTER SYSTEM
并启用RESTRICTED SESSION
子句。
当您将一个正在运行的实例置于受限模式时,不会终止用户会话或以其他方式影响用户会话。因此,在将实例置于受限模式后,请考虑在执行管理任务之前杀掉(终止)所有当前用户会话。
要将实例从受限模式中解除,请使用 ALTER SYSTEM
和 DISABLE RESTRICTED SESSION
子句。