RAC中误将数据文件创建在本地盘而不是共享存储

背景:
Oracle RAC添加新表空间时数据文件时,误将新创建的表空间的数据文件放置在了本地系统而不是共享存储(ASM)上。

ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG'

解决方案:
1. RMAN的 copy datafile 方式
2. dbms_file_transfer方式
3. ASMCMD中的直接cp方式

测试版本: 11.2.0.1.0 rac on OEL5.5

--模拟(添加表空间test3的时候没有在DG前加+号)
SQL> create tablespace test3 datafile 'DATADG' size 100M;  
Tablespace created.
SQL> set pagesize 1000 linesize 150;     
SQL> col FILE_NAME for a40;
SQL> select file_name, file_id, bytes/1024/1024, autoextensible  from dba_data_files where tablespace_name='&tablespace_name';
Enter value for tablespace_name: TEST3
FILE_NAME                                   FILE_ID BYTES/1024/1024 AUTOEXTEN
----------------------------------------          ---------- --------------- ---------
/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG          8             100 NO

--这时在此表空间test3创建用户和表
create user zhoushuai3 identified by zhoushuai3 default tablespace TEST3;
grant connect,resource to zhoushuai3;
create table zhoushuai3.t1 as select * from dba_tables nologging;
create table zhoushuai3.t2 as select * from dba_tables nologging;

--另一个节点查询:
SQL> select count(*) from zhoushuai3.t1;
select count(*) from zhoushuai3.t1
                                *
ERROR at line 1:
ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG'

--识别不到的节点连 查看表空间使用率也查不了
          FROM DBA_TEMP_FILES
 *
ERROR at line 27:
ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG'

--因此确定另一个节点的该数据文件是有问题的

--加错的节点去查看日志确定
Tue Jul 05 15:39:26 2016
create tablespace test3 datafile 'DATADG' size 100M   《《《《《《《《《《《《《《《确实创建或者添加扩展表空间加错了,默认加到$ORACLE_HOME/dbs目录下
Tue Jul 05 15:39:50 2016
Completed: create tablespace test3 datafile 'DATADG' size 100M

--加错的节点查看数据库文件内容确定:
SQL> set pagesize 1000 linesize 150;     
SQL> col FILE_NAME for a40;
SQL> select file_name, file_id, bytes/1024/1024, autoextensible  from dba_data_files where tablespace_name='&tablespace_name';
Enter value for tablespace_name: TEST3
old   1: select file_name, file_id, bytes/1024/1024, autoextensible  from dba_data_files where tablespace_name='&tablespace_name'
new   1: select file_name, file_id, bytes/1024/1024, autoextensible  from dba_data_files where tablespace_name='TEST3'


FILE_NAME                                   FILE_ID BYTES/1024/1024 AUTOEXTEN
---------------------------------------- ---------- --------------- ---------
/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG          8             100 NO     《《《《《《确实是本地数据文件




解决方案:总共3种,每一种有分为offline单个问题的数据文件和offline整个表空间。
个人观点:为了减少影响,offline单个问题的数据文件为上策

方法1:dbms_file_transfer方式(官方博客推荐使用详见:RAC中误将数据文件创建在本地盘时的修正)
1、先创建两个目录,offline问题的数据文件(官方)
 --创建指定为当前加错的数据文件路径
SQL> create directory zhoushuai01 as '/u01/app/oracle/product/11.2.0/db_1/dbs/';
Directory created.
 --创建指定为想要放置的共享存储的路径
SQL> create directory zhoushuai02 as '+DATADG/rac11g/datafile/';
Directory created.
2、offline数据文件(官方博客是offline tablespace,为减少影响,这里我做的是只offline问题数据文件)
SQL>alter database datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' offline;
Database altered.
3、进行文件传输copy
/*Syntax
DBMS_FILE_TRANSFER.COPY_FILE(
source_directory_object       IN  VARCHAR2,
source_file_name              IN  VARCHAR2,
destination_directory_object  IN  VARCHAR2,
destination_file_name         IN  VARCHAR2);
*/
  SQL> exec dbms_file_transfer.copy_file('zhoushuai01','DATADG','zhoushuai02','test5.dbf');
PL/SQL procedure successfully completed.
 
4、grid进入asmcmd查看一下
ASMCMD> pwd
+DATADG/RAC11G/DATAFILE
ASMCMD> ls
test5.dbf       <<<<<<<<<<<<<已经成功拷贝过去了

5、rename
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test5.dbf';  
Database altered.
6、recover&online(注意如果offline表空间的话,直接一步online tablespace就可完成)
SQL> alter database recover datafile '+DATADG/rac11g/datafile/test5.dbf';
Database altered.
SQL> alter database datafile '+DATADG/rac11g/datafile/test5.dbf' online;          
Database altered.

方法2、使用rman方式处理(也分为offline表空间和单个数据文件)
2.1 offline表空间
1、offline表空间 
alter tablespace TEST3 offline;
或者RMAN> sql "alter tablespace test1 offline";
2、用rman copy到共享目录
RMAN> copy datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test4.dbf';
或者指定数据文件ID
RMAN> copy datafile 8 to '+DATADG/rac11g/datafile/test3.dbf';
Starting backup at 05-JUL-16
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00008 name=/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG
output file name=+DATADG/rac11g/datafile/test3.dbf tag=TAG20160705T164933 RECID=1 STAMP=916418998
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
Finished backup at 05-JUL-16
3、rename数据文件
--sqlplus 下
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test3.dbf';
4、online表空间
SQL> alter tablespace test1 online;    
 
2.2、直接offline 数据文件(影响最小化,其实跟方法一相同 只是offline的单个有问题的表空间)
1、offline数据文件
SQL>  alter database datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' offline;
Database altered.
2、copy到共享存储
RMAN> copy datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test04.dbf';

3、rename数据文件
--sqlplus 下
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test04.dbf';
Database altered.
4、recover&online
SQL> alter database recover datafile '+DATADG/rac11g/datafile/test04.dbf';  --PS:这一步recover是比offline表空间多的一步
Database altered.
SQL>  alter database datafile '+DATADG/rac11g/datafile/test04.dbf' online;  

方法3:mv+asmcmd_cp+rename+online(用offline表空间也可以,但是为了减少影响范围这里使用的offline有问题的数据文件)
1、offline表空间
   SQL> alter database datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' offline;
   Database altered.
2、用root用户 mv到grid用户下
   [root@node02 dbs]# mv DATADG /home/grid/
3、修改权限
    [root@node02 grid]# chown grid:asmadmin DATADG 
[root@node02 grid]# ls -lrt DATADG 
-rw-r----- 1 grid asmadmin 104865792 Jul  5 21:36 DATADG
4、asmcmd cp到ASM中
[grid@node02 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@node02 ~]$ asmcmd
ASMCMD> cd +DATADG/RAC11G/DATAFILE
ASMCMD> pwd
+DATADG/RAC11G/DATAFILE
ASMCMD> ls
........
test04.dbf
test3.dbf
test4.dbf
test5.dbf
ASMCMD>  cp /home/grid/DATADG test6.dbf
copying /home/grid/DATADG -> +DATADG/RAC11G/DATAFILE/test6.dbf
ASMCMD> ls
...................
test04.dbf
test3.dbf
test4.dbf
test5.dbf
test6.dbf           <<<<<<<<<<<<<<<<<<<<<<<<
5、rename
   SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/DATADG' to '+DATADG/rac11g/datafile/test6.dbf';  
   Database altered.   
6、recover & online
    SQL> alter database recover datafile '+DATADG/rac11g/datafile/test6.dbf';
Database altered.
    SQL>  alter database datafile '+DATADG/rac11g/datafile/test6.dbf' online;     
    Database altered.


总结:处理故障尽量影响最小化解决。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31043804/viewspace-2122473/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31043804/viewspace-2122473/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值