記錄一下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);
經過檢查數據已經導入成功。