这里的分片指的就是分库分表
1.垂直拆分
1.1场景介绍
1.2 数据库准备
1.3MyCat配置
schema.xml:
<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_id" />
<table name="tb_user" dataNode="dn3" primaryKey="id" />
<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
<table name="tb_user_provinces" dataNode="dn3" primaryKey="id" />
<table name="tb_user_city" dataNode="dn3" primaryKey="id" />
<table name="tb_user_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.200.210:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" />
</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.200.213:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" />
</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.200.214:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" />
</dataHost>
table标签只有涉及到分表的时候才涉及到rule,我们现在是垂直分库,所以不需要指定rule.
server.xml:
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schema">SHOPPING</property>
<!--表级权限设置 -->
<!--
<privileges check="true">
<schema name="DB01" dm1="0110" >
<table name="TB_ORDER" dm1="1110"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">123456</property>
<property name="schema">SHOPPING</property>
<property name="readOnly">true</property>
</user>
1.4MyCat分片测试
重新启动mycat
show tables就可以查看在schema中定义的所有逻辑表,这些表只是在schema.xml中定义出来了,逻辑上是有这些表的,但是这些表在实际的物理节点中是不存在的。这些表结构实际上并不存在,所以接下来需要先把表结构创建出来,然后再往表结构中插入数据。
下面需要创建表结构,然后往表结构里面插入数据:
现在我们把表结构和数据都存放到了sql文件中,下面只需要执行这两个sql文件就可以了。
首先上传到服务器上:
执行完以后,表里面就有数据了。
分库分表以后,多表联查可能会出现的问题有:
这条sql在mycat当中也不能执行成功,这会涉及到mycat底层的一个东西叫路由,在路由中可以发现,当下这条sql语句关联的表tb_order_master是在第二个分片节点上 省市区是在第三个节点上的。这个时候mycat就不能决定mycat到底要把这条sql路由到哪一个节点,所以就报错了。
多表联查的sql会报错,原因是因为路由的时候,第二个分片节点是不存在省市区数据的,那如何解决呢???
对于省、市、区/县表,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。
如何设置全局表?只需要在配置逻辑表的时候加一个参数type即可,type=“global”,就代表当前表是一个全局表。
在mycat中更新全局表,所有关联全局表的节点,都会更新数据!!!