附录1
数据库水平拆分主要切片规则:
(1)分片枚举: sharding-by-intfile
(2)主键范围约定: auto-sharding-long 此分片适用于,提前规划好分片字段某个范围属于哪个分片
(3)一致性hash: sharding-by-murmur (一致性hash算法是提供一种虚拟节点,具体参考:一致性hash算法原理)
(4)字符串hash解析: sharding-by-stringhash
(5)按日期(天)分片:sharding-by-date
(6)按单月小时拆分: sharding-by-hour
(7)自然月分片: sharding-by-month
(8)取模: mod-long 此规则为对分片字段求摸运算
(9)取模范围约束: sharding-by-pattern 此种规则是取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点分布
每一个rule规则需对应一个mapfile文件
附录2
Mycat不支持的sql语句
已知1.6以下版本不支持的sql语句包括不限于以下:
SELECT:
跨分片(实体库)的交叉查询
跨节点的联合查询 (如用户库的表和平台库的表做联合查询)
INSERT:
插入的字段不包含分片字段 (如插入tbl_user_base_info表,没有提供user_id列)
插入的分片字段找不到对应分片
复制插入Insert into…select…(2.0以上版本支持)
多行插入insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…
UPDATE:
更新的列包含分片列
多表更新update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id
复杂更新update a, b set a.nation=’China’ where a.id=b.id; 但支持子查询方式update a set a.nation=’China’ where id in (select id from b);
DELETE:
复杂删除 delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名
其他:
Call procedure() MyCat未支持存储过程定义, 因而不允许调用存储过程,但可通过注解来调用各个分片上的存储过程
Selectfunc(); 不支持这种方式直接调用自定义函数,但支持select id, func() from employee 只需employee所在的所有分片上存在这个函数。MySql
Attention:
Order by字段必须出现在select中(MyCat先将结果取出,然后排序)
Group by务必使用标准语法select count(1),type from tab_a group by type;
MyCat的一些自带函数sum,min,max等可以正确使用,但多分片执行的avg有bug,执行的结果是错误的
谨慎使用子查询,外层查询没有分片查询条件,则会在所有分片上执行(子查询内外层的表一样较为特殊)
附录3
Mysql配置单机多实例
以windows为例
1.修改数据库根目录下的my-default.ini文件
2.在mysqld下配置
a) 数据库根目录:basedir=”D:/mysql-5.7-3306”(以自己实际环境目录为准)
b) 数据存放目录:datadir=”D:/mysql-5.7-3306”(以自己实际环境目录为准)
c) 端口:port= 3306
d) 设置字符集charset-set-server=utf8
将my-default.ini重命名为my.ini
执行安装和添加服务
切换到数据库安装目录执行如下:
D:\mysql-5.7-3306\bin>mysqld install mysql3306 -defaults-file=”mysql-5.7-3306\my.ini”
如一切正常安装完成会提示:
Service successfully installed.
初始化数据库:
在bin目录下执行如下命令:
D:\mysql-5.7-3306\bin>mysql.exe --defaults-files=”D:\mysql-5.7-3306\my.ini” --initialize --explicit_defaults_for_timestamp
default-file即为配置文件的路径,必须进行指定
--initialize 说明执行数据库初始化。
--explicit_defaults_for_timestamp说明Timestamp类型的字段,必须进行指定,否则就是NULL。
初始化成功,无提示
启动数据库
启动3306
D:\mysql-5.7-3306\bin>net start mysql3306
如看到如下则表示启动成功
MySQL 服务正在启动 ...
MySQL 服务已经启动成功。
停止数据库
D:\mysql-5.7-3306\bin>net stop mysql3306
修改密码
登录的临时密码在data目录的的日志文件里是”.err”文件,打开搜索”password”关键字
A temporary password is generated for root@localhost: #JheTLHho2!L
则临时密码为:#JheTLHho2!L
登录mysql:
D:\mysql-5.7.16-3306\bin>mysql -u root -p
Enter password:#JheTLHho2!L
登录成功后,修改root的密码了:
mysql> set password = password('root');
修改成功后会有如下提示:
Query OK, 0 rows affected, 1 warning (0.15 sec)
修改成功就可以退出用新密码登录了。
mysql> exit
Bye
其余如3307、3308同样操作