冷备:
数据库在关闭的状态下完成物理系统拷贝的过程。冷备更适用于非归档模式下。
冷备的步骤:
首先,在运行的库中得到数据库运行的所有的物理文件。
然后,在计划内关闭数据库,在执行拷贝物理文件到备份路径/设备
备份完成后立即启动数据库,让其提供正常服务。
备份前的查询工作
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;
最后重启数据库
数据库在关闭的状态下完成物理系统拷贝的过程。冷备更适用于非归档模式下。
冷备的步骤:
首先,在运行的库中得到数据库运行的所有的物理文件。
然后,在计划内关闭数据库,在执行拷贝物理文件到备份路径/设备
备份完成后立即启动数据库,让其提供正常服务。
备份前的查询工作
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;
最后重启数据库