首页 > 数据库 > 国内数据库 > 技术分享 | OceanBase 数据处理之控制文件
作者:杨文
DBA,负责客户项目的需求与维护,会点数据库,不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。
本文来源:原创投稿
lang=java(
列名 字节偏移位置(可选) "预处理函数" 映射定义(可选),
列名 字节偏移位置(可选) "预处理函数" 映射定义(可选),
列名 字节偏移位置(可选) "预处理函数" 映射定义(可选)
);
简单示例:
lang=java
server=mysql/oracle
(
c1 "nvl(c1,'not null')" map(field_position),
c2 "none" map(field_position)
);
field_position 为导入的数据文件中预处理数据的列位置。
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@##ob
create 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
);
控制文件:
vi /data/test01.ctl
lang=java(
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
---------------------------------------------------------------------------------------------------
控制文件:
vi /data/test01.ctl
lang=java(
id "none" map(1)
);
导入数据,可以看到报错信息:
Error:"Field 'id' doesn't have a default value"
修改控制文件:
vi /data/test01.ctl
lang=java(
id "none" map(1),
name "none" map(2)
);
说明:
插入部分列时,需要为插入的每列,在参数文件中指定对应的文本列。
控制文件:
vi /data/test02.ctl
lang=java(
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 doesn't match value count at row 1
方式1:修改控制文件:
vi /data/test02.ctl
lang=java(
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)
);
Error: Column count doesn't match value count at row 1
示例:
SUBSTR('abc',0,3)小建议:
数据导入后进行简单查看每个字段导入的数据是否是对应的。可能存在某些情况下数据导入了,但实际数据和字段并没有对齐,可能只是恰巧数据能存入对应字段。以及查看中文是否正常显示。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024923/viewspace-2936163/ ,如需转载,请注明出处,否则将追究法律责任。