在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 语句。