当前位置: 首页 > news >正文

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

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

相关文章:

  • 初来北京几年的精神状态
  • 磨刀不误砍柴工-流程梳理
  • 一个MySQL连接问题的优化过程
  • 认知的偏差
  • 迁移到MySQL的架构演进(一)
  • K-Means算法原理和简单测试
  • 如何让你的工作能够大量输出
  • 数据生命周期管理的初步实现
  • MySQL分布式高可用的一个补充
  • MySQL锁
  • 难忘的三件苦差事
  • 千与千寻,真是一部给大人看的动画片
  • 聊聊高考分数线和选择
  • MySQL中间件的连接错误问题排查
  • 一次宕机问题的总结复盘
  • hexo+github搭建个人博客
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 30秒的PHP代码片段(1)数组 - Array
  • go语言学习初探(一)
  • isset在php5.6-和php7.0+的一些差异
  • Laravel5.4 Queues队列学习
  • node入门
  • Sublime Text 2/3 绑定Eclipse快捷键
  • swift基础之_对象 实例方法 对象方法。
  • VUE es6技巧写法(持续更新中~~~)
  • 大数据与云计算学习:数据分析(二)
  • 那些年我们用过的显示性能指标
  • 前端攻城师
  • 前端面试之CSS3新特性
  • 如何使用 JavaScript 解析 URL
  • 如何优雅地使用 Sublime Text
  • 用jquery写贪吃蛇
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # C++之functional库用法整理
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #13 yum、编译安装与sed命令的使用
  • #QT(TCP网络编程-服务端)
  • (06)金属布线——为半导体注入生命的连接
  • (14)Hive调优——合并小文件
  • (C语言)fgets与fputs函数详解
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (已解决)什么是vue导航守卫
  • (译)2019年前端性能优化清单 — 下篇
  • .gitignore文件—git忽略文件
  • .net Stream篇(六)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net对接阿里云CSB服务
  • .net中生成excel后调整宽度
  • ::什么意思