再使用hashicrop vault进行database动态秘密管理的时候,发现凭据轮换时,为了连接安全的考虑,需要主动配置旧连接的销毁。在使用MySQL时,可以通过存储过程来解决动态编译PREPARE只能处理一条语句的问题,但是TiDB不支持存储过程,是否可以强化KILL语句,使之可以KILL多个连接。
动态编译不支持如下方式生成的形如*KILL CONNECTION_ID; …; KILL CONNECTION_ID;*的语句:
SELECT GROUP_CONCAT(id SEPARATOR ',') INTO @ids FROM information_schema.processlist WHERE USER = '{{name}}';
SET @stmt = IFNULL(CONCAT('KILL ', REPLACE(@ids, ',', CONCAT(CHAR(59), ' KILL ')), CHAR(59)), CONCAT('SELECT 1', CHAR(59)));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
REVOKE ALL PRIVILEGES ON *.* FROM '{{name}}'@'%';
DROP USER IF EXISTS '{{name}}'@'%';
FLUSH PRIVILEGES;
MySQL使用存储过程可以使用以下方式解决:
USE hashicorp_vault;
CALL vault_kill_conn('{{name}}');
REVOKE SELECT ON *.* FROM '{{name}}'@'%';
DROP USER IF EXISTS '{{name}}'@'%';
FLUSH PRIVILEGES;
TiDB是否可以强化KILL语句,使得KILL可以实现KILL CONNECTION_ID … CONNECTION_ID,来一次性发出多个KILL信号。