作者 | JiekeXu

来源 | JiekeXu之路(ID: JiekeXu_IT)

转载请联系授权 | (微信ID:xxq1426321293)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享一篇案例 RAC 添加表空间误将数据文件放本地处理办法。本文首发于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!

不管是 10g、11g、12c ,RAC 架构的数据文件均是存放在共享存储上的,但是由于扩容时误操作少写一个符号,则会将数据文件建立到本地文件系统上的 $ORACLE_HOME/dbs 目录下,这样当然不会立即出错,也提示添加成功,但当另外一个节点访问此数据文件上面的数据时就会报错 ORA-1157、ORA-1110 提示无法锁定该数据文件,导致出现异常应用无法访问此数据。

当出现上面的错误时,虽不是什么致命的错误,但也是比较麻烦的,对应用访问、操作造成了很大的麻烦。下面一起来看一看 10g、11g 中出现此类问题该如何解决,12c 及以上版本还没有案例,不过也是大同小异了。

一、发现问题

不过,在 10g 中还是有一点点的差别,10g RAC 没有 ASM 共享存储使用的是裸设备,在添加表空间时并没有类似 ‘+DATA’ 这样的关键字,只有 /dev/xxx 这样的设备,那么怎么会出现添加到本地文件系统中了呢?这个可以从 alert 日志中查看,以下是从日志中发现的内容:

[/oracle/admin/Jieke/bdump]$tail -5000 alert_Jieke1.log | grep JiekeXu
alter tablespace  JiekeXu ADD datafile  '/dev/rora_8g_157'    SIZE   8G
ORA-1537 signalled during: alter tablespace  JiekeXu ADD datafile  '/dev/rora_8g_157'    SIZE   8G...
alter tablespace  JiekeXu ADD datafile '/dev/rora_4g_26' SIZE   4G
ORA-1537 signalled during: alter tablespace  JiekeXu ADD datafile '/dev/rora_4g_26' SIZE   4G...
alter tablespace  JiekeXu ADD datafile '/dev/rora_4g_26' SIZE   4G
ORA-1537 signalled during: alter tablespace  JiekeXu ADD datafile '/dev/rora_4g_26' SIZE   4G...
alter tablespace  JiekeXu ADD datafile '/dev/rora_30g_256' SIZE   30G
ORA-1119 signalled during: alter tablespace  JiekeXu ADD datafile '/dev/rora_30g_256' SIZE   30G...
alter tablespace  JiekeXu ADD datafile '/dev/rora_8g_256' SIZE   8G
ORA-1119 signalled during: alter tablespace  JiekeXu ADD datafile '/dev/rora_8g_256' SIZE   8G...
alter tablespace  JiekeXu ADD datafile '/dev/rora_8g_256' SIZE   8G
ORA-1119 signalled during: alter tablespace  JiekeXu ADD datafile '/dev/rora_8g_256' SIZE   8G...
alter tablespace  JiekeXu ADD datafile 'ora_8g_158' SIZE   8G
Completed: alter tablespace  JiekeXu ADD datafile 'ora_8g_158' SIZE   8G

可以发现有很多 ORA-1119 的错误,这些错误都是由于裸设备已经添加进数据库了无法再次添加,可最后一个  'ora_8g_158' 添加成功了,但正是这个文件就被添加到本地了,这里也没有报错,操作人员误以为已经添加成功了,没去做检查,导致后面问题的发生。

SQL> select tablespace_name,file_id,file_name from dba_data_files where file_name not like '/dev/rora%';TABLESPACE_NAME                   FILE_ID FILE_NAME
------------------------------ ---------- --------------------------------------------------------
JiekeXu                               239 /oracle/product/10.2.0/db_1/dbs/ora_8g_158

二、解决问题

当出现这个问题时,紧急处理办法就是先将业务切到一个节点上,即出错的节点,或者允许的话可将其另一个节点直接关闭,然后得想办法将此数据文件迁移到它原来的共享裸设备中,其实也很简单,大概就是先 offline 数据文件,然后 rman 中  copy 此数据文件,接着数据库中 alter  database rename 数据文件, 做 recover 恢复,然后 online 即可。

当然,将其迁移到裸设备共享文件系统中的前提条件就是要有裸设备,经过存储和系统层面的添加,划分出如下四块裸设备:

SQL> !ls -lrt /dev/rora_*g_25*
crw-rw-rw-    1 oracle   dba          39,289 Nov 15 20:40 /dev/rora_16g_256
crw-rw-rw-    1 oracle   dba          39,290 Nov 15 20:45 /dev/rora_16g_257
crw-rw-rw-    1 oracle   dba          39,291 Nov 15 20:48 /dev/rora_32g_258
crw-rw-rw-    1 oracle   dba          39,292 Nov 15 20:50 /dev/rora_32g_259

使用前面做好的裸设备迁移,下面是一个完整的步骤:

-- offline 此数据文件
SQL> alter database datafile '/oracle/product/10.2.0/db_1/dbs/ora_8g_158' offline;
Database altered.
SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name not like '/dev/rora%';TABLESPACE_NAME                   FILE_ID FILE_NAME                                                              ONLINE_
------------------------------ ---------- ---------------------------------------------------------------------- -------
JiekeXu                               239 /oracle/product/10.2.0/db_1/dbs/ora_8g_158                             RECOVER
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
--rman copy
[/home/oracle]$rman target /Recovery Manager: Release 10.2.0.4.0 - Production on Sun Nov 15 20:31:07 2020Copyright (c) 1982, 2007, Oracle.  All rights reserved.connected to target database: Jieke (DBID=1237164921)RMAN> copy datafile '/oracle/product/10.2.0/db_1/dbs/ora_8g_158' to '/dev/rora_16g_256';Starting backup at 15-NOV-20
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=643 instance=Jieke1 devtype=DISK
channel ORA_DISK_1: starting datafile copy
input datafile fno=00239 name=/oracle/product/10.2.0/db_1/dbs/ora_8g_158
output filename=/dev/rora_16g_256 tag=TAG20201115T203119 recid=186 stamp=1056573097
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
Finished backup at 15-NOV-20Starting Control File and SPFILE Autobackup at 15-NOV-20
piece handle=/oracle/product/10.2.0/db_1/dbs/c-1237164921-20201115-0b comment=NONE
Finished Control File and SPFILE Autobackup at 15-NOV-20RMAN> exitRecovery Manager complete.
--数据库里 rename 和 recover
[/home/oracle]$sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sun Nov 15 20:32:13 2020Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing optionsSQL> set line 345
SQL> col FILE_NAME for a99
SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name not like '/dev/rora%';TABLESPACE_NAME                   FILE_ID FILE_NAME                                                                                           ONLINE_
------------------------------ ---------- --------------------------------------------------------------------------------------------------- -------
JiekeXu                               239 /oracle/product/10.2.0/db_1/dbs/ora_8g_158                                                          RECOVERSQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name  like '/dev/rora_16g_256%';no rows selected--这里 recover 报错是由于需要先做 rename 才可以。
SQL> recover datafile '/dev/rora_16g_256';
ORA-01179: file /dev/rora_16g_256 does not existSQL> alter database rename file '/oracle/product/10.2.0/db_1/dbs/ora_8g_158' to '/dev/rora_16g_256';Database altered.SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name  like '/dev/rora_16g_256%';TABLESPACE_NAME                   FILE_ID FILE_NAME                                                                                           ONLINE_
------------------------------ ---------- --------------------------------------------------------------------------------------------------- -------
JiekeXu                               239 /dev/rora_16g_256                                                                                   RECOVERSQL>  recover datafile '/dev/rora_16g_256';
Media recovery complete.
SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name not like '/dev/rora%';no rows selectedSQL> alter database datafile '/dev/rora_16g_256' online;Database altered.SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name  like '/dev/rora_16g_256%';TABLESPACE_NAME                   FILE_ID FILE_NAME                                                                                           ONLINE_
------------------------------ ---------- --------------------------------------------------------------------------------------------------- -------
JiekeXu                               239 /dev/rora_16g_256                                                                                   ONLINE

如下是 alert 日志中出现的步骤,可作为参考:

三、添加表空间数据文件

迁移完成后另一节点便可以正常访问此数据文件中的数据了,最后要说的一点就是这个裸设备该怎么添加数据文件呢?一是查看 dba_data_files.file_name 确认以前的数据文件位置,或者查看 alert 日志查看添加成功的记录,两者均可:

-- alert 日志中搜索关键字 Jieke001 查看以前添加成功的日志即可确认。
[/app/oracle/admin/Jieke/bdump]$tail -5000 alert_Jieke1.log | grep Jieke001
alter tablespace Jieke001 add datafile '/dev/rora_30g_251' size 29g
Completed: alter tablespace Jieke001 add datafile '/dev/rora_30g_251' size 29g
alter tablespace Jieke001 add datafile '/dev/rora_30g_252' size 29g
Completed: alter tablespace Jieke001 add datafile '/dev/rora_30g_252' size 29g
alter tablespace Jieke001 add datafile '/dev/rora_30g_253' size 29g
Completed: alter tablespace Jieke001 add datafile '/dev/rora_30g_253' size 29g
alter tablespace Jieke001 add datafile '/dev/rora_30g_254' size 29g
Completed: alter tablespace Jieke001 add datafile '/dev/rora_30g_254' size 29g
alter tablespace Jieke001 add datafile '/dev/rora_30g_255' size 29g
Completed: alter tablespace Jieke001 add datafile '/dev/rora_30g_255' size 29g

如下是一个成功添加的案例,可参考:

SQL> alter tablespace Jieke001 ADD datafile '/dev/rora_16g_257' SIZE 15G;Tablespace altered.SQL> alter tablespace Jieke001 ADD datafile '/dev/rora_32g_258' SIZE 30G;Tablespace altered.SQL> select tablespace_name,file_id,file_name,online_status from dba_data_files where file_name not like '/dev/rora%';no rows selectedSQL> alter tablespace Jieke001 ADD datafile '/dev/rora_32g_259' SIZE 30G;Tablespace altered.SQL> col TABLESPACE_NAME for a28  SELECT a.tablespace_name,round(total/1024/1024/1024) "Total g",round(free/1024/1024/1024) "Free g",ROUND((total-free)/total,4)*100 "USED%"
FROM (SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name ) a,(SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name) b WHERE a.tablespace_name=b.tablespace_name ORDER BY 4;
SQL>   2    3
TABLESPACE_NAME                 Total g     Free g      USED%
---------------------------- ---------- ---------- ----------
JKXSYSTEM                            24         24        .09
SYSTEM                                8          7       12.2
USERS                                12         10      19.08
SYSAUX                                4          1      78.25
JiekeXu                              59         12      79.05
UNDOTBS2                             12          2       86.3
Jieke001                             2657        356       86.6
UNDOTBS1                             23          3      87.088 rows selected.SQL>  select inst_id,status, count(*)  from gv$session where type <> 'BACKGROUND' group by inst_id,status order by 3;INST_ID STATUS     COUNT(*)
---------- -------- ----------2 ACTIVE            21 ACTIVE            41 INACTIVE         142 INACTIVE         16SQL> set line 345 col instance_name for a15 col host_name for a30 select inst_id,INSTANCE_NAME,HOST_name,status,version,STARTUP_TIME  from gv$instance;
SQL> SQL> SQL> INST_ID INSTANCE_NAME   HOST_NAME                      STATUS       VERSION           STARTUP_TIME
---------- --------------- ------------------------------ ------------ ----------------- ------------1 Jieke1       JiekeXu1                            OPEN         10.2.0.4.0        23-OCT-202 Jieke2       JiekeXu2                            OPEN         10.2.0.4.0        15-NOV-20

四、11g RAC 如何做?

11g 或者以上可以使用 asmcmd copy 本地文件到磁盘组,这是一个很不错的新功能,那么通常在 11g 及以上 RAC 中,由于忘记写盘号 "+"  导致出现问题。

SQL> alter tablespace idx_space add datafile 'DATA' size 20G autoextend off;Tablespace altered.--当另一个节点访问此数据时也会报错
SQL> select count(*) from table_XXXs;
select count(*) from table_XXXs*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 222 - see DBWR trace file
ORA-01110: data file 222: '/app/product/11.2.0/db/dbs/DATA'

这样便添加到本地文件系统了,还没有任何报错,下面我们来看看具体的操作步骤:

1、切换日志、offline 要迁移的数据文件

---多次切换日志
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> alter system checkpoint;
--查看要迁移的文件号
select FILE_ID,TABLESPACE_NAME,FILE_NAME from dba_data_files where TABLESPACE_NAME='&tablespace_name';
-- offline 要迁移的 datafile
SQL> alter database datafile &file_ID offline;  --》这里写数据文件 ID 或者全路径文件均可
--查看该数据文件是否 offline:
col NAME for a55
select file#,name,status from gv$datafile where FILE#='&FILE_ID';

2、拷贝本地文件到ASM

--切换到 grid 用户
su - grid
--asmcmd 复制本地数据文件到 asm diskgroup
ASMCMD> ls
JIEKEDBS/
ASMCMD> cd DATA
ASMCMD> cd datafile
ASMCMD> pwd
+DATA/JIEKEDBS/datafile
--ASMCMD> cp '/app/product/11.2.0/db/dbs/DATA' ./
ASMCMD> cp '/app/product/11.2.0/db/dbs/DATA'  '+DATA/JIEKEDBS/datafile/idx_space222.dbf'
copying /app/product/11.2.0/db/dbs/DATA -> +DATA/JIEKEDBS/datafile/idx_space222.dbf
ASMCMD>

3、修改控制文件信息,online 数据文件

su - oracle
sqlplus / as sysdba
-- 重命名 datafile
SQL> alter database rename file '/app/product/11.2.0/db/dbs/DATA' to '+DATA/JIEKEDBS/datafile/idx_space222.dbf';
-- recover and online 数据文件
SQL> alter database recover datafile &FILE_ID;
-- online 数据文件
SQL> alter database datafile &FILE_ID online;

4、检查验证

-- 查看是否迁移成功,并查看迁移后数据文件的状态
select FILE_ID,TABLESPACE_NAME,FILE_NAME from dba_data_files where TABLESPACE_NAME='&tablespace_name';select file#,name,status from gv$datafile where FILE#='&FILE_ID';

多次切换日志,检查数据库告警日志有无报错,发现无异常,另一节点也可以正常访问了,说明问题已解决,本地文件系统的数据文件后期可清理了。


好咯,今天的分享就到这里了,如果本文对您有一丁点儿帮助,请多支持“在看”与转发,不求小费了哪怕是一个小小的赞,您的鼓励都将是我熬夜写文章最大的动力,让我有一直写下去的动力,最后一起加油,奥利给

Oracle 12c 及以上版本补丁更新说明及下载方法(收藏版)

Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)

案例分享|Oracle 11g RAC 数据库连接数过高处理办法

11g RAC 在线存储迁移实现 OCR 磁盘组完美替换

震惊:Oracle 11gR2 RAC ADG 并没有高可用

如何通过 Shell 监控异常等待事件和活跃会话 

我的 OCM 之路|书写无悔青春追梦永不止步

Oracle 19c 之多租户 PDB 连接与访问(三)

Oracle 12C 最新补丁下载与安装操作指北

DBA 常用的软件工具有哪些(分享篇)?

深入了解 Oracle Flex ASM 及其优点

Oracle 11g 临时表空间管理

Oracle 每日一题系列合集

一键三连“分享、在看与点赞”,给我充点儿电吧~

案例|RAC 添加表空间误将数据文件放本地处理办法相关推荐

  1. 管理表空间和数据文件——维护表空间——设置默认表空间和删除表空间和删除数据文件盒临时文件...

    1.设置数据库默认表空间 当建立数据库时,使用default tablespace 选项可以设置数据库的默认表空间.在建立了数据库之后,使用alter database default tablesp ...

  2. linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法

    UNDO表空间下的数据文件被误删除后的处理方法: 操作前备份数据库,以避免更大的损失. 思路: 1.把误删除的数据文件offline 2.正常打开数据库后创建新的UNDO表空间及数据文件 3.修改相应 ...

  3. 如何为ORACLE表空间创建大容量数据文件

    后来查了查资料,发现表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为4K,8K.16K.32K.64K等几种大小,ORACLE的物理文 ...

  4. 删除表空间联带数据文件

    --查看数据文件大小 select file_name,tablespace_name,bytes/1024/1024 M from dba_data_files; --注意系统表空间.临时表空间.U ...

  5. oracle数据导入表空间,ORACLE导入数据文件到指定的表空间

    最近工作中碰见ORACLE导入数据文件到指定的表空间中的事,虽然导入成功了.但这个功能应该算是我们在工作中经常碰见的需求,所以在此作个记录,以后用到也方便查找. 下面直接贴操作流程! Microsof ...

  6. oracle 删除表空间(tablespace)及数据文件的方法

    – 创建表空间; Create tablespace xihu datafile 'd:\oracleDB\xihu.dbf' Size 100M AutoExtend on Next 10M sel ...

  7. Oracle Study案例之--基于表空间的时间点恢复(TSPITR)

     Oracle Study案例之--基于表空间的时间点恢复(TSPITR) TSPITR(表空间时间点恢复)用于将一个或多个表空间恢复到过去某个时间点的状态,而其他表空间仍然保持现有状态. TSPIT ...

  8. oracle其他盘添加表空间吗,oracle增加表空间的四种方法

    实例1: 在中,磁盘空间不足是DBA都会遇到的问题,问题比较常见. --1查看表空间已经使用的百分比select a.tablespace_name,a.bytes/1024/1024 "S ...

  9. oracle用户新增数据文件,[数据库]20200722_Oracle添加表空间、用户,用户授权

    [数据库]20200722_Oracle添加表空间.用户,用户授权 0 2020-07-25 17:00:30 --创建表空间CREATE TABLESPACE aifu --表空间名 aifu LO ...

最新文章

  1. 面对疫情,飞书线上办公室,让我们换一种方式重聚!
  2. 聚焦和增强卷积神经网络
  3. ThinkPhp框架基础知识
  4. wxWidgets:wxWebView 示例
  5. Kafka 入门 and kafka+logstash 实战应用
  6. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
  7. Cobub无码埋点关键技术的实现
  8. ZOJ1450 Minimal Circle 最小圆覆盖
  9. 看一次广告听30分钟歌 你愿意为QQ音乐新功能买单吗?
  10. float 最小误差_关于float与double结果的误差
  11. charts 画折线图
  12. 开发历程:网页视频流媒体播放器EasyPlayer.JS开发web H5网页播放H.265视频支持FLV与HLS直播与点播
  13. windowsXP sp2 to sp3 的升级包
  14. 巧妙删除其它类别的怪文件
  15. 太赞了!没想到一个Handler还有中高级几种问法,进阶学习资料!
  16. 像哆啦A梦懂大雄一样懂客户,我们也会拥有百宝箱
  17. C#语言实例源码系列-实现动态图标闪烁显示
  18. 传统防火墙与Web应用程序防火墙(WAF)的区别
  19. 11——去哪儿网(总结)
  20. 淘宝天猫背后,有一个你不知道的神秘组织

热门文章

  1. 基于SpringBoot+Vue的校园招聘管理系统(Java毕业设计)
  2. R6025 ---Pure virtual functmm call的错误之一
  3. APP社交类项目(类微信)设计之八钱包功能设计
  4. 谨防“蚁穴效应”,确保云数据中心安全运行
  5. 孙鑫VC++深入详解第二章学习笔记
  6. c语言里的%p的作用,c语言中 %p的含义
  7. 加拿大魁北克投资移民申请费用一览表
  8. 如何抵御社工库类的黑客攻击?
  9. [MAUI程序设计]界面多态与实现
  10. 做网站或者网站改版的费用是多少