【Druid】access denied for user ''@'ip'

本文记录了在单元测试过程中遇到的Druid数据库连接问题,详细解析了由于配置错误导致的“Access denied for user”异常,并给出了正确的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写单元测试时,遇到一个很奇葩的问题,一直在报这样的错误:

Caused by: java.sql.SQLException: Access denied for user ''@'183.134.103.169' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1665)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1207)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:148)
    at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:785)
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:142)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1423)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1477)
    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:677)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1640)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1581)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)
    ... 62 more

分析来分析去,总是找不到错误的原因。于是想到,难道是Druid的配置问题?

于是重新看了下spring的数据库配置,

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${db.url}"/>
        <property name="name" value="${db.user}"/>
        <property name="password" value="${db.password}"/>
        <property name="initialSize" value="${db.initialSize}"/>
        <property name="minIdle" value="${db.maxIdle}"/>
        <property name="maxActive" value="${db.maxActive}"/>
        <property name="maxWait" value="${db.maxWait}"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="60000"/>
        <property name="validationQuery" value="SELECT 'x'"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>
        <property name="filters" value="config"/>
        <property name="connectionProperties" value="config.decrypt=true"/>
        <!-- 每隔5分钟将监控日志输出到日志文件中,单位是毫秒。 -->
        <property name="timeBetweenLogStatsMillis" value="300000"/>
    </bean>

发现name这个属性感觉不太对劲,于是查阅文档。

原来这边配置的链接用户名应该是userName,而不是name。改为userName立刻解决问题,于是mark一下。

转载于:https://www.cnblogs.com/f-zhao/p/7299103.html

<think>首先,用户的问题是:"我想解决数据库访问被拒绝的错误 请问[MySQL] Access denied for user 'Administrator'@'localhost' error 1045 using password NO"。用户遇到了MySQL错误1045,具体是"Access denied for user 'Administrator'@'localhost' (using password: NO)"。错误信息表明用户尝试使用用户名'Administrator'连接到本地MySQL服务器时没有提供密码,但访问被拒绝了。 从系统级指令中,我有几个关键点: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的引用,但用户真正的需求是解决这个错误。 提供的引用: - [^1]:提到用户在使用MySQL Administrator时遇到错误1045,用户名错误(应该是root)。 - [^2]:显示用户尝试使用mysqladmin更改密码后,登录时出现错误1045。 - [^3]:关于如何创建用户和赋予权限的MySQL文档。 - [^4]:在连接数据库时报错,使用durid(可能是Druid),错误是Access denied for user 'Administrator'@'localhost'。 用户错误的具体信息是:using password NO,这意味着用户没有提供密码。错误1045通常表示认证失败,可能是用户名或密码错误,或者用户没有权限。 在MySQL中,默认用户是'root'@'localhost',而不是'Administrator'@'localhost'。所以用户可能在使用错误的用户名。 步骤来解决这个问题: 1. **确认用户名和密码**:MySQL默认用户是root。用户应该使用root用户登录。如果用户设置了密码,需要提供密码。 2. **检查连接命令**:用户可能在命令行中使用`mysql -uAdministrator`而没有提供密码,或者密码错误。 3. **重置密码**:如果忘记了密码,可能需要重置root密码。 4. **创建新用户**:如果需要,可以创建一个新用户并赋予权限,如引用[^3]所示。 5. **检查权限**:确保用户有权限访问数据库。 从用户错误"using password NO",表明用户没有输入密码。所以第一步是建议用户提供密码。 引用[^2]中显示用户尝试更改密码后登录失败,但错误是using password: O(可能是打字错误,应该是NO或YES)。在引用[^2]中,命令是`mysql -uroot -p`,然后输入密码,但错误是Access denied。这表示密码可能错误。 在用户的问题中,错误是for user 'Administrator'@'localhost',所以用户名是Administrator,而不是root。 常见原因: - MySQL中没有名为'Administrator'的用户。 - 用户可能混淆了操作系统用户名和MySQL用户名。MySQL有自己的用户系统。 解决方案: 1. **使用root用户登录**:尝试使用默认root用户登录。如果密码未知,需要重置。 2. **如果必须使用'Administrator'用户**,需要先在MySQL中创建这个用户并设置密码,然后赋予权限。 从引用[^3],可以创建用户:`CREATE USER 'oldboy'@'localhost' IDENTIFIED BY 'password';` 然后赋予权限。 在引用[^4],错误是Access denied for user 'Administrator'@'localhost',类似用户的问题。 所以,回答应该: - 解释错误原因。 - 提供逐步解决方案。 - 使用中文。 - 在适当的地方添加引用。 - 生成相关问题。 结构回答: 1. **解释错误**:简要说明错误1045的含义。 2. **可能原因**:列出常见原因。 3. **解决方案**:逐步指导如何解决。 a. 尝试使用root用户登录。 b. 如果使用'Administrator',创建用户。 c. 重置密码如果必要。 4. **示例命令**:提供SQL或命令行示例。 5. **生成相关问题**:在最后添加相关问题。 确保使用正确的LaTeX格式:由于问题涉及数据库错误,可能没有数学表达式,但如果有变量,如用户名,使用$...$。例如,用户$'Administrator'@'localhost'$。 生成相关问题: - 如何创建MySQL用户? - 如何重置MySQL root密码? - 如何授予用户权限? - 常见MySQL连接错误有哪些? 添加引用:在解释时,如果基于引用,添加[^n]。例如,引用[^3]提到创建用户,所以当我说创建用户时,可以添加引用。 用户的上一次问题:在引用中,用户似乎尝试过更改密码和登录,但失败了。用户当前问题是针对'Administrator'用户。 最终回答: - 开头:直接回应用户问题。 - 主体:逐步指导。 - 结尾:相关问题。</think>### 解决MySQL错误1045: Access denied for user 'Administrator'@'localhost' (using password: NO) 您的错误表明:MySQL服务器拒绝了用户 `'Administrator'@'localhost'` 的访问请求,因为**未提供密码**(`using password: NO`)。错误代码1045通常表示认证失败,可能原因包括用户名错误、密码缺失或用户权限未配置。MySQL默认使用 `'root'@'localhost'` 作为管理员账户,而非操作系统用户名(如Administrator)。下面我将一步步指导您解决此问题,确保操作安全可靠。 --- ### 步骤1: 确认并尝试使用默认root用户登录 MySQL默认管理员用户是 `root`,而不是 `Administrator`。请先尝试以 `root` 用户登录: - **命令行操作**: 1. 打开终端(Windows:CMD或PowerShell;Linux/macOS:Terminal)。 2. 输入以下命令(`-p` 表示提示输入密码): ```bash mysql -u root -p ``` 3. 输入密码时,如果从未设置过密码,直接按回车(密码为空)。如果设置了密码但忘记,进入步骤3。 - **预期结果**: - 成功登录:显示 `mysql>` 提示符。 - 失败(如错误1045):表明密码错误或root权限问题,需重置密码(见步骤3)。 > **注意**:如果登录成功,说明问题出在 `Administrator` 用户不存在或未配置。此时,您可以创建新用户或修改连接设置使用 `root`。 --- ### 步骤2: 创建或修复 'Administrator' 用户(如果必须使用该用户) 如果您的应用必须使用 `'Administrator'@'localhost'` 用户,需先在MySQL中创建该用户并授权。**以root用户登录后执行以下SQL命令**: 1. **创建用户并设置密码**: ```sql CREATE USER 'Administrator'@'localhost' IDENTIFIED BY 'your_password'; -- 替换 your_password 为安全密码 ``` 2. **授予权限**(例如,授予所有数据库权限): ```sql GRANT ALL PRIVILEGES ON *.* TO 'Administrator'@'localhost' WITH GRANT OPTION; ``` 3. **刷新权限**: ```sql FLUSH PRIVILEGES; ``` 4. **退出并重新登录测试**: ```bash mysql -u Administrator -p ``` 输入密码后,应能成功连接。 > **引用说明**:创建用户和授权的方法基于MySQL官方文档,确保权限正确分配[^3]。 --- ### 步骤3: 重置root密码(如果步骤1失败) 如果无法以root登录(密码错误或未知),需重置密码: 1. **停止MySQL服务**: - Windows:在服务管理器中停止 "MySQL" 服务,或以管理员身份运行: ```bash net stop mysql ``` - Linux/macOS: ```bash sudo systemctl stop mysql ``` 2. **启动MySQL跳过权限验证**: ```bash mysqld --skip-grant-tables --shared-memory ``` 保持此窗口运行,新开一个终端。 3. **以无密码登录并更新密码**: ```bash mysql -u root ``` 在 `mysql>` 提示符下: ```sql UPDATE mysql.user SET authentication_string=password('new_password') WHERE user='root'; -- 替换 new_password FLUSH PRIVILEGES; EXIT; ``` 4. **重启MySQL服务**: - Windows:`net start mysql` - Linux/macOS:`sudo systemctl start mysql` 5. **测试登录**: ```bash mysql -u root -p ``` 输入新密码,应能成功。 > **安全提示**:命令行中使用密码可能不安全(如引用[^2]警告),建议在交互式提示下输入密码。 --- ### 步骤4: 检查应用连接配置 如果错误发生在应用程序中(如Java应用使用Druid连接池): - **修改连接字符串**:确保用户名是 `root` 或已创建的 `Administrator`,并正确提供密码。 - 示例JDBC URL: ```java jdbc:mysql://localhost:3306/db_name?user=root&password=your_password ``` - **验证权限**:确保用户对目标数据库(如 `test`)有访问权限(使用 `SHOW GRANTS FOR 'user'@'localhost';` 检查)。 - **常见陷阱**:操作系统用户名(如Windows的Administrator)与MySQL用户无关,需单独创建[^4]。 --- ### 问题总结 - **根本原因**:您尝试使用不存在的用户 `'Administrator'@'localhost'` 且未提供密码。MySQL默认用户体系独立于操作系统。 - **解决关键**:优先使用 `root` 用户,或创建正确用户并授权。操作后,错误1045应消失。 - **预防建议**:定期备份用户权限表(`mysql.user`),避免手动修改导致错误[^3]。 如果以上步骤无效,请提供更多上下文(如MySQL版本或错误日志),我会进一步协助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值