2.1.19 split 命令
背景
在进行POC时,现场人员进行数据导入时经常遇到各种问题,比较典型的是dble在导入文件时,对部分sql语句的不支持。另外,未分片的历史数据通过dble导入,旧数据会路由分片,在数据量较大时,耗时会比较长,在此过程中出现错误的话也很难排查。 基于以上原因,2.19.09.0版本提供工具对mysqldump导出的源数据文件按照后端分片节点进行分割。分割后的数据文件可以在每个后端分片执行导入,适配数据按分片导入的需求。
dump文件语句处理
- create database:会将逻辑数据库转换为物理库。
- ddl语句:根据表的分片节点写入到对应后端节点的dump文件中,对于自增列,会将自增列的数据类型修改为bigint。
- insert:全局序列列值会被dble替换为全局序列,再按照拆分列根据拆分算法路由到对应后端节点的dump文件中。
- 一些属性设置的语句会根据最近一次解析的ddl来决定下发到具体的后端节点的dump文件中。
- 会跳过对视图的处理
- 会跳过对子表的处理
使用方法
命令
在管理端口执行以下命令:
mysql > split src dest [-sschema] [-r500] [-w512] [-l10000] [--ignore] [-t2]
- src:表示原始dump文件名
- dest:表示生成的dump文件存放的目录
- -s:表示默认逻辑数据库名,当dump文件中不包含schema的相关语句时,会默认导出到该schema。如:当dump文件中包含schema时,dump文件中的优先级高于-s指定的;若文件中的schema不在配置中,则使用-s指定的schema,若-s指定的schema也不在配置中,则返回报错
- -r:表示设置读文件队列大小,默认500
- -w:表示设置写文件队列大小,默认512,且必须为2的次幂
- -l:表示split后一条insert中最多包含的values,只针对分片表,默认4000
- --ignore:insert时,忽略已存在的数据
- -t:表示多线程处理文件中insert语句时线程池的大小
生成的分片文件以格式:源文件名-shardingNode名-时间戳.dump,最新的文件时间戳最大。
例如:我的原始dump文件是 /tmp/mysql_dump.sql ,我想切分以后输出到/tmp/dump/目录下: 命令就是:
split /tmp/mysql_dump.sql /tmp/dump/
日志
默认情况下,split过程中生成的日志打印到在dble.log中,提供配置让split命令产生的日志单独存放,若需要开启,则需修改log4j.xml文件。
<Configuration status="WARN">
<Appenders>
<!-- 将下面的此段配置追加至已安装dble的log4j.xml中的Appenders下 -->
<RollingFile name="DumpFileLog" fileName="logs/dump.log"
filePattern="logs/$${date:yyyy-MM}/dump-%d{MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="250 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- 将下面的此段配置追加至已安装dble的log4j.xml中的Loggers下,可通过调整level为debug来调整性能 -->
<Logger name="dumpFileLog" level="info" additivity="false" includeLocation="false" >
<AppenderRef ref="DumpFileLog" />
<AppenderRef ref="RollingFile"/>
</Logger>
</Loggers>
</Configuration>
可通过日志中的 “dump file has bean read d%”关键字来查看解析进度。
可开启日志的debug级别来调整性能
任务停止
执行dump file任务的管理连接不受 idletimeout 参数的限制。用户可以通过kill @@connection id 方式杀掉管理连接从而停止dump file的任务的执行。
使用限制
- 数据导入之后需要运维检查下数据完整性。
- 对于使用全局序列的表,表原先全局序列中的值会被擦除,替换成全局序列,需要注意。
- 暂时不支持子表的dump操作。