centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法
前言
時(shí)常會(huì)接到客戶或一線工程師反饋oracle數(shù)據(jù)庫報(bào)“ora-01110”等錯(cuò)誤,本人過往也處理過好幾次類似的故障,發(fā)現(xiàn)基本上是由于開發(fā)人員或初級維護(hù)人員在執(zhí)行數(shù)據(jù)庫表空間擴(kuò)容時(shí),不小心將本身需要擴(kuò)容到ASM磁盤組的數(shù)據(jù)文件擴(kuò)容到了本地節(jié)點(diǎn)上;抑或是開發(fā)人員發(fā)現(xiàn)執(zhí)行步驟錯(cuò)誤之后直接物理刪除錯(cuò)誤文件,且未通知數(shù)據(jù)庫維護(hù)人員導(dǎo)致。本文通過真實(shí)操作案例分享,講述在ASM環(huán)境下如何防止誤將數(shù)據(jù)文件擴(kuò)容到本地文件系統(tǒng)的方法,希望各位技術(shù)人員未來能杜絕此類誤操作發(fā)生。
在巡檢中發(fā)現(xiàn),數(shù)據(jù)庫數(shù)據(jù)文件擴(kuò)容到節(jié)點(diǎn)2本地目錄中,導(dǎo)致只有單個(gè)節(jié)點(diǎn)能讀取到該數(shù)據(jù)文件,節(jié)點(diǎn)一無法鎖定數(shù)據(jù)文件。
數(shù)據(jù)文件節(jié)點(diǎn)一alert_ log文件報(bào)錯(cuò)內(nèi)容案例處理
對誤建立在節(jié)點(diǎn)2本地的數(shù)據(jù)文件遷移至ASM磁盤組,具體解決操作見下方。(注意:操作時(shí)需停止數(shù)據(jù)庫所有實(shí)例,在變更期間數(shù)據(jù)庫無法對外提供任何服務(wù),需要提前申請停機(jī)時(shí)間操作。)
實(shí)施操作步驟
節(jié)點(diǎn)2:
Offline相應(yīng)表空間:
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 備份數(shù)據(jù)文件
rman target /
backup datafile 23,25,27;
rman 恢復(fù)數(shù)據(jù)文件
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 結(jié)果為:+ORADATA/sjzy/datafile/CMX_DATA1.dbf
online 相應(yīng)表空間:
alter tablespace CSG_MD online;
alter tablespace TBS_META_NW online;
alter tablespace TS_KPI online;
防止誤將數(shù)據(jù)文件擴(kuò)容到本地文件系統(tǒng)的方法
在rac asm環(huán)境下,創(chuàng)建表空間或給表空間擴(kuò)容時(shí),容易出現(xiàn)在數(shù)據(jù)文件中少寫+號,或是磁盤組的名稱中出現(xiàn)空格等問題,將數(shù)據(jù)文件寫到本地文件系統(tǒng),導(dǎo)致只有一個(gè)節(jié)點(diǎn)能讀寫,而其他節(jié)點(diǎn)無法讀寫存在異常的數(shù)據(jù)文件。
解決方法:通過在數(shù)據(jù)庫部署db級別的觸發(fā)器,可以有效防止該問題的發(fā)生。創(chuàng)建表空間或擴(kuò)容時(shí),數(shù)據(jù)文件名的開頭必須包含正確的磁盤組名稱:“+磁盤組名”。
腳本示例:
第一步、創(chuàng)建一個(gè)type,如果為了使split函數(shù)具有通用性,請將其size 設(shè)大些。
create or replace type type_split as table of varchar2(4000)
/
第二步、創(chuàng)建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;
/
第三步、創(chuàng)建觸發(fā)器:
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;
/
第四步、驗(yàn)證腳本:
以錯(cuò)誤方式創(chuàng)建表空間:
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
以錯(cuò)誤方式擴(kuò)容表空間:
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
部署觸發(fā)器后,在創(chuàng)建表空間或給表空間擴(kuò)容時(shí),誤操作將無法執(zhí)行成功,誤操作的數(shù)據(jù)文件不會(huì)生成,后臺(tái)日志也不會(huì)報(bào)相關(guān)的操作提示。
第五步、如果不需要該觸發(fā)器,可以采用如下步驟刪除
drop TRIGGER cs_pnp_trigger;
drop function split;
drop type type_split ;
End
總結(jié)
以上是生活随笔為你收集整理的centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中交叉的线_表现力一绝!用交叉线构图拍出
- 下一篇: w10家庭版安装java不_小编为你分析