天天看點

【ETL】Kettle連接配接MySQL疑難問題及解決技巧

1. 指定驅動

一般來說,為了友善配置,在kettle中建立mysql連接配接時,都選擇Native(JDBC)方法,這種方法雖然快捷,但是不能指定驅動類型,而且kettle預設使用的是

org.gjt.mm.mysql.Driver

,而mysql 8.0以上connector已經不再支援這個包名,是以,會出現明明已經将mysql-connector-java-8.0.xx.jar包拷貝到lib目錄下,但還是報錯說找不到驅動,這時隻能用jndi方法設定kettle使用

com.mysql.cj.jdbc.Driver

作為驅動。

data-integration\simple-jndi

目錄下有檔案

jdbc.properties

在此檔案中建立jndi配置:

mysql_test/type=javax.sql.DataSource
mysql_test/driver=com.mysql.cj.jdbc.Driver
mysql_test/url=jdbc:mysql://your-host:3306/your-db?useUnicode=true&characterEncoding=utf-8&disableMariaDbDriver
mysql_test/user=user-name
mysql_test/password=your-password
           

如上設定後,重新開機kettle,建立資料庫連接配接,選擇mysql資料庫,選擇jndi,在左邊JNDI名稱中填入mysql_test,完成配置,之後kettle就會使用

com.mysql.cj.jdbc.Driver

作為驅動。

【ETL】Kettle連接配接MySQL疑難問題及解決技巧

注意:

(1)在MySQL新版本中,

com.mysql.jdbc.Driver

已經廢棄,應使用新類名

com.mysql.cj.jdbc.Driver

(2)如果同時要連接配接mariadb和mysql資料庫,會出現mariadb和mysql資料庫驅動并存的情況,一般來說jdbc:mysql會優先使用mariadb的驅動,是以這裡如果要使用mysql驅動,必須加上選項

disableMariaDbDriver

,禁止使用mariadb驅動來連接配接mysql資料庫

參考:

Having MariaDB and MySQL Drivers in the Same Classpath

Since MariaDB aims to be a drop-in replacement for MySql, the driver permits connection strings beginning with “jdbc:mariadb” or “jdbc:mysql”. To permit having the MySQL and MariaDB drivers on the same classpath, since version 1.5.9, the MariaDB driver doesn’t accept connection strings beginning with “jdbc:mysql” if the “disableMariaDbDriver” option is set.

jdbc:mysql://localhost:3306/db?user=someUser&disableMariaDbDriver won’t be accepted by the MariaDB driver, permitting having MySQL and MariaDB in the same classpath without interfering.

2. AS關鍵字不起作用或者報錯

SELECT id AS myid FROM test
           

一般來說傳回的結果列名應該是

myid

,但是有時候傳回的卻是

id

這個bug在pentaho的jira上有:

https://jira.pentaho.com/browse/PDI-6745

官方認為是因為驅動版本與資料庫版本不比對導緻的,但是很多人在更改驅動版本後,問題依然存在,這是因為kettle的緩存沒有清除。

關閉kettle,在以下目錄中找到

.kettle

目錄:

Unix: ~/.kettle

Windows: %USERPROFILE%/.kettle

.kettle

目錄下将所有

db.cache-xx-xx

檔案删除

kettle的db.cache的詳細解釋:

http://ramathoughts.blogspot.com/2010/08/dealing-with-kettle-dbcache.html

3. Pentaho Server伺服器上配置JNDI

在伺服器上,目錄

pentaho-server\pentaho-solutions\system\simple-jndi

下也有

jdbc.properties

檔案,這是個誤導,服務端的JNDI并不在這裡設定。

Pentaho Server上的JNDI在tomcat或者jboss中設定,這裡隻介紹tomcat的設定方法:

一般來說配置的JNDI隻提供給pentaho server用,這樣就不用更改tomcat的全局設定,在

pentaho-server/tomcat/webapps/pentaho/WEB-INF/web.xml

中設定資源引用:

<resource-ref>
    <description>your-jndi-name</description>
    <res-ref-name>jdbc/your-jndi-name</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
           

然後在

pentaho-server/tomcat/webapps/pentaho/META-INF/context.xml

中配置資源:

<Resource name="jdbc/your-jndi-name" auth="Container" type="javax.sql.DataSource"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
  maxActive="30" 
  maxIdle="10" 
  minIdle="5" 
  maxWait="100000" 
  initialSize="5" 
  testWhileIdle="true"
  testOnBorrow="true" 
  testOnReturn="false" 
  validationQuery="SELECT 1" 
  validationInterval="30000" 
  timeBetweenEvictionRunsMillis="30000" 
  maxAge="14400000"
  username="your-username" password="your-password" 
  driverClassName="com.mysql.cj.jdbc.Driver" 
  url="jdbc:mysql://host-address:3306/your-db-name?useUnicode=true&amp;characterEncoding=utf-8&amp;disableMariaDbDriver"/>
           

在kettle中使用JNDI時直接填

your-jndi-name

,不用填

jdbc/your-jndi-name

testWhileIdle,testOnBorrow,validationQuery等選項不能忽略,不然長期運作可能報錯,具體解釋請看另一篇博文:https://blog.csdn.net/zougen/article/details/85046958

&

符号必須用

&amp;

轉義不然會報錯

"characterEncoding" 的引用必須以 ';'結束