Oracle 停库(单机环境)

313 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

Linux与Windows操作类似,Windows在cmd界面操作。
下面关闭数据库 syd。

1. 停止连入数据库的相关业务

尽量关闭所有连接数据库点的应用程序,客户端等,否则关库时可能存在等待。

2. 关闭监听,连入需要关闭的数据库实例

--确认服务器上有几个实例
lsnrctl status
--确认完成后关闭监听
lsnrctl stop

image.png

--指定要关闭的实例,只有一个实例的可忽略此步骤
export ORACLE_SID=syd
--进入数据库,再次确认所要关闭的数据库实例名
sqlplus / as sysdba
show parameter name

image.png

3. 确认数据库无勒索病毒

以下 sql 查询后无结果返回证明无病毒,若有返回结果,及时联系 dba,切勿关库。

select 'DROP TRIGGER ' || owner || '."' || TRIGGER_NAME || '";'
  from dba_triggers
 where TRIGGER_NAME like 'DBMS_%_INTERNAL% '
union all
select 'DROP PROCEDURE ' || owner || '."' || a.object_name || '";'
  from dba_procedures a
 where a.object_name like 'DBMS_%_INTERNAL% ';

select owner, object_name, created
  from dba_objects
 where object_name like 'DBMS_SUPPORT_DBMONITOR%';    

4. 确认数据库运行时间

查询结果为数据库运行时间,若超过一年,长时间未重启过数据库,需跟客户说明存在风险。(硬件老化,数据库需重启生效参数被改动等,都可能引起数据库重启后起不来)

select to_char(startup_time, 'DD-MON-YYYY HH24:MI:SS') starttime,
       TRUNC(sysdate - (startup_time)) || 'days' ||
       TRUNC(24 *
             ((sysdate - startup_time) - TRUNC(sysdate - startup_time))) ||
       'hours' || MOD(TRUNC(1440 * ((SYSDATE - startup_time) -
                          TRUNC(sysdate - startup_time))),
                    60) || 'min' ||
       MOD(TRUNC(86400 *
                 ((SYSDATE - STARTUP_TIME) - TRUNC(SYSDATE - startup_time))),
           60) || 's' running
  from v$instance;

5. 切几次归档,确保已提交的事务记录到归档日志中

alter system switch logfile;
/
/

6. 创建检查点,确保数据写入到磁盘中

alter system checkpoint;

7. 关闭数据库

若步骤 1 未操作完全,或直接在业务运行时关闭数据库,关库时可能很慢(业务频繁的库,关库操作一两个小时都有可能),所以关库时一定要提前规划好停业务时间来停止相关业务。

shu immediate

image.png