某base8a项目超大量的ddlevent处理方法参考
笔者在某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
评论
热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529