这是学习笔记的第 2006 篇文章
今天写了一个简单的Shell脚本,可以通过这个脚本来得到一个MySQL元数据变化的列表。
总体上我把变更分为了三类:
其中修改表的逻辑最为复杂,会主要包括三个场景:新增字段,删除字段,变更字段。
如何有效的进行元数据信息的快速提取呢,我们可以考虑增量的实现方式,比如若干套数据库中,有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
得到这个列表之后,我们可以对这个列表中的数据进行明细信息的提取,通常包含字段明细,索引明细等几部分的内容。