数据迁移问题
数据包含行分隔符
- 默认的行分隔符为\n(Linux)或\r\n(Windows)。对于从Windows系统生成的数据需要在Linux系统导入数据时,可以使用dos2unix工具删除\r。
- 对于需要导入数据的系统,如果导入程序只支持逐行解析数据并导入,则需要在生成数据时,对数据中的换行符进行转义或删除。对字符进行转义会使数据产生膨胀,在导入数据时,可根据实际情况对目标字段进行加长处理。
- 对于一些数据库系统,通过定义一些规则来解决数据中包含换行符问题,如GBase 8s使用在换行符前增加一个\表示这行数据未完成,下一行仍然是本行数据的延续,来解决数据中包含换行符的问题。基于特定规则的换行符处理方式,只能在本系统内使用,无法提供数据给第三方系统。
- 部分厂商采用自定义换行符方法,解决数据中包含\n问题。用户可以指定不可见的二进制字符作为数据的换行符。
数据包含列分隔符
- 用户常指定一个字符,做为列数据的分隔符,如逗号或管道符。对于数据中全部为数值字段的数据,这种方式非常有效和高效。
- 对于迁移的数据包含文本数据时,数据中可能包含任意的单个可见字符,指定单个字符作为列分隔符时,容易出现部分数据无法导入现象。通常迁移工具需要支持转义,将数据中的列分隔符进行转义,以区别数据中的列分隔符和实际的列分隔符。
- 一些工具支持不可见字符或多个字符一起作为列分隔符。这种方案通常不需要对数据中的字符进行转义处理,适用于不同数据库系统间的数据迁移。
数据中的日期时间格式不匹配
| 格式化符 | 说明 |
|---|---|
| %a | 星期的短格式表示 |
| %A | 星期的完整格式表示 |
| %b | 月份的短格式表示 |
| %B | 月份的完整格式表示 |
| %C | 世纪的表示,通常是年值除以100后的整数部分 |
| %d | 天(01-31) |
| %D | 相当于格式:%m/%d/%y |
| %e | 天(1-31) |
| %h | 和%b相同 |
| %H | 小时(00-24) |
| %iy | 两位年(00-99) |
| %iY | 四位年(0000-9999) |
| %m | 月(01-12) |
| %M | 分钟(00-59) |
| %n | 换行符 |
| %S | 秒(00-59) |
| %t | 制表符 |
| %w | 星期的数字表示(0-6) |
| %y | 两位年(00-99) |
| %Y | 四位年(0000-9999) |
汉字乱码
- 不同的汉字编码格式,是产生乱码的主要原因。
- 数据截断可能导致部分数据产生乱码。
数据迁移方法
数据迁移工具对比
| 数据迁移方法 | 运行方式 | 数据格式 | 数据范围 | 数据用途 |
|---|---|---|---|---|
| unload/load | SQL | 文本数据 | 单表 | 自用/第三方 |
| dbexport/dbimport | 命令行 | 文本数据 | 库 | 自用 |
| dbload | 命令行 | 文本数据 | 多表 | 自用 |
| onunload/onload | 命令行 | 二进制数据 | 库/表 | 自用 |
| external table | SQL | 文本数据 | 单表 | 自用/第三方 |
unload/load
- unload 语法
unload to 'file_name' [delimiter 'delimiter_string']
select <* | columns> from <table_name | synonym_name | view_name>;
file_name: 保存数据的文件名,可以为全路径或者相对路径;
delimiter: 定义数据列分隔符,为一个或多个字符,默认为'|';
columns: 查询的字段列表;
- load 语法
load from 'file_name' [delimiter 'delimiter_string']
insert into table_name | synonym_name| view_name [(columns)];
file_name: 导入的数据文件,可以为全路径或者相对路径文件名;
delimiter: 定义数据列分隔符,为一个或多个字符,默认为'|';
columns: 导入表的字段列表,默认为数据库表的字段的顺序;
dbload
- dbload 语法
dbload [-d db_name] [-c cmd_file] [-l log_file] [-e errors] [-n num_rows] [-i i_skip] [-s] [-p] [-r | -k] [-X] db_name: 指定要加载数据的数据库名称 cmd_file: 指定包含加载命令的文件路径 log_file: 指定日志文件,其中记录不能正确加载的数据 errors: 指定最多可以有多少行数据错误,超过指定的行数后,加载任务失败 num_rows: 指定多少条记录执行一次提交 s: 指定只做语法检查,不进行实际的数据加载 i_skip: 指定跳过多少行数据,再进行加载,可用于跳过数据中的标题部分 r: 加载数据时,不对表加锁 k: 加载数据时,对表加排它锁
- command file 语法
file 'file_name' delimiter 'delimiter_string' nfields
insert into table_name [(col1,col2,...) values (f01,f02,…)]
file_name: 指定要导入的文件名称,可以为绝对路径和相对路径。
delimiter_string: 数据文件使用的列分隔符。
nfields: 数据文件中,每行的列数。
table_name: 要导入的表的名称。
col1,col2...: 表的列名称,多个列用逗号分隔。
f01,f02...: 数据文件中的列数据编号,从01开始编号,多个编号用逗号分隔。
dbexport/dbimport
- dbexport 语法
dbexport <database> [-X] [-c] [-q] [-d] [-ss [-si]] [-ext] [{ -o <dir> | -t <tapedev> -b <blksz> -s <tapesz> [-f <sql-command-file>] }] [-nw] [-no-data-tables[=table name{,table name}]] [-no-data-tables-accessmethods[=access method name{,access method name}]] database: 指定要导出全部表数据的数据库名称 no-data-tables: 指定哪些表不导出数据 o: 指定导出的数据保存在哪个操作系统的目录中 ss: 测试是否对分片表有特殊作用
- dbimport 语法
dbimport <database> [-X] [-c] [-q] [-ext] [-d <dbspace>] [-l [{ buffered }] [-ansi]] [-ci] [-nv] [-D] [{ -i <dir> | -t <tapedev> [ -b <blksz> -s <tapesz> ] [-f <script-file>] }] database: 指定要导入全部表数据的数据库名称 d: 指定数据库导入到哪个数据库空间中 nv: 不对引用约束进行校验 i: 指定要导入数据所在的目录
onunload/onload
- onunload 语法
onunload [-l] [-t <tape_device>] [-b <block size>] [-s <tape size>] <db_name>[:[<owner>.]<table_name>] tape_device: 保存数据的磁带设备。当使用磁盘时,需创建一个空文件并指定。 db_name: 要导出数据的数据库名称。如果不指定表名称,则导出全库数据。 table_name: 当需要导出表数据时,指定表名称。 说明: 参数b,参数s和参数l主要用于使用磁带设备,当使用磁盘设备时,可以忽略。 导出数据为二进制格式,只能用于兼容硬件上的兼容数据库版本的数据导入。 该方式使用限制较严格,真实场景中使用较少。
- onload 语法
onload [-l] [-t <tape_device>] [-b <block size>] [-s <tape size>] [-d <data_dbs>] <db_name>[:[<owner>.]<table_name>] [{-i <old index name> <new index name>}] [{-fd old-DBspace-name new-DBspace-name}] [{-fi index-name old-DBspace-name new-DBspace-name}] [{-c <old constraint name> <new constraint name>}] tape_device: 保存数据的磁带设备或操作系统文件目录。 data_dbs: 指定数据导入时,使用的数据库空间。 db_name: 指定导入的数据库名称。 table_name: 指定导入的表名称。
external table
- external table 语法
create external table table_name([column definition | sameas table_template])
using (
datafiles ('disk:/textfile'),
format 'delimited',
delimiter 'delimiter_string'
);
table_name: 要创建的外部表名称。
table_template: 可以指定一个模板,以该表的列定义创建一个外部表。
datafiles: 指定外部表使用的数据文件。
format:
delimiter:
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




