错误信息
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.
Underlying cause: java.sql.SQLException : Access denied for user 'sfpql'@'localhost'
SQL Error code: 1698
Use --verbose for detailed stacktrace.
原因
一般报Failed to get schema version
是连接不上MySQL的原因
排查点:
- 看MySQL的驱动是否添加到hive的lib目录下,并且jar包版本要符合MySQL版本
- 看hive的hive-site.xml文件是否编写正确
-
connect首字母大写
-
用户名密码检查
-
解决
我的错误是报SQL Error code: 1698
原因是因为在最近的Ubuntu安装(当然也可能是其他安装)中,MySQL默认使用了UNIX auth_socket plugin插件。
简单来说这意味着当db_users使用数据库时,将会通过系统用户认证表进行认证。你可以通过下面的命令看看你的root用户是否设置成了这样:
mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | localhost | auth_socket |
| mysql.session | localhost | mysql_native_password |
| mysql.sys | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
就像你在查询语句中看到的那样,root用户在使用auth_socket插件。有两种方法来解决这个问题:
1. 你可以设置你的root用户使用mysql_native_password插件 2. 你可以创建一个与你的系统用户一致的新的数据库用户(推荐)
(笔者注:方法2即满足auth_socket插件的要求)
选择1:
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart
选择2( 用你的操作系统用户名代替YOUR_SYSTEM_USER) :
mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
# 别忘了设置密码
mysql> alter user 'YOUR_SYSTEM_USER'@localhost identified by 'password';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart
记住如果你选择使用方法2,你应该通过使用你的操作系统用户名来连接到MySQL(mysql -u YOUR_SYSTEM_USER)。
注意:在一些操作系统中(例如Debian系)‘auth_socket’插件被叫做’unix_socket’,所以相应的SQL命令语句应该为UPDATE user SET plugin=‘unix_socket’ WHERE User=‘YOUR_SYSTEM_USER’。