谁动了我的参数?

2024年 5月 7日 84.8k 0

利用 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

运行三个脚本,并下载结果文件。

谁动了我的参数?-1

整理下载的文件,形成三个汇总文件。

谁动了我的参数?-2

  • parameters 默认值模

谁动了我的参数?-3

  • variables默认值模板

谁动了我的参数?-4

  • proxyconfig 默认值模板

谁动了我的参数?-5

2. 将 DBA 主动刷的参数提取出来,仿照“默认值模板”放至 Excel 作为“刷参数默认值模板”sheet。

3. 在生产环境运行 shell 脚本获取参数,将参数放至 Excel,基于 vlookup 进行跨 sheet 对比,将不符合预期的参数值以红色底纹展示。

  • 以 variables 为例进行展示,parameters 和 proxyconfig 与其类似

谁动了我的参数?-6

  • =IFERROR(IF(B2=VLOOKUP(A2,variables模板!A:B,2,FALSE),"一致","不一致"),"不存在")

谁动了我的参数?-7

  • =IFERROR(IF(B2=VLOOKUP(A2,刷参数默认值模板!A:B,2,FALSE),"一致","不一致"),"不存在")

谁动了我的参数?-8

谁动了我的参数?-9

谁动了我的参数?-10

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 $@

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论