把 Windows 下的應用部署到 Linux 下,使用到了 Quartz 集羣的特性,因此建了 MySql 的中間表,一啓動看到報錯:mysql
Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Couldn't retrieve trigger: Table 'unmijob.QRTZ_TRIGGERS' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'unmijob.QRTZ_TRIGGERS' doesn't exist]linux
用 MySQL 客戶端鏈接到那個數據庫,看到 qrtz_triggers 表確確實實是存在的,MySQL 也是安裝在 Linux 下的。在大小寫敏感的操做系統中,估摸着會不會是表名大小的因素呢? 因而把 qrtz_triggers 改成大寫的 QRTZ_TRIGGERS,再次啓動應用服務器,這時候出現的是:sql
Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Couldn't retrieve trigger: Table 'unmijob.QRTZ_CRON_TRIGGERS' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'unmijob.QRTZ_CRON_TRIGGERS' doesn't exist]數據庫
說明表 QRTZ_TRIGGERS 表是找到了,找不到下面的 QRTZ_CRON_TRIGGERS 表。這樣的現像面前說明在 Linux 下 MySQL 代表是區分大小寫是暴露無疑了,之前可能是在 windows 下寫程序,並且代碼中的 sql 語句代表也都是用小寫,因此未碰到。如今 Quartz 偏喜歡大寫,問題也就這樣來了。windows
知道緣由,找解決辦法就可有的放矢了,google mysql linux 表名不區分大小寫,答案立馬找到:服務器
須要改 MySQL 的配置文件,Linux 下 MySQL 的配置文件多是 /etc/my.cnf,或 /etc/mysql/my.cnf,這依賴於你的安裝方式。假如是 /etc/my.cnf,那麼執行google
sudo vi /etc/my.cnfspa
在 [mysqld] 節中添加:操作系統
lower_case_table_names=1rest
而後保存,用 sudo /etc/init.d/mysql restart 重啓 MySQL 服務便讓 Linux 系統對錶名大小寫不敏感了。
其實準確來講不是說 Linux 對於 MySQL 表名忽略大小寫,而是應用上面的配置後,MySQL 服務程序會來自於應用程序裏的請求的表名轉換爲小寫,如你查詢 select* UNMI_TABLE,MySQL 會認爲是查詢的 select * from unmi_table,因此在加入
lower_case_table_names=1
以前時你必須把表名都改成小寫。也就是在建立表時都用小寫名字,若是建立的表名爲 UNMI_TABLE,那麼程序中不管是執行 select * from UNMI_TABLE 仍是執行 select * from unmi_table 都會碰到相似下面的錯誤:
Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Couldn't retrieve trigger: Table 'unmijob.qrtz_triggers' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'unmijob.qrtz_triggers' doesn't exist]
由於 MySQL 服務程序認爲表名就是小寫的 unmi_table,而在數據庫中的表名不是這樣子的。
並且此時在 MySQL 客戶端都沒法把 QRTZ_TRIGGERS 改爲 qrtz_triggers. 由於表名的大小寫是與文件系統中的數據目錄下的 frm 文件相對應的。