半自动化运维之动态添加数据文件(二) (r5笔记第56天)
接着上一篇的内容:半自动化运维之动态添加数据文件(一) http://blog.itpub.net/23718752/viewspace-1683250/conn_str=n1/n1print "conn $conn_strset feedback offset pages 0select 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.dbftmp_dbf_path1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst`#pool_data_45tmp_dbf_name1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'`#45tmp_dbf_id1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'|awk -F_ '{print $NF}'`#46tmp_dbf_id2=`expr $tmp_dbf_id1 + 1`#pool_data_46tmp_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_dataalter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k; > ksh add_dbf.sh pool_datavalter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k;>ksh add_dbf.sh pool_dataalter tablespace pool_data add datafile '/oravl03/oradata/XXXX/pool_data_47.dbf' size 2000000k;> ksh add_dbf.sh pool_dataalter tablespace pool_data add datafile '/oravl06/oradata/XXXX/pool_data_47.dbf' size 2000000k; > ksh add_dbf.sh pool_dataalter tablespace pool_data add datafile '/oravl07/oradata/XXXX/pool_data_47.dbf' size 2000000k;>ksh add_dbf.sh pool_dataalter tablespace pool_data add datafile '/oravl05/oradata/XXXX/pool_data_47.dbf' size 2000000k;对于表空间监控外的脚本,进行整理如下,这样就可以是一个独立的脚本,能够根据输入的表空间名进行分析和映射,还有一些基本的验证。如果空间不足,或者表空间有误都会抛出警告信息。#kBnew_file_size=2000000#TS namenew_TS_name=$1conn_str=aim_dba/aim_dbaprint "conn $conn_strset feedback offset 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.kshif [ ! -s df_k_chk_tmp.ksh ]thenecho 'WARNING! there is someting wrong with TS name,please check again'ksh df_k_chk_tmp.kshexitfifunction 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_mountif [ ! -s tmp_FS_mount ]thenecho 'WARNING! there is no enough space to add datafiles,file size needed:' ${new_file_size}kksh df_k_chk_tmp.kshexitfitmp_FS_mount_cnt=`cat tmp_FS_mount|wc -l`#echo $tmp_FS_mount_cnttmp_random=`get_random 1 ${tmp_FS_mount_cnt}`#echo $tmp_randomconn_str=aim_dba/aim_dbaprint "conn $conn_strset feedback offset pages 0select 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.lstold_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.dbftmp_dbf_path1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst`#pool_data_45tmp_dbf_name1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'`#45tmp_dbf_id1=`sed "s/${old_mount}/${new_mount}/" last_dbf_ts.lst|awk -F. '{print $1}' | awk -F"/" '{print $NF}'|awk -F_ '{print $NF}'`#46tmp_dbf_id2=`expr $tmp_dbf_id1 + 1`#pool_data_46tmp_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;"