mysql> use hive
mysql> show tables;
+---------------------------+
| Tables_in_hivemeta |
+---------------------------+
| BUCKETING_COLS |
| CDS |
| COLUMNS_V2 |
| COMPACTION_QUEUE |
| COMPLETED_TXN_COMPONENTS |
| DATABASE_PARAMS |
| DBS |
| DB_PRIVS |
| DELEGATION_TOKENS |
9. 问题来了,表不存在。为什么不存在呢?其实我已经知道问题了。Mysql表名大小写敏感问题。
mysql>select count(*) from `DBS`;
ERROR 1146 (42S02): Table 'hivemeta.DBS' doesn't exist
10. 由于很多Oracle数据库的表名是大小写不敏感的。但是Mysql却是表名大小写敏感的。所以,很多开发人员,都喜欢将mysql设置为表名大小写不敏感。
而show tables之后,我就怀疑这个可能了。
11. 经过检查/etc/my.cnf,确实已经设置lower_case_table_names=1
12. Hive库创建的时候,mysql是大小写敏感的。所以,表名都是大写的。而后期,有人修改了mysql参数,取消大小写敏感。这样,问题就来了。Mysql并不是完全不敏感,而是在设置参数lower_case_table_names=1 之后,创建和查询的sql语句中的表名,默认修改为小写的。而已经创建的表名,还是大写的显示。但是你无论用大写表名,还是小写表名,都无法正确查询到了。
13. 这个问题出现的场景:
只有是在hive库创建完成之后,又修改/etc/my.cnf,添加参数lower_case_table_names=1导致的。
14. 问题找到之后,有两个解决方案:
a. 取消参数lower_case_table_names=1
b. 如果mysql的hive库中没有什么数据,删除hive库表,重新创建hive meta表,直接就创建出小写的表名了。
输出就是小写的了:
mysql> show tables;
+---------------------------+
| Tables_in_hive_beta |
+---------------------------+
| bucketing_cols |
| cds |
| columns_v2 |
| compaction_queue |
| completed_txn_components |
| database_params |
| db_privs |
| dbs |
| delegation_tokens |
| func_ru |
15. 我最后选择取消参数lower_case_table_names=1,并重启mysql。查询正常了。
mysql> select count(*) from `DBS`;
+----------+
| count(*) |
+----------+
| 2 |
16. Ambari启动hive metastore也成功了。
问题解决,一切恢复正常
$ beeline -u "jdbc:hive2://hostname.domain.cn:10000/default;principal=hive/_HOST@domain.com;"
Connecting to jdbc:hive2://hostname.domain.cn:10000/default;principal=hive/_HOST@domain.com;
Connected to: Apache Hive (version release-1.2.1-EDH-1.1.2)
Driver: Hive JDBC (version release-1.2.1-EDH-1.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version release-1.2.1-EDH-1.1.2 by Apache Hive
0: jdbc:hive2://hostname.domain.cn:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| default |
| hbjt |
+----------------+--+
2 rows selected (1.206 seconds)
最终的原因,就是有人修改的/etc/my.cnf,导致的本次问题。