冷备:
数据库在关闭的状态下完成物理系统拷贝的过程。冷备更适用于非归档模式下。
冷备的步骤:
首先,在运行的库中得到数据库运行的所有的物理文件。
然后,在计划内关闭数据库,在执行拷贝物理文件到备份路径/设备
备份完成后立即启动数据库,让其提供正常服务。
备份前的查询工作
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;
最后重启数据库 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29532781/viewspace-1174681/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29532781/viewspace-1174681/