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 controlfilespfile|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-01157canont identify/lock data file 1 –see DBWR  trace file

 

ORA-01110data 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;

 

最后重启数据库

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29532781/viewspace-1174681/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29532781/viewspace-1174681/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值