暂无图片
暂无图片
11
暂无图片
暂无图片
暂无图片

Oracle ASM利用amdu抽取磁盘文件实现还原数据库

934

介绍

本文档主要演示使用集群amdu工具抽取ASM整个数据库文件,还原至单机的过程。

Oracle 集群下提供了三个命令kfed、kfod、amdu,这些本身属于独立的工具,独立于ASM实例,无论ASM实例是否启动,ASM磁盘组是否MOUNT,它都可以正常使用。

  • kfed - Kernel Files metadata EDitor
    功能:可以用来修复ASM损坏的元数据
  • kfod - Kernel Files OSM Disk
    功能:可以查询ASM磁盘信息
  • amdu - ASM Metadata Dump Utility
    功能:可以直接从磁盘抽取数据库文件

各个命令位置如下
注:在11G之前的版本,kfed工具默认没有编译,需要手动编译使用

[grid@19db2:/home/grid/amdu_2021_11_09_11_16_45]$ cd
[grid@19db2:/home/grid]$ which kfed
/u01/app/19.0.0/grid/bin/kfed
[grid@19db2:/home/grid]$ which kfod
/u01/app/19.0.0/grid/bin/kfod
[grid@19db2:/home/grid]$ which amdu
/u01/app/19.0.0/grid/bin/amdu

实践过程

生成抽取语句

在ASM实例中,查询RACDB实例的所有数据文件,拼接为抽取命令。
注1:如果ASM实例已经打不开,需要使用kfed分析磁盘元数据找到对应数据文件别名,难度上升N个等级,下面先使用偷懒的方式验证amdu的使用。
注2:RACDB是在19C的集群里面安装一套11G的软件搭建的11G的库,下面恢复使用11G软件恢复。

[grid@19db2:/home/grid/racdb]$ sqlplus / as sysasm

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Oct 30 13:25:00 2024
Version 19.18.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.18.0.0.0

SQL> set linesize 200
SQL> set pagesize 999
SQL> select 'amdu -dis ''/dev/sd*'' -extract '||gname||'.'||FILE_NUMBER||' -output /home/grid/RACDB/'||aname "amdu extract"
  2    from (select concat('+' || gname, sys_connect_by_path(aname, '/')) full_path,
  3                 dir,
  4                 sys,
  5                 aname,
  6                 FILE_NUMBER,
  7                 gname
  8            from (select g.name            gname,
  9                         a.PARENT_INDEX    pindex,
 10                         a.NAME            aname,
 11                         a.REFERENCE_INDEX rindex,
 12                         a.ALIAS_DIRECTORY dir,
 13                         a.SYSTEM_CREATED  sys,
 14                         a.FILE_NUMBER FILE_NUMBER                       
 15                    from v$asm_alias a, v$asm_diskgroup g
 16                   where a.GROUP_NUMBER = g.GROUP_NUMBER)
 17           start with (mod(pindex, power(2, 24))) = 0
 18          connect by prior rindex = pindex
 19           order by dir desc, full_path asc)
 20   where full_path like upper('%RACDB%') and dir = 'N';

amdu extract
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
amdu -dis '/dev/sd*' -extract DATA.406 -output /home/grid/RACDB/Current.406.1108894561
amdu -dis '/dev/sd*' -extract DATA.438 -output /home/grid/RACDB/Current.438.1108894563
amdu -dis '/dev/sd*' -extract DATA.440 -output /home/grid/RACDB/SYSAUX.440.1108894519
amdu -dis '/dev/sd*' -extract DATA.401 -output /home/grid/RACDB/SYSTEM.401.1108894519
amdu -dis '/dev/sd*' -extract DATA.409 -output /home/grid/RACDB/UNDOTBS1.409.1108894519
amdu -dis '/dev/sd*' -extract DATA.371 -output /home/grid/RACDB/UNDOTBS2.371.1108894657
amdu -dis '/dev/sd*' -extract DATA.347 -output /home/grid/RACDB/USERS.347.1108894519
amdu -dis '/dev/sd*' -extract DATA.408 -output /home/grid/RACDB/V7PRODATA.408.1183728179
.......
amdu -dis '/dev/sd*' -extract DATA.387 -output /home/grid/RACDB/spfileracdb.ora
amdu -dis '/dev/sd*' -extract DATA.440 -output /home/grid/RACDB/sysaux01.dbf
amdu -dis '/dev/sd*' -extract DATA.401 -output /home/grid/RACDB/system01.dbf
amdu -dis '/dev/sd*' -extract DATA.370 -output /home/grid/RACDB/temp01.dbf
amdu -dis '/dev/sd*' -extract DATA.409 -output /home/grid/RACDB/undotbs01.dbf
amdu -dis '/dev/sd*' -extract DATA.371 -output /home/grid/RACDB/undotbs02.dbf
amdu -dis '/dev/sd*' -extract DATA.347 -output /home/grid/RACDB/users01.dbf

27 rows selected.

抽取文件

使用 amdu 命令可以快速将ASM磁盘数据文件直接导出至本地。

注:此处的数据库抽取为双份

[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.406 -output /home/grid/RACDB/Current.406.1108894561
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.438 -output /home/grid/RACDB/Current.438.1108894563
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.440 -output /home/grid/RACDB/SYSAUX.440.1108894519
.....
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.440 -output /home/grid/RACDB/sysaux01.dbf
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.401 -output /home/grid/RACDB/system01.dbf
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.370 -output /home/grid/RACDB/temp01.dbf
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.409 -output /home/grid/RACDB/undotbs01.dbf
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.371 -output /home/grid/RACDB/undotbs02.dbf
[grid@19db2:/home/grid/RACDB]$ amdu -dis '/dev/sd*' -extract DATA.347 -output /home/grid/RACDB/users01.dbf

导出后文件

[grid@19db2:/home/grid/RACDB]$ ll
total 13790120
-rw-r--r-- 1 grid oinstall   18497536 Oct 30 13:34 control01.ctl
-rw-r--r-- 1 grid oinstall   18497536 Oct 30 13:34 control02.ctl
-rw-r--r-- 1 grid oinstall   18497536 Oct 30 13:32 Current.406.1108894561
-rw-r--r-- 1 grid oinstall   18497536 Oct 30 13:32 Current.438.1108894563
-rw-r--r-- 1 grid oinstall   52429312 Oct 30 13:33 group_1.413.1108894585
-rw-r--r-- 1 grid oinstall   52429312 Oct 30 13:33 group_2.404.1108894587
-rw-r--r-- 1 grid oinstall   52429312 Oct 30 13:33 group_3.433.1108894699
-rw-r--r-- 1 grid oinstall   52429312 Oct 30 13:33 group_4.390.1108894699
......
-rw-r--r-- 1 grid oinstall  413212672 Oct 30 13:35 undotbs02.dbf
-rw-r--r-- 1 grid oinstall  125837312 Oct 30 13:32 UNDOTBS1.409.1108894519
-rw-r--r-- 1 grid oinstall  413212672 Oct 30 13:33 UNDOTBS2.371.1108894657
-rw-r--r-- 1 grid oinstall    5251072 Oct 30 13:35 users01.dbf
-rw-r--r-- 1 grid oinstall    5251072 Oct 30 13:33 USERS.347.1108894519
-rw-r--r-- 1 grid oinstall  104865792 Oct 30 13:33 V7PRODATA.408.1183728179

传输文件之备机

将数据文件传输至备机。

[grid@19db2:/home/grid/RACDB]$ scp * root@192.168.20.43:/racdb/datafile


## 切换至备机
[root@zsdb racdb]# cd /racdb/datafile/
[oracle@zsdb datafile]$ ll
总用量 13791116
-rw-r--r-- 1 oracle oinstall   18497536 10月 30 14:12 control01.ctl
-rw-r--r-- 1 oracle oinstall   18497536 10月 30 14:12 control02.ctl
-rw-r--r-- 1 oracle oinstall   18497536 10月 30 13:43 Current.406.1108894561
-rw-r--r-- 1 oracle oinstall   18497536 10月 30 13:43 Current.438.1108894563
-rw-r--r-- 1 oracle oinstall   52429312 10月 30 13:43 group_1.413.1108894585
-rw-r--r-- 1 oracle oinstall   52429312 10月 30 13:43 group_2.404.1108894587
......
-rw-r--r-- 1 oracle oinstall  460333056 10月 30 13:45 TEMP.370.1108894591
-rw-r--r-- 1 oracle oinstall  125837312 10月 30 14:07 undotbs01.dbf
-rw-r--r-- 1 oracle oinstall  413212672 10月 30 14:07 undotbs02.dbf
-rw-r--r-- 1 oracle oinstall  125837312 10月 30 13:45 UNDOTBS1.409.1108894519
-rw-r--r-- 1 oracle oinstall  413212672 10月 30 13:45 UNDOTBS2.371.1108894657
-rw-r--r-- 1 oracle oinstall    5251072 10月 30 14:07 users01.dbf
-rw-r--r-- 1 oracle oinstall    5251072 10月 30 13:45 USERS.347.1108894519
-rw-r--r-- 1 oracle oinstall  104865792 10月 30 14:07 V7PRODATA.408.1183728179
.....
[root@zsdb datafile]# cd /
[root@zsdb /]# chown -R oracle.oinstall racdb

备机调整spfile

根据集群的spfile,调整部分参数,去掉集群相关参数。

[oracle@zsdb datafile]$ export ORACLE_SID=racdb
[oracle@zsdb datafile]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Oct 30 13:55:59 2024

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

Connected to an idle instance.

SQL> create pfile='/racdb/datafile/pracdb.ora' from spfile='/racdb/datafile/spfileracdb.ora';

File created.
[oracle@zsdb datafile]$ vi pracdb.ora
*.audit_file_dest='/racdb/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/racdb/datafile/control01.ctl','/racdb/datafile/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='racdb'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racdbXDB)'
*.open_cursors=300
*.pga_aggregate_target=1362100224
*.processes=800
*.remote_login_passwordfile='exclusive'
*.sessions=885
*.sga_target=4087349248
*.undo_tablespace='UNDOTBS1'

启动数据库到mount

利用修改的pfile启动数据库至mount状态,后续调整文件路径。

[oracle@zsdb datafile]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Oct 30 14:00:14 2024

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

Connected to an idle instance.

SQL> startup mount pfile='/racdb/datafile/pracdb.ora'
ORACLE instance started.

Total System Global Area 4075356160 bytes
Fixed Size                  2259600 bytes
Variable Size            1056966000 bytes
Database Buffers         3003121664 bytes
Redo Buffers               13008896 bytes
Database mounted.

调整相关文件路径

此处的路径拼接脚本在RAC恢复至单机时,经常使用。

## 获取调整文件路径命令

SQL> select 'alter database rename file  ''' || name ||
  2         ''' to ''/racdb/datafile/' ||
  3         substr(name, instr(name, '/', -1) + 1) || ''';'  datafilepath
  4    from v$datafile
  5  union  
  6  select 'alter database rename file '''||name||''' to ''/racdb/datafile/'||
  7         substr(name, instr(name, '/', -1) + 1) || ''';' tempfilepath from v$tempfile
  8  union
  9  select 'alter database rename file '''||member||''' to ''/racdb/datafile/'||
 10         substr(MEMBER, instr(MEMBER, '/', -1) + 1) || ''';' redopath from v$logfile;

DATAFILEPATH
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
alter database rename file  '+DATA/racdb/datafile/v7prodata.408.1183728179' to '/racdb/datafile/V7PRODATA.408.1183728179';
alter database rename file  '+DATA/racdb/sysaux01.dbf' to '/racdb/datafile/sysaux01.dbf';
alter database rename file  '+DATA/racdb/system01.dbf' to '/racdb/datafile/system01.dbf';
alter database rename file  '+DATA/racdb/undotbs01.dbf' to '/racdb/datafile/undotbs01.dbf';
alter database rename file  '+DATA/racdb/undotbs02.dbf' to '/racdb/datafile/undotbs02.dbf';
alter database rename file  '+DATA/racdb/users01.dbf' to '/racdb/datafile/users01.dbf';
alter database rename file '+DATA/racdb/redo01.log' to '/racdb/datafile/redo01.log';
alter database rename file '+DATA/racdb/redo02.log' to '/racdb/datafile/redo02.log';
alter database rename file '+DATA/racdb/redo03.log' to '/racdb/datafile/redo03.log';
alter database rename file '+DATA/racdb/redo04.log' to '/racdb/datafile/redo04.log';
alter database rename file '+DATA/racdb/temp01.dbf' to '/racdb/datafile/TEMP01.DBF';

11 rows selected.

## 执行调整文件路径操作
SQL> alter database rename file  '+DATA/racdb/sysaux01.dbf' to '/racdb/datafile/sysaux01.dbf';

Database altered.

SQL> alter database rename file  '+DATA/racdb/system01.dbf' to '/racdb/datafile/system01.dbf';

Database altered.

.......

SQL> alter database rename file  '+DATA/racdb/undotbs02.dbf' to '/racdb/datafile/undotbs02.dbf';

Database altered.

SQL> alter database rename file  '+DATA/racdb/users01.dbf' to '/racdb/datafile/users01.dbf';

Database altered.

启动数据库

[oracle@zsdb datafile]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Oct 30 14:07:04 2024

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter database open;

Database altered.

SQL> col TABLESPACE_NAME for a20
SQL> col FILE_NAME for a60
SQL> set linesize 200
SQL> select TABLESPACE_NAME,FILE_ID,STATUS,FILE_NAME,BYTES/1024/1024 from dba_data_files;

TABLESPACE_NAME         FILE_ID STATUS    FILE_NAME                                                    BYTES/1024/1024
-------------------- ---------- --------- ------------------------------------------------------------ ---------------
USERS                         4 AVAILABLE /racdb/datafile/users01.dbf                                                5
UNDOTBS1                      3 AVAILABLE /racdb/datafile/undotbs01.dbf                                            120
SYSAUX                        2 AVAILABLE /racdb/datafile/sysaux01.dbf                                            4710
SYSTEM                        1 AVAILABLE /racdb/datafile/system01.dbf                                             780
UNDOTBS2                      5 AVAILABLE /racdb/datafile/undotbs02.dbf                                       394.0625
V7PRODATA                     6 AVAILABLE /racdb/datafile/V7PRODATA.408.1183728179                                 100

6 rows selected.

总结

通过工具amdu实现从ASM磁盘直接抽取数据文件进行恢复,整体操作步骤不算复杂,关键是需要提前得到相关的抽取信息,上述操作基于ASM实例正常的情况下进行,相对简单,可以作为恢复的一种手段。当然,数据库服务器故障时,最好是利用可靠备份进行恢复,愿广大运维人员永远不会遇到使用kfed、kfod、amod进行恢复的时候。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论