1. 程式人生 > >Mycat常見問題與解決方案

Mycat常見問題與解決方案

1 Mycat目前有哪些功能與特性?
答: 
• 支援 SQL 92標準 
• 支援Mysql叢集,可以作為Proxy使用 
• 支援JDBC連線多資料庫 
• 支援NoSQL資料庫 
• 支援galera for mysql叢集,percona-cluster或者mariadb cluster,提供高可用性資料分片叢集 
• 自動故障切換,高可用性 
• 支援讀寫分離,支援Mysql雙主多從,以及一主多從的模式 
• 支援全域性表,資料自動分片到多個節點,用於高效表關聯查詢 
• 支援獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢 
• 支援一致性Hash分片,有效解決分片擴容難題 
• 多平臺支援,部署和實施簡單 
• 支援Catelet開發,類似資料庫儲存過程,用於跨分片複雜SQL的人工智慧編碼實現,143行Demo完成跨分片的兩個表的JION查詢。 
• 支援NIO與AIO兩種網路通訊機制,Windows下建議AIO,Linux下目前建議NIO 
• 支援Mysql儲存過程呼叫 
• 以外掛方式支援SQL攔截和改寫 
• 支援自增長主鍵、支援Oracle的Sequence機制

2 Mycat除了Mysql還支援哪些資料庫?
答:mongodb、oracle、sqlserver 、hive 、db2 、 postgresql。

3 Mycat目前有生產案例了麼?
答:目前Mycat初步統計大概600家公司使用。

4 Mycat穩定性與Cobar如何?
答:目前Mycat穩定性優於Cobar,而且一直在更新,Cobar已經停止維護,可以放心使用。

5 Mycat支援叢集麼?
答:目前Mycat沒有實現對多Mycat叢集的支援,可以暫時使用haproxy來做負載,或者統計硬體負載。

6 Mycat多主切換需要人工處理麼?
答:Mycat通過心跳檢測,自主切換資料庫,保證高可用性,無須手動切換。

7 Mycat目前有多少人開發?
答:Mycat目前開發全部是志願者無償支援,主要有以leaderus 為首的Mycat-Server 開始、以rainbow為首的Mycat-web開發、以海王星為首的產品釋出及程式碼管理,還有以Marshy為首的推廣。

8 Mycat目前有哪些專案?
答:Mycat-Server :Mycat核心服務、 
Mycat-spider : Mycat爬蟲技術、 
Mycat-ConfigCenter :Mycat配置中心 、 
Mycat-BigSQL : Mycat大資料處理(暫未更細)、 
Mycat-Web : Mycat監控及web(新版開發中) 、 
Mycat-Balance :Mycat叢集負載(暫未更細)

9 Mycat最新的穩定版本是哪個到哪裡下載?
答:打包程式碼:Mycat最新穩定版是1.5.1 ,1.6為aphla,下載地址是:https://github.com/MyCATApache/Mycat-download。 
文件:https://github.com/MyCATApache/Mycat-doc 
原始碼:https://github.com/MyCATApache/Mycat-Server

10 Mycat如何配置字符集?
答:在配置檔案server.xml配置,預設配置為utf8。 
utf8

11 Mycat後臺管理監控如何使用?
答:9066埠可以用JDBC方式執行命令,在介面上進行管理維護,也可以通過命令列檢視命令列操作。 
命令列操作是:mysql -h127.0.0.1 -utest -ptest -P9066 登陸,然後執行相應命令。

12 Mycat主鍵插入後應用如何獲取?
答:獲得自增主鍵,插入記錄後執行select last_insert_id()獲取。

13 Mycat如何啟動與加入服務?
答:目前Mycat暫未封裝加入服務,需要自己封裝。 
linux環境為: 
./mycat start 啟動 
./mycat stop 停止 
./mycat console 前臺執行 
./mycat restart 重啟服務 
./mycat pause 暫停 
./mycat status 檢視啟動狀態 
window啟動為: 
直接雙擊執行 startup_nowrap.bat ,如果閃退用cmd模式執行檢視日誌。

14 Mycat執行sql時經常阻塞或卡死是什麼原因?
答: 如果出現執行sql語句長時間未返回,或卡死,請檢查是否是虛機下執行或cpu為單核,具體解決方式請參 考:https://github.com/MyCATApache/Mycat-Server/issues/73,如果仍舊無法解決,可以暫時跳過,目前有些環境阻塞卡死原因未知。

15 Mycat中,舊系統資料如何遷移到Mycat中?
答:舊資料遷移目前可以手工匯入,在mycat中提取配置好分配規則及後端分片資料庫,然後通過dump或loaddata方式匯入,後續Mycat就做舊資料自動資料遷移工具。

16 Mycat如何對舊分片資料遷移或擴容,支援自動擴容麼?
答:目前除了一致性hash規則分片外其他資料遷移比較困難,目前暫時可以手工遷移,未提供自動遷移方案,具體遷移方案情況Mycat權威指南對應章節。

17 Mycat支援批量插入嗎?
答:目前Mycat1.3.0.3以後支援多values的批量插入,如insert into(xxx) values(xxx),(xxx) 。

18 Mycat支援多表Join嗎?
答:Mycat目前支援2個表Join,後續會支援多表Join,具體Join請看Mycat權威指南對應章節。

19 Mycat 啟動報主機不存在的問題?
答:需要新增ip跟主機的對映。

20 Mycat連線會報無效資料來源(Invalid datasource)?
答:例如報錯:mysql> select * from company; 
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0 
這類錯誤最常見是一些配置問題例如schema.xml中的dataNode的配置和實際不符合,請先仔細檢查配置項,確保配置沒有問題。如果不是配置問題,分析具體日誌看出錯原因,常見的有: 
如果是應用連:在某些版本的Mysql驅動下連線Mycat會報錯,可升級最新的驅動包試下。 
如果是服務端控制檯連,確認mysql是否開啟遠端連線許可權,或防火牆是否設定正確,或者資料庫database是否配置,或使用者名稱密碼是否正確。

21 Mycat使用中如何提需求或bug?
答:bug或新需求可以到群裡提問,同時最好到github發起以isuues:https://github.com/MyCATApache/Mycat-Server/issues

22 Mycat如何建表與建立儲存過程?
答:注意註解中語句是節點的表請替換成自己表如select 1 from 表 ,查出來的資料在那個節點往哪個節點建 
儲存過程 
/!mycat: sql=select 1 from 表 / CREATE [email protected]% PROCEDURE proc_test() BEGIN END ; 
表: 
/!mycat: sql=select 1 from 表 /create table ttt(id int);

23 Mycat目前有多少人維護?
答:目前初步統計有10人以上核心人員維護。

24 Mycat支援的或者不支援的語句有哪些?
答:insert into,複雜子查詢,3表及其以上跨庫join等不支援。

25 MycatJDBC連線報 PacketTooBigException異常
答:檢查mysqljdbc驅動的版本,在使用mycat1.3和mycat1.4版本情況下,不要使用jdbc5.1.37和38版本的驅動,會出現如下異常報錯:com.mysql.jdbc.PacketTooBigException: Packet for query is too large (60 > -1). You can change this value on the server by setting the max_allowed_packet’ variable。建議使用jdbc5.1.35或者36的版本。

26 Mycat中文亂碼的問題
答:如果在使用mycat出現中文插入或者查詢出現亂碼,請檢查三個環節的字符集設定:1)客戶端環節(應用程式、mysql命令或圖形終端工具)連線mycat字符集2)mycat連線資料庫的字符集3)資料庫(mysql,oracle)字符集。這三個環節的字符集如果配置一致,則不會出現中文亂碼,其中尤其需要注意的是客戶端連線mycat時使用的連線字符集,通常的中文亂碼問題一般都由此處設定不當引出。其中mycat內部預設使用utf8字符集,在最初啟動連線資料庫時,mycat會預設使用utf8去連線資料庫,當客戶端真正連線mycat訪問資料庫時,mycat會使用客戶端連線使用的字符集修改它連線資料庫的字符集,在mycat環境的管理9066埠,可以通過show @@backend命令檢視後端資料庫的連線字符集,通過show @@connection命令檢視前端客戶端的連線字符集。客戶端的連線可以通過指定字符集編碼或者傳送SET命令指定連線mycat時connection使用的字符集,常見客戶端連線指定字符集寫法如下: 
1) jdbcUrl=jdbc:mysql://localhost:8066/databaseName? characterEncoding=iso_1 
2) SET character_set_client = utf8;用來指定解析客戶端傳遞資料的編碼 
SET character_set_results = utf8;用來指定資料庫內部處理時使用的編碼 
SET character_set_connection = utf8;用來指定資料返回給客戶端的編碼方式 
3) mysql –utest –ptest –P8066 –default-character-set=gbk

27 Mycat無法登陸Access denied
答:Mycat正常安裝配置完成,登陸mycat出現以下錯誤: 
[[email protected] ~]$ mysql -utest -ptest -P8066 
ERROR 1045 (28000): Access denied for user ‘test’@’localhost’ (using password: YES) 
請檢查在schema.xml中的相關dataHost的mysql主機的登陸許可權,一般都是因為配置的mysql的使用者登陸許可權不符合,mysql使用者許可權管理不熟悉的請自己度娘。只有一種情況例外,mycat和mysql主機都部署在同一臺裝置,其中主機localhost的許可權配置正確,使用-hlocalhost能正確登陸mysql但是無法登陸mycat的情況,請使用-h127.0.0.1登陸,或者本地網路實際地址,不要使用-hlocalhost,很多使用者反饋此問題,原因未明。

28 Mycat的分片資料插入報異常IndexOutofBoundException
答:在一些配置了分片策略的表進行資料插入時報錯,常見的報錯資訊如下:java.lang.IndexOutOfBoundsException:Index:4,size:3這類報錯通常由於分片策略配置不對引起,請仔細檢查並理解分片策略的配置,例如:使用固定分片hash演算法,PartitionByLong策略,如果schema.xml裡面設定的分片數量dataNode和rule.xml配置的partitionCount 分片個數不一致,尤其是出現分片數量dataNode小於partitionCount數量的情況,插入資料就可能會報錯。很多使用者都沒有仔細理解文件中對分片策略的說明,用預設rule.xml配置的值,沒有和自己實際使用環境進行引數核實就進行分片策略使用造成這類問題居多。

29 Mycat ER分片子表資料插入報錯
答:一般都是插入子表時出現不能找到父節點的報錯。報錯資訊如: [Err] 1064 - can’t find (root) parent sharding node for sql:。此類ER表的插入操作不能做為一個事務進行資料提交,如果父子表在一個事務中進行提交,顯然在事務沒有提交前子表是無法查到父表的資料的,因此就無法確定sharding node。如果是ER關係的表在插入資料時不能在同一個事務中提交資料,只能分開提交。

30 Mycat最大記憶體無法調整至4G以上
答:mycat1.4的JVM使用最大記憶體調整如果超過4G大小,不能使用wrapper.java.maxmemory引數,需要使用wrapper.java.additional的寫法,注意將wrapper.java.maxmemory引數註釋,例如增加最大記憶體至8G:wrapper.java.additional.10=-Xmx8G。

31 Mycat使用過程中報錯怎麼辦
答:記住無論什麼時候遇到報錯,如果不能第一時間理解報錯的原因,首先就去看日誌,無論是啟動(wrapper.log)還是執行過程中(mycat.log),請相信良好的日誌是程式設計查錯的終極必殺技。日誌如果記錄資訊不夠,可以調整conf/log4j.xml中的level級別至debug,所有的詳細資訊均會記錄。另外如果在群裡面提問,儘量將環境配置資訊和報錯日誌提供清楚,這樣別人才能快速幫你定位問題。