使用navicat导出mysql离线数据后,再导入doris的方案
一、背景
doris本身是支持直接从mysql中同步数据的,但有时候,客户不允许我们使用doris直连mysql,此时就需要客户配合将mysql中的数据手工导出成离线文件,我们再导入到doris中
二、环境
doris 1.2
三、方案
doris支持多种导入离线数据的方案,见 doris导入数据方案 ,但在本文场景下,一般会使用到insert into、csv和json三种方案
3.1 insert into方案
doris对于insert into 对于数据量较小的场景(比如100行以内),可以直接让用户在navicat中将某个表转储SQL文件,然后将其中的insert语句copy出来在doris中执行。但如果数据量较多时,doris会一行行地去执行,效率就会很低。此时如果将多个INSERT INTO中的value部分合并成一行,再由doris执行,效率就会得到提升,但navicat并不原生支持合并,因此作罢。
3.1.1 在doris命令行,或者mysql 命令行中执行
打开doris控制台,将insert粘贴进来执行。
或者使用mysql client登录到doris,将insert粘贴进来执行。
或者将insert语句写入到服务器的一个文件中,例如test.sql,然后在mysql client中执行source命令
3.1.2 在bash中执行
如果没有登录到mysql client中,也可以在bash里直接执行
mysql -h {doris_fe_ip} -P {doris_fe_tcp_port,一般是9030} -u{doris_username} -p'{doris_password}' {doris_database}< /root/sql/test.sql
或者挂在后台执行
nohup mysql -h {doris_fe_ip} -P {doris_fe_tcp_port,一般是9030} -u{doris_username} -p'{doris_password}' {doris_database}< /root/sql/test.sql > /root/sql/test.log 2>&1 &
3.2 csv
对于没有什么很复杂的文本的表(主要是不会出现跟csv分隔符相同的文本的字段),可以使用csv格式。
使用navicat导出向导,格式选择csv,文本识别符号选择none(避免navicat自作聪明地给字段添加"),日期选YMD格式
使用这种方案导出来的csv文件格式如下,第一行是标题,剩下的是数据,数据分割符是 “,”
在doris上建好表之后,可以使用curl命令来将csv文件导入到doris
curl --location-trusted -u '{dorisusername}:{dorispassword}' -H "label:{12345}" -H "timeout:100" -H "format:csv_with_names" -H "column_separator:," -T {test.csv} http://{doris_fe_ip}:{doris_fe_port}/api/{doris_db}/{doris_table}/_stream_load
相关命令说明如下:
dorisusername:doris的账号
dorispassword:doris的密码
label:本次导入任务的名称,多次导入时需要更换名称,30分钟内不允许名称重复
timeout:导入超时,单位s
format:文件格式,默认是csv,由于navicat导出的时候第一行不是数据而是标题,因此这里需要改成csv_with_names,作用是过滤掉第一行的标题
column_separator:文件分隔符,navicat导出来的csv的分割符是“,”
doris_fe_ip: doris的fe的ip
doris_fe_port: doris的fe的port,一般为8030
doris_db: doris的数据库名
doris_table: doris的数据表名
3.3 json(推荐)
相比于csv方案,json最大的好处是不怕文本中出现与分割符相同的内容,但坏处是json文件要求每个数据都有个key,因此文件会比csv大很多。
使用navicat导出向导,格式选择json,日期选YMD格式
使用这种方案导出来的json文件格式如下,最外层是[],每一行数据都会用一个{}括起来,而且多行数据的key的顺序是一样的。
在doris上建好表之后,可以使用curl命令来将json文件导入到doris
curl --location-trusted -u '{dorisusername}:{dorispassword}' -H "label:{12345}" -H "timeout:100" -H "format:json" -H "strip_outer_array:true" -T {test.csv} http://{doris_fe_ip}:{doris_fe_port}/api/{doris_db}/{doris_table}/_stream_load
相关命令说明如下:
dorisusername:doris的账号
dorispassword:doris的密码
label:本次导入任务的名称,多次导入时需要更换名称,30分钟内不允许名称重复
timeout:导入超时,单位s
format:文件格式,默认是csv,本方案使用json,因此这里需要改成json
strip_outer_array:doris导入json时,默认最外层是{},但navicat导出来的数据最外层是[],因此需要指定此参数将json数组先展平
doris_fe_ip: doris的fe的ip
doris_fe_port: doris的fe的port,一般为8030
doris_db: doris的数据库名
doris_table: doris的数据表名
注意,json格式导入的时候,限制单个文件在100MB以内(在doris be上有参数可调),如果超过100MB,需要先将json切成多个小文件。