记录一下mysql单库迁移到mycat使用的多库记录,由于业务增速较快,单库会出现瓶颈,所以采用mycat来分表分库。
由于之前的表字段过多,所以先采取分表,分为主表和详细表
CREATE TABLE fileinfo(
id INT NOT NULL ,
fid varchar(32) NOT NULL ,
userid varchar(32) NOT NULL ,
filename varchar(32) NOT NULL ,
create_date DATETIME ,
PRIMARY KEY (fid )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
filedetail
| status | downloadurl | fid | realname | langu | deviceid|
CREATE TABLE filedetail(
fid varchar(32) NOT NULL ,
status varchar(2) NOT NULL ,
realname varchar(32) NOT NULL ,
langu varchar(32) NOT NULL ,
create_date DATETIME ,
PRIMARY KEY (fid )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
由于目前需要使用uuid分片,原来的分片规则已不适用
采用一致性hash
<tableRule name="sharding-by-murmur">
<rule>
<columns>fid</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0-->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片—>
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍-->
<!--
<property name="weightMapFile">weightMapFile</property>
节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!--
<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
schema.xml表的配置如下
<table name="fileinfo" primaryKey="fid" dataNode="node_db01,node_db02" rule="sharding-by-murmur" >
<childTable name="filedetail" joinKey="fid"
parentKey="fid" ></childTable>
</table>
导出fileinfo表的信息
select id, fid, userid, filename,create_date
from fileuploadinfo into outfile
'/var/lib/mysql-files/fileinfo.text'
fields terminated by ','
optionally enclosed by ''
LINES TERMINATED BY '\n';
导出filedetail表的信息
select fid, status, realname,langu,create_date
from fileuploadinfo into outfile
'/var/lib/mysql-files/filedetail.text'
fields terminated by ','
optionally enclosed by ''
LINES TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
show variables like "secure_file_priv";
出现这个问题的原因是mysql的secure_file_priv这个选项没有开启,或者这个选择了特定的文件路径,只有在这个路径下的文件才能导入导出mysql。
也可以修改my.cnf:在[mysqld]这个选项下加入变量声明:
secure_file_priv=’’
默认情况下mysql安装后,会自动创建mysql用户和mysql用户组,
数据库会创建在/var/lib/mysql目录下,所要保证数据导出目录有mysql用户权限。
准备好了,接下来进入mycat
mysql -utest -p123456 -h127.0.0.1 -P8066 -DTESTDB
use TESTDB
下面执行成功
导入fileinfo表
load data infile '/home/emeet/fileinfo.text' into table fileinfo fields terminated by',' lines terminated by'\n' (id, fid, userid, filename,create_date);
导入filedetail表,注意表名和列名不一样,需要修改,注意导入后查看相同fid是否数据在同一分片下
load data infile '/home/emeet/filedetail.text' into table filedetail fields terminated by',' lines terminated by'\n' (fid, status, realname,langu,create_date);
经过检查数据已经导入成功。