半自动化运维之动态添加数据文件(二) (r5笔记第56天)

接着上一篇的内容:半自动化运维之动态添加数据文件(一) (r5笔记第55天)

我们可以通过监控表空间的情况,然后映射匹配文件系统中的挂载点情况,通过随机函数在各个分区中进行筛选,基本保证数据文件的创建能够分散到各个分区中。 接下来我们需要根据计算得到的挂载点,匹配创建数据文件的语句,比如数据文件为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;"

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持

一、Oracle XE 数据库与连接工具安装使用 Oracle数据库历来以价格昂贵出名,当然贵有贵的道理,成为一个Oracle DBA也是令人羡慕的事情,如果程...

4237
来自专栏小白安全

重置dedecms管理员后台密码重现及分析

0×00 概述 2018年1月,网上爆出dedecms v5.7 sp2的前台任意用户密码重置和前台任意用户登录漏洞,加上一个管理员前台可修改其后台密码...

1.3K5
来自专栏horstxu的博客

PHP Laravel框架中关于db migration的一个无解深坑

PHP Laravel框架提供了db migration的功能,用代码来管理数据库。

5206
来自专栏乐沙弥的世界

MySQL 数据库简单操作

    对于想要从事或爱好mysql相关工作的童鞋们,有必要掌握在命令行下对mysql实现一些简单的操作。本文从描述了如何登录到mysql数据库服务器,如何在m...

952
来自专栏程序员的SOD蜜

使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行。但是每次发现问题重新做...

3107
来自专栏数据库

SQL Server数据库介绍

1、数据库基本概念 数据:描述事物的符号 数据表:由记录(行)和字段(列)组成 数据库:数据表的集合 数据库管理系统:对数据库进行管理和维护DBMS 数据库管理...

2396
来自专栏地方网络工作室的专栏

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用 在前面我用 python 脚本实现的 cli 版本...

2785
来自专栏北京马哥教育

MySQL开源热备工具XtraBackup的原理与程序说明

XtraBackup是Percona发布的MySQL开源热备工具,可以在尽量不影响线上读写的情况下进行快速全备、增备。支持InnoDB, XtraDB, 和My...

3245
来自专栏Albert陈凯

2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?

我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看...

1605
来自专栏云数据库

MyDumper原理简介

相对于 MySQL 官方提供的逻辑备份工具 mysqldump,mydumper 最突出的特性就是可采用多线程并行备份,极大提高了数据导出的速度。本文基于 my...

5008

扫码关注云+社区

领取腾讯云代金券