mysql遷移到mycat

記錄一下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);

經過檢查數據已經導入成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章