You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps机器组MySQL部署任务触发ERROR 1045访问被拒问题

Azure DevOps 流水线MySQL部署任务报1045访问拒绝解决方案

问题复现

使用Machine Group环境下的MysqlDeploymentOnMachineGroup@1任务执行MySQL部署,已提前在代理节点安装mysql-client、mysql-server组件,任务配置如下:

steps:
    - task: MysqlDeploymentOnMachineGroup@1
      displayName: 'Deploy Using : InlineSqlTask'
      inputs:
        TaskNameSelector: InlineSqlTask
        SqlInline: |
          CREATE DATABASE IF NOT EXISTS alm;
          use alm;
        ServerName: localhost
        SqlUsername: root
        SqlPassword: P2ssw0rd

任务执行抛出错误:

ERROR 1045 (28000) Access denied for user ‘root’@‘localhost’ (using password: YES)

排查步骤&修复方案

按优先级从高到低逐一验证:

  • 先脱离流水线验证MySQL本地连通性
    登录部署代理所在服务器,直接在终端执行连接命令:mysql -u root -pP2ssw0rd -h localhost,如果本地执行都报同样的1045错误,问题和流水线无关,是MySQL本身的账号配置问题:
    • 很多发行版源里的MySQL安装完默认给root配的是auth_socket鉴权插件,只认Linux系统root用户的本地登录,根本不校验输入的密码,这时候直接用系统root身份登进MySQL,跑下面两句改鉴权方式、重设密码就行:
      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P2ssw0rd';
      FLUSH PRIVILEGES;
      
    • 确认输入的密码确实和MySQL内存储的root账号密码一致,注意全角/半角字符、大小写差异。
  • 修复流水线任务的默认配置坑
    公开的默认示例配置存在几个容易触发鉴权失败的隐式问题,直接照抄很容易踩坑:
    • 将ServerName的取值从localhost改为127.0.0.1:配置为localhost时MySQL默认走Unix Socket连接而非TCP连接,任务传入的密码参数在Socket鉴权场景下不会生效,改为127.0.0.1强制走TCP协议连接。
    • 不要在YAML里明文写SqlPassword,将密码存入Azure DevOps流水线的秘密变量(比如命名为MysqlRootPwd),任务中通过SqlPassword: $(MysqlRootPwd)引用:明文写密码时,部分代理版本会对特殊字符做意外转义,导致实际传给MySQL的密码和配置值不一致,用秘密变量传参可以避免这类转义问题。
    • 如果使用MySQL 8.0及以上版本,在任务输入中新增SqlAdditionalArguments: "--default-auth=mysql_native_password"参数:MySQL 8.0默认使用caching_sha2_password鉴权插件,任务内置的旧版mysql客户端可能不支持该插件,会直接抛出密码错误。
  • 排查代理运行身份的权限问题
    如果部署代理是以系统服务身份运行(比如Windows的Local System、Linux的非root系统账号),不建议直接使用root账号连接数据库,单独创建部署专用账号,给够必要权限即可:
    CREATE USER 'devops_deploy'@'127.0.0.1' IDENTIFIED BY '自定义强密码';
    GRANT ALL PRIVILEGES ON alm.* TO 'devops_deploy'@'127.0.0.1';
    FLUSH PRIVILEGES;
    
    流水线任务中替换为该专用账号的用户名、密码即可,能规避绝大多数跨身份鉴权的问题。
  • 上下文连通性验证
    如果本地连接验证正常、配置也改完还是报错,在MySQL部署任务前加一个命令行任务,直接在流水线执行上下文里跑连接测试:
    mysql -u root -p$(MysqlRootPwd) -h 127.0.0.1 -e "SELECT 1;"
    
    如果这一步依然报错,重点检查秘密变量是否关联到了当前作业、变量作用域是否覆盖到了运行部署任务的阶段,避免变量没加载导致传空密码。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:57:21