微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
 一、mycat的安装环境准备:准备一台虚拟机192.168.152.1281. 下载mycatcd /softwarewget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz2. 解压mycattar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 3. 剪切mycat到/usr/local目录下mv /software/mycat /usr/local 4. 启动mycat/usr/local/mycat/bin/mycat start 启动/usr/local/mycat/bin/mycat status 查看启动状态说明:这里有个小插曲,启动一会mycat又会自己停止通过查看日志vim /usr/local/mycat/logs/wrapper.log报:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0这是因为使用的是jdk8的版本,jdk8以后就没有永久代了,而mycat的wrapper.conf里面配置了jdk8以前的永久代的内存大小,我们只需要注释这个配置就可以了重新启动mycat:/usr/local/mycat/bin/mycat start就不会出现启动一会又自己停止的问题了连接mycat:mysql -uroot -p123456 -h192.168.152.128 -P8066可以看到mycat连接成功5. linux下mycat常用命令/usr/local/mycat/bin/mycat start 启动/usr/local/mycat/bin/mycat stop 停止/usr/local/mycat/bin/mycat console 前台运行/usr/local/mycat/bin/mycat restart 重启服务/usr/local/mycat/bin/mycat pause 暂停/usr/local/mycat/bin/mycat status 查看启动状态二、mycat配置详解1. 首先查看mycat的文件目录mycat的主要配置文件都在conf目录下,核心的配置文件是schema.xml、server.xml、rule.xml这3个配置文件,下面我们来对这3个配置文件进行详细介绍2. schema.xml是Mycat最重要的配置文件之一。主要管理Mycat逻辑库、逻辑表、表、分片规则、DataSource。<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><!--schema标签:指定Mycat的逻辑库(mycat的Schema,可以指定多个schema标签)checkSQLschema属性:False 过滤schema定义。select * from testdb.company;=> select * from company;True 不过滤schema定义,当我们把testdb输错了或者没有设置大小写敏感就会报错sqlMaxLimit属性:Limit 自动加入limit,查询语句如果没有加入分页参数,当数据量很大的时候,mycat认为会有问题时就启用这个参数只返回100条。例如:select * from company。--><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"><!--table标签:指定Mycat中的逻辑表。最后要做数据分片的表。mycat中的表,可以和实体有具体映射关系,也可以没有具体映射关系(如果没有映射关系会报错)。dataNode属性:数据节点,把相应的表存到对应的DB中。rule属性:分片规则。对应rule.xml中的规则。ruleRequired属性:指定该属性的表是否需要分片规则。True 必须制定,如果没有制定,就会报错。primaryKey属性:值为具体的物理表的主键id,如果使用非主键进行分片,那么Mycat会缓存主键和具体dataNode的信息,如果下次再使用非主键进行查询的时候,就不用广播所有dn。type属性:逻辑表的类型。普通表和全局表,全局表不需要分片,是为了解决跨库join的,全局表一般是数据量比较小、基本不会增长的表autoIncrement属性:Mycat根据last_insert_id()返回结果。这个需要和mysql自增长主键配合。needAddLimit属性:是否自动在每一条SQL语句后面加上limit限制。--><table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /><!-- global table is auto cloned to all defined data nodes ,so can joinwith any table whose sharding node is in the same data node --><table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /><table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /><!-- random sharding using mod sharind rule --><table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"rule="mod-long" /><!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"rule="mod-long" /> --><table name="employee" primaryKey="ID" dataNode="dn1,dn2"rule="sharding-by-intfile" /><table name="customer" primaryKey="ID" dataNode="dn1,dn2"rule="sharding-by-intfile"><childTable name="orders" primaryKey="ID" joinKey="customer_id"parentKey="id"><childTable name="order_items" joinKey="order_id"parentKey="id" /></childTable><childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"parentKey="id" /></table><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> --></schema><!--dataNode标签:定义数据节点dataHost属性: 主机的名称database属性: 数据库--><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" /><!--<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标签:主要定义和Mysql集群有关的信息,数据实例、读写分离配置和心跳检测语句。balance属性:读操作负载均衡配置0 代表不开启读写分离,所有的读操作都发送到writeHost上。1 writeHost和readHost都要参与select语句的负载均衡。例如:双主双从模式 M1->S1, M2->S2, M1和M2互为主备。M2/S1/S2都要参与select语句的负载均衡。2 所有读操作都随机分配给writeHost/readHost3 所有的读操作随机分发到writeHost下面的readHost上执行。writeType属性:写操作负载均衡配置0 所有的写操作都分发到第一个writeHost。如果第一个挂了,分发到第二个。1 所有的写操作都要随机分发到所有配置的writeH
Mysql系列六:Mycat分片路由原理、Mycat常用分片规则及对应源码介绍
 一、Mycat分片路由原理我们先来看下面的一个SQL在Mycat里面是如何执行的:select * from travelrecord where id in(5000001, 10000001);有3个分片dn1,dn2,dn3, id=5000001这条数据在dn2上,id=10000001这条数据在dn3上。查询时可能有出现的问题:1)全部扫描一遍dn1  dn2  dn3,结果导致性能浪费。2)只扫描某个片。漏掉数据的情况。总结:不能多扫——>性能不足也不能少——>漏掉数据那么Mycat是如何解决上面的问题的呢?Mycat使用Druid的DruidParser作为分析器/解析器,解析的过程主要有Visitor和Statement两个阶段说明:1)Visitor过程,解析出如下属性:哪一张表字段列表条件信息什么样的SQL解析出以上信息以后就可以根据schema.xml和rule.xml文件确认要去哪个分片上进行DML操作了2)Statement过程转化:转化后知道执行的是什么样的SQL(增删改查)3)改写SQL通过查询条件可以知道要查询的数据都在哪些分片上Dn2, id= 5000001Dn3, id= 100000001所以SQL被改写成以下的形式:select * from travelrecord where id = 5000001;(dn2执行)select * from travelrecord where id = 10000001;(dn3执行)4)分别在分片dn2,dn3上执行第 3)步改写的SQL,然后把从dn2,dn3上得到的结果进行拼装就是最终的结果了备注:多表关联查询的时候,visitor会遍历出所有的表,然后去各个分片上去获取结果,同时把结果缓存起来,最后根据关联查询计算出结果。确定分片的过程:首先看where条件里面是否含有分片字段,有就根据分片字段的值结合schema.xml、rule.xml的值确定是哪个分片。当不能确定在哪一个分片上的时候,mycat会到所有的分片上去找二、Mycat常用分片规则1. 时间类:按天分片、自然月分片、单月小时分片2. 哈希类:Hash固定分片、日期范围Hash分片、截取数字Hash求模范围分片、截取数字Hash分片、一致性Hash分片3. 取模类:取模分片、取模范围分片、范围求模分片4. 其他类:枚举分片、范围约定分片、应用指定分片、冷热数据分片下面基于源码来介绍Mycat的常用分片规则,源码地址三、Mycat常用分片规则介绍说明:分片规则都定义在rule.xml文件里面<!--tableRule标签:定义table分片策略--><tableRule name="rule1"><!--rule标签:策略定义标签--><rule><!--columns标签:对应的分片字段--><columns>id</columns><!--algorithm标签:tableRule分片策略对应的function名称--><algorithm>func1</algorithm></rule></tableRule><!-- 定义分片函数 --><function name="func1" class="io.mycat.route.function.PartitionByLong"><property name="partitionCount">1,1,2,3,1</property><!-- 分片数 --><property name="partitionLength">128,128,128,128,128</property><!-- 分片长度 --></function>1. 自动范围分片在rule.xml里面的配置:<tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule><function name="rang-long"class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property></function>说明:有3个分片,第1个分片存储的是1-500000的数据,第2个分片存储的是500001-1000000的数据,第3个分片存储的是1000001-1500000的数据insert into employee(id, name) value(1,Tom);在第1个分片insert into employee(id, name) value(500002,Jack);在第2个分片insert into employee(id, name) value(1000002,Lucy);在第3个分片对应代码:package io.mycat.route.function;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.HashSet;import java.util.LinkedList;import java.util.Set;import io.mycat.config.model.rule.RuleAlgorithm;/*** auto partition by Long ,can be used in auto increment primary key partition** @author wuzhi*/public class AutoPartitionByLong extends AbstractPartitionAlgorithm implements RuleAlgorithm{private String mapFile;private LongRange[] longRongs;private int defaultNode = -1;@Overridepublic void init() {initialize();}public void setMapFile(String mapFile) {this.mapFile = mapFile;}@Overridepublic Integer calculate(String columnValue) {// columnValue = NumberParseUtil.eliminateQoute(columnValue);try {long value = Long.parseLong(columnValue);Integer rst = null;for (LongRange longRang : this.longRongs) {if (value <= longRang.valueEnd && value >= longRang.valueStart) {return longRang.nodeIndx;}}//数据超过范围,暂时使用配置的默认节点if (rst == null && defaultNode >= 0) {return defaultNode;}return rst;} catch (NumberFormatException e){throw new IllegalArgumentException(new StringBuilder().append("columnValue:").append(columnValue).append(" Please eliminate any quote and non number within it.").toString(),e);}}@Overridepublic Integer[] calculateRange(String beginValue, String endValue) {return AbstractPartitionAlgorithm.calculateSequenceRange(this, beginValue, endValue);}@Overridepublic int getPartitionNum() {// int nPartition = longRongs.length;/** fix #1284 这里的统计应该统计Range的nodeIndex的distinct总数*/Set<Integer> distNodeIdxSet = new HashSet<Integer>();for(LongRange range : longRongs) {distNodeIdxSet.add(range.nodeIndx);}int nPartition = distNodeIdxSet.size();return nPartition;}private void initialize() {BufferedReader in = null;try {// FileInputStream fin = new FileInputStream(new File(fileMapPath));InputStream fin = this.getClass().getClassLoader().getResourceAsStream(mapFile);if (fin == null) {throw new RuntimeException("can't find class resource file "+ mapFile);}in = new BufferedReader(new InputStreamReader(fin));LinkedList<LongRange> longRangeList = new LinkedList<LongRange>();for (String line = null; (line = in.readLine()) != null;) {line = line.trim();if (line.startsWith("#") || line.startsWith("//")) {continue;}int ind = line.indexOf('=');if (ind < 0) {System.out.println(" warn: bad line int " + mapFile + " :"+ line);continue;}String pairs[] = line.substring(0, ind).trim().split("-");long longStart = NumberParseUtil.parseLong(pairs[0].trim());long longEnd = NumberParseUtil.parseLong(pairs[1].trim());int nodeId = Integer.parseInt(line.substring(ind + 1).tri
Mysql系列八:Mycat和Sharding-jdbc的区别、Mycat分片join、Mycat分页中的坑、Mycat注解、Catlet使用
一、Mycat和Sharding-jdbc的区别1)mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包2)使用mycat时不需要改代码,而使用sharding-jdbc时需要修改代码Mycat(proxy中间件层):Sharding-jdbc(TDDL为代表的应用层):二、Mycat分片join在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个:1.)分布式全局唯一id2.)分片规则和策略3.)跨分片技术问题4.)跨分片事物问题下面我们来看一下Mycat是如何解决跨分片技术问题——分片join的1. 使用全局表方式解决跨分片join问题1.1 先在server.xml里面全局表一致性检测<property name="useGlobleTableCheck">1</property> <!-- 1为开启全局表一致性检测、0为关闭 -->1.2 在schema.xml里面配置全局表<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />全局表说明:1)全局表的插入、更新操作会实时在所有节点上执行,保持各个分片数据的一致性2)全局表的查询操作只从一个节点上获取3)全局表可以跟任何一个表进行join操作2. 使用Share Join方式解决跨分片join问题Share Join是一个简单的跨分片join,基于HBT(Human Brain Tech)的方式实现。原理:解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。示例:/*!mycat:catlet=io.mycat.catlets.ShareJoin*/select * from employee a, employee_detail b where a.id = b.id;说明:目前只支持两张分片表的Join,如果要支持多张表需要自己改造程序代码或者改造Mycat的源代码对应Mycat源码:io.mycat.catlets.ShareJoinio.mycat.catlets.Catletpublic class ShareJoin implements Catlet3. 使用ER Join方式解决跨分片join问题ER表也叫父子表,子表存储在哪个分片上依赖于父表的存储位置,并且和父表存储同一个分片上,即子表的记录与所关联的父表记录存放在同一个数据分片上,从而解决跨库join的问题在schema.xml里面的配置<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"><childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"><childTable name="order_items" joinKey="order_id" parentKey="id" /></childTable><childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /></table>说明:childTable:标签用来声明子表:joinKey:声明子表的那个字段和父表关联parentKey:声明父表的关联主键primaryKey:父表自身的主键三、Mycat分页中的坑Mycat分页的大坑一定要注意:在对应的分片上去查询分页数据的时候是从第一条记录开始扫描,然后再取出对应的分页数据,如SELECT * FROM customer ORDER BY id LIMIT 1000100, 100;这个sql语句被Mycat转化后1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}所以要在Mycat的server.xm里面开启使用非堆内存。否则内存会爆掉<property name="useOffHeapForMerge">1</property>优化:1)先查出idSELECT id FROM customer ORDER BY id LIMIT 1000100, 100;这个sql语句被mycat转化后1 -> dn1{SELECT id FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT id FROM customer ORDER BY id LIMIT 0, 1000100}2) 拿到所有的id以后再取获取需要的数据SELECT * FROM customer where id in(1,2,3....);这个sql语句被mycat转化后1 -> dn1{SELECT * FROM customer where id in(1,2,3....);}2 -> dn2{SELECT * FROM customer where id in(1,2,3....);}四、Mycat注解1. Mycat不支持的SQL语句:1)  某些SQL语法,如insert into......select.....2)  跨库关联查询3)存储过程创建4)存储过程调用所以Mycat提供Mycat注解来解决上面这些不支持的SQL语句Mycat的解决办法:Mycat注解语法:/*!mycat:sql=Mycat注解SQL语句*/真正执行的SQL   !号方式/*#mycat:sql=Mycat注解SQL语句*/真正执行的SQL  #号方式/**mycat:sql=Mycat注解SQL语句*/真正执行的SQL   *号方式原理:使用mycat不支持的SQL替换mycat支持的SQL,运行Mycat不支持的SQLMycat注解规范:1) 注解SQL使用select语句,不允许使用delete/update/insert等语句;虽然delete/update/insert等语句也能用在注解中,但这些语句在Sql处理中有额外的逻辑判断,从性能考虑,请使用select语句。2) 注解SQL禁用表关联语句。3) 注解SQL尽量用最简单的SQL语句,如select id from tab_a where id=’10000’(如果必要,最好能在注解中指定分片)4) 无论是原始SQL 还是注解SQL,禁止DDL语句5) 能不用注解的尽量不用2. Mycat注解解决不支持insert into......select...../*!mycat:sql=select 1*/insert into travelrecord(id,user_id,traveldate,fee,days) select 3,'Tom','20180826',100,8;3. Mycat注解创建表/*!mycat:sql=select 1 from test */create table test2(id int);4. Mycat注解创建存储过程/*!mycat:sql=select 1 from test */create procedure 'test_proc()' begin end;5. Mycat注解调用存储过程/*!mycat:sql=select * from user where id=1 */call test_proc();6. Mycat注解读写分离数据源选择/*!mycat:db_type=master */select * from travelrecord;(强制走主库)/*!mycat:db_type=slave */select * from travelrecord;(强制走从库)五、Catlet使用通过Catlet支持跨分片复杂SQL实现以及存储过程支持等等使用方式:通过mycat注解方式来执行1. 跨分片联合查询注解支持/*!mycat:catlet=io.mycat.catlets.ShareJoin */select o.id,u.* from order o,user u where o.user_id=u.id;2. 批量插入与ID自增长结合的支持/*!mycat:catlet=io.mycat.route.sequence.BatchInsertSequence */insert into user(name) values('Tom'),('Cat'),('Alan'); 
Mysql系列九:使用zookeeper管理远程Mycat配置文件、Mycat监控、Mycat数据迁移扩容
一、使用zookeeper管理远程Mycat配置文件环境准备:虚拟机192.168.152.130:zookeeper,具体参考前面文章 搭建dubbo+zookeeper+dubboadmin分布式服务框架(windows平台下)虚拟机192.168.152.128:安装好Mycat,具体参考前面文章Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解本机:搭建好zookeeper的客户端工具ZooInspector ,具体参考文章Zookeeper数据查看工具ZooInspector简介1. 启动ZK./zkServer.sh start 2. 修改/usr/local/mycat/conf/myid.propertiesvim /usr/local/mycat/conf/myid.propertiesloadZk=truezkURL=192.168.152.130:2181clusterId=mycat-cluster-1myid=mycat_fz_01clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_04#server booster ; booster install on db same server,will reset all minCon to 1type=serverboosterDataHosts=dn2,dn3myid.properties配置说明:loadZk:默认值false。代表mycat集群是否使用ZK,true表示使用zkURL:zk集群的地址clusterId:mycat集群名字myid:当前的mycat服务器名称clusterNodes:把所有集群中的所有mycat服务器罗列进行以逗号隔开,比如:clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_033. 使用Mycat脚本初始化mycat在ZK中的节点数据/usr/local/mycat/bin/init_zk_data.sh 4. 启动mycat/usr/local/mycat/bin/mycat start 5. 连接mycat,查看当前数据库中表的情况mysql -uroot -pdigdeep -P8066 -h192.168.152.128use TESTDB;show tables; 6. 使用zookeeper的客户端工具ZooInspector连接zookeeper修改mycat配置文件 6.1 进入目录E:softwaredevtoolsZKZooInspectorbuild,运行zookeeper-dev-ZooInspector.jar;java -jar zookeeper-dev-ZooInspector.jar 连接远程zookeeper 连接成功以后可以看到mycat的树节点和mycat的安装后的conf目录下的schema.xml和rule.xml文件是对应的6.2 在zookeeper管理工具里面动态修改schema配置文件新增一张逻辑表travelrecord2 保存修改,查看mycat的schema.xml配置文件,可以看到修改已经同步过来了重启mycat,可以看到TESTDB里面有新配置的travelrecord2表/usr/local/mycat/bin/mycat restart 二、Mycat监控1. 下载Mycat-web上传到虚拟机中http://dl.mycat.io/mycat-web-1.0/2. 解压Mycat-webtar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz 3 修改mycat-web项目下/WEB-INF/classes/mycat.properties中zookeeper属性vim /software/mycat-web/mycat-web/WEB-INF/classes/mycat.properties#Mon Jan 16 15:37:36 CST 2012show.period=3000000zookeeper=192.168.152.130:2181mycat_warn_mail=[{"cc":"[email protected]","index":1,"mangerPort":"465","smtpHost":"smtp.139.com","smtpPassword":"123456","smtpProtocol":"smtp","smtpUser":"[email protected]","to":"[email protected]"}]##sqlu4E0Au7EBFu76F8u5173u914Du7F6Esqlonline.server=192.168.80.128sqlonline.user=rootsqlonline.passwd=1234564. 启动mycat-web/software/mycat-web/start.sh 5. 访问mycat-web访问地址:http://192.168.152.128:8082/mycat/6. 在Mycat管理界面手动初始化Mycat配置6.1 Mycat-配置管理。增加mycat服务器配置 保存,新增成功 6.2 mycat-VM管理。配置JMX服务项 保存新增成功6.3 MySQL配置管理 分别保存,新增成功初始化完前面的三步,就可以对Mycat进行监控了三、Mycat数据迁移(扩容)以employee表作数据迁移1. 准备工作:1)修改employee表的分片规则为一致性hash,vim schema.xml<table name="employee" dataNode="dn1,dn2" rule="sharding-by-murmur" primaryKey="ID"/>2)修改分布式全局唯一id方式为本地文件方式,vim server.xml<property name="sequnceHandlerType">0</property>3)关掉ZK配置,vim myid.propertiesloadZk=falsezkURL=192.168.152.130:2181clusterId=mycat-cluster-1myid=mycat_fz_01clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_04#server booster ; booster install on db same server,will reset all minCon to 1type=serverboosterDataHosts=dn2,dn34) 重启mycat../bin/mycat restart5) 连接mycat,并创建employee表,并插入数据mysql -uroot -pdigdeep -P8066 -h192.168.152.128use TESTDB;create table employee(id bigint(20) not null primary key auto_increment,name varchar(20),sharding_id bigint(20),company_id bigint(20));insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack001', 10010, 1);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack002', 10000, 2);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack003', 10010, 3);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack004', 10010, 4);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack005', 10010, 5);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack006', 10000, 1);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack007', 10000, 1);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack008', 10000, 2);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack009', 10010, 2);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack010', 10010, 1);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack011', 10010, 3);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack012', 10010, 4);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack013', 10000, 5);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack014', 10000, 5);insert into employee(id, name, sharding_id, company_id) values(next value for MYCATSEQ_GLOBAL, 'Jack015'