1 環境說明
VM 模擬3台MYSQL 5.6 服務器
VM1 192.168.31.187:3307
VM2 192.168.31.212:3307
VM3 192.168.31.150: 3307
MYCAT 1.5 服務部署在宿主機上
MYCAT 192.168.31.207 :8806【SQL執行端口】 / 9066【管理端口】
2 應用場景
2.0 MYCAT配置
schema.xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_demo_travel_record" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="t_demo_travel_record_child" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="vm1" database="test" />
<dataNode name="dn2" dataHost="vm2" database="test" />
<dataNode name="dn3" dataHost="vm3" database="test" />
<dataHost name="vm1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="vm1M1" url="192.168.31.187:3307" user="root" password="root123"></writeHost>
</dataHost>
<dataHost name="vm2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="vm2M1" url="192.168.31.212:3307" user="root" password="root123"></writeHost>
</dataHost>
<dataHost name="vm3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="vm3M1" url="192.168.31.150:3307" user="root" password="root123"></writeHost>
</dataHost>
rule.xml
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long"
class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">0</property>
</function>
autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
2.1 hint
第一次知道並使用 hint 是在用oracle數據庫調優的時候。
08年的時候,看到生產環境程序的SQL語句有 /* xxxx */ select xxx from table ,當初不知道何為hint,就一把刪了。結果被 TPM 批了一頓~~~
MYCAT 中也可以hint ,這里主要講一下如何通過 hint 指定物理數據庫執行存儲過程。
2.2 Mysql 存儲過程 ,傳參形式沒有驗證成功,不知道是否是mycat這個版本目前還不支持
DELIMITER ;
DROP PROCEDURE `test`.`p_travel_recrod_sum`;
DELIMITER //
CREATE PROCEDURE `p_travel_recrod_sum` ()
BEGIN
declare m_id_sum varchar(45);
select sum(id) into m_id_sum from t_demo_travel_record ;
update t_demo_travel_record t set t.context = t.context + m_id_sum ;
END //
DELIMITER ;
grant execute on procedure p_travel_recrod_sum to 'root'@'%';
flush privileges;
2.3 MYCAT 通過 hint 執行存儲過程,根據分片規則ID=1的數據應該是在DN1結點上執行 p_travel_record_sum()
mysql> DELIMITER //
mysql> /*!mycat:sql=select * from t_demo_travel_record where id = 1;*/ call p_travel_recrod_sum() //
Query OK, 748003 rows affected, 64 warnings (9.57 sec)
查看下物理庫的情況 DN1結點
mysql> select * from t_demo_travel_record limit 100,10;
+-------+---------------+
| id | context |
+-------+---------------+
| 10099 | 1870567757749 |
| 10100 | 1870567757749 |
| 10101 | 1870567757749 |
| 10102 | 1870567757749 |
| 10103 | 1870567757749 |
| 10104 | 1870567757749 |
| 10105 | 1870567757749 |
| 10106 | 1870567757749 |
| 10107 | 1870567757749 |
| 10108 | 1870567757749 |
+-------+---------------+
10 rows in set (0.00 sec)
DN2結點
mysql> select * from t_demo_travel_record limit 100,10;
+---------+-----------------+
| id | context |
+---------+-----------------+
| 5000101 | context_5000101 |
| 5000102 | context_5000102 |
| 5000103 | context_5000103 |
| 5000104 | context_5000104 |
| 5000105 | context_5000105 |
| 5000106 | context_5000106 |
| 5000107 | context_5000107 |
| 5000108 | context_5000108 |
| 5000109 | context_5000109 |
| 5000110 | context_5000110 |
+---------+-----------------+
10 rows in set (0.00 sec)
到此為止,通過 hint 執行 指定數據庫 procedure 驗證完成。