华为云用户手册

  • 需要使用Hashtag的多Key命令 以下命令需要使用hashtag,否则会报crossslot错误。 表4 需要使用Hashtag的多Key命令 命令类型 命令 String msetnx List blpopbrpop brpoplpush brpoplpush Set sdiffsdiffstore sinter sinterstore smove sunionsunionstore Sorted Set zinterstore zunionstore Stream xread xreadgroup HyperLogLog pfcount pfmerge Geo georadius georadiusbymember Bitmap bitop Lua eval evalsha
  • Bloom Filter GeminiDB Redis的布隆过滤器底层使用Hash结构实现,请不要使用Hash类型的同名Key。 bf.loadchunk和bf.scandump命令用于迁移,因存储方式不同,不予支持。 出于安全考虑,bf.reserve初始设置的capacity上限为2621440(2M), 当输入的capacity值超过2M时会将capacity自动设置为2M。如需要更大的capacity,请使用布隆过滤器的扩展功能;expansion参数上限为10,超过限制时会自动调整为10。 详情请参考Bloom Filter介绍和Bloom Filter命令说明。 表3 Bloom Filter支持的命令 命令 是否支持 备注 bf.add √ - bf.exists √ - bf.info √ - bf.insert √ - bf.madd √ - bf.mexists √ - bf.reserve √ -
  • 企业级特性介绍 GeminiDB Redis接口基于云原生分布式架构,实现了计算与存储分离,完全兼容社区版Redis5.0及以下版本,提供了更多的企业级特性。 资源独享,分片不限流 计算节点部署在独享容器,租户隔离,稳定性高。面对高并发流量,节点不被限流。 内置独享型负载均衡器,转发性能和稳定性更高。 计算节点支持绑定公网IP,方便用户迁移上云和远程调试。 秒级弹性伸缩,轻松应对业务峰谷 支持存储和计算各自独立伸缩。单实例最大支持千万级QPS和36TB容量。 数据量增长场景,容量的扩容只需一键即可秒级完成,业务应用无感知。 业务量突增的场景(比如游戏、电商的活动期间,临时有更高的QPS诉求),可通过增加节点和提升规格两种方式进行扩容,后续可轻松缩容,对业务的影响仅为秒级连接重连。 一库替代多库,简化业务架构 基于高性能存储池,实例自动加载高频访问的热数据在计算节点的内存中,内部自动完成冷热数据交换,业务优先从内存中读取热数据,兼顾数据的高可靠和低时延。 GeminiDB Redis接口适合存储持续增长的重要业务数据(比如游戏玩家数据、用户画像、行为日志、文章资讯等),相比使用Redis+MySQL的架构场景,架构更简洁、数据存储更可靠,同时还具备更高的综合性能和性价比。 支持3AZ部署 3AZ实例支持将计算和存储资源都会均匀分布在3个可用区,部署规则严格遵循反亲和组,实例具备超高可靠性。 支持故障节点秒级接管,在独有的存算分离架构下,即使发生N-1节点同时故障的极端场景,依然可以秒级恢复业务访问,超高可用。 支持跨Region双活容灾 支持企业级双活容灾能力,用户可创建2个独立的实例(同Region或跨Region),并搭建容灾关系,如果其中一个实例出现极端场景的故障,另一个实例能继续提供可靠的数据库服务。 支持双向数据同步,支持断点续传。 账号管理,支持DB级权限控制 支持使用65536个DB,支持创建200个子账号。 用户不但可以为子账号设置只读或读写权限,还可为子账号配置可访问的DB列表,从根本上避免多租户之间数据误操作风险。 支持为Hash key的Field单独设置过期时间 开源Redis只支持为Hash key整体设置过期时间。GeminiDB Redis接口新增了一组hash命令,这一新功能让用户可以为一个Hash key中的指定Field单独设置过期时间,将业务层面的淘汰逻辑下沉到数据库中实施,简化业务架构。 数据强一致,不会发生脏读 开源Redis采用异步复制,数据副本间弱一致。在计数器、限流器、分布式锁等常见业务场景中,会带来脏读隐患,可能会导致业务逻辑错乱。 GeminiDB Redis接口将数据副本下沉到高性能存储池中,一旦写入成功,将保障数据3副本强一致存储,后续业务访问不会发生脏读。 增强版事务功能 支持事务功能,即MULTI/EXEC。相比开源Redis的伪事务,GeminiDB Redis接口实现了真事务,即支持ACID,在底层实现了对回滚的支持,满足了事务的原子性。 增强版前缀扫描 当用户对实例执行Scan类扫描命令时,如指定前缀匹配(match prefix*),则此时的扫描性能将远远超越开源Redis。这是因为GeminiDB Redis接口将该场景下达命令复杂度优化到了O(logN + M),其中N是整体数据量,M是匹配的数据量。而开源Redis的扫描复杂度则是更慢的O(N)。 父主题: 产品介绍
  • 使用须知 该功能目前为公测阶段,如需使用,请联系客服申请开通相应的操作权限。 搭建双活关系前,需要提前创建好两个GeminiDB Redis实例,这两个实例必须在不同VPC下,VPC不允许使用192和172开头的IP,主备实例使用的VPC网段不重叠,需要确保实例所在的VPC网络互通,同region使用对等连接,跨region使用云连接,具体操作请参见网络配置。 搭建双活关系前,需要确保创建的两个GeminiDB Redis实例的规格、磁盘、节点个数保持一致,且端口必须是8635。 搭建双活关系过程中,主实例会有多次秒级中断,需要业务具备重试机制,备实例不能处理业务,备实例的数据会被清空,最终与主实例数据一致。搭建时长取决于节点个数和数据容量。 搭建双活关系后,不允许在主实例和备实例同时进行添加节点、删除节点和规格变更操作。 搭建双活关系后,支持主备实例变更存储容量,用户要避免主备实例容量长期不一致。 搭建双活关系后,不支持flushall命令。 双写的场景,需要业务避免同一时刻或相近的时刻修改同一个key,否则有可能导致数据不一致。备实例不支持flushdb命令。 跨region场景的同步时延主要取决于云连接时延,还取决于写流量和云连接配置的域间带宽是否匹配。如果写流量大于云连接带宽,将会导致同步数据堆积,支持在节点监控上通过“rsync的同步WAL堆积大小”指标查看数据堆积大小并设置告警规则,具体请参见查看监控指标。 双活仅支持集群版实例,不支持主备版实例。 父主题: 双活容灾
  • 应用场景 频控场景 频控指的是对用户在一定时间内(例如一天、一周、一个月)进行某种操作的次数进行限制,可以控制特定广告或信息在一定时间内在特定平台上的展示次数,以避免过度曝光和广告疲劳,同时优化广告效果和用户体验;对于广告来说,也可以提高广告的效果和转化率。此外,频控还可以避免恶意行为,如刷流量、刷评论、刷点赞等。 频控的3个要素包含用户ID、广告ID、触发次数;以用户ID为key,广告ID为field,指定时间内的触发次数为value,恰好构成频控的三要素。先配置好各个广告的指定频控策略,如下图所示即可根据如下的方式来实现频控: 图1 频控Hash方案 最左边通过Hash类型来实现,通过expire命令设置User_1的过期时间为一天,每推送一次通过hincrby来增加指定广告的推送次数,每次推送指定广告前在一天内的推送次数则可以通过hget获取进行判断,一天后该用户的数据自动过期无需手动清理,这样便可以简单地实现频控。但这个方案的缺点在于对于每个用户(即每个key)只能设置一个过期时间,无法做到例如8小时3次这样指定时间段内的灵活的频控策略。 为了做到对每个广告都配置指定时间段内的灵活频控,如中间图所示可以通过将时间戳拼接在value里的方式用Hash类型来实现,但这种方案无疑是增加了业务侧开发的工作量。 如最右图所示,支持给field设置过期时间的exHash类型可以很完美地解决Hash类型面对频控场景的缺点。由于Field支持过期时间设置,那么该场景下,平台可以给每个广告都配置不同时间段内的频次要求,假设此时给AD_2配置的频控策略为8小时内2次,那么如图所示在下一次再准备给User_1推送AD_2广告前,先通过exhget User_1 AD_2命令获取到了该值已经是2时,便可以判断出此时根据平台频控策略,不应该再给User_1推送AD_2广告了。而当8小时一过,User_1的AD_2这个field过期后,exhget无法再获取到这个field的信息,则可以继续给User_1推送AD_2广告了。 购物车场景 双十一期间,相信很多同学购物车里都填满了各种想要清空的宝贝,这里就以购物车场景为例介绍该场景的几种不同Redis类型的实现,并比较这几种实现方案的优缺点。 基于String实现购物车功能 如图图2所示,基于String可以轻松地实现各个用户的购物车功能,该方案需要将用户ID与商品ID进行拼接作为key,例如User_1#Earphones_1,key对应的value为购物车中用户准备购买的数量,其中可能有部分商品为限时特购,所以有过期时间,为key对应的过期时间。 图2 String方案 涉及命令如下: incrby User_N#Product_N [Number] # 增加商品数量 set User_N#Product_N [Number] # 设置商品数量 expire User_N#Product_N Time_N # 设置指定用户购物车中指定物品的过期时间 get User_N#Product_N # 获取商品数量 scan 0 match User_N* # 查找所有User_N下的所有商品 del User_N#Product_N # 删除指定用户购物车中的指定商品 该方案会存在如下问题: 额外拼接增加编、解码开发工作量。 某个用户获取自己的购物车清单时还需要通过scan命令前缀匹配扫描所有key,并通过get命令去获取对应的值。 想要直接获取清单长度时,仍然需要遍历整个前缀key的数目,方法复杂。 存在大量重复的用户名前缀,浪费存储空间。 基于Hash实现购物车功能 可以根据如图3所示的Hash类型来实现购物车的管理,用户ID作为key,商品ID作为field,value为购物车中对应商品的数量。其中对于部分限时特购的商品,其过期时间通过拼接的方式放到field对应的value里。 图3 Hash方案 涉及命令如下: hset User_N Product_N [Number#Time_N] # 设置指定用户购物车中指定商品的数量和过期时间 hincrby User_N Product_N [Number] # 增加指定用户购物车中的指定商品数量 hgetUser_N Product_N # 获取指定用户购物车中指定商品的信息 hgetall User_N # 获取指定用户的所有商品信息 hlen User_N # 获取指定用户购物车中的总商品数量 hdel User_N Product_N # 删除指定用户购物车中的指定商品 该方案相对于String类型的方案有了不少优化: 获取某个用户购物车中的所有商品清单仅需要一个hgetall命令即可。 获取某个用户的清单长度时直接hlen获取即可。 不存在大量重复的用户名前缀问题。 然而该方案仍存在一个明显的缺点,即对于部分限时特购的商品处理起来复杂:对于User_1的Keyboard_1商品,如果要再加一个数量,不能直接使用hincrby,而是需要先hget获取Keyboard_1商品的值并解码,再加上指定的数量再编码后hset对应的值。 基于exHash实现购物车功能 根据如图4所示的exHash类型来实现购物车的管理,同Hash类型一样,用户ID作为key,商品ID作为field,value为购物车中对应商品的数量。其中对于部分限时特购的商品,由于exHash类型可以为Field设置过期时间,其过期时间可通过hset命令直接设置。 图4 ExHash方案 涉及命令如下: exhset User_N Product_N ex Time_N # 设置指定用户购物车中指定商品的数量和过期时间 exhincrby User_N Product_N [Number] keepttl # 增加指定用户购物车中的指定商品数量,保留原先过期时间exhget User_N Product_N # 获取指定用户购物车中指定商品的信息 exhgetall User_N # 获取指定用户的所有商品信息 exhlen User_N # 获取指定用户购物车中的总商品数量 exhdel User_N Product_N # 删除指定用户购物车中的指定商品 del User_N # 清空指定用户的购物车 该方案相对于Hash类型的优化主要体现在可以直接为各field设置过期时间,使业务侧使用起来简单又高效。可以看到exHash类型相关的命令和Hash类型是类似的,使用起来学习成本很低,业务侧改造成本相对也比较低。
  • 响应示例 状态码: 200 Success { "slow_logs": [{ "node_name": "test_worker_node_1", "node_id": "dbd0b65ed0c34125a0b04d4e5ba67e66no02", "whole_message": "testDb", "operate_type": "SET", "cost_time": 60.12, "log_time": "2022-09-15T22:49:38.643000Z", "line_num": "1595659490239433659" }] }
  • 请求示例 POST https://{Endpoint}/v3/619d3e78f61b4be68bc5aa0b59edcf7b/redis/instances/a6d3c8a9857b4c81b3c1fe4802dfa4d0in12/slow-logs { "start_time" : "2022-09-06T10:41:14+0800", "end_time" : "2022-09-16T10:41:14+0800", "limit" : 100, "line_num" : "1595659490239433658", "operate_type" : "set", "node_id" : "2997329fe3cb4b3faedcade16df6966eno12", "keywords" : [ "log", "test" ], "max_cost_time" : 100.12, "min_cost_time" : 50.12 }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 slow_logs Array of objects 慢日志具体信息。详情请参考表5。 表5 RedisSlowLogDetail 参数 参数类型 描述 node_name String 节点名称。 node_id String 节点ID。 whole_message String 执行语句。 operate_type String 语句类型。 cost_time Double 执行时间。单位:ms。 log_time String 日志产生时间,UTC时间。格式为“yyyy-mm-ddThh:mm:ssZ”。其中,T指某个时间的开始;Z指时区偏移量,例如北京时间偏移显示为+0800。 line_num String 日志单行序列号。
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 表3 请求Body参数 参数 是否必选 参数类型 描述 start_time 是 String 开始时间,格式为“yyyy-mm-ddThh:mm:ssZ”。 其中,T指某个时间的开始;Z指时区偏移量,例如北京时间偏移显示为+0800。 注:开始时间不得早于当前时间30天。 end_time 是 String 结束时间,格式为“yyyy-mm-ddThh:mm:ssZ”。 其中,T指某个时间的开始;Z指时区偏移量,例如北京时间偏移显示为+0800。 注:结束时间不能晚于当前时间。 limit 是 Integer 表示每次查询的日志条数,最大限制100条。 line_num 否 String 日志单行序列号,第一次查询时不需要此参数,下一次查询时需要使用,可从上一次查询的返回信息中获取。说明:当次查询从line_num的下一条日志开始查询,不包含当前line_num日志。 operate_type 否 String 语句类型,取空值,表示查询所有语句类型。支持查询的所有语句类型如下(以“、”分割):set、get、del、incr、incrby、incrbyfloat、decr、decrby、getset、append、mget、keys、setnx、setex、psetex、delvx、mset、 msetnx、getrange、substr、setrange、strlen、exists、expire、pexpire、expireat、pexpireat、ttl、pttl、persist、type、 scanx、pksetexat、sort、hdel、hset、hget、hgetall、hexists、hincrby、hincrbyfloat、hkeys、hlen、hmget、hmset、hsetnx、 hstrlen、hvals、hscan、hscanx、pkhscanrange、pkhrscanrange、lindex、linsert、llen、lpop、lpush、lpushx、lrange、lrem、 lset、ltrim、rpop、rpoplpush、rpush、rpushx、zadd、zcard、zscan、zincrby、zrange、zrevrange、zrangebyscore、 zrevrangebyscore、zcount、zrem、zunionstore、zinterstore、zrank、zrevrank、zscore、zrangebylex、zrevrangebylex、 zlexcount、zremrangebyrank、zremrangebyscore、zremrangebylex、zpopmax、zpopmin、sadd、spop、scard、smembers、sscan、 srem、sunion、sunionstore、sinter、sinterstore、sismember、sdiff、sdiffstore、smove、srandmember、bitset、bitget、 bitcount、bitpos、bitop、bitfield、pfadd、pfcount、pfmerge、geoadd、georadiusbymember、georadius、geohash、geodist、 geopos、xadd、xack、xgroup、xdel、xtrim、xlen、xrange、xrevrange、xclaim、xpending、xinfo、xread、xreadgroup。 node_id 否 String 节点ID,取空值,表示查询实例下所有允许查询的节点。具体取值请参考表10中的“id”。 keywords 否 Array of strings 根据多个关键字搜索日志全文,表示同时匹配所有关键字。 最多支持10个关键字。 每个关键字最大长度不超过512个字符。 max_cost_time 否 Double 支持根据最大执行时间范围查找日志。单位:ms。 min_cost_time 否 Double 支持根据最小执行时间范围查找日志。单位:ms。
  • 监控指标 云数据库 GeminiDB提供基于 云监控服务 CES的资源和操作监控能力,帮助用户监控账号下的GeminiDB实例,执行自动实时监控、告警和通知操作。用户可以实时掌握实例运行过程中产生的运行指标和存储用量等信息。 关于GeminiDB Redis支持的监控指标,以及如何创建监控告警规则等内容,请参见支持的监控指标。 关于GeminiDB Influx支持的监控指标,以及如何创建监控告警规则等内容,请参见支持的监控指标。 关于GeminiDB Cassandra支持的监控指标,以及如何创建监控告警规则等内容,请参见支持的监控指标。 关于GeminiDB Mongo支持的监控指标,以及如何创建监控告警规则等内容,请参见支持的监控指标。
  • 访问控制 权限控制 购买实例之后,您可以使用 IAM 为企业中的员工设置不同的访问权限,以达到不同员工之间的权限隔离,通过IAM进行精细的权限管理。具体内容请参见权限管理。 VPC和子网 虚拟私有云(Virtual Private Cloud,VPC)为云数据库构建隔离的、用户自主配置和管理的虚拟网络环境,提升用户云上资源的安全性,简化用户的网络部署。您可以在VPC中定义安全组、VPN、IP地址段、带宽等网络特性,方便管理、配置内部网络,进行安全、快捷的网络变更。 子网提供与其他网络隔离的、可以独享的网络资源,以提高网络安全性。 具体内容请参见创建虚拟私有云和子网。 安全组 安全组是一个逻辑上的分组,为同一个虚拟私有云内具有相同安全保护需求并相互信任的弹性云服务器和云数据库 GeminiDB实例提供访问策略。为了保障数据库的安全性和稳定性,在使用GeminiDB数据库实例之前,您需要设置安全组,开通需访问数据库的IP地址和端口。 具体请参见设置安全组规则。
  • 身份认证 用户访问云数据库 GeminiDB时支持对数据库用户进行身份验证,包含密码验证和IAM验证两种方式。 密码验证 您需要对数据库实例进行管理,通过控制台登录Web客户端页面时,需要对账号密码进行验证,验证成功后方可进行操作。 IAM验证 您可以使用 统一身份认证 服务(Identity and Access Management, IAM)进行精细的权限管理。该服务提供用户身份认证、权限分配、访问控制等功能,可以帮助您安全地控制华为云资源的访问。您创建的IAM用户,需要通过验证用户和密码才可以使用GeminiDB资源。具体请参见创建IAM用户并登录。
  • 如何选择接口 不同接口的适用场景及功能存在差异,您可以根据业务需要选择接口产品。 表1 场景说明 接口名称 兼容接口 使用场景 说明 GeminiDB Redis接口 兼容Key-Value接口:Redis GeminiDB Redis接口满足高读写性能场景及容量需弹性扩展的业务需求。与开源Redis相比,本产品将数据全部存储在磁盘中而非内存中,容量更大、成本更低。 GeminiDB Redis 接口是一款基于华为自研的计算存储分离架构,兼容Redis生态的云原生NoSQL数据库,基于共享存储池的多副本强一致机制,支持持久化存储,保证数据的安全可靠。具有高兼容、高性价比、高可靠、弹性伸缩、高可用、无损扩容等特点。 GeminiDB Influx接口 兼容时间序列型接口:InfluxDB GeminiDB Influx接口广泛应用于资源监控,业务监控分析,物联网设备实时监控,工业生产监控,生产质量评估和故障回溯等。 GeminiDB Influx 接口是一款基于华为自研的计算存储分离架构,兼容InfluxDB生态的云原生NoSQL 时序数据库 。提供大并发的时序数据读写,压缩存储和类SQL查询,并且支持多维聚合计算和 数据可视化 分析能力。具有高写入、灵活弹性、高压缩率和高查询等特点。 GeminiDB Cassandra接口 兼容宽列接口:Cassandra,DynamoDB GeminiDB Cassandra接口支持TB级别存储及近百万级QPS,提供强一致性级别,可适配各类应用场景,尤其是大规模集群部署:例如工业制造和气象业、互联网等海量数据存储的场景。 GeminiDB Cassandra 接口 是一款基于华为自研的计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库,支持类SQL语法CQL。具有安全可靠、超强读写、弹性扩展、便捷管理等特点。 GeminiDB Mongo接口 兼容文档型接口:MongoDB GeminiDB Mongo接口近百万级QPS,开源3倍性能提升,支持存海量文档、图片、IoT/车联网数据、社交视频/语音等,适用于互联网、物联网、游戏、金融等领域。 GeminiDB Mongo 接口是一款基于华为自研的计算存储分离架构,兼容MongoDB生态的云原生NoSQL数据库。具有企业级性能、灵活弹性、高可靠、可视化管理等特点。 GeminiDB HBase接口 兼容宽列接口:Hbase GeminiDB HBase接口适用于大规模数据存储、实时查询、高可靠性和可伸缩性要求的场景,特别适用于与Hadoop和大数据处理技术集成的环境中。 GeminiDB HBase接口是一款兼容HBase生态的分布式NoSQL数据库,在Apache HBase的基础上进行扩展和优化,具有高性能、高可靠性、强大的扩展性和灵活的伸缩性等特点。
  • 约束限制 审核对象仅支持:Table、View、Sequence、Index、Function、Procedure、Trigger。 一次审核Schema的数量不超过10000。 审核数据库过程中,避免对正在审核的数据库对象进行删除等操作,影响审核结果。 如果使用系统模板进行审核时,新版本升级结束后,再次重试或者同数据源审核,会导致审核结果不一致。为避免此现象发生,建议使用自定义模板。 不支持嵌套子函数包含分隔符为单引号的语句,详情可参见表2。
  • 操作步骤 登录UGO服务。 单击左侧导航栏的“数据源管理”。 在数据源管理页面,单击右上角的“创建数据源”按钮。 进入创建数据源页面,完成基本信息的填写。 基本信息填写完成后,“开始测试”高亮显示。 图1 创建数据源 表1 创建数据库档案参数说明 参数名称 说明 名称 在数据源管理项目列表中显示的名称。 唯一且长度范围为5到50个字符,只允许包含英文字母、数字、下划线、中划线。以字母开头、数字或字母结束。 数据库类型 下拉选择待创建的数据库类型。当前仅支持管理 GaussDB 和MySQL数据源信息。 网络类型 公网网络:通过弹性公网IP(Elastic IP,EIP)进行源库连接。 如果源库网络有IP白名单限制,请将弹性公网IP添加至源库网络白名单,确保UGO可以连接源库。 连接方法 仅支持通过服务器名进行连接。 数据库名称 待进行管理的数据库名称。 主机类型 当前仅支持主机IP地址。 主机IP地址 填写具体主机IP地址,IP地址支持IPv4和IPv6。 说明: 支持IPv6数据库如下:MySQL。 主机端口 待进行管理的数据库端口。 用户名 待进行管理的数据库用户名。 密码 待进行管理的数据库密码。 单击“开始测试”,测试通过显示“已连接”,右下角“创建”高亮显示。 当前仅测试连通性,若断连或权限不足,会导致“连接数据库失败”,无法创建数据源。 单击创建。显示“数据源创建成功。”。 单击“关闭”,返回数据源管理页面,用户可以看到最新创建的数据源已在列表中。 可通过序号、名称、数据库名称、数据库类型、IP地址及端口信息进行搜索。 图2 数据源管理
  • 约束限制 规则的嵌套审核仅支持四种详情可参见表1。 With as只考虑SELECT语句。 别名不能和实体表重名,且别名之间不能重名。 暂不支持视图中的表审核。 不支持对数据库系统表及视图审核。 不支持输入的语句, 语句中涉及的表结构,阈值中含有“#”或“/*”的SQL 审核。 function/procedure不支持嵌套子函数包含分隔符为单引号的语句,详情可参见表2。 表1 支持的嵌套审核语句 SQL语句 select id, (select 子查询) as name from table; select id from table where id in (select 子查询); select * from table1,(select 子查询); with e as (select 子查询) select * from e; 表2 不支持嵌套子函数的语句 SQL语句 CREATE OR REPLACE FUNCTION public.xxx(i integer) RETURNS integer LANGUAGE plpgsql AS $function$ BEGIN CREATE FUNCTION xxx(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL ; CREATE TABLESPACE ds_location1 RELATIVE LOCATION 'tablespace/tablespace_1'; END; $function$; ;
  • 规则约束 所有涉及update、delete规则项,均不支持多表操作审核。 update、delete多表操作仅支持规则项:“不应用单条update、delete语句对多个表实现更新、删除操作”。 对于这两个规则,“在PL/pgSQL中,关键字建议大写,非关键字小写”、“sql语句中,关键字建议大写,非关键字小写”,不要在以对象名作为非保留关键字的语句中使用,存在审核不准确情况,比如:SELECT id FROM name,name是非保留关键字。 “查询系统视图时,如果使用对象名作为筛选条件,对象名应使用小写”支持的系统视图参见表3。 表3 视图审核 视图名 所属schema 表示对象名的列 adm_arguments pg_catalog、sys owner、object_name、package_name、argument_name adm_audit_object pg_catalog、sys username、owner、obj_name、action_name adm_audit_session pg_catalog、sys username、action_name adm_audit_statement pg_catalog、sys username、obj_name、action_name adm_col_comments pg_catalog、sys owner、table_name、column_name、schema adm_col_privs pg_catalog、sys grantor、owner、grantee、table_schema、table_name、column_name、privilege adm_coll_types pg_catalog、sys owner、type_name、elem_type_mod、elem_type_owner、elem_type_name adm_constraints pg_catalog、sys owner、constraint_name、table_name、index_owner、index_name adm_indexes pg_catalog、sys owner、index_name、table_name、table_owner、tablespace_name adm_ind_columns pg_catalog、sys index_owner、index_name、table_name、table_owner、column_name adm_objects pg_catalog、sys owner、object_name、subobject_name adm_procedures pg_catalog、sys owner、object_name、procedure_name、impltypeowner、impltypename adm_role_privs pg_catalog、sys grantee、granted_role adm_tab_col_statistics pg_catalog、sys owner、table_name、column_name、schema adm_roles pg_catalog、sys role adm_source pg_catalog、sys owner、name adm_sys_privs pg_catalog、sys grantee、privilege adm_tab_cols pg_catalog、sys owner、table_name、column_name、data_type_owner、schema、qualified_col_name adm_tab_privs pg_catalog、sys grantee、owner、table_name、grantor、privilege adm_tables pg_catalog、sys owner、table_name、tablespace_name adm_tab_columns pg_catalog、sys owner、table_name、column_name、data_type_owner、schema adm_tab_comments pg_catalog、sys owner、table_name、column_name、schema adm_tab_statistics pg_catalog、sys owner、table_name adm_triggers pg_catalog、sys owner、trigger_name、table_owner、table_name adm_type_attrs pg_catalog、sys type_name、attr_name、attr_type_name、character_set_name adm_types pg_catalog、sys owner、type_name adm_users pg_catalog、sys username、default_tablespace、temporary_tablespace、default_collation adm_views pg_catalog、sys owner、view_name db_all_tables pg_catalog、sys owner、table_name、tablespace_name db_arguments pg_catalog、sys owner、object_name、package_name、argument_name db_col_comments pg_catalog、sys owner、table_name、column_name、schema db_col_privs pg_catalog、sys grantor、owner、grantee、table_schema、table_name、column_name、privilege db_coll_types pg_catalog、sys owner、type_name、elem_type_mod、elem_type_owner、elem_type_name db_constraints pg_catalog、sys owner、constraint_name、table_name、index_owner、index_name db_indexes pg_catalog、sys owner、index_name、table_name、table_owner、tablespace_name db_ind_columns pg_catalog、sys index_owner、index_name、table_name、table_owner、column_name db_objects pg_catalog、sys owner、object_name、subobject_name db_procedures pg_catalog、sys owner、object_name db_tab_col_statistics pg_catalog、sys owner、table_name、column_name、schema db_source pg_catalog、sys owner、name db_tab_columns pg_catalog、sys owner、table_name、column_name、data_type_owner、schema db_tab_comments pg_catalog、sys owner、table_name、schema db_tables pg_catalog、sys owner、table_name、tablespace_name db_triggers pg_catalog、sys trigger_name、table_owner、table_name db_types pg_catalog、sys owner、type_name db_users pg_catalog、sys username db_views pg_catalog、sys owner、view_name dict pg_catalog、sys table_name dictionary pg_catalog、sys table_name my_col_comments pg_catalog、sys owner、table_name、column_name、schema my_col_privs pg_catalog、sys grantor、owner、grantee、table_schema、table_name、column_name、privilege my_coll_types pg_catalog、sys owner、type_name、elem_type_mod、elem_type_owner、elem_type_name my_constraints pg_catalog、sys owner、constraint_name、table_name、index_owner、index_name my_indexes pg_catalog、sys owner、index_name、table_name、table_owner、tablespace_name my_ind_columns pg_catalog、sys index_owner、index_name、table_name、table_owner、column_name my_objects pg_catalog、sys object_name、subobject_name my_procedures pg_catalog、sys owner、object_name、procedure_name、impltypeowner、impltypename my_role_privs pg_catalog、sys grantee、granted_role my_tab_col_statistics pg_catalog、sys table_name、column_name、schema my_source pg_catalog、sys owner、name my_tab_columns pg_catalog、sys owner、table_name、column_name、data_type_owner、schema my_tab_comments pg_catalog、sys owner、table_name、column_name、schema my_tab_statistics pg_catalog、sys table_name my_tables pg_catalog、sys owner、table_name、tablespace_name my_triggers pg_catalog、sys owner、trigger_name、table_owner、table_name my_type_attrs pg_catalog、sys type_name、attr_name、attr_type_name、character_set_name my_types pg_catalog、sys type_name my_views pg_catalog、sys owner、view_name pg_indexes pg_catalog、sys schemaname、tablename、indexname、tablespace pg_roles pg_catalog、sys rolename pg_tables pg_catalog、sys schemaname、tablename、tableowner、tablespace、tablecreator pg_user pg_catalog、sys username、nodegroup pg_views pg_catalog、sys schemaname、viewname、viewowner column_privileges information_schema、sys grantor、grantee、table_catalog、table_schema、table_name、column_name columns information_schema、sys table_catalog、table_schema、table_name、column_name constraint_column_usage information_schema、sys table_catalog、table_schema、table_name、column_name、constraint_catalog、constraint_schema、constraint_name constraint_table_usage information_schema、sys table_catalog、table_schema、table_name、constraint_catalog、constraint_schema、constraint_name enabled_roles information_schema、sys role_name schemata information_schema、sys catalog_name、schema_name、schema_owner、default_character_set_catalog、default_character_set_schema、default_character_set_name table_constraints information_schema、sys constraint_catalog、constraint_schema、constraint_name、table_catalog、table_schema、table_name table_privileges information_schema、sys grantor、grantee、table_catalog、table_schema、table_name tables information_schema、sys table_catalog、table_schema、table_name、self_referencing_column_name、user_defined_type_catalog、user_defined_type_schema、user_defined_type_name triggers information_schema、sys trigger_catalog、trigger_schema、trigger_name、event_object_catalog、event_object_schema、event_object_table、action_reference_old_table、action_reference_new_table usage_privileges information_schema、sys grantor、grantee、object_catalog、object_schema、object_name views information_schema、sys table_catalog、table_schema、table_name
  • Microsoft SQL Server To GaussDB配置项使用说明 问题描述 配置建议 建议值 SQLServer 表字段支持IDENTITY属性,但GaussDB不支持该属性,默认无法迁移。 建议配置”IDENTITY列“解决该类问题。 将IDENTITY属性列转换为SERIAL类型。 影响:序列号数据类型是四个字节的自增整数。取值范围为1至2147483647。超过这个上限,GaussDB将报错,DML语句执行失败。 SQLServer 表字段支持bit类型,但是GaussDB,不支持该属性,默认无法迁移。 建议配置“bit类型”解决该类问题。 将bit类型转化为boolean类型。 影响:boolean类型的取值相比bit类型多了一个“null”。 SQLServer支持datetimeoffset数据类型,但是GaussDB不支持, 默认转成timestamptz(二者最大秒数精度存在差异),时间函数year等转换方案处理结果在特殊情况下存在差异。 建议配置"datetimeoffset类型转换"解决该类问题 将datetimeoffset类型转换为varchar2类型。 影响:datetimeoffset类型转换为varchar2类型。 高斯O模式空字符串''等同于null,ISNULL等函数转换方案存在语义问题。 建议配置"忽略空字符串''为null的风险"解决该类问题。 不忽略空字符串''为null的风险。 影响:存在空字符串''风险的函数不进行转换。 GaussDB 分布式不支持外键约束,相关CREATE TABLE以及ALTER TABLE语句涉及外键约束会导致执行异常,需要根据实际业务情况选择是否需要外键特性。 建议配置"FOREIGN KEY约束"解决该类问题。 影响:注释FOREIGN KEY约束,注释后,原表的外键约束失效,不能确保数据保持一致,有可能创建不一致的数据。 GaussDB 数据库不支持SQL Server表变量(包括多语句表值函数返回表定义),目前GaussDB 较为接近的转换方案为临时表,二者在部分使用场景下有区别,用户根据需要选择是否开启对表变量类型的转换。 建议配置"是否转换表变量(包括多语句表值函数返回表定义)"解决该类问题。 将表变量转换临时表。 影响:SQL Server中显式表变量不遵循事务的回滚语义,GaussDB中临时表遵循事务回滚语义,需要关注业务语义是否发生变化。 父主题: 配置说明
  • 约束限制 规则的嵌套审核仅支持以下四种“select list |from|where |with xx as”,详情可参见表1。 别名不能和实体表重名,且别名之间不能重名。 暂不支持视图中的表审核。 不支持对数据库系统表及视图审核。 不支持语句中含有“#”或“/*”的SQL 审核。涉及点(依赖表结构、语句、阈值等)。 文件审核中和审核完成后,不可点击“重试”按钮。 如果使用系统模板进行审核时,新版本升级结束后,再次重试或者同文件审核,会导致审核结果不一致。为避免此现象发生,建议使用自定义模板。 function/procedure不支持嵌套子函数包含分隔符为单引号的语句,详情可参见表2。
  • 前提条件 Oracle为源库,为了确保 DBMS_METADATA.GET_DDL 方法返回的对象DDL保持统一,建议您对Oracle源库进行如下设置。 不生成排序规则子句(影响对象:USER、TABLE、CLUSTER、VIEW、MATERIALIZED_VIEW、PROCEDURE、FUNCTION、PACKAGE、TYPE、TRIGGER)。 call DBMS_METADATA.SET_TRANSFORM_PA RAM (dbms_metadata.SESSION_TRANSFORM, 'COLLATION_CLAUSE', 'NEVER'); 让表约束、索引将成为CREATE TABLE语句的一部分,而不是单独的ALTER、TABLE语句 call DBMS_METADATA.SET_TRANSFORM_PARAM(dbms_metadata.SESSION_TRANSFORM, 'CONSTRAINTS_AS_ALTER', false); 用户需拥有创建UGO评估项目的对应权限。具体权限,可参见权限管理进行设置。 各源库分别需要具备以下权限,需成功测试连接到源数据库并通过所有预检查项。 Oracle源数据库连接用户需要具有待迁移数据库的DBMS_METADATA、动态视图和Schema对象数量检查的权限。 MySQL为源库时需要具有MySQL系统库的查询权限、PRO CES S权限和待迁移数据库的所有权限。从MySQL-8.0版本开始,针对存储过程和存储函数,还需要SHOW_ROUTINE权限。 DB2 for LUW为源库需要具有DBADM或DATAACCESS权限。 GoldenDB为源库时需要具有GoldenDB系统库的查询权限、PROCESS权限和待迁移数据库的所有权限。针对存储过程和存储函数,还需要SHOW_ROUTINE权限。 Microsoft SQL Server为源库时需要具有VIEW DEFINITION权限。 建议使用非生产环境数据库。 同一套源库中UGO不支持评估同名的重载函数。 GoldenDB为源库时,建议使用CN节点上用户来创建评估任务。 以MySQL 和 GoldenDB为源,如果给用户赋予了全局的SELECT权限,SHOW_ROUTINE权限也能通过,无需再单独授予。
  • 数据库字段设计规范 优先为表中的每一列选择符合存储需要的最小的数据类型。优先考虑数字类型,其次为日期或二进制类型,最后是字符类型。列的字段类型越大,建立索引占据的空间就越大,导致一个页中的索引越少,造成IO次数增加,从而影响性能。 整数型选择能符合需求的最短列类型,如果为非负数,声明需是无符号(UNSIGNED)类型。 每个字段尽可能具有NOT NULL属性。 避免使用ENUM类型,可以用TINYINT类型替换。修改ENUM值需要使用ALTER语句,ENUM类型的ORDER BY操作效率低,需要额外操作。 如果定义了禁止ENUM的枚举值是数值,可使用其他数据类型(如CHAR类型)。 实数类型使用DECIMAL,禁止使用FLOAT和DOUBLE类型。FLOAT和DOUBLE在存储的时候,存在精度损失的问题,很可能在值的比较时,得到错误的结果。 使用DATETIME、TIMESTAMP类型来存储时间,禁止使用字符串替代。 使用数字类型INT UNSIGNED存储IP地址,用INET_ATON、INET_NTOA可以在IP地址和数字类型之间转换。 VARCHAR类型的长度应该尽可能短。VARCHAR类型虽然在硬盘上是动态长度的,但是在内存中占用的空间是固定的最大长度。 使用VARBINARY存储大小写敏感的变长字符串,VARBINARY默认区分⼤小写,没有字符集概念,速度快。
  • 数据库索引设计规范 限制每张表上的索引数量,建议单张表索引不超过5个。索引并不是越多越好,索引可以提高查询的效率,但会降低写数据的效率。有时不恰当的索引还会降低查询的效率。 禁止给表中的每一列都建立单独的索引。设计良好的联合索引比每一列上的单独索引效率要高出很多。 每个InnoDB表强烈建议有一个主键,且不使用更新频繁的列作为主键,不使用多列主键,不使用UUID、MD5、字符串列作为主键。最好选择值的顺序是连续增长的列作为主键,所以建议选择使用自增ID列作为主键。 建议在下面的列上建立索引: 在SELECT,UPDATE,DELETE语句的WHERE从句上的列。 在ORDER BY,GROUP BY,DISTINCT上的列。 多表JOIN的关联列。 索引列顺序: 区分度最高的列放在联合索引的最左侧。区分度=列中不同值的数量/列的总行数。 尽量把字段长度小的列放在联合索引的最左侧。因为字段长度越小,一页能存储的数据量越大,IO性能也就越好。 使用最频繁的列放到联合索引的左侧。这样可以比较少的建立一些索引。 避免冗余的索引,例如:primary key(id),index(id),unique index(id) 避免重复的索引,例如:index(a,b,c),index(a,b),index(a),由于RDS for MariaDB查询优化器无法确定使用哪个索引,所以重复的和冗余的索引会降低查询效率。 在VARCHAR字段上建立索引时,需指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。 一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*) 的区分度来确定。 对于频繁查询优先考虑使用覆盖索引。 覆盖索引指包含了所有查询字段的索引,不仅仅是WHERE从句GROUP BY从句中的列,也包含SELECT查询的列组合,避免InnoDB表进行索引的二次查询。 外键约束: 建立外键关系的对应列的字符集必须保持一致或者存在外键关系的子表父表的字符集保持一致。
  • 数据库基本设计规范 所有表如果没有特殊需求,都要使用InnoDB存储引擎。InnoDB存储引擎支持事务、行级锁、具有更好的恢复性、高并发下性能更强。 数据库和表的字符集统一使用UTF8字符集,避免由于字符集的转换产生乱码。 所有的表和字段都需要添加注释。使用comment从句添加表和列的备注,从设计初期维护好数据字典。 谨慎使用RDS for MariaDB分区表,避免跨分区查询,否则查询效率会降低。分区表在逻辑上表现为一个表,但是在物理层面上将数据存储在多个文件。建议尽可能将分区表的不同分区文件存储在不同的磁盘阵列上。 表中的列不要太多,尽量做到冷热数据分离,减小表的宽度,以便在一页内存中容纳更多的行,进而减少磁盘IO,更有效的利用缓存。 经常一起使用的列尽量放到一个表中,避免过多的关联操作。 禁止在表中建立预留字段,否则修改列的类型会导致锁表,修改一个字段类型的成本要高于增加一个字段。 禁止在数据库中存储图片、文件等大的二进制数据。
  • 数据库命名规范 所有的数据库对象名称(包括库名、表名、列名等)建议以小写字母命名,每个单词之间用下划线分割。 所有的数据库对象名称禁止使用RDS for MariaDB保留关键字。 数据库对象的命名要能做到见名知意,并且不超过32个字符。 数据库中用到的临时表以“tmp”为前缀并以日期为后缀。 数据库中用到的备份表以“bak”为前缀并以日期为后缀。 在不同的库或表中,要保证所有存储相同数据的列名和列类型必须一致。
  • 使用场景 紧急恢复实例场景中,通过设置慢会话阈值帮助用户快速识别异常会话并手动结束该会话,使得数据库恢复正常,提高数据库的可用性。 新业务中出现并发数过高的SQL语句导致实例不稳定场景中,通过设置SQL限流规则功能控制并发数过高的SQL语句,保证实例的稳定性。 出现“磁盘空间满”问题时,通过查看磁盘空间功能实时了解磁盘空间概况与分布。您可以开启智能扩容,开启后当存储空间过小时,会自动扩容存储空间,保障数据库正常运行。 在突发流量过高、异常读写等业务场景中,通过配置自治限流功能控制活跃连接数来保障核心业务访问的可用性。
  • 功能列表 智能DBA支持以下功能,详情请参见表1。 表1 功能说明 功能 描述 相关文档 实例概览 提供数据库整体运行情况,包括告警统计、资源使用情况和重点性能指标,多方面实时展示实例的运行状态。基于运行数据结合智能算法对实例进行健康智能诊断,并对异常项提供解决方法与使用建议。 查看实例运行情况 实时会话 提供当前数据库的会话查询列表,并支持排序过滤展示。通过设置慢会话阈值来识别异常会话应对紧急实例恢复,保障数据库的可用性。 查看会话统计结果 设置慢会话阈值 实时性能 展示数据库实例各项性能指标,并提供日期对比功能,方便查看周期业务以及指标变化情况,及时发现异常。 查看性能指标 容量预估 数据库实例在使用过程中,当前磁盘空间数据与日志的占比以及历史上涨情况往往是用户关心的重点。智能DBA助手提供了容量预估功能,可以方便地查看磁盘空间概况与分布,并通过历史数据结合智能算法提供了空间预估等功能,尽早发现空间不足的情况并及时避免出现“磁盘空间满”问题。 查看磁盘空间 查看表智能诊断 设置诊断阈值 查看库表大小 慢SQL 提供指定时间段内的慢SQL分析功能。从用户、客户端、SQL模板等进行多维统计,展示统计结果并支持指定排序,识别慢SQL的精准来源,方便用户快速优化业务。 查看慢SQL SQL限流 针对新上业务不能及时优化SQL导致CPU等资源100%瓶颈的场景,按照SQL限流规则及时控制并发数过高的SQL语句,保证实例稳定性。 设置SQL限流规则 自治限流 该功能自动检测数据库的CPU利用率、活跃会话数等异常,根据业务优先级进行限流处理,保证核心业务的稳定运行。 用户可以根据业务情况,按照数据库或者用户进行限流。将非核心数据库或非核心用户业务配置为限流对象,可以保障核心业务不受影响。 配置自治限流 诊断日报 对前一日实例状态的汇总展示,包括慢SQL分析、性能与磁盘分析。支持用户下载和订阅分析报告。建议每天定时对实例进行诊断,以保证实例上业务的正常运转。 查看诊断报告 订阅诊断报告
  • 什么是UGO? 数据库和应用迁移 UGO(Database and Application Migration UGO,以下简称为UGO)是专注于异构数据库结构迁移的专业服务。可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法,通过数据库评估、对象迁移两大核心功能和自动化语法转换,提前识别可能存在的改造工作、提高转化率、最大化降低用户数据库迁移成本。 在异构数据库迁移场景中,UGO实现结构迁移和语法转化, 数据复制服务 DRS实现异构数据库数据在线搬迁,可以形成完整的平滑异构数据库端到端搬迁方案,实现主流商用数据库到华为云数据库的自动化迁移,助力用户轻松实现一键上云、一键切换数据库的目的。 对于迁移方案来说,将存储过程、函数较复杂的异构数据库上云,UGO+DRS会是一个完整的闭环方案,建议同时使用。 图1 数据库迁移流程解决方案
  • 数据复制服务 数据库和应用迁移 UGO着重于异构数据库结构,如表结构、视图和存储过程等对象的迁移上云,解决数据库语法转换不兼容的问题。 数据复制服务(Data Replication Service)则着重于数据库毫秒级数据同步,支持同构异构数据库之间的数据传输/搬迁,降低数据库之间数据流通的复杂性,减少数据传输成本。 对于迁移方案来说,将存储过程、函数较复杂的异构数据库上云,UGO+DRS会是一个完整的闭环方案,建议同时使用。
  • 统一身份认证服务 统一身份认证服务(Identity and Access Management,简称IAM)为UGO提供了权限管理功能。 需要拥有UGO的Administrator权限后,您才能使用UGO。如需开通该权限,请联系拥有Security Administrator权限的用户,或者申请具有UGO Administrator权限的新用户。 统一身份认证服务的更多信息,请参见《统一身份认证服务用户指南》。
  • VPC终端节点 服务 UGO依赖VPC终端节点服务(VPC Endpoint)作为目标库连接代理,用来安全地访问您的目标数据库。 当您使用UGO创建迁移项目时,您除了需要拥有UGO FullAccess权限外,也需要拥有VPC Endpoint Administrator权限或Tenant Administrator权限。UGO会为您的目标库创建VPC终端节点服务,并在您结束迁移删除项目时为您删除对应的VPC终端节点服务。 创建VPC终端节点服务不收取任何费用。UGO会为创建的VPC终端节点服务添加白名单权限控制,确保您目标库的连接安全,您也可以在VPC终端节点服务页面看到目标库相应的终端节点服务。为了保证UGO功能使用正常,请不要在迁移项目未结束时删除目标库对应的VPC终端节点服务。
共100000条