注册
数据库一键部署脚本

数据库一键部署脚本

氢气球 2021/05/19 2976 17 0
摘要 与大家分享一个能规范数据库部署的自动化脚本。

今天登录一个客户的环境,帮助客户解决迁移出错问题,客户的主机上安装了两套数据库软件:DM7 和 DM8,安装目录十分混乱,只能通过 ps 和 netstat 命令反复查找部署信息。

于是本人萌发了一个想法:通过自动化脚本来推进数据库部署的规范化。 接下来给大家简单介绍一下,通过 shell 脚本完成整个DM数据库的单机部署流程,希望和大家一起探讨、改进。(以下部署基于 Centos 7.6 和 DM V8)

整个过程大致分为三部分,虽然需要在 root 用户下运行,但主体过程都是在 dmdba 用户下执行的,所以也符合安装在非 root 用户下的规范。

1. 静默方式部署 DM8 数据库软件

软件部署前最重要的步骤就是目录的规划,一个好的目录层次结构不仅能体现专业性,而且还可以降低后续维护管理的成本。

脚本中的目录结构如下:
2.1.png

这个目录命名一目了然,应该不用过多解释。其中的每个目录既可以挂载本地存储,也可以是虚拟化的存储 LUN。

2. 静默方式初始化数据库

初始化一个数据库,需要在基目录下的 script 子目录中配置一个 XML 文件,命名为 slient_setup.xml。

部分脚本如下:

2.2.png

脚本中列出了常用的重要参数,大家可以根据需求增加或修改初始化参数,尤其需要注意一些建库后无法修改的参数。

3. 执行必要的脚本

初始化的脚本包括注册数据库服务和配置环境变量(二进制文件和运行时库文件的搜索路径)。

脚本初始化结束后,会自动启动服务。
可以使用如下命令验证:

2.3.png

整个部署过程大概在 2 分种内完成,体验感不错,有兴趣的小伙伴们可以试试看。

当然生产上还必须按需修改运行参数和开归档,这部分内容没有写入,后续我也会添加进去,逐步完善。

使用前,事先建立以下两个目录:

mkdir –p /dm8_setup/iso  # 将ISO文件拷贝到这个目录下,并记下ISO文件名
mkdir –p /dm               # 数据库软件安装基目录

运行脚本,输入必要的安装参数如下:

2.4.png

整个脚本代码如下:

# 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"

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服