GBase 8a
其他
文章

某base8a项目超大量的ddlevent处理方法参考

发表于2025-01-11 15:27:1597次浏览0个评论

笔者在某Gbase8a项目上遇见由于集群的其中一台服务器硬件故障宕机较久未能修复。
当最终修复重启后集群已经产生了几十万的DDLEVNET,如由数据库的同步服务进行恢复,其耗时将非常久,同时由于EVENT较多对集群的性能也有较大影响。

分析DDLEVENT特性,发现几十万的DDLEVENT中其实质只是包含了约3000来张表,即每张表存在2/3千的EVENT.
沟通了解到应用特性,现场存在很多中间表,每次加载等操作均是对中间表进行truncate操作,数据不保留使用。
对应在数据库侧,即表的每次TRUNCATE操作均会产生一个DDLEVNT(测试TRUNCATE会清理掉DMLEVENT),于是就出现单表多个EVENT情况。

对于这样的场景,可通过drop重建表来快速解决(drop表能将表的所有EVENT删除)。
参考脚本如下:
#!/bin/bash

gccli='gccli -ugbase -pgbase20110531 '

get_sql()
{
    tbname=$1
    ${gccli} -c -q  -Ns -e"show full create table ${tbname}"|awk -F"CREATE TABLE" '{print "CREATE TABLE "$2";"}'|sed 's/\\n/\n/g'

}

gcadmin showddlevent 100 vc ods|grep ObjectName|sort|uniq|awk -F ':' '{print $2}'|while read lines
do  
    dbname=`echo $lines|awk -F'.' '{print $1}'`
    cre_sql=`get_sql ${lines}`
    ${gccli} -D${dbname} -vvv  -e"drop table if EXISTS ${lines};${cre_sql}"
done

另:补充指定条件清理EVENT的办法:
type:清理方法,按照这个方案清理event,包含后面的四种方法:
0 = eventid 按照具体的事件编号清理
1 = tablename 清理指定表名字的所有事件
2 = nodeip 清理指定IP上的所有事件
3 = tablename nodeip 清理指定表名字,指定IP上的所有事件
eg:
gcadmin rmdmlevent type [eventid | tablename | nodeip | tablename nodeip]
gcadmin rmdmlevent 0 10234
gcadmin rmdmlevent 1 testdb.t1
gcadmin rmdmlevent 2 192.168.0.3
gcadmin rmdmlevent 3 testdb.t1 192.168.0.3

评论

登录后才可以发表评论