场景概述
最近接触的客户RAC系统中,由于管理员的疏忽,误将数据文件添加到了本地的文件系统,导致后台alert日志连续报错甚至RAC的一个节点不能正常open。
所有将相关问题整理如下。
问题分析
此类问题是由于RAC系统的数据文件需要所有节点都能同时访问,所有需要放到共享存储上(集群文件系统或者ASM或者裸设备)。
如果数据文件错误放在了某个本地节点,则其他节点访问不到,数据库就会报错。
遇到此类问题,根据实际情况的不同,一般有如下两种解决方案:
1)将数据文件迁移至共享存储,需要对所在的表空间offline。
2)将该数据文件上的对象move至共享存储上的表空间,move期间该表不能进行业务操作
解决方案
当新增datafile没有数据写入时
| alter tablespace users drop datafile 20; |
(注:datafile后面可以接file_id或file_name)
–确认本地数据文件已删除
| select file_id,file_name,status,online_status from dba_data_files; |
方案一: 本范例为将本地文件(test.dbf)迁移至ASM:
当新增datafile已有数据写入时
确认本地数据文件的相关信息:
| SQL> select name,file#,ts#,status from v$datafile; NAME FILE# TS# STATUS ---------------------------------------------------------------------- ---------- ---------- ------- +DATA/test/datafile/system.256.8145696931 0 SYSTEM +DATA/test/datafile/sysaux.257.8145696952 1 ONLINE +DATA/test/datafile/undotbs1.258.8145696953 2 ONLINE +DATA/test/datafile/users.259.8145696954 4 ONLINE +DATA/test/datafile/undotbs2.266.8145698555 5 ONLINE /u01/app/oracle/product/11.2.0/db_1/dbs/test.dbf 6 ONLINE +DATA/test/datafile/users017 4 ONLINE 7 rows selected. |
需要将所移数据文件的表空间offline
| SQL> alter tablespace DCTAUTOIMP offline; Tablespace altered. SQL> exit |
利用rman工具将数据文件copy到ASM所在磁盘组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options [oracle@test1 test]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Sun Jun 9 14:11:42 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: test (DBID=1390504949) RMAN> copy datafile 6 to '+DATA'; Starting backup at 09-JUN-13 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=695 instance=test1 device type=DISK channel ORA_DISK_1: starting datafile copy input datafile file number=00006 name=/u01/app/oracle/product/11.2.0/db_1/dbs/test.dbf output file name=+DATA/test/datafile/dctautoimp.273.817654317 tag=TAG20130609T141156 RECID=1 STAMP=817654568 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:04:22 Finished backup at 09-JUN-13 Starting Control File and SPFILE Autobackup at 09-JUN-13 piece handle=+OCR_ARCH/test/autobackup/2013_06_09/s_817654578.441.817654579 comment=NONE Finished Control File and SPFILE Autobackup at 09-JUN-13 |
更新控制文件相关信息:
| RMAN> switch datafile 6 to copy; datafile 6 switched to datafile copy "+DATA/test/datafile/dctautoimp.273.817654317" RMAN> exit Recovery Manager complete. |
确认已成功迁移:
| SQL> col name for a70 SQL> set lines 150 pagesize 999 SQL> / NAME FILE# TS# STATUS ---------------------------------------------------------------------- ---------- ---------- ------- +DATA/test/datafile/system.256.8145696931 0 SYSTEM +DATA/test/datafile/sysaux.257.8145696952 1 ONLINE +DATA/test/datafile/undotbs1.258.8145696953 2 ONLINE +DATA/test/datafile/users.259.8145696954 4 ONLINE +DATA/test/datafile/undotbs2.266.8145698555 5 ONLINE +DATA/test/datafile/dctautoimp.273.8176543176 6 OFFLINE +DATA/test/datafile/users017 4 ONLINE 7 rows selected. |
将DCTAUTOIMP online:
| SQL> alter tablespace DCTAUTOIMP online; Tablespace altered. |
确认:
| SQL> select name,file#,ts#,status from v$datafile; NAME FILE# TS# STATUS ---------------------------------------------------------------------- ---------- ---------- ------- +DATA/test/datafile/system.256.8145696931 0 SYSTEM +DATA/test/datafile/sysaux.257.8145696952 1 ONLINE +DATA/test/datafile/undotbs1.258.8145696953 2 ONLINE +DATA/test/datafile/users.259.8145696954 4 ONLINE +DATA/test/datafile/undotbs2.266.8145698555 5 ONLINE +DATA/test/datafile/dctautoimp.273.8176543176 6 ONLINE +DATA/test/datafile/users017 4 ONLINE 7 rows selected. |
至此本地的数据文件已成功迁移至ASM。此方案根据数据文件的大小不等,需要相关的表空间offline时间窗口,实际操作时灵活运用即可。
更为详细的资料还可以参考metalink[ID 390274.1]。
方案二:将所在本地数据文件的对象move至新表空间后,将本地数据文件drop
当新增datafile已有数据写入时
1 现在的本地datafile 已经为offline状态,删除的话需要首先进行recovery,然后online。(假设datafile 的file id 为20)
| sql> recover datafile 20; sql> alter database datafile 20 online; |
2 查看当前数据文件有哪些对象,然后move至其它表空间后进行删除
| sql>select segment_name,file_id,blocks from dba_extents where file_id=20; |
如输出结果为table test_table在该数据文件上
| sql>alter table test_table move tablespace users; |
对于分区表则需要依次移动每个分区:
| SQL> ALTER TABLE SCOTT.BILL MOVE PARTITION p2 TABLESPACE users; |
对于索引需要rebuild
如:
| alter index pk_test_table rebuild tablespace users; |
移走所有对象后,删除该数据文件
| sql>alter tablespace users drop datafile 20; |
3 将之前移走的对象move回来(如果需要)
| sql> alter table test_table move tablespace USERS; |
最后检查alert日志有无相关报错信息,确认没有报错。