大数跨境
0
0

深入浅析Oracle数据库备份恢复

深入浅析Oracle数据库备份恢复 云容灾备份安全治理
2017-01-08
2
导读:--1.bbed恢复数据库文件,数据库已经开启归档mkdir /home/oracle/bakupmkdir

--1.bbed恢复数据库文件,数据库已经开启归档
mkdir /home/oracle/bakup
mkdir /home/oracle/datafiles
sqlplus / as sysdba
alter tablespace system add datafile '/home/oracle/datafiles/system02.dbf' size 50m;
quit
cp /home/oracle/datafiles/system02.dbf /home/oracle/bakup
--删除system02.dbf,重现场景
shutdown immediate
rm -rf /home/oracle/datafiles/system02.dbf
--bbed设置数据块文件列表
--BBED>set list '/home/oracle/filelist.txt'

(保留好 原环境,做好数据备份,在新的测试环境上测试
--http://blog.itpub.net/19015/viewspace-806482/
--http://blog.itpub.net/29621173/viewspace-1201586/

--查询数据库状态
select status,database_status from v$instance;
select * from dba_data_files;

1. oracle用户在数据库服务器上部署 bbed

复制 sbbdpt.o , ssbbded.o到 /home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/lib
     bbedus.msb          到 /home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg

2. 编译bbed

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

3. 把 oracle用户的 .bash_profile中增加 bbed
vi ~/.bash_profile

export PATH=$PATH:$ORACLE_HOME/rdbms/lib

source ~/.bash_profile

4.
sql>sqlplus / as sysdba
sql>startup
sql>alter database create datafile '/home/oracle/datafiles/system02.dbf' as '/home/oracle/datafiles/system02.dbf';
sql>!

5. Oracle配置 bbed配置文件
cd ~
vi par.txt

blocksize=16384
listfile=filelist.txt
mode=edit

vi filelist.txt
#内容来自   select file#,name,bytes from v$datafile_header; 空格分开字段,
#取一个正常的数据文件,另外一个是 system02.dbf,根据实际情况修改下面的配置 ,第一列 文件编号 不重复即可,11g中只能识别最后1行,第13号文件不配置时仍然可以读取,当不能识别1号文件时set filename设置1号文件即可(或注释13号文件)
1 /home/oracle/app/oradata/srp/system01.dbf           754974720
13 /home/oracle/datafiles/system02.dbf            52428800

6. bbed修改数据文件 /home/oracle/datafiles/system02.dbf 的 scn(kcvfhckp),chckpoint_time(kcvcptim),检查点计数器(kcvfhcpc),控制文件备份的计数器(kcvfhccc)

bbed parfile=par.txt
--password默认密码:blockedit
Password:

BBED: Release 2.0.0.0.0 - Limited Production on Mon Sep 16 07:11:57 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************
BBED>HELP ALL
BBED>INFO

#查看坏文件 文件头信息
---13号文件,第一个块
set filename '/home/oracle/app/oradata/srp/system01.dbf'
BBED>set DBA 13,1   
BBED>map
BBED>p kcvfh

struct kcvfhckp, 36 bytes                @484    

      ub4 kscnbas                        @484      0x0016e47e
...
ub4 kcvcptim                          @492      0x35de7a53
...
ub4 kcvfhcpc                          @140      0x00000001
...
ub4 kcvfhccc                          @148      0x00000001
---更改filelist.txt中1号文件为最后1行,查看其它正常的数据文件(1号文件)
--设置bbed数据块文件(若不显示正常system01.dbf文件列表)
--set filename '/home/oracle/app/oradata/srp/system01.dbf'
BBED>set DBA 1,1

BBED>map
----Bbed查看kcvfh信息
BBED>p kcvfh
 ub4 kscnbas                        @484      0x0016e66d

 ub4 kcvcptim                       @492      0x35de7a7b

 ub4 kcvfhcpc                       @140      0x000000e7

 ub4 kcvfhccc                       @148      0x000000e6

#--查看正常数据文件头(1号system01数据文件头)scn转码前的值
BBED> dump offset 484 count 4
-- File: /oracle/amldb/amlsys/system01.dbf (1)
-- Block: 1                Offsets:  484 to  487           Dba:0x00400001
--------------------------------------------------------------------------
-- 43e61600
-- <32 bytes per line>

--查看正常数据文件头(1号system01数据文件头) create scn 转码前的值
BBED> dump offset 100 count 4
-- File: /oracle/amldb/amlsys/system01.dbf (1)
-- Block: 1                Offsets:  100 to  103           Dba:0x00400001
--------------------------------------------------------------------------
-- 0c000000
-- <32 bytes per line>
-- fcc60700
--查看正常数据文件头(1号system01数据文件头)chckpoint_time的值

BBED> dump offset 492 count 4
-- File: /oracle/amldb/amlsys/system01.dbf (1)
-- Block: 1                Offsets:  492 to  495           Dba:0x00400001
--------------------------------------------------------------------------
-- e1c1dd35
-- <32 bytes per line>

--查看正常数据文件头(1号system01数据文件头)检查点计数器(kcvfhcpc)的值
BBED> dump offset 140 count 4
-- File: /oracle/amldb/amlsys/system01.dbf (1)
-- Block: 1                Offsets:  140 to  143           Dba:0x00400001
--------------------------------------------------------------------------
-- e7000000
-- <32 bytes per line>

--查看正常数据文件头(1号system01数据文件头)控制文件备份的计数器(kcvfhccc)的值
BBED> dump offset 148 count 4
-- File: /oracle/amldb/amlsys/system01.dbf (1)
-- Block: 1                Offsets:  148 to  151           Dba:0x00400001
--------------------------------------------------------------------------
-- e6000000
-- <32 bytes per line>

--修改旧数据文件头(13号system02.dbf数据文件头)scn的值  b2d10700  中0700不能加
BBED>set DBA 13,1
BBED>dump offset 484 count 4
BBED>m/x 6de6  offset 484
--修改旧数据文件头(13号system02.dbf数据文件头)chckpoint_time的值  dbbe3f31 中3f31不能加
BBED>dump offset 492 count 4
BBED>m /x 7b7a offset 492
--修改旧数据文件头(13号system02.dbf数据文件头)检查点计数器(kcvfhcpc)的值 47000000 中0000不能加
BBED>dump offset 140 count 4
BBED>m /x e700 offset 140
--修改旧数据文件头(13号system02.dbf数据文件头)控制文件备份的计数器(kcvfhccc)的值 46000000 中 0000 不能加
BBED>dump offset 148 count 4
BBED>m /x e600 offset 148

---重新生成sum
BBED> sum apply

--查询各个数据文件头scn
sql >select file#,checkpoint_change#,name from v$datafile_header;
--尝试打开数据库
sql > alter database open;
ERROR at line 1:
ORA-01122: database file 14 failed verification check
ORA-01110: data file 14: '/oracle/amldb/amlsys/system02.dbf'
ORA-01207: file is more recent than control file - old control file

--查看控制文件中关于bbed数据文件的信息
sql > alter session set events 'immediate trace name controlf level 8';
Session altered.
sql > oradebug setmypid;
sql >oradebug tracefile_name;
sql > host more 上一步的文件名

 aux_file is NOT DEFINED
DATA FILE #14:
  (name #18) /oracle/amldb/amlsys/system02.dbf
creation size=32768 block size=8192 status=0xe head=18 tail=18 dup=1
 tablespace 0, index=1 krfil=14 prev_file=1
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:12 scn: 0x0000.0007d1b2 09/16/2013 05:00:11
            -------记数为12 , 备份计数 为11=12-1
 Stop scn: 0x0000.0007d1b2 09/16/2013 05:00:11
 Creation Checkpointed at scn:  0x0000.0007c6fc 09/16/2013 03:58:57
 thread:1 rba:(0x1e.3da.10)
--修改旧数据文件头(13号system02.dbf数据文件头)检查点计数器(kcvfhcpc)的值
BBED>m /x 4000 offset 140
--修改旧数据文件头(13号system02.dbf数据文件头)控制文件备份的计数器(kcvfhccc)的值 
BBED>m /x 3000 offset 148
--重新生成sum
BBED> sum apply

--尝试启动数据库
sql > alter database open;
还是报错!
ORA-01207: file is more recent than control file - old control file

--重建control 文件
sql>alter database backup controlfile to trace;
sql>oradebug setmypid
sql>oradebug tracefile_name
sql>host more 文件名            ##复制出CREATE CONTROLFILE REUSE DATABASE "XXX" RESETLOGS  NOARCHIVELOG 部分
host more /home/oracle/app/oracle/diag/rdbms/srp/srp/trace/srp_ora_5178.trc
sql>shutdown immediate
sql>STARTUP NOMOUNT
sql> 执行得到的 CREATE CONTROLFILE REUSE

sql>alter database mount;
--以下出错不用理会
sql>RECOVER DATABASE USING BACKUP CONTROLFILE;
sql>ALTER DATABASE OPEN RESETLOGS;
sql>RECOVER DATABASE;
sql>RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
sql>ALTER DATABASE OPEN RESETLOGS;
--到这里数据库应该能启动起来了
--sql>ALTER TABLESPACE TEMP ADD TEMPFILE '/home/oracle/datafiles/temp02.dbf' REUSE;

--------------------------------------------------------------------------------------------------------
--2.linux制作回收站
mkdir /tmp/trash_tmp
vi /bin/trash

mv $@ /tmp/trash_tmp

alias rm=/bin/trash
vi /etc/bashrc

alias rm=/bin/trash

chmod 755 /bin/trash
chmod 777 /tmp/trash_tmp
source /etc/bashrc
--以后删除文件命令变成
--删除后放入回收站
rm -i file_name
--或
rm file_name
--彻底删除
/bin/rm -i file_name
--------------------------------------------------------------------------------------------------------
--3.rman自动备份恢复
--设置归档,rman备份前需要设置归档
mkdir /home/oracle/archivelog
sqlplus / as sysdba
alter system set log_archive_dest_1="location=/home/oracle/archivelog";
--或者
alter system set log_archive_dest_1='location=/home/oracle/archivelog';

shutdown immediate
startup mount
alter database archivelog;
alter database open;
alter system switch logfile;
--查询归档
archive log list;
--查询归档日志
select * from v$log;
--设置归档格式,可选
alter system set log_archive_format="archive_%t_%s_%r.log" scope=spfile;
--oracle 9i中需要启用归档
alter system set log_archive_start=TRUE scope=spfile;
show parameter log_archive_start;

--备份脚本在crontab下执行
mkdir /home/oracle/rmanbackup/
--0级全库备份脚本
vi backupfull.sh

#script .:backupfull.sh
#date:2016-02-04
#desc:backup full database datafile in archive with rman
#connect database
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=srp
export PATH=$ORACLE_HOME/bin/:$PATH
rman target / <<EOF_RMAN
run{
  allocate channel c1 type disk;
  backup incremental level 0 tag 'full0' format '/home/oracle/rmanbackup/full0_%d_%T_%s' database include current controlfile;
  delete noprompt obsolete;
  release channel c1;
};
#end

--1级增量备份脚本
vi incr1.sh

# script .:incr1.sh
#date:2016-02-04
#desc:backup full database datafile in archive with rman
#connect database
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=srp
export PATH=$ORACLE_HOME/bin/:$PATH
rman target / <<EOF_RMAN
run{
  allocate channel c1 type disk;
  backup incremental level 1 tag 'full1_%_%T_%s' format '/home/oracle/rmanbackup/full1_%d_%T_%s' database include current controlfile;
  delete noprompt obsolete;
};

--设置自动化执行备份脚本
chmod 755 backupfull.sh
$crontab -e
0 1 * * 0 /home/oracle/rmanbackup/backupfull.sh >> /home/oracle/rmanbackup/backupfull.log
0 1 * * 3 /home/oracle/rmanbackup/backupfull.sh >> /home/oracle/rmanbackup/backupfull.log
30 1 * * 1-2 /home/oracle/rmanbackup/incr1.sh >> /home/oracle/rmanbackup/incr1.log
30 1 * * 4-6 /home/oracle/rmanbackup/incr1.sh >> /home/oracle/rmanbackup/incr1.log

--以上脚本含义为星期天和星期三01:00全量备份,星期一到二和星期四到六的01:30增量备份

--------------------------
--crontab定时中删除归档日志
--生成日志和连接rman部分或者写成
--exec >> /home/oracle/clear_arch/delarch`date +%y-%m-%d-%H`.log
--$ORACLE_HOME/bin/rman target / <<EOF
--创建所需目录
mkdir /home/oracle/clear_arch

vi /home/oracle/clear_arch/del_arch.sh 增加(需要export环境变量以防crontab不执行)

#! /bin/bash
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=srp
export PATH=$ORACLE_HOME/bin/:$PATH
${ORACLE_HOME}/bin/rman nocatalog log=/home/oracle/clear_arch/del_arch$(date +%Y-%m-%d).log  <<EOF 
connect target /
delete noprompt archivelog until time 'sysdate-1';
exit;
EOF

--赋权
chomd +x del_arch.sh

--查看cron运行日志(root用户下查看)
more /var/log/cron
--------------------------------------------------------------------------------------------------------
--4.数据泵导出
--by zhuyj
create or replace directory dump_dir as 'f:\datamove\';
grant read,write on directory dump_dir to srp;
expdp srp/srp@srp directory=dir_dump dumpfile=dump_dir:t31_r1104_bprocess.dmp logfile=dump_dir:t31_r1104_bprocess.log tables=t31_r1104_bprocess

oracle数据泵可以作业分离,允许挂起和恢复导入导出任务,可以从失败点重新启动失败的作业,还可以控制导入导出的版本
1.expdp、impdp命令:
1> 常用参数
content:导出数据还是元数据(表和索引的创建语句),选项有:all、data_only、metadata_only
directory:dumpfile和logfile的目录对象
exclude:不到处指定的对象(与这些对象有依赖的也不会导出)
include:导出制定的对象,与exclude相反
job_name:定义导出作业的名称
attach:附加到已经在运行的现有作业,用于管理作业
full:默认值为n,full=y表示导出所有对象
nologfile:=y,默认值为n
tables/tablespace:制定表/表空间,包括其依赖对象
table_exists_action(导入参数):定义当表已经存在时执行的操作,可选项:skip、replace、truncate
2>导出举例(导入类似):
create or replace directory dumpdir as '/data/backup';
--赋予所有权限
grant all on directory to system;
grant EXPORT FULL DATABASE to system;
--导出全库
expdp system/password@ip/ORACLE_SID dumpfile=dumpdir:db_%U.dmp logfile=dumpdir:db_exp_%U.log job_name=exp_db full=y
--导出制定表空间
expdp system/password@ip/ORACLE_SID tablespace=tbs dumpfile=dumpdir:tbs_01.dmp logfile=dumpdir:tbs_exp_01.log job_name=exp_tbs
--导出特定对象
expdp system/password@ip/ORACLE_SID include=function include=procedure include=table:''like 'TXT%''' dumpfile=dumpdir:tab_01.dmp nologfile=y job_name=exp_tab
--导出表
expdp system/password@ip/ORACLE_SID tables=XTCS,XTDW dumpfile=dumpdir:tab_02.dmp nologfile=y jobname=exp_tab01
--------------------------------------------------------------------------------------------------------

--5.exp导入导出表(或在pl/sql下操作)
--导出
exp srp/srp@srp feedback=50000 buffer=64000000 file=f:\data\ods_tables.dmp log=f:\ods_tables.log tables=TZ_CRD_CZDK,TZ_CRD_ZWTZ_DKMX,TZ_DJK_CUST,TZ_DJK_YE,TZ_FDKLXMX,TZ_A3302,TZ_A3410,TZ_BSYKMXX,TZ_CRD_BHTZ,TZ_CRD_CDTZ,TZ_CRD_DBDKTZ,TZ_CRD_JKDFTZ,TZ_CRD_TXTZ,TZ_CRD_ZTXTZ,TZ_CRM_GLFKH,TZ_CUSTINFO,TZ_ENTCUSTINF,TZ_FFHXX,TZ_G01_IX,TZ_KH_HISJTSXED,TZ_KH_HISSXED,TZ_KH_JT,TZ_KMYZZ,TZ_ORGANINFO,TZ_PRICUSTINF,TZ_S63,TZ_S64,TZ_SJGKHXX,TZ_SKMZD,TZ_XLKMDZB,TZ_YHBPYEB,TZ_YQDKZZQXRQ
--导入
imp srp/srp@srp feedback=50000 buffer=64000000 file=f:\data\ods_tables.dmp log=f:\ods_tables.log tables=TZ_CRD_CZDK

--6.闪回恢复
alter table enable row movement;
FLASHBACK TABLE TO TIMESTAMP TO_TIMESTAMP(' 00:15:30','YYYY-MM-DD HH24:MI:SS');

--.通过查询回滚段数据恢复
select * from table_name as of TIMESTAMP TO_TIMESTAMP(' 00:15:30','YYYY-MM-DD HH24:MI:SS');

--其他...


【声明】内容源于网络
0
0
云容灾备份安全治理
分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
内容 2171
粉丝 0
云容灾备份安全治理 分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
总阅读5.5k
粉丝0
内容2.2k