华为云用户手册

  • 性能因素 多个性能因素会影响数据库性能,了解这些因素可以帮助定位和分析性能问题。 系统资源 数据库性能在很大程度上依赖于磁盘的I/O和内存使用情况。为了准确设置性能指标,用户需要了解集群部署硬件的基本性能。CPU,硬盘,磁盘控制器,内存和网络接口等这些硬件性能将显著影响数据库的运行速度。 负载 负载等于数据库系统的需求总量,它会随着时间变化。总体负载包含用户查询,应用程序,并行作业,事务以及数据库随时传递的系统命令。比如:多用户在执行多个查询时会提高负载。负载会显著地影响数据库的性能。了解工作负载高峰期可以帮助用户更合理地利用系统资源,更有效地完成系统任务。 吞吐量 使用系统的吞吐量来定义处理数据的整体能力。数据库的吞吐量以每秒的查询次数、每秒的处理事务数量或平均响应时间来测量。数据库的处理能力与底层系统(磁盘I/O,CPU速度,存储器带宽等)有密切的关系,所以当设置数据库吞吐量目标时,需要提前了解硬件的性能。 竞争 竞争是指两组或多组负载组件尝试使用冲突的方式使用系统的情况。比如,多条查询视图同一时间更新相同的数据,或者多个大量的负载争夺系统资源。随着竞争的增加,吞吐量下降。 优化 数据库优化可以影响到整个系统的性能。在执行SQL制定、数据库配置参数、表设计、数据分布等操作时,启用数据库查询优化器打造最有效的执行计划。
  • 调优范围确定 性能调优主要通过查看集群各节点的CPU、内存、I/O和网络这些硬件资源的使用情况,确认这些资源是否已被充分利用,是否存在瓶颈点,然后针对性调优。 如果某个资源已达瓶颈,则: 通过查询最耗时的SQL语句、跑不出来的SQL语句,找出耗资源的SQL,进行SQL调优指南。 如果所有资源均未达瓶颈,则表明性能仍有提升潜力。可以查询最耗时的SQL语句,或者跑不出来的SQL语句,进行针对性的SQL调优指南。
  • 操作步骤 使用DAS或者gsql连接实例。 查看阻塞的查询语句及阻塞查询的表、模式信息。 SELECT w.query as waiting_query, w.pid as w_pid, w.usename as w_user, l.query as locking_query, l.pid as l_pid, l.usename as l_user, t.schemaname || '.' || t.relname as tablename from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid and not l1.granted join pg_locks l2 on l1.relation = l2.relation and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid where w.waiting; 该查询返回线程ID、用户信息、查询状态,以及导致阻塞的表、模式信息。 使用如下命令结束相应的会话。 SELECT PG_TERMINATE_BACKEND(139834762094352); 其中,139834762094352为线程ID。 显示类似如下信息,表示结束会话成功。 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户正在尝试结束当前会话。 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command gsql客户端使用PG_TERMINATE_BACKEND函数结束当前正在执行会话的后台线程时,如果当前的用户是初始用户,客户端不会退出而是自动重连,即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”;否则客户端会重连失败,即返回“The connection to the server was lost. Attempting reset: Failed.”。这是因为只有初始用户可以免密登录,普遍用户不能免密登录,从而重连失败。 对于使用PG_TERMINATE_BACKEND函数结束非活跃的后台线程时。如果打开了线程池,此时空闲的会话没有线程ID,无法结束会话。非线程池模式下,结束的会话不会自动重连。
  • 调优手段之统计信息 GaussDB 优化器是典型的基于代价的优化 (Cost-Based Optimization,简称CBO)。在这种优化器模型下,数据库根据表的元组数、字段宽度、NULL记录比率、distinct值、MCV值、HB值等表的特征值,以及一定的代价计算模型,计算出每一个执行步骤的不同执行方式的输出元组数和执行代价(cost),进而选出整体执行代价最小/首元组返回代价最小的执行方式进行执行。这些特征值就是统计信息。从上面描述可以看出统计信息是查询优化的核心输入,准确的统计信息将帮助规划器选择最合适的查询规划,一般来说通过analyze语法收集整个表或者表的若干个字段的统计信息,周期性地运行ANALYZE,或者在对表的大部分内容做了更改之后马上运行它是个好习惯。
  • 使用须知 当前只提供主备版实例, 并且数据库引擎需要为2.1.0及以上版本。 访问日志提供了实例所请求的所有详细日志,日志存在LTS 云日志 服务中。 配置完成后,日志不会立即上传,需要等待10分钟左右才可以在LTS服务上查询审计日志。 控制审计日志的总开关参考参数audit_enabled。 控制审计日志的具体参数配置参考审计项。 配置完成后,会产生一定费用,费用情况请参考LTS的 定价 详情。 在您进行LTS审计日志配置后,会默认上传当前实例的所有审计策略到LTS服务。
  • 查询 track_stmt_session_slot 作用:设置一个session缓存的最大的全量/慢SQL的数量。 影响:缓存的SQL定期会被写入到系统表,如果业务量很大,超过这个数量语句执行将不会被跟踪,直到落盘线程将缓存语句落盘,留出空闲的空间,但不影响SQL的执行。 effective_cache_size 作用:设置节点优化器在一次单一的查询中可用的磁盘缓冲区的有效大小。设置这个参数,还要考虑的共享缓冲区以及内核的磁盘缓冲区。另外,还要考虑预计的在不同表之间的并发查询数目,因为它们将共享可用的空间。这个参数对分配的共享内存大小没有影响,它也不会使用内核磁盘缓冲,它只用于估算。数值是用磁盘页来计算的,通常每个页面是8192字节。 取值范围:整型,1~INT_MAX,单位为8KB。 影响:比默认值高的数值可能会导致使用索引扫描,更低的数值可能会导致选择顺序扫描。 enable_stream_operator 控制优化器对stream的使用。当该参数关闭时,可能会有大量关于计划不能下推的日志记录到日志文件中。 log_min_duration_statement 作用:当某条语句的持续时间大于或者等于特定的毫秒数时,记录每条完成语句的持续时间。设置log_min_duration_statement可以很方便地跟踪需要优化的查询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花时间被独立记录。 影响:设置过低的阈值可能影响负载吞吐,-1表示关闭此功能。
  • 连接与认证 session_timeout 表明与服务器建立连接后,不进行任何操作一定时间后超时的限制,0表示关闭超时设置。 failed_login_attempts 设置密码错误次数上限,输入密码错误的次数达到该参数所设置的值时,账户将会被自动锁定,配置为0时表示不限制密码输入错误的次数。 password_effect_time 设置帐户密码的有效时间,0表示不开启有效期限制功能。 password_lock_time 设置账户被锁定后的自动解锁时间,单位为天。
  • 自定义策略样例 示例1:授权用户创建GaussDB实例 { "Version": "1.1", "Statement": [{"Effect": "Allow","Action": ["gaussdb:instance:create"]}]} 示例2:拒绝用户删除GaussDB实例 拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先。 如果您给用户授予GaussDB FullAccess的系统策略,但不希望用户拥有GaussDB FullAccess中定义的删除GaussDB实例,您可以创建一条拒绝删除云服务的自定义策略,然后同时将GaussDB FullAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以对GaussDB实例执行除了删除GaussDB实例外的所有操作。拒绝策略示例如下: {"Version": "1.1","Statement": [{"Action": ["gaussdb:instance:delete"],"Effect": "Deny"}]}
  • 注意事项 默认不支持将规格参数变小,如需要将规格参数变小,您可以联系华为云客服,由华为云工程师给出分析评估后进行处理。 基础版不支持规格变更。 规格变更前,须确保实例状态正常。实例异常,节点异常,磁盘满均不允许进行规格变更。 高可用(1主2备)部署形态下,规格变更过程中会进行主备倒换,主备倒换过程中会有1min左右的业务中断。 单副本的部署形态下,规格变更过程中会进行中断重启,中断重启过程中会有5~10min的业务中断。 修改CPU|内存后,将会重启数据库实例。请选择业务低峰期,避免业务异常中断。重启后实例会自动释放内存中的缓存,请在业务低峰期进行重启,避免对高峰期业务造成影响。
  • 支持审计的关键操作列表 通过 云审计 服务,您可以记录与GaussDB实例相关的操作事件,便于日后的查询、审计和回溯。 表1 云审计服务支持的操作列表 操作名称 资源类型 事件名称 创建实例、恢复到新实例 instance createInstance 删除实例 instance deleteInstance 数据库实例规格变更 instance resizeFlavor 实例版本升级 instance upgradeVersion 密码重置 instance resetPassword 实例重启 instance instanceRestart 绑定公共IP instance setOrResetPublicIP 解绑公共IP instance setOrResetPublicIP 修改资源标签 instance modifyTag 删除资源标签 instance deleteTag 添加资源标签 instance createTag 重命名实例 instance instanceRename 实例扩容 instance instanceAction 删除任务记录 instance deleteTaskRecord4OpenGauss 减少副本 instance reduceReplica 协调节点缩容 instance reduceCoordinatorNode 设置回收站策略 backup setRecyclePolicy 创建手动备份 backup createManualSnapshot 删除手动备份 backup deleteManualSnapshot 修改备份策略 backup setBackupPolicy 实例还原 backup restoreInstance 父主题: CTS 审计
  • 注意事项 协调节点缩容操作不会中断业务。 仅支持独立部署实例。 协调节点至少需要保留一个。 缩容前请确认该节点不在JDBC连接配置中,避免影响JDBC连接高可用性能。 缩容过程中执行的DDL操作将被回滚。 缩容过程中PITR备份暂停,缩容结束后自动恢复。 缩容完成后将自动进行一次全量备份。 缩容前须保证实例状态正常,所有协调节点状态正常,否则无法进行缩容。 当选择首节点缩容时,将随机替换为其他协调节点进行缩容。
  • 注意事项 恢复到任意时间点仅支持2.1版本以上实例,单副本实例暂不支持。 节点扩容,版本升级,恢复自身期间,对应时间点无法恢复。 实例故障,发生CN剔除等场景无法产生归档日志,对应时间点无法恢复。 如果您要将数据库备份恢复到新实例: 数据库引擎、数据库大版本,与原实例相同,不可修改。 数据库密码需重新设置。 恢复到当前实例会将当前实例上的数据全部覆盖,并且恢复过程中数据库不可用,且立即停止归档。恢复完成后会出现数据确认按钮,在单击数据确认前,可多次进行恢复。数据确认后会删除本次恢复时间点后的归档日志,并重新开启日志归档。 删除实例会默认删除所有归档日志,不支持选择保留。重建后不支持恢复任意时间点。 账户余额大于等于0元,才可恢复到新实例。
  • 操作场景 创建GaussDB实例时,系统默认开启实例级自动备份策略。实例创建成功后,您可根据业务需要修改实例级自动备份策略。GaussDB按照用户设置的自动备份策略对数据库进行备份。 GaussDB默认开启的自动备份策略设置如下: 保留天数:默认为7天。保留天数范围为1~732天。需要延长保留时间请联系客服人员申请,自动备份最长可以申请保留2562天。 备份时间段:默认为24小时中,间隔一小时的随机的一个时间段 ,例如01:00~02:00,12:00~13:00等。备份时间段以UTC时区保存。如果碰到夏令时/冬令时切换,备份时间段会因时区变化而改变。 备份周期:默认为一周内的每一天。 差量备份策略:默认每30分钟保存一次。 备份流控:默认75MB/s。 差量预取页面个数:默认64。 为了满足时间点恢复的需求,超出备份保留天数最近的一次全量备份不会被立即删除。示例:设置自动备份策略为每天备份1次,保留天数为1天,即11.1号生成备份1,11.2号生成备份2并保留备份1;11.3号生成备份3,并保留备份2及删除备份1。
  • 支持的监控指标 GaussDB数据库 性能监控指标,如下表所示。 表1 GaussDB支持的监控指标 指标ID 指标名称 指标含义 展示对象 测量对象 监控周期(原始指标) rds001_cpu_util CPU使用率 该指标用于统计测量对象的CPU使用率。 当前节点 节点 60秒 rds002_mem_util 内存使用率 该指标用于统计测量对象的内存使用率。 当前节点 节点 60秒 rds003_bytes_in 数据写入量 该指标用于统计测量对象对应VM的网络发送字节数,取时间段的平均值 当前节点 节点 60秒 rds004_bytes_out 数据传出量 该指标用于统计测量对象对应VM的网络接受字节数,取时间段的平均值 当前节点 节点 60秒 rds014_iops 数据磁盘每秒读写次数 该指标用于统计测量对象的节点数据磁盘每秒读写次数,该值为实时值。 当前节点 节点 60秒 rds016_disk_write_throughput 数据磁盘写吞吐量 该指标用于统计测量对象的节点数据磁盘每秒写吞吐量,该值为实时值。 当前节点 节点 60秒 rds017_disk_read_throughput 数据磁盘读吞吐量 该指标用于统计测量对象的节点数据磁盘每秒读吞吐量,该值为实时值。 当前节点 节点 60秒 rds020_avg_disk_ms_per_write 数据磁盘单次写入花费的时间 该指标用于统计测量对象的节点数据磁盘单次写入花费的时间,取时间段的平均值。 当前节点 节点 60秒 rds021_avg_disk_ms_per_read 数据磁盘单次读取花费的时间 该指标用于统计测量对象的节点数据磁盘单次读取花费的时间,取时间段的平均值。 当前节点 节点 60秒 io_bandwidth_usage 磁盘io带宽占用率 当前磁盘io带宽与磁盘最大带宽比值 当前节点 节点 60秒 iops_usage IOPS使用率 当前iops与磁盘最大iops比值 当前节点 节点 60秒 rds005_instance_disk_used_size 实例数据磁盘已使用大小 该指标用于统计测量对象的实例数据磁盘已使用大小,该值为实时值。 实例 实例 60秒 rds006_instance_disk_total_size 实例数据磁盘总大小 该指标用于统计测量对象的实例数据磁盘总大小,该值为实时值。 实例 实例 60秒 rds007_instance_disk_usage 实例数据磁盘已使用百分比 该指标用于统计测量对象的实例数据磁盘使用率,该值为实时值。 实例 实例 60秒 rds035_buffer_hit_ratio buffer命中率 该指标用于统计数据库buffer命中率。 实例 实例 60秒 rds036_deadlocks 死锁次数 该指标用于统计数据库发生事务死锁的次数,取该时间段的增量值。 实例 实例 60秒 rds048_P80 80% SQL的响应时间 该指标用于统计数据库80% SQL的响应时间,该值为实时值。 实例 实例 60秒 rds049_P95 95% SQL的响应时间 该指标用于统计数据库95% SQL的响应时间,该值为实时值。 实例 实例 60秒 rds008_disk_used_size 磁盘已使用大小 该指标用于统计测量对象的节点数据磁盘使用值,该值为实时值。 当前节点 组件 60秒 rds009_disk_total_size 磁盘总大小 该指标用于统计测量对象的节点数据磁盘总大小,该值为实时值。 当前节点 组件 60秒 rds010_disk_usage 磁盘已使用百分比 该指标用于统计测量对象的节点数据磁盘使用率,该值为实时值。 当前节点 组件 60秒 rds024_current_sleep_time 主机流控时间 该指标用于统计测量对象的主机流控时间,该值为实时值。 分布式:备DN 集中式:备DN 组件 60秒 rds025_current_rto 备机RTO时间 该指标用于统计测量对象的主备复制的RTO,该值为实时值。 分布式:备DN 集中式:备DN 组件 60秒 rds026_login_counter 用户登入次数/秒 该指标用于统计每秒的登入次数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds027_logout_counter 用户登出次数/秒 该指标用于统计每秒的登出次数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds028_standby_delay 备机redo进度 该指标用于统计分片内备机redo进度,表示备机和主机的差距,该值为实时值。 分布式:备DN 集中式:主DN 组件 60秒 rds030_wait_ratio 锁等待状态会话比率 该指标用于统计当前处于锁等待状态会话占活跃工作状态下会话比率,该值为实时值。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds031_active_ratio 活跃会话率 该指标用于统计当前处于活跃工作状态会话占总会话数比率,该值为实时值。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds034_inuse_counter CN连接数 该指标用于统计CN连接池中正在使用的连接数,该值为实时值。 分布式:所有CN 集中式:不采集 组件 60秒 rds037_commit_counter 用户提交事务数/秒 该指标用于统计用户每秒提交的事务数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds038_rollback_counter 用户回滚事务数/秒 该指标用于统计用户每秒回滚的事务数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds039_bg_commit_counter 后台提交事务数/秒 该指标用于统计后台每秒提交的事务数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds040_bg_rollback_counter 后台回滚事务数/秒 该指标用于统计后台每秒回滚的事务数,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds041_resp_avg 用户事务平均响应时间 该指标用于统计用户事务的平均响应时间。 分布式:所有CN 集中式:主DN 组件 60秒 rds042_rollback_ratio 用户事务回滚率 该指标用于统计用户事务回滚事务占用户提交、回滚事务之和的比率,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds043_bg_rollback_ratio 后台事务回滚率 该指标用于统计后台事务回滚事务占用户提交、回滚事务之和的比率,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds044_ddl_count Data Definition Language 该指标用于统计用户负载在query层的DDL数量,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds045_dml_count Data Manipulation Language 该指标用于统计用户负载在query层的DML数量,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds046_dcl_count Data Control Language 该指标用于统计用户负载在query层的DCL数量,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds047_ddl_dcl_ratio DDL+DCL比率 该指标用于统计用户负载在query层的DDL+DCL占DDL+DCL+DML的比率,取时间段的平均值。 分布式:所有CN 集中式:主DN 组件 60秒 rds050_ckpt_delay 待落盘的数据量 该指标用于统计信息同步到磁盘过程中待落盘的数据量,该值为实时值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds051_phyrds 读物理文件的IO次数/秒 该指标用于统计数据库每秒读物理物件的IO次数,取时间段的平均值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds052_phywrts 写物理文件的IO次数/秒 该指标用于统计数据库每秒写物理物件的IO次数,取时间段的平均值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds053_online_session 在线会话数量 该指标用于统计当前在线的session个数,该值为实时值。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds054_active_session 活跃会话数量 该指标用于统计当前所有活跃工作状态下会话个数,该值为实时值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds055_online_ratio 在线会话率 该指标用于统计CN(分布式)/主DN(主备版)上的在线会话比例,该值为实时值 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds060_long_running_transaction_exectime 数据库最长事务的执行时长 该指标用于统计测量对象的数据库最长事务的执行时长, 该值为实时值。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds066_replication_slot_wal_log_size 复制槽保留的WAL日志大小 该指标用于统计主DN上复制槽中保留的WAL日志的大小, 该值为实时值。 分布式:主DN 集中式:主DN 组件 60秒 rds067_xlog_lsn xlog速率 该指标用于统计CN或者主DN上xlog的速率, 该值为实时值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds068_swap_used_ratio 交换内存使用率 该指标用于描述操作系统交换内存使用率,该值为实时值。 当前节点 节点 60秒 rds069_swap_total_size 交换内存总大小 该指标用于描述操作系统交换内存总大小,该值为实时值。 当前节点 节点 60秒 rds070_thread_pool 线程池使用率 该指标用于统计CN和DN的线程池使用率,该值为实时值。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds071_locks_session 等锁会话数 该指标用于统计CN/主DN的等锁会话数,该值为实时值。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds072_streaming_dr_xlog_gap 灾备集群分片日志差距 该指标用于统计流式容灾特性开启情况下,灾备集群中各个分片相对于生产集群的日志差距。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds073_streaming_dr_xlog_to_be_replayed 灾备集群分片待回放日志量 该指标用于统计流式容灾特性开启情况下,灾备集群中各个分片待回放日志量。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds074_streaming_dr_xlog_flushing_rate 灾备集群分片日志落盘速率 该指标用于统计流式容灾特性开启情况下,灾备集群中各个分片日志落盘速率。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds075_streaming_dr_xlog_replay_rate 灾备集群分片日志回放速率 该指标用于统计流式容灾特性开启情况下,灾备集群中各个分片日志回放速率。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds076_streaming_dr_rpo 分片RPO 该指标用于统计流式容灾特性开启情况下,各个分片的实时RPO。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds077_streaming_dr_rto 分片RTO 该指标用于统计流式容灾特性开启情况下,各个分片的实时RTO。 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds078_inactive_replication_slot 非活跃的复制槽数 该指标用于统计非活跃的复制槽数(物理加逻辑)。 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds079_standy_not_replayed_log 只读节点未回放日志量 该指标用于查询只读节点日志回放与接收量差距。 分布式:备DN 集中式:备DN 组件 60秒 cpu_user_usage 用户态CPU时间占比 该指标用于统计用户态CPU时间占比。 当前节点 节点 60秒 cpu_sys_usage 内核态CPU时间占比 该指标用于统计内核态CPU时间占比。 当前节点 节点 60秒 cpu_wait_usage 硬盘IO等待时间占比 该指标用于统计硬盘IO等待时间占比。 当前节点 节点 60秒 rds080_xlog_num xlog数量 该指标用于统计CN和DN数据目录下xlog数量,该值为实时值 分布式:所有CN+所有DN 集中式:所有DN 组件 60秒 rds081_xlog_size xlog大小 该指标用于统计CN和DN数据目录下xlog大小,该值为实时值 分布式:所有CN+所有DN 集中式:所有DN 组件 60秒 rds064_dynamic_used_memory 已使用动态内存 该指标用于统计测量对象的动态内存已使用大小,该值为实时值 分布式:所有CN+主DN 集中式:主DN 组件 60秒 rds065_dynamic_used_memory_usage 动态内存使用率 该指标用于统计测量对象的动态内存使用率,该值为实时值 分布式:所有CN+主DN 集中式:所有DN 组件 60秒 rds061_idle_in_transaction_num 空闲事务个数 该指标用于统计测量对象的空闲事务连接的数量,该值为实时值 分布式:所有CN 集中式:主DN 组件 60秒 rds062_slowquery_sys 系统库慢SQL数量 该指标用于统计指定周期内主DN/CN上系统数据库慢SQL数量,该值为实时值 分布式:所有CN 集中式:主DN 组件 60秒 rds063_slowquery_user 用户库慢SQL数量 该指标用于统计指定周期内主DN/CN上用户库慢SQL数量,该值为实时值 分布式:所有CN 集中式:主DN 组件 60秒
  • 操作场景 您可以复制您创建的自定义数据库参数模板。当您已创建一个数据库参数模板,并且想在新的数据库参数模板中包含该组中的大部分自定义参数和值时,复制参数模板是一个方便的解决方案。您还可以复制某数据库实例应用的参数列表,生成一个新的参数模板,供您后期使用。 复制数据库参数模板之后,新参数模板可能不会立即显示,建议您等待至少5分钟再使用。 您无法复制默认参数模板。不过,您可以创建基于默认参数模板的新参数模板。
  • 操作场景 随着实例部署时间及业务的增长,数据库在运行性能及存储上逐渐会达到瓶颈。此时,需要通过增加主机来提升实例的性能及存储能力。GaussDB独立部署形态支持扩容节点操作。 扩容时长与业务数据量有关,默认扩容操作超时时间为7天,扩容中实例可正常使用,但不允许进行其他管理控制台操作,如需要进行操作,请及时联系客服处理。 GaussDB支持灵活选择扩容CN或分片,建议扩容后实例中CN节点的数量小于或等于两倍的分片数量。 实例状态为“正常”时才能进行扩容,分片扩容过程中支持查询和插入、查询业务不中断,对用户的插入性能无影响,正在重分布的本地表跨节点组的关联查询业务,性能可能受到一定影响。
  • 操作场景 用户需要删除不需要的数据库实例。 用户需要删除创建失败的数据库实例。 实例删除后,不可恢复,请谨慎操作。如需保留数据,请务必确认完成数据备份后再删除实例。 执行操作中的实例不能手动删除,只有在实例操作完成后,才可删除实例。 通过数据库回收站中重建实例功能,可以恢复1~7天内删除的实例,具体请参见回收站。 “按需计费”类型的实例删除后手动备份会继续保留。(对于包年包月的实例,您需要进行订单退订才可删除实例,详细操作请参见退订包周期实例)。
  • 事务 在GTM-FREE模式下,不允许执行跨节点事务。 在GTM-FREE模式下,如果所执行的SQL语句包含跨节点事务,会报错处理。 如果语句拆分多条会报错: INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free modeUnsupport DML two phase commit under gtm free mode. modify your SQL to generate light-proxy or fast-query-shipping plan。 此时需要修改语句,来单节点执行。 如果语句涉及多节点会报错: Your SQL needs more than one datanode to be involved in. 建议对语句进行修改,使得能够单节点执行。如果需要此种语句多节点执行,需要添加一个hint来允许,例如:insert /*+ multinode */ into t values(3,3),(1,1); 建议开发阶段在jdbc连接串内设置application_type=perfect_sharding_type,这样所有跨节点读写操作的SQL都会报错,用来提示开发人员尽早优化语句。 大对象操作不支持事务。 大对象操作包括:创建删除DATABASE, ANAYLIZE, VACCUM。 通过JDBC接入数据库时,避免拼接多条SQL为一条语句发送执行。 当多条语句拼接为一条语句,且其中包含对象操作时,如果中间对象操作失败,会重新开启新事务执行后续语句。 示例:不符合规则语句 Connection conn = .... try { Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE t1 (a int); DROP TABLE t1"); } finally { stmt.close(); } conn.commit(); } catch(Exception e) { conn.rollback(); } finally { conn.close(); } 上述执行语句,如果“CREATE TABLE t1;”失败,会重新开启新事务执行“DROP TABLE t1;”导致执行失败。应拆分成两条语句分别发送: Connection conn = .... try { Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE t1 (a int)"); stmt.executeUpdate("DROP TABLE t1"); } finally { stmt.close(); } conn.commit(); } catch(Exception e) { conn.rollback(); } finally { conn.close(); } 父主题: 数据库编程规范
  • SELECT SELECT语句中慎用通配符字段“*”。 使用通配符字段查询表时,如果因业务或数据库升级导致表结构发生变化,可能出现与业务语句不兼容的情况。 因此业务应指明所需查询的表字段名称,避免使用通配符。 带有LIMIT的查询语句中必须带有ORDER BY保证有序。 GaussDB是一种 分布式数据库 ,表数据将分布在多个DN上。 如果SQL语句中只带有LIMIT,而不带有ORDER BY子句,数据库将会把网络传输较快的DN所发送的(符合查询要求的)结果作为最终结果输出到客户端。 由于网络传输效率不同时刻可能发生改变,因此导致多次执行该SQL语句时,返回结果表现出不一致的情况。 避免对大字段(如VARCHAR(2000))执行ORDER BY、DISTINCT、GROUP BY、UNION等会引起排序的操作。 此类操作将消耗大量的CPU和内存资源,执行效率低下。 禁止使用慎用LOCK TABLE语句加锁,仅允许应考虑使用 SELECT .. FOR UPDATE语句。 LOCK TABLE提供多种锁级别,但如果对数据库原理和业务理解不足,误用表锁可能触发死锁,导致集群不可用。 避免在SELECT目标列中使用子查询,可能导致计划无法下推到DN执行,影响执行性能。 考虑使用UNION ALL,少使用UNION,注意考虑去重。 UNION ALL不去重,少了排序操作,速度相对UNION更快。 如果没有去重的需求,优先使用UNION ALL。 需要统计表中所有记录数时,不要使用count(col)来替代count(*)。count(*)会统计NULL值(真实行数),而count(col)不会统计。 在执行count(col)时,将“值为NULL”的记录行计数为0。在执行sum(col)时,当所有记录都为NULL时,最终将返回NULL;当不全为NULL时,“值为NULL”的记录行将被计数为0。 count(多个字段)时,多个字段名必须用圆括号括起来。例如,count( (col1,col2,col3) )。注意:通过多字段统计行数时,即使所选字段都为NULL,该行也被计数,效果与count(*)一致。 count(distinct col)用来计算该列不重复的非NULL的数量, NULL将不被计数。 count(distinct (col1,col2,...))用来统计多列的唯一值数量,当所有统计字段都为NULL时,也会被计数,同时这些记录被认为是相同的。 使用连接操作符“ ||”替换concat函数进行字符串连接。因为concat函数生成的执行计划不能下推,导致查询性能严重劣化。 当in(val1, val2, val3…)表达式中字段较多时,建议使用in (values(va11), (val2),(val3)…)语句进行替换。优化器会自动把in约束转换为非关联子查询,从而提升查询性能。 避免频繁使用下使用count()获取大表行数,该操作资源消耗较大,影响并行作业执行效率。 如果不需要实时的行数统计信息,可以尝试使用如下语句来获取表行数。 SELECT reltuples FROM pg_class WHERE relname = 'tablename'; pg_class中所记录的表行数信息只会在对该表执行ANALYZE以后才会更新。 目前ANALYZE有两种触发条件: 业务主动发送ANALYZE语句,例如: --分析连接库中所有表 ANALYZE; --分析指定表 ANALYZE tablename; 助AUTO VACCUUM机制,在每间隔一定时间或表的增删达到一定行数时触发。间隔时间和增删比例可通过GUC参数设置。 父主题: 数据库编程规范
  • JDBC JDBC实例必须指定数据库,一旦实例创建,无法切换数据库。 单条SQL语句的长度不允许超过2G字节,业务应考虑通信成本,建议单条SQL语句不超过5K行。 不支持对DDL使用Prepare Execute执行方式。 fetchsize必须要在autocommit关闭情况下使用,否则fetchsize配置无效。 使用默认GUC参数,避免通过JDBC发送SET请求修改GUC参数。 更多说明请参考GUC参数编程规范。 必须推荐使用Prepare Execute方式执行查询语句,提高执行效率。 JDBC客户端所在主机时区、数据库集群所在主机时区和集群配置过程中的时区,三者应保持一致。 如果在连接中创建了临时表,那么在将连接归还给连接池之前,必须将临时表删除,避免业务出错。 合理设置prepareThreshold,如果query语句十分固定,建议设置为1。 建议设置连接参数autobalance=true,开启CN负载均衡功能,并中设置多个CN连接地址(使用逗号分隔)。 一旦开启autobalance,JDBC DRIVER会尝试将JDBC connection分配到不同的CN节点上。 设置多个CN连接地址的目的是避免JDBC DRIVER在首次获取集群CN列表时,因所设置的CN节点故障而失败。 一旦首次成功获取,便不会再依赖连接参数中指定的CN列表,而是根据实时获取的集群CN列表,每隔一段时间,选取连接其中有效的CN获取最新的CN列表。 应根据业务上层请求超时时间合理设置JDBC连接超时时间,避免作业完成或常超作业持续占用数据库资源 超时参数包括loginTimeout、connectTimeout、socketTimeout等。 loginTimeout:Integer类型。指建立数据库连接的等待时间。超时时间单位为秒。 connectTimeout:Integer类型。用于连接CN操作的超时值。如果连接到CN花费的时间超过此值,则连接断开。超时时间单位为秒,默认值为0,表示已禁用,timeout不发生。 socketTimeout:Integer类型。用于socket读取操作的超时值。如果从CN读取所花费的时间超过此值,则连接关闭。超时时间单位为秒,默认值为0,表示已禁用,timeout不发生。 cancelSignalTimeout:Integer类型。发送取消消息本身可能会阻塞,此属性控制用于取消命令的“connect超时”和“socket超时”。超时时间单位为秒,默认值为10秒。 tcpKeepAlive:Boolean类型。启用或禁用TCP保活探测功能。默认为false。 以上参数可以在JDBC连接串或者property连接属性中配置,例如: 在连接串中配置: jdbc:postgresql://host:port/postgres?tcpKeepAlive=true 在property中配置: Properties info = new Properties();Info.setProperty("tcpKeepAlive", true); 父主题: 客户端编程规范
  • 子查询 禁止一条SQL语句中,出现重复子查询语句。 少用标量子查询。 标量子查询指结果为1个值,并且条件表达式为等值的子查询。 示例:不符合规范的语句 SELECT * FROM t1 WHERE id = (SELECT id FROM t2 LIMIT 1)); 上述语句建议业务拆分为两条SQL语句,先执行子查询。 避免在SELECT目标列中使用子查询,可能导致计划无法下推影响执行性能。 子查询嵌套深度建议不超过2层。 由于子查询会带来临时表开销,过于复杂的查询应考虑从业务逻辑上进行优化。 父主题: 数据库编程规范
  • 字段设计规范 字段设计应使用推荐类型。 字段设计需使用推荐字段,如果需要使用禁用、不推荐的字段类型,建议联系技术支持进行评估。 这些数据类型不推荐或禁止的原因是业务使用场景较少,未大规模商用。 对于业务上有迫切字段类型要求的,联系技术支持,提交需求。 表1 数据库数据类型最佳实践 数据类型 说明 是否推荐 UUID 不同集群可能产生相同UUID 禁止,建议业务直接采用中间件平台提供的分布式ID 序列整型 即自增列,包括SMALLSERIAL,SERIAL,BIGSERIAL 禁止 整数类型 TINYINT, SMALLINT, INTEGER, BIGINT 推荐 任意精度类型 NUMERIC/DEMICAL 推荐 浮点类型 REAL/FLOAT4,DOUBLE PRECISION/FLOAT8,FLOAT 推荐 布尔类型 BOOLEAN 推荐 定长字符 CHAR(n) 推荐 变长字符 VARCHAR(n),NVARCHAR2(n) VARCHAR/TEXT 推荐 时间类型 DATE, TIME, TIMESTAMP, SMALLDATETIME, INTERVAL, REALTIME 推荐 TIMETZ,TIMESTAMPTZ 不推荐 二进制类型 BYTEA(变长二进制类型) 推荐 CLOB(字符大对象),BLOB(二进制大对象),RAW(变长十六进制) 禁止 位串类型 BIT(n), VARBIT(n) 推荐 特殊字符类型 NAME,"CHAR",通常供数据库系统内部使用 禁止 JSON类型 JSON类型目前不支持操作符 禁止 自定义类型 可用于定义枚举EMU等类型 禁止 HLL数据类型 建议直接使用HLL相关函数,减少性能影响 禁止 货币类型 MONEY 存储带有固定小数精度的货币金额 禁止 几何类型 POINT, LSEG, BOX, PATH, POLYGON, CIRCLE 禁止 网络地址类型 存储IPV4 IPV6 MAC地址数据类型 禁止 文本搜索类型 用于支持全文检索 禁止 合理选用字符串数据类型。优先使用变长字符类VARCHAR。只有该字段输入确定为固定字符则使用定长字符类型,或需要自动补充空格,才使用CHAR(n)。 典型的定长字段类型,例如“sex”字段,仅允许输入“f”或“m”一个字节长度的字符。这类字段建议使用定长数据类型(如CHAR(n))。 如果不存在此特点,或者后续可能扩展需要输入更长的字符,请优先使用变长字符类型(如VARCHAR, TEXT),且不建议指定变长类型的长度。 原因如下: 定长字段会对不够长度的输入数据补充空格,然后存入数据库中,产生不必要的存储空间浪费。 如果定义为定长字符类型,后续扩展长度,需要对全表进行扫描重写,性能开销大,影响在线业务。 对于指定固定长度的变长字段,每次插入时会检查是否长度越界,带来性能开销。 字符类型字段不应存储数字类型的数据。 如果对存储在字符类型字段中的数据进行数值计算,或者与数值进行比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。 字符类型字段不应存储时间或日期类数据。 如果对存储在字符类型字段中的数据与日期类数据进行计算或比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。 对于明确不存在NULL值的字段加上NOT NULL约束。 对于NOT NULL字段,优化器在某些场景下会进行特殊优化,可较大提升查询性能。 相关联字段的数据类型应保持一致。 在进行关联操作时,如果字段类型不一致,会带来数据类型转换开销。 大字段(例如varchar(1000)、varchar(4000))不建议超过8个。 字段定义时建议同时创建COMMENT注释信息,以便于未来维护。 不同类型字段说明、取值范围及使用方法请参考数据类型章节。 用于WHERE条件过滤和关联的字段都应设置NOT NULL约束。 对于NOT NULL字段,优化器在某些场景下会进行特殊优化,可较大提升查询性能。 不建议对表预留字段。大部分场景下可支持快速新增、删除表字段,或者修改字段的DEFAULT值。 新增列必须符合以下要求,否则会带来全表更新开销,影响在线业务。 数据类型为以下类型中的一种:BOOL, BYTEA, SMALLINT, BIGINT, SMALLINT, INTEGER, NUMERIC, FLOAT, DOUBLE PRECISION, CHAR, VARCHAR, TEXT, TIMESTAMPTZ, TIMESTAMP, DATE, TIME, TIMETZ, INTERVAL; 新增列的DEFAULT值长度不超过128个字节; 新增列DEFAULT值不包含volatile函数; 新增列设置有DEFAULT值,且DEFAULT值不为NULL。 如果不确定是否满足条件,请联系数据库技术人员进行评估。 尽量使用高效的数值类数据类型。在满足业务精度的情况下,选择的优先级从高到低依次为整数、浮点数、NUMERIC。 合理设置数值字段的数据类型,根据取值范围选择合适的数值类型,尽量少用NUMERIC/DECIMAL类型。 NUMERIC和DECIMAL等价,NUMERIC(或DECIMAL)数据类型操作对CPU消耗较高。 表2 数值类数据类型存储空间及取值范围 类型 存储空间/Byte 最小值 最大值 TINYINT 1 0 255 SMALLINT 2 -32768 32767 INTEGER 4 -2,147,483,648 2,147,483,647 BIGINT 8 -9,223,372,036,854,775,808 9,223,372,036,854,775,807 REAL/FLOAT4 4 6位十进制数字精度 DOUBLE PRECISION/FLOAT8 8 15位十进制数字精度 父主题: 数据库设计规范
  • 响应示例 状态码: 200 查询SNAT规则成功。 { "snat_rule" : { "floating_ip_id" : "bdc10a4c-d81a-41ec-adf7-de857f7c812a", "status" : "ACTIVE", "nat_gateway_id" : "a78fb3eb-1654-4710-8742-3fc49d5f04f8", "admin_state_up" : true, "network_id" : "eaad9cd6-2372-4be1-9535-9bd37210ae7b", "source_type" : 0, "tenant_id" : "d199ba7e0ba64899b2e81518104b1526", "created_at" : "2017-11-18 07:54:21.665430", "id" : "5b95c675-69c2-4656-ba06-58ff72e1d338", "floating_ip_address" : "5.21.11.226", "freezed_ip_address" : "", "description" : "my snat rule 01" }}
  • 响应示例 状态码: 200 查询公网NAT网关实例成功。 { "nat_gateway" : { "id" : "14338426-6afe-4019-996b-3a9525296e11", "name" : "nat-gateway-name", "description" : "nat-gateway-description", "spec" : "1", "router_id" : "d84f345c-80a1-4fa2-a39c-d0d397c3f09a", "tenant_id" : "70505c941b9b4dfd82fd351932328a2f", "enterprise_project_id" : "2759da7b-8015-404c-ae0a-a389007b0e2a", "internal_network_id" : "89d66639-aacb-4929-969d-07080b0f9fd9", "status" : "ACTIVE", "admin_state_up" : true, "created_at" : "2019-04-22T08:47:13" }}
  • 请求示例 添加公网NAT网关资源标签,其中,标签键为“key1”,对应的值为“value1”。 POST https://{VPC_endpoint}/v2.0/9ad601814ac94c80bf7bb9073ded66fc/nat_gateways/fe1a4cf0-27fe-4b97-a9b1-2c67c127f0e0/tags{ "tag" : { "key" : "key1", "value" : "value1" }}
  • 响应示例 状态码: 201 创建SNAT规则成功。 { "snat_rule" : { "floating_ip_id" : "bdc10a4c-d81a-41ec-adf7-de857f7c812a", "status" : "PENDING_CREATE", "nat_gateway_id" : "a78fb3eb-1654-4710-8742-3fc49d5f04f8", "admin_state_up" : true, "cidr" : "172.30.0.0/24", "description" : "", "source_type" : 1, "tenant_id" : "27e25061336f4af590faeabeb7fcd9a3", "created_at" : "2017-11-18 07:54:21.665430", "id" : "5b95c675-69c2-4656-ba06-58ff72e1d338", "floating_ip_address" : "5.21.11.226" }}
  • 请求示例 创建SNAT规则,其中,公网NAT网关的id为a78fb3eb-1654-4710-8742-3fc49d5f04f8,弹性公网IP的id为bdc10a4c-d81a-41ec-adf7-de857f7c812a。 POST https://{Endpoint}/v2/d199ba7e0ba64899b2e81518104b1526/snat_rules{ "snat_rule" : { "nat_gateway_id" : "a78fb3eb-1654-4710-8742-3fc49d5f04f8", "cidr" : "172.30.0.0/24", "source_type" : 1, "floating_ip_id" : "bdc10a4c-d81a-41ec-adf7-de857f7c812a", "description" : "my snat rule 01" }}
  • 请求示例 创建公网NAT网关实例,其中,实例名称为nat_001,所属的VPC的id为d84f345c-80a1-4fa2-a39c-d0d397c3f09a,公网NAT网关下行口(DVR的下一跳)所属的network id为89d66639-aacb-4929-969d-07080b0f9fd9,SNAT最大连接数为10000。 POST https://{Endpoint}/v2/70505c941b9b4dfd82fd351932328a2f/nat_gateways { "nat_gateway" : { "name" : "nat_001", "description" : "my nat gateway 01", "router_id" : "d84f345c-80a1-4fa2-a39c-d0d397c3f09a", "internal_network_id" : "89d66639-aacb-4929-969d-07080b0f9fd9", "spec" : "1", "enterprise_project_id" : "0aad99bc-f5f6-4f78-8404-c598d76b0ed2" }}
  • 响应示例 状态码: 201 创建公网NAT网关实例成功。 { "nat_gateway" : { "id" : "14338426-6afe-4019-996b-3a9525296e11", "name" : "nat_001", "description" : "my nat gateway 01", "router_id" : "d84f345c-80a1-4fa2-a39c-d0d397c3f09a", "spec" : "1", "admin_state_up" : true, "tenant_id" : "70505c941b9b4dfd82fd351932328a2f", "internal_network_id" : "89d66639-aacb-4929-969d-07080b0f9fd9", "enterprise_project_id" : "0aad99bc-f5f6-4f78-8404-c598d76b0ed2", "status" : "ACTIVE", "created_at" : "2019-04-22T08:47:13" }}
  • 请求示例 创建DNAT规则,其中,公网NAT网关实例id为cda3a125-2406-456c-a11f-598e10578541,虚拟机对外提供服务的协议端口号为993,弹性公网IP的id为bf99c679-9f41-4dac-8513-9c9228e713e1,协议类型为tcp协议。 POST https://{Endpoint}/v2/d199ba7e0ba64899b2e81518104b1526/dnat_rules{ "dnat_rule" : { "nat_gateway_id" : "cda3a125-2406-456c-a11f-598e10578541", "floating_ip_id" : "bf99c679-9f41-4dac-8513-9c9228e713e1", "port_id" : "9a469561-daac-4c94-88f5-39366e5ea193", "internal_service_port" : 993, "protocol" : "tcp", "external_service_port" : 242, "description" : "my dnat rule 01" }}
共100000条