oracle冷备及恢复

冷备:
数据库在关闭的状态下完成物理系统拷贝的过程。冷备更适用于非归档模式下。
 
冷备的步骤:
首先,在运行的库中得到数据库运行的所有的物理文件。
然后,在计划内关闭数据库,在执行拷贝物理文件到备份路径/设备
备份完成后立即启动数据库,让其提供正常服务。
 
 
备份前的查询工作
 
 
SQL> show user
USER is "SYS"
当前库名
SQL> select name from v$database;
 
NAME
---------
ORCL
实例名
SQL> select instance_name from v$instance;
 
INSTANCE_NAME
----------------
orcl
当前所有数据文件及状态
  SQL> select file_name,tablespace_name,status,online_status from dba_data_files;
 
    FILE_NAME                                               TABLESPACE STATUS    ONLINE_
    ------------------------------------------------------- ---------- --------- -------
    /u01/app/oracle/oradata/orcl/undotbs01.dbf              UNDOTBS1   AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/system01.dbf               SYSTEM     AVAILABLE SYSTEM
    /u01/app/oracle/oradata/orcl/sysaux01.dbf               SYSAUX     AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/users01.dbf                USERS      AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/example01.dbf              EXAMPLE    AVAILABLE ONLINE
 
SQL>
查看数据文件位置
 SQL> select name from v$datafile;
 
    NAME
    --------------------------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/system01.dbf
    /u01/app/oracle/oradata/orcl/undotbs01.dbf
    /u01/app/oracle/oradata/orcl/sysaux01.dbf
    /u01/app/oracle/oradata/orcl/users01.dbf
    /u01/app/oracle/oradata/orcl/example01.dbf
 
临时文件位置
SQL> select name from v$tempfile;
 
NAME
--------------------------------------------------------------------------------
 /u01/app/oracle/oradata/orcl/temp01.dbf
SQL>
日志文件位置
SQL> select member from v$logfile;
 
MEMBER
--------------------------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/redo2a.rdo
    /u01/app/oracle/oradata/orcl/redo2b.rdo
    /u01/app/oracle/oradata/orcl/redo1a.rdo
    /u01/app/oracle/oradata/orcl/redo3a.rdo
    /u01/app/oracle/oradata/orcl/redo3b.rdo
    /u01/app/oracle/oradata/orcl/redo1b.rdo
 
6 rows selected.
 
SQL>
控制文件位置
SQL> select name from v$controlfile;
 
NAME
--------------------------------------------------------------------------------
  /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl
 
SQL>
参数文件可以直接通过创建指定一个目录
SQL> create pfile='/u01/app/....'  from spfile;
 
密码文件位置
SQL> ho ls $ORACLE_HOME/dbs/orapw$ORACLE_SID
/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl
 
SQL>
 
创建备份脚本
 
创建备份存放路径
SQL> ho mkdir /u02/orcl
 
SQL>
连接符生成命令
SQL> select 'ho cp '||name||' /u02/orcl' from v$controlfile;
 
'HOCP'||NAME||'/U02/ORCL'
--------------------------------------------------------------------------------
ho cp /u01/app/oracle/oradata/orcl/control01.ctl  /u02/orcl
ho cp /u01/app/oracle/oradata/orcl/control02.ctl  /u02/orcl
 
SQL>
保存前一命令以文本形式到/u02/bakorcl.sql中
SQL> save /u02/bakorcl.sql
Created file /u02/bakorcl.sql
SQL>
 
编写脚本
[oracle@yang /]$ vi /u02/bakorcl.sql
 
spool /u02/bak.sql
select 'ho cp '||name||' /u02/orcl' from v$controlfile
union all
select 'ho cp '||name||' /u02/orcl' from v$datafile
union all
select 'ho cp '||name||' /u02/orcl' from v$tempfile
union all
select 'ho cp '||member||' /u02/orcl' from v$logfile
/
create pfile='/u02/orcl/initorcl.ora' from spfile;
ho cp /u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl  /u02/orcl/
pool off
shutdown immediate
ho sed -n '/^ho cp/p'  /u02/bak.sql  >/u02/bakstart.sql
start /u02/bakstart.sql
startup
执行脚本
 
SQL> @/u02/bakorcl.sql
查询结果
[oracle@yang ~]$ ls /u02/orcl
    control01.ctl  orapworcl   redo2b.rdo    system01.dbf   users01.dbf
    control02.ctl  redo1a.rdo  redo3a.rdo   
    example01.dbf  redo1b.rdo  redo3b.rdo    
    initorcl.ora   redo2a.rdo  sysaux01.dbf  undotbs01.dbf
 
 
 
冷备的恢复(非归档模式下)
 
1丢失数据文件
a.丢失system表空间,则需要全备数据库,然后在使用最近的冷备还原 到目的路径。最后启动数据库完成恢复到冷备时刻。由于是非归档只能恢复到最近冷备备份时刻。
b.sysaux辅助表空间丢失, 数据库的启动将sysaux数据文件脱机,然后导出数据,最后在新建数据库导回数据。还可以使用冷备数据还原,加隐藏参数启动数据库忽略一致性验证。
C. undo 表空间丢失  需要删除老的表空间 建立新的undo表空间就可以。
d.自己建立的表空间丢失,需要需要脱机该数据文件,启动数据库。导出其他可用数据
e.临时表空间丢失,直接建立新的
2.日志文件丢失
通过resetlogs恢复日志文件
3、控制文件丢失
建立新的控制文件
4、参数文件丢失
直接用备份恢复即可
5、密码文件丢失
可以用备份恢复,也可以建立新的
 
控制文件全部丢失
只能重建控制文件
 
找到冷备路径
[oracle@yang ~]$ ls /u02/orcl
    control01.ctl  orapworcl   redo2b.rdo    system01.dbf   users01.dbf
    control02.ctl  redo1a.rdo  redo3a.rdo   
    example01.dbf  redo1b.rdo  redo3b.rdo    
    initorcl.ora   redo2a.rdo  sysaux01.dbf  undotbs01.dbf
查看二进制控制文件找到所有数据文件路径
[oracle@yang ~]$ strings /u02/orcl/control01.ctl |grep dbf
 /u01/app/oracle/oradata/orcl/system01.dbf
    /u01/app/oracle/oradata/orcl/undotbs01.dbf
    /u01/app/oracle/oradata/orcl/sysaux01.dbf
    /u01/app/oracle/oradata/orcl/users01.dbf
    /u01/app/oracle/oradata/orcl/example01.dbf
 /u01/app/oracle/oradata/orcl/temp01.dbf
 
可以得到建立控制文件的语句
查看控制文件路径
SQL> show parameter control_files
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/orcl/
                                                 control01.dbf, /u01/app/oracle/oradata/orcl/
                                                  control02.dbf
SQL>
将备份的控制文件 拷贝到原路径
SQL> ho cp /u02/orcl/control* /u01/app/oracle/oradata/orcl/
将数据库启动到mount状态
SQL> alter database mount;
得到建立控制文件语句
SQL> alter database backup controlfile to trace as  '/u02/orcl/ctl.sql';
 
Database altered.
SQL>
删除拷贝的控制文件
SQL>ho rm  /u01/app/oracle/oradata/orcl/control*
 
关闭数据库
 
SQL> shutdown abort
编辑脚本              (将所有注释与前面空格都删除)
[oracle@yang ~]$ vi /u02/orcl/ctl.sql
改成如下格式
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/u01/app/oracle/oradata/orcl/redo1a.log',
'/u01/app/oracle/oradata/orcl/redo1b.log'
) SIZE 50M,
GROUP 2 (
'/u01/app/oracle/oradata/orcl/redo2a.log ',
'/u01/app/oracle/oradata/orcl/redo2b.log'
) SIZE 50M,
GROUP 3 (
'/u01/app/oracle/oradata/orcl/redo3a.log ',
'/u01/app/oracle/oradata/orcl/redo3b.log '
) SIZE 50M
DATAFILE
    '/u01/app/oracle/oradata/orcl/system01.dbf',
   ' /u01/app/oracle/oradata/orcl/undotbs01.dbf',
   ' /u01/app/oracle/oradata/orcl/sysaux01.dbf',
   ' /u01/app/oracle/oradata/orcl/users01.dbf',
    '/u01/app/oracle/oradata/orcl/example01.dbf',
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf'
SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
 
 
最后执行创建脚本
SQL> @/u02/orcl/ctl.sql
 
完成后需要在次对数据库进行备份 (控制文件重建,以前的备份就无效了)
 
 
日志文件的丢失
在执行恢复之前,需要先对数据库 datafile 、controlfile、spfile|pfile 进行备份,如果恢复失败可以恢复到恢复失败前。
 
日志文件丢失启动数据库 会报错
ORA-00313:
ORA-00312:
执行resetlogs也会报错
SQL> alter database open resetlogs;
ORA-01139:
 
可以使用欺骗手段
SQL> recover database using backup controlfile;
Specify log:  回车
再次执行resetlogs
SQL> alter database open resetlogs;
ORA-1113:
ORA-1110:
这时候就可以使用隐藏参数忽略一致性验证
SQL> alter system set "_allow_resetlogs_corrution"=true scope=spfile;
将数据库重启动到mount状态
SQL> startup force mount
启动数据库到open状态会提示需要resetlogs启动
SQL> alter database open;
ORA-01589:must use RESETLOGS or NOSETLOGS….
执行resetlogs启动数据库
SQL> alter database open resetlogs;
Database altered.
SQL>
启动成功后取消隐藏参数
SQL> alter system reset  " _allow_resetlogs_corruption" scope=spfile sid='*';
然会重启数据库
SQL>shutdown immediate
SQL> startup
 
系统表空间丢失
在resetlogs 之前要做备份否则方法无效
 
 
Startup
ORA-01157:canont identify/lock data file 1 –see DBWR  trace file
 
ORA-01110:data file 1:’ u01/app/oracle/oradata/orcl/system01.dbf’
首先要先将数据库全备
将之前备份的数据文件拷回源地址
SQL> ho cp /u02/orcl/system01.dbf  u01/app/oracle/oradata/orcl/
启动数据库会提示需要做的工作
SQL> alter database open;
ORA-01113:file 1 needs media recovery
ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’
恢复数据库 (如果能恢复 直接打开数据库就可以,不能恢复找不到日志,可以退出恢复 )
SQL> recover database;
Specify log:
Cancel
SQL> alter database open;
ORA-01113:file 1 needs media recovery
ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’
还是需要恢复,使用隐藏参数忽略一致性验证。
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
重启数据库同样会报错
SQL> startup force
ORA-01113:file 1 needs media recovery
ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’
执行取消恢复 输入cancel
SQL> recover database until cancel;
Specify log:
Cancel
ORA-01547: RECOVER succeeded but OPEN RESETLOGS would……
 
Resetlogs 启动数据库
SQL> alter database open resetlogs;
ORA-00603: ORACLE server session terminated by fatal error
退出会话重新连接启动数据库
SQL>exit
[oracle@yang ~]$ sqlplus “/ as sysdba”
SQL>startup
 
成功启动一定要将隐藏参数改掉
SQL> alter system set "_allow_resetlogs_corruption"=false scope=spfile;
SQL> alter system reset "_allow_resetlogs_corruption" scope=spfile sid=’*’;
虽然数据库启动成功,但是备份后的数据都将丢失。
 
 
辅助表空间丢失
在冷备以来控制文件没有被重建,也没有执行resetlogs ,则可以使用备份还原,然后使用隐藏参数忽略一致性验证启恢复。
 
如果控制文件被重建,或者执行了resetlogs。那么只能将数据文件脱机,然后以exp表形式导出数据,然后新建数据库,把导出的数据导回。
还有一种很麻烦的方法,将数据库启动到 startup         migrate 状态,drop tablespace sysaux;根据提示做相应的修改。然后重建。
 
SQL> startup
ORA-01157: canont identify/lock data file 3 –see DBWR  trace file
ORA-01110: data file 3: ‘/u01/app/oracle/oradata/orcl/sysaux01.dbf’
 备份还原
SQL> ho cp /u02/orcl/sysaux01.dbf  /u01/app/oracle/oradata/orcl/
恢复数据库
SQL> recover database until cancel;
Specify log:
Cancel
ORA-01547: RECOVER succeeded but OPEN RESETLOGS would……
SQL> alter database open resetlogs;
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Sisconnection forced
实例中断 重连会话启动数据库
SQL> exit
 
[oracle@yang ~]$ sqlplus "/ as sysdba"
SQL> startup
 
 
Undo表空间丢失
 
如果有其他可用的undo表空间,则可以修改参数undo_tablespace 改为可用的undo表空间名,把损坏的脱机 然后启动数据库 ,删除坏的undo表空间。然后建立新的undo表空间,并修改为默认undo为新建的undo表空间
 
如果没有其他可用的undo表空间,则可以使用隐藏参数使undo表空间强制脱机,然后启动数据库,最后删除undo表空间,建立新的
 
演示没有其他可用undo
SQL> startup
ORA-01157: canont identify/lock data file 2 –see DBWR  trace file
ORA-01110: data file2: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’
修改undo为手动管理
SQL> show parameter undo_
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
SQL>
 
SQL> alter system set undo_management =maunal scope=spfile;                 
 
找到隐藏参数
SQL> select ksppinm from x$ksppi where  ksppinm like '%roll%';
 
KSPPINM
--------------------------------------------------------------------------------
transactions_per_rollback_segment
rollback_segments
_rollback_segment_initial
_rollback_segment_count
_offline_rollback_segments
_corrupted_rollback_segments
_cleanup_rollback_entries
_rollback_stopat
fast_start_parallel_rollback
_mv_rolling_inv
 
10 rows selected.
 
SQL>
使用隐藏参数并重启数据库
 
SQL> alter system set "_offline_rollback_segments"=true scope=spfile;
 
SQL>shutdown immediate;
SQL>startup
ORA-01157: canont identify/lock data file 2 –see DBWR  trace file
ORA-01110: data file2: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’
将undo脱机
SQL> alter database datafile 2 offline drop;
 
启动数据库到open
SQL> alter database open;
可以查看undo表空间状态
SQL> select * from v$rollname;
 
       USN NAME
---------- ------------------------------
         0 SYSTEM
 
SQL> select usn,status from v$rollstat;
 
       USN STATUS
---------- ---------------
         0 ONLINE
 
SQL>
删除undo表空间并重建
SQL> drop tablespace undotbs1;
SQL> create undo tablespace undotbs1 datafile '/u01/app/oracle/oradata/orcl/undotbs101.dbf' size 250m autoextend on;
 
取消隐藏参数
SQL> alter system set "_offline_rollback_segments"=false scope=spfile;
SQL> alter system reset "_offline_rollback_segments" scope=spfile sid='*';
 
将undo_tablespace 参数改回自动管理
SQL> alter system set undo_management =auto scope=spfile;
 
最后重启数据库
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值