说明:
针对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的追加速度),仅供参考。