华为云用户手册

  • 基于Windows使用DataCheck 上传工具包到Windows服务器并解压: 生成数据库登录密码密文: 进入bin目录,启动CMD工具: 执行密文生成的脚本,密文会输出。对源端和目标端数据库登录密码分别执行此脚本生成密文。 encryption.bat [password] 配置conf/dbinfo.properties文件: 编辑conf目录下的dbinfo.properties文件,配置源端和目标端的数据库连接信息,配置文件中的密码,使用上一步生成的密文。 编辑input/check_input.xlsx文件并保存: 使用Excel软件编辑input/check_input.xlsx,填写要校验的表信息并保存。 执行数据校验工具 datacheck.bat: 查看校验结果 output/check_input_result.xlsx(校验结果分析同Linux场景): 校验结果分析: Status结果为No Pass代表校验未通过。 Check Result Diff列显示校验不通过的项,可在里面查看具体哪一列的校验不通过。 Check SQL中显示在数据库中执行的查询SQL。
  • 参数说明 start 启动gds.conf中配置的gds。 stop 关闭当前用户有权限关闭的经配置文件启动的gds运行实例。 stop all 关闭当前用户有权限关闭的所有gds运行实例。 stop [ ip: ] port 关闭当前用户有权限关闭的特定gds运行实例。如果启动时指定了ip:port,那么停止需要指定相应的ip:port;如果启动时未指定IP,只指定port,则停止只需指定相应的port即可。如启动和停止指定不同的信息,则停止失败。 status 查询通过gds.conf启动的gds实例的运行状态。
  • 示例 卸载安装部署在节点192.168.1.100、192.168.1.101上,安装用户为gds_test的,GDS文件夹及环境变量。 gds_uninstall -U gds_test --host 192.168.1.100,192.168.1.101 卸载时,同时删除用户。 gds_uninstall -U gds_test --host 192.168.1.100,192.168.1.101 --delete-user
  • 参数说明 --host 待卸载节点的IP列表,支持文件和字符串两种形式: 文件形式:每一行一个IP地址,如: 192.168.2.200 192.168.2.201 字符串形式:半角逗号分隔,如: 192.168.2.200,192.168.2.201。 -U GDS用户。 --delete-user 卸载的同时,删除用户。被删除的用户不可以是root用户。 --delete-user-and-group 卸载的同时,删除用户和其所在用户组。仅当用户组只包含该待删除用户一个用户时可以删除用户组。该用户组不能是root用户组。 -V 显示版本信息。 -h, --help 显示帮助信息。
  • 示例 启动gds。 python3 gds_ctl.py start 停止由配置文件启动的gds。 python3 gds_ctl.py stop 停止所有当前用户有权限关闭的gds。 python3 gds_ctl.py stop all 停止当前用户有权限关闭的,由[ip:]port指定的gds。 python3 gds_ctl.py stop 127.0.0.1:8098 查询gds状态。 python3 gds_ctl.py status
  • 示例 将GDS安装部署在节点192.168.1.100、192.168.1.101上,并指定安装目录为/opt/gdspackages/install_dir,GDS用户是gds_test:wheel。 gds_install -I /opt/gdspackages/install_dir --host 192.168.1.100,192.168.1.101 -U gds_test -G wheel --pkg /home/gds_test/ GaussDB -9.1.0-REDHAT-x86_64bit-Gds.tar.gz
  • 类型对照 数据类型 SQL-Server类型 GaussDB(DWS) OUTPUT 时间类型 datetimeoffset [ ( n ) ] timestamptz(n) datetime2 [ ( n ) ] timestamp(n) datetime timestamp smalldatetime timestamp date date time [ ( n ) ] time(n) 数字类型 float [ ( n ) ] float(n) real [ ( n ) ] float(n) decimal [ ( precision [ , scale ] ) ] decimal numeric [ ( precision [ , scale ] ) ] numeric money money smallmoney money bigint bigint int int smallint smallint tinyint tinyint bit bit 字符类型 nvarchar [ ( n | max ) ] varchar nchar [ ( n ) ] nchar(n) varchar [ ( n | max ) ] varchar(n) char [ ( n ) ] char(n) 二进制类型 varbinary [ ( n | max ) ] BYTEA binary [ ( n ) ] BYTEA 其它类型 uniqueidentifier text
  • 参数说明 -I 安装目录。 默认值:/opt/${gds_user}/packages/,其中${gds_user}表示GDS业务的操作系统用户。 -U GDS用户。 -G GDS用户所属组。 --pkg GDS安装包路径,形如/path/to/GaussDB-9.1.0-REDHAT-x86_64bit-Gds.tar.gz。 --host 待安装部署节点的IP列表,支持文件和字符串两种形式: 文件形式:每一行一个IP地址,如: 192.168.2.200 192.168.2.201 字符串形式:半角逗号分隔,如: 192.168.2.200,192.168.2.201。 执行命令节点必须是待部署节点之一,其IP须在列表中。 --ping-host 调用gds_check时,在各检查节点上进行网络ping检查的目标地址。 取值:IP列表,支持文件和字符串两种形式,一般是DN、CN、网关的IP地址。 文件形式:每一行一个IP地址,如: 192.168.2.200 192.168.2.201 字符串形式:半角逗号分隔,如: 192.168.2.200,192.168.2.201 -V 显示版本信息。 -h, --help 显示帮助信息。
  • 示例:多线程导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导入的数据源文件格式为 CS V,同时导入2个目标表。 在数据库中创建导入的目标表tpcds.reasons1和tpcds.reasons2。 123456 CREATE TABLE tpcds.reasons1( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) ; 123456 CREATE TABLE tpcds.reasons2( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) ; 以root用户登录GDS数据服务器,创建数据文件存放目录“/input_data”,以及子目录“/input_data/import1/”和“/input_data/import2/”。 mkdir -p /input_data 将目标表tpcds.reasons1的数据源文件存放在数据服务器“/input_data/import1/”目录下,将目标表tpcds.reasons2的数据源文件存放在目录“/input_data/import2/”下。 (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrpuseradd -g gdsgrp gds_user 修改数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录数据服务器上启动GDS。 其中GDS安装路径为“/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90,GDS监听端口为5000,以后台方式运行,设定并发度为2,并设定递归文件目录。 /gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D -t 2 -r 在数据库中创建外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2用于接收数据服务器上的数据。 以下以外表tpcds.foreign_tpcds_reasons1为例,讲解设置的导入外表参数信息。 其中设置的导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data/”,GDS监听端口为5000,实际存放数据源文件目录为“/input_data/import1/”,所以设置参数“location”为“gsfs://192.168.0.90:5000/import1/*”。 设置的数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置的导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息( LOG INTO error_table_name)写入表err_tpcds_reasons1。 当数据源文件中一行的最后一个字段缺失(fill_missing_fields)时,自动设置为NULL。 根据以上信息,创建的外表tpcds.foreign_tpcds_reasons1如下所示: 123456 CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons1( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import1/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons1 PER NODE REJECT LIMIT 'unlimited'; 参考以上设置,创建的外表tpcds.foreign_tpcds_reasons2如下所示: 123456 CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons2( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import2/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons2 PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2将数据分别导入tpcds.reasons1和tpcds.reasons2。 1 INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1; 1 INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2; 查询错误信息表err_tpcds_reasons1和err_tpcds_reasons2,处理数据导入错误。详细请参见处理错误表。 12 SELECT * FROM err_tpcds_reasons1;SELECT * FROM err_tpcds_reasons2; 待数据导入完成后,以gds_user用户登录数据服务器,停止GDS。 其中GDS进程号为128954。 ps -ef|grep gdsgds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D -t 2 -rgds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gdskill -9 128954
  • 示例:多数据服务器并行导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90和192.168.0.91。数据源文件格式为CSV。 创建导入的目标表tpcds.reasons。 123456 CREATE TABLE tpcds.reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)); 以root用户登录每台GDS数据服务器,在两台数据服务器上,分别创建数据文件存放目录“/input_data”。以下以IP为192.168.0.90的数据服务器为例进行操作,剩余服务器上的操作与它一致。 mkdir -p /input_data (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrpuseradd -g gdsgrp gds_user 将数据源文件均匀分发至相应数据服务器的“/input_data”目录中。 修改每台数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。以下以IP为192.168.0.90的数据服务器为例,进行操作。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录每台数据服务器上分别启动GDS。 其中GDS安装路径为“/opt/bin/dws/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90和192.168.0.91,GDS监听端口为5000,以后台方式运行。 在IP为192.168.0.90的数据服务器上启动GDS。 /opt/bin/dws/gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D 在IP为192.168.0.91的数据服务器上启动GDS。 /opt/bin/dws/gds/gds -d /input_data -p 192.168.0.91:5000 -H 10.10.0.1/24 -D 创建外表tpcds.foreign_tpcds_reasons用于接收数据服务器上的数据。 其中设置导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data”,GDS监听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*”。 设置数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息(LOG INTO error_table_name)写入表err_tpcds_reasons。 根据以上信息,创建的外表如下所示: 1234567 CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100))SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '', fill_missing_fields 'false') LOG INTO err_tpcds_reasons PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons,将数据导入目标表tpcds.reasons。 1 INSERT INTO tpcds.reasons SELECT * FROM tpcds.foreign_tpcds_reasons; 查询错误信息表err_tpcds_reasons,处理数据导入错误。详细请参见处理错误表。 1 SELECT * FROM err_tpcds_reasons; 待数据导入完成后,以gds_user用户登录每台数据服务器,分别停止GDS。 以下以IP为192.168.0.90的数据服务器为例,停止GDS。其中GDS进程号为128954。 ps -ef|grep gdsgds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data -p 192.168.0.90:5000 -Dgds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gdskill -9 128954
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 原因 解决办法 missing data for column "r_reason_desc" 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即在导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 语法 启动命令 gds_ctl start --host [/path/to/hostfile | ipaddr1,ipaddr2...] -p PORT -d DATADIR -H ALLOW_IPs [gds other original options] 停止命令 gds_ctl stop --host [/path/to/hostfile | ipaddr1,ipaddr2...] -p PORT 重启命令 gds_ctl restart --host [/path/to/hostfile | ipaddr1,ipaddr2...] -p PORT
  • 示例 启动一个GDS进程,其数据文件存放在“/data” 目录,IP为192.168.0.90,监听端口为5000。 gds_ctl start --host 192.168.0.90 -d /data/ -p 5000 -H 10.10.0.1/24 -D 启动一批GDS进程,其数据文件存放在“/data” 目录,IP为192.168.0.90、192.168.0.91、192.168.0.92,监听端口为5000。 gds_ctl start --host 192.168.0.90,192.168.0.91,192.168.0.92 -d /data/ -p 5000 -H 0/0 -D 批量关闭位于192.168.0.90、192.168.0.91、192.168.0.92节点上,端口是5000的GDS进程: gds_ctl stop --host 192.168.0.90,192.168.0.91,192.168.0.92 -p 5000 批量重启位于192.168.0.90、192.168.0.91、192.168.0.92节点上,端口是5000的GDS进程: gds_ctl restart --host 192.168.0.90,192.168.0.91,192.168.0.92 -p 5000
  • Data Studio用户界面 表1 用户界面简介 界面名称 描述 主菜单 提供使用Data Studio的基本操作。 工具栏 提供常用操作入口。 “SQL终端”页签 用于执行SQL语句和函数/过程。 “PL/SQL Viewer”页签 显示函数/过程信息。 “调用堆栈”窗格 显示执行栈。 “断点”窗格 显示所有设置过的断点。 “变量”窗格 显示变量及其变量值。 “SQL Assistant”页签 显示“SQL终端”和“PL/SQL Viewer”页签中输入信息的建议或参考。 “结果”页签 显示所执行的函数/过程或SQL语句的结果。 “消息”页签 显示进程输出。显示标准输入、标准输出和标准错误。 “对象浏览器”窗格 显示数据库连接的层级树形结构和用户有权访问的相关数据库对象。除公共模式外,所有默认创建的模式均分组在“系统模式”下,用户模式分组在相应数据库的“用户模式”下。 说明: “对象浏览器”仅显示满足当前用户权限要求的对象。 “最小化窗口”窗格 用于打开“调用堆栈”、“断点”和“变量”窗格。该窗格仅在“调用堆栈”、“断点”、“变量”窗格中的一个或多个窗格最小化时显示。 搜索工具栏 用于在“对象浏览器”窗格中搜索对象。
  • SYS_GUID SYS_GUID是内嵌函数,返回表中某一行的全域唯一识别元(GUID)。SYS_GUID不使用参数,返回一个16字节的RAW值。 输入 1 2 3 4 5 6 7 8 910111213141516171819 CREATE TABLE sad.fnd_data_change_logs_t ( logid NUMBER, table_name VARCHAR2 (40) NOT NULL /* ENABLE */ ,table_key_columns VARCHAR2 (200), table_key_values VARCHAR2 (200), column_name VARCHAR2 (40) NOT NULL /* ENABLE */ ,column_change_from_value VARCHAR2 (200), column_change_to_value VARCHAR2 (200), organization_id NUMBER, created_by NUMBER (15, 0) NOT NULL /* ENABLE */ ,creation_date DATE NOT NULL /* ENABLE */ ,last_updated_by NUMBER (15, 0) NOT NULL /* ENABLE */ ,last_update_date DATE NOT NULL /* ENABLE */ ,last_update_login NUMBER (15, 0) DEFAULT 0 NOT NULL /* ENABLE */ ,description VARCHAR2 (500), sys_id VARCHAR2 (32) DEFAULT Sys_guid( ) /*, SUPPLEMENTAL LOG DATA (ALL) COLUMNS*/ ); 输出 1 2 3 4 5 6 7 8 910111213141516171819 CREATE TABLE sad.fnd_data_change_logs_t ( logid NUMBER, table_name VARCHAR2 (40) NOT NULL /* ENABLE */ ,table_key_columns VARCHAR2 (200), table_key_values VARCHAR2 (200), column_name VARCHAR2 (40) NOT NULL /* ENABLE */ ,column_change_from_value VARCHAR2 (200), column_change_to_value VARCHAR2 (200), organization_id NUMBER, created_by NUMBER (15, 0) NOT NULL /* ENABLE */ ,creation_date DATE NOT NULL /* ENABLE */ ,last_updated_by NUMBER (15, 0) NOT NULL /* ENABLE */ ,last_update_date DATE NOT NULL /* ENABLE */ ,last_update_login NUMBER (15, 0) DEFAULT 0 NOT NULL /* ENABLE */ ,description VARCHAR2 (500), sys_id VARCHAR2 (32) DEFAULT MIG_ORA_EXT.Sys_guid( ) /*, SUPPLEMENTAL LOG DATA (ALL) COLUMNS*/ ); 父主题: Oracle语法迁移
  • COMPRESS短语 该功能通过对COMPRESS设置,迁移过程中默认注释掉COMPRESS短语。 输入:COMPRESS短语 1 2 3 4 5 6 7 8 910111213 CREATE TABLE test_tab ( id NUMBER(10) NOT NULL, description VARCHAR2(100) NOT NULL, created_date DATE NOT NULL, created_by VARCHAR2(50) NOT NULL, updated_date DATE, updated_by VARCHAR2(50))NOCOMPRESSPARTITION BY RANGE (created_date) ( PARTITION test_tab_q1 VALUES LESS THAN (TO_DATE('01/04/2003', 'DD/MM/YYYY')) COMPRESS, PARTITION test_tab_q2 VALUES LESS THAN (MAXVALUE)); 输出 1 2 3 4 5 6 7 8 9101112131415161718 CREATE TABLE test_tab ( id NUMBER (10) NOT NULL ,description VARCHAR2 (100) NOT NULL ,created_date DATE NOT NULL ,created_by VARCHAR2 (50) NOT NULL ,updated_date DATE ,updated_by VARCHAR2 (50) ) /*NOCOMPRESS*/ PARTITION BY RANGE (created_date) ( PARTITION test_tab_q1 VALUES LESS THAN ( TO_DATE( '01/04/2003' ,'DD/MM/YYYY' ) ) /*COMPRESS*/ ,PARTITION test_tab_q2 VALUES LESS THAN (MAXVALUE)) ; 父主题: Oracle语法迁移
  • 参数说明 完整选项 缩写选项 数据类型 说明 取值类型 缺省值 应用实例 -t 不涉及 字符串 接口支持多种功能。指定该参数为cancel-publication,执行取消发布。 -t generate-config -t prepare -t create-publication -t alter-publication -t cancel-publication -t get-current-disaster 不涉及 -t cancel-publication --disaster-object-list-file 不涉及 字符串 容灾对象列表文件 不涉及 不涉及 --disaster-object-list-file /home/userA/disaster_object_list.txt --config-file 不涉及 字符串 双集群容灾配置文件存放路径。 说明: 该路径操作系统用户omm必须拥有读权限。 关于配置文件如何配置,请参见生成配置文件命令。 不涉及 不涉及 --config-file /home/userA/config.ini --all-cancel 不涉及 布尔值 可选参数,发布全部取消 不涉及 不涉及 --all-cancel
  • 系统回显 [perfadm@ecs-env-2988 config]$ python3 $GPHOME/script/DisasterFineGrained.py -t cancel-publication --disaster-object-list-file $HOME/config/disaster_object_list.txt --config-file /home/mpp/mppcases_c10/cluster/gs_rch_DR-v6/test/backupRestore.ini[Start ESL disaster fine grained process]Stop backup loop.Stop crontab for backupStop crontab successfully.Stop backup successfully.Start parse disaster object file.parse disaster object file end, [disaster object num]: 1, [time]: 0.000s.Start filter disaster object.filter disaster object end, [db num]: 0, [schema num]: 1, [table num]: 0, [time]: 0.019s.Start validate cancel disaster object.validate cancel disaster object end, [object num]: 1, [time]: 0.024s.Start cancel publication.cancel publication end, [db num]: 0, [schema num]: 1, [table num]: 0, [time]: 0.059s.The publication file path: /home/perfadm/config/pub.list[Finished ESL disaster fine grained process]
  • 命令示例 取消发布。 python3 $GPHOME/script/DisasterFineGrained.py -t cancel-publication --disaster-object-list-file $HOME/config/disaster_object_list.txt --config-file /home/mpp/mppcases_c10/cluster/gs_rch_DR-v6/test/backupRestore.ini
  • 使用指南 cancel-publication命令需在主集群的主节点上执行。当前备份过程结束之后,该命令会停止后续的周期性备份。 cancel-publication命令--disaster-object-list-file需传入取消的增量容灾对象。 取消发布失败的容灾对象会在命令执行完后写入$HOME/config/fail_disaster_object.txt。 若入参有--all-cancel,则代表取消全部发布。 更新的publication参数文件默认路径为$HOME/config/pub.list。 需手动创建容灾对象列表文件--disaster-object-list-file,文件格式如下: db_name //db级db_name.schema_name //schema级db_name.schema_name.table_name //table级
  • 参数说明 通用参数: -f, --file=FILENAME 将输出发送至指定文件或目录。如果省略该参数,则使用标准输出。如果输出格式为(-F c/-F d/-F t)时,必须指定-f参数。如果-f的参数值含有目录,要求目录对当前用户具有读写权限。 -F, --format=c|d|t|p 选择输出格式。格式如下: p|plain:输出一个文本SQL脚本文件(默认)。 c|custom:输出一个自定义格式的归档,并且以目录形式输出,作为gs_restore输入信息。该格式是最灵活的输出格式,因为能手动选择,而且能在恢复过程中将归档项重新排序。该格式默认状态下会被压缩。 d|directory:该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。 t|tar:输出一个tar格式的归档形式,作为gs_restore输入信息。tar格式与目录格式兼容;tar格式归档形式在提取过程中会生成一个有效的目录格式归档形式。但是,tar格式不支持压缩且对于单独表有8GB的大小限制。此外,表数据项的相应排序在恢复过程中不能更改。 输出一个tar格式的归档形式,也可以作为gsql输入信息。 -v, --verbose 指定verbose模式。该选项将导致gs_dump向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。 -V, --version 打印gs_dump版本,然后退出。 -Z, --compress=0-9 指定使用的压缩比级别。 取值范围:0~9 0表示无压缩。 1表示压缩比最小,处理速度最快。 9表示压缩比最大,处理速度最慢。 针对自定义归档格式,该选项指定单个表数据片段的压缩,默认方式是以中等级别进行压缩。对于文本输出,设置非零压缩级别将会导致整个输出文件被压缩(类似通过gzip进行压缩),默认不压缩。tar归档格式目前不支持压缩。 --lock-wait-timeout=TIMEOUT 请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement_timeout的格式指定超时时间。 -?, --help 显示gs_dump命令行参数帮助,然后退出。 转储参数:
  • 语法 gs_dump [OPTION]... [DBNAME] “dbname”前面不需要加短或长选项。“dbname”指定要连接的数据库。 例如: 不需要-d,直接指定“dbname”。 gs_dump -p port_number postgres -f dump1.sql 或者 export PGDATABASE=postgres gs_dump -p port_number -f dump1.sql 环境变量: PGDATABASE
  • 示例 使用gs_dump转储数据库为SQL文本文件或其它格式的操作,如下所示。 示例中“password”表示数据库用户密码,由用户自己设置;“backup/MPPDB_backup.sql”表示导出的文件,其中backup表示相对于当前目录的相对目录;“37300”表示数据库服务器端口;“postgres”表示要访问的数据库名。 导出操作时,请确保该目录存在并且当前的操作系统用户对其具有读写权限。 示例1:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.sql文件格式为纯文本格式。 gs_dump -U dbadmin -W {password} -f backup/MPPDB_backup.sql -p 37300 postgres -F pgs_dump[port='37300'][postgres][2018-06-27 09:49:17]: The total objects number is 356.gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: [100.00%] 356 objects have been dumped.gs_dump[port='37300'][postgres][2018-06-27 09:49:17]: dump database postgres successfullygs_dump[port='37300'][postgres][2018-06-27 09:49:17]: total time: 1274 ms 使用gsql程序从纯文本导出文件中导入数据。 示例2:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.tar文件格式为tar格式。 gs_dump -U dbadmin -W {password} -f backup/MPPDB_backup.tar -p 37300 postgres -F tgs_dump[port='37300'][postgres][2018-06-27 10:02:24]: The total objects number is 1369.gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: [100.00%] 1369 objects have been dumped.gs_dump[port='37300'][postgres][2018-06-27 10:02:53]: dump database postgres successfullygs_dump[port='37300'][postgres][2018-06-27 10:02:53]: total time: 50086 ms 示例3:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.dmp文件格式为自定义归档格式。 gs_dump -U dbadmin -W {password} -f backup/MPPDB_backup.dmp -p 37300 postgres -F cgs_dump[port='37300'][postgres][2018-06-27 10:05:40]: The total objects number is 1369.gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: [100.00%] 1369 objects have been dumped.gs_dump[port='37300'][postgres][2018-06-27 10:06:03]: dump database postgres successfullygs_dump[port='37300'][postgres][2018-06-27 10:06:03]: total time: 36620 ms 示例4:执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup文件格式为目录格式。 gs_dump -U dbadmin -W {password} -f backup/MPPDB_backup -p 37300 postgres -F dgs_dump[port='37300'][postgres][2018-06-27 10:16:04]: The total objects number is 1369.gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: [100.00%] 1369 objects have been dumped.gs_dump[port='37300'][postgres][2018-06-27 10:16:23]: dump database postgres successfullygs_dump[port='37300'][postgres][2018-06-27 10:16:23]: total time: 33977 ms
  • 说明 场景1 如果某数据库集群有任何本地数据要添加到template1数据库,请谨慎将gs_dump的输出恢复到一个真正的空数据库中,否则可能会因为被添加对象的定义被复制,出现错误。要创建一个无本地添加的空数据库,需从template0而非template1复制,例如: CREATE DATABASE foo WITH TEMPLATE template0; tar归档形式的文件大小不得超过8GB(tar文件格式的固有限制)。tar文档整体大小和任何其他输出格式没有限制,操作系统可能对此有要求。 由gs_dump生成的转储文件不包含优化程序用来做执行计划决定的统计数据。因此,最好从某转储文件恢复之后运行ANALYZE以确保最佳效果。转储文件不包含任何ALTER DATABASE…SET命令,这些设置由gs_dumpall转储,还有数据库用户和其他完成安装设置。 场景2 当SEQUENCE已经到达最大或最小值时,通过gs_dump来备份SEQUENCE值会因执行报错退出。可参考如下说明处理: SEQUENCE已经到达最大值,但最大值小于2^63-2 报错示例: sequence对象定义 CREATE SEQUENCE seq INCREMENT 1 MINVALUE 1 MAXVALUE 3 START WITH 1; 执行gs_dump备份 gs_dump -U dbadmin -W {password} -p 37300 postgres -t PUBLIC.seq -f backup/MPPDB_backup.sqlgs_dump[port='37300'][postgres][2019-12-27 15:09:49]: The total objects number is 337.gs_dump[port='37300'][postgres][2019-12-27 15:09:49]: WARNING: get invalid xid from GTM because connection is not establishedgs_dump[port='37300'][postgres][2019-12-27 15:09:49]: WARNING: Failed to receive GTM rollback transaction response for aborting prepared (null).gs_dump: [port='37300'] [postgres] [archiver (db)] [2019-12-27 15:09:49] query failed: ERROR: Can not connect to gtm when getting gxid, there is a connection error.gs_dump: [port='37300'] [postgres] [archiver (db)] [2019-12-27 15:09:49] query was: RELEASE bfnextval 处理方法: 通过SQL语句连接postgres数据库,执行如下语句,修改sequence seq1的最大值。 gsql -p 37300 postgres -r -c "ALTER SEQUENCE PUBLIC.seq MAXVALUE 10;" 执行dump工具进行备份。 gs_dump -U dbadmin -W {password} -p 37300 postgres -t PUBLIC.seq -f backup/MPPDB_backup.sqlgs_dump[port='37300'][postgres][2019-12-27 15:10:53]: The total objects number is 337.gs_dump[port='37300'][postgres][2019-12-27 15:10:53]: [100.00%] 337 objects have been dumped.gs_dump[port='37300'][postgres][2019-12-27 15:10:53]: dump database postgres successfullygs_dump[port='37300'][postgres][2019-12-27 15:10:53]: total time: 230 ms SEQUENCE已经到达最小值或最大值2^63-2 gs_dump不支持该场景下的SEQUENCE数值备份。 SQL端不支持SEQUENCE到达最大值2^63-2后的MAXVALUE修改,不支持SEQUENCE到达最小值后的MINVALUE修改。
  • 背景信息 gs_dump是GaussDB(DWS)用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。 gs_dump工具在进行数据导出时,其他用户可以访问集群数据库(读或写)。 gs_dump工具支持导出完整一致的数据。例如,T1时刻启动gs_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出。 gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。 纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过gsql运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。 归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见表1。该导出结果必须与gs_restore配合使用来恢复数据库,gs_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。
  • 主要功能 gs_dump可以创建四种不同的导出文件格式,通过[-F或者--format=]选项指定,具体如表1所示。 表1 导出文件格式 格式名称 -F的参数值 说明 建议 对应导入工具 纯文本格式 p 纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。 小型数据库,一般推荐纯文本格式。 使用gsql工具恢复数据库对象前,可根据需要使用文本编辑器编辑纯文本导出文件。 自定义归档格式 c 一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。 中型或大型数据库,推荐自定义归档格式。 使用gs_restore可以选择要从自定义归档导出文件中导入相应的数据库对象。 目录归档格式 d 该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。 - tar归档格式 t tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。 - 可以使用gs_dump程序将文件压缩为纯文本或自定义归档导出文件,减少导出文件的大小。生成纯文本导出文件时,默认不压缩。生成自定义归档导出文件时,默认进行中等级别的压缩。gs_dump程序无法压缩已归档导出文件。
  • 使用flink SQL直连DN入库 该能力依赖flink sql DISTRIBUTEBY能力,mrs有提供此能力,具体请参见Flink SQL语法增强。 connector提供udf函数可根据分布列值计算出下游并并发结合flink sql DISTRIBUTEBY能力实现将数据按DN分区能力,示例: 需要在SQL中引入UDF。 CREATE temporary FUNCTION dn_hash AS 'com.huaweicloud.dws.connectors.flink.partition.DnHashFunction'; 正常写Source SQL。 CREATE TABLE users( id BIGINT, name STRING, age INT, text STRING, created_at TIMESTAMP(3), updated_at TIMESTAMP(3)) WITH ( 'connector' = 'datagen', 'fields.id.kind' = 'sequence', 'fields.id.start' = '1', 'fields.id.end' = '1000', 'fields.name.length' = '10', 'fields.age.min' = '18', 'fields.age.max' = '60', 'fields.text.length' = '5' ) Sink表定义SQL中需要新增一个字段并且要求int类型值用于接收UDF计算的结果,示例中叫dn_hash。 create table dws_users( dn_hash int, id BIGINT, name STRING, age INT, text STRING, created_at TIMESTAMP(3), updated_at TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED) WITH ( 'connector' = 'dws', 'url' = '%s', 'tableName' = 'test.users', 'username' = '%s', 'autoFlushBatchSize' = '50000', 'password' = '%s' ) Insert into sql使用 udf获取数据下游算子信息,同时使用DISTRIBUTEBY对返回结果做数据分区,数据就会按照udf返回信息到下游指定并行度。 insert into dws_users select /*+ DISTRIBUTEBY('dn_hash') */ dn_hash('test.users',10,1024, id) as dn_hash, * from users
  • 示例 该示例是从kafka数据源中读取数据,写入DWS结果表中,并指定攒批时间不超过10秒,每批数据最大30000条,其具体步骤如下: 在GaussDB(DWS)数据库中创建表public.dws_order: 1 2 3 4 5 6 7 8 91011 create table public.dws_order( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR ); 消费Kafka中order_test topic中的数据作为数据源,public.dws_order作为结果表,Kafka数据为JSON格式,并且字段名称和数据库字段名称一一对应: 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940 CREATE TABLE kafkaSource ( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id string) WITH ( 'connector' = 'kafka', 'topic' = 'order_test', 'properties.bootstrap.servers' = 'KafkaAddress1:KafkaPort,KafkaAddress2:KafkaPort', 'properties.group.id' = 'GroupId', 'scan.startup.mode' = 'latest-offset', 'format' = 'json');CREATE TABLE dwsSink ( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id string) WITH ( 'connector' = 'dws', 'url' = 'jdbc:gaussdb://DWSAddress:DWSPort/DWSdbName', 'tableName' = 'dws_order', 'username' = 'DWSUserName', 'password' = 'DWSPassword', 'autoFlushMaxInterval' = '10s', 'autoFlushBatchSize' = '30000');insert into dwsSink select * from kafkaSource; 给Kafka写入测试数据: 1 {"order_id":"202103241000000001", "order_channel":"webShop", "order_time":"2021-03-24 10:00:00", "pay_amount":"100.00", "real_pay":"100.00", "pay_time":"2021-03-24 10:02:03", "user_id":"0001", "user_name":"Alice", "area_id":"330106"} 等10秒后在GaussDB(DWS)表中查询结果: 1 select * from dws_order 结果如下:
  • 常见问题 Q:writeMode参数设置什么值比较合适? A:根据业务场景分update(只更新存在的数据)和upsert(对于同一主键数据如果存在就更新,不存在就新增一条数据)两个类型,推荐直接使用auto方式即可,该方式下会根据数据量的大小自动选择,如果数据量较大会增大攒批参数autoFlushBatchSize,即可提升入库性能。 Q:autoFlushBatchSize和autoFlushMaxInterval怎么设置比较合适? A:autoFlushBatchSize参数用于设置最大攒批条数,autoFlushMaxInterval参数用于设置最大攒批间隔,两个参数分别从时间和空间维度管控攒批。 通过autoFlushMaxInterval可保证数据量较小时的时效性,如对时效性无强制要求通常不建议设置的太小,建议不低于3s走默认值即可。 通过autoFlushBatchSize可控制一批数据的最大条数,一般来说攒批量越大,对于整体入库性能会更好,对性能来说通常该参数的设置推荐越大越好,参数的设置根据业务数据的大小以及flink运行内存来设置,保证不内存溢出。 对于大多业务来说无需设置autoFlushMaxInterval,将autoFlushBatchSize设置为50000即可。 Q: 遇到数据库死锁了怎么办? A:通常出现死锁大致分为行锁死锁和分布式死锁。 行锁:该场景通常为同一主键数据的并发更新造成行锁,该情况可以通过对数据做key by解决,key by必须根据数据库主键做,保证同一个主键数据会在同一个并发中,破坏掉并发更新的条件,无法造成死锁。Flink SQL做key by需要Flink本身支持,对于 DLI / MRS 均能实现,如MRS flink通过增加参数“key-by-before-sink=true”可实现key by。具体怎么使用以实现方为准,对于无法使用的建议使用API方式入库。 分布式死锁:该场景通常为列存表的并发更新造成分布式死锁,暂无法解决,建议使用行存或者hstore。
  • UDF函数DnHashFunction参数说明 参数格式 dn_hash('dws表名',sink并行度,最大并行度,dws作为分布列的数据在源数据的字段名称{1,}) 参数说明 使用时上游并行度必须不多于sink并行度,DnHashFunction同样是通过进程内获取sink 算子初始化的dws client实例获取到的表元数据,如果当前进程无sin算子就会导致无法获取client实例。 使用后会增加一个hash算子,如果链路有多个算子处理业务,当执行hash算子后不可以再有改变数据分区的算子,否则数据会被再次分区就不能到达指定sink算子。 最大并行度默认flink自动调整的,算法中需要使用,因此自动调整的无法使用,必须通过参数设置固定并把设置额值作为UDF的参数,可以通过参数pipeline.max-parallelism设置或者jar方式通过API设置: StreamExecutionEnvironment evn = StreamExecutionEnvironment.getExecutionEnvironment();evn.setParallelism(1);evn.setMaxParallelism(1024); 如果分布列包含多个字段,分布列的字段顺序需要保持和DWS一致,分布列支持的字段类型和dws client一致参考参数WRITE_PARTITION_POLICY,使用功能同样需要额外配置,不可自行使用。
共100000条