设计本官方网站广告,elision豪华级创意企业中文wordpress主题整站,淘宝开店后怎么运营,企业网站在ps里做吗作者#xff1a;杨文 DBA#xff0c;负责客户项目的需求与维护#xff0c;会点数据库#xff0c;不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。 本文来源#xff1a;原创投稿 *爱可生开源社区出品#xff0c;原创内容未经授权不得随意使用… 作者杨文 DBA负责客户项目的需求与维护会点数据库不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。 本文来源原创投稿 *爱可生开源社区出品原创内容未经授权不得随意使用转载请联系小编并注明来源。 1、问题描述
有时我们在导入导出数据时需要对数据进行处理来满足业务上的数据需求此时需要使用控制文件配合导数工具来满足业务上不同数据的需求。
2、控制文件模板
langjava(列名 字节偏移位置(可选) 预处理函数 映射定义(可选),列名 字节偏移位置(可选) 预处理函数 映射定义(可选),列名 字节偏移位置(可选) 预处理函数 映射定义(可选)
);简单示例
langjava
servermysql/oracle
(c1 nvl(c1,not null) map(field_position),c2 none map(field_position)
);参数说明
field_position为导入的数据文件中预处理数据的列位置。控制文件的命名规范table_name.ctl大小写与数据库中保持一致。控制文件的内容要求列名的顺序与表中定义的列顺序保持一致且列名大小写与表中的列名大小写保持一致。
3、使用案例
3.1、测试数据
cat /data/test/TABLE/test.dat
1##oceanbase##2023-01-12 15:00:00.0##1##ob##1##ob
2##oceanbase##2023-01-12 15:00:00.0##2##ob##2##ob
3##oceanbase##2023-01-12 15:00:00.0##3##ob##3##obcreate table test01 (
id int(10) not null primary key,
name varchar(10),
time timestamp not null default 1971-01-01 01:01:01,
blank varchar(255) null
);create table test02 (
id int(10) not null primary key,
name varchar(10) not null,
time timestamp not null,
bar varchar(255) default null,
blank varchar(255) default null,
line varchar(255) default null,
mark varchar(255) default null,
test varchar(255) not null
);3.2、案例1
表列少于文本列表全列导入。
控制文件
vi /data/test01.ctl
langjava(
id none map(1),
name none map(2),
time none map(3),
blank none map(5)
);导入语句
./obloader -h 10.186.60.94 -P 2883 -u root -p rootroot \
-c ywob -t mysql_yw_tent -D ywdb --table test01 --cut \
-f /data/test/TABLE/test.dat --log-path /data/ --external-data \
--replace-data --column-splitter ## --ctl-path /data/test01.ctl输出结果
All Dump Tasks Finished:
----------------------------------------------------------------------------------------------------No.# | Type | Name | Count | Status
----------------------------------------------------------------------------------------------------1 | TABLE | test01 | 3 | SUCCESS
-------------------------------------------------------------------------可以看到是成功的。此时我们进库再进行select查询数据进行验证可以看到的确是成功的。
3.3、案例2
表列少于文本列表部分列导入。
控制文件
vi /data/test01.ctl
langjava(
id none map(1)
);导入数据可以看到报错信息
Error:Field id doesnt have a default value修改控制文件
vi /data/test01.ctl
langjava(
id none map(1),
name none map(2)
);此时再导入是成功的。
说明
插入部分列时需要为插入的每列在参数文件中指定对应的文本列。not null列必须有对应的插入数据或者是有缺省值。
3.4、案例3
表列多于文本列全列导入。
控制文件
vi /data/test02.ctl
langjava(
id none map(1),
name none map(2),
time none map(3),
bar none map(4),
blank none map(5),
line none map(6),
mark none map(7)
);导入语句
./obloader -h 10.186.60.94 -P 2883 -u root -p rootroot \
-c ywce -t mysql_yw_tent -D ywdb --table test02 --cut \
-f /data/test/TABLE/test.dat --log-path /data/ --external-data \
--replace-data --column-splitter ## --ctl-path /data/test02.ctl输出结果
All Dump Tasks Finished:
----------------------------------------------------------------------------------------------------No.# | Type | Name | Count | Status
----------------------------------------------------------------------------------------------------1 | TABLE | test02 | 3 | SUCCESS
----------------------------------------------------------------------------------------------------可以看到是成功的。但是今天在另一个同版本的OB环境下意外的发现了一个怪事竟然报错了
Error: Column count doesnt match value count at row 1报错信息列数不匹配。
根据这种情况进行分析发现JDK版本不一致。并且可以看到导入的数据文件比表结构少一列数据文件以“##”作为列分隔符并且最后一列结尾没有分隔符。
解决
方式1修改控制文件
vi /data/test02.ctl
langjava(
id none map(1),
name none map(2),
time none map(3),
bar none map(4),
blank none map(5),
line none map(6),
mark none map(7),
test none map(1)
);方式2修改表结构最后一个字段可以为null。
方式3修改数据文件在最后面添加‘##’后缀。
3.5、在使用“obdumper控制文件”导出数据时也有可能会出现该报错信息
Error: Column count doesnt match value count at row 1可能的原因数据库名大小写敏感即数据库中的库名是小写但是导出命令中写成了大写导致控制文件中的配置内容不生效。
补充
其实还可以使用SUBSTR(char,position[,length ])进行截取处理数据
示例
SUBSTR(abc,0,3)小建议
数据导入后进行简单查看每个字段导入的数据是否是对应的。可能存在某些情况下数据导入了但实际数据和字段并没有对齐可能只是恰巧数据能存入对应字段。以及查看中文是否正常显示。