oracle 冷备份与恢复
set pagesize 0 linesize 32767 feedback off verify off trimspool on termout off trimout on serveroutput on
define fil=/home/oracle/cdbk.sql
define log=/home/oracle/cdbk.log
spool &fil
prompt connect sys/oracle@clonedb as sysdba;
prompt shutdown immediate;
select 'host cp' || file_name || '/manualbak/clonedb'||substr(file_name,instr(file_name,'/',-1,1)) from dba_data_files;
prompt startup
spool off
spool &log
@&fil;
spool off;
linux中的alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls ='ls -- color=tty'
alias rmanclonedb='uniread rman target sys/oracle@clonedb catalog rman10asm/rman@asmdemo
alias rmansm='uniread rman target/ sys/oracle@smk catalog rman10asm@asmdemo
alias sqlasm='uniread sqlplus sys/oracle@asm as sysdba'
alias sqlaskdemo = 'uniread sqlplus sys/oracle@asmdemo as sysdba'
alias sqlclonedb='uniread sqlplus sys/oracle@clonedb as sysdba'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
1.删除non-system tablespace数据文件
online 恢复数据库
(切换日志)
alter system switch logfile;
alter system archive log current;
删除数据文件(模拟灾难发生)
查找non-system tablespace
select status ,name from v$datafile;
删除数据文件/oradata/clonedb/tbs_test01.dbf
查找数据文件所在的表空间(tbs_test表空间)的sql语句:
select tablespace_name from dba_data_files where file_name='/oradata/clonedb/tbs_test01.dbf'
删除数据文件用户,数据库还是能够运行的,除非你操作已经删除的表空间
连接到一个center用户(表空间名称为center)
conn center/center
对center表空间下面的操作时不会受影响的
select tablespace_name ,table_name from user_tables;
不能对tbs_test表空间进行操作,对 tbs_test操作会产生错误
1.1拷贝数据文件到待恢复的目录
cp /manualbak/clonedb/tbs_test01.dbf /oradata/clonedb/tbs_test01.dbf
1.2 select status from v$datafile;
recover tablespace tbs_test
出现一个Oracle错误,ORA_01124
在sql中查看ORACLE错误的命令是:!oerr ora 01124
alter tablespace tbs_test online (触发Oracle去查找数据文件,这个时候发现数据文件不在了,所以就需要进行恢复)
recove datafile 5;
select stauts from v$datafile时,发现数据文件处于OFFLINE状态(因为数据文件是在关机的时候备的,所以出于OFFLINE状态,在数据文件的尾部有个标记,在开关机的时候进行设置)
alter database datafile 5 online;
2.删除system表空间数据文件
在mount状态恢复数据库
system 表空间包含数据字典
删除数据文件
select * from v$datafile (会产生错误)
3.undo表空间数据文件
在线回复UNDO表空间
rm undotbs1.dbf (删除undo表空间)
insert into tb_type(col1)values('你好');
commit;
select table_name from dictionary where table_name like '%UN%'
cp /manualbak/clonedb/undotbs1.dbf /oradata/clonedb/undotbs1.dbf;
select * from v$datafile;
数据库没有发现undo文件已经被删除掉了,数据库怎么知道文件被删除
做一个检查点:
alter system checkpoint;
数据库发现文件不存在
recove datafile 2
select * from v$datafile;
alter database datafile2 online;
4.删除联机日志
备份控制文件: select * from V$controlfile;
cp control01.ctl control03.ctl
删除所有的redoLog(RedoBuffer每三分钟、1M、commit,写到redoLog中)
rm redo_g*
数据库还不知道文件已经丢失
tail -f /u01/oracle/admin/clonedb/bdump/alert_clonedb.log
alter system checkpoint
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
shutdown abort
startup mount
alter database open (找不到日志)
你的控制文件找不到联机日志
shutdown abort
重建控制文件(需要重建控制文件的脚本)
alter database backup controlfile to trace;
在shutdown之间找到oracleclonedb(Description=(local=yes)(address=(protocol=beq)))的PID(13957),这个PID是有用的
shutdown abort;
vi /u01/oracle/admin/clonedb/udump/clonedb_ora_13957.trc
clonedb_ora_13957.trc是生产控制文件的脚本,任何找到RESETLOGS部分
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE 'CLONEDB' RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTROY 292
LOGFILE
GROUP 1 '/oradata/clonedb/redo_g1_m1.ora' SIZE 5M
GROUP 2 '/oradata/clonedb/redo_g2_m1.ora' SIZE 5M
GROUP 3 '/oradata/clonedb/redo_g3_m1.ora' SIZE 5M
--- STANDBY LOGFILE
DATAFILE
'/oradata/clonedb/system01.dbf',
'/oradata/clonedb/undotbs1.dbf',
'/oradata/clonedb/sysaux01.dbf'
CHARACTER SET AL32UTF8
执行建立控制文件脚本
alter database open;
出现一个错误,must use RESETLOGS OR NORESETLOGS OPTION
alter database open resetlogs;
由于通过abort关闭数据库,它告诉你有数据文件需要回复
recover database using backup controlfile until cancel
由于通过abort关闭数据库,它找不到联机重做日志来恢复数据文件
恢复system数据文件
rm system01.dbf
cp /manualbak/clonedb/system01.dbf ./oradata/system01.dbf
recover database using backup controlfile until cancel
对其他的数据文件进行恢复,如果不是进行abort关机,可以不对数据文件进行恢复
alter database open resetlogs;
select * from v$logfile,查看日志文件是否恢复成功
5.删除控制文件
rm control01.ctl
rm control02.ctl
select * from v$datafile;
select * from v$controlfile
alter system checkpoint;
重新连接到数据库,出现控制文件不存在(一般的文件操作时可以的)
如果对控制文件进行写的话,会产生错误
alter system switch logfile(对数据文件进行写操作)(不成功)
控制文件记录了archivelog ,当前的redolog的序号.还记录了你的数据文件是否ONLINE
tail -f /u01/oracle/admin/clonedb/bdump/alert_clonedb.log
alter database datafile 5 offline/online(对控制文件进行写操作)
恢复控制文件:
cp control03.ctl control01.ctl
cp control03.ctl control02.ctl
alter database datafile 5 offline(不行)
shutdown immediate
conn / as sysdba;
shutdown abort
startup mount
recover database using backup controlfile ;
因为control03.ctl是在resetlog之间备份的,在resetlog之后不容许还原
使用脚本来创建控制文件
startup nomount
@$HOME/ctlsql.sql
alter database open resetlogs;
recover database using backup controlfile;(until cancel)
把日志也引用一下
在Specify log:{<RET>=suggested | filename |AUTO|CANCEL}下输入
/oradata/clonedb/redo_g1_m1.ora
/oradata/clonedb/redo_g2_m1.ora
/oradata/clonedb/redo_g3_m1.ora
alter database open resetlogs;
6. 删除临时表空间
select tablespace_name from dba_tablespace where contents=TEMPORARY
执行一个排序,来创建一个临时表空间文件
explain plan for select * from center.zx_gs_qyxx order by qymc;(出现临时表空间为空)
alter tablespace temp add tempfile '/oradata/clonedb/temp01.dbf' size 100m autoextend off;
(再次执行)explain plan for select * from center.zx_gs_qyxx order by qymc;
select * from table(dbms_xplan.display);
该表中有个tempspace ,在排序的时候,使用了 93M的临时表空间
删除临时表空间的数据文件
rm temp01.dbf
在center用户下面,就报不能够找到临时表空间的数据文件temp01.dbf
conn / as sysdba;
alter tablespace temp add tempfile '/oradata/clonedb/temp02.dbf' size 100m autoextend off;
alter tablespace temp drop tempfile 1;
conn center/center
select * from center.zx_gs_qyxx order by qymc