asm 查看 数据文件 修改 时间_ASM环境下防止误将数据文件扩容到本地文件系统的方法...

487aa5d403dd7d94daa80f02d748ed37.png

前言

时常会接到客户或一线工程师反馈oracle数据库报“ora-01110”等错误,本人过往也处理过好几次类似的故障,发现基本上是由于开发人员或初级维护人员在执行数据库表空间扩容时,不小心将本身需要扩容到ASM磁盘组的数据文件扩容到了本地节点上;抑或是开发人员发现执行步骤错误之后直接物理删除错误文件,且未通知数据库维护人员导致。本文通过真实操作案例分享,讲述在ASM环境下如何防止误将数据文件扩容到本地文件系统的方法,希望各位技术人员未来能杜绝此类误操作发生。

在巡检中发现,数据库数据文件扩容到节点2本地目录中,导致只有单个节点能读取到该数据文件,节点一无法锁定数据文件。

11753f7c2991587ccb4e6a4e5bde1763.png
数据文件

103c62aac00f8f1b3480cead0ab43925.png
节点一alert_ log文件报错内容

案例处理

对误建立在节点2本地的数据文件迁移至ASM磁盘组,具体解决操作见下方。(注意:操作时需停止数据库所有实例,在变更期间数据库无法对外提供任何服务,需要提前申请停机时间操作。)

实施操作步骤

节点2:

Offline相应表空间:

col CHECKPOINT_CHANGE# for 9999999999999999999

select file#,CHECKPOINT_CHANGE#,status from v$datafile where file# in ('23','25','27');

col CHECKPOINT_CHANGE# for 9999999999999999999

select file#,CHECKPOINT_CHANGE#,status from V$DATAFILE_HEADER datafile_head where file# in ('23','25','27');

CHECKPOINT_CHANGE# 号一致

alter tablespace CSG_MD offline;

alter tablespace TBS_META_NW offline;

alter tablespace TS_KPI offline;

rman 备份数据文件

rman target /

backup datafile 23,25,27;

rman 恢复数据文件

rman target /

run{

set newname for datafile '/dev/shm/data/CMX_DATA1.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA1.dbf';

set newname for datafile '/dev/shm/data/CMX_DATA2.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA2.dbf';

set newname for datafile '/dev/shm/data/CMX_DATA3.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA3.dbf';

restore datafile 23,25,27;

}

修改控制文件指针

alter database rename file '/dev/shm/data/CMX_DATA1.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA1.dbf';

alter database rename file '/dev/shm/data/CMX_DATA2.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA2.dbf';

alter database rename file '/dev/shm/data/CMX_DATA3.dbf' to '+ORADATA/sjzy/datafile/CMX_DATA3.dbf';

检查

select file#,name,status,bytes/1024 from v$datafile where file# in ('23','25','27');

name 结果为:+ORADATA/sjzy/datafile/CMX_DATA1.dbf

online 相应表空间:

alter tablespace CSG_MD online;

alter tablespace TBS_META_NW online;

alter tablespace TS_KPI online;

防止误将数据文件扩容到本地文件系统的方法

在rac asm环境下,创建表空间或给表空间扩容时,容易出现在数据文件中少写+号,或是磁盘组的名称中出现空格等问题,将数据文件写到本地文件系统,导致只有一个节点能读写,而其他节点无法读写存在异常的数据文件。

解决方法:通过在数据库部署db级别的触发器,可以有效防止该问题的发生。创建表空间或扩容时,数据文件名的开头必须包含正确的磁盘组名称:“+磁盘组名”。

脚本示例:

第一步、创建一个type,如果为了使split函数具有通用性,请将其size 设大些。

create or replace type type_split as table of varchar2(4000)

/

第二步、创建function split

create or replace function split

(

p_list varchar2,

p_sep varchar2 := ','

) return type_split pipelined

is

l_idx pls_integer;

v_list varchar2(4000) := p_list;

begin

loop

l_idx := instr(v_list,p_sep);

if l_idx > 0 then

pipe row(substr(v_list,1,l_idx-1));

v_list := substr(v_list,l_idx+length(p_sep));

else

pipe row(v_list);

exit;

end if;

end loop;

return;

end split;

/

第三步、创建触发器:

CREATE OR REPLACE TRIGGER cs_pnp_trigger

BEFORE ALTER OR CREATE ON DATABASE

DECLARE

v_oper varchar2(32); --operation type

v_obj_name varchar2(32); --object name

v_obj_type varchar2(32); --object type

v_sql_txt ora_name_list_t;

v_n BINARY_INTEGER;

v_stmt varchar2(4000); --sql statement

v_n2 number := 0;

v_dg_count number := 1;

v_in_dg number := 1;

v_tmp_dgname varchar2(100) := '';

BEGIN

--dbms_output.put_line(v_stmt);

select ora_sysevent, ora_dict_obj_name(), ora_dict_obj_type()

into v_oper, v_obj_name, v_obj_type

from dual;

--dbms_output.put_line(ora_sysevent||':'||v_obj_type||':'||v_obj_name);

IF (v_oper = 'CREATE' OR v_oper = 'ALTER') AND v_obj_type = 'TABLESPACE' THEN

v_stmt := '';

v_n := nvl(ora_sql_txt(v_sql_txt), 0);

FOR i IN 1 .. v_n LOOP

v_stmt := v_stmt || v_sql_txt(i);

END LOOP;

for j in (select * from table(split(v_stmt, chr(39)))) loop

v_n2 := v_n2 + 1;

if v_n2 mod 2 = 0 then

select COLUMN_VALUE

into v_tmp_dgname

from table(split(j.COLUMN_VALUE, '/'))

where rownum < 2;

select count(*)

into v_dg_count

from v$asm_diskgroup

where '+' || name = upper(v_tmp_dgname);

dbms_output.PUT_LINE(j.COLUMN_VALUE || v_dg_count);

if v_dg_count = 0 then

v_in_dg := 0;

exit;

end if;

end if;

end loop;

END IF;

IF v_in_dg = 0 THEN

RAISE_APPLICATION_ERROR(-20998,

'cs_pnp_trigger:

Attempt To CREATE or ALTER TABLESPACE in CLUSTER

and the diskgroup name "' || v_tmp_dgname ||

'" is INCORRECT!');

END IF;

END cs_pnp_trigger;

/

第四步、验证脚本:

以错误方式创建表空间:

SQL> create tablespace test1 datafile 'data' size 10m autoextend off;

create tablespace test1 datafile 'data' size 10m autoextend off

*

ERROR at line 1:

ORA-00604: error occurred at recursive SQL level 1

ORA-20998: cs_pnp_trigger:

Attempt To CREATE or ALTER TABLESPACE in CLUSTER

and the diskgroup name "data" is INCORRECT!

ORA-06512: at line 45

以错误方式扩容表空间:

SQL> alter tablespace users add datafile 'data_vg' size 10m autoextend off;

alter tablespace users add datafile 'data_vg' size 10m autoextend off

*

ERROR at line 1:

ORA-00604: error occurred at recursive SQL level 1

ORA-20998: cs_pnp_trigger:

Attempt To CREATE or ALTER TABLESPACE in CLUSTER

and the diskgroup name "data_vg" is INCORRECT!

ORA-06512: at line 45

部署触发器后,在创建表空间或给表空间扩容时,误操作将无法执行成功,误操作的数据文件不会生成,后台日志也不会报相关的操作提示。

第五步、如果不需要该触发器,可以采用如下步骤删除

drop TRIGGER cs_pnp_trigger;

drop function split;

drop type type_split ;

End

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值