windows和linux的MyCat使用

windows

一、最基本的使用:分表分库

1、下载

下载地址:http://dl.mycat.org.cn/
我选择的windows版Mycat-server-1.6.7.1-release-20200209222254-win.tar.gz
windows和linux的MyCat使用_第1张图片

2、解压

windows和linux的MyCat使用_第2张图片

3、安装(启动、安装都得以管理员权限进入)

cmd -----右键----- 管理员身份运行-----进入mycat的bin-----运行mycat install
windows和linux的MyCat使用_第3张图片
安装完成后可在任务管理器查看:
windows和linux的MyCat使用_第4张图片
使用命令 mycat start 启动服务,或在任务管理器右键手动开启
补充一些其他的命令:在这里插入图片描述

4、库表准备
  1. ip为193.168.1.241的计算机一台 ;安装了mysql5.6 ; 端口为3307 ; 用户名root ; 密码:w*******20;
    ip为localhost的计算机一台; 安装了mysql5.6 ; 端口为3306 ; 用户名root ; 密码:root;
    两台计算机使用局域网或内网穿透或云服务器可以互ping

  2. 都安装了mycat

  3. 计算机ip 241、localhost的mysql数据库都有库 wssp_charging ; 有表 bus_customerchangelog;
    windows和linux的MyCat使用_第5张图片

5、配置mycat
  1. mycat的conf目录下这几个文件依次配置
    在这里插入图片描述
    windows和linux的MyCat使用_第6张图片

  2. server.xml配置
    其他配置全部不用动,找到下面的user标签
    windows和linux的MyCat使用_第7张图片

  3. schema.xml配置

windows和linux的MyCat使用_第8张图片
注意:
windows和linux的MyCat使用_第9张图片

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

	<schema name="MYCAT" checkSQLschema="false" sqlMaxLimit="100">
		<table name="bus_customerchangelog" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" />
	</schema>
	
	<dataNode name="dn1" dataHost="localhost1" database="wssp_charging" />
	<dataNode name="dn2" dataHost="localhost2" database="wssp_charging" />
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="localhost:3306" user="root" password="root">
			<readHost host="hostS2" url="localhost:3306" user="root" password="root" />
		</writeHost>
	</dataHost>
	
	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="193.168.1.241:3307" user="root" password="wellsun_2020">
			<readHost host="hostS2" url="193.168.1.241:3307" user="root" password="wellsun_2020" />
		</writeHost>
	</dataHost>
</mycat:schema>
  1. rule.xml配置
    因为上面使用了rule="mod-long"且有两个节点,所以在rule.xml里找到function标签的mod-long,设置为2。mod-long规则,由于是两个节点来提供服务,这里我就将其设置为均分:比如插入时,一个一库,轮流进行
    在这里插入图片描述

5.wrapper.conf配置指向jdk路径
windows和linux的MyCat使用_第10张图片

6、连接使用MyCat

双击或cmd命令开启startup_nowrap.batwindows和linux的MyCat使用_第11张图片
windows和linux的MyCat使用_第12张图片

windows和linux的MyCat使用_第13张图片
241表里的数据:
windows和linux的MyCat使用_第14张图片
lacal表数据
windows和linux的MyCat使用_第15张图片
mycat表数据:
windows和linux的MyCat使用_第16张图片

7、以上配置成功启动后,可以删除、修改、插入mycat,同时同步到两个mysql,操作单个mysql也可在mycat中同步但是当有自增字段比如主键id时,插入时不输入自增主键ID会出错的

解决:

  1. 修改server.xml配置文件,修改sequnceHandlerType参数的值为1,表示使用数据库方式生成sequence:
<property name="sequnceHandlerType">1property>

windows和linux的MyCat使用_第17张图片

  1. 选择一个数据节点(物理的数据库节点)创建MYCAT_SEQUENCE的表和相关函数,注意这里的MYCAT_SEQUENCE的表和相关函数需要存放在同一个节点上。本文选择本地mysql的wssp_charging库里(即节点dn1)来运行如下命令创建相关的数据表和函数
USE wssp_charging;-- -此处是你自己的库名,我选的是节点dn1,本地mysql的wssp_charging库-- ---
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
 
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;
 
-- ----------------------------
-- Function structure for `mycat_seq_currval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval ;
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `mycat_seq_nextval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `mycat_seq_setval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
  1. 插入测试表sequence生成数据到上述创建的表格中,相关命令如下:
INSERT INTO mycat_sequence (name, current_value, increment) VALUES ('BUS_CUSTOMERCHANGELOG', 100, 100);-- -注意:参数一是你的表名,参数二是自增的起始值,参数三是步长,可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.- ---

windows和linux的MyCat使用_第18张图片

  1. 修改\mycat\conf下的sequence_db_conf.properties配置文件中的相关配置,增加sequence的节点配置信息,否则mycat是不知道sequence的表和函数在哪个节点上的。编辑该属性文件,增加如下值:
BUS_CUSTOMERCHANGELOG=dn1#注意,key是你的表名必须大写,value是你这个表的节点(MYCAT_SEQUENCE在哪个节点创建的就写哪个,我在dn1节点即本地mysql创建的MYCAT_SEQUENCE)
  1. 重启mycat
    以管理员权限进入mycat的bin目录,执行mycat.bat restart
  2. 测试,在mycat里执行一条插入bus_customerchangelog的语句,不带自增主键ID的。
INSERT INTO `bus_customerchangelog` (
	`Customerid`,`OldName`,`OldMobile`,`OldIdcard`,`OldWechat`,
	`NewName`,`NewMobile`,`NewIdcard`,`NewWechat`,`ElecValue`,
	`WaterValue`,`Creator`,`OrganizationId`,`customerNum`
)
VALUES
	(
		'1','1','1','1','1',
		'1','1','1','1','1',
		'1','1','1','1'
	)

成功:
windows和linux的MyCat使用_第19张图片

失败的情况:

  • The user specified as a definer (‘root’@’%’) does not exist
    说明root账号一般是访问视图文件引起的(没有权限),解决:
 - 进入cmd:mysql -uroot -p
 - mysql>grant all privileges on *.* to root@"%" identified by ".";
   Query OK, 0 rows affected (0.00 sec)
 - mysql> flush privileges;
   Query OK, 0 rows affected (0.00 sec)
  • mycat sequnce err.io.mycat.config.util.ConfigException: can’t find definition for sequence
    解决:检查上面第四步,key是否是自己的表名
  • op table not in schema----****
    解决:检查上面第一步,是否sequnceHandlerType配置为1
  • mycat sequnce err.java.lang.NumberFormatException: “null”
    解决:检查上面第一步,是否sequnceHandlerType配置为1
  • mycat sequnce err.java.lang.NumberFormatException: For input string: “null”
    解决:检查上面第三步,key是否是自己表名

Linux

一、最基本的使用:分表分库

(1)下载–安装–配置–启动 和windows一样

二、主从复制

1、一主一从

(1)拓展:搭建主从复制,一个主机,一个从机
windows和linux的MyCat使用_第20张图片
windows和linux的MyCat使用_第21张图片
windows和linux的MyCat使用_第22张图片

windows和linux的MyCat使用_第23张图片
windows和linux的MyCat使用_第24张图片
在这里插入图片描述

2、双主双从

准备虚拟机:主一、主二、从一、从二
windows和linux的MyCat使用_第25张图片

(1)修改主一配置文件,在my.cnf中,设置logbin格式的下面加上
windows和linux的MyCat使用_第26张图片
(2)配置主二
windows和linux的MyCat使用_第27张图片
(3)配置从一配置文件,和一主一从的从机配置一模一样,若已配置过,无需修改
windows和linux的MyCat使用_第28张图片

(4)配置从二文件,id=4
windows和linux的MyCat使用_第29张图片
(5)重启四台虚拟机的mysql服务,关闭所有虚拟机防火墙等
windows和linux的MyCat使用_第30张图片
(6)两台主机都授权
windows和linux的MyCat使用_第31张图片
(7)查看两台主机是否都授权成功
windows和linux的MyCat使用_第32张图片
(8)查看并记录master状态的关键值,
windows和linux的MyCat使用_第33张图片
然后进入从一的mysql里面配置需要复制的主一,使用start slave;启动slave,使用show slave status\G;以列表的形式查看slave状态
在这里插入图片描述
在这里插入图片描述

进入从二的mysql上配置需要复制的主二,使用start slave;启动slave,使用show slave status\G;以列表的形式查看slave状态
在这里插入图片描述
(9)两个主机也得互相复制。当主一在运行时,主二必须同步主一的数据(相当于一个从机三),因为当主一死机后,主二要升级为主一承担起主一的责任,此时若主一主二数据不一致会造成数据丢失;当主一再次重启后会退居二线充当主二备机的角色,主二不会退位让给主一直到主二死机
windows和linux的MyCat使用_第34张图片
在主一上执行
windows和linux的MyCat使用_第35张图片

在主二上执行
windows和linux的MyCat使用_第36张图片
测试插入数据
windows和linux的MyCat使用_第37张图片

3、双主双从的读写分离

(1)在主一的schema.xml里修改balance=“1”

windows和linux的MyCat使用_第38张图片
(2)并在中加上主二和从二的读写配置
windows和linux的MyCat使用_第39张图片
windows和linux的MyCat使用_第40张图片

(3)其他参数说明:
windows和linux的MyCat使用_第41张图片
(4)启动mycat,验证读写分离
windows和linux的MyCat使用_第42张图片

4、分库之垂直拆分

在这里插入图片描述
windows和linux的MyCat使用_第43张图片

需求:

  • 订单库orders
  • 客户表customer
  • 订单表
  • 订单详情表
  • 字典表
    将上面的表分库,客户表放在虚拟机一(ip127,dn2)的订单库orders,其他全部放在虚拟机二(ip128,dn1)的订单库orders
    (1)修改mycat的conf下的schema.xml文件
    windows和linux的MyCat使用_第44张图片

windows和linux的MyCat使用_第45张图片
(2)在128、127上分别创建orders数据库
windows和linux的MyCat使用_第46张图片
windows和linux的MyCat使用_第47张图片
(3)启动mycat并创建第一步的所有表。

  • 启动mycat:./mycat
  • 登录mycat:mysql -uEric -p123456 -h192.168.140.127 -P8066
  • 进入mycat:use MYCAT
  • 在mycat里创建以下表
    windows和linux的MyCat使用_第48张图片
    windows和linux的MyCat使用_第49张图片

5、分库之水平拆分

  • 和最上面基本用法window分表分库是同一个东西,不同的是加了一个订单详情order_detail的子表
    (1)order表水平分表

    (2)子表order_detail的水平分表
    windows和linux的MyCat使用_第50张图片

windows和linux的MyCat使用_第51张图片
(3)全局表。 比如订单表里面某个字段值对应的是字典表里的值,这时就要考虑字典表与子表的区别及特点:
- 多个表都需要字典表,而子表只有自己的主表需要
- 变动不频繁
- 数据总量变化不大
- 数据量不大,一般很少超过十万条记录

windows和linux的MyCat使用_第52张图片

windows和linux的MyCat使用_第53张图片

6、水平分表之常用分片规则

(1)分片枚举
windows和linux的MyCat使用_第54张图片
(2)范围约定

  • 提前规划好分片字段某个范围属于哪个分片
    比如订单支付表中的订单编号在某个范围到dn1,某个范围到dn2

你可能感兴趣的:(sql,mysql)