1.数据库的四种状态
如图 1-1 所示,Oracle 实例分为四种状态,分别为:
关闭(SHUTDOWN)、非装载(NOMOUNT 启动)、装载(MOUNT)、打开(OPEN)
如果实例没有打开,以普通用户身份时,会报错。
访问 Oracle 数据库首先要启动数据库,管理员连接到空闲实例,然后才能发出启动实 例或数据库的命令。
启动 Oracle 服务器,每个阶段会打开不同的文件并且会完成不同的管理任务。
2.启动数据库的相关指令
? 数据库的启动命令是 STARTUP,在使用 STARTUP 命令启动数据库的时候首先需要使用初始化参数,并可以将数据库以不同的方式打开。
2.1数据库状态命令
2.1.1 启动数据库
? 执行命令 STARTUP,要求用户必须具有 SYSDBA 或 SYSOPER 系统权限,另外,如果要建立数据库,则必须以 SYSDBA 身份登录。该命令具体格式如下:
STARTUP [ FORCE ] [ RESTRICT ] [ PFILE = filename ] [ OPEN [ RECOVER ] [ database ] | MOUNT | NOMOUNT ]
解释:
OPEN:启动实例,装载并打开数据库,为默认选项。
MOUNT:启动实例并装载数据库,但不打开数据库。
NOMOUNT:启动实例,但不装载数据库。
PFILE=:指定用于启动实例的非默认初始化参数文件名。
FORCE:强制终止实例,并重新启动数据库。 (不要使用,因为在关闭时是使用shutdown abort关闭)
RESTRICT:启动后只允许具有 RESTRICTED SESSION 权限的用户访问数据库。
RECOVER:在数据库启动时,进行介质恢复。
2.1.2 修改数据库
? 要使数据库由 NOMOUNT 进入 MOUNT 阶段或由 MOUNT 进入 OPEN 阶段,需要使 用 ALTER DATABASE 命令:
ALTER DATABASE { MOUNT | OPEN }
? 要显示数据库的当前处于的启动状态,可以使用如下语句查询:
SELECT status FROM v$instance;
STATUS 列显示了 V$INSTANCE 视图对数据库状态的描述:
● STARTED 数据库处于启动状态(NOMOUNT)
● MOUNTED 数据库处于装载状态(MOUNT)
● OPEN 数据库出于正常打开状态(OPEN)
● OPEN MIGRATE 数据库以升级或降级模式打开(UPGRADE | DOWNGRADE)
用户可以在数据库关闭状态下直接执行 STARTUP 或 STARTUP OPEN 打开数据库。
Tips:当我们使用 SQLPLUS 连接进入数据库时,将会看到提示。如果提示信息如下:
连接到空闲实例,即数据库处于关闭状态。
[oracle@ogg ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Mon Jun 21 10:26:07 2021
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to an idle instance.
连接到正在开启的实例
[oracle@ogg ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Mon Jun 21 10:23:40 2021
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
2.2数据库模式指令
2.2.1只读模式打开数据库
? 在正常启动状态下,默认数据库进入读写状态(ReadWrite)。在必要时可以将数据库设置为只读状态(ReadOnly)。在只读状态下,用户只能查询数据库,但不能以任何方式对 数据库对象进行修改。
? 但要注意,在只读状态下,数据库还可以进行数据库的恢复或者一些维护操作操作,比 如:数据文件仍然可以联机和脱机,已脱机的数据文件或表空间可以进行恢复。对其他文件如控制文件、跟踪文件、审计文件、警告文件等仍然可以继续写入。 使用如下命令,使数据库进入只读状态或进入读写状态。
1. STARTUP OPEN [ READ WRITE | READ ONLY ]
2. ALTER DATABASE OPEN [ READ WRITE | READ ONLY ]
其中:
READ WRITE:进入读写状态
READ ONLY:进入只读状态
#以 READ ONLY 模式打开数据库
SQL> startup open read only;
#尝试创建表
SQL> create table scott_dept nologging as select * from scott.dept;
create table t11 nologging as select * from scott.dept * ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
#尝试对表数据进行查询
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- ------------- 10 ACCOUNTING NEW YORK
20 DBA BEIJING
30 SALES CHICAGO
40 OPERATIONS BOSTON
? 数据库在 READ ONLY 模式下,对对象的 DDL(创建、修改、丢弃、截断)、DML(插 入、更新、删除)等操作都不被允许。可以对数据库中对象进行查询。
2.2.2限制模式打开数据库
? 数据库管理员可以使用限制模式打开数据库。限制模式只允许具有 RESTRICTED SESSION 权限的用户进行连接,普通用户则不能连接。 当数据库管理员对数据库进行特定的维护操作,比如导入导出数据、装载数据、迁移数据库等等时,可以将数据库置为限制模式。
STARTUP RESTRICT ;
启动数据库时,将数据库置为限制模式。
ALTER SYSTEM ENABLE RESTRICTED SESSION ;
数据库启动后,将数据库改为限制模式。
ALTER SYSTEM DISABLE RESTRICTED SESSION ;
取消数据库的限制模式。
3.实例启动与关闭
3.1启动NOMOUNT阶段
? 启动实例到nomount,状态为STARTED
#启动前查看进程
[oracle@ogg ~]$ ps -ef|grep ora_
oracle 14676 1922 0 11:28 pts/0 00:00:00 grep --color=auto ora_
#启动数据库
SQL> startup nomount
ORACLE instance started.
Total System Global Area 768294912 bytes
Fixed Size 2257192 bytes
Variable Size 503320280 bytes
Database Buffers 260046848 bytes
Redo Buffers 2670592 bytes
#启动后查看进程
[oracle@ogg ~]$ ps -ef|grep ora_
oracle 14685 1 0 11:30 ? 00:00:00 ora_pmon_orcl
oracle 14687 1 0 11:30 ? 00:00:00 ora_psp0_orcl
oracle 14689 1 2 11:30 ? 00:00:00 ora_vktm_orcl
oracle 14693 1 0 11:30 ? 00:00:00 ora_gen0_orcl
oracle 14695 1 0 11:30 ? 00:00:00 ora_diag_orcl
oracle 14697 1 0 11:30 ? 00:00:00 ora_dbrm_orcl
oracle 14699 1 0 11:30 ? 00:00:00 ora_dia0_orcl
oracle 14701 1 0 11:30 ? 00:00:00 ora_mman_orcl
oracle 14703 1 0 11:30 ? 00:00:00 ora_dbw0_orcl
oracle 14705 1 0 11:30 ? 00:00:00 ora_lgwr_orcl
oracle 14707 1 0 11:30 ? 00:00:00 ora_ckpt_orcl
oracle 14709 1 0 11:30 ? 00:00:00 ora_smon_orcl
oracle 14711 1 0 11:30 ? 00:00:00 ora_reco_orcl
oracle 14713 1 0 11:30 ? 00:00:00 ora_mmon_orcl
oracle 14715 1 0 11:30 ? 00:00:00 ora_mmnl_orcl
oracle 14717 1 0 11:30 ? 00:00:00 ora_d000_orcl
oracle 14719 1 0 11:30 ? 00:00:00 ora_s000_orcl
oracle 14726 1922 0 11:30 pts/0 00:00:00 grep --color=auto ora_
3.1.1观察告警日志
提前打开告警日志,以下为节选的一片段
[oracle@ogg ~]$ cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/
[oracle@ogg trace]$ tail -100f alert_orcl.log
...
#读取非默认的系统参数
System parameters with non-default values:
#进程数
processes = 150
#限制内存大小,并进行自动内存管理
memory_target = 736M
#控制文件的路径和名称
control_files = "/u01/app/oracle/oradata/orcl/control01.ctl"
control_files = "/u01/app/oracle/fast_recovery_area/orcl/control02.ctl"
#数据库标准块大小
db_block_size = 8192
#Oracle 数据库版本号
compatible = "11.2.0.4.0"
#归档日志路径
db_recovery_file_dest = "/u01/app/oracle/fast_recovery_area"
db_recovery_file_dest_size= 4182M
#UNDO 表空间的名字
undo_tablespace = "UNDOTBS1"
#是否允许远程登录的相关配置
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
dispatchers = "(PROTOCOL=TCP) (SERVICE=orclXDB)"
#数据库审计文件路径
audit_file_dest = "/u01/app/oracle/admin/orcl/adump"
audit_trail = "DB"
#数据库名
db_name = "orcl"
open_cursors = 300
diagnostic_dest = "/u01/app/oracle"
#启动进程
PMON started with pid=2, OS id=14631
PSP0 started with pid=3, OS id=14633
VKTM started with pid=4, OS id=14635 at elevated priority
VKTM running at (1)millisec precision with DBRM quantum (100)ms
GEN0 started with pid=5, OS id=14639
DIAG started with pid=6, OS id=14641
DBRM started with pid=7, OS id=14643
DIA0 started with pid=8, OS id=14645
MMAN started with pid=9, OS id=14647
DBW0 started with pid=10, OS id=14649
LGWR started with pid=11, OS id=14651
CKPT started with pid=12, OS id=14653
SMON started with pid=13, OS id=14655
RECO started with pid=14, OS id=14657
MMON started with pid=15, OS id=14659
MMNL started with pid=16, OS id=14661
starting up 1 dispatcher(s) for network address ‘(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))‘...
starting up 1 shared server(s) ...
ORACLE_BASE from environment = /u01/app/oracle
总结:发出“startup nomount”指令后,告警日志文件输出了包括一系列参数、 进程的启动等内容;同时,我们注意到 SQLPLUS 终端回显了内存的大小设置。 因此,可以确定的是,在该阶段 Oracle 实例分配了内存,启动了进程那么,警告日志文件中的参数从哪来呢?下面让我们观察一下初始化参数文件。
3.1.2初始化参数文件
? 前面已经介绍过,初始化参数分为两种。静态初始化参数文件和动态初始化参数文件。
静态初始化参数文件(Pfile):文本形式、默认文件名:initsid.ora
动态初始化参数文件(Spfile):二进制形式、默认文件名:spfilesid.ora
? 也就是说,我们想要了解初始化参数文件的内容,可以使用 vi 工具或者多种操作系统 指令来查看静态初始化参数文件的内容。 如果没有静态初始化参数文件或者动态初始化参数文件(二缺一),该怎么办呢? 我们可以通过指令来创建初始化参数文件并查看静态初始化参数文件的内容:
通过动态初始化参数文件创建静态初始化参数文件
#不指导路径,默认在$ORACLE_HOME/dbs 下
create pfile from spfile;
#指导路径
create pfile=‘/home/oracle/pfile.ora‘ from spfile;
通过静态初始化参数文件创建动态初始化参数文件
#不指导路径,将默认在$ORACLE_HOME/dbs找pfile
create spfile from pfile;
#指导路径
create spfile from pfile=‘/home/oracle/pfile.ora‘;
查看参数文件
[oracle@ogg ~]$ cat pfile.ora
orcl.__db_cache_size=322961408
orcl.__java_pool_size=4194304
orcl.__large_pool_size=8388608
orcl.__oracle_base=‘/u01/app/oracle‘#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=310378496
orcl.__sga_target=461373440
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=117440512
orcl.__streams_pool_size=0
#这里以_开头的为隐含参数,为了使用 ASMM 特性而存在的
*.audit_file_dest=‘/u01/app/oracle/admin/orcl/adump‘
*.audit_trail=‘db‘
*.compatible=‘11.2.0.4.0‘
*.control_files=‘/u01/app/oracle/oradata/orcl/control01.ctl‘,‘/u01/app/oracle/fast_recovery_area/orcl/control02.ctl‘
*.db_block_size=8192
*.db_domain=‘‘
*.db_name=‘orcl‘
*.db_recovery_file_dest=‘/u01/app/oracle/fast_recovery_area‘
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest=‘/u01/app/oracle‘
*.dispatchers=‘(PROTOCOL=TCP) (SERVICE=orclXDB)‘
*.memory_target=771751936
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=‘EXCLUSIVE‘
*.undo_tablespace=‘UNDOTBS1‘
#由上面的告警日志文件发现的参数是从这里(初始化参数文件)来的
查看当前数据库是以哪种文件启动(spfile或是pfile)
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora
3.1.3启动流程
- 验证口令文件
- 连接 SQL * PLUS
- 发出 STARTUP NOMOUNT 指令
- 打开警告日志文件并记录日志
- 读取初始化参数文件
- 分配内存、启动进程
当启动实例时,系统首先要读取初始化参数文件。 然后根据初始化参数文件的设置分配系统全局区(SGA),并启动 Oracle 后台进程。 另外,操作系统还会打开“警告日志文件”,并且将启动信息存放到“警告日志文件” 中。
警告日志存放在初始化参数 background_dump_dest 所对应的目录中,其文件名格式 为 alertsid.log。
SQL> show parameter background_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /u01/app/oracle/diag/rdbms/orcl/orcl/trace
注意:Oracle 默认打开初始化参数文件的顺序是: Spfilesid.ora → spfile.ora → initsid.ora 如果三个文件都不存在,则报错。
3.1.4启动后可执行操作
● 创建数据库
● 创建控制文件
3.2启动MOUNTED阶段
启动到mount阶段,状态为MOUNTED
#查看当前启动状态
SQL> select status from v$instance;
STATUS
------------
STARTED
#备份控制文件,结果报错。。。
SQL> alter database backup controlfile to ‘/home/oracle/control.bak‘;
alter database backup controlfile to ‘/home/oracle/control.bak‘
*
ERROR at line 1:
ORA-01507: database not mounted
#启动到mount
SQL> alter database mount;
Database altered。
#查看当前启动状态
SQL> select status from v$instance;
STATUS
------------
MOUNTED
#备份控制文件,成功
SQL> alter database backup controlfile to ‘/home/oracle/control.bak‘;
Database altered.
? NOMOUNT 状态下无法备份控制文件,MOUNT 状态下备份成功,说明数据库从 NOMOUNT 到 MOUNT 状态读取了控制文件。
? 装载数据库阶段,系统会按照初始化参数文件中 control_files 参数的设置查找并打开控制文件。
? Oracle 是通过控制文件在实例和数据库之间建立关联的,通过控制文件可以取得数据文件和重做日志的名称和所处状态。但对数据文件和日志文件是否存在不作检查。
3.3启动OPEN状态
启动到open阶段,状态为OPEN
以查询数据测试
#当前数据库状态
SQL> select status from v$instance;
STATUS
------------
MOUNTED
#查询数据
SQL> select count(*)from scott.emp;
select count(*)from scott.emp
*
ERROR at line 1:
ORA-01219: database not open: queries allowed on fixed tables/views only
#打开数据库
SQL> alter database open;
Database altered.
#当前数据库状态
SQL> select status from v$instance;
STATUS
------------
OPEN
#查询数据
SQL> select count(*)from scott.emp;
COUNT(*)
----------
14
总结:在 MOUNT 状态下,我们无法读取到数据,说明数据文件没有被读取。当数据库 OPEN 后,我们可以读取到数据,说明数据库从 MOUNT 到 OPEN 加载了数据文件。
以切换重做日志测试
#当前数据库状态
SQL> select status from v$instance;
STATUS
------------
MOUNTED
#尝试手工切换日志文件组
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-01109: database not open
#打开数据库
SQL> alter database open;
Database altered.
#再次尝试手工切换日志文件组
SQL> alter system switch logfile;
System altered.
总结:在 MOUNT 状态下,我们无法手工切换日志文件组,说明联机重做日志文件没有被读取。当数据库 OPEN 后,可以切换,说明数据库从 MOUNT 到 OPEN 加载了日志文件。
4.关闭数据库操作
? 当 DBA 要执行完全数据库备份、修改初始化参数以及其他系统维护操作时,需要停止 Oracle 服务器。
4.1数据库关闭方式
Oracle 数据库共有 4 种关闭方式,根据不同的情况,管理员可采用不同的方式关闭数 据库。
NORMAL:正常关闭方式。
TRANSACTIONAL:事务关闭方式。
IMMEDIATE:立即关闭方式。
ABORT:强制终止关闭方式。
? NORMAL、TRANSACTIONAL、IMMEDIATE 三种关闭方式,属于一致性数据库(或 称干净数据库)关闭。特点是无需进行数据库恢复,关闭和启动过程如下图
? ABORT 关闭方式,属于非一致性数据库(或称脏数据库)关闭。使用 ABORT 关闭、 或数据库发生实例故障(比如断电)、或使用 STARTUP FORCE 强制重新启动数据库,都需要进行实例恢复。关闭和启动过程如下图
4.2四种关闭方式描述
4.2.1SHUTDOWN NORMAL
SHUTDOWN NORMAL
NORMAL 是默认选项。这种方式是被动的等待方式,在所有用户主动退出后,才实施关闭。该选项按照以下条件进行:
- 不能连接新的用户。
- Oracle 服务器等待所有用户断开已存在连接,然后完成关闭。
- 数据库和重做日志缓存写入磁盘。
- 结束后台进程,在内存中释放 SGA。
- 下次启动无需进行实例恢复。
? 该方式在关闭数据文件、重做日志和控制文件之前,系统首先要发出检查点,同步所有数据文件、控制文件和重做日志,使得这三种文件处于同步状态。
4.2.2SHUTDOWN TRANSACTIONAL
SHUTDOWN TRANSACTIONAL
这种方式将等待所有用户的事务结束,在避免用户修改丢失的前提下,尽快关闭数据库。 该选项按照以下条件进行:
- 在此实例上,客户端不能开始新的事务
- 一旦客户端的当前事务结束,客户即被断开
- 当所有的事务结束,立即进行数据库关闭
- 下次启动无需进行实例恢复。
? 假定有一个用户正在执行事务操作(INSERT、UPDATE 等),那么当执行 SHUTDOWN TRANSACTIONAL 时系统会处于等待状态。而当该用户执行 COMMIT 或 ROLLBACK 终止 事务之后,系统会自动断开其连接,然后停止 Oracle 服务器。另外,在执行该命令关闭数 据库之前,与 SHUTDOWN NORMAL 类似,系统也会首先发出检查点,然后才会关闭数据 文件、控制文件和重做日志。
4.2.3SHUTDOWN IMMEDIATE
SHUTDOWN IMMEDIATE
? 这种方式无需等待用户的情况下,进行立即关闭。已经提交的事务不会丢失,未提交的 事务被撤销。该选项按照以下条件进行: ? 当前执行的 SQL 语句被取消
-
Oracle server 不等待当前连接的用户断开
-
Oracle 回退活动事务,并断开所有连接的用户
-
Oracle 关闭实例前关闭和卸载数据库
-
下次启动无需进行实例恢复。
假定有一个用户正在执行事务操作(INSERT、UPDATE 等),那么当执行 SHUTDOWN IMMEDIATE 时系统会自动回退该事务操作,然后断开用户连接,最后停止 Oracle 服务器。 另外,在执行该命令关闭数据库之前,与 SHUTDOWN NORMAL 类似,系统也会首先发出 检查点,然后才会关闭数据文件、控制文件和重做日志。
4.2.4SHUTDOWN ABORT
SHUTDOWN ABORT
? SHUTDOWN ABORT 命令用于快速停止 Oracle 服务器,属于异常终止数据库,例如 实例出现故障或使用其他三种方式无法停止 Oracle 服务器,可以考虑采用这种方式。该选 项按照以下条件进行:
- 当前执行的 SQL 语句被取消
- Oracle server 不等待当前连接的用户定断开
- 数据库和重做日志缓存不写入磁盘。
- 没有提交的事务不回滚
- 在不关闭文件的情况下结束实例
- 数据库不关闭和卸载
- 下次启动需要进行实例恢复,恢复自动发生。
? 因为采用这种方式不会发出检查点,从而使得数据文件、控制文件和重做日志处于不一 致的状态,所以将来在启动 Oracle 服务器时,后台进程 SMON 会自动进行实例恢复,最终 将数据文件、控制文件和重做日志恢复到一致状态。在使用 Oracle 服务器时,尽可能 不要使用 SHUTDOWN ABORT 命令停止 Oracle 服务器。如果系统并发事务很多,而又执 行了 SHUTDOWN ABORT 命令停止 Oracle 服务器,那么因为需要进行实例恢复,所以可 能会导致 Oracle 服务器启动时间很长。
注意:在数据库不一致的状态下不能进行数据库的备份
四种关闭方式的特点总结如下表(√是,×否)
? 各种关闭模式的特点
4.3数据库关闭操作
? 停止 Oracle 服务器是使用命令 SHUTDOWN 来完成的,执行该命令要求用户必须具有 SYSDBA 或 SYSOPER 特权。其命令格式如下:
SHUTDOWN [NORMAL | TRANSACTIONAL | IMMEDIATE | ABORT ]
- NORMAL:正常关闭方式。
- TRANSACTIONAL:事务关闭方式。
- IMMEDIATE:立即关闭方式。
- ABORT:强制终止关闭方式。
- 默认的关闭模式是 NORMAL