Windows10下Postgres13执行Sequelize迁移报Unknown authenticationOk错误
错误原因
- 本质是
pg驱动与PostgreSQL版本不兼容,和操作系统无关。 - PostgreSQL 10起默认将
scram-sha-256作为默认密码认证加密方案,你本地安装的PostgreSQL 13默认遵循该规则。 - 项目依赖的
pg@7.4.3发布于2017年,早于SCRAM认证普及的时间,没有实现对应的认证解析逻辑,无法识别PostgreSQL 13返回的认证报文,才会抛出这个未知消息类型的错误。原Ubuntu环境安装的PostgreSQL版本更低,默认使用MD5认证,因此可以正常运行。
修复方案
方案一:升级pg小版本(推荐,无需改动数据库)
sequelize@4.38.0兼容pg 7.x全量小版本,不需要升级sequelize,直接升级到7系列的最终正式版即可,该版本已经完整支持SCRAM-SHA-256认证,同时完全保留原有API。
注意不要升级到pg 8大版本,pg 8存在破坏性接口变更,sequelize 4未做适配,会引发其他兼容问题。
根据使用的包管理器执行对应命令:
# npm npm install pg@7.18.2 --save # yarn yarn add pg@7.18.2
如果项目存在package-lock.json、yarn.lock这类版本锁文件,需要先删除锁文件和node_modules目录再重新安装依赖,否则锁文件会强制安装旧版pg。安装完成后重新执行npx sequelize db:migrate即可。
方案二:修改PostgreSQL认证方式为MD5
如果旧项目不允许调整依赖版本,可以降级本地PostgreSQL的认证规则适配老版pg驱动,该方案安全性更低,仅建议本地开发环境使用。
操作步骤:
- 在Windows服务管理器中停止
postgresql-x64-13服务 - 打开PostgreSQL 13的数据目录,默认路径为
C:\Program Files\PostgreSQL\13\data - 找到并打开
postgresql.conf,搜索password_encryption配置项,去掉行首的注释符#,将值改为md5:password_encryption = md5 - 同目录下找到并打开
pg_hba.conf,将所有连接规则末尾的scram-sha-256全部改为md5,注意覆盖本地IPv4、IPv6等所有匹配当前连接场景的规则 - 回到服务管理器,重新启动PostgreSQL 13服务
- 重置项目所用数据库账号的密码:原有密码是SCRAM格式存储的,必须重设才会以MD5格式保存,可通过pgAdmin或psql执行如下SQL:
ALTER USER 你的数据库用户名 WITH PASSWORD '你的数据库密码'; - 配置完成后重新执行迁移命令即可正常运行。
内容的提问来源于stack exchange,提问作者HV Sharma
相关产品推荐
相关产品推荐

