一、 数据类型兼容性
通常异构数据库移植的工作量繁重。这些工作量主要来源于:在数据类型、SQL语言、PL/SQL语言、甚至客户端应用编程接口等诸多方面对两个数据库所进行的、大量的语法或功能的对齐处理。本节对不同数据类型做对比说明
二进制数据类型
Netezza
KADB
备注
VARBINARY(n)
支持
支持
通过varbit类型支持
ST_GEOMETRY(n)
支持
支持
通过PostGIS支持
字符数据类型
Netezza
KADB
备注
Fixed length, character(n) (alias char(n))
支持
最大长度64000
支持
最大长度10485760
通过char [ (n) ]类型支持
Variable length, character varying(n) (alias varchar(n))
支持
最大长度64000
支持
最大长度10485760
通过varchar [ (n) ]支持
Fixed length, Unicode (alias nchar(n))
支持
最大长度16000
可以用char [ (n) ]替代
Variable length, Unicode (alias nvarchar(n))
支持
最大长度16000
可以用varchar [ (n) ]替代
精确数字类型
Netezza
KADB
备注
byteint (alias int1)
支持
1字节,-128~127
支持
可以用smallint替代
-32,768~32,767
smallint (alias int2)
支持
2字节,-32,768~32,767
支持
integer (alias int and int4)
支持
4字节,-2,147,483,648~ 2,147,483,647
支持
bigint (alias int8)
支持
8字节,-9,223,372,036,854,775,808 ~9,223,372,036,854,775,807
支持
numeric(p, s)
支持
支持
使用numeric [ (p, s) ]的别名decimal [ (p,
s) ]
numeric§
支持
使用numeric [ § ]的别名decimal [ § ]
numeric
支持
使用numeric的别名decimal
decimal
支持
非精确数字类型
Netezza
KADB
备注
float§
支持
支持
可以用decimal(p)替代
real
支持
相当于float(6)
支持
double precision
支持
支持
逻辑数字类型
Netezza
KADB
备注
boolean (alias bool)
支持
取值为true(t)或者false(f)
支持
时间类型
Netezza
KADB
备注
date
支持
支持
time
支持
支持
ime with time zone (alias timetz)
支持
支持
timestamp
支持
支持
interval (alias timespan)
支持
支持
numeric(6,0)
支持
时间跨度,例如:010521代表1小时5分21秒
不支持
numeric(8,0)
支持
不支持
numeric(14,0)
numeric(15,1)
numeric(16,2)
numeric(17,3)
numeric(18,4)
numeric(19,5)
numeric(20,6)
支持
例如:类型为numeric(17,3)的00017355018391999,表示1年73个月55天1小时83分钟91.999秒
不支持
二、SQL语法差异
MERGE INTO 语句(不支持)
MERGE INTO 语句根据与源表连接的结果,对目标表进行插入和更新操作,通常用来实现表同步。Netezza的MERGE INTO语法如下所示:
MERGE INTO
target_table
[ [ AS ]
target_alias
[ (
column_alias_list
) ] ]
USING
source_table
[ [ AS ]
source_alias
[ (
column_alias_list
) ] ]
ON
matching_condition
when_condition_then_action
[, …]
[ ELSE IGNORE ]
KADB不支持MERGE INTO 语句。
Create table语句
Netezza数据库表的分布键由1到4个列组成,并通过关键字DISTRIBUTE ON指定,支持的数据分布包括:HASH、RANDOM。使用关键字ORGANIZE ON可以将1到4个列组成一个簇,同一个簇中的列物理上保存在一起。
KADB除支持Netezza表的分布键特性外,还支持复制表(可以将数据量较小的维度表复制到集群中的每一个计算节点上,加快访问速度)和表分区功能(表按照分布键分布到计算节点中,在每一个计算节点上使用表分区将局部数据二次分组)
表的访问方式
Netezza支持表的跨库访问特性,可以使用下面的语法访问位于不同数据库中的表:
database.schema.table
KADB不直接支持表的跨库访问,访问表的语法为:
database.table
GROOM TABLE语句
Netezza使用GROOM TABLE命令回收表中的过期数据并将delete语句影响的数据从磁盘上回收,在命令执行期间允许其他会话访问表,语法为:
GROOM TABLE
例如:
MYDB.SCH1(USER)=> GROOM TABLE
RECORDS ALL;KADB可以使用命令VACUUM命令达到同Netezza一样的功能,语法如下:
VACUUM [({ FULL | FREEZE | VERBOSE | ANALYZE } [, …])] [table [(column
[, …] )]]
例如:
VACUUM ANALYZE;
事务
数据库使用事务保证数据的完整性,处于同一事务的SQL语句要么都成功执行,要么都不执行。Netezza唯一实现了ANSI定义的4中隔离级别中的Serializable隔离级别。KADB实现了4种隔离级别:
Read committed
Read uncommitted
支持下面的事务语法:
BEGIN、START TRANSACTION开启一个事务
END、COMMIT提交一个已经开启的事务
ROLLBACK回滚事务中所作的所有操作,恢复数据到事务开始前的状态
SAVEPOINT在事务中标记一个锚点,支持部分事务回滚
ROLLBACK TO SAVEPOINT回滚一个事务到标记的位置.
RELEASE SAVEPOINT 释放事务中使用SAVEPOINT标记的锚点位置
Repeatable read
Serializable
迁移方案
IBM datastage工具迁移
迁移步骤
配置ETL工具的数据源端(Netezza)连接,按照表梳理的结果配置表的迁移(迁移涉及到拉链表和增量表)
配置ETL工具的数据目标端(KingbaesMPP)连接
配置迁移作业
按照第6章的数据校验方案进行迁移后的数据校验
方案存在问题及解决
使用ETL工具可能存在的数据不一致问题:
文本乱码问题
数字精度问题
迁移效率问题
对于问题1、2,可以通过第6章的数据校验方案解决。
对于问题3,需要测试估算Datastage在现场硬件配置的情况下实际的迁移效率,评估是否能在规定的迁移时间窗口内完成迁移。同时对需要迁移的数据做梳理统计,将表分批迁移。首先,迁移保证应用运行必须的数据,在不影响应用运行的前提下,逐步将其他历史数据做迁移。对于增量表,按天为单位迁移最近的数据,历史数据可以逐步追加迁移。
nzsql的-o参数导出文本迁移
迁移步骤
使用Netezza的nzsql工具将表的数据导出为文本,例如
nzsql -t -d iss_testdb -u portal -pw portal -o ‘zb.txt’ -c “SELECT …… FROM ZB_METRICS” -F ‘|’
为了提高效率,多个表的导出可以写成脚本的方式进行,通过脚本控制导出任务的并发
将导出的数据拷贝到加载机
在KingbaesMPP数据库中创建表,选择合适的分布方式
使用批量加载工具gpload从加载机中加载数据到KingbaesMPP中,为了提高效率,多个表的加载可以写成脚本的方式进行,通过脚本控制加载任务的并发
按照第6章的数据校验方案进行迁移后的数据校验
方案存在问题及解决
使用nzsql导出表的数据为文本的方式存在下述的问题:
文本乱码问题
数字精度问题
迁移效率问题
对于问题1、2,可以通过第6章的数据校验方案解决。
对于问题3,需要测试估算在现场硬件配置的情况下实际的迁移效率,评估是否能在规定的迁移时间窗口内完成迁移。同时对需要迁移的数据做梳理统计,将表分批迁移。首先,迁移保证应用运行必须的数据,在不影响应用运行的前提下,逐步将其他历史数据做迁移。对于增量表,按天为单位迁移最近的数据,历史数据可以逐步追加迁移。
为了提高导出和导入的效率,在测试的基础上把数据导出/导入的步骤脚本化,通过脚本控制导出/导入的并发任务数。
Netezza外部表导出文本迁移
迁移步骤
创建Netezza外部表,例如:
CREATE EXTERNAL TABLE extemp SAMEAS emp USING (DATAOBJECT
(’/tmp/emp.dat’));
将需要迁移的表数据通过外部表卸载为文本文件
INSERT INTO extemp SELECT * FROM emp;
将导出的数据拷贝到加载机
在KingbaesMPP数据库中创建表,选择合适的分布方式
使用批量加载工具gpload从加载机中加载数据到KingbaesMPP中
为了提高迁移效率可以将上述的导出/导入步骤脚本化,并通过脚本控制数据导出/导入的并发。
方案存在问题及解决
使用外部表导出表的数据为文本的方式存在下述的问题:
使用Netezza外部表可能导致产品本身的bug,造成数据库宕机
文本乱码问题
对于问题2、3,可以通过第6章的数据校验方案解决。
对于问题4,需要测试估算在现场硬件配置的情况下实际的迁移效率,评估是否能在规定的迁移时间窗口内完成迁移。同时对需要迁移的数据做梳理统计,将表分批迁移。首先,迁移保证应用运行必须的数据,在不影响应用运行的前提下,逐步将其他历史数据做迁移。对于增量表,按天为单位迁移最近的数据,历史数据可以逐步追加迁移。
为了提高导出和导入的效率,在测试的基础上把数据导出/导入的步骤脚本化,通过脚本控制导出/导入的并发任务数。
对于问题1,目前缺乏原厂技术支持的情况下,只能在测试过程中减小导出工作对源数据库的压力。另外建议在数据库运行压力低峰时执行导出任务,并做好数据库宕机恢复预案。
数字精度问题
迁移效率问题
————————————————
版权声明:本文为CSDN博主「littlegirll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/littlegirll/article/details/120688286