半自動化運維之動態新增資料檔案(二)
接著上一篇的內容:半自動化運維之動態新增資料檔案(一) http://blog.itpub.net/23718752/viewspace-1683250/
我們可以透過監控表空間的情況,然後對映匹配檔案系統中的掛載點情況,透過隨機函式在各個分割槽中進行篩選,基本保證資料檔案的建立能夠分散到各個分割槽中。
接下來我們需要根據計算得到的掛載點,匹配建立資料檔案的語句,比如資料檔案為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
alter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k;
>ksh add_dbf.sh pool_data
alter tablespace pool_data add datafile '/oravl03/oradata/XXXX/pool_data_47.dbf' size 2000000k;
> ksh add_dbf.sh pool_data
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 '/oravl07/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
print "
conn $conn_str
set feedback off
set pages 0
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 ]
then
echo 'WARNING! there is no enough space to add datafiles,file size needed:' ${new_file_size}k
ksh df_k_chk_tmp.ksh
exit
fi
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
conn_str=aim_dba/aim_dba
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
#/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}/"`
echo "alter tablespace $new_TS_name add datafile '$tmp_dbf_path2' size ${new_file_size}k;"
我們可以透過監控表空間的情況,然後對映匹配檔案系統中的掛載點情況,透過隨機函式在各個分割槽中進行篩選,基本保證資料檔案的建立能夠分散到各個分割槽中。
接下來我們需要根據計算得到的掛載點,匹配建立資料檔案的語句,比如資料檔案為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
alter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k;
>ksh add_dbf.sh pool_data
alter tablespace pool_data add datafile '/oravl03/oradata/XXXX/pool_data_47.dbf' size 2000000k;
> ksh add_dbf.sh pool_data
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 '/oravl07/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
print "
conn $conn_str
set feedback off
set pages 0
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 ]
then
echo 'WARNING! there is no enough space to add datafiles,file size needed:' ${new_file_size}k
ksh df_k_chk_tmp.ksh
exit
fi
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
conn_str=aim_dba/aim_dba
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
#/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}/"`
echo "alter tablespace $new_TS_name add datafile '$tmp_dbf_path2' size ${new_file_size}k;"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1684423/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 半自動化運維之動態新增資料檔案(一)運維
- 半自動化運維之伺服器資訊維護運維伺服器
- IT運維之自動化運維運維
- 自動化運維工具之Puppet常用資源(二)運維
- 運維效率之資料遷移自動化運維
- 半自動化運維之快速連線到指定環境(一)運維
- ansible自動化運維資料庫運維資料庫
- Devops-運維效率之資料遷移自動化dev運維
- Oracle自動新增資料檔案過程Oracle
- 自動化運維工具之Puppet模組運維
- 自動化運維工具之Puppet常用資源(一)運維
- 自動化運維 Expect運維
- Python自動化運維之IPy模組Python運維
- MySQL自動化運維之安裝篇MySql運維
- 運維自動化之賬單系統運維
- 自動化運維-修改主機名&hosts檔案指令碼運維指令碼
- 用自動化運維工具解放IT運維運維
- 自動化運維工具——ansible詳解(二)運維
- 自動化運維 Ansible運維
- 運維開發裡的資料動態獲取和自動補錄運維
- mysql-inception自動化運維MySql運維
- Ansible自動化運維工具運維
- 【DB】有贊資料庫自動化運維實踐之路資料庫運維
- 自動化運維工具之Puppet基礎入門運維
- 品運維自動化之cobbler的安裝序運維
- 什麼是自動化運維?為什麼選擇Python做自動化運維?運維Python
- 簡化IT運維工作,就要學會使用自動化運維工具!運維
- ansible自動化運維入門運維
- 自動化運維的快速演進運維
- 自動化運維的發展方向運維
- 分層運維自動化監控運維
- 容災半自動化的實現思路(二)
- Linux Shell互動式自動化運維程式Linux運維
- 自動化運維,國產化信創替代方案運維
- 非OMF管理 自動新增資料檔案add_datafiles.sh
- oracle 新增儲存自動擴充套件資料檔案流程(auto)Oracle套件
- keycloak~為微信二維碼新增動態kc認可的動態state
- 論IT運維自動化的重要性運維