天天看點

半自動化運維之動态添加資料檔案(二)

我們可以通過監控表空間的情況,然後映射比對檔案系統中的挂載點情況,通過随機函數在各個分區中進行篩選,基本保證資料檔案的建立能夠分散到各個分區中。

接下來我們需要根據計算得到的挂載點,比對建立資料檔案的語句,比如資料檔案為pool_data_45.dbf 這個時候我們就需要把資料檔案自增,顯示為pool_data_46.dbf.

為了統一管理我們可以定義一些基本的統一規則,這樣在處理的時候就很友善了。

實作代碼如下:

一個表空間對應的資料檔案可能有很多,我們需要根據createion_time來得到最新的資料檔案

conn_str=n1/n1

print "

conn  $conn_str

set feedback off

set pages 0

select name from v\$datafile where ts#=(select ts# from v\$tablespace where name=upper('$new_TS_name')) order by creation_time;

" |sqlplus -s /nolog |tail -1 > last_dbf_ts.lst

然後解析資料檔案的格式,把之前得到的挂載點資訊和現有的做一個替換。

old_mount=`awk -F"/" '{print   $2}' last_dbf_ts.lst`

new_mount=`cat  tmp_FS_mount|sed -n "${tmp_random}p"|awk  '{print $3}' |awk -F"/" '{print $2}'`

#echo $new_mount

#echo $old_mount

對于資料檔案的修改,可以參考下面的代碼,基本就是解析出檔案名,然後對檔案id+1,繼續替換。

#/oravl03/oradata/GLBABP1/pool_data_45.dbf

tmp_dbf_path1=`sed   "s/${old_mount}/${new_mount}/" last_dbf_ts.lst`

#pool_data_45

tmp_dbf_name1=`sed   "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'`

#45

tmp_dbf_id1=`sed   "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'|awk -F_ '{print $NF}'`

#46

tmp_dbf_id2=`expr $tmp_dbf_id1 + 1`

#pool_data_46

tmp_dbf_name2=`echo $tmp_dbf_name1 |sed "s/${tmp_dbf_id1}/${tmp_dbf_id2}/"`

tmp_dbf_path2=`echo $tmp_dbf_path1|sed "s/${tmp_dbf_name1}/${tmp_dbf_name2}/"`

替換完成之後,新的檔案路徑和檔案名就生成了,先列印出來看看,如果需要設定為背景執行,也沒有問題,直接嵌入sqlplus即可。

echo "alter tablespace $new_TS_name add datafile '$tmp_dbf_path2' size ${new_file_size}k;"

執行的情況如下,可以看到得到的挂載點是在滿足條件的情況下,根據随機函數得到的,資料檔案的id也進行了自增。

> ksh add_dbf.sh pool_data

alter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k;

 > ksh add_dbf.sh pool_datav

>ksh add_dbf.sh pool_data

alter tablespace pool_data add datafile '/oravl03/oradata/XXXX/pool_data_47.dbf' size 2000000k;

alter tablespace pool_data add datafile '/oravl06/oradata/XXXX/pool_data_47.dbf' size 2000000k;

 > ksh add_dbf.sh pool_data

alter tablespace pool_data add datafile '/oravl05/oradata/XXXX/pool_data_47.dbf' size 2000000k;

對于表空間監控外的腳本,進行整理如下,這樣就可以是一個獨立的腳本,能夠根據輸入的表空間名進行分析和映射,還有一些基本的驗證。

如果空間不足,或者表空間有誤都會抛出警告資訊。

#kB

new_file_size=2000000

#TS name

new_TS_name=$1

conn_str=aim_dba/aim_dba

 select file_name from dba_data_files where tablespace_name=upper('$new_TS_name');

" |sqlplus -s /nolog |awk -F"/" '{print   "/"$2}'|sort|uniq|awk '{print "df -k |grep -i \""$1 "\""}' > df_k_chk_tmp.ksh

if [ ! -s df_k_chk_tmp.ksh ]

then

echo 'WARNING! there is someting wrong with TS name,please check again'

ksh  df_k_chk_tmp.ksh

exit

fi

function get_random

{

    min=$1;

    max=$2

    num=$(date +%s+%N);

    ((retnum=num%max+min));

    echo $retnum;    

}

function get_db_file_mount

ksh  $1 | awk -v file_size=$new_file_size 'NR>=1{ if($(NF-2)-file_size>0) print $(NF-2),$(NF-1),$NF}' |sort

get_db_file_mount df_k_chk_tmp.ksh $new_file_size > tmp_FS_mount

if [ ! -s tmp_FS_mount ]

echo 'WARNING! there is no enough space to add datafiles,file size needed:' ${new_file_size}k

tmp_FS_mount_cnt=`cat tmp_FS_mount|wc -l`

#echo $tmp_FS_mount_cnt

tmp_random=`get_random 1 ${tmp_FS_mount_cnt}`

#echo $tmp_random