Oracle数据库恢复检查脚本
prompt +----------------------------------------------------------------------------+
prompt | Oracle Database Recovery Check Result |
prompt +----------------------------------------------------------------------------+-- 环境变量配置
set termout off
set echo off
set feedback off
set verify off
set wrap on
set trimspool on
set serveroutput on
set escape on
set pagesize 50000
set long 2000000000
set numw 16
col error format a30
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';-- 简洁的HTML样式
set markup html on spool on preformat off entmap on -
head ' -<title>Oracle Database Recovery Check Result</title> -<style type="text/css"> -* {margin:0; padding:0; box-sizing:border-box;} -body {font:11pt "Segoe UI",Arial,Helvetica,sans-serif; color:#333; background:#f9f9f9; line-height:1.5;} -.container {max-width:1200px; margin:0 auto; padding:20px;} -h1 {font:bold 16pt "Segoe UI",Arial,sans-serif; color:#fff; background:#2c3e50; padding:12px 20px; border-radius:6px; margin:20px 0;} -h2 {font:bold 13pt "Segoe UI",Arial,sans-serif; color:#2c3e50; margin:15px 0; padding-bottom:8px; border-bottom:2px solid #3498db;} -.card {background:#fff; border-radius:8px; box-shadow:0 2px 8px rgba(0,0,0,0.1); padding:20px; margin-bottom:20px;} -table {width:100%; border-collapse:collapse; margin:10px 0;} -th {font:bold 10pt "Segoe UI",Arial,sans-serif; color:#fff; background:#3498db; padding:10px; text-align:left; border:1px solid #ddd;} -td {font:10pt "Segoe UI",Arial,sans-serif; color:#333; background:#fff; padding:10px; border:1px solid #ddd;} -tr:nth-child(even) td {background:#f8f9fa;} -tr:hover td {background:#e3f2fd;} -.warning {color:#d9534f; font-weight:bold;} -.abnormal-row td {background:#ffebee !important; color:#d32f2f !important; font-weight:bold;} -</style>' -
body 'BGCOLOR="#f9f9f9"' -
table 'WIDTH="100%" BORDER="0"' -- 定义报告文件名
define fileName=db_recover_check
COLUMN spool_time NEW_VALUE _spool_time NOPRINT
COLUMN DB_NAME NEW_VALUE _db_name NOPRINT
SELECT TO_CHAR(SYSDATE,'YYYYMMDD') spool_time FROM dual;
SELECT LOWER(NAME) DB_NAME FROM V$DATABASE;-- 开始生成报告
spool &FileName._&_db_name._&_spool_time..html
set markup html on entmap off
prompt <div class="container">-- 1. 报告概览
prompt <div class="card">
prompt <h1>📊 报告概览</h1>
set MARKUP HTML ON
col ITEM for a30
col VALUE for a60
select '数据库名称' as ITEM, name as VALUE from v$database
union all
select '实例名称' as ITEM, instance_name as VALUE from v$instance
union all
select '数据库版本' as ITEM, (select banner from v$version where rownum=1) as VALUE
union all
select '数据库状态' as ITEM, open_mode as VALUE from v$database
union all
select '日志模式' as ITEM, log_mode as VALUE from v$database
union all
select '报告生成时间' as ITEM, to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as VALUE from dual;
prompt </div>-- 2. 基础环境信息
prompt <div class="card">
prompt <h1>🖥️ 基础环境信息</h1>-- 2.1 实例信息
prompt <h2>实例详情</h2>
select INSTANCE_NUMBER "实例编号",INSTANCE_NAME "实例名称",host_name "主机名",STATUS "实例状态",STARTUP_TIME "启动时间"
from Gv$instance;-- 2.2 数据库基本信息
prompt <h2>数据库控制文件信息</h2>
select dbid "数据库ID",name "数据库名称",open_mode "打开模式",log_mode "日志模式",checkpoint_change# "检查点SCN"
from v$database;
prompt </div>-- 3. 存储相关信息
prompt <div class="card">
prompt <h1>💾 存储资源信息</h1>-- 3.1 表空间汇总
prompt <h2>表空间大小汇总(单位:GB)</h2>
select * from (
select a.ts# "表空间编号",a.name "表空间名称",round(sum(bytes)/1024/1024/1024,2) "表空间大小(GB)"
from v$datafile b, v$tablespace a
where a.ts#=b.ts#
group by a.ts#,a.name
union all
select a.ts# "表空间编号",a.name||'(临时表空间)' "表空间名称",round(sum(bytes)/1024/1024/1024,2) "表空间大小(GB)"
from v$tempfile b, v$tablespace a
where a.ts#=b.ts#
group by a.ts#,a.name
union all
select null "表空间编号",'总数据文件大小' "表空间名称",round(SUM(BYTES/1024/1024/1024),2) "表空间大小(GB)"
FROM V$datafile)
order by 1;-- 3.2 数据文件详情
prompt <h2>数据文件详情</h2>
select ts# "表空间编号",file# "文件编号",round(BYTES/1024/1024/1024,2) "文件大小(GB)",status "文件状态",checkpoint_change# "检查点SCN",name "文件路径"
from v$datafile
order by 1,2;-- 3.3 数据文件头部信息
prompt <h2>数据文件头部信息</h2>
select ts# "表空间编号",file# "文件编号",round(bytes/1024/1024/1024,2) "文件大小(GB)",status "头部状态",ERROR "错误信息",recover "是否需要恢复",FUZZY "模糊标记",checkpoint_change# "检查点SCN"
from v$datafile_header
order by 1,2;-- 3.4 数据文件与头部一致性检查
prompt <h2>⚠️ 数据文件与头部一致性对比(差异项)</h2>
select CASE WHEN dd.checkpoint_change#<>dh.checkpoint_change# THEN 'abnormal-row' ELSE '' END as "CLASS",dd.FILE# "文件编号",dd.NAME "文件路径",dd.checkpoint_change# "数据文件SCN",dh.checkpoint_change# "头部SCN",dh.recover "是否需要恢复"
FROM v$datafile dd, v$datafile_header dh
WHERE dd.FILE#=dh.FILE#
AND dd.checkpoint_change#<>dh.checkpoint_change#;
prompt </div>-- 4. 日志与SCN信息
prompt <div class="card">
prompt <h1>📜 日志与SCN信息</h1>-- 4.1 SCN详情
prompt <h2>SCN空间分析</h2>
SELECT to_char(tim,'yyyy-mm-dd hh24:mi:ss') "当前时间",scn "当前检查点SCN",chk16kscn-scn "剩余SCN空间",round((chk16kscn-scn)/24/3600/16/1024,3) "理论可用天数"
FROM (
select tim, scn,((((to_number(to_char(tim,'YYYY'))-1988)*12*31*24*60*60) +((to_number(to_char(tim,'MM'))-1)*31*24*60*60) +(((to_number(to_char(tim,'DD'))-1))*24*60*60) +(to_number(to_char(tim,'HH24'))*60*60) +(to_number(to_char(tim,'MI'))*60) +(to_number(to_char(tim,'SS')))) * (16*1024)) chk16kscn
from (select sysdate tim,checkpoint_change# scn from v$database)
)
ORDER BY tim;-- 4.2 Redo日志信息
prompt <h2>Redo日志文件详情</h2>
SELECT thread# "线程号",a.group# "日志组号",a.sequence# "序列号",round(a.bytes/1024/1024,2) "日志大小(MB)",a.ARCHIVED "是否归档",a.status "日志状态",MEMBER "日志文件路径"
FROM v$log a, v$logfile b
WHERE a.group# = B.GROUP#
ORDER BY thread#,a.sequence# DESC;-- 4.3 归档日志信息(最近50条)
prompt <h2>最近50条归档日志</h2>
select thread# "线程号",sequence# "序列号",FIRST_CHANGE# "起始SCN",FIRST_TIME "起始时间",name "归档文件路径"
from (
select rownum rn,a.* from (
select sequence#,thread#,FIRST_CHANGE#,FIRST_TIME,name
from v$archived_log
where DELETED='NO' and STANDBY_DEST='NO'
order by NEXT_TIME desc
) a
) where rn<=50;-- 4.4 归档日志统计
prompt <h2>归档日志统计</h2>
select thread# "线程号",min(sequence#) "最小序列号",max(sequence#) "最大序列号",count(*) "归档日志总数"
from v$archived_log
where DELETED='NO'
group by thread#;
prompt </div>-- 5. 备份与恢复信息
prompt <div class="card">
prompt <h1>🔧 备份与恢复信息</h1>-- 5.1 热备份信息
prompt <h2>热备份状态</h2>
select file# "文件编号",CHANGE# "备份开始SCN",TIME "备份开始时间"
from v$backup
where CHANGE#>0;-- 5.2 数据库化身信息
prompt <h2>数据库化身信息</h2>
select INCARNATION# "化身编号",RESETLOGS_CHANGE# "重置SCN",RESETLOGS_TIME "重置时间",STATUS "化身状态"
from v$database_incarnation;-- 5.3 RMAN备份信息
prompt <h2>RMAN备份集信息(最近30天)</h2>
SELECT distinct A.RECID "备份集ID",DECODE (B.INCREMENTAL_LEVEL,'', DECODE (BACKUP_TYPE, 'L', '归档日志备份', '全量备份'),1, '增量备份-LEVEL 1',0, '增量备份-LEVEL 0',B.INCREMENTAL_LEVEL) "备份类型",DECODE (A.STATUS, 'A', '可用', 'D', '已删除', 'X', '过期', 'ERROR') "备份状态",A.COMPLETION_TIME "备份完成时间",round(a.bytes/1024/1024,2) "备份大小(MB)",A.HANDLE "备份文件路径"
FROM V$BACKUP_PIECE A, V$BACKUP_SET B
WHERE A.SET_STAMP = B.SET_STAMP AND A.DELETED = 'NO' AND a.set_count = b.set_count AND A.COMPLETION_TIME > SYSDATE - 30
ORDER BY A.COMPLETION_TIME DESC;-- 5.4 恢复相关文件
prompt <h2>需要恢复的文件</h2>
select file# "文件编号",online_status "文件状态",change# "恢复所需SCN"
from v$recover_file;
prompt </div>-- 6. 异常检测信息
prompt <div class="card">
prompt <h1>🚨 异常检测信息</h1>-- 6.1 数据块损坏信息
prompt <h2>数据块损坏详情</h2>
select CASE WHEN corruption_type IS NOT NULL THEN 'abnormal-row' ELSE '' END as "CLASS",file# "文件编号",block# "损坏块号",blocks "损坏块数量",corruption_type "损坏类型"
from v$database_block_corruption;-- 6.2 数据文件头部核心状态
prompt <h2>数据文件头部错误状态</h2>
select FHTSN "表空间编号",HXFIL "文件编号",DECODE(HXONS,0,'OFFLINE','ONLINE') "文件状态",decode(HXERR, 0, '无错误', 1,'文件丢失',2,'正常离线',4,'文件未找到',5,'无法打开文件',6,'无法读取头部',7,'头部损坏','未知错误') "文件错误",decode(hxifz, 0,'否', 1,'是', '未知') "模糊标记",FHSCN "检查点SCN"
from x$kcvfh
where HXERR != 0
order by FHTSN,FHRFN;-- 6.3 最小可恢复SCN
prompt <h2>最小可恢复SCN</h2>
select max(fhafs) "最小PITR SCN" from x$kcvfh;
prompt </div>-- 报告结束
prompt </div>
spool offexit;
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959945.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!