华为云用户手册

  • 使用场景 传统数据库集群中,用户数据明文保存在行存/列存文件中,集群的维护人员或者恶意攻击者可在OS层面绕过数据库的权限控制机制或者窃取磁盘直接访问用户数据。GaussDB(DWS)通过对接华为云数据加密服务的密钥管理KMS,可实现数据的透明加密,保障用户数据安全。 GaussDB(DWS)数据库级透明加密,每个GaussDB(DWS)集群有一个CEK,每个数据库单独配置DEK加密保护,DEK使用CEK加密保护,保存在GaussDB(DWS)集群侧。密钥通过KMS服务申请和加解密,加密算法通过配置项统一配置。目前支持AES、SM4算法。 当前支持数据库级别的透明加密,在创建集群的时候进行加密配置。 了解更多请参见数据库加密简介。
  • 创建Region内集群级容灾 前提条件 集群处于可用状态或者非均衡状态才可进行创建容灾操作。 操作步骤 登录GaussDB(DWS)管理控制台。 在左侧导航栏中,单击“容灾管理”。 在“容灾管理”页面,单击“创建容灾”。 选择“容灾类型”。 “容灾类型”:选择“Region内容灾”类型。 “容灾名称”:容灾名称在4位到64位之间,不区分大小写,必须以字母开头,可以包含字母、数字、中划线或者下划线,不能包含其他的特殊字符。 选择生产集群信息。 “集群名称”:提供下拉列表选择已创建的生产集群。 “可用分区”:生产集群的可用区,用户在选择生产集群后自动显示其对应的可用区信息。 选择灾备集群信息。 “可用分区”:选择灾备集群工作区域下的关联可用分区。 灾备集群可用分区支持与生产集群可用分区相同,3AZ集群在其中的任一AZ都可以作为灾备集群选中。 “集群名称”:用户选择灾备集群可用分区后,会自动过滤出符合逻辑同构要求的灾备集群列表,如果没有符合条件的灾备集群,可单击“创建灾备集群”创建与生产集群配置相同的集群作为灾备集群。 设置高级配置。选择“自定义”时,可以设置以下高级配置参数,若选择“默认配置”,以下参数将使用它们的默认值。 “容灾同步周期”:容灾同步周期决定了生产集群间隔多长时间向灾备集群同步增量数据,请结合实际业务数据量设置合理值。 容灾同步周期默认值为30分钟。 单击“确定”,开始为集群创建容灾。 此时容灾的“容灾状态”显示为“创建中”,创建需要时间请耐心等待。创建成功后“容灾状态”显示为“未启动”。
  • 将集群迁入或迁出企业项目 一个GaussDB(DWS) 集群只能关联一个企业项目。当集群创建成功后,可以在企业管理的控制台上,执行迁出操作,将GaussDB(DWS) 集群从当前所属的企业项目中迁出到另一个企业项目中;或者执行迁入操作,在指定的企业项目中迁入另一个企业项目中的GaussDB(DWS) 集群。迁入迁出后,GaussDB(DWS) 集群与新的企业项目进行关联,GaussDB(DWS) 集群与原企业项目的关联关系将被自动解除。 迁入的详细操作,请参考《企业管理用户指南》的为企业项目迁入资源。 迁出的详细操作,请参考《企业管理用户指南》的迁出企业项目资源。
  • 绑定企业项目 在GaussDB(DWS) 中,用户可以在创建集群时为集群选择所属的企业项目,从而将GaussDB(DWS) 集群与企业项目进行关联,详情请参见创建DWS 2.0集群。在选择“企业项目”的下拉列表中,将显示用户在企业项目服务中已创建的项目。系统还内置了一个缺省的企业项目“default”,如果用户没有为集群选择企业项目,将使用缺省项目“default”。 注意,目前企业项目服务仍处于公测期间,仅允许有公测权限的用户设置企业项目,普通用户无法看到企业项目相关信息。 在集群创建过程中,如果集群与企业项目绑定成功,则集群创建成功,如果绑定失败,系统会发送告警,集群就会创建失败。 在为GaussDB(DWS) 集群创建快照时,会同时保存集群与企业项目的关联关系,在恢复集群时,也会恢复企业项目的关联关系。 当删除GaussDB(DWS) 集群时,GaussDB(DWS) 集群与企业项目的关联关系就会被自动删除。
  • 查看企业项目 在集群创建成功后,您可以在集群列表和集群详情页面查看集群关联的企业项目。用户只能查询到有访问权限的项目下的集群资源。 在集群管理页面的集群列表中,查看集群所属的企业项目。 图1 查看企业项目 在集群列表中,找到所需要的集群,然后单击集群名称,进入“集群详情”页面,可以查看与集群关联的企业项目。单击企业项目的名称,可以跳转到企业管理的控制台页面对该企业项目进行查看或编辑。 图2 查看集群的企业项目 同时,在企业管理的控制台上,查询指定项目中的资源列表时,也可以查询到GaussDB(DWS) 服务的资源。
  • 集群升级 前提条件 8.1.1及以上集群版本支持用户自助通过console下发集群升级操作。 操作步骤 登录GaussDB(DWS)管理控制台。 在集群列表中单击指定集群名称。 进入“集群详情”页面,切换至“升级管理”页签。 根据想要升级的操作,在“类型”一栏中选择升级或热补丁。 在升级管理页面,通过目标版本下拉菜单选择集群要升级的版本。 图2 升级集群 在升级操作前如果集群满足巡检条件,需单击“巡检”按钮先完成一次巡检,并保证巡检检查通过,通过后可进行下一步变更操作,详情请参见查看巡检。 集群安装热补丁后无法建立容灾。 单击“升级”按钮,根据提示单击“确定”按钮,下发升级操作。 查看集群是否升级成功: 如果集群升级成功:8.1.3及以上集群版本,集群升级任务完成后进入业务观察期,若用户验证业务无问题,通过升级管理页面单击“提交”按钮,完成集群升级;如果用户验证集群使用性能等有影响,可通过集群升级页面单击“回滚”按钮,下发升级回退操作。 8.1.3以前集群版本下发升级任务后,完成集群升级前不支持回滚或提交操作。 用户下发升级任务成功后,如果没有进行提交操作,则在未提交版本期间会产生wlm线程占用系统存储空间并对性能有一定影响。 图3 集群升级成功 如果集群升级失败:可单击“回滚”操作,回退到原集群版本;或单击“重试”按钮重复下发升级操作。 图4 集群升级失败
  • 升级版本说明 集群版本说明如下图所示: 图1 版本说明 服务补丁升级:表示集群版本X.X.X最后一位数字的升级更新,例如,集群版本从1.1.0升级到1.1.1。 持续时间:整个升级过程将花费不到10分钟。 业务影响:在此期间,如果升级源版本至8.1.3及以上版本,则支持在线补丁,补丁升级期间不要求用户停止业务,业务存在秒级闪断。如果在8.1.3以下版本业务会中断1至3分钟,建议在业务低峰期进行。 服务升级:表示集群版本X.X.X前面两位数字的升级更新,例如,集群版本从1.1.0升级到1.2.0。 持续时间:整个升级过程将花费不到30分钟。 业务影响:在此期间,如果升级源版本至8.1.1及以上版本,则支持在线升级,升级期间不要求用户停止业务,业务存在秒级闪断,建议在业务低峰期进行。 热补丁升级:表示在当前集群版本的基础上扩展一位版本号(格式为0001-9999)进行升级操作。 持续时间:单个热补丁升级过程中花费不到10分钟。 业务影响:热补丁升级过程中不影响业务,卸载热补丁后当前热补丁修复的问题可能再次出现。
  • 示例 创建分区表customer_address: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 DROP TABLE IF EXISTS customer_address; CREATE TABLE customer_address ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE(ca_address_sk) ( PARTITION P1 VALUES LESS THAN(2450815), PARTITION P2 VALUES LESS THAN(2451179), PARTITION P3 VALUES LESS THAN(2451544), PARTITION P4 VALUES LESS THAN(MAXVALUE) ); 清理当前数据库中的所有表: 1 VACUUM; 仅回收表customer_address分区P2的空间,不更新统计信息: 1 VACUUM FULL customer_address PARTITION(P2); 回收表customer_address空间,并更新统计信息: 1 VACUUM FULL ANALYZE customer_address; 清理当前数据库中的所有表并收集查询优化器的统计信息: 1 VACUUM ANALYZE; 仅清理特定表reason: 1 VACUUM (VERBOSE, ANALYZE) customer_address;
  • 参数说明 FULL 选择“FULL”清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。 FULL选项还可以带有COMPACT参数,该参数只针对HDFS表,指定该参数的VACUUM FULL操作性能要好于未指定该参数的VACUUM FULL操作。 COMPACT和PARTITION参数不能同时使用。 使用FULL参数会导致统计信息丢失,如果需要收集统计信息,请在VACUUM FULL语句中加上analyze关键字。 FREEZE 指定FREEZE相当于执行VACUUM时将GUC参数vacuum_freeze_min_age设为0。 VERBOSE 为每个表打印一份详细的清理工作报告。 ANALYZE | ANALYSE 更新用于优化器的统计信息,以决定执行查询的最有效方法。 table_name 要清理的表的名称(可以有模式修饰)。 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。 column_name 要分析的具体的字段名称。 取值范围:要分析的具体的字段名称。缺省时为所有字段。 PARTITION HDFS表不支持PARTITION参数,PARTITION参数不能和COMPACT同时使用。 PARTITION参数和COMPACT同时使用会报错:COMPACT can not be used with PARTITION. partition_name 要清理的表的分区名称。缺省时为所有分区。 DELTAMERGE 只针对HDFS表,将HDFS表的delta table中的数据转移到主表存储上。对HDFS表而言,当delta表中数据量小于六万行,则不作迁移,只有在大于或者等于六万行数据时,将delta表中所有数据迁移到HDFS上,并通过truncate清理delta表的存储空间。 HDFSDIRECTORY 只针对HDFS表,删除HDFS表在HDFS存储上表目录下的空值分区目录。
  • 注意事项 如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的那个表。 要对一个表进行VACUUM操作,通常用户必须是表的所有者,被授予了指定表VACUUM权限的用户或者被授予了gs_role_vacuum_any角色的用户,系统管理员默认拥有此权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。 VACUUM不能在事务块内执行。 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好的选择。 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。 VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。 如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。 语法格式中含有带括号的选项列表时,选项可以通过任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。 VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。 VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。 VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。 如果有长查询访问系统表,此时执行VACUUM FULL,长查询可能会阻塞VACUUM FULL连接访问系统表,导致连接超时报错。 对列存分区表执行VACUUM FULL,会同时锁表和锁分区。 并发VACUUM FULL系统表可能会导致本地死锁。 对表执行VACUUM FULL操作时会触发表重建(表重建过程中会先把数据转储到一个新的数据文件中,重建完成之后会删除原始文件),当表比较大时,重建会消耗较多的磁盘空间。当磁盘空间不足时,要谨慎对待大表VACUUM FULL操作,防止触发集群只读。
  • 语法格式 回收空间并更新统计信息,关键字顺序必须按语法显示的顺序给出。 1 2 VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ]; 仅回收空间,不更新统计信息。 1 VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ]; 回收空间并更新统计信息,且对关键字顺序有要求。 1 2 VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ]; 针对HDFS表,将delta table中的数据转移到主表存储。 1 VACUUM DELTAMERGE [ table_name ]; 针对HDFS表,删除HDFS表在HDFS存储上的空值分区目录。 1 VACUUM HDFSDIRECTORY [ table_name ];
  • 示例 创建一个GBK编码的数据库music(本地环境的编码格式必须也为GBK): 1 CREATE DATABASE music ENCODING 'GBK' template = template0; 创建数据库music2,并指定所有者为jim: 1 2 CREATE USER jim PASSWORD "{Password}"; CREATE DATABASE music2 OWNER jim; 用模板template0创建数据库music3,并指定所有者为jim: 1 CREATE DATABASE music3 OWNER jim TEMPLATE template0; 创建兼容ORA格式的数据库: 1 CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';
  • 语法格式 1 2 3 4 5 6 7 8 9 CREATE DATABASE database_name [ [ WITH ] { [ OWNER [=] user_name ] | [ TEMPLATE [=] template ] | [ ENCODING [=] encoding ] | [ LC_COLLATE [=] lc_collate ] | [ LC_CTYPE [=] lc_ctype ] | [ DBCOMPATIBILITY [=] compatibilty_type ] | [ CONNECTION LIMIT [=] connlimit ]}[...] ];
  • gds.conf参数说明 表1 gds.conf配置说明 属性 说明 取值范围 name 标识名。 - ip 监听ip地址。 IP需为合法IP地址。 IP的默认值:127.0.0.1 port 监听端口号。 取值范围:1024~65535,正整数。 默认值:8098。 data_dir 数据文件目录。 - err_dir 错误日志文件目录。 默认值:数据文件目录 log_file 日志文件路径。 - host 设置允许连接到GDS的主机IP地址(参数为CIDR格式,仅支持linux系统)。 - recursive 是否递归数据文件目录。 取值范围: true:递归 。 false:不递归。 默认值:false。 daemon 是否以DAEMON(后台)模式运行。 取值范围: true:以DAEMON模式运行。 false:不以DAEMON模式运行。 默认值:false。 parallel 导入工作线程并发数目。 取值范围:0~200,正整数。 默认值:8。
  • 背景信息 GDS的版本需与集群版本保持一致(如:GDS V100R008C00版本与DWS 1.3.X版本配套),否则可能会出现导入导出失败或导入导出进程停止响应等情况。因此请勿使用历史版本的GDS进行导入。 数据库版本升级后,请按照操作步骤中的办法下载GaussDB(DWS)软件包解压缩自带的GDS进行安装配置和启动。在导入导出开始时,GaussDB(DWS)也会进行两端的版本一致性检测,不一致时会在屏幕上显示报错信息并终止对应操作。 GDS的版本号的查看办法为:在GDS工具的解压目录下执行如下命令。 gds -V 数据库版本的查看办法为:连接数据库后,执行如下SQL命令查看。 1 SELECT version();
  • 简介 dws-client是一款基于DWS JDBC实现的高性能、便捷入库工具,用户在使用时必须保证JDBC可以连接。其中使用dws-client入库具备如下优势: dws-client提供对缓存的空间、时间维度的限制,支持攒批提升入库性能,以满足业务在高峰低谷期的入库实时性。 攒批:在实时性要求不严格的场景,对单条数据操作进行缓存,待缓存至多条后批量操作,以提升写入性能。 支持并发入库。 内部实现多种高性能入库方式、主键冲突策略,满足各种场景入库需求。 API方式交互,低门槛使用。 图1 dws-client交互场景
  • 异常处理 异常可分为三类: InvalidException 运行时异常不显示抛出,触发在请求参数无效时。 DwsClientException对所有异常的封装,包含被解析的code以及原始异常。 DwsClientRecordException对DwsClientException的扩展,包含写入异常的数据集合以及对应DwsClientException异常。 异常code对照: public enum ExceptionCode { /** * 无效参数 */ INVALID_CONFIG(1), /** * 连接异常 */ CONNECTION_ERROR(100), /** * 只读 */ READ_ONLY(101), /** * 超时 */ TIMEOUT(102), /** * 连接数过多 */ TOO_MANY_CONNECTIONS(103), /** * 加锁异常 */ LOCK_ERROR(104), /** * 认证失败 */ AUTH_FAIL(201), /** * 已经关闭 */ ALREADY_CLOSE(202), /** * 无权限 */ PERMISSION_DENY(203), SYNTAX_ERROR(204), /** * 内部异常 */ INTERNAL_ERROR(205), /** * 中断异常 */ INTERRUPTED(206), /** * 表未发现 */ TABLE_NOT_FOUND(207), CONSTRAINT_VIOLATION(208), DATA_TYPE_ERROR(209), DATA_VALUE_ERROR(210), /** * 解析不到的异常 */ UNKNOWN_ERROR(500); private final int code; }
  • 详细配置说明 参数 说明 默认值 支持版本 url dws数据库JDBC连接地址。 - 1.0 username dws数据库用户名。 - password dws数据库用户密码。 - connectionMaxUseTimeSeconds 连接最大使用时间(秒),超过该时间会强制关闭当前连接并重新获取;使用COPY_MERGE/COPY_UPSERT时会使用临时表,临时表的schema在连接断开时才会清除,主要用于清除该部分数据。 3600 connectionMaxIdleMs 连接最大空闲时间(毫秒)。 60000 metadataCacheSeconds 元数据缓存时间(秒),为提升性能,会对理论上不怎么变更的数据,例如表结构,该参数用于设置缓存过期时间。 180 retryBaseTime 重试时sleep时间 = retryBaseTime * 次数 + (0~retryRandomTime)毫秒,该参数设置时间基数(毫秒)。 1000 retryRandomTime retryBaseTime重试时sleep时间 = retryBaseTime * 次数 +(0~retryRandomTime)毫秒,该参数设置重试时的随机数范围,该参数主要用于在死锁场景将两个task执行时间错开(毫秒)。 300 maxFlushRetryTimes 执行刷库任务时,最大尝试执行次数。 3 autoFlushBatchSize 后台任务刷库策略:缓存条数大于等于autoFlushBatchSize或者当前时间 - 缓存开始时间大于等于autoFlushMaxIntervalMs,该参数配置 缓存最大条数。 5000 autoFlushMaxIntervalMs 后台任务刷库策略:缓存条数大于等于autoFlushBatchSize或者当前时间 - 缓存开始时间大于等于autoFlushMaxIntervalMs,该参数配置缓存最大时间(毫秒)。 3000 copyWriteBatchSize 在writeMode设置为 AUTO时,在数据量低于copyWriteBatchSize时会使用upsert方式入库,否则根据是否有主键选择copy/copy+ upsert方式入库。 6000 writeMode 数据写入模式: AUTO: 数据量低于copyWriteBatchSize使用UPSERT方式入库,否则使用COPY_UPSERT方式入库。 COPY_MERGE: 有主键使用copy+merge入库。 无主键使用copy入库。 COPY_UPSERT: 无主键使用copy入库。 有主键使用copy + upsert入库。 UPSERT: 无主键使用 insert into。 有主键使用upsert入库。 UPDATE: 使用update where 语法更新数据,若原表无主键可选择指定uniqueKeys,指定字段不要求必须是唯一索引,但非唯一索引可能会影响性能。 COPY_UPDATE: 数据先通过copy方式入库到临时表,通过临时表加速使用update from where方式更新目标数据。 UPDATE_AUTO: 批量小于copyWriteBatchSize使用UPDATE,否则使用COPY_UPDATE。 AUTO conflictStrategy 数据库存在主键时的主键冲突策略: INSERT_OR_IGNORE:主键冲突时忽略新数据。 INSERT_OR_UPDATE:主键冲突时使用新的数据列更新原数据对应列。 INSERT_OR_REPLACE:主键冲突时使用新数据替换原数据,数据库中新数据不包含列设置为null,对于全列更新和INSERT_OR_UPDATE无差异。 INSERT_OR_UPDATE threadSize 执行任务时的并发数量,异步任务中以表为维度提交任务,多表之间可并发;对于同一个表存在对字段列数不同的操作,例如在攒批中存在100条操作 A B C字段、200条操作A B D字段 那么最后会将操作字段一样的归为一类,不同类之间可并发入库,设置该参数可参考这两个场景设置,以提升吞吐。 3 logSwitch 日志开关,开启后会打印比较详细的过程日志,便于在调试或定位问题时开启。 false logDataTables 入库时需要打印数据的表,便于在定位问题时对比数据。 - flushSuccessFunction 数据入库成功后的回调函数。 - errorFunction 后台任务执行失败的回调函数。 - batchOutWeighRatio 为提高整体吞吐,当对autoFlushBatchSize要求不是很严格时,可设置该参数,当往buffer中提交数据时 buffer中数据量 大于 batchOutWeighRatio * autoFlushBatchSize时提交线程将会执行提交入库的任务,该参数用于避免业务线程提交任务,尽量使用后台线程执行提交。 1 tableConfig 对于conflictStrategy、writeMode、copyWriteBatchSize、autoFlushMaxIntervalMs、autoFlushBatchSize、batchOutWeighRatio在多表公用一个client的情况可能需要根据不同表配置不同值,该参数可实现以上参数的表级配置,在未配置的表则生效全局参数。 说明: 注意一旦配置表级参数,其它表级参数也会被设置默认值,必须将其它表级参数也设置上。 - uniqueKeys 该参数为表级参数必须通过tableConfig配置,该参数用于在表中无主键但是有唯一索引时,在入库时使用该参数指定字段做唯一约束,在update场景中该字段不需要是唯一索引或者主键,但upsert场景必须要唯一索引或主键。 - 1.0.3 copyMode 使用copy入库的格式: CSV:将数据拼接成字符串数据用双引号包裹的CSV格式,其中字段间以逗号分割,数据间以换行分割。使用jdbc copy api入库,该方式性能略低于DELIMITER方式,但比较稳定可靠。 DELIMITER:将数据字段使用copy api入库,其中字符间以0X1E分割,数据间以0X1F分割。该方式要求数据不包含分隔符,如包含将报错不能正常入库,且该方式定义null字符串为null数据,如果数据为null字符串将被设置为null。 CSV 1.0.6 caseSensitive 表字段大小写是否敏感。 false 1.0.7 createTempTableMode 在使用copy merge/upsert时,创建临时表方式: AS:使用create temp table *** as select * from *** as 方式创建,该方式支持表中带自增字段的使用,但性能略低。 LIKE:使用create temp table *** like 方式创建,该方式不支持表中带自增字段。 AS 1.0.7 numberAsEpochMsForDatetime 如果数据库字段是时间类型(date\time\timestamp)并且数据源为数字类型,是否将源数据按毫秒时间戳转换为对应时间类型。 说明: 在copy入库场景该参数不生效。 在此版本前该参数为开启状态,且如果数据是数字类型字符串也将视为时间戳。 false 1.0.9 stringToDatetimeFormat 如果数据库字段是时间类型(date\time\timestamp)并且数据源为字符串类型,通过SimpleDateFormat按stringToDatetimeFormat格式转换为日期类型,然后通过日期中的时间戳构造数据库对应类型数据。 说明: 该参数配置即代表开启,如果不需要请勿配置。 null updateAll upsert时set字段是否包含主键。 true 1.0.10
  • 概述 本节描述Teradata Perl文件迁移过程的详细信息。 请使用runDSC.sh或runDSC.bat命令并设置--application-lang=perl,将Perl文件中的Teradata BTEQ或SQL_LANG脚本迁移到兼容Perl文件的GaussDB(DWS)中。迁移Perl文件后,可使用对比工具比较输入和输出文件进行验证。 Perl文件迁移流程如下: 完成前提条件中的步骤。 创建输入文件夹,并将待迁移Perl文件复制到该文件夹。例如:/migrationfiles/perlfiles 执行DSC迁移Perl脚本,并将db-bteq-tag-name设为BTEQ或db-tdsql-tag-name设为SQL_LANG。 DSC从Perl文件中提取BTEQ或SQL_LANG类型脚本。 BTEQ是标签名称,包含一组BTEQ脚本,可以通过perl-migration.properties文件中的db-bteq-tag-name参数来配置。 SQL_LANG也是标签名称,包含Teradata SQL语句,可以通过db-tdsql-tag-name参数来配置。 DSC通过调用Teradata SQL来迁移提取到的SQL脚本。有关Teradata SQL迁移的详细信息,请参见Teradata SQL迁移。 Perl文件嵌入迁移后脚本。 在指定的输出文件夹中创建迁移后的Perl文件。如果未指定输出文件夹,则工具会在输入文件夹内创建一个名为converted的输出文件夹,例如:/migrationfiles/perlfiles/converted。 包含SQL命令的Perl变量也可以通过migrate-variables参数迁移为SQL。 Perl v 5.10.0及以上提供兼容能力。
  • 列 xmax、xmin、left、right、maxvalue为Gauss关键字,这些关键字应全字母大写并加英文双引号("")。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 create table product ( xmax VARCHAR2(20), xmin VARCHAR2(50), left VARCHAR2(50), right VARCHAR2(50), maxvalue VARCHAR2(50) ); 1 2 3 4 5 6 7 8 CREATE TABLE product1 ( "XMAX" VARCHAR2(20), "XMIN" VARCHAR2(50), "LEFT" VARCHAR2(50), "RIGHT" VARCHAR2(50), "MAXVALUE" VARCHAR2(50) );
  • TYPE 将“MDSYS.MBRCOORDLIST”替换为“CLOB”。 Oracle语法 迁移后语法 1 2 3 4 5 create table product_part ( partid VARCHAR2(24), mbrcoords MDSYS.MBRCOORDLIST ); 1 2 3 4 5 CREATE TABLE product_part ( partid VARCHAR2(24), mbrcoords CLOB );
  • 间隔分区 对于间隔分区,应该注释分区。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 9 CREATE TABLE product ( product_id VARCHAR2(20), product_name VARCHAR2(50), manufacture_month DATE ) partition by range (manufacture_month) interval (NUMTODSINTERVAL (1, 'MONTH')) ( partition T_PARTITION_2018_11_LESS values less than (TO_DATE(' 2018-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))); 1 2 3 4 5 6 7 8 9 CREATE TABLE product ( product_id VARCHAR2(20), product_name VARCHAR2(50), manufacture_month DATE ) /*partition by range (manufacture_month) interval (NUMTODSINTERVAL (1, 'MONTH')) ( partition T_PARTITION_2018_11_LESS values less than (TO_DATE(' 2018-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')))*/;
  • 分区(二) 在非分区表中,删除表“ALTER TABLE TRUNCATE PARTITION”中的数据。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 CREATE TABLE product_list ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture vARCHAR2(10) ) partition by list (Year_Manufacture) ( partition PART_2015 VALUES (2011,2012,2013,2014,2015) pctfree 10 initrans 1 , partition PART_2016 VALUES (2016) pctfree 10 initrans 1 , partition PART_2017 VALUES (2017) pctfree 10 initrans 1 , partition PART_2018 VALUES (2018) pctfree 10 initrans 1 , partition PART_2019 VALUES (2019) pctfree 10 initrans 1 , partition PART_2020 VALUES (2020) pctfree 10 initrans 1 , PARTITION PART_unknown VALUES (DEFAULT) ); CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product_list TRUNCATE PARTITION PART_2020; NULL; END; / CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product_list TRUNCATE PARTITION PART_' || V_ID; NULL; END; / 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 CREATE TABLE product_list ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture vARCHAR2(10) ) /*partition by list (Year_Manufacture) ( partition PART_2015 VALUES (2011,2012,2013,2014,2015) pctfree 10 initrans 1 , partition PART_2016 VALUES (2016) pctfree 10 initrans 1 , partition PART_2017 VALUES (2017) pctfree 10 initrans 1 , partition PART_2018 VALUES (2018) pctfree 10 initrans 1 , partition PART_2019 VALUES (2019) pctfree 10 initrans 1 , partition PART_2020 VALUES (2020) pctfree 10 initrans 1 , PARTITION PART_unknown VALUES (DEFAULT) )*/; CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product_list TRUNCATE PARTITION PART_' || V_ID; NULL; END; / CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN /* EXECUTE IMMEDIATE 'ALTER TABLE product_list TRUNCATE PARTITION PART_' || V_ID; */ IF 'PART_' || V_ID = 'PART_2015' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2011,2012,2013,2014,2015); ELSIF 'PART_' || V_ID = 'PART_2016' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2016); ELSIF 'PART_' || V_ID = 'PART_2017' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2017); ELSIF 'PART_' || V_ID = 'PART_2018' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2018); ELSIF 'PART_' || V_ID = 'PART_2019' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2019); ELSIF 'PART_' || V_ID = 'PART_2020' THEN DELETE FROM product_list WHERE Year_Manufacture IN (2020); ELSE DELETE FROM product_list WHERE Year_Manufacture NOT IN (2011,2012,2013,2014,2015,2016,2017,2018,2019,2020); END IF; NULL; END; /
  • SEGMENT CREATION GaussDB不支持SEGMENT CREATION { IMMEDIATE | DEFERRED },因此该语句在迁移后被注释掉,需要设置commentStorageParameter=true。 输入:TABLE,使用SEGMENT CREATION 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE T1 ( MESSAGE_CODE VARCHAR2(50), MAIL_TITLE VARCHAR2(1000), MAIL_BODY VARCHAR2(1000), MAIL_ADDRESS VARCHAR2(1000), MAIL_ADDRESS_CC VARCHAR2(1000) ) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE Test ;
  • 分区(一) 在非分区表中,为表“ALTER TABLE TRUNCATE PARTITION”添加注释。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 CREATE TABLE product_range ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture DATE ) partition by range (Year_Manufacture) ( partition Year_Manufacture values less than (TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) pctfree 10 initrans 1 ); CREATE TABLE product_list ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture vARCHAR2(10) ) partition by list (Year_Manufacture) ( partition P_2020 VALUES (2020) pctfree 10 initrans 1 ); CREATE OR REPLACE PROCEDURE Range_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product TRUNCATE PARTITION PART'||V_ID; NULL; END; / CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product TRUNCATE PARTITION PART'||V_ID; NULL; END; / 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 CREATE TABLE product_range ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture DATE ) partition by range (Year_Manufacture) ( partition Year_Manufacture values less than (TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) pctfree 10 initrans 1 ); CREATE TABLE product_list ( product_id VARCHAR2(20), Product_Name VARCHAR2(50), Year_Manufacture vARCHAR2(10) ) /*partition by list (Year_Manufacture) ( partition P_2020 VALUES (2020) pctfree 10 initrans 1 )*/; CREATE OR REPLACE PROCEDURE Range_test IS V_ID VARCHAR2(10); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE product TRUNCATE PARTITION PART'||V_ID; NULL; END; / CREATE OR REPLACE PROCEDURE List_test IS V_ID VARCHAR2(10); BEGIN /*EXECUTE IMMEDIATE 'ALTER TABLE product TRUNCATE PARTITION PART'||V_ID;*/ NULL; END; /
  • 分区(注释约束) oracle配置参数中“#分区表唯一或主键约束”为“comment_unique”。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE TABLE TBL_ORACLE ( ID Number, Name VARCHAR2(100 BYTE), ADDRESS VARCHAR2(200 BYTE) ) TABLESPACE space1 PCTUSED 40 PCTFREE 0 INITRANS 1 MAXTRANS 255 NOLOGGING PARTITION BY RANGE (ID) ( PARTITION PART_2010 VALUES LESS THAN (10) NOLOGGING, PARTITION PART_2011 VALUES LESS THAN (20) NOLOGGING , PARTITION PART_2012 VALUES LESS THAN (MAXVALUE) NOLOGGING ) ENABLE ROW MOVEMENT; ALTER TABLE TBL_ORACLE ADD CONSTRAINT SAMPLE_PK PRIMARY KEY (ID); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE UNLOGGED TABLE TBL_ORACLE ( ID NUMBER ,Name VARCHAR2 (100) ,ADDRESS VARCHAR2 (200) /*,CONSTRAINT SAMPLE_PK PRIMARY KEY (ID)*/ ) TABLESPACE space1 /*PCTUSED 40*/ PCTFREE 0 INITRANS 1 MAXTRANS 255 PARTITION BY RANGE (ID) ( PARTITION PART_2010 VALUES LESS THAN (10) ,PARTITION PART_2011 VALUES LESS THAN (20) ,PARTITION PART_2012 VALUES LESS THAN (MAXVALUE) ) ENABLE ROW MOVEMENT ;
  • 数据类型 删除数据类型中的BYTE关键字。 Oracle语法 迁移后语法 1 2 3 4 5 6 CREATE TABLE TBL_ORACLE ( ID Number, Name VARCHAR2(100 BYTE), ADDRESS VARCHAR2(200 BYTE) ); 1 2 3 4 5 6 CREATE TABLE TBL_ORACLE ( ID NUMBER ,Name VARCHAR2 (100) ,ADDRESS VARCHAR2 (200) ) ;
  • 分区(注释分区) oracle配置参数中“#分区表唯一或主键约束”为“comment_partition”。 Oracle语法 迁移后语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE TABLE TBL_ORACLE ( ID Number, Name VARCHAR2(100 BYTE), ADDRESS VARCHAR2(200 BYTE) ) TABLESPACE space1 PCTUSED 40 PCTFREE 0 INITRANS 1 MAXTRANS 255 NOLOGGING PARTITION BY RANGE (ID) ( PARTITION PART_2010 VALUES LESS THAN (10) NOLOGGING, PARTITION PART_2011 VALUES LESS THAN (20) NOLOGGING , PARTITION PART_2012 VALUES LESS THAN (MAXVALUE) NOLOGGING ) ENABLE ROW MOVEMENT; ALTER TABLE TBL_ORACLE ADD CONSTRAINT SAMPLE_PK PRIMARY KEY (ID); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE UNLOGGED TABLE TBL_ORACLE ( ID NUMBER ,Name VARCHAR2 (100) ,ADDRESS VARCHAR2 (200) ,CONSTRAINT SAMPLE_PK PRIMARY KEY (ID) ) TABLESPACE space1 /*PCTUSED 40*/ PCTFREE 0 INITRANS 1 MAXTRANS 255 /* PARTITION BY RANGE(ID)(PARTITION PART_2010 VALUES LESS THAN(10) , PARTITION PART_2011 VALUES LESS THAN(20) , PARTITION PART_2012 VALUES LESS THAN(MAXVALUE) ) ENABLE ROW MOVEMENT */ ;
  • PRIMARY KEY Oracle中如果存在两张表具有相同的主键字段,则在执行ALTER TABLE时需加上表名进行区分。 输入:PRIMARY KEY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE CTP_ARM_CONFIG ( HOSTNAME VARCHAR2(50), OPNAME VARCHAR2(50), PARAMTYPE VARCHAR2(2), PARAMVALUE NUMBER(*,0), MODIFYDATE DATE ) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE( PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE SPMS_DATA ; ALTER TABLE CTP_ARM_CONFIG ADD CONSTRAINT PKCTP_ARM_CONFIG PRIMARY KEY (HOSTNAME, OPNAME) USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE( PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE SPMS_DATA ENABLE;
  • 未创建索引 如果ALTER TABLE中使用了INDEX或STORAGE参数,需要删掉。需要在CREATE TABLE中添加约束。 输入:PRIMARY KEY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE CTP_ARM_CONFIG ( HOSTNAME VARCHAR2(50), OPNAME VARCHAR2(50), PARAMTYPE VARCHAR2(2), PARAMVALUE NUMBER(*,0), MODIFYDATE DATE ) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE( PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE SPMS_DATA ; ALTER TABLE CTP_ARM_CONFIG ADD CONSTRAINT PKCTP_ARM_CONFIG PRIMARY KEY (HOSTNAME, OPNAME) USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE( PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE SPMS_DATA ENABLE; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE TABLE CTP_ARM_CONFIG ( HOSTNAME VARCHAR2 (50) ,OPNAME VARCHAR2 (50) ,PARAMTYPE VARCHAR2 (2) ,PARAMVALUE NUMBER ( 38 ,0 ) ,MODIFYDATE DATE ,CONSTRAINT PKCTP_ARM_CONFIG PRIMARY KEY ( HOSTNAME ,OPNAME ) ) /*SEGMENT CREATION DEFERRED*/ /*PCTFREE 10*/ /*PCTUSED 0*/ /*INITRANS 1*/ /*MAXTRANS 255*/ /*NOCOMPRESS*/ /*LOGGING*/ /*STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)*/ /*TABLESPACE SPMS_DATA */ ;
共100000条