Mycat 分庫教程,常見問題解答

Mycat 使用踩坑教程

一 .安裝

可在官網上下載 Mycat-server-1.6.7.4-release 版本 (http://www.mycat.io/)

解壓文件,我們得到

D:.
├─.idea
├─bin --startup_nowrap.bat 啓動腳本目錄
├─catlet
├─conf  配置文件目錄
│  ├─zkconf
│  └─zkdownload
├─lib
├─logs  日誌文件
│  ├─2020-03
│  └─2020-04
└─tmlogs

二 .配置文件說明

schema.xml

用於配置邏輯庫的配置文件

	<schema name="eval" checkSQLschema="true" sqlMaxLimit="100" >
		<!-- auto sharding by id (long) -->
		<!--splitTableNames 啓用<table name 屬性使用逗號分割配置多個表,即多個表使用這個配置-->
		<table name="rep_detail,eval_exam,eval_exam_subject,rep_question_relationship"  primaryKey="ID" rule="sharding-by-pattern" autoIncrement="true" ruleRequired="true"
			   dataNode="dn$1-5"  splitTableNames ="true" />
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
	</schema>

schema 標籤用於定義 MyCat 實例中的邏輯庫,MyCat 可以有多個邏輯庫,每個邏輯庫都有自己的相關配
置。可以使用 schema 標籤來劃分這些不同的邏輯庫。

上面的配置,採用了邏輯庫 eval,使用了分片規則 ‘sharding-by-pattern’,分別對應了四張表 分別對應的節點(dataNode)爲’dn1’到’dn5’

	<dataNode name="dn1" dataHost="localhost1" database="qd_eval_dev01" />
	<dataNode name="dn2" dataHost="localhost2" database="qd_eval_dev02" />
	<dataNode name="dn3" dataHost="localhost3" database="qd_eval_dev03" />
	<dataNode name="dn4" dataHost="localhost4" database="qd_eval_dev04" />
	<dataNode name="dn5" dataHost="localhost5" database="qd_eval_dev05" />

以下是五個對應節點,需要注意的是’database’是對應的 mysql 物理庫,例如:

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost3" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost4" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost5" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

'dataHost’該標籤在 mycat 邏輯庫中也是作爲最底層的標籤存在,直接定義了具
體的數據庫實例、讀寫分離配置和心跳語句。
完整配置:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="eval" checkSQLschema="true" sqlMaxLimit="100" >
		<!-- auto sharding by id (long) -->
		<!--splitTableNames 啓用<table name 屬性使用逗號分割配置多個表,即多個表使用這個配置-->
		<table name="rep_detail,eval_exam,eval_exam_subject,rep_question_relationship"  primaryKey="ID" rule="sharding-by-pattern" autoIncrement="true" ruleRequired="true"
			   dataNode="dn$1-5"  splitTableNames ="true" />
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
	</schema>

	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> -->
	<dataNode name="dn1" dataHost="localhost1" database="qd_eval_dev01" />
	<dataNode name="dn2" dataHost="localhost2" database="qd_eval_dev02" />
	<dataNode name="dn3" dataHost="localhost3" database="qd_eval_dev03" />
	<dataNode name="dn4" dataHost="localhost4" database="qd_eval_dev04" />
	<dataNode name="dn5" dataHost="localhost5" database="qd_eval_dev05" />
	<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
	 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
	<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" />
	<dataNode name="jdbc_dn3" 	dataHost="jdbchost" database="db3" /> -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost3" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost4" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>

	<dataHost name="localhost5" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="2"  >
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
		<writeHost host="hostM2" url="jdbc:mysql://localhost:3306" user="eval" password="123456"> </writeHost>
	</dataHost>




	<!--
		<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="1" dbType="sequoiadb" dbDriver="jdbc">
		<heartbeat> 		</heartbeat>
		 <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" 	password="jifeng"></writeHost>
		 </dataHost>

	  <dataHost name="oracle1" maxCon="1000" minCon="1" balance="1" writeType="0" 	dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
		<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
		<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" 	password="123456" > </writeHost> </dataHost>

		<dataHost name="jdbchost" maxCon="1000" 	minCon="1" balance="1" writeType="0" dbType="mongodb" dbDriver="jdbc">
		<heartbeat>select 	user()</heartbeat>
		<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

		<dataHost name="sparksql" maxCon="1000" minCon="1" balance="1" dbType="spark" dbDriver="jdbc">
		<heartbeat> </heartbeat>
		 <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" 	password="jifeng"></writeHost> </dataHost> -->

	<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="1" dbType="mysql"
		dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
		url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
		</dataHost> -->
</mycat:schema>

server.xml

server.xml 幾乎保存了所有 mycat 需要的系統配置信息。其在代碼內直接的映射類爲 SystemConfig 類。
此配置文件除了白名單之外,還需要注意 mycat 默認使用的編碼爲 utf8,完整配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
	- you may not use this file except in compliance with the License. - You
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
	- - Unless required by applicable law or agreed to in writing, software -
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
	License for the specific language governing permissions and - limitations
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="nonePasswordLogin">0</property> <!-- 0爲需要密碼登陸、1爲不需要密碼登陸 ,默認爲0,設置爲1則需要指定默認賬戶-->
        <property name="ignoreUnknownCommand">0</property><!-- 0遇上沒有實現的報文(Unknown command:),就會報錯、1爲忽略該報文,返回ok報文。
	在某些mysql客戶端存在客戶端已經登錄的時候還會繼續發送登錄報文,mycat會報錯,該設置可以繞過這個錯誤-->
        <property name="useHandshakeV10">1</property>
        <property name="charset">utf8mb4</property>
        <property name="removeGraveAccent">1</property>
        <property name="useSqlStat">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
        <property name="sqlExecuteTimeout">300</property>  <!-- SQL 執行超時 單位:秒-->
        <property name="sequnceHandlerType">2</property>
        <!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
        INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
        -->
        <!--必須帶有MYCATSEQ_或者 mycatseq_進入序列匹配流程 注意MYCATSEQ_有空格的情況-->
        <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
        <property name="subqueryRelationshipCheck">false</property> <!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 false -->
        <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
        <!--  <property name="useCompression">1</property>--> <!--1爲開啓mysql壓縮協議-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--設置模擬的MySQL版本號-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!--
        <property name="processors">1</property>
        <property name="processorExecutor">32</property>
         -->
        <!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!--默認是65535 64K 用於sql解析時最大文本長度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <property name="serverPort">8066</property>
        <property name="managerPort">9066</property>
        <property name="idleTimeout">300000</property>
        <property name="bindIp">0.0.0.0</property>
        <!-- 5 * 60 * 1000L; //連接空閒檢查-->
        <property name="dataNodeIdleCheckPeriod">300000</property>
        <property name="frontWriteQueueSize">4096</property>
        <property name="processors">32</property>
        <!--分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務(如果分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,但是記錄分佈式事務日誌-->
        <property name="handleDistributedTransactions">0</property>

        <!--
        off heap for merge/order/group/limit      1開啓   0關閉
    -->
        <property name="useOffHeapForMerge">0</property>

        <!--
            單位爲m
        -->
        <property name="memoryPageSize">64k</property>

        <!--
            單位爲k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            單位爲m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否採用zookeeper協調切換  -->
        <property name="useZKSwitch">false</property>

        <!-- XA Recovery Log日誌路徑 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->

        <!-- XA Recovery Log日誌名稱 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
        <!--如果爲 true的話 嚴格遵守隔離級別,不會在僅僅只有select語句的時候在事務中切換連接-->
        <property name="strictTxIsolation">false</property>

        <property name="useZKSwitch">true</property>
        <!--如果爲0的話,涉及多個DataNode的catlet任務不會跨線程執行-->
        <property name="parallExecute">0</property>
    </system>

    <!-- 全局SQL防火牆設置 -->
    <!--白名單可以使用通配符%或着*-->
    <!--例如<host host="127.0.0.*" user="root"/>-->
    <!--例如<host host="127.0.*" user="root"/>-->
    <!--例如<host host="127.*" user="root"/>-->
    <!--例如<host host="1*7.*" user="root"/>-->
    <!--這些配置情況下對於127.0.0.1都能以root賬戶登錄-->
    <firewall>
        <whitehost>
            <host host="192.168.*.*" user="root"/>
            <host host="192.168.*.*" user="eval"/>
            <host host="127.0.0.1" user="root"/>
            <host host="127.0.0.1" user="eval"/>
            <host host="0:0:0:0:0:0:0:1" user="root"/>
            <host host="0:0:0:0:0:0:0:1" user="eval"/>
        </whitehost>
        <blacklist check="false">
        </blacklist>
    </firewall>
    <user name="root" defaultAccount="true">
        <property name="password">li2wg3vA</property>
        <property name="schemas">eval</property>
        <property name="defaultSchema">eval</property>
        <!--No MyCAT Database selected 錯誤前會嘗試使用該schema作爲schema,不設置則爲null,報錯 -->

        <!-- 表級 DML 權限設置 -->
        <!--
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>
         -->
    </user>
    <user name="user">
        <property name="password">123456</property>
        <property name="schemas">eval</property>
        <property name="defaultSchema">eval</property>
    </user>

    <user name="eval">
        <property name="password">123456</property>
        <property name="schemas">eval</property>
        <property name="defaultSchema">eval</property>
    </user>


</mycat:server>

rule.xml

rule.xml 裏面就定義了我們對錶進行拆分所涉及到的規則定義。我們可以靈活的對錶使用不同的分片算法,
或者對錶使用相同的算法但具體的參數不同。這個文件裏面主要有 tableRule 和 function 這兩個標籤。在具體使
用過程中可以按照需求添加 tableRule 和 function
在此次介紹中使用的規則’sharding-by-pattern’是按學校 id%25600 得到的值分庫

	<tableRule name="sharding-by-pattern">
		<rule>
			<columns>school_id</columns>
			<algorithm>sharding-by-pattern</algorithm>
		</rule>
	</tableRule>

	<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPattern">
		<property name="mapFile">sharding-by-pattern.txt</property>
		<property name="defaultNode">0</property>
		<property name="patternValue">25600</property>
	</function>

規則文件’sharding-by-pattern.txt’保存在 conf 目錄下

1-10000=0
10001-15000=1
15001-20000=2
20001-25000=3
25001-30000=4

當取模在這邊區間內,數據就會被路由到上面配置的庫裏

完整的配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
	- you may not use this file except in compliance with the License. - You
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
	- - Unless required by applicable law or agreed to in writing, software -
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
	License for the specific language governing permissions and - limitations
	under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="rule1">
		<rule>
			<columns>id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="sharding-by-date">
		<rule>
			<columns>createTime</columns>
			<algorithm>partbyday</algorithm>
		</rule>
	</tableRule>

	<tableRule name="rule2">
		<rule>
			<columns>user_id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="sharding-by-intfile">
		<rule>
			<columns>sharding_id</columns>
			<algorithm>hash-int</algorithm>
		</rule>
	</tableRule>
	<tableRule name="auto-sharding-long">
		<rule>
			<columns>id</columns>
			<algorithm>rang-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-murmur">
		<rule>
			<columns>id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-exam-code">
		<rule>
			<columns>school_id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<tableRule name="crc32slot">
		<rule>
			<columns>id</columns>
			<algorithm>crc32slot</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-month">
		<rule>
			<columns>create_time</columns>
			<algorithm>partbymonth</algorithm>
		</rule>
	</tableRule>
	<tableRule name="latest-month-calldate">
		<rule>
			<columns>calldate</columns>
			<algorithm>latestMonth</algorithm>
		</rule>
	</tableRule>

	<tableRule name="auto-sharding-rang-mod">
		<rule>
			<columns>id</columns>
			<algorithm>rang-mod</algorithm>
		</rule>
	</tableRule>

	<tableRule name="jch">
		<rule>
			<columns>id</columns>
			<algorithm>jump-consistent-hash</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-pattern">
		<rule>
			<columns>school_id</columns>
			<algorithm>sharding-by-pattern</algorithm>
		</rule>
	</tableRule>

	<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPattern">
		<property name="mapFile">sharding-by-pattern.txt</property>
		<property name="defaultNode">0</property>
		<property name="patternValue">25600</property>
	</function>


	<function name="murmur"
			  class="io.mycat.route.function.PartitionByMurmurHash">
		<property name="seed">0</property><!-- 默認是0 -->
		<property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
		<property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
		<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,以節點權重值爲值。所有權重值必須是正整數,否則以1代替 -->
		<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
			用於測試時觀察各物理節點與虛擬節點的分佈情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 -->
	</function>

	<function name="crc32slot"
			  class="io.mycat.route.function.PartitionByCRC32PreSlot">
		<property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
	</function>
	<function name="hash-int"
			  class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
	</function>
	<function name="rang-long"
			  class="io.mycat.route.function.AutoPartitionByLong">
		<property name="mapFile">autopartition-long.txt</property>
	</function>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">3</property>
	</function>

	<function name="func1" class="io.mycat.route.function.PartitionByLong">
		<property name="partitionCount">8</property>
		<property name="partitionLength">128</property>
	</function>
	<function name="latestMonth"
			  class="io.mycat.route.function.LatestMonthPartion">
		<property name="splitOneDay">24</property>
	</function>
	<function name="partbymonth"
			  class="io.mycat.route.function.PartitionByMonth">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sBeginDate">2015-01-01</property>
	</function>


	<function name="partbyday"
			  class="io.mycat.route.function.PartitionByDate">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sNaturalDay">0</property>
		<property name="sBeginDate">2014-01-01</property>
		<property name="sEndDate">2014-01-31</property>
		<property name="sPartionDay">10</property>
	</function>

	<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
		<property name="mapFile">partition-range-mod.txt</property>
	</function>

	<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
		<property name="totalBuckets">3</property>
	</function>
</mycat:rule>

三 .常見問題

上訴的三個配置文件,已經是一個按學校 id 切分並且用五個庫來不同存儲的配置文件.

Mycat 如何配置字符集?

在配置文件 server.xml 配置,默認配置爲 utf8。

<system>
<property name="charset">utf8</property>
</system>

Mycat 主鍵插入後應用如何獲取?

獲得自增主鍵,插入記錄後執行 select last_insert_id()獲取

Mycat 中,舊系統數據如何遷移到 Mycat 中?

舊數據遷移目前可以手工導入,在 mycat 中提取配置好分配規則及後端分片數據庫,然後通過 dump
或 loaddata 方式導入,後續 Mycat 就做舊數據自動數據遷移工具。

Mycat 支持多表 Join 嗎?

Mycat 目前支持 2 個表 Join

Mycat 連接會報無效數據源(Invalid datasource)

這類錯誤最常見是一些配置問題例如 schema.xml 中的 dataNode 的配置和實際不符合,請先仔細檢查配置
項,確保配置沒有問題。如果不是配置問題,分析具體日誌看出錯原因,常見的有:
如果是應用連:在某些版本的 Mysql 驅動下連接 Mycat 會報錯,可升級最新的驅動包試下。
如果是服務端控制檯連,確認 mysql 是否開啓遠程連接權限,或防火牆是否設置正確,或者數據庫
database 是否配置,或用戶名密碼是否正確。

Mycat 如何建表與創建存儲過程?

注意註解中語句是節點的表請替換成自己表如 select 1 from 表 ,查出來的數據在那個節點往哪個節點

存儲過程

/*!mycat: sql=select 1 from 表 */ CREATE DEFINER=`root`@`%` PROCEDURE `proc_test`() BEGIN
END ;
表:
/*!mycat: sql=select 1 from 表 */create table ttt(id int);

Mycat 支持的或者不支持的語句有哪些?

insert into,複雜子查詢,3 表及其以上跨庫 join 等不支持

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

更多內容請見公衆號
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章