參考資料:
參考視頻
參考博客
Mycat基本部署
視頻參考資料:鏈接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取碼: aag3?
概要:
? ? ? ? 本文的垂直分庫,全部是基于前文部署的基本架構進行的
垂直分庫:
? ? ? ? 垂直分庫相對來說比較簡單
- 只需要指定指定表去到哪臺服務器即可
- 不需要分片規則
? ? ? ? 我們將進行如下分庫
1. 修改schema.xml
? ? ? ? 利用Notepad++,將schema.xml的內容替換為如下內容,根據個人進行修改
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100"><table name="tb_goods_base" dataNode="dn1" primaryKey="id" /><table name="tb_goods_brand" dataNode="dn1" primaryKey="id" /><table name="tb_goods_cat" dataNode="dn1" primaryKey="id" /><table name="tb_goods_desc" dataNode="dn1" primaryKey="goods_id" /><table name="tb_goods_item" dataNode="dn1" primaryKey="id" /><table name="tb_order_item" dataNode="dn2" primaryKey="id" /><table name="tb_order_master" dataNode="dn2" primaryKey="order_id" /><table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" /><table name="tb_user" dataNode="dn3" primaryKey="id" /><table name="tb_user_address" dataNode="dn3" primaryKey="id" /><table name="tb_areas_provinces" dataNode="dn3" primaryKey="id"/><table name="tb_areas_city" dataNode="dn3" primaryKey="id"/><table name="tb_areas_region" dataNode="dn3" primaryKey="id"/></schema><dataNode name="dn1" dataHost="dhost1" database="shopping" /><dataNode name="dn2" dataHost="dhost2" database="shopping" /><dataNode name="dn3" dataHost="dhost3" database="shopping" /><dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.154.142:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123888" /></dataHost><dataHost name="dhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.154.143:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123888" /></dataHost><dataHost name="dhost3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.154.144:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123888" /></dataHost>
</mycat:schema>
2. 創建目標數據庫
? ? ? ? 根據schema.xml中的規定,在每臺服務器上創建目標數據庫
3. 修改server.xml
? ? ? ? 修改原先的server.xml的目標數據庫
<user name="root" defaultAccount="true"><property name="password">123888</property><property name="schemas">SHOPPING</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">user</property><property name="schemas">SHOPPING</property><property name="readOnly">true</property></user>
4. 重啟Mycat
? ? ? ? 切換到mycat的安裝目錄
cd /usr/local/mycat/
? ? ? ? 先停止 ,然后啟動
#停止
bin/mycat stop#開始
bin/mycat statr
5. 查看啟動日志
tail -100f logs/wrapper.log
?
6. 上傳sql腳本
? ? ? ? 可以根據上述網盤地址找到數據庫腳本
- shopping-table.sql
- shopping-insert.sql
上傳至一個目錄下
7.登錄MyCat
mysql -h 192.168.154.135 -P 8066 -uroot -p123888
查看邏輯數據庫,邏輯表(注意是邏輯上存在的,并不是實際存在的)
show databases;
use SHOPPING;
show tables;
8. 執行上傳的腳本
source /usr/local/mydir/shopping-table.sqlsource /usr/local/mydir/shopping-insert.sql
9. 檢驗結果
? ? ? ? 可以看到,數據已經分流到了各個數據庫
全局表:
? ? ? ? 上述已經完成了數據庫的垂直分庫,但是面臨一個問題,跨服務器進行聯表查詢的時候會報錯,如下SQL
SELECT order_id, payment, receiver, province, city, area FROM tb_order_master o, tb_areas_provinces p, tb_areas_city c, tb_areas_region r WHERE
o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND
o.receiver_region = r.areaid;
?
?
1. 概述?
- ?首先,在Mycat進行跨服務器進行聯表查詢是不可能的
- 唯一的辦法就是將該服務器用到的數據表,放到該服務器上,或者將每一個服務器都會用到的數據表做成全局表
2. 全局表步驟
????????假如數據表tb_areas_provinces,tb_areas_city,tb_areas_region每個服務器的數據庫都會用到,那么我們就需要把他們做成全局表
(1) 停止Mycat
bin/mycat stop
(2) 清除各個服務器上shopping數據庫中的表
?
(3)修改schema.xml
<table name="tb_areas_provinces" dataNode="dn1,dn2,dn3" primaryKey="id" type="global"/>
<table name="tb_areas_city" dataNode="dn1,dn2,dn3" primaryKey="id" type="global"/>
<table name="tb_areas_region" dataNode="dn1,dn2,dn3" primaryKey="id" type="global"/>
(4) 啟動mycat
bin/mycat start
查看啟動日志
tail -100f logs/wrapper.log
(5)登錄Mycat,運行腳本
mysql -h 192.168.154.135 -P 8066 -uroot -p123888
選擇數據庫
?
use SHOPPING;
?
運行腳本?
source /usr/local/mydir/shopping-table.sqlsource /usr/local/mydir/shopping-insert.sql
可以看到,每一個服務器都有了這三張表
(6)執行聯表查詢
? ? ? ? 然后再執行聯表查詢
SELECT order_id, payment, receiver, province, city, area FROM tb_order_master o, tb_areas_provinces p, tb_areas_city c, tb_areas_region r WHERE
o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND
o.receiver_region = r.areaid;
(7) 全局表的修改
? ? ? ? 對于全局表的增刪改,同樣也會同步到每一個數據庫上