oracle-SYSTEM表空间的备份与恢复

这一篇在介绍备份及恢复数据文件的方法时,以备份和重做日志(包括归档日志和在线日志)没有丢失为前提

所谓关键数据文件:system表空间的数据文件与参数undo_tablespace指向的自动撤销表空间的数据文件(undo_tablespace数据文件)。

它们的损坏(整体或局部)会导致SQL命令执行失败、用户session强制断开、sys用户无法登陆、甚至整个实例崩溃。

SQL> select file_id,file_name from dba_data_files where tablespace_name in ('SYSTEM',(select value from v$parameter where name='undo_tablespace'));
FILE_ID FILE_NAME
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/orcl/undotbs01.dbf
1 /u01/app/oracle/oradata/orcl/system01.dbf

9.1 关键数据文件损坏的后果

9.1.1 system表空间数据文件损坏

SYSTEM表空间内部保存两类重要数据:oracle数据库的系统表(数据字典),是数据库正常运行的基本保障:以及名为SYS.SYSTEM的撤销段(undo segment)系统回滚段。

讨论情况:文件丢失、文件头损坏、数据库字段损坏及SYS.SYSTEM撤销段损坏

--1 若system01.dbf文件丢失或无法访问,startup启动到mount状态
--2 若system01.dbf文件头损坏,运行时检查点发起后实例崩溃,startup启动到mount状态
--3 如果数据字典损坏,数据库内的对象定义系统、名称解析系统、用户账号系统及权限管理都将崩溃。若损坏发生在实例运行时,通常会导致SQL命令产生ORA-00604的错误;若损坏发生在实例启动时,启动流程不一定会终止,但是alert log中会有ORA-01578和ORA-01110错误。
--4 system01.dbf 文件名中为SYS.SYSTEM撤销段头部损坏,在启动时startup实例会强制关闭,必须使用startup mount才能进入mount状态。

以下是一些各种是system01.dbf文件损坏的场景

场景1:启动数据库是发现system01.dbf文件丢失,启动中断

SQL> startup
ORA-01157: cannot identify/lock data file 1 -see DBWR trace file
ORA-01110:data file 1 : ‘/u01/app/oracle/oradata/orcl/system01.dbf’

场景2:启动数据库发现system01.dbf文件头部损坏,启动中断

SQL> startup
ORACLE instance started.
Total System Global Area 784998400 bytes
Fixed Size 2257352 bytes
Variable Size 511708728 bytes
Database Buffers 264241152 bytes
Redo Buffers 6791168 bytes
Database mounted.
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
ORA-01210: data file header is media corrupt

场景3:数据库运行时,system01.dbf文件中保存用户账号信息的数据字典SYS.USER$的数据块损坏,使用后登录失败

$ sqlplus test/***
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1,block # 213)
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

场景4:数据库运行时system01.dbf文件中的数据字典SYS.TAB$数据块损坏

SQL> select * from test.t1;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1,block # 83226)
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

场景5:数据字典SYS.PROCEDURE$中数据块损坏,任何create、drop和rename都报错

SQL> create table test.t2 (id number,name varchar2(20)) tablespace test;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1,block # 89226)
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

场景6:SYS.SYSTEM撤销段头部损坏,实例被强制中断

SQL> startup
ORA-01092: ORACLE instance terminated, Disconnection forced
ORA-01578: ORACLE data block corrupted (file # 1,block # 128)
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

场景7:SYS.SYSTEM撤销段与undo_tablespace表空间撤销段同时损坏,执行DDL时候报错

SQL> drop table test.t1;
ORA-00603 : ORACLE server session terminated by fatal error

场景8:运行时,system01.dbf或undo_tablespace数据文件头部损坏,检查点无法顺利完成,在alter log中

ORA-01243: system tablespace file suffered media failure
ORA-01122: database file 1 failed verification check

9.1.2 undo_tablespace数据文件损坏

undo_tablespace数据文件是undotbs01.dbf,它用来保存所有的变更类命令(DDL\DML)所产生的撤销数据(undo data)

--1 undotbs01.dbf文件丢失无法访问,startup启动到mount状态
--2 undotbs01.dbf文件头损坏,startup启动到mount,运行时检查点发起后实例崩溃
--3 若表空间中的某些块损坏,DML可能失败,若全部损坏,DML肯定全部失败
SQL> select name from v$rollname where name<> 'SYSTEM';
NAME
------------------------------
_SYSSMU1_1925302723$
_SYSSMU2_2273571325$
_SYSSMU3_798971445$
_SYSSMU4_2493343136$
_SYSSMU5_44098047$
_SYSSMU6_4194993272$
_SYSSMU7_3978436573$
_SYSSMU8_3643869769$
_SYSSMU9_4157155965$
_SYSSMU10_1224346732$
10 rows selected.

场景1:运行时,undotbs01.dbf头损坏(3号文件,160号数据块)

SQL> update test.t1 set name=’yhq’ where id=1;
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
ORA-01578: ORACLE data block corrupted (file # 3,block # 160)
ORA-01110: data file 3: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’

场景2:启动时,undotbs01.dbf文件头部损坏

SQL> startup
ORA-01092: ORACLE instance terminated, Disconnection forced
ORA-01578: ORACLE data block corrupted (file # 3,block # 128)
ORA-01110: data file 3: '/u01/app/oracle/oradata/orcl/undotbs01.dbf'

9.2 备份

使用RMAN的backup database、backup datafile、backup tablespace都可以备份数据文件

RMAN> backup as backupset tablespace system,undotbs1;
Starting backup at 18-JUL-19
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00003 name=/u01/app/oracle/oradata/orcl/undotbs01.dbf
input datafile file number=00001 name=/u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: starting piece 1 at 18-JUL-19
channel ORA_DISK_1: finished piece 1 at 18-JUL-19
piece handle=/u01/app/oracle/fra/ORCL/backupset/2019_07_18/o1_mf_nnndf_TAG20190718T111222_glzrwp9z_.bkp tag=TAG20190718T111222 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 18-JUL-19
Starting Control File and SPFILE Autobackup at 18-JUL-19
piece handle=/u01/app/oracle/fra/ORCL/autobackup/2019_07_18/o1_mf_s_1013944345_glzrwsd5_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 18-JUL-19

创建镜像复制

RMAN> run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup as copy
(datafile '/u01/app/oracle/oradata/orcl/system01.dbf' channel c1)
(datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' channel c2)
}

备份所有的数据文件

RMAN> run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
backup as copy database;
}

运行以上RMAN命令时,确保在mount状态或open状态,open状态还需要启动归档模式。

9.3 恢复

恢复关键数据文件的核心步骤:db进入mount状态、从备份还原(restore或switch)、使用增量备份或重做日志恢复(recover)、打开db

在整个介质恢复流程中(restore和recover),db始终处于mount状态,而不是open状态,在恢复完成之前db不能接受应用的连接。

9.3.1 恢复前的准备

要恢复数据文件,先要启动到mount阶段,不然就需要搞定参数文件和控制文件。

显示启动到mount阶段:startup mount

如果发现问题时实例没有关闭,用:shutdown abort停止实例

也有可能数据字典的损坏甚至SYS不能通过sqlplus和RMAN登录的情况

$ sqlplus / as sysdba
ERROR:
ORA-01075:you are currently logged on

登录不报错,连接到空闲实例,但实例还存在

SQL> sqlplus / as sysdba
SQL> select * from v$database;
ERROR at line 1 :
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number :0

使用RMAN登录也报错

$ rman target /
RMAN-00554
RMAN-04005: error from target database
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1,block #857)
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

此时必须终止实例才能开始恢复操作,比如将后台进程SMON 杀死,另一个后台进程PMON

$ kill -9 `ps aux |grep ora_smon_orcl |grep -v grep | awk '{print $2}'`

9.3.2 恢复流程

恢复操作必须在mount下进行,具体步骤:

--1 如果实例尚未崩溃,使用shutdown abort或者操作系统的kill将实例关闭
--2 执行startup mount将实例启动到mount状态
--3 使用RMAN执行restore或switch还原损坏的关键数据文件
--4 使用RMAN执行recover database 利用归档日志和在线日志恢复数据文件
--5 执行alter database open 打开数据库

第一步确保实例已经停止,可以通过RMAN的一个运行块完成,比如恢复undotbs1表空间的数据文件

RMAN> run {
startup mount;
restore tablespace undotbs1;
recover database;
alter database open;
}

再比如恢复1号数据文件

RMAN> run {
startup mount;
restore datafile 1;
recover database;
alter database open;
}

当数据文件的镜像复制处于磁盘上时,可用switch命令取代restore将控制文件中的数据文件名立即换成镜像复制名,文件越大,还原操作节省的时间就越多。

首先启动到mount状态

RMAN> startup mount;

查看镜像复制信息和生成时间

RMAN> list datafilecopy all;
RMAN> run {
switch datafile 1 to datafilecopy
'/u01/app/oracle/fra/ORCL/autobackup/2019_07_18/o1_mf_s__glzrwsd5_.dbf';
recover database;
alter database open;
}

现在查看1号数据文件的路径将是镜像复制

SQL> select name from v$datafile where file#=1;
NAME
/u01/app/oracle/fra/ORCL/autobackup/2019_07_18/o1_mf_s__glzrwsd5_.dbf

而查看镜像复制的路径将是原来的数据文件

RMAN> list copy of tablespace system;
/u01/app/oracle/oradata/orcl/system01.dbf

如果原来数据文件已经是损坏的,此镜像复制当然也是损坏的,dba需要考虑这样的复制是否有意义,所以在使用switch之后要执行validate

RMAN> validate datafilecopy all;

如有错误,可以删除

RMAN> delete noprompt datafilecopy 44;
RMAN> backup as copy datafile 1 format ‘/u01/app/oracle/oradata/orcl/system01.dbf’;

将来不论是主动或被动,利用switch和recover都能再次切换回原路径  

oracle-SYSTEM表空间的备份与恢复的更多相关文章

  1. Oracle system表空间满的暂定解决方法

    Oracle system表空间满的暂定解决方法 数据库用的是Oracle Express 10.2版本的.利用Oracle Text做全文检索应用,创建用户yxl时没有初始化默认表空间,在系统开发过 ...

  2. [Oracle]System 表空间的文件丢失

    如果system 表空间的文件丢失,假设有备份的情况,可以恢复.数据库需要设置为mount 状态,然后restore/recover datafile 模拟实验: SQL> select nam ...

  3. ORACLE system表空间满

    解决方法:执行迁移命令,将AUD$表相关移到其它表空间中,也可以新建 一个审计 表空间 / MB DESC) ; alter table aud$ move tablespace SIEBELINDE ...

  4. SYSTEM 表空间管理及备份恢复

    标签: systemoraclesqldatabasefile数据库 2010-11-28 18:14 12689人阅读 评论(0) 收藏 举报 分类: -----Oracle备份恢复(16) 版权声 ...

  5. ORACLE表空间的备份与恢复策略

    转自原文如何进行ORACLE表空间的备份与恢复? 1.切换服务器归档模式,如果已经是归档模式可跳过此步: %sqlplus /nolog (启动sqlplus) SQL> conn / as s ...

  6. 由Oracle 11g SYSAUX 和 SYSTEM 表空间回收引发的联想

    0x00--目的 整理一下以前一个SYSTEM表空间和SYSAUX表空间使用率达到99%上限的处理思路和相关知识点,好记性不如烂笔头 0x01--表空间使用率现状 通过查询可得知目前表空间使用情况如下 ...

  7. oracle问题之SYSTEM表空间不足 (二)

    杂症二.SYSTEM表空间不足报错 一.杂症: PLSQL登录,报错: ORA-00604: 递归 SQL 层  出现错误 ORA-01653: 表.无法通过(在表空间中)扩展 ORA-02002: ...

  8. oracle数据库解决system表空间已爆满的问题

    有时会发现数据库system表空间增长很快,使用以下语句查看system表空间使用量.也可以使用toad直接看. select b.tablespace_name "表空间", b ...

  9. Oracle的表空间、用户和模式

    Oracle 的 表空间(Tablespace).用户(User).模式(Schema)   前面有整理了一篇 Oracle 数据库(database) 与 实例(instance) 的概念及关系整理 ...

随机推荐

  1. MapReduce TopN(自主复习)

    1.MyTopN  主程序 package com.littlepage.topn; import org.apache.hadoop.conf.Configuration; import org.a ...

  2. 前端每日实战:136# 视频演示如何用 D3 和 GSAP 创作一个横条 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/pOZKWJ 可交互视频 此视频是可 ...

  3. 【LuoguP5289】[十二省联考2019] 皮配

    题目链接 题目描述 略 Sol 一道背包问题 首先暴力做法设 \(dp[i][j][k]\) 表示前 \(i\) 个城市的学校被分到第一阵营 \(j\) 人 第一门派 \(k\) 人的方案数. 中间一 ...

  4. ES和RDBMS区别

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/12090637.html ES7.0之前,一个Index可以设置多个Type ES7.0开始,Type已 ...

  5. javascript面向对象学习(一)

    面向对向的初体验 创建一个标签 // 传统 var p = document.createElement('p'); var txt = document.createTextNode('我是传统js ...

  6. linq 分页

    urList = (from u in urList                      orderby u.toolingNo_C                      select u) ...

  7. js判断条件为“假”的情况

    以下6种情况判断结果为"假": 1.false(布尔类型) 2.null(用于定义空的或者不存在的引用) 3.undefined(未定义) 4.0(数值0) 5.''(空字符串) ...

  8. python – 如何禁用Django的CSRF验证?

    如果只需要一些视图不使用CSRF,可以使用@csrf_exempt: from django.views.decorators.csrf import csrf_exempt @csrf_exempt ...

  9. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  10. 题解 CF1190B 【Tokitsukaze, CSL and Stone Game】

    思路: 首先题目告诉我们,一次只能删去一个石子.当然有翻译时会注意,但是看英文题时总是容易忽略.. 先排序. 然后,你会发现,有些情况是一开始就输的,具体情况如下: 有两个 两个相等非零数.(a[x] ...