日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法

發布時間:2023/12/2 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

時常會接到客戶或一線工程師反饋oracle數據庫報“ora-01110”等錯誤,本人過往也處理過好幾次類似的故障,發現基本上是由于開發人員或初級維護人員在執行數據庫表空間擴容時,不小心將本身需要擴容到ASM磁盤組的數據文件擴容到了本地節點上;抑或是開發人員發現執行步驟錯誤之后直接物理刪除錯誤文件,且未通知數據庫維護人員導致。本文通過真實操作案例分享,講述在ASM環境下如何防止誤將數據文件擴容到本地文件系統的方法,希望各位技術人員未來能杜絕此類誤操作發生。

在巡檢中發現,數據庫數據文件擴容到節點2本地目錄中,導致只有單個節點能讀取到該數據文件,節點一無法鎖定數據文件。

數據文件

節點一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

總結

以上是生活随笔為你收集整理的centos7创建asm磁盘_ASM环境下防止误将数据文件扩容到本地文件系统的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。