• [其他] 业务报错:UNION types %s and %s cannot be matched
    【问题现象】执行union语句时报错:UNION types %s and %s cannot be matched【问题原因】该报错的原因是union的分支中,相同位置的输出列格式类型不同导致【触发场景】示例:postgres=# create table t1(a int, b timestamp);CREATE TABLEpostgres=# create table t2(a int, b text);CREATE TABLEpostgres=# insert into t1 select 1, current_date;INSERT 0 1postgres=# insert into t2 select 1, current_date;INSERT 0 1postgres=# select * from t1 union select * from t2;ERROR: UNION types timestamp without time zone and text cannot be matchedLINE 1: select * from t1 union select * from t2; ^示例中,t1表和t2表在b列上类型不同,导致在union操作时出现类型不匹配的报错。应保证union各分支相同位置的输出列类型匹配。(注:t2表b列是text类型,插入的数据是current_date,在插入时发生了隐式类型转换,所以插入不报错;但是在查询时,不会自动进行隐式转换,因此会报错。)【解决方法】保证union各分支的输出列类型匹配,不满足要求时可以对输出列强制类型转化:postgres=# select a,b::text from t1 union select a,b from t2; a | b ---+--------------------- 1 | 2023-02-16 1 | 2023-02-16 00:00:00(2 rows)
  • [技术干货] 数据网topo
    数据网topo模拟                                                                                                                                                                                      数据网topo模拟
  • [其他系列] GaussDB(DWS)实践系列-巡检工具部署及使用(线上版本gs_check)
    1 获取并安装巡检工具1.1 安装说明1、此方法适用于所有的线上版本(HCS\HCSO\HC等)。2、2020.9.30 发布版本,将工具已经集成到了产品的镜像中,新安装环境可以进入沙箱内的/opt/dws/opstool/ 目录下,因此可以不需要安装,进入沙箱中/opt/dws/opstool/目录,直接执行gs_check命令即可;升级上来的集群,因为不会重新安装镜像,所以沙箱内的/opt/dws/opstool/目录无巡检工具,需要自己安装。3、2021.6.30 发布版本,由于新特性支持更新插件包,升级到此版本后会自动将巡检工具部署到沙箱内的/opt/dws/opstool/ 目录下,因此可以不需要安装,进入沙箱中/opt/dws/opstool/目录,直接执行gs_check命令即可。1.2 准备巡检工具线上DWS自带gs_check巡检工具目前因为root互信等原因无法执行巡检,需要手动上传特定版本的gs_check到obs,然后在集群里面下载安装之后进行巡检。将如下巡检工具上传至目标集群相同region的obs桶,并赋予匿名用户读取权限,并获取到下载链接。具体上传obs步骤可参考产品手册:《上传数据到OBS:https://support.huaweicloud.com/intl/zh-cn/devg-dws/dws_04_0057.html》1.3 安装巡检工具登陆进dws集群第一个cn节点,root用户执行wget下载巡检工具、解压、并赋予Ruby用户权限:cd /var/chroot/DWS/data1wget https://akctong.obs.cn-east-3.myhuaweicloud.com/8.1.0.101-inspect-e629bad.tar.gzmkdir checktar -xvf 8.1.0.101-inspect-e629bad.tar.gz -C checkchown -R Ruby:Ruby check/使用Ruby用户进入沙箱,通过gs_ssh 命令将check目录分发到所有节点。XXX为当前节点的主机名。su - Rubyssh hostnamecd /DWS/data1gs_ssh -c "scp -r Ruby@XXX:/DWS/data1/check  /DWS/data1/"1.4 准备Ruby用户密码提前解密查好目标集群Ruby用户的密码。(8.1.1.xxx-inspect-xxxxx.tar.gz 版本已经不需要输入Ruby密码)2 执行巡检2.1 日常巡检使用Ruby用户登陆第一个cn节点在沙箱内执行日常巡检cd /DWS/data1/check./gs_check -e inspect2.2 扩容前巡检使用Ruby用户登陆第一个cn节点在沙箱内执行扩容前巡检cd /DWS/data1/check./gs_check -i CheckCollector./gs_check -e expand2.1 升级前巡检使用Ruby用户登陆第一个cn节点在沙箱内执行升级前巡检cd /DWS/data1/check./gs_check -e upgrade每个巡检会在回显中生成类似/var/chroot/DWS/data1/check/inspection/output/CheckReport_202103156286720005.tar.gz的文件,即巡检结果。想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~
  • [迁移系列] RDS-DRS-DWS数据复制链路优化方案比对
    背景介绍• 随着业务的发展,RDS的负载在逐渐增长,同时还会有新的RDS到DWS的表级同步链路需求• 随着链路数量的增加,RDS上的资源在数据同步上消耗越来越大• 为了提高系统的可靠性,建议采用增加中间库方案来优化数据复制链路方案一:通过主库实现表级同步方案解释:• 表级同步的全量同步和增量同步都是从RDS生产库上获取数据• 同步的全量阶段,对源端RDS生产库上有一定压力,可在业务低峰期实施优势:• 无需额外的RDS实例和DRS链路,成本较低• 生产库有HA机制,如果主库挂了,备库承接同步任务的源端角色,保证了同步链路的可靠性• 执行online ddl时,数据同步没有时延劣势:• 全量阶段或者同步任务较多时,对生产库有一定压力方案二:通过备库全量主库增量实现表级同步方案解释:• 表级同步的全量同步从生产备库实例,增量同步从RDS生产库主实例获取数据优势:• 无需额外的RDS实例和DRS链路,成本较低执行online ddl时,数据同步没有时延劣势:• 对于生产主库的可靠性有影响方案三:通过中间库实现表级同步方案解释:• 创建一个RDS中间库,利用DRS的在线迁移能力,一次性从RDS生产库获取全量数据,并实时从RDS生产库同步增量数据• 所有到DWS的表级同步任务,都从RDS中间库实施全量+增量同步优势:• 所有表级同步任务都从RDS中间库抽取数据,对RDS生产库没有任何影响• 满足一定条件,从RDS生产库到DWS的无时延• DRS在线迁移阶段有限流能力,所以全量迁移阶段对RDS生产库影响较小劣势:• 增加了一个DRS在线迁移任务和一个RDS中间库(主备),成本增加• 如果在RDS生产库上做online DDL会导致RDS中间库的时延较大方案四:通过只读节点实现表级同步方案解释:• 在RDS生产库上创建一个只读实例,在RDS生产库只读实例上打开log_slave_update参数• 所有到DWS的表级同步任务,都从RDS生产库只读上实施全量+增量同步优势:• 所有表级同步任务都从RDS生产库只读上抽取数据,对RDS生产库没有任何影响劣势:• 增加了一个RDS生产库只读(单机),成本增加• 只读节点挂掉,需要修复只读节点,并重试任务,影响表级同步链路的可靠性• 需要在只读节点上后台修改log_slave_update参数,属于非标操作• 如果在RDS生产库上做online DDL会导致RDS生产库只读的时延较大
  • [实践系列] DWS对接DLI Flink实现实时数据接入
            当前实时数据的接入和处理在DWS承载的业务中所占的比例越来越大,DWS可以和DLI Flink结合,实现实时数据处理结果的报表展示。同时,DWS可以作为Flink维表引擎,存储维表数据,共Flink关联时使用。下面介绍DWS如何与DLI Flink相结合,实现实时数据的存储和查询。一、创建DLI Flink作业   在DLI管理控制台的左侧导航栏中,单击“作业管理”>“Flink作业”,进入“Flink作业”页面。   在“Flink作业”页面右上角单击“创建作业”,弹出“创建作业”对话框。   图1 创建Flink SQL作业3. 配置作业信息。表1 作业配置信息参数参数说明类型选择“Flink SQL”:用户通过编辑SQL语句来启动作业。名称作业名称,只能由字母、中文、数字、中划线和下划线组成,并且长度为1~57字节。说明:作业名称必须是唯一的。描述作业的相关描述,长度为0~512字节。模板名称当编辑器选择“SQL编辑器”时,该参数有效。用户可以选择样例模板或自定义的作业模板。关于模板的详细信息,请参见Flink模板管理。标签使用标签标识云资源。包括“标签键”和“标签值”。如果您需要使用同一标签标识多种云资源,即所有服务均可在标签输入框下拉选择同一标签,建议在标签管理服务(TMS)中创建预定义标签。具体请参考《标签管理服务用户指南》。说明:o    最多支持10个标签。o    一个“键”只能添加一个“值”。o    标签键:在输入框中输入标签键名称。说明:§  标签键的最大长度为36个字符 ,不能包含“=”,“*”,“,”,“<”,“>”,“\”,“|”,“/”,且首尾字符不能为空格。§  若有预定义标签,可在输入框的下拉列表中进行选择。o    标签值:在输入框中输入标签值。说明:§  标签值的最大长度为43个字符,不能包含“=”,“*”,“,”,“<”,“>”,“\”,“|”,“/”,且首尾字符不能为空格。§  若有预定义标签,可在输入框的下拉列表中进行选择。 4.  单击“确定”,进入作业“编辑”页面。 5.  编辑SQL作业。在SQL语句编辑区域,输入详细的SQL语句。相关SQL语句请参考《数据湖探索SQL语法参考》。 6.  单击“语义校验”,确保语义校验成功。  只有语义校验成功后,才可以执行“调试”或“启动”作业的操作。  如果校验成功,提示“SQL语义校验成功”。  如果校验失败,会在错误的SQL语句前面显示红色的“X”记号,鼠标移动到“X”号上可查看详细错误,请根据错误提示修改SQL语句。 7.  设置作业运行参数。图2 设置Flink SQL作业运行参数表2 作业运行参数说明参数参数说明CU数量CU数量为DLI的计算单元数量和管理单元数量总和,CU也是DLI的计费单位,1CU=1核4G。管理单元管理单元CU数量。最大并行数最大并行数是指同时运行Flink SQL作业的最大任务数。说明:最大并行数不能大于计算单元(CU数量-管理单元)的4倍。TaskManager配置用于设置TaskManager资源参数。勾选后需配置下列参数:o    “单TM所占CU数”:每个TaskManager占用的资源数量。o    “单TM Slot”:每个TaskManager包含的Slot数量。保存作业日志设置是否将作业运行时的日志信息保存到OBS。日志信息的保存路径为:“桶名/jobs/logs/作业id开头的目录”。在作业列表中,单击对应的作业名称,在“运行日志”页签,可以单击页面提供的OBS链接跳转至对应的路径下。勾选后需配置下列参数:“OBS桶”:选择OBS桶用于保存用户作业日志信息。如果选择的OBS桶是未授权状态,需要单击“OBS授权”。说明:如果同时勾选了“开启Checkpoint”和“保存作业日志”,OBS授权一次即可。作业异常告警设置是否将作业异常告警信息,如作业出现运行异常或者欠费情况,以SMN的方式通知用户。勾选后需配置下列参数:“SMN主题”:选择一个自定义的SMN主题。如何自定义SMN主题,请参见《消息通知服务用户指南》中“创建主题”章节。开启Checkpoint设置是否开启作业快照,开启后可基于Checkpoint(一致性检查点)恢复作业。勾选后需配置下列参数:o    “Checkpoint间隔”:Checkpoint的时间间隔,单位为秒,输入范围 1~999999,默认值为10s。o    “Checkpoint 模式”:支持如下两种模式:§  AtLeastOnce:事件至少被处理一次。§  ExactlyOnce:事件仅被处理一次。o    “OBS桶”:选择OBS桶用于保存用户Checkpoint。如果选择的OBS桶是未授权状态,需要单击“OBS授权”。说明:如果同时勾选了“开启Checkpoint”和“保存作业日志”,OBS授权一次即可。异常自动重启设置是否启动异常自动重启功能,当作业异常时将自动重启并恢复作业。勾选后需配置下列参数:o    “异常重试最大次数”:配置异常重试最大次数。单位为“次/小时”。§  无限:无限次重试。§  有限:自定义重试次数。o    “从Checkpoint恢复”:需要同时勾选“开启Checkpoint”才可配置该参数。空闲状态保留时长用于清除GroupBy或Window经过最大保留时间后仍未更新的中间状态,默认设置为1小时。脏数据策略选择处理脏数据的策略。支持如下三种策略:“忽略”,“抛出异常”和“保存”。说明:“保存”是指将脏数据保存到OBS桶中。脏数据转储地址“脏数据策略”选择“保存”时,配置该参数。单击地址框选择保存脏数据的OBS路径。所属队列默认选择“共享队列”,用户也可以选择自定义的独享队列。选择“独享队列”时需配置以下参数:“UDF Jar”:用户自定义UDF文件,在选择UDF Jar之前需要将对应的jar包上传至OBS桶中,并在“数据管理>程序包管理”中创建程序包,具体操作请参考创建程序包。用户可以在SQL中调用插入Jar包中的自定义函数。说明:o    当子用户在创建作业时,子用户只能选择已经被分配的队列。o    当所选择队列的剩余容量不能满足作业需求时,系统会自动扩容,将按照增加的容量计费。当队列空闲时,系统也会自动缩容。(可选)根据需要调试参数。作业调试功能只用于验证SQL逻辑,不会有数据写入操作。 具体操作请参见调试作业。单击“保存”,保存作业和相关参数。 二. 编写flink sql读取和写入数据1.  以flink从kafka读取数据写入DWS为例,sql语句如下:第一步:创建数据源,一般是kafka源。第二步:创建维表Flink还支持以GaussDB(DWS)作为维表引擎,实现flink表和维表的关联操作,再将数据sink到目标表。DWS维表创建语法如下。create table dimtion_tbl (id bigint,name varchar,address varchar)with ("connector.type" = "gaussdb","connector.url" = "jdbc:postgresql://xx.xx.xx.xx:8000/db_name","connector.table" = "table_name","connector.username" = "user_name","connector.password" = "password","connector.lookup.cache.max-rows" = "200000","connector.lookup.cache.ttl" = "1h");其中需要注意的是:connector.lookup.cache.max-rows需要根据flink的维表cache大小来确定,即用cache大小除以表数据每行平均大小,即为缓存行数。维表一般都较小,因此尽量将所有数据都缓存在flink中,减小对DWS的压力。connector.lookup.cache.ttl:根据实际情况设置,一般设置为与原平台维表一致即可。此外,Flink会对维表进行高并发点查,需要在维表的关联字段上建立B-tree索引。 第三步:创建目标表参数解释:参数 是否必选 说明 connector.type  是  connector类型,对于dws(gaussdb),需配置为'gaussdb' connector.url  是  jdbc连接地址,格式为:jdbc:postgresql://${ip}:${port}/${dbName} connector.table  是  操作的表名 connector.username  否  数据库认证用户名,需和'connector.password'一起配置 connector.password  否  数据库认证密码,需和'connector.username'一起配置 connector.driver  否  jdbc连接驱动,默认为: org.postgresql.Driver connector.read.partition.column  否  source配置,用于对输入进行分区的列名 connector.read.partition.num  否  source配置,输入分区的个数  connector.read.partition.lower-bound  否  source配置,第一个分区的最小值  connector.read.partition.upper-bound  否  source配置,最后一个分区的最大值 connector.read.fetch-size  否  source配置,每次从数据库拉取数据的行数。默认值为0,表示忽略该提示 connector.lookup.cache.max-rows  否  维表配置,缓存的最大行数,超过该值时,老的数据会被踢除。-1表示不使用缓存 connector.lookup.cache.ttl  否  维表配置,缓存超时时间,超过该时间的数据会被剔除。格式为:{length value}{time unit label},如123ms, 321s,支持的时间单位包括: d,h,min,s,ms等,默认为ms connector.lookup.max-retries  否  维表配置,数据拉取最大重试次数,默认为3 connector.write.mode  否  sink配置,数据写入模式,支持: copy, insert以及upsert三种。与'primary key'配合使用。未配置'primary key'时:支持copy及insert两种追加写入,其中copy方式为批量写入,insert为单条写入。配置'primary key'时:,支持copy&merge、upsert以及insert&update三种更新写入。注意:由于dws不支持更新分布列,因而配置的更新主键必须包含dws表中定义的所有分布列 connector.write.flush.max-rows  否  sink配置,数据flush大小,超过该值将触发写入flush。默认为5000 connector.write.flush.interval  否  sink配置,数据flush周期,周期性触发写入flush。格式为:{length value}{time unit label},如123ms, 321s,支持的时间单位包括: d,h,min,s,ms等,默认为ms connector.write.max-retries  否  sink配置,写入最大重试次数,默认为3 connector.write.merge.filter-key  否  sink配置,copy&merge模式下,merge时过滤列名 connector.write.escape-string-value  否  sink配置,是否对string类型值进行转义,默认为false 其中标黄的三个参数会影响写入DWS的方式和性能。第四步:插入数据语句插入语句一般是insert into 目标表 select 业务逻辑 from源表 join 维表。三. 启动作业单击“启动”,进入“启动Flink作业”页面,确认作业规格和费用后,单击“立即启动”,启动作业。启动作业后,系统将自动跳转到Flink作业管理页面,新创建的作业将显示在作业列表中,在“状态”列中可以查看作业状态。作业提交成功后,状态将由“提交中”变为“运行中”。运行完成后显示“已完成”。如果作业状态为“提交失败”或“运行异常”,表示作业提交或运行失败。用户可以在作业列表中的“状态”列中,将鼠标移动到状态图标上查看错误信息,单击 可以复制错误信息。根据错误信息解决故障后,重新提交。
  • [其他] 【总结】DWS运维常用SQL
    DWS提供了丰富的接口、视图来用于查看和诊断当前集群的运行状况,为了提高运维效率,现整理一些比较常用的,供DBA、DWS运维人员参考。1. 查看用户及连接:连接数不够会导致业务大量报错,因此,有必要监控集群上各个CN上的连接数,确保其在正常范围内,集群内每个CN的最大连接数可以通过show max_connections得到,集群当前已使用的连接数可以用以下SQL查询。其中活跃连接指当前正在使用的连接,缓存连接指数据库内部连接池缓存的连接,这两种连接都会占用数据库连接数,因此都需要进行监控。活跃连接:select usename, count(*) from pgxc_stat_activity where usename != 'Ruby'  group by 1 order by 2 desc活跃+缓存连接:Select usename, count(*) from pgxc_stat_activity where usename != 'Ruby'  group by 1 order by 2 desc2. 查看活跃语句及执行时间:通过查看活跃语句及执行时间,可以找出当前运行时间较长的语句,分析是否有问题。Select now()-query_start,* from pgxc_stat_activity where state='active' and usename != 'Ruby' order by 1 desc;3. 查看锁等待情况:通过查看锁等待情况,可以找出当前出现锁冲突的SQL,并进行解决首先执行附件中locks.txt创建相关视图,然后执行以下视图查询锁等待情况。select * from pgxc_locks_wait;4. 查杀语句:通过查看活跃语句及执行时间,找到coorname和pid,例如cn_5001和139906305218304执行execute direct on (cn_5001) 'select pg_terminate_backend(139906305218304)';查看结果是否为true5. 查看库内所有表大小:通过以下SQL可以查看库内所有表大小。建议在表数量不多时使用,库内超过1000张表时,运行速度可能较慢。Select nspname, relname, pg_table_size(c.oid) from pg_class c, pg_namespace n where c.relnamespace = n.oid and c.relkind = 'r' order by 3 desc;6. 查看数据倾斜建议在表数量不多时使用,库内超过1000张表时,运行速度可能较慢。SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;7. 查看库大小:select pg_database_size('your_database_name')8. 查看脏页率:DWS表数据在经过更新、删除后,会产生脏页,脏页会占用空间,需要使用vacuum full命令清理。通过以下命令可以检查脏页率情况。注意如果检查过程中有表被删除,此SQL可能报错,找其他时间重新运行即可。SELECT c.oid AS relid, n.nspname AS schemaname, c.relname,pg_stat_get_live_tuples(c.oid) AS n_live_tup,pg_stat_get_dead_tuples(c.oid) AS n_dead_tup,round(n_dead_tup * 100 / (n_live_tup + n_dead_tup+0.0001),2) AS dead_tup_ratioFROM pg_class cLEFT JOIN pg_index i ON c.oid = i.indrelidLEFT JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])GROUP BY c.oid, n.nspname, c.relnameorder by dead_tup_ratio desc;9. 查询系统内所有表行数:使用以下两步可以获取库中所有表实际行数,建议在表数量小于1000时使用,表数量较大时执行可能较慢。执行以下语句:select string_agg(a.v_sql,'union all ') from (select 'select '''||relname||''',count(*) from '||relname||' ' as v_sql from pg_class where relnamespace=2200 and relkind='r') a将执行结果拷贝到SQL执行窗口,进行执行。 
  • [其他] 【总结】【资源管理】工作负载管理实战
       一、   场景介绍当有多个数据库用户同时在DWS上执行SQL作业时,可能出现以下情况:1. 一些复杂SQL可能会长时间占用集群资源,从而影响其他查询的性能。例如一组数据库用户不断提交复杂、耗时的查询,而另一组用户经常提交短查询。在这种情况下,短时查询可能不得不在队列中等待耗时查询完成。2. 一些SQL由于数据倾斜、执行计划未调优等原因,占用过多内存空间,导致其他语句因申请不到内存而报错,或占用过多磁盘空间,导致磁盘满而触发集群只读,无法进行写入。为了提高系统整体吞吐量,避免坏SQL影响系统整体运行,可以使用DWS工作负载管理功能处理这类问题,DWS工作负载管理以工作负载队列为资源承载,对于不同的业务类型可以创建不同的工作负载队列,为这些队列配置不同的资源占比,然后将数据库用户添加至对应的队列中,以此来限制这些数据库用户的资源使用。例如,将经常提交复杂查询作业的数据库用户分为一类,为这类用户创建一个工作负载队列并给这个队列分配多一些的资源,之后将这类用户添加至这个队列中,那么这类用户所提交的复杂作业只能使用所创建队列拥有的资源;同时再创建一个占用资源较少的队列分配给执行短查询的用户使用,这样两种作业就能够同时执行互不影响。二、   框架介绍在实际业务运行中,系统压力可能集中在集群中的一部分节点或者系统资源中的某项资源,导致系统资源不能充分利用,集群性能不能充分发挥。因此,GaussDB(DWS)提供了基于用户资源池的资源管理功能,将不同类型的作业关联到不同的资源池分别管理,以实现系统资源(并发、CPU、内存、存储空间)的隔离和作业的异常处理,避免发生资源的不合理占用。工作负载管理支持配置的队列资源包含:并发、内存、CPU及磁盘空间,关联该队列的用户执行的所有作业均受队列资源限制。总体架构如下:三、   配置指南(一)        页面基本操作1.       进入工作负载管理步骤1:登录华为云或HCS首页,选择数据仓库服务跳转到DWS管理控制台。步骤2:在集群列表中单击需要访问“工作负载管理”页面的集群名称,例如DWS_openlab。步骤3:切换至“工作负载管理”页签。 在工作负载管理页面,您可以修改工作负载管理的全局配置,可以在工作负载管理页面添加、创建、修改工作负载队列,添加数据库用户至队列,也可以将队列中的某个数据库用户从队列中移除。负载管理页面添加、创建、修改工作负载队列,添加数据库用户至队列,也可以将队列中的某个数据库用户从队列中移除。此外,最新版本的DWS还支持工作负载队列资源的动态调整,用户可以指定任务计划,在不同时间段内为队列分配不同资源,来最大程度的利用系统资源。具体可见最佳实践案例二。工作负载管理页面概览如下。----结束2.      打开或关闭工作负载管理工作负载管理配置包括工作负载开关、全局最大并发数。这里的全局最大并发数指的是单个CN上的最大并发数,如果您通过工作负载开关关闭了工作负载管理功能,那么所有的工作负载管理功能将不再可用。3.      资源配置在“资源配置”一栏,您可以浏览当前工作负载队列的资源配置情况,包括“CPU资源(%)”、“内存资源(%)”、“存储资源(MB)”、“查询并发”。4.      设置异常规则在“异常规则”一栏,您可以浏览当前工作负载队列中的异常规则设置情况,异常规则允许您对队列中用户执行的作业做异常控制。5.      关联用户在“关联用户”一栏,您可以浏览当前工作负载队列中已关联的用户,且可以看到当前时间每个用户已使用的内存以及磁盘使用量,如下图所示。(二)        添加工作负载队列步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 单击工作负载队列旁的“+”符号添加队列。  步骤5: 参见表1-1填写工作负载队列的名称和相关资源配置。参数项描述取值名称工作负载队列的名称。queue_testCPU资源(%)队列中的数据库用户在执行作业时可使用的CPU时间片比例。20内存资源(%)队列所占用的内存百分比。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。20储存资源(MB)可使用的永久表空间大小。1024查询并发队列中的最大查询并发数。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。10显示添加工作负载队列:步骤6: 核对信息后,单击“确定”,添加队列完成。----结束(三)        修改工作负载队列在工作负载队列中,您可以对某个工作负载队列的参数进行修改。步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要修改的队列名称,出现如下页面,包括“短查询配置”、“资源配置”、“异常规则”、“关联用户”。步骤5: 修改短查询配置。修改为相应取值,单击右侧“保存”。如果集群中运行的是查询业务,或查询跑批混合业务,建议开启短查询加速,并根据当前队列在每个CN上可能运行的最大短查询并发数来设置短查询并发。这样,在系统中占用内存小于32MB的短查询将会单独排队运行,不和跑批复杂查询一起排队,加快短查询响应速度。 参数项描述取值短查询加速 短查询加速开关,默认打开 打开短查询并发 短查询作业为执行估算内存小于32MB的查询作业,默认值"1"表示不管控。 10配置完成后点击保存:步骤6: 修改资源配置。1、单击右侧“编辑”,参见下表修改相应参数。参数项描述取值名称工作负载队列的名称。queue_testCPU资源(%)队列中的数据库用户在执行作业时可使用的CPU时间片比例。20内存资源(%)队列所占用的内存百分比。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。20储存资源MB)可使用的永久表空间大小。1024查询并发队列中的最大查询并发数。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。102、单击“确定”。步骤7: 修改异常规则。(1)参见表1-3修改相应参数。说明:异常规则允许您对队列中用户执行的作业做异常控制,目前支持下表的相关配置。– 如选择“终止”,则需要设置相应时间。– 如选择“不约束”,则无异常规则约束。参数项描述取值阻塞时间作业的阻塞时间,单位秒。包括全局并发排队以及局部并发排队的总时间。例如,如果配置“阻塞时间”为300秒,那么当该队列中的用户执行的某个作业在阻塞300秒后将会被杀死。1200执行所消耗时间作业的已被执行时间,单位秒。从开始执行到当前所消耗的时间。  例如,如果配置“执行所消耗时间”为100秒,那么当该队列中的用户执行的某个作业在执行超过100秒后将被杀死。2400所有DN上CPU总时间作业在所有DN上执行时所耗费的CPU总时间,单位秒。100检查倾斜率的时间间隔检查作业执行CPU倾斜率的间隔时间,单位秒,需同“所有DN上CPU时间的倾斜率”一起设置。2400所有DN上CPU总时间倾斜率作业在DN上执行时的CPU时间的倾斜率,依赖于“检查倾斜率的时间间隔”的设置。90(2)单击“保存”。步骤8: 关联用户。说明:● 一个数据库用户只有被添加到某个队列中之后,该用户运行作业所使用的资源才能被管控。● 一个数据库用户只能被添加至一个队列中,从队列中移除的用户可以再次添加至其他队列。(1) 单击右侧“添加”。(2)从当前用户列表中,勾选需要添加的用户,一次可勾选多个。(3)单击“确定”。(4)如果需要删除用户,则单击待删除用户所在行右边的“删除”即可。----结束(四)        查询概览步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要查看的队列名称。在“查询概览”区域:可以看到当前时间当前队列中正在运行的长短查询数,图表信息15秒刷新一次。----结束(五)        删除工作负载队列步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要删除的队列名称。步骤5: 单击右侧的“删除”。说明:删除队列时如果队列中有关联的数据库用户,那么队列删除后这些用户将被关联默认队列。(六)        资源限制相关参数除了页面提供的工作负载管理功能外,DWS也提供了一些guc参数,来限制单语句占用的最大资源,避免单个语句占用过多资源,导致系统不可用。1.       query_max_memory: 限制单语句在单DN上占用的最大内存量,如单语句分配内存超过这个值,将进行报错,将内存归还给系统。建议按如下方法配置:1)  登陆任意CN查询:execute direct on (dn_1) 'select * from pg_total_memory_detail where memorytype = ''max_dynamic_memory''';查出来的值即为单个DN上所有SQL可以使用的总内存。2)  建议根据业务并发数,将query_max_memory设置为上步查出总内存的1/2, 1/3,假设系统表发数较小(<20),可设置为1/2, 如为中大并发(>20),可设置为1/3。 2.     sql_use_spacelimit:限制单语句在单个DN上最大插入的数据量大小,如单语句在单个DN上插入数据量超过这个值,将进行报错,避免单个SQL在单个DN上插入的数据量过大,造成DN严重倾斜,导致性能差,及磁盘满问题。建议此参数设置为单DN可用总空间的1/5。 ----结束四、   最佳实践以下以两个实践案例来说明工作负载管理的实际应用。其中案例一为XX财政工作负载管理配置,可以作为小规模集群(一般小于50节点)混合业务场景下的配置参考。案例二为XX银行工作负载管理配置,可以作为中大规模集群联机查询和复杂跑批混合业务场景下的配置参考。注意其中的配置指标值均为根据具体业务要求而定,实施时需要根据现场实际需求确定。(一)    小规模集群:XX财政工作负载管理规划XX财政业务场景主要分为联机交易(OLTP)和报表分析(OLAP)两大类,其中报表服务的优先级相对较低,在合理的情况下优先保障业务系统的正常运行。XX财政节点规模较小,其工作负载管理目标为避免报表分析业务影响联机交易,其资源负载管理配置可供中小规模集群(<60节点)的数据集市、BI分析、小型数仓集群参考。业务系统中运行的SQL分为简单SQL和复杂SQL,大量复杂SQL的并发执行会导致数据库服务器资源争抢,简单SQL的大量并发对服务器不构成持续压力,短时间内可执行完成,不会造成业务堆积。其中报表服务中运行的SQL以复杂SQL居多,整体业务逻辑相对复杂,在数据库层面需要分别对核心交易和报表服务进行合理的资源管控,以保障业务系统正常运行。报表分析类业务的优先级和实时性相对较低,但是复杂度更高,为有效进行资源管控,将报表分析和核心交易业务进行数据库用户分离,例如核心交易业务使用数据库用户budget_config_user,报表分析业务使用数据库用户report_user。针对交易用户和报表用户分别进行CPU资源和并发数控制以保障数据库稳定运行。结合报表分析业务的负载调研、日常监控和测试验证,50并发以内的复杂报表SQL不会引起服务器资源争抢,不会引起业务系统卡慢,配置报表用户可使用20%的CPU资源。结合核心交易业务的负载调研、日常监控和测试验证,100并发以内的查询SQL不会对系统造成持续压力,配合交易用户可使用60%的CPU资源。l  交易用户资源配置:CPU=60%,并发=200,内存=60%,存储=1024000MB。l  报表用户资源配置:CPU=20%,并发=20,内存=20%,存储=1024000MB。l  设置单个语句最大内存使用量,超过使用量则报错退出,避免单个语句占用过多内存。 异常规则中设置阻塞时间=1200S,执行所消耗时间1800s,强制终止。(二)        中大规模集群:XX银行工作负载管理规划XX银行使用DWS作为银行核心数据仓库,每日运行批处理任务,也供业务用户进行一些灵活查询。为了更充分的利用系统资源,同时兼顾到各个类型业务的要求,根据DWS工作负载管理提供的能力,设计了XX银行工作负载管理方案。XX银行节点规模大,达240节点,其工作负载管理目标为合理调配多种业务占用的资源,达到资源利用效率的最佳配置,其资源负载管理配置可供中大规模集群(>60节点)的企业级数据仓库、行业云数据仓库参考。XX银行数据仓库中的任务可以分为以下三大类:1.      跑批任务。跑批任务是数据仓库内主要运行的任务,主要分为数据加载、批量加工和数据导出三类。其中,加载作业先运行,然后是批量加工作业,最后由数据导出作业将加工的结果同步到下游系统。加载作业主要在0:00~05:00运行,批量加工作业基本持续一整天,需要和其他类型任务一起综合考虑资源分配。导出任务主要在12:00~14:00运行。2.      业务用户灵活查询。业务灵活查询由业务分析师、数据挖掘工程师等发起,主要在上班时间内进行,即每天09:00~12:00, 14:00~20:00两个时间段。3.      运维任务(备份等)。运维任务主要是数据备份。当前XX银行数据备份采用的是GDS导出方案,主要在20:00~24:00运行。具体工作负载计划见下表所示: 因此,根据上述6类任务类型,划分6个队列,每个队列都可以在相应时间段内按照负载计划自动调整资源利用情况(自动调整资源功能需升级到最新版本才能使用),在每个时间段内分配不同的并发、CPU、内存资源,实现了不同时间段内作业优先级的动态调整,即保证了业务优先级,也使得系统总体资源利用最大化。同时,每个队列也根据业务实际需求分配了最大空间使用量。下图为相应的负载模型,将不同的用户加入到不同的队列中,来实现对用户占用资源的管控。此外,针对异常作业占用过多资源问题,XX银行也利用DWS异常处理功能,设置了丰富的异常SQL处理规则,见下表所示:       同时,为了避免单个语句占用过多磁盘、内存资源,也可以使用以下参数来对单语句使用的内存、磁盘空间资源进行限制。query_max_memory:限制单语句在单DN上占用的最大内存量,如单语句分配内存超过这个值,将进行报错,将内存归还给系统。XX银行单DN最大可用动态内存为100GB,并发数为60,query_max_memory设置为30GB。sql_use_spacelimit:限制单语句在单个DN上最大插入的数据量大小,XX银行单个DN可用磁盘空间为2TB,sql_use_spacelimit设置为400GB。 
  • [SQL] 【GaussDB(DWS)征文】GaussDB(DWS)安全:隐私保护现真招儿——数据脱敏
    【摘要】 GaussDB (DWS)产品数据脱敏功能,是数据库产品内化和夯实数据安全能力的重要技术突破。提供指定用户范围内列级敏感数据的脱敏功能,具有灵活、高效、透明、友好等优点,极大地增强产品的数据安全能力,实现敏感数据的可靠保护。更佳阅读体验,请移步【原创】GaussDB(DWS)安全:隐私保护现真招儿——数据脱敏引言        大数据时代的到来,颠覆了传统业态的运作模式,激发出新的生产潜能。数据成为重要的生产要素,是信息的载体,数据间的流动也潜藏着更高阶维度的价值信息。对于数据控制者和数据处理者而言,如何最大化数据流动的价值,是数据挖掘的初衷和意义。然而,一系列信息泄露事件的曝光,使得数据安全越来越受到广泛的关注。各国各地区逐步建立健全和完善数据安全与隐私保护相关法律法规,提供用户隐私保护的法律保障。如何加强技术层面的数据安全和隐私保护,对数据仓库产品本身提出更多的功能要求,也是数据安全建设最行之有效的办法。        GaussDB (DWS)产品8.1.1版本发布数据脱敏特性,提供指定用户范围内列级敏感数据的脱敏功能,具有灵活、高效、透明、友好等优点,极大地增强产品的数据安全能力。什么是数据脱敏?        数据脱敏(Data Masking),顾名思义,是屏蔽敏感数据,对某些敏感信息(比如,身份证号、手机号、卡号、客户姓名、客户地址、邮箱地址、薪资等等 )通过脱敏规则进行数据的变形,实现隐私数据的可靠保护。业界常见的脱敏规则有,替换、重排、加密、截断、掩码,用户也可以根据期望的脱敏算法自定义脱敏规则。        通常,良好的数据脱敏实施,需要遵循如下两个原则,第一,尽可能地为脱敏后的应用,保留脱敏前的有意义信息;第二,最大程度地防止黑客进行破解。        数据脱敏分为静态数据脱敏和动态数据脱敏。静态数据脱敏,是数据的“搬移并仿真替换”,是将数据抽取进行脱敏处理后,下发给下游环节,随意取用和读写的,脱敏后数据与生产环境相隔离,满足业务需求的同时保障生产数据库的安全。动态数据脱敏,在访问敏感数据的同时实时进行脱敏处理,可以为不同角色、不同权限、不同数据类型执行不同的脱敏方案,从而确保返回的数据可用而安全。        GaussDB (DWS)的数据脱敏功能,摒弃业务应用层脱敏依赖性高、代价大等痛点,将数据脱敏内化为数据库产品自身的安全能力,提供了一套完整、安全、灵活、透明、友好的数据脱敏解决方案,属于动态数据脱敏。用户识别敏感字段后,基于目标字段,绑定内置脱敏函数,即可创建脱敏策略。脱敏策略(Redaction Policy)与表对象是一一对应的。一个脱敏策略包含表对象、生效条件、脱敏列-脱敏函数对三个关键要素,是该表对象上所有脱敏列的集合,不同字段可以根据数据特征采用不同的脱敏函数。当且仅当生效条件为真时,查询语句才会触发敏感数据的脱敏,而脱敏过程是内置在SQL引擎内部实现的,对生成环境用户是透明不可见的。怎么用数据脱敏?        动态数据脱敏,是在查询语句执行过程中,根据生效条件是否满足,实现实时的脱敏处理。生效条件,通常是针对当前用户角色的判断。敏感数据的可见范围,即是针对不同用户预设的。系统管理员,具有最高权限,任何时刻对任何表的任何字段都可见。确定受限制用户角色,是创建脱敏策略的第一步。        敏感信息依赖于实际业务场景和安全维度,以自然人为例,用户个体的敏感字段包括:姓名、身份证号、手机号、邮箱地址等等;在银行系统,作为客户,可能还涉及银行卡号、过期时间、支付密码等等;在公司系统,作为员工,可能还涉及薪资、教育背景等;在医疗系统,作为患者,可能还涉及就诊信息等等。所以,识别和梳理具体业务场景的敏感字段,是创建脱敏策略的第二步。        产品内置一系列常见的脱敏函数接口,可以针对不同数据类型和数据特征,指定参数,从而达到不一样的脱敏效果。脱敏函数可采用如下三种内置接口,同时支持自定义脱敏函数。三种内置脱敏函数能够涵盖大部分场景的脱敏效果,不推荐使用自定义脱敏函数。MASK_NONE:不作脱敏处理,仅内部测试用。MASK_FULL:全脱敏成固定值。MASK_PARTIAL:使用指定的脱敏字符对脱敏范围内的内容做部分脱敏。        不同脱敏列可以采用不同的脱敏函数。比如,手机号通常显示后四位尾号,前面用"*"替换;金额统一显示为固定值0,等等。确定脱敏列需要绑定的脱敏函数,是创建脱敏策略的第三步。        以某公司员工表emp,表的属主用户alice以及用户matu、july为例,简单介绍数据脱敏的使用过程。其中,表emp包含员工的姓名、手机号、邮箱、发薪卡号、薪资等隐私数据,用户alice是人力资源经理,用户matu和july是普通职员。    假设表、用户及用户对表emp的查看权限均已就绪。创建脱敏策略mask_emp,仅允许alice查看员工所有信息,matu和july对发薪卡号、薪资均不可见。字段card_no是数值类型,采用MASK_FULL全脱敏成固定值0;字段card_string是字符类型,采用MASK_PARTIAL按指定的输入输出格式对原始数据作部分脱敏;字段salary是数值类型,采用数字9部分脱敏倒数第二位前的所有数位值。postgres=# CREATE REDACTION POLICY mask_emp ON emp WHEN (current_user != 'alice') ADD COLUMN card_no WITH mask_full(card_no), ADD COLUMN card_string WITH mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV','VVVV-VVVV-VVVV-VVVV','#',1,12), ADD COLUMN salary WITH mask_partial(salary, '9', 1, length(salary) - 2);       切换到matu和july,查看员工表emp。postgres=>SET ROLE matu PASSWORD 'Gauss@123'; postgres=>SELECT * FROM emp;  id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday ----+------+-------------+---------+---------------------+----------------------+------------+---------------------   1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00   2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00   3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00 (3 rows) postgres=>SET ROLE july PASSWORD 'Gauss@123'; postgres=>SELECT * FROM emp;  id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday ----+------+-------------+---------+---------------------+----------------------+------------+---------------------   1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00   2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00   3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00 (3 rows)    2. 由于工作调整,matu进入人力资源部参与公司招聘事宜,也对员工所有信息可见,修改策略生效条件。postgres=>ALTER REDACTION POLICY mask_emp ON emp WHEN(current_user NOT IN ('alice', 'matu'));        切换到用户matu和july,重新查看员工表emp。postgres=>SET ROLE matu PASSWORD 'Gauss@123'; postgres=>SELECT * FROM emp;  id | name |  phone_no   |     card_no      |     card_string     |        email         |   salary   |      birthday ----+------+-------------+------------------+---------------------+----------------------+------------+---------------------   1 | anny | 13420002340 | 1234123412341234 | 1234-1234-1234-1234 | smithWu@163.com      | 10000.0000 | 1999-10-02 00:00:00   2 | bob  | 18299023211 | 3456345634563456 | 3456-3456-3456-3456 | 66allen_mm@qq.com    |  9999.9900 | 1989-12-12 00:00:00   3 | cici | 15512231233 |                  |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00 (3 rows) postgres=>SET ROLE july PASSWORD 'Gauss@123'; postgres=>SELECT * FROM emp;  id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday ----+------+-------------+---------+---------------------+----------------------+------------+---------------------   1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00   2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00   3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00 (3 rows)        3. 员工信息phone_no、email和birthday也是隐私数据,更新脱敏策略mask_emp,新增三个脱敏列。postgres=>ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN phone_no WITH mask_partial(phone_no, '*', 4); postgres=>ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN email WITH mask_partial(email, '*', 1, position('@' in email)); postgres=>ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN birthday WITH mask_full(birthday);        切换到用户july,查看员工表emp。postgres=>SET ROLE july PASSWORD 'Gauss@123'; postgres=>SELECT * FROM emp;  id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday ----+------+-------------+---------+---------------------+----------------------+------------+---------------------   1 | anny | 134******** |       0 | ####-####-####-1234 | ********163.com      | 99999.9990 | 1970-01-01 00:00:00   2 | bob  | 182******** |       0 | ####-####-####-3456 | ***********qq.com    |  9999.9990 | 1970-01-01 00:00:00   3 | cici | 155******** |         |                     | ************sina.com |            | 1970-01-01 00:00:00 (3 rows)      4. 考虑用户交互的友好性,GaussDB (DWS) 提供系统视图redaction_policies和redaction_columns,方便用户直接查看更多脱敏信息。postgres=>SELECT * FROM redaction_policies;  object_schema | object_owner | object_name | policy_name |            expression             | enable | policy_description ---------------+--------------+-------------+-------------+-----------------------------------+--------+--------------------  public        | alice        | emp         | mask_emp    | ("current_user"() NOT IN ('alice'::name, 'matu'::name)) | t      | (1 row) postgres=>SELECT object_name, column_name, function_info FROM redaction_columns;  object_name | column_name |                                             function_info -------------+-------------+-------------------------------------------------------------------------------------------------------  emp         | card_no     | mask_full(card_no)  emp         | card_string | mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV'::text, 'VVVV-VVVV-VVVV-VVVV'::text, '#'::text, 1, 12)  emp         | email       | mask_partial(email, '*'::text, 1, "position"(email, '@'::text))  emp         | salary      | mask_partial(salary, '9'::text, 1, (length((salary)::text) - 2))  emp         | birthday    | mask_full(birthday)  emp         | phone_no    | mask_partial(phone_no, '*'::text, 4) (6 rows)        5. 突然某一天,公司内部可共享员工信息时,直接删除表emp的脱敏策略mask_emp即可。postgres=# DROP REDACTION POLICY mask_emp ON emp;更多用法详情,请参考GaussDB (DWS) 8.1.1产品文档。数据脱敏实现背后的秘密       GaussDB (DWS)数据脱敏功能,基于SQL引擎既有的实现框架,在受限用户执行查询语句过程中,实现外部不感知的实时脱敏处理。关于其内部实现,如上图所示。我们将脱敏策略(Redaction Policy)视为表对象上绑定的规则,在优化器查询重写阶段,遍历Query Tree中TargetList的每个TargetEntry,如若涉及基表的某个脱敏列,且当前脱敏规则生效(即满足脱敏策略的生效条件且enable开启状态),则断定此TargetEntry中涉及要脱敏的Var对象,此时,遍历脱敏列系统表pg_redaction_column,查找到对应脱敏列绑定的脱敏函数,将其替换成对应的FuncExpr即可。经过上述对Query Tree的重写处理,优化器会自动生成新的执行计划,执行器遵照新的计划执行,查询结果将对敏感数据做脱敏处理。        带有数据脱敏的语句执行,相较于原始语句,增加了数据脱敏的逻辑处理,势必会给查询带来额外的开销。这部分开销,主要受表的数据规模、查询目标列涉及的脱敏列数、脱敏列采用的脱敏函数三方面因素影响。      针对简单查询语句,以tpch表customer为例,针对上述因素展开测试,如下图所示。        图(a)、(b)中基表customer根据字段类型和特征,既有采用MASK_FULL脱敏函数的,也有采用MASK_PARTIAL脱敏函数的。MASK_FULL对于任何长度和类型的原始数据,均只脱敏成固定值,所以,输出结果相较于原始数据,差异很大。图(a)显示不同数据规模下,脱敏和非脱敏场景简单查询语句的执行耗时。实心图标为非脱敏场景,空心图标为被限制用户,即脱敏场景。可见,数据规模越大,带有脱敏的查询耗时与原始语句差异越大。图(b)显示10x数据规模下查询涉及脱敏列数不同对于语句执行性能的影响。涉及1列脱敏列时,带有脱敏的查询比原始语句慢,追溯发现,此列采用的是MASK_PARTIAL部分脱敏函数,查询结果只是改变了结果的格式,结果内容的长度并未变化,符合“带有脱敏的语句执行会有相应的性能劣化”的理论猜想。随着查询涉及脱敏列数的增加,我们发现一个奇怪的现象,脱敏场景反倒比原始语句执行更快。进一步追溯多列场景下脱敏列关联的脱敏函数,发现,正是因为存在使用MASK_FULL全脱敏函数的脱敏列,导致输出结果集部分相比原始数据节省很多时间开销,从而多列查询下带有数据脱敏的简单查询反倒提速不少。        为了佐证上述猜测,我们调整脱敏函数,所有脱敏列均采用MASK_PARTIAL对原始数据做部分脱敏,从而能够在脱敏结果上保留原始数据的外部可读性。于是,如图(c)所示,当脱敏列均关联部分脱敏函数时,带有数据脱敏的语句比原始语句劣化10%左右,理论上讲,这种劣化是在可接受范围的。上述测试仅针对简单的查询语句,当语句复杂到带有聚集函数或复杂表达式运算时,可能这种性能劣化会更明显。总结GaussDB (DWS)产品数据脱敏功能,是数据库产品内化和夯实数据安全能力的重要技术突破,主要涵盖以下三个方面:一套简单、易用的数据脱敏策略语法;一系列可覆盖常见隐私数据脱敏效果的、灵活配置的内置脱敏函数;一个完备、便捷的脱敏策略应用方案,使得原始语句在执行过程中可以实时、透明、高效地实现脱敏。总而言之,此数据脱敏功能可以充分满足客户业务场景的数据脱敏诉求,支持常见隐私数据的脱敏效果,实现敏感数据的可靠保护。【温馨提示】使用过程中,如有疑问,欢迎随时交流反馈。                                                   
  • [分享驿站] GaussDB A 审计功能简介
    数据库审计,指的是将用户对数据库的所有操作写入审计日志中,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。如何使用数据库审计,这里以审计事务功能为例:1. 设置审计配置项要使数据库能够审计到某项功能,需要打开审计的总开关(audit_operation_exec)和对应的审计项开关(audit_operation_exec),二者均支持动态加载,在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。首先打开审计总开关audit_enabled(默认开启)。登录数据库,检查audit_enabled状态postgres=# show audit_enabled;  audit_enabled  ---------------  off(1 row)若为off ,则使用如下命令打开gs_guc reload -Z coordinator -Z datanode -N all -I all  -c "audit_enabled=on"然后打开具体审计事务配置项gs_guc reload -Z coordinator -Z datanode -N all -I all  -c "audit_operation_exec='transaction'"postgres=# show audit_operation_exec;  audit_operation_exec  ----------------------  transaction(1 row) audit_operation_exec 默认的配置项有login, logout, database_process, user_lock, grant_revoke, set,如果想增加审计配置项,进行追加配置即可,目前支持的配置项有all,login,logout,database_process,user_lock,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,insert_filter,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor。有两点需要注意,其一如果审计ddl操作,需要另外配置audit_system_object 来审计具体某个对象的ddl 操作;其二如果是审计事务,事务内部的操作是否审计需要结合其具体的配置项是否配置。 2. 查看审计日志。审计查询命令是pg_query_audit, 其使用方法为pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)startime 和 endtime 分别表示审计记录的开始时间和结束时间,audit_log 表示所查看的审计日志新的所在的物理文件路径,当不指定audit_log 时,默认查看连接当前实例的审计日志信息。通过查询pgxc_query_audit 可以查询所有CN节点的审计日志信息:pgxc_query_audit(timestamptz startime,timestamptz endtime)除了上面审计成功的场景之外,还可以通过配置audit_operation_error 来审计失败的操作记录。默认的配置项有login,目前支持的配置项有syn_success,parse,login,user_lock,violation,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor,blacklist。当配置了该参数之后,其对应的失败操作也会被记录到审计日志当中,如下例postgres=# create table t1(id int);ERROR:  relation "t1" already exists postgres=#  postgres=# select * from pg_query_audit('2021-03-21','2021-03-30') order by endtime desc limit 1;-[ RECORD 1 ]---+--------------------------------begintime       | 2021-03-21 11:49:41.643+08endtime         | 2021-03-21 11:49:41.652+08operation_type  | ddl audit_type      | ddl_table result          | failed username        | perfadm database        | postgres client_conninfo | gsql@[local]object_name     | t1 command_text    | create table t1(id int);detail_info     | relation "t1" already exists transaction_xid | 0query_id        | 1062177node_name       | cn_5001 thread_id       | 139916885260032@669613657906735local_port      | 6000remote_port     |
  • [实践系列] GaussDB(DWS) 【对接数据可视化工具Grafana】
    GaussDB (DWS)时序数仓对接Grafana 方案【摘要】 本方案指导用户配置Grafana,实时展示GaussDB(DWS)实时数仓中的数据,方案中采用存储过程构造模拟数据,真实场景下请接入真实数据。一、Grafana 软件部署(windows版)Grafana下载地址:https://grafana.com/grafana/download?platform=windows下载完成后,在windows路径下解压文件grafana-7.4.3.windows-amd64.rar:进入bin目录双击grafana-server启动服务Grafana登录地址:http://localhost:3000 默认用户名及密码:admin/admin,第一次登陆会提示修改密码,登陆后页面如下:二、GaussDB(DWS)对接Grafana,展示实时数据       1.Data Studio登录GaussDB(DWS)集群,创建用户、数据库及测试表--创建用户create user <USER> password '********';--创建数据库create database <DATABASE> owner <USER> encoding='utf-8' TEMPLATE template0;--赋予用户<USER> 模式public权限GRANT ALL PRIVILEGES ON SCHEMA public TO <USER>;备注:命令中用户、数据库等信息根据真实场景替换2.创建测试表,构造时序数据1)创建测试表Data Studio上使用新建的<USER>用户登录<DATABASE>数据库创建测试表,并构造时序数据创建测试表:drop table if exists public.test;create  table if not exists public.test(,tag_column      text  TSTag,Field_column    double precision  TSField,time        timestamp without time zone  TSTime)with (TTL='7 days', PERIOD = '1 day', orientation=TIMESERIES);语法介绍:TSTag:维度属性字段TSField:指标属性字段TSTime:时间属性字段TTL:数据生命周期,此表数据生命周期为7天PERIOD:自动创建分区间隔,此表分区按照1天间隔创建Orientation:表属性,TIMESERIES说明是时间序列表 1)创建造数程序创建存储过程insert_data(),模拟时序数据入库CREATE OR REPLACE PROCEDURE insert_data(v_number bigint)ASDECLARE  v_insert_test_string VARCHAR2(4000);  var_count               bigint;BEGIN  var_count               :=   0;  v_insert_test_string :=             'insert into public.test(                                            ,tag_column                                            ,Field_column                                            ,time                                          )                                            values(                                          ,''fioawhefawief''                                            ,random()                                            ,clock_timestamp()                                          );';  while var_count <   v_number loop    EXECUTE IMMEDIATE   v_insert_test_string;    var_count :=   var_count+1;    pg_sleep(5);    commit;  end loop;END;/执行存储过程,执行数据插入1000次,每5s插入一次call insert_data(1000);  2.Grafana配置Grafana中配置DWS数据源àData Sources点击 Add data source选择PostgreSQL数据源配置DWS集群信息Save&Test保存Database Connection OK 说明连通性测试成功3)         配置时序图标展示数据点击+Add new panel配置数据源,选择$DWS配置区配置要展示的时序数据,如下图:可切换为SQL模式配置完成后点击apply应用此配置页面可以选择时序数据展示的时间区间及刷新频率 
  • [对接系列] GaussDB(DWS)与Kettle对接指导
    Kettle是Pentaho开发的一款开源ETL工具,可在Window、Linux、Unix上运行,抽取数据高效稳定。它提供了一个图形化的用户界面来管理来自不同数据库的数据。如下博文以Windows 7 专业版、Kettle 6.1为例,讲解如何安装和配置Kettle工具。链接如下:https://bbs.huaweicloud.com/blogs/238753
  • [生态空间] GaussDB(DWS)数仓生态地图_工具类
    GaussDB(DWS)数仓生态地图_工具类:版本说明:【GaussDB A】6.5.1/8.0.0/8.1.1类型细分类别产品公司/组织对接版本对接产品工具BIMicrosoft   PowerBI微软 GaussDB(DWS)SAS Enterprise BI serverSAS9.4M5GaussDB(DWS)SAP Business Objects(SAP BO)SAP4.2 sp5GaussDB(DWS)IBM Cognos AnalyticsIBM11.3GaussDB(DWS)TableauTableau10.4GaussDB(DWS)Qlik View  QlikViewQlik11.20.13314.0GaussDB(DWS)developerInformatica9.6.1GaussDB(DWS)KNIME Analytics PlatformKNIME4.1.0(JDBC   timestamp   with tz类型不支持)GaussDB(DWS)FineBI帆软软件有限公司5.1GaussDB(DWS)Primeton BigData/MetaCube等系列产品普元信息技术股份有限公司6.2GaussDB(DWS)永洪BI北京永洪商智科技有限公司8.6GaussDB(DWS)亿信BI北京亿信华辰软件有限责任公司4.7GaussDB(DWS)SmartBI广州思迈特软件有限公司V9GaussDB(DWS)ETLIBM InfoSphere     DataStageIBM7.5.2GaussDB(DWS)Informatica PowerCenterInformatica9.6.1GaussDB(DWS)Primeton BigData/MetaCube等系列产品普元信息技术股份有限公司6.2GaussDB(DWS)DataEtl华云中盛科技有限公司2GaussDB(DWS)KettleApache6.1GaussDB(DWS)报表CongnosIBM11.3GaussDB(DWS)SAP Cristal Report  中文名:水晶报表SAP4.2 sp5GaussDB(DWS)FineReport帆软软件有限公司10GaussDB(DWS)永洪Y-Reporting北京永洪商智科技有限公司科技8.6GaussDB(DWS)亿信BI北京亿信华辰软件有限责任公司4.7GaussDB(DWS)Spreadsheet广州思迈特软件有限公司V9GaussDB(DWS)数据挖掘SAS Enterprise MinerSAS9.4M5GaussDB(DWS)SSAS(SQL Server Analysis Service in VS)微软15.1     (最新的15.9+模型导入时SQL不兼容)GaussDB(DWS)数据复制R7-DIP翱旗科技 GaussDB(DWS)TurboDX DM北京数贝软件科技有限公司V4.0GaussDB(DWS)DRS 华为云 GaussDB(DWS)OTG深圳市商软信息科技有限公司4.2GaussDB(DWS)数据集成Informatica     PowerCenterInformatica9.6.1GaussDB(DWS)SSIS微软2008和2017(15.0.1301.433)GaussDB(DWS)SSDQ微软14.0.1000.169GaussDB(DWS)数据治理平台北京亿信华辰软件有限责任公司2.2GaussDB(DWS)中创企业服务总线ESB山东中创软件商用中间件股份有限公司10GaussDB(DWS)备份恢复Veritas     NetBackUp(NBU)Veritas7.7.3GaussDB(DWS)AnyBackup Express 爱数V7GaussDB(DWS)AnyBackup CDM爱数V7GaussDB(DWS)BDMP迪思杰(北京)数据管理技术有限公司V6.0GaussDB(DWS)作业调度(独立)Control-MBMC GaussDB(DWS)报表/可视化SSRS微软15.0.1395.0GaussDB(DWS)Fine系列软件帆软软件有限公司10GaussDB(DWS)北京永洪商智科技有限公司Z-Data Hub北京永洪商智科技有限公司8.6GaussDB(DWS)SmartBI系列软件广州思迈特软件有限公司V9GaussDB(DWS)大数据可视化平台北京睿呈时代信息科技有限公司V2.0GaussDB(DWS)安全数据库安全审计系统   数据库安全管理产品北京安华金和科技有限公司V3.2GaussDB(DWS)闪捷数据库审计与防护系统杭州闪捷信息科技有限公司V3.0GaussDB(DWS)闪捷数据库加密系统杭州闪捷信息科技有限公司V3.0GaussDB(DWS)华为云数据库安全服务,DBSS华为云 GaussDB(DWS)数据治理平台(加密)北京亿信华辰软件有限责任公司2.2GaussDB(DWS)运维监控ZnSQL上海新炬网络信息技术股份有限公司V3.0GaussDB(DWS)ZnAIOps上海新炬网络信息技术股份有限公司V4.0GaussDB(DWS)UMP监控平台山东中创软件商用中间件股份有限公司 GaussDB(DWS)操作系统RHEL(Red Hat     Enterprise Linux)红帽公司6.4+/7.0+GaussDB(DWS)SLES(SUSE Enterprise Linux   System)Novell11     SP1/SP2/SP3/SP4GaussDB(DWS)12 SP0/SP1/SP2/SP3GaussDB(DWS)CentOS红帽公司6.4+/7.0+GaussDB(DWS)中标麒麟 KylinOS中标软件有限公司V7.0GaussDB(DWS)EulerOS华为2.8GaussDB(DWS)深度OS武汉深之度科技有限公司V15GaussDB(DWS)银河麒麟天津银河麒麟信息技术有限公司V4.0GaussDB(DWS)红旗RedFlag中国中科红旗软件技术有限公司7.5GaussDB(DWS)云平台/SaaSFusionSphere华为云 GaussDB(DWS)苍穹云平台金蝶软件(中国)有限公司V1.5GaussDB(DWS)开发工具toadQuest Software GaussDB(DWS)DbVisualizer DbVis Software10.0.26GaussDB(DWS)DbeaverApache5.3.5/6.3.5GaussDB(DWS)Web中间件WebLogic 应用中间件Oracle GaussDB(DWS)Inforsuite AS 应用中间件山东中创软件商用中间件股份有限公司V10.0GaussDB(DWS) 通用ISV金蝶云・苍穹高斯数据库解决方案金蝶软件(中国)有限公司-GaussDB(DWS)金融数据质量管控平台厦门至恒融兴信息技术有限公司-GaussDB(DWS)金融调度监控预警江苏红网技术股份有限公司-GaussDB(DWS)金融数仓深圳市长亮科技股份有限公司-GaussDB(DWS)交通智慧交通北京易华录信息技术股份有限公司-GaussDB(DWS)教育万数大数据决策分析平台浙江万朋教育科技股份有限公司-GaussDB(DWS)教育数据分析中间件南京迪塔维数据技术有限公司-GaussDB(DWS)教育数据治理南京迪塔维数据技术有限公司-GaussDB(DWS)教育教育大数据平台恒峰信息技术有限公司-GaussDB(DWS)数字政府智慧应急联合解决方案广州欣纬软件技术有限公司-GaussDB(DWS)数字政府基于GaussDB的大数据可视化平台北京睿呈时代信息科技有限公司-GaussDB(DWS)数字政府【鲲鹏】华为政务大数据与城信所时空大数据解决方案广州城市信息研究所有限公司-GaussDB(DWS)数字政府华为鲲鹏服务器的Gaussdb与中星技术的视**应用测试中星电子股份有限公司-GaussDB(DWS)数字政府政务大数据平台软通动力信息技术有限公司-GaussDB(DWS)数字政府华为&超图公司时空大数据平台联合解决方案北京超图软件股份有限公司-GaussDB(DWS)数字政府华为&中地数码时空大数据与云平台联合解决方案武汉中地数码科技有限公司-GaussDB(DWS)数字政府预算管理一体化系统/公共技术平台/授权中心北京博思致新互联网科技有限责任公司-GaussDB(DWS)数字政府政府智能会计管理系列产品V1.0北京博思财信网络科技有限公司-GaussDB(DWS)数字政府数据治理深圳市华傲数据技术有限公司-GaussDB(DWS)数字政府地理信息系统易智瑞(中国)信息技术有限公司-GaussDB(DWS)数字政府数据安全,数据共享交换软通动力信息技术有限公司-GaussDB(DWS)数字政府GIS地址生产顺丰科技有限公司-GaussDB(DWS)数字政府数据治理苏州龙石信息科技有限公司-GaussDB(DWS)数字政府智慧海关迪思杰(北京)数据管理技术有限公司-GaussDB(DWS)医疗全民健康上海森亿医疗科技有限公司-GaussDB(DWS)媒资媒体云北明软件有限公司-GaussDB(DWS)
  • [对接系列] GaussDB(DWS)与OGG对接
    OGG即oracle goldengate是一款oracle公司的ETL工具。下面博文详细介绍了ogg和GaussDB(DWS)的对接和配置方法。https://bbs.huaweicloud.com/blogs/233084
  • [对接系列] GAUSSDB(DWS)对接OBIEE指导
    ORACLE Business Intelligence Suite Enterprise Edition ( Oracle BIEE)是一种提供了整套的分析和报表功能的企业级商业智能产品。OBIEE支持针对详细商业数据的深入分析和数据挖掘,提供对做出关键决策的真实有用信息。OBIEE包含了一系列的组件,例如“Answer”,“Delivers”,“Interactive Dashboard”和“Applications”。GAUSSDB(DWS)与OBIEE可以实现高效对接,具体指导参见如下博文:https://bbs.huaweicloud.com/blogs/237332
  • [技术原理] SQL中几种集合操作的对比介绍
    UNIONUNION指令的目的是将两个SQL语句的结果合并起来,从这个角度来看,UNION跟JOIN有些许类似。但UNION的一个限制是两个SQL语句所产生的结果列需要是保持一致。另外,UNION执行过程中会对结果进行去重处理,最终结果返回的是不同的值(类似SELECTDISTINCT)。UNION ALLUNION ALL这个指令的目的也是要将两个SQL语句的结果合并在一起。UNION ALL和UNION的处理方式基本一致,所需的限制也是相同,不同之处在于UNION ALL不会对结果进行去重操作,只会将每一个符合条件的结果都列出来,无论结果值有无重复。INTERSECT同样和UNION指令类似,INTERSECT也是对两个SQL语句所产生的结果做处理的。不同的地方是,UNION在处理逻辑上是一个OR的关系(如果这个值存在于第一句或是第二句,它就会被选出),而INTERSECT的处理逻辑则是AND的关系(这个值要存在于第一句和第二句才会被选出)。简而言之,UNION是并集,而INTERSECT是交集。MINUSMINUS指令同样是运用在两个SQL语句上。它先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中,如果有的话,那这一个结果就被去除,而不会在最后的结果中出现,如果没有则会在最终结果显示。第二个SQL语句所产生的结果不管是不是在第一个SQL的结果中都不会在最终结果中显示。MINUS指令即相当于SQL1与SQL2的差集。上面四种关联的语法均相同,如下格式:[SQL 语句 1]UNION | UNION ALL | INTERSECT | MINUS[SQL 语句 2]共同的限制点都是SQL 语句 1与SQL 语句 2所返回的查询结果列需保持一致。
总条数:19 到第
上滑加载中