sqoop导入数据出错ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: Access denied

本文介绍了解决SQOOP连接MySQL时遇到的权限错误问题,并提供了详细的排查步骤及解决方案,包括调整用户权限和更新MySQL驱动。

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

错误信息如下:

17/07/22 15:36:35 ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: Access denied for user 'root'@'mini1' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'mini1' (using password: YES)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4208)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4140)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
        at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1747)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1287)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2494)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2527)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2309)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:419)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:344)
        at java.sql.DriverManager.getConnection(DriverManager.java:571)
        at java.sql.DriverManager.getConnection(DriverManager.java:215)
        at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:885)
        at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)
        at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:744)
        at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:767)
        at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:270)
        at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:241)
        at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:227)
        at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:295)
        at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1833)
        at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1645)
        at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:107)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:478)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:236)

看错误信息应该是数据库权限错误,于是查看root用户权限:

show grants for root;

+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@%                                                                                                              |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+
这样看起来好像是没有问题,但是如果使用

show grants for root@localhost;

查看用户权限会发现没有授权,于是给主机授权:

grant all privileges on *.* to testuser@localhost identified by “123456” ; //给本地的testuser用户授权(localhost可以改成相应ip或主机名)
这样就可以了。

但是这里任然有个疑惑,使用show grants for root;查看权限时,主机一栏显示的是%,%是匹配所有主机,不明白为什么本地还是没有授权?坐等大神来解答。

=======================================================================================================================

造成这个错误还有一个可能的原因是sqoop的lib中的mysql的驱动包太旧了,换一个比较新的就好了。我之前的是5.1.7的版本,换成5.1.32的就好了。

mysql-connector-java-5.1.31-bin下载地址:mysql-connector-java-5.1.31-bin

当您使用Sqoop连接MySQL时遇到错误“ERROR manager.SqlManager: Error executing statement: java.sql.SQLSyntaxErrorException: Unknown database 'top_db'”,这通常意味着Sqoop尝试连接的数据库名称不存在或拼写错误。以下是解决此问题的一些步骤和建议: ### 1. 检查数据库名称 首先,确认您提供的数据库名称是否正确。确保它与目标MySQL服务器上的实际数据库名称一致,注意大小写的敏感性和特殊字符。 #### 示例命令: ```bash mysql -u username -p -h hostname -e "SHOW DATABASES;" ``` 运行上述命令以列出所有现有的数据库,并核对您想要连接的那个名字是否存在于列表中。 ### 2. 确认数据库存在 如果您确信所给定的名字是正确的但仍然找不到对应的数据库,那么很可能是因为该数据库尚未创建。您可以手动登录到MySQL并创建所需的数据库。 #### 创建数据库示例: ```sql CREATE DATABASE top_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ### 3. 核实SQOOP命令中的URL语法 确保您的Sqoop命令中的JDBC URL格式正确无误。特别是对于MySQL而言,完整的URL应当包含协议部分(`jdbc:mysql://`)、主机名/IP地址及端口(默认为3306),以及确切的目标数据库名称。 #### 正确的JDBC URL格式: ```plaintext jdbc:mysql://<hostname>:<port>/<database_name>?useSSL=false&serverTimezone=UTC ``` ### 4. 排除其他可能性 有时这个问题也可能由网络连接失败或其他配置不当引起。因此还需要考虑以下几个方面: - 防火墙规则阻止了外部访问MySQL服务。 - MySQL用户的权限不足以查看特定的数据库。 ### 解决方案总结 根据以上分析,请按照以下顺序进行操作: - 再次检查并修正数据库名称; - 使用管理员账户登陆MySQL,确认`top_db`确实存在; - 调整Sqoop命令里的JDBC URL使之完全匹配实际情况; - 若有必要的话,调整防火墙策略开放必要的端口和服务; - 最后还要检查用户授权情况以确保有足够的读取权限。 希望这些指导可以帮助您找到根本原因并顺利解决问题! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值