Oracle/MySQL中Schame、Database的区别
在关系型数据库中,分三级:database.schema.table。
一个数据库下面可以包含多个schema,可以给不同的用户创建不同的schema,可用于多用户权限管理,且他们都是在同一数据库实例下面。
一个schema下可以包含多个数据库的对象:表、存储过程、触发器等。
不是所有数据库都实现了schema这一层,例如Mysql直接把schema和database等效了
Sqoop连接MySQL遇到的坑
Sqoop连接Oracle数据库时是可以同时指定库名、Schema名和表名的,但是连接Mysql是则不行,报错信息如下:
同事分析后以为是子公司没有把目标表的truncate权限授权给我们,一致觉得是DBA没有操作到位。。。然后确认是已授权后,我们开始怀疑是MySQL JDBC版本问题,并成功的把公司大数据集群的JDBC版本升级了,心里笑嘻嘻,继续报错,然后MMP。
于是我开始单独用Sqoop命令连接进行查询语句测试,显示是可以成功连通Mysql数据库并查到对方数据库目标表数据的,截图如下:
后面通过对Sqoop连接串解密查看后,找到报错的原因是同事把MySQL当成Oracle一样在加密的连接文件里同时指定了库名和schame名,成功解决问题。
代码片段如下:
由于是子公司新增的数据库,同事提单申请给当前集群主节点进行授权后还是报错,忘记截图,大概意思是连接超时,但是偶尔会出现成功的情况。
通过对Sqoop底层原理以及MR执行流程的分析后,发现问题原因是新增下游系统后进行Sqoop导数前,不能仅对当前集群主节点进行授权,要对所有可能执行maptask任务,分配到container的节点进行数据库连接端口(MySQL:3306,Oracle:1521)的授权,(并不是要对所有DataNode节点进行授权,如果是这样的话,不可能出现偶尔Sqoop导出成功的情况,因为HDFS不会将Hive表文件及副本放在同一个节点上),授权后就成功啦,帮同事解决问题开心的一批,啊哈哈。同是搬砖,但是遇到问题的时候,基础理论知识还是很有用滴。