暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

DM DW 主备集群自动化运维脚本

原创 ZhuHong 2023-05-17
510

说明:

       针对DM主备集群日常的使用场景,编写一些脚本,简化运维管理工作。


脚本1:集群自动重启

#!/bin/bash
MON_HOME=/dm_i/dm_i1/bin
MON_INI=/dm_i/dmdata/dmdata_i1/I1/dmmonitor2.ini
DB_SYSDBA=SYSDBA
DB_SYSDBA_PASS=Dameng123

###
DB_GROUP="`cat ${MON_INI} |grep "\["`"
DBG=`echo ${DB_GROUP:1:-1}`

expect -version
if [ $? -ne 0 ];then
printf "expect not installed,exit now ... \n"
exit

else
  expect <<EOF
  set timeout 60
  spawn ${MON_HOME}/dmmonitor ${MON_INI}
  expect "READY"
  send "show\n"
  send "login\n"
  expect "username:"
  send "${DB_SYSDBA}\n"
  expect "password:"
  send "${DB_SYSDBA_PASS}\n"
  expect "success!"
  send "stop group ${DBG}\n"
  expect "Exit all active instances in group(${DBG}) success"
  send "startup group ${DBG}\n"
  expect "Start all instances in group(${DBG}) success"
  send "exit\n"
EOF
# printf "####\nrestart dw success!\n"
fi

注:加粗为需要修改的实际参数

依赖:expect包 (yum -y install expect)

运行效果:




脚本2:集群自动切换到指定备库

#!/bin/bash
MON_HOME=/dm_i/dm_i1/bin
MON_INI=/dm_i/dmdata/dmdata_i1/I1/dmmonitor2.ini
DB_SYSDBA=SYSDBA
DB_SYSDBA_PASS=Dameng123
SWITCH_DB=I1_MASTER   #指定要切换的备库


######
DB_GROUP="`cat ${MON_INI} |grep "\["`"
DBG=`echo ${DB_GROUP:1:-1}`

expect -version
if [ $? -ne 0 ];then
printf "expect not installed,exit now ... \n"
exit

else
expect <<EOF
set timeout 60
spawn ${MON_HOME}/dmmonitor ${MON_INI}
expect "READY"
send "show\n"
send "login\n"
expect "username:"
send "${DB_SYSDBA}\n"
expect "password:"
send "${DB_SYSDBA_PASS}\n"
expect "success!"
send "SWITCHOVER ${DBG}.${SWITCH_DB}\n"
expect "Switchover instance ${SWITCH_DB} success"
send "exit\n"
EOF
# printf "####\nrestart dw success!\n"
fi

注:加粗为需要修改的参数,可以按自己需求改造成交互输入,或是$1取执行脚本时带的执行参数。


运行效果:




脚本3:主备同步延时-实时查看脚本

#!/bin/bash
###参数配置###
DB1_IP=192.168.136.141 #primary
DB1_PORT=5236
DB1_USER=SYSDBA
DB1_PASS=SYSDBA

DB2_IP=192.168.136.142 #standby
DB2_PORT=5236
DB2_USER=SYSDBA
DB2_PASS=SYSDBA


DM_PATH=/dm/bin


###############
get_lsn(){
DB_VAR=$1
if [ "${DB_VAR}" = 'DB1' ];then
echo "${DM_PATH}/disql ${DB1_USER}/${DB1_PASS}@${DB1_IP}:${DB1_PORT} -e \"select cur_lsn from V\\\$RLOG;\"|sed -n '8p'">/tmp/sql1.sh
cur_lsn=`su - dmdba -s /bin/bash /tmp/sql1.sh|sed -n '2p'`
printf "${cur_lsn}\n"
elif [ "${DB_VAR}" = 'DB2' ];then
echo "${DM_PATH}/disql ${DB2_USER}/${DB2_PASS}@${DB2_IP}:${DB2_PORT} -e \"select cur_lsn from V\\\$RLOG;\"|sed -n '8p'">/tmp/sql1.sh
cur_lsn=`su - dmdba -s /bin/bash /tmp/sql1.sh|sed -n '2p'`
printf "${cur_lsn}\n"
fi

}


line(){
let length1=$1
printf " %.0s" $(seq 1 $length1)
}


compare(){
lsn_db2_c1=`get_lsn DB2`
lsn_db1_c1=`get_lsn DB1`
sleep 1
lsn_db2_c2=`get_lsn DB2`
lsn_db1_c2=`get_lsn DB1`

delay=`echo "scale=6;(${lsn_db1_c1}-${lsn_db1_c2})/(${lsn_db2_c2}-${lsn_db2_c1})" |bc -l`
printf "${delay}"
}




###执行###

echo "DB1_CURRUNT_LSN DB2_CURRUNT_LSN 当前LSN差值 当前延迟估算(s)"
while true; do
lsn_db2=`get_lsn DB2`
lsn_db1=`get_lsn DB1`
lsn1_length=`expr length "${lsn_db1}"`
let append_len=19-${lsn1_length}
append_var=`line ${append_len}`
let lsn_bet=${lsn_db1}-${lsn_db2}

sleep 3
lsn_db2_c2=`get_lsn DB2`
lsn_db1_c2=`get_lsn DB1`
let lsn_speed=${lsn_db2_c2}-${lsn_db2}
if [ ${lsn_speed} -eq 0 ];then
lsn_speed=1
fi
delay=`echo "scale=3;(${lsn_db1}-${lsn_db2})/(${lsn_speed})/3" |bc -l| awk '{printf "%.2f", $0}'`
echo -ne "${lsn_db1}${append_var}${lsn_db2}${append_var}${lsn_bet} ${append_var}${delay}\r"

#read -rsN1 input
#if [[ "$input" == "z" ]]; then
# exit
#fi
done

注:加粗为需要修改的参数


脚本运行效果:


展示数据每3秒动态变化一次,显示主备库的实时current_lsn。关键看LSN差值,延迟时间是估算结果(公式为:备库和主库的lsn差值/备库lsn的追加速度),仅供参考。

最后修改时间:2023-05-25 10:48:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论