南大通用GBase 8a的create database 会被查询耗时很长怀疑卡住的现象分析

在GBase 8a里,create database是权限最高的DDL语句,其需要一个db_lock独占锁,如果其它SQL在使用该库,则需要等待,从现象看是被卡住了。即使运行create database if not exists一样要等待锁。

现象

如下的一个create database语句,已经等待了130秒没有返回。

最后用户取消了,显示信息如下:

可以看到是无法拿到锁,取消了等待锁的操作。

排查

再次运行create database语句,然后执行gcadmin showlock,查看集群锁的情况

可以看到IP为12节点的401398进程(下面的2个红框),没有拿到db_lock的锁(FALSE),该锁被IP为14的254505拿到了。连接14节点,查看进程

发现该节点的进程正在做insert select操作,且已经执行了3266秒。

解决

  • 等待该SQL完成
  • 确认该业务不重要,kill掉
  • 人工确认数据库已存在,不要运行create database语句

总结

create database一般都是运行在系统初始化阶段,在业务升级时,是不需要重建数据库的。而在业务升级时,涉及到【重建】库,肯定要先停掉现有业务,才能操作,也不会出现这个现象。

所以,除了初始化,其它的业务升级,不要包含create database 语句。