Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3386144
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类: Oracle

2017-05-14 10:50:28

工作RAC环境很多,为了应付未来可能发生的状况,根据网上的文章,研究一下了kfed以及amdu磁盘组恢复工具。

kfed

kfed=kernel file metadata editor。当asm磁盘组无法正常mount的时候可以使用该工具来分析ASM磁盘组的状态,并且可以此工具进行修复磁盘头的任务。
磁盘头信息一般 au0 blkn0 上
11.1.0.7以后磁盘头的信息会自动备份在au1 blkn 254上
可以使用kfed查看
kfed read /dev/raw/raw1 aun=0 blkn=0 
kfed read /dev/raw/raw1 aun=1 blkn=254
kfed repire 11.1.0.7以后可以使用下面的命令使用自动备份的信息快速修复受损的磁盘头。 
kfed repair /dev/raw/raw1
上面的命令会自动把aun=1 blkn=254的block 写到aun=0 blkn=0 上面
11.1.0.7以前需要手动备份磁盘头
备份
kfed read  /dev/oracleasm/disks/CRSVOL      aunum=0 blknum=0 text=raw1.txt
恢复
kfed write /dev/oracleasm/disks/CRSVO       aunum=0 blknum=0 text=raw1.txt






amdu

网上的文章总是少一些关键信息,所以这里将详细的实验步骤记录如下。
当磁盘头全部损坏,无法打开集群的时候,可以使用amdu来抽取磁盘组中的信息,比如说存储在磁盘组上面的数据文件、redolog、控制文件等。
下面的例子是抽取存储于asm diskgroup 中的数据库相关文件,在异机恢复的例子:
先查看alert日志确定controlfile的位置
  control_files            = "+DATA1/startrek/controlfile/current.260.921401239"
amdu -diskstring '/dev/raw/*' -extract DATA1.260
当前目录下会生成以当前时间命名的目录
-bash-4.1$ ls
DATA1_260.f  report.txt
会找到生成的控制文件。
-bash-4.1$ strings DATA1_260.f | grep DATA1 |sort | uniq
+DATA1/startrek/datafile/sysaux.257.921401115
+DATA1/startrek/datafile/system.256.921401115
+DATA1/startrek/datafile/undotbs1.258.921401115
+DATA1/startrek/datafile/undotbs2.264.921401389
+DATA1/startrek/datafile/users.259.921401115
+DATA1/startrek/onlinelog/group_1.261.921401241
+DATA1/startrek/onlinelog/group_2.262.921401243
+DATA1/startrek/onlinelog/group_3.265.921401757
+DATA1/startrek/onlinelog/group_4.266.921401759
+DATA1/startrek/tempfile/temp.263.921401257
即可找到数据库相关的文件在磁盘组中的位置。然后可以使用amdu extract 的功能将磁盘组中的相关文件转储到本地硬盘中。
-bash-4.1$ strings DATA1_260.f | grep DATA1 |sort | uniq | awk -F"." '{print "amdu -diskstring '/dev/raw/*' -extract DATA1." $2}' 
amdu -diskstring /dev/raw/* -extract DATA1.257
amdu -diskstring /dev/raw/* -extract DATA1.256
amdu -diskstring /dev/raw/* -extract DATA1.258
amdu -diskstring /dev/raw/* -extract DATA1.264
amdu -diskstring /dev/raw/* -extract DATA1.259
amdu -diskstring /dev/raw/* -extract DATA1.261
amdu -diskstring /dev/raw/* -extract DATA1.262
amdu -diskstring /dev/raw/* -extract DATA1.265
amdu -diskstring /dev/raw/* -extract DATA1.266
amdu -diskstring /dev/raw/* -extract DATA1.263
要注意前面磁盘组的名称,对应,这里磁盘组DATA1写死了,如果有多个磁盘组,需要自行判断。
使用grid用户执行上述命令,oracle会无法发现磁盘组
-bash-4.1$ ls
amdu_2016_09_01_10_19_21  amdu_2016_09_01_10_21_28  amdu_2016_09_01_10_21_50  amdu_2016_09_01_10_22_16
amdu_2016_09_01_10_20_25  amdu_2016_09_01_10_21_35  amdu_2016_09_01_10_21_58  oradiag_grid
amdu_2016_09_01_10_21_14  amdu_2016_09_01_10_21_41  amdu_2016_09_01_10_22_07
执行完命令后会将相应的参数文件抽取到当前时间命名的目录下
集中到一个目录下
-bash-4.1$ find ./ -name *.f
./amdu_2016_09_01_10_22_16/DATA1_263.f
./amdu_2016_09_01_10_21_50/DATA1_262.f
./oradata/amdu_2016_09_01_10_35_49/DATA1_257.f
./amdu_2016_09_01_10_21_28/DATA1_264.f
./amdu_2016_09_01_10_21_58/DATA1_265.f
./amdu_2016_09_01_10_20_25/DATA1_256.f
./amdu_2016_09_01_10_21_41/DATA1_261.f
./amdu_2016_09_01_10_22_07/DATA1_266.f
./amdu_2016_09_01_10_19_21/DATA1_257.f
./amdu_2016_09_01_10_21_14/DATA1_258.f
./amdu_2016_09_01_10_21_35/DATA1_259.f
-bash-4.1$ mv `find ./ -name *.f` ./oradata
-bash-4.1$ ls ./oradata
DATA1_256.f  DATA1_258.f  DATA1_261.f  DATA1_263.f  DATA1_265.f
DATA1_257.f  DATA1_259.f  DATA1_262.f  DATA1_264.f  DATA1_266.f
把控制文件也转移过来
-bash-4.1$ mv /u01/app/11.2.0/grid/gpnp/dsdb11g1/profiles/peer/amdu_2016_09_01_09_44_15/DATA1_260.f ./oradata/
DATA1_260.f
为控制文件,修改一下$ORACLE_HOME/dbs/目录下的init.ora文件
db_name='STARTREK'
memory_target=1G
processes = 150
audit_file_dest='/u01/app/oracle/admin/orcl/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='/u01/app/oracle'
db_recovery_file_dest_size=2G
diagnostic_dest='/u01/app/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
# You may want to ensure that control files are created on separate physical
# devices
control_files = '/u01/app/oracle/oradata/startrek/DATA1_260.f'
compatible ='11.2.0.4.0'
为了不破坏生产环境,一般把这些相关文件copy到异机执行相关恢复操作。
startup mount pfile='/u01/app/oracle/oradata/startrek/init.ora'
select name from v$datafile ;
因为原来存放在磁盘组,现在为本地硬盘,所以需要使用alter database rename 操作。
相关sql语句(不完善):
select 'alter database rename file '''||member||''' to '''||replace(member,'+DATA1/startrek/datafile','/u01/app/oracle/oradata/startrek')||''' ;' from v$logfile;
alter database rename file '+DATA1/startrek/datafile/system.256.921401115' to '/u01/app/oracle/oradata/startrek/DATA1_256.f' ;
alter database rename file '+DATA1/startrek/datafile/sysaux.257.921401115' to '/u01/app/oracle/oradata/startrek/DATA1_257.f' ;
alter database rename file '+DATA1/startrek/datafile/undotbs1.258.921401115' to '/u01/app/oracle/oradata/startrek/DATA1_258.f' ;
alter database rename file '+DATA1/startrek/datafile/users.259.921401115' to '/u01/app/oracle/oradata/startrek/DATA1_259.f' ;
alter database rename file '+DATA1/startrek/datafile/undotbs2.264.921401389' to '/u01/app/oracle/oradata/startrek/DATA1_264.f' ;
select member from v$logfile ;
alter database rename file '+DATA1/startrek/onlinelog/group_2.262.921401243' to '/u01/app/oracle/oradata/startrek/DATA1_262.f' ;
alter database rename file '+DATA1/startrek/onlinelog/group_1.261.921401241' to '/u01/app/oracle/oradata/startrek/DATA1_261.f' ;
alter database rename file '+DATA1/startrek/onlinelog/group_3.265.921401757' to '/u01/app/oracle/oradata/startrek/DATA1_265.f' ;
alter database rename file '+DATA1/startrek/onlinelog/group_4.266.921401759' to '/u01/app/oracle/oradata/startrek/DATA1_266.f' ;
然后open 即可完成 异机恢复。
SQL> alter database open ;
Database altered.
SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/startrek/DATA1_263.f' reuse ;
Tablespace altered.
SQL> alter tablespace temp drop tempfile '+DATA1/startrek/tempfile/temp.263.921401257' ;
Tablespace altered.
阅读(2209) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~