记录一下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);

经过检查数据已经导入成功。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐