前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Shell脚本来解析MySQL元数据变化

使用Shell脚本来解析MySQL元数据变化

作者头像
jeanron100
发布2019-06-15 15:02:34
8380
发布2019-06-15 15:02:34
举报
文章被收录于专栏:杨建荣的学习笔记

这是学习笔记的第 2006 篇文章

今天写了一个简单的Shell脚本,可以通过这个脚本来得到一个MySQL元数据变化的列表。

总体上我把变更分为了三类:

  1. 新增表
  2. 删除表
  3. 修改表
  •   新增字段
  •   删除字段
  •   变更字段

其中修改表的逻辑最为复杂,会主要包括三个场景:新增字段,删除字段,变更字段。

如何有效的进行元数据信息的快速提取呢,我们可以考虑增量的实现方式,比如若干套数据库中,有100张表,那么在一个时间周期范围内的数据变化次数相对来说属于少数,我们抽取元数据的时候如果每次都是全量进行提取势必会影响已有的服务性能,同时也会提取出大量冗余的数据,如何进行元数据的状态识别,我们可以由浅入深,比如我们根据information_schema.tables里面的create_time来得到一张表的DDL变化情况。

这里就会存在两个边界,一个是根据时间来筛选,哪些新增和变更的表相对容易筛选,但是删除的表怎么来判别呢,这个就需要考虑快照的模式了,比如有一个数据库有100张表,在某一个时间点T之后删除了一张表,又新增了一张表,表的总数不变,还是100张,但是包含两类变更,我们可以使用快照对比着两个时间点的变化明细(数据库,表,变更时间)来得到一个变更列表,有了这个变更列表,我们就可以进行明细信息的抓取了,通常来说,变更的比例和总数相对是属于小范围的,所以这个周期数据的管理工作应该是后端的筛选会比较频繁,但是数据总量不大。

如下是一个Shell脚本的部分内容,可以得到一个相对完整的增量列表。

datetime=`date "+%Y%m%d%H%M"`

port=$1

tab_list_file=/tmp/table_list_${port}.lst

if [ ! -f "${tab_list_file}" ]; then

/usr/local/mysql/bin/mysql -udba_admin -pxxx -h127.0.0.1 -P${port} -e "select concat( table_schema,',', table_name,',',CREATE_TIME) from information_schema.tables where table_schema not in ('sys','information_schema','performance_schema','test','mysql'); "|sort|uniq>/tmp/table_list_${port}.lst

cat /tmp/table_list_${port}.lst

else

/usr/local/mysql/bin/mysql -udba_admin -pxxx -h127.0.0.1 -P${port} -e "select concat( table_schema,',', table_name,',',CREATE_TIME) from information_schema.tables where table_schema not in ('sys','information_schema','performance_schema','test','mysql'); "|sort|uniq> ${tab_list_file}_${datetime}

sdiff ${tab_list_file} ${tab_list_file}_${datetime}|grep '|\|<\|>' >/tmp/chg_tab_list_${port}.lst

echo > /tmp/tmp_entry_${port}.lst

sed -i 's/>/\n/g' /tmp/chg_tab_list_${port}.lst

sed -i 's/</\n/g' /tmp/chg_tab_list_${port}.lst

sed -i 's/|/\n/g' /tmp/chg_tab_list_${port}.lst

while read line

do

tmp_entry=`echo $line|awk '{print $1" "$2}'`

echo $tmp_entry >> /tmp/tmp_entry_${port}.lst

done < /tmp/chg_tab_list_${port}.lst

sed -i '/^$/d' /tmp/tmp_entry_${port}.lst

sed -i 's/>//g' /tmp/tmp_entry_${port}.lst

sed -i 's/^[ \t]*//g' /tmp/tmp_entry_${port}.lst

cat /tmp/tmp_entry_${port}.lst

rm /tmp/tmp_entry_${port}.lst

mv ${tab_list_file}_${datetime} ${tab_list_file}

fi

得到这个列表之后,我们可以对这个列表中的数据进行明细信息的提取,通常包含字段明细,索引明细等几部分的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档