使用Shell脚本来解析MySQL元数据变化
发布日期:2021-06-30 13:21:50 浏览次数:2 分类:技术文章

本文共 2120 字,大约阅读时间需要 7 分钟。

这是学习笔记的第 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

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

640?

转载地址:https://jeanron100.blog.csdn.net/article/details/102479265 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:迁移到MySQL的架构演进(一)
下一篇:初来北京几年的精神状态

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月13日 01时36分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章