baizhaoxian
作者baizhaoxian联盟成员·2016-06-16 16:28
容灾备份管理工程师·

Oracle数据库备份与恢复

字数 15224阅读 1909评论 0赞 1

--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:dataods_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:dataods_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');

--其他...

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广