###2. 关闭Oracle DB 实例

关闭模式

####2.1 SHUTDOWN NORMAL

  • 不可以建立新连接。
  • Oracle 服务器待所有用户断开连接后再完成关闭。
  • 数据库和重做缓冲区被写入磁盘。
  • 后台进程终止,并从内存中删除SGA。
  • Oracle 服务器在关闭并断开数据库后关闭实例。
  • 下一次启动不需要进行实例恢复。
#查看当前的连接Session
SQL> select username, MACHINE from v$session where program like '%TNS%';

USERNAME                       MACHINE
------------------------------ --------------------
HR                             hzvscmdb
SYS                            hzvscmdb

#以normal的方式关闭数据库
SQL> shutdown normal;

#发现数据库关闭不掉,等待所有的session关闭,然后,不关闭所有的session,则数据库关闭掉。
SQL> shutdown normal;
Database closed.
Database dismounted.
ORACLE instance shut down.

####2.2 SHUTDOWN TRANSACTIONAL

采用TRANSACTIONAL 关闭方式可防止客户机丢失数据,其中包括客户机当前活动的结果。执行事务处理数据库关闭时会发生以下情况:

  • 任何客户机都不能利用这个特定实例启动新事务处理。
  • 会在客户机结束正在进行的事务处理后断开客户机。
  • 完成所有事务处理后立即执行关闭。
  • 下一次启动不需要进行实例恢复。
#查看当前的连接Session
SQL>  select username, MACHINE from v$session where program like '%TNS%';

USERNAME                       MACHINE
------------------------------ --------------------
SYS                            hzvscmdb
HR                             hzvscmdb
HR                             hzvscmdb

#以transactional方式关闭数据库,不等待session的结束直接关闭
SQL> shutdown transactional;
Database closed.
Database dismounted.
ORACLE instance shut down.

#实例二
SQL>  select username, MACHINE from v$session where program like '%TNS%';

USERNAME                       MACHINE
------------------------------ --------------------
SYS                            hzvscmdb
HR                             hzvscmdb

SQL>  select username, MACHINE, prev_sql_id from v$session where program like '%TNS%';

USERNAME                       MACHINE              PREV_SQL_ID
------------------------------ -------------------- -------------
SYS                            hzvscmdb             atqym7kmvc9g5
HR                             hzvscmdb             41763gv0cwkm7

SQL> select sql_text from v$sql where sql_id = '41763gv0cwkm7';

SQL_TEXT
--------------------------------------------------------------------------------
update employees set email = 'TonyTest1' where employee_id = 199

SQL> shutdown transactional;

#此时数据库关闭不掉,需要等待所有的事务提交结束。
SQL> shutdown transactional;
Database closed.
Database dismounted.
ORACLE instance shut down.

####2.3 SHUTDOWN IMMEDIATE

采用IMMEDIATE 关闭模式会出现以下情况::

  • Oracle DB 正在处理的当前SQL 语句不会完成。
  • Oracle 服务器不会等待当前连接到数据库的用户断开连接。
  • Oracle 服务器会回退活动的事务处理,而且会断开所有连接用户。
  • Oracle 服务器在关闭并断开数据库后关闭实例。
  • 下一次启动不需要进行实例恢复。
SQL> select username, machine, prev_sql_id from v$session
  2  where program like '%TNS%';

USERNAME                       MACHINE              PREV_SQL_ID
------------------------------ -------------------- -------------
HR                             hzvscmdb             4xqvumnntxj29
SYS                            hzvscmdb             65trwptd32czm

SQL> select sql_text from v$sql where sql_id = '4xqvumnntxj29';

SQL_TEXT
--------------------------------------------------------------------------------
update employees set email = 'TonyTest2' where employee_id = 200

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 6714322944 bytes
Fixed Size                  2239192 bytes
Variable Size            6526338344 bytes
Database Buffers          167772160 bytes
Redo Buffers               17973248 bytes
Database mounted.
Database opened.
SQL>

###check update 的数据,发现数据丢失,通过 shutdown immediate 方式关闭数据。
SQL> select email from employees where employee_id = 200;

EMAIL
-------------------------
JWHALEN

####2.4 SHUTDOWN ABORT

如果NORMAL、TRANSACTIONAL 和IMMEDIATE 关闭模式都不起作用,则可以中止当前的数据库实例。中止实例时会发生以下情况:

  • Oracle DB 正在处理的当前SQL 语句会立即终止。
  • Oracle 服务器不会等待当前连接到数据库的用户断开连接。
  • 数据库和重做缓冲区未写入磁盘。
  • 不回退未提交的事务处理。
  • 实例终止,但未关闭文件。
  • 数据库未关闭或未卸载。
  • 下一次启动时需要进行实例恢复,实例恢复是自动进行的。

**注:**建议不要备份处于不一致状态的数据库。

SQL> select username, machine, prev_sql_id from v$session
  2  where program like '%TNS%';

USERNAME                       MACHINE              PREV_SQL_ID
------------------------------ -------------------- -------------
HR                             hzvscmdb             2kr7fuxvsa5kc
SYS                            hzvscmdb             1h50ks4ncswfn

SQL> select sql_text from v$sql where sql_id = '2kr7fuxvsa5kc';

SQL_TEXT
--------------------------------------------------------------------------------
update employees set email = 'Tonytest2' where employee_id = 200

SQL> shutdown abort;
ORACLE instance shut down.

#If a SHUTDOWN ABORT or abnormal termination occurs, then the instance of an open database closes and shuts down the database instantaneously. Oracle Database does not write data in the buffers of the SGA to the data files and redo log files. The subsequent reopening of the database requires instance recovery, which Oracle Database performs automatically.

SQL> startup;
ORACLE instance started.

Total System Global Area 6714322944 bytes
Fixed Size                  2239192 bytes
Variable Size            6526338344 bytes
Database Buffers          167772160 bytes
Redo Buffers               17973248 bytes
Database mounted.
Database opened.

###check update 的数据,发现数据丢失,通过 shutdown immediate 方式关闭数据。

SQL> select email from employees where employee_id = 200;

EMAIL
-------------------------
JWHALEN