Oracle数据库的启动详解

Oracle数据库的启动详解

 

在启用Oracle数据库时,需要用到一个具有Sysdba权限的DBA用户连接到Oracle中,然后通过执行Startup语句来执行启动操作。在启动和关闭数据库时,无论数据库本身处于专用服务器模式还是共享服务器模式,具有Sysdba权限的用户将始终使用一个专用服务器进程连接到数据库中。

 

(1)数据库和实例的关系
每一个启动的数据库都对应一个实例。实例是Oracle用来管理数据库的一个实体,它由位于服务器中的内存结构和一系列服务进程组成。对于初学者来说,可以简单的将实例理解为Oracle数据库在运行时位于系统内存中的部分,而将数据库理解为运行时位于硬盘中的部分。
启动数据库时,将在内存中创建与该数据库对应的实例。一个实例只能访问一个数据库,而一个数据库可以被多个实例同时访问。


(2)数据库启动步骤
Oracle数据库的完整启动过程分为三个步骤:
2.1 创建并启动与数据库对应的实例。在启动实例时,将为实例创建一系列后台进程和服务进程,并且在内存中创建SGA区等内存结构。在实例启动的过程中只会使用到初始化参数文件,数据库是否存在对实例的启动并没有影响。如果初始化参数设置有误,实例将无法启动。
2.2 为实例加载数据库。加载数据库时,实例将打开数据库的控制文件,从控制文件中获取数据库名称、数据文件的位置和名称等关于数据库物理结构的信息,为打开数据库做好准备。如果控制文件损坏,实例将无法加载数据库。在加载阶段,实例将不会打开数据库的物理文件──数据文件和重做日志文件。
2.3 将数据库置为打开状态。在打开数据库时,实例将打开所有处于联机状态的数据文件和重做日志文件。如果在控制文件中列出的任何一个数据文件或重做日志文件无法正常打开,数据库将返回错误信息,这时需要进行数据库恢复。
2.4 只有将数据库置于打开状态后,数据库才处于正常运行状态,这时普通用户才能访问数据库。出于管理方面的要求,数据库的启动过程经常需要分步进行。很多情况下,数据库并不是直接完成上述三个步骤,而是先完成第1步或到第2步,然后执行必要的管理操作,最后再使数据库进入正常运行状态。因此,DBA需要根据不同的情况决定以不同的方式启动数据库,并且还需要在各种启动状态之间进行切换。

 

(3)启动数据库的准备
在准备启动实例之前,首先需要完成一些准备工作,包括启动Sql*plus并连接到Oracle。具体操作命令如下:
3.1 进入到命令模式,输入Sqlplus/nolog,以不连接数据方式启动Sqlplus;
3.2 以DBA身份连接Oracle,Connect user/pass as sysdba(OS认证可以不用输入用户名和口令,另外用户必须具备SysDba和SysOper权限)。


(4)指定初始化参数文件
使用Startup语句时,可以通过pfile参数指定一个服务器端初始化参数文件或文本初始化参数文件。Oracle需要从初始化参数文件中获得有关实例的参数配置信息。如果在执行Startup语句时没有指定Pfile参数,Oracle首先读取默认位置的服务器端初始化参数文件(SPFILE<SID>.ora),如果没有找到,Oracle将继续读取默认位置的文本初始化参数文件(init<SID>.ora)。默认的初始化参数文件位于<oracle_home\dbs>目录中。
如果使用非默认的文本初始化参数文件,首先定义一个初始化参数文件,例如名称为initweb.ora,然后直接通过“startup pfile=initweb.ora文件路径”来直接调用;如果使用非默认的服务器端初始化参数文件,首先定义一个spf_init.ora文件,文件内容为:spfile=文本初始化参数文件的路径,然后通过“startup pfile=spf_init.ora文件路径”进行调用。


 

(5)进入启动模式
数据库和实例的启动过程可以分为三个步骤进行,DBA可以根据实际情况的需要,以不同的模式启动数据库。常见的启动模式有如下三个层次(可以通过select status from v$instance来查询启动模式,Started表示nomount,Mounted表示Mount模式,Open表示数据库打开模式):
5.1 启动实例,但不加载数据库。即只完成启动步骤的第1步。在这种模式下,任何人都无法访问数据库,一般只有在进行创建数据库、重建控制文件等操作时才启用该模式。具体命令如下:
startup nomount。一般称之为Nomount模式。如果需要执行创建数据库和重建控制文件等维护操作需要使用该模式。在Nomount启动模式下,只能访问那些与SGA区相关的数据字典视图,包括V$PARAMETER、V$SGA、V$OPTION、V$PROCESS、V$VERSION、V$INSTANCE等,这些信息都是从SGA区中获取的,与数据库无关。
5.2 启动实例并加载数据库,但不打开数据库。即只完成启动步骤的第1步和第2步。在这种模式下只有DBA才能访问数据库,但是只能执行一些有限的管理操作。普通用户此时不能访问数据库。具体命令如下:
startup mount。一般称之为mount模式,这种模式将为实例加载数据库,但却保持数据库的关闭状态,这在进行一些特定的数据库维护工作时是十分必要的。如果需要执行重命名数据文件、添加-删除或重命名重做日志文件、执行数据库完全恢复操作、改变数据库的归档模式等维护操作时需要使用该模式。在Mount启动模式下,只能访问那些与控制文件相关的数据字典视图,包括V$THREAD、V$CONTROLFILE、V$DATABASE、V$DATAFILE、V$LOGFILE等,这些视图中的信息都是从控制文件中获取的。
5.3 启动实例并加载数据库,然后打开数据库使其处于可用状态。即完成全部3个启动步骤。这是正常的启动模式,所有的用户都能够访问数据库。正常启动模式又可以分为两种状态:非受限状态和受限状态。在受限状态下,只有DBA才能访问数据库;而在非受限状态下,所有用户都能够进行访问。具体命令如下:
startup。这是正常启动模式。普通数据库用户需要对数据库进行操作,比如连接数据库并进行查询,数据库必须处于Open启动模式。在这种启动模式下,任何合法的用户都能够连接到数据库,并进行常规的数据访问操作。使用不带任何子句的startup语句启动的数据库默认的处于非受限状态。


 

(6)切换启动模式
可以使用Alter database mount为实例加载数据库,也就是从Nomount启动模式切换到Mount启动模式;也可以使用Alter database open设置数据库为打开状态,也就是从Mount启动模式切换到Open启动模式。而且,Alter database命令只能使用这两种方法进行模式切换。其它模式之间都无法使用Alter database命令进行切换


 

(7)受限状态
在正常启动模式下,可以选择将数据库设置为非受限状态和受限状态。在受限状态下,只有具有管理权限的用户(DBA)才能够访问数据库。当需要进行如下数据库维护操作时,必须将数据库置于受限状态下:
7.1 执行数据导入和导出操作;
7.2 使用Sql*Loader提取外部数据;
7.3 需要暂时拒绝普通用户访问数据库;
7.4 进行数据库移植或者升级操作。
默认情况下,普通数据库用户只具有Create Session系统权限。只有具有Create Session权限的用户才能够连接到一个打开的数据库中,并且连接的数据库必须处于非受限状态。当打开的数据库被设置为受限状态时,仅具有Create Session权限的用户在访问数据库时将被拒绝。只有同时具有Create Session和Restricted Session系统权限的用户才能够访问受限状态的数据库。通常只将Restricted Session权限授予DBA用户,具有SysDba和SysOpen权限的用户也有权连接受限状态的数据库。
使用Startup Restrict启动数据库,数据库将进入受限状态的Open模式。如果在完成管理操作后需要将数据库恢复为非受限状态,可以使用Alter System语句来改变数据库的状态,执行该语句的用户必须具有Alter System系统权限。比如:Alter System Disable Restricted Session;如果需要在数据库运行过程中由非受限状态切换到受限状态,可以使用Alter System Enable Restricted session语句来实现。在进入受限状态后,系统中仍然可能存在活动的普通用户会话。因此,在开始执行任何DBA操作以前,必须手工终止这些会话。


 

(8)只读状态
在正常启动状态下,默认的数据库处于读写状态。此时,用户不但能够从数据库读取数据,而且还可以修改已有的数据库对象或创建新的数据库对象。在必要的时候,可以将数据库设置为只读状态。当数据库处于只读状态时,用户只能查询数据库,但是不能以任何方式对数据库对象进行修改。处于只读状态的数据库能够保证数据文件和重做日志文件不被修改,但是不限制那些不会写入数据文件和重做日志文件的操作。比如,在只读状态的数据库中,仍然能够将某个处于脱机状态的数据文件设置为联机状态,因为这项操作并不会产生联机信息。
可以使用Alter Database语句在数据库启动过程中以只读模式打开数据库,执行该语句的用户必须具有Alter Database系统权限,并且只能从Mount模式进行切换。具体命令为:Alter Database Open Read only;同样可以使用命令:Alter Database Open Read Write将数据库从Mount切换为读写的打开模式。


 

(9)强行启动数据库
在某些情况下,使用上述各种启动模式可能都无法成功启动数据库,这是需要强行启动数据库。在如下几种情况下需要强行启动数据库:
9.1 无法使用Shutdown normal、Shutdown immediate或者Shutdown Transactional语句关闭数据库实例;
9.2 在启动实例时出现无法恢复的错误;
当出现上述情况时,可以通过强行方式来重新启动一个新的数据库实例,以便进行故障查找和排除操作。强行启动数据库使用startup force命令实现。如果在强行启动时,数据库已经有一个实例正在运行,Oracle将首先关闭该实例,然后再重新为这个数据库启动一个新的实例。

 

补充:

Use the QUIESCE RESTRICTED andUNQUIESCE clauses to put the database in and take it out of thequiesced state. This state enables database administrators to perform administrative operations that cannot be safely performed in the presence of concurrent transactions, queries, or PL/SQL operations.

Note:

The QUIESCE RESTRICTED clause is valid only if the Database Resource Manager is installed and only if the Resource Manager has been on continuously since database startup in any instances that have opened the database.

If multiple QUIESCE RESTRICTED or UNQUIESCE statements issue at the same time from different sessions or instances, then all but one will receive an error.

 

QUIESCE RESTRICTED

Specify QUIESCE RESTRICTED to put the database in the quiesced state. For all instances with the database open, this clause has the following effect:

  • Oracle Database instructs the Database Resource Manager in all instances to prevent all inactive sessions (other thanSYS andSYSTEM) from becoming active. No user other thanSYS andSYSTEM can start a new transaction, a new query, a new fetch, or a new PL/SQL operation.

  • Oracle Database waits for all existing transactions in all instances that were initiated by a user other thanSYS orSYSTEM to finish (either commit or abort). Oracle Database also waits for all running queries, fetches, and PL/SQL procedures in all instances that were initiated by users other thanSYS orSYSTEM and that are not inside transactions to finish. If a query is carried out by multiple successive OCI fetches, then Oracle Database does not wait for all fetches to finish. It waits for the current fetch to finish and then blocks the next fetch. Oracle Database also waits for all sessions (other than those ofSYS orSYSTEM) that hold any shared resources (such as enqueues) to release those resources. After all these operations finish, Oracle Database places the database into quiesced state and finishes executing theQUIESCERESTRICTED statement.

  • If an instance is running in shared server mode, then Oracle Database instructs the Database Resource Manager to block logins (other thanSYS orSYSTEM) on that instance. If an instance is running in non-shared-server mode, then Oracle Database does not impose any restrictions on user logins in that instance.

During the quiesced state, you cannot change the Resource Manager plan in any instance.

 

UNQUIESCE

Specify UNQUIESCE to take the database out of quiesced state. Doing so permits transactions, queries, fetches, and PL/SQL procedures that were initiated by users other thanSYS orSYSTEM to be undertaken once again. The UNQUIESCE statement does not have to originate in the same session that issued theQUIESCERESTRICTED statement.

 

 一道面试题:

你在项目现场,用户要求你向正在运行的表中添加一个字段,你该怎么做?
第一种方法:关闭数据库,然后使用受限模式打开,由sys/sysdba来进行
第二种方法:不关闭数据库,将数据库置于静默状态在SYS/SYSDBA模式下用ALTER SYSTEM QUIESCE RESTRICTED,这种状态下只有SYS/SYSDBA才可以对数据库进行操作,修改完毕之后再退出静默状态ALTER SYSTEM UNQUIESCE
在这里复习到了数据库的两种特殊状态:静默状态(QUIESCE)和挂起状态
静默状态就是只有特殊权限的SYS/SYSDBA才可以对数据库进行操作,使用ALTER SYSTEM QUIESCE RESTRICTED以后系统将等候活动着的会话主动结束,同时阻止建立新的会话,系统挂起所有的SQL语句,等恢复以后再重新激活会话执行挂起的SQL。
挂起状态就是系统将数据库所有对物理文件(数据文件,控制文件,日志文件)的I/O操作都暂停,但是并不禁止非DBA用户对数据库进行操作。这种状态主要用于进行数据库备份。

 

如何从用SQL语句从一个表中删除一个字段。
alter   table   表名     drop     column   字段名
如何用SQL语句增加一个字段并设置其默认值为True
alter   table   表名     Add       字段名   varchar(10)   default   ( 'True ')

alter   table   tablename     drop     column   columnname

alter   table   tablename         add       columnname   varchar(10)   default   ( 'True ')

 

注意:不能drop掉SYS用户中某个表的某个字段,以下是我测试时遇到的错误

sys@ORCL> alter table t drop column colname;
alter table t drop column colname
*
ERROR at line 1:
ORA-12988: cannot drop column from table owned by SYS

 

SQL> create or replace procedure emp_sal
  2  is
  3  v_last_name employee.last_name%type;
  4  v_employee_id employee.employee_id%type;
  5  v_salary employee.salary%type;
  6  cursor cursor_sal is
  7  select last_name,employee_id,salary from employee where salary between 2000 and 3000;
  8  begin
  9  open cursor_sal;
 10  loop
 11  fetch cursor_sal into v_last_name,v_employee_id,v_salary;
 12  exit when cursor_sal%notfound;
 13  update employee set salary=salary*1.2 where last_name=v_last_name and employee_id=v_employee_id;
 14  end loop;
 15  close cursor_sal;
 16  commit;
 17  end;
 18  /

Procedure created.

 

--End--

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值