--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 条评论