Artifactory启动时与PostgreSQL数据库连接异常故障求助
Artifactory启动失败:PostgreSQL锁堆积与重复键冲突问题解决
核心问题定位
从日志和数据库状态可明确:
- 重复键约束冲突:
access_configs表中shared.security.joinKey记录已存在,但Artifactory初始化时仍尝试插入,触发唯一约束错误ERROR: duplicate key value violates unique constraint "access_configs_pk"。 - 数据库锁堆积:冲突发生后,后续的
UPDATE access_configs和UPDATE artifactory_servers查询因锁等待无法执行,导致事务堆积。 - 连接超时:HikariCP数据库连接等待锁释放超时,被标记为broken,最终引发Artifactory启动失败的
SocketTimeoutException。
排查步骤
- 检查是否有多个Artifactory实例同时启动:HA集群环境下,多节点同时执行初始化会争抢同一数据库资源,引发锁冲突。
- 查看
access_configs表数据:确认shared.security.joinKey记录是否存在,是否为异常停机留下的脏数据。 - 查询数据库锁状态:执行PostgreSQL命令查看阻塞的锁和会话:
-- 查看未授予的锁 SELECT * FROM pg_locks WHERE NOT granted; -- 查看活跃会话,找出阻塞进程 SELECT pid, query, state FROM pg_stat_activity WHERE state = 'idle in transaction';
修复方案
单节点场景
- 停止Artifactory服务。
- 登录PostgreSQL数据库,清理冲突脏数据:
DELETE FROM access_configs WHERE config_name = 'shared.security.joinKey'; - 杀掉堆积的阻塞事务:
-- 替换pid为pg_stat_activity中找到的阻塞进程ID SELECT pg_terminate_backend(pid); - 重新启动Artifactory,观察初始化日志是否正常。
HA集群场景
- 停止所有Artifactory节点。
- 选择单个节点启动,等待其完成数据库初始化(日志显示
PostDbSchemaInitializationManager.init执行完成)。 - 初始化完成后,再依次启动其他集群节点,此时节点会读取已存在的配置,不会重复执行插入操作。
- 检查集群节点时间同步状态:节点间时间差过大会导致心跳和锁逻辑异常,需确保所有节点NTP同步正常。
临时缓解(非根治)
若需快速恢复,可适当调大Artifactory数据库连接池超时参数(在artifactory.system.properties中):
# 调大连接超时时间,单位毫秒 db.connectionTimeout=30000 db.validationTimeout=10000
内容的提问来源于stack exchange,提问作者stevansv
相关产品推荐
相关产品推荐

