今天登录一个客户的环境,帮助客户解决迁移出错问题,客户的主机上安装了两套数据库软件:DM7 和 DM8,安装目录十分混乱,只能通过 ps 和 netstat 命令反复查找部署信息。
于是本人萌发了一个想法:通过自动化脚本来推进数据库部署的规范化。 接下来给大家简单介绍一下,通过 shell 脚本完成整个DM数据库的单机部署流程,希望和大家一起探讨、改进。(以下部署基于 Centos 7.6 和 DM V8)
整个过程大致分为三部分,虽然需要在 root 用户下运行,但主体过程都是在 dmdba 用户下执行的,所以也符合安装在非 root 用户下的规范。
软件部署前最重要的步骤就是目录的规划,一个好的目录层次结构不仅能体现专业性,而且还可以降低后续维护管理的成本。
脚本中的目录结构如下:
这个目录命名一目了然,应该不用过多解释。其中的每个目录既可以挂载本地存储,也可以是虚拟化的存储 LUN。
初始化一个数据库,需要在基目录下的 script 子目录中配置一个 XML 文件,命名为 slient_setup.xml。
部分脚本如下:
脚本中列出了常用的重要参数,大家可以根据需求增加或修改初始化参数,尤其需要注意一些建库后无法修改的参数。
初始化的脚本包括注册数据库服务和配置环境变量(二进制文件和运行时库文件的搜索路径)。
脚本初始化结束后,会自动启动服务。
可以使用如下命令验证:
整个部署过程大概在 2 分种内完成,体验感不错,有兴趣的小伙伴们可以试试看。
当然生产上还必须按需修改运行参数和开归档,这部分内容没有写入,后续我也会添加进去,逐步完善。
使用前,事先建立以下两个目录:
mkdir –p /dm8_setup/iso # 将ISO文件拷贝到这个目录下,并记下ISO文件名
mkdir –p /dm # 数据库软件安装基目录
运行脚本,输入必要的安装参数如下:
整个脚本代码如下:
# root用户下 拷贝对应的安装介质 到 /dm/iso目录下并挂载到/mnt目录下
# mount /dm/iso/xxx.iso /mnt
echo -e "======DM8 Setup Prepare v2021======\n"
# mount iso file
read -p "Please input iso file name >" iso_name
mount /dm8_setup/iso/${iso_name} /mnt -o loop &>/dev/null
if [ $? -ne 0 ]; then
echo "cdrom has mount!please umount and continue setup."
exit
fi
# input setup base dir
read -p "Please input setup base dir >" dm_base
if [ ! -d "$dm_base" ]; then
mkdir -p "$dm_base"
fi
if [ "$(ls -A $dm_base)" ]; then
echo "$dm_base is not empty!"
exit
fi
# port num is used or not
read -p "Please input setup port num(default 5236) >" port_num
if [ "$(netstat -tpnl | grep $port_num)" ]; then
echo "$port_num is used"
exit
fi
host_ip='127.0.0.1'
local_ip=`ip address | grep –E “ens|eth” | grep inet | awk '{print $2}' | cut -d / -f 1`
select var in $local_ip;
do
case $REPLY in
1|2)
host_ip=$var
break
;;
*)
exit
;;
esac
done
# modify /etc/hosts file
echo "$host_ip $host_name" >> /etc/hosts
host_name=`hostname` # get host name
groups=(dinstall) # install group
group_start_id=50000 # specify start id of group
setup_dir=${dm_base}/dbms
init_db_dir=${dm_base}/data
init_rlog_dir=${dm_base}/log
db_name=PROD
instance_name=PROD
ctl_path=$init_db_dir"/"$db_name
log_path=$init_rlog_dir"/"$db_name
page_size=16
extent_size=16
log_size=256
case_sensitive=y
charset=0
length_in_char=0
sysdba_pwd=SYSDBA
# create dm soft dirs and grant privlieges
mkdir -p ${dm_base}/dbms
mkdir -p ${dm_base}/data
mkdir -p ${dm_base}/log
mkdir -p ${dm_base}/arch
mkdir -p ${dm_base}/bak
mkdir -p ${dm_base}/script
# create group of required with dmdba user
function create_group() {
g_id=${group_start_id}
for g_name in ${groups[*]}
do
groupadd -g $((g_id++)) ${g_name} &>/dev/null
done
for line in $(cat /etc/group | awk -F: '$3>=50000 && $3<=50010')
do
OLD_IFS="$IFS"
IFS=":"
segs=($line)
echo "Group ${segs[0]} created successful!"
IFS="$OLD_IFS"
done
}
function del_group() {
del_gn=(`cat /etc/group | awk -F: '$3>50000 && $3 <50000{print $1}' | xargs`)
for gn in ${del_gn[*]}
do
groupdel $gn
done
}
# $1:user name
# $2:user id
# $3:group name
function create_user() {
$(id "$1" &>/dev/null)
if (($?!=0)); then
$(useradd -u "$2" -g "$3" "$1" ; echo "dmdba" | passwd --stdin $1 &>/dev/null)
echo "$1 user created! password is dmdba"
else
echo "user has existed!"
fi
}
# create groups
create_group
# create user for install
create_user dmdba 51000 dinstall
chown -R dmdba:dinstall /dm
chmod -R 775 /dm
# modify resources parameter
echo "dmdba soft nproc 16384
dmdba hard nproc 16384
dmdba soft nofile 16384
dmdba hard nofile 65536
dmdba soft stack 16384
dmdba hard stack 32768" >> /etc/security/limits.conf
# close firewalld
systemctl stop firewalld.service &>/dev/null
systemctl disable firewalld.service &>/dev/null
# disable selinux
sed -r -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 &>/dev/null
# modify I/O schedular
# redhat 7.7 default value is deadline
# modify system parameter
touch /etc/sysctl.d/97-oracle-database-sysctl.conf
echo "fs.aio-max-nr = 1048576
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586" >> /etc/sysctl.d/98-dm-database-sysctl.conf
sysctl -p &>/dev/null
echo -e "======DM8 Setup v2021======\n"
#generate slient setup file-xml format
cat << EOF > ${dm_base}/script/silent_setup.xml
<?xml version="1.0"?>
<DATABASE>
<LANGUAGE>en</LANGUAGE>
<TIME_ZONE>+08:00</TIME_ZONE>
<KEY></KEY>
<INSTALL_TYPE>0</INSTALL_TYPE>
<INSTALL_PATH>${setup_dir}</INSTALL_PATH>
<INIT_DB>y</INIT_DB>
<DB_PARAMS>
<PATH>${init_db_dir}</PATH>
<DB_NAME>${db_name}</DB_NAME>
<INSTANCE_NAME>${instance_name}</INSTANCE_NAME>
<PORT_NUM>${port_num}</PORT_NUM>
<CTL_PATH>${setup_dir}/${db_name}/dm.ctl</CTL_PATH>
<LOG_PATHS>
<LOG_PATH>${init_rlog_dir}/${db_name}/redo01.log</LOG_PATH>
<LOG_PATH>${init_rlog_dir}/${db_name}/redo02.log</LOG_PATH>
</LOG_PATHS>
<EXTENT_SIZE>${extent_size}</EXTENT_SIZE>
<PAGE_SIZE>${page_size}</PAGE_SIZE>
<LOG_SIZE>${log_size}</LOG_SIZE>
<CASE_SENSITIVE>Y</CASE_SENSITIVE>
<CHARSET>0</CHARSET>
<LENGTH_IN_CHAR>0</LENGTH_IN_CHAR>
<TIME_ZONE>+08:00</TIME_ZONE>
</DB_PARAMS>
<CREATE_DB_SERVICE>n</CREATE_DB_SERVICE>
<STARTUP_DB_SERVICE>n</STARTUP_DB_SERVICE>
</DATABASE>
EOF
chown dmdba:dinstall /dm/script/silent_setup.xml
# begin slient setup dm dbms
su - dmdba -c "/mnt/DMInstall.bin -q /dm/script/silent_setup.xml"
# root 用户下执行脚本
${setup_dir}/script/root/root_installer.sh
${setup_dir}/script/root/dm_service_installer.sh -t dmserver -p ${db_name} -dm_ini ${init_db_dir}/${db_name}/dm.ini
cat << EOF >> /home/dmdba/.bash_profile
DM_HOME=${setup_dir}
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\${DM_HOME}/bin
export PATH=\$PATH:\${DM_HOME}/bin
EOF
su - dmdba -c "source /home/dmdba/.bash_profile"
su - dmdba -c "${setup_dir}/bin/DmService${db_name} start"
文章
阅读量
获赞