oracle数据库启动停止操作

在Linux Unix环境下启动和关闭oracle实例,一般采用startup和shutdown来完成。
startup启动oracle数据库时,有如下常用的选项:
  一:startup nomount
   该选项仅仅创建一个Oracle实例。读取init.ora初始化参数文件、启动后台进程、初始化系统全局区(SGA)。Init.ora文件定义了实例的配置,包括内存结构的大小和启动后台进程的数量和类型等。使用这种启动方式,一般用来:重建控制文件、重建数据库等操作。
RMAN> startup nomount
已连接到目标数据库 (未启动)
Oracle 例程已启动
系统全局区域总计     135338868 字节
Fixed Size                      453492 字节
Variable Size                109051904 字节
Database Buffers              25165824 字节
Redo Buffers                    667648 字节
  二:startup mount
    安装启动,这种启动方式打开控制文件,确认数据文件和联机日志文件的位置,但此时不对数据文件和日志文件进行校验检查。使用这种启动方式,一般用来:数据库日志归档、数据库介质恢复、使数据文件联机或脱机、重新定位数据文件和重做日志文件。
RMAN> startup nomount
已连接到目标数据库 (未启动)
Oracle 例程已启动
系统全局区域总计     135338868 字节
Fixed Size                      453492 字节
Variable Size                109051904 字节
Database Buffers              25165824 字节
Redo Buffers                    667648 字节
  三:startup open、startup
    正常打开数据库。
RMAN> startup
已连接到目标数据库 (未启动)
Oracle 例程已启动
数据库已加载
数据库已打开
系统全局区域总计     135338868 字节
Fixed Size                      453492 字节
Variable Size                109051904 字节
Database Buffers              25165824 字节
Redo Buffers                    667648 字节
  四:startup restrict
    约束方式启动,这种方式能够启动数据库,但只允许具有一定特权的用户访问。非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用

在Oracle中,有时候要执行一些管理性的操作,而这些操作运行的时候不能有其他用户同时访问数据库。对于这种情况可以设置系统进入RESTRICTED SESSION状态禁止普通用户登陆数据库。
SQL> startup restrict
ORACLE 例程已经启动。

Total System Global Area 5279498240 bytes
Fixed Size 2094528 bytes
Variable Size 3192597056 bytes
Database Buffers 2080374784 bytes
Redo Buffers 4431872 bytes数据库装载完毕。数据库已经打开。
SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

警告: 您不再连接到 ORACLE。
SQL> conn / as sysdba已连接。
SQL> select granted_role from dba_role_privs
2 where grantee = 'TEST';

GRANTED_ROLE
------------------------------------------------------------
CONNECT
RESOURCE

SQL> grant dba to test;

授权成功。

SQL> conn test/test已连接。
SQL> conn / as sysdba已连接。
SQL> revoke dba from test;

撤销成功。

SQL> grant restricted session to test;

授权成功。

SQL> conn test/test已连接。

可以看到,当数据库以RESTRICT状态启动,或者进入到RESTRICT状态,则Oracle禁止普通用户连接数据库。而拥有DBA角色的用户,或者拥有 RESTRICTED SESSION权限的用户可以登陆数据库。

在Oracle11g的管理员手册文档中有一个地方的描述错误:
Further, when the instance is in restricted mode, a database administrator cannot access the instance remotely through an Oracle Net listener, but can only access the instance locally from the machine that the instance is running on. 根据文档的描述,如果数据库处于RESTRICTED SESSION状态,则禁止用户采用NET服务方式登陆,而必须在服务器上直接登陆,但是测试发现 ,Oracle并没有这个限制。

SQL> conn / as sysdba已连接。
SQL> alter system disable restricted session;

系统已更改。

SQL> conn test/test@test11g已连接。
SQL> conn / as sysdba已连接。
SQL> alter system enable restricted session;

系统已更改。

SQL> conn test/test@test11g已连接。

无论是在本机通过服务名方式,还是在其他客户端通过服务名方式都可以连接到RESTRICTED SESSION状态的数据库,只要登陆用户拥有RESTRICTED SESSION权限。

下面再来看看RESTRICTED SESSION状态,对于已经登陆数据库的普通用户有何影响:

SQL> conn / as sysdba已连接。
SQL> revoke restricted session from test;

撤销成功。

SQL> alter system disable restricted session;

系统已更改。

在会话1,回收TEST用户的RESTRICTED SESSION权限,使其变为普通用户。并将数据库从RESTRICTED SESSION状态转为正常状态。

下面在会话2用TEST用户登陆数据库:

SQL> CONN TEST/test已连接。
SQL> SET SQLP 'SQL2> '
SQL2> SELECT * FROM SESSION_PRIVS;

PRIVILEGE
--------------------------------------------------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

已选择10行。

下面回到会话1,将数据库置于RESTRICT SESSION状态:

SQL> alter system enable restricted session;

系统已更改。

执行RESTRICTED SESSION命令很快就返回了,说明命令已经执行成功,下面尝试普通用户登陆:

SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

警告: 您不再连接到 ORACLE。

登陆报错,说明RESTRICT状态已经生效,回到会话2,看看数据库的RESTRICTED SESSION状态对已经登陆的普通会话是否有影响:

SQL2> SELECT * FROM DUAL;

DU
--
X

SQL2> CREATE TABLE T1 (ID NUMBER);
CREATE TABLE T1 (ID NUMBER)
*第 1 行出现错误:
ORA-01536: 超出表空间 'YANGTK' 的空间限额

SQL2> CREATE OR REPLACE PROCEDURE P AS
2 BEGIN
3 NULL;
4 END;
5 /

过程已创建。

虽然建表语句失败了,但是这时由于刚才回收DBA角色,导致UNLIMITED TABLESPACE权限被连带回收造成的,与RESTRICTED SESSION的状态无关。 可以看到,虽然数据库处于RESTRICTED SESSION状态,但是数据库中已经登陆的会话可以继续执行任何操作,直到会话断开连接。 这个现象说明,如果希望数据库处于RESTRICTED SESSION状态,且此时不希望普通用户登陆数据库,那么最好的方法是采用STARTUP RESTRICT 的方式来启动数据库,这样可以确保没有普通用户登陆。而ALTER SYSTEM ENABLE RESTRICTED SESSION的方式虽然可以使得数据库进入 RESTRICT状态,但是不能保证现有的连接用户都是具有RESTRICTED SESSION权限的。即使是在STARTUP之后,马上发出ENABLE RESTRICTED SESSION命令也是不可靠的,因为这个时间差可能使得后台JOB运行了。因此如果是使用ENABLE RESTRINCTED SESSION方式,还需要在后台通过 ALTER SYSTEM KILL SESSION的方式清除掉所有的普通用户连接。

最后来看看RESTRICTED SESSION状态和RAC环境的关系。

RESTRICTED命令是在实例上执行的,因此Oracle是否将这个命令应用到整个RAC环境需要通过测试来说明。 为了更好的说明情况,下面的测试在一个三节点的RAC环境中进行,其中两个节点处于启动状态,另一个节点关闭。 随后在实例1上发出ALTER SYSTEM ENABLE RESTRICTED SESSION语句,检查这个操作对实例2是否生效,将实例3启动,检查这个限制新启动的 实例3是否有效。

bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is running on node racnode3
bash-2.03$ srvctl stop inst -d testrac -i testrac3
bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is not running on node racnode3
bash-2.03$ sqlplus test/test@testrac1

SQL*Plus: Release 10.2.0.3.0 - Production on 星期四 2月 19 23:09:47 2009

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

连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

已选择14行。

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac1

将实例1变为RESTRICTED SESSION状态:

SQL> conn sys@testrac1 as sysdba输入口令: 已连接。
SQL> alter system enable restricted session;

系统已更改。

SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

警告: 您不再连接到 ORACLE。
SQL> conn test/test@testrac2已连接。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac2

显然实例1上的设置与实例2无关,对于实例3而言其实都不用测试,因为数据库启动的时候没有指定STARTUP RESTRICT,自然不会启用

RESTRICTED SESSION状态,不过为了严谨,还是测试一下:

SQL> host
$ srvctl start inst -d testrac -i testrac3
$ exit

SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

警告: 您不再连接到 ORACLE。
SQL> conn test/test@testrac3已连接。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac3

SQL> select instance_name, status, logins from gv$instance;

INSTANCE_NAME STATUS LOGINS
---------------- ------------ ----------
testrac3 OPEN ALLOWED
testrac2 OPEN ALLOWED
testrac1 OPEN RESTRICTED

对于RESTRICTED SESSION状态,RAC环境的各个实例之间是相互独立的,各自的状态完全由各自的实例进行设置。
五:startup force
强制启动方式,当不能关闭数据库时,可以用startup force来完成数据库的关闭,先关闭数据库,再执行正常启动数据库命令

六、startup pfile=参数文件名
带初始化参数文件的启动方式,先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:Oracleadminoradbpfileinit.ora

七、startup EXCLUSIVE
   只允许当前的例程读取数据库。

shutdown关闭oracle数据库有如下选项:
  一:shutdown normal 
         正常关闭数据库,如果shutdown不带任何参数,默认为normal。发出该命令后,任何新的连接都将再不允许连接到数据库。在数据库关闭 之前,Oracle将等待目前连接的所有用户都从数据库中退出后才开始关闭数据库。采用这种方式关闭数据库,在下一次启动时不需要进行任何的实例恢复。但需要注意一点的是,采用这种方式,也许关闭一个数据库需要几天时间,也许更长。
  二:shutdown immediate
         立即关闭。这是我们常用的一种关闭数据库的方式,想很快地关闭数据库,但又想让数据库干净的关闭,常采用这种方式。当前正在被Oracle处理的SQL语句立即中断,系统中任何没有提交的事务全部回滚。如果系统中存在一个很长的未提交的事务,采用这种方式关闭数据库也需要一段时间(该事务回滚时间)。系统不等待连接到数据库的所有用户退出系统,强行回滚当前所有的活动事务,然后断开所有的连接用户。
   三:shutdown transactional
         表示尽量少的影响客户端,避免客户丢失客户信息。该选项仅在Oracle 8i后才可以使用。该命令常用来计划关闭数据库,它使当前连接到系统且正在活动的事务执行完毕,运行该命令后,任何新的连接和事务都是不允许的。在所有活动的事务完成后,数据库将和SHUTDOWN IMMEDIATE同样的方式关闭数据库。
     四:shutdown abort
         表示放弃所有事务立即关闭。 这是关闭数据库的最后一招,也是在没有任何办法关闭数据库的情况下才不得不采用的方式,一般不要采用。如果下列情况出现时可以考虑采用这种方式关闭数据库。
1、 数据库处于一种非正常工作状态,不能用shutdown normal或者shutdown immediate这样的命令关闭数据库;
2、 需要立即关闭数据库;
3、 在启动数据库实例时遇到问题;
所有正在运行的SQL语句都将立即中止。所有未提交的事务将不回滚。Oracle也不等待目前连接到数据库的用户退出系统。下一次启动数据库时需要实例恢复,因此,下一次启动可能比平时需要更多的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值