利用 Shell 脚本 + Excel VLOOKUP 函数,快速采集 OB 参数,并生成参数存档文件。
作者:郑增权
爱可生南区数据库工程师,爱可生 DBA 团队成员,负责数据库相关技术支持。爱好:桌球、羽毛球、咖啡、电影
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
一、背景
1. 客户想在业务上线前记录现有 OB 集群的 Parameters、Variables、ProxyCofnig 参数值。
2. 将其与“默认值”或“DBA 主动刷的调优参数”进行对比,若是“默认值”或“DBA 主动刷的调优参数”则符合预期,否则认为其是不符合预期的值。
3. 生成一份报表文件,标记出非预期的值,再由人工确认其合理性。
二、实现
1. 测试环境安装同版本的 OBServer、OBproxy,编写shell脚本用于获取默认的 Parameters、Variables、ProxyCofnig,将其提取出来,放至 Excel 作为“默认值模板”。
- 主备集群模式,主集群和备集群需分别执行脚本获取参数文件:
- Parameters:集群级,一个集群获取一份参数。
- Variables:租户级,每个租户获取一份参数。
- ProxyConfig:每个 OBProxy 节点获取一份参数。
三个脚本在文末呈现并已传至:https://github.com/Quan-Github/evan_zheng_oceanbase
运行三个脚本,并下载结果文件。
整理下载的文件,形成三个汇总文件。
- parameters 默认值模
- variables默认值模板
- proxyconfig 默认值模板
2. 将 DBA 主动刷的参数提取出来,仿照“默认值模板”放至 Excel 作为“刷参数默认值模板”sheet。
3. 在生产环境运行 shell 脚本获取参数,将参数放至 Excel,基于 vlookup 进行跨 sheet 对比,将不符合预期的参数值以红色底纹展示。
- 以 variables 为例进行展示,parameters 和 proxyconfig 与其类似
- =IFERROR(IF(B2=VLOOKUP(A2,variables模板!A:B,2,FALSE),"一致","不一致"),"不存在")
- =IFERROR(IF(B2=VLOOKUP(A2,刷参数默认值模板!A:B,2,FALSE),"一致","不一致"),"不存在")
4. 将不符合预期的参数与客户进行确认,不符合要求的需择期整改。
三、总结
1. OB 当前未提供追溯所有参数修改记录的方法,本文为记录参数修改记录提供一种思路。
2. 基于本文方法进行参数对比,在参数有更新时需在 Excel 中同步更新。
3. 当项目上线后,若有参数被违规修改,基于此存档文件可进行追溯对比。
四、脚本
获取 parameters 的脚本:
#!/bin/bash
user=root
tenant=sys
cluster=allen
port=2883
password=$password
host=10.186.64.161
db=oceanbase
cluster_info="cluster:$cluster|user:$user|tenant:$tenant|port:$port|host:$host|db:$db"
clear_files(){
if [ ! -d "/tmp/observer_parameters" ]; then
mkdir /tmp/observer_parameters
else
cd /tmp/observer_parameters
tmp_file=`ls | grep -E '*.csv|*.txt'`
if [ $? -eq 0 ]; then
mkdir observer_bak$(date +%Y-%m-%d_%H:%M:%S)
filename=`ls -t |head -n1|awk '{print $0}'`
##将旧文件mv到新建的文件夹
mv $tmp_file $filename
else
echo "no files need to move or move files failed"
fi
fi
}
get_parameters(){
if [ $? -eq 0 ]; then
obclient -h$host -P$port -u$user@$tenant#$cluster -p$password -D$db -vvv -NBe '
select concat(cluster_name, "_",cluster_id) from oceanbase.v$ob_cluster;
show parameters;' > /tmp/observer_parameters/all_parameters.csv
else
echo "exit after login OBSerevr"
exit 2
fi
}
modify_files(){
if [ $? -eq 0 ]; then
cd /tmp/observer_parameters
##获取集群名和id用于文件命名
sed -n 6p all_parameters.csv > name_middle.txt
sed 's/|//g' name_middle.txt > no_line.txt
sed 's/ //g' no_line.txt > no_space.txt
new_name=`cat no_space.txt`
##以集群名和ID进行文件命名
mv all_parameters.csv $new_name.csv
sed -i '1,14d' $new_name.csv
awk -F'|' '{print $2,$4,$5,$6,$8}' $new_name.csv > $new_name.modified_$(date +%Y-%m-%d_%H:%M:%S).csv
file_name=`ls | grep modified`
sed -i "1i $cluster_info" /tmp/observer_parameters/$file_name
echo -e "please download /tmp/observer_parameters/$file_name"
else
echo "Failed to get OBSerevr parameters, now exit"
exit 2
fi
}
main() {
clear_files
get_parameters
modify_files
}
main $@
- 基于获取 parameters 的脚本简单修改,形成获取 variables 和 proxyconfig 的脚本。
获取 variables 的脚本
#!/bin/bash
user=root
tenant=test_mysql
cluster=allen
port=2883
password=$password
host=10.186.64.161
db=oceanbase
cluster_info="cluster:$cluster|user:$user|tenant:$tenant|port:$port|host:$host"
clear_files(){
if [ ! -d "/tmp/observer_var" ]; then
mkdir /tmp/observer_var
else
cd /tmp/observer_var
tmp_file=`ls | grep -E '*.csv|*.txt'`
if [ $? -eq 0 ]; then
mkdir observer_bak$(date +%Y-%m-%d_%H:%M:%S)
filename=`ls -t |head -n1|awk '{print $0}'`
##将旧文件mv到新建的文件夹
mv $tmp_file $filename
else
echo "no files need to move or move files failed"
fi
fi
}
get_parameters(){
if [ $? -eq 0 ]; then
obclient -h$host -P$port -u$user@$tenant#$cluster -p$password -D$db -t -NBe '
show variables;\q' > /tmp/observer_var/all_variables.csv
else
echo "exit after login OBSerevr"
exit 2
fi
}
modify_files(){
if [ $? -eq 0 ]; then
cd /tmp/observer_var
new_name=$cluster
mv all_variables.csv $new_name.csv
##下面三个参数包含逗号,会使格式乱掉,独自输出到一个文件
grep -E 'session_track_system_variables|sql_mode|version_comment' $new_name.csv >> $new_name.additional_var.csv
sed -i '/session_track_system_variables/d' $new_name.csv
sed -i '/sql_mode/d' $new_name.csv
sed -i '/version_comment/d' $new_name.csv
awk -F'|' '{print $2,$3,$4}' $new_name.csv > $new_name.variables_$(date +%Y-%m-%d_%H:%M:%S).csv
file_name=`ls | grep variables`
sed -i "1i $cluster_info" /tmp/observer_var/$file_name
echo -e "please download /tmp/observer_var/$file_name and /tmp/observer_var/$new_name.additional_var.csv"
else
echo "Failed to get OBSerevr variables, now exit"
exit 2
fi
}
main() {
clear_files
get_parameters
modify_files
}
main $@
获取 proxyconfig 的脚本
#!/bin/bash
user=root
tenant=sys
cluster=allen
port=2883
password=$password
host=10.186.64.161
db=oceanbase
cluster_info="cluster:$cluster|user:$user|tenant:$tenant|port:$port|host:$host|db:$db"
clear_files(){
if [ ! -d "/tmp/obproxy_config" ]; then
mkdir /tmp/obproxy_config
else
cd /tmp/obproxy_configs
tmp_file=`ls | grep -E '*.csv|*.txt'`
if [ $? -eq 0 ]; then
mkdir observer_bak$(date +%Y-%m-%d_%H:%M:%S)
filename=`ls -t |head -n1|awk '{print $0}'`
##将旧文件mv到新建的文件夹
mv $tmp_file $filename
else
echo "no files need to move or move files failed"
fi
fi
}
get_parameters(){
if [ $? -eq 0 ]; then
obclient -h$host -P$port -u$user@$tenant#$cluster -p$password -D$db -t -NBe '
select concat(cluster_name, "_",cluster_id) from oceanbase.v$ob_cluster;
show proxyconfig;\q' > /tmp/obproxy_config/all_obproxyConfig.csv
else
echo "exit after login OBSerevr"
exit 2
fi
}
modify_files(){
if [ $? -eq 0 ]; then
cd /tmp/obproxy_config
##获取集群名和id用于文件命名
sed -n 2p all_obproxyConfig.csv > name_middle.txt
sed 's/|//g' name_middle.txt > no_line.txt
sed 's/ //g' no_line.txt > no_space.txt
new_name=`cat no_space.txt`
##以集群名和ID进行文件命名
mv all_obproxyConfig.csv $new_name.csv
sed -i '1,4d' $new_name.csv
sed -i '$d' $new_name.csv
awk -F'|' '{print $2,$3}' $new_name.csv > $new_name.proxy_$(date +%Y-%m-%d_%H:%M:%S).csv
file_name=`ls | grep proxy`
sed -i "1i $cluster_info" /tmp/obproxy_config/$file_name
echo -e "please download /tmp/obproxy_config/$file_name"
else
echo "Failed to get OBProxyConfig, now exit"
exit 2
fi
}
main() {
clear_files
get_parameters
modify_files
}
main $@