学习目录
- 测试库表和数据
- 一、Kettle环境搭建
-
- 1.1 Kettle下载及安装
- 1.2 驱动包下载
- 1.3 驱动包版本
- 1.4 驱动包安装
- 二、Kettle使用
-
- 2.1 Windows
-
- 2.1.1 数据库连接测试
- 2.1.2 Kettle作业和转换
-
- 2.1.2.1 创建Kettle转换
- 2.1.2.2 创建Kettle作业
- 2.1.3 数据迁移测试(未优化)
-
- 2.1.3.1 执行转换测试(单表)
- 2.1.3.2 执行作业测试(多表)
- 2.1.4 数据迁移(性能优化)
-
- 2.1.4.1 优化Kettle作业
- 2.1.4.2 优化Kettle转换
- 2.1.4.3 优化Kettle连接DB参数
- 2.1.4.4 优化JVM内存大小
- 2.1.4.5 优化目标表的字段索引(临时删除)
- 2.1.5 重做数据迁移(性能优化后)
- 三、Linux
-
- 3.1 Kettle环境搭建
-
- 3.1.1 检查JDK
- 3.1.2 目录规划
- 3.1.3 kettle安装包
- 3.1.4 验证kettle
- 3.2 检查驱动及网络连接
- 3.3 再次性能优化
- 3.4 数据迁移
测试库表和数据
create database if not exists test default character set utf8 collate utf8_general_ci; use test;
use test; create table test.demo_info( id int(7) primary key not null auto_increment, name varchar(255) not null, sex char(1) not null, age int(3) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; alter table test.demo_info add index index_name(name); alter table test.demo_info add index index_age(age); alter table test.demo_info add index index_name_age(name,age); alter table test.demo_info comment 测试表; alter table test.demo_info modify column id int(7) not null auto_increment comment 'ID'; alter table test.demo_info modify column name varchar(255) not null comment '姓名'; alter table test.demo_info modify column sex char(1) not null comment 性别:1-男,0-女'; alter table test.demo_info modify column age int(3) comment '年龄';
create table test.demo_info2( id int(7) primary key not null auto_increment, name varchar(255) not null, sex char(1) not null, age int(3) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; alter table test.demo_info2 add index index_name(name); alter table test.demo_info2 add index index_age(age); alter table test.demo_info2 add index index_name_age(name,age); alter table test.demo_info2 comment 测试表2; alter table test.demo_info2 modify column id int(7) not null auto_incremnt comment 'ID';
alter table test.demo_info2 modify column name varchar(255) not null comment '姓名';
alter table test.demo_info2 modify column sex char(1) not null comment '性别:1-男,0-女';
alter table test.demo_info2 modify column age int(3) comment '年龄';
csdn 下载1~ mpan 下载2~ 提取码:jj6l
MySQL如何使用load data infile、into outfile高效导入导出数据…
load data infile 'C:/Users/Administrator/Desktop/10w.del' into table test.demo_info character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/10w.del' into table test.demo_info2 character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/100w.del' into table test.demo_info character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/100w.del' into table test.demo_info2 character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/1000w.del' into table test.demo_info character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/1000w.del' into table test.demo_info2 character set utf8 fields terminated by 0x0f (name,sex,age);
一、Kettle环境搭建
1.1 Kettle下载及安装
https://sourceforge.net/projects/pentaho/files/
1.2 驱动包下载
https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html https://www.ibm.com/support/pages/node/382667 https://dev.mysql.com/downloads/connector/j/
1.3 驱动包版本
1.4 驱动包安装
data-integrationlib
data-integrationlibswt
data-integrationlibswtosx64
data-integrationlibswtwin64
二、Kettle使用
2.1 Windows
2.1.1 数据库连接测试
自定义后缀,这里建议使用
.ktr
)
… Driver class org.gjt.mm.mysql.Driver
could not be found…** … Access denied for user ‘root
’@’119.168.xxx.xxx
’ (using password: YES) … Connection failed. Verify all connection parameters
and confirm that the appropriate driver is installed. … … mysql> select user,host from mysql.user;
mysql> update mysql.user set host='%' where user = 'root';
mysql> flush privileges;
…
2.1.2 Kettle作业和转换
名词
说明
转换
一般文件后缀命名为.ktr
,单表迁移数据,构建表输入(读取数据),表输出(写入数据),Linux下使用kitchen.sh
脚本调用执行
作业
文件后缀为.kjb
,可以关联多个.ktr
执行,实现多表(串行/并行)迁移数据,Linux下使用pan.sh
脚本调用执行
2.1.2.1 创建Kettle转换
选项
说明
表输入
简单理解为从指定的数据表(旧库)读取数据的过程~
表输出
简单理解为插入数据到指定的数据表(新库)的过程~
2.1.2.2 创建Kettle作业
${Internal.Entry.Current.Directory}/demo_info.ktr
2.1.3 数据迁移测试(未优化)
2.1.3.1 执行转换测试(单表)
2.1.3.2 执行作业测试(多表)
use test;
delete from test.demo_info;
alter table test.demo_info auto_increment 1;
delete from test.demo_info2;
alter table test.demo_info2 auto_increment 1;
2.1.4 数据迁移(性能优化)
- 优化Kettle
作业
- 优化Kettle
转换
- 化Kettle连接
DB参数
- 优化
JVM内存大小
- 优化目标表的字段
索引
(临时删除)
2.1.4.1 优化Kettle作业
2.1.4.2 优化Kettle转换
2.1.4.3 优化Kettle连接DB参数
mysql > show variables like '%max_connections%';
max_connections=2000
Linux下可能会不生效,若不生效则需要配置Linux操作系统的limits.conf
配置文件~ vi /etc/security/limits.conf
mysql hard nofile 65535
mysql soft nofile 65535
ulimit -n
参数及赋值
参数说明
defaultFetchSize=10000
每次与数据库交互,读多少条数据加入内存中缓存,不设置默认把所有数据读取出来,容易内存溢出(OOM),我这里设置10000,大表CPU性能高建议设置最大50000,不能超过65535
useServerPrepStmts=true
是否在使用服务端的预编译语句,true表示以占位符的方式发送SQL到服务端进行拼接
cachePrepStmts=true
是否客户端缓存预处理语句
useCursorFetch=true
是否允许部分数据到客户端就进行处理,如果为false表示所有数据到达客户端后,才进行处理
https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html
参数及赋值
参数说明
defaultFetchSize=5000
每次与数据库交互,从内存中读取多少条数据写入数据表,不设置默认把所有数据写入, rewriteBatchedStatements设置true,该参数会失效
rewriteBatchedStatements=true
是否开启批量写入,true表示开启,原多条insert变成单条insert执行
useServerPreStmts=false
是否使用服务端预编译,设置为false,表示在客户端编译好
useCompression=true
是否使用压缩,使用压缩优化客户端与服务端传输效率
useCursorFetch=true
是否允许部分数据到客户端就进行处理,如果为false表示所有数据到达客户端后,才进行处理
2.1.4.4 优化JVM内存大小
PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m"
参数
说明
-Xms
堆区最小内存,默认物理内存的1/64,建议-Xms、-Xmx设置成一样,避免每次GC后调整堆区大小
-Xmx
堆区最大内存,默认物理内存的1/4 ,建议最大值设置为实际可用物理内存的3/4即可,不要超过80%,不过有个度,32位操作系统有限制,Winows 32限制2-3G,Linux限制2-3G~ ,64位操作系统不限制,取决于实际可用的物理内存~
-Xmn
新生代内存大小,JDK1.8 新生代:年老代=1:3 ,官方建议设置为最大堆区内存值的3/8,不知道这里不配置也行~
-XX:MaxPermSize
永久代最大内存,默认64m,JDK1.8取消了永久代,这里该参数就不要配置了,配置了也会失效,JDK1.7及之前版本,默认64m,建议加大一些,不然64m随时发生OutOfMemoryError内存溢出~
PENTAHO_DI_JAVA_OPTIONS="-Xms6144m" "-Xmx6144m"
PENTAHO_DI_JAVA_OPTIONS="-Xms3072m" "-Xmx3072m"
cat /proc/meminfo |grep 'MemTotal'
cat /proc/meminfo |grep 'MemFree'
free -m
-Xms24g -Xmx24g -Xmn9g -XX:MaxPermSize=1024m
2.1.4.5 优化目标表的字段索引(临时删除)
show index from test.demo_info;
alter table test.demo_info drop index index_name;
alter table test.demo_info drop index index_age;
alter table test.demo_info drop index index_name_age;
alter table test.demo_info2 drop index index_name;
alter table test.demo_info2 drop index index_age;
alter table test.demo_info2 drop index index_name_age;
alter table test.demo_info add index index_name(name);
alter table test.demo_info add index index_age(age);
alter table test.demo_info add index index_name_age(name,age);
alter table test.demo_info2 add index index_name(name);
alter table test.demo_info2 add index index_age(age);
alter table test.demo_info2 add index index_name_age(name,age);
2.1.5 重做数据迁移(性能优化后)
delete from test.demo_info;
delete from test.demo_info2;
alter table test.demo auto_increment 1;
alter table test.demo2 auto_increment 1;
delete from test.demo_info;
delete from test.demo_info2;
alter table test.demo auto_increment 1;
alter table test.demo2 auto_increment 1;
load data infile 'C:/Users/Administrator/Desktop/100w.del' into table test.demo_info character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/100w.del' into table test.demo_info2 character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/1000w.del' into table test.demo_info character set utf8 fields terminated by 0x0f (name,sex,age);
load data infile 'C:/Users/Administrator/Desktop/1000w.del' into table test.demo_info2 character set utf8 fields terminated by 0x0f (name,sex,age);
三、Linux
3.1 Kettle环境搭建
3.1.1 检查JDK
java -version
3.1.2 目录规划
mkdir -p $HOME/kettle
mkdir -p $HOME/kettle/kettle_file
mkdir -p $HOME/kettle/kettle_sh
mkdir -p $HOME/kettle/kettle_log
mkdir -p $HOME/kettle/sql
目录
说明
kettle_file
存放数据迁移准备好的kettle的转换ktr和作业kjb文件
kettle_sh
存放Shell脚本,脚本内容是多表,通过kitchen.sh调用作业kjb,单表的话,通过pan.sh调用转换ktr~
kettle_log
存放执行脚本以及调用Kettle作业和转换进行数据迁移打印的日志文件~
sql
存放统计数据量的SQL语句文件~
3.1.3 kettle安装包
$HOME/kettle/
cd $HOME/kettle/
unzip pdi-ce-9.0.0.0-423.zip
3.1.4 验证kettle
cd $HOME/kettle/data-integration
./kitchen.sh --version
./pan.sh --version
...
Kitchen - Start of run.
...
Pan - Start of run.
...
Native memory allocation (mmap) failed to map 715849728 bytes
for committing reserved memory.
if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
PENTAHO_DI_JAVA_OPTIONS="-Xms128m -Xmx128m"
fi
if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
PENTAHO_DI_JAVA_OPTIONS="-Xms3072m -Xmx3072m"
fi
cd $HOME/kettle/data-integration
./kitchen.sh --version
./pan.sh --version
3.2 检查驱动及网络连接
data-integration/lib/mysql-connector-java-8.0.26.jar
ping 旧数据库服务器的IP
telnet 就数据库服务器的IP 3306
3.3 再次性能优化
#!/bin/sh
#一、使用自定义的JDK版本
export JAVA_HOME=/usr/java/jdk1.8.0.221
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#二、执行kettle脚本,作业通过 kitchen.sh执行,转换通过pan.sh执行
#作业(多表)
$HOME/kettle/data-integration/kitchen.sh -file=$HOME/kettle/kettle_file/test.kjb > $HOME/kettle/kettle_log/transTest.log 2>&1 &
#转换(单表),这里先注释,如果数据迁移数据总量不一致,排查出哪张表数据不一致,需要单独迁移这张表,可以把这个放开,前面的作业注释
#$HOME/kettle/data-integration/pan.sh -file=$HOME/kettle/kettle_file/demo_info.kjb > $HOME/kettle/kettle_log/demo_info.log 2>&1 &
$HOME/kettle/kettle_sh
3.4 数据迁移
select sum(selectCount.ct) as totalRows from (
select count(*) as ct from test.demo_info
union all
select count(*) as ct from test.demo_info2
) selectCount;
$HOME/kettle/sql/
mysql > source C:/Users/Administrator/Desktop/selectCount.sql;
/bin/sh $HOME/kettle/kettle_sh/test.sh
ps -ef|grep kjb
tail -f $HOME/kettle/kettle_log/transTest.log
select sum(selectCount.ct) as totalRows from (
select count(*) as ct from test.demo_info
union all
select count(*) as ct from test.demo_info2
) selectCount;
mysql > source /home/mysql/kettle/sql/selectCount.sql;
vi /home/mysql/kettle/kettle_log
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦