华为云用户手册

  • 表膨胀 由于MVCC机制,PostgreSQL的DELETE操作并不会真正删除元组,而是将其标记为已删除状态,这些被标记为删除的元组称为死元组(dead tuples),UPDATE也是同理,可以看成是先DELETE然后再INSERT;由于DELETE并不是真正的删除数据,死元组依旧占用磁盘空间,就会出现虽然查询表数据很少,但是磁盘占用空间很大,这样就会形成表膨胀。 vacuum可以用来解决表膨胀的问题,vacuum会清理死元组,但是并不会重新组织活元组在表上的存储位置,其会维护表的空闲空间映射(FSM)以供接下来的元组INSERT操作从而避免占用更多的空间。 vacuum full则更干脆一些,会对原表进行重建,但是vacuum full会对表进行锁定,在执行vacuum full期间无法对表进行读写操作。同时,如果表的数据量太大,在使用vacuum full时执行时间会很长,请在业务低峰期进行操作。
  • 事务ID回卷 PostgreSQL会为事务分配一个事务ID,这个事务ID并不是无限大的,PostgreSQL使用一个32位的整数作为事务ID的值,其使用1到2^31轮转的方式来处理无限多的事务,也就是说,当事务ID到达2^31(2147483648)的时候,它将为接下来的事务继续分配1到2^31的事务ID,这种轮转事务ID的方法就是事务ID回卷。 当前的事务ID只能看到其之前的事务ID提交信息,如果当前一个事务ID是100, 当该事务ID达到最大值2^31之后会进行轮转,这样从101到2^31对于当该事务ID来说都是之后的事务ID,此时该事务ID不能看到100以后的所有事务,这样就会导致数据库数据丢失,会造成数据库的不可信。 vacuum freeze可以用来防止事务ID回卷,其意味着覆盖事务ID到frozen事务ID,上面的例子,当前的事务ID100是经历过回卷的,但是使用vacuum freeze将表中对应元组的xmax的值设置为2,那这样所有的事务都能看到该元组。 vacuum freeze同时也会清理死元组。
  • 为什么要做vacuum PostgreSQL使用多版本并发控制(MVCC)来保证数据在高并发环境中保持一致和可访问性,每个事务在它开始的时间点都在其自己的数据库快照上运行,这就意味着无法立即删除过时的数据。当进行UPDATE和DELETE操作时,PostgreSQL数据库会为其他正在运行的事务保留旧版本的元组,修改数据库的每个语句都会生成一个事务ID(xid);PostgreSQL UPDATE可以看成是先DELETE然后INSERT。这就会导致数据库出现两个主要问题:事务ID回卷和表膨胀。
  • autovacuum的相关参数 可以通过查询pg_settings系统表来查看autovacuum参数: select category, name,setting,unit,source,min_val,max_val from pg_settings where category = 'Autovacuum' ; category | name | setting | unit | source | min_val | max_val ------------+-------------------------------------+-----------+------+---------+---------+------------ Autovacuum | autovacuum | on | | default | | Autovacuum | autovacuum_analyze_scale_factor | 0.1 | | default | 0 | 100 Autovacuum | autovacuum_analyze_threshold | 50 | | default | 0 | 2147483647 Autovacuum | autovacuum_freeze_max_age | 200000000 | | default | 100000 | 2000000000 Autovacuum | autovacuum_max_workers | 3 | | default | 1 | 262143 Autovacuum | autovacuum_multixact_freeze_max_age | 400000000 | | default | 10000 | 2000000000 Autovacuum | autovacuum_naptime | 60 | s | default | 1 | 2147483 Autovacuum | autovacuum_vacuum_cost_delay | 2 | ms | default | -1 | 100 Autovacuum | autovacuum_vacuum_cost_limit | -1 | | default | -1 | 10000 Autovacuum | autovacuum_vacuum_scale_factor | 0.2 | | default | 0 | 100 Autovacuum | autovacuum_vacuum_threshold | 50 | | default | 0 | 2147483647 autovacuum的工作量取决于两个参数: autovacuum_vacuum_cost_limit是自动清理一次性完成的工作量。 autovacuum_vacuum_cost_delay是自动清理在达到autovacuum_vacuum_cost_limit参数指定的开销后休眠的毫秒数。
  • Autovacuum Autovacuum是一个能够自动执行vacuum和analyze命令的守护进程,其能够检查数据库中臃肿的表,并回收空间用以重用。autovacuum守护进程被设计成两个进程,autovacuum launcher和autovacuum worker。 autovacuum launcher是在autovacuum参数设置为on时postmaster启动的进程,autovacuum launcher进程用来调度autovacuum worker进程对表进行vacuum操作;autovacuum worker是实际执行vacuum操作的进程,它按照launcher进程的计划连接到数据库并选择某个表执行vacuum操作。
  • autovacuum常见问题 长事务/事务未提交影响autovacuum正常工作 由于MVCC机制,长事务/事务未提交不允许autovacuum清理死元组,如果当前事务在执行删除或更新操作之前拍摄的数据快照,那autovacuum会跳过这些死元组;出现autovacuum不能正常工作的时候应优先排查idle in transaction中的会话。 可以通过如下SQL查询autovacuum进程的锁信息: select locktype, relation::regclass, pid, mode, granted from pg_locks where pid in($autovacuum_pid); 可以通过如下SQL查询长事务以及等待事件信息: select pid,wait_event_type,wait_event,state,backend_start,xact_start,query_start,state_change, query from pg_stat_activity where state not in ('idle', 'active'); 确认后通过如下SQL杀死该事务: select pg_terminate_backend(pid); 废弃的复制槽影响autovacuum正常工作 复制槽中存储着备机追上主机需要的信息,如果备机宕机或者严重落后于主机,将无法清理在主节点上复制槽中的列。 可以通过如下SQL查询包含旧事务的复制槽: SELECT slot_name, slot_type, database, xmin, catalog_xmin FROM pg_replication_slots ORDER BY age(xmin), age(catalog_xmin) DESC; 使用pg_drop_replication_slot()删除废弃的复制槽。 autovacuum时占用资源高,或者经常导致中断 这时一般是由于autovacuum执行次数过于频繁,需要调整参数降低其执行次数: 适当增大autovacuum_vacuum_cost_delay和减少autovacuum_vacuum_cost_limit的值。 减少autovacuum_max_workers的数量。 如果业务量比较大,可以做定时任务在业务低峰期进行清理,也可以设置定时任务为特殊的表单独设置autovacuum参数。 表膨胀的速度加快 在autovacuum正常运行的情况下,如果业务量增加,可能在短时间内产生大量死元组,导致autovacuum跟不上节奏,会导致查询性能下降;可通过修改autovacuum的相关参数进行优化: 适量降低autovacuum_vacuum_cost_delay,适量增加autovacuum_vacuum_cost_limit。 适量增大autovacuum_max_workers增加并行。 autovacuum执行卡住或执行很慢 如果autovacuum执行卡住或执行很慢,尝试手动执行vacuum。 通过SQL查询autovacuum运行情况,找到autovacuum的PID: SELECT datname, usename, pid, now() - xact_start AS runtime, query FROM pg_stat_activity WHERE upper(query) LIKE '%VACUUM%' ORDER BY xact_start; 多次执行以下命令,判断autovacuum是否正常运行: SELECT pg_terminate_backend($PID); 确认autovacuum正常运行后,对需要清理的表手动执行vacuum freeze终止autovacuum进程: verbose选项可选。 vacuum freeze verbose $TBL_NAME;
  • 解决方法 SQL阻塞 当定位到阻塞的SQL后,可以通过SELECT pg_terminate_backend($PID);结束该进程。 结束后再执行1,进一步确认是否还存在其他锁冲突的情况。 系统资源使用率高,导致SQL运行时间长 优化业务,减少业务并发。 缺少索引导致SQL执行慢 重新创建索引,走索引查询。 SQL中使用排序导致IO执行时间长 增大“work_mem”参数值,减少排序的IO执行时间。
  • 排查及解决方法 排查主机业务压力大。 排查主机上是否存在大的业务写入或者更新。 在主机查看管理控制台的监控平台中事务日志生成速率监控项,观察目标时间段事务日志生成速率是否超过40MB/s(一般只读实例回放wal日志的速率大概为40MB/s)。 若长时间超过指标阈值,说明主机业务压力较大,此时建议优化业务量大小。 若存在主机业务压力大时,典型的现象还有pg_stat_replication中的sent_lsn和主机上select pg_current_wal_lsn();的查询结果差异较大,可通过如下SQL来查看: 确认只读实例节点信息,在主机上执行以下SQL,并重点关注sent_lsn列的值,记为lsn1。 select * from pg_stat_replication; 主机上查询当前位点信息,记为lsn2。 select pg_current_wal_lsn(); 计算主机当前位点和发送的位点的距离。 select pg_size_pretty(pg_wal_lsn_diff(lsn1,lsn2)); 若未超过指标阈值,可进行后续步骤排查。 排查只读副本回放延迟高。 只读实例上复制延迟出现原因是,当只读实例有长事务或者业务繁忙时,只读上的查询与日志回放出现冲突,只读副本没有将其查询信息反馈给主机,导致回放被延迟。此时可以下载只读实例的错误日志,查看错误日志中是否包含此类报错。 ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed 若日志中包含此类报错,建议业务按如下方式排查处理。 避免长事务,排查长事务请参考长事务问题定位及处理方法。 只读hot_standby_feedback设置为on,可以减少只读的查询冲突。 若无此类报错,可进行后续步骤排查。 排查主机和只读副本之间网络延迟。 主机和只读副本之间网络延迟高的表现一般为如下情况,若符合以下现象,可联系华为云客服进行问题具体原因定位。 在主机上查询sent_lsn和只读副本上pg_last_wal_receive_lsn接收位点的查询结果差异较大,可通过如下SQL来查看。 在主机上执行以下SQL,并重点关注sent_lsn列的值,记为lsn1。 select * from pg_stat_replication; 在只读上查询pg_last_wal_receive_lsn(),接收位点的值,记为lsn2。 select pg_last_wal_receive_lsn(); 计算主机当前发送位点和只读当前接收位点的距离。 select pg_size_pretty(pg_wal_lsn_diff(lsn1,lsn2));
  • 指标异常说明(影响) 最滞后副本滞后量:多个副本中最滞后副本(依据接收到的WAL数据)滞后量。可以通过如下SQL查看多个副本使用复制槽的滞后量情况。 select slot_name, temporary, active,restart_lsn, confirmed_flush_lsn, master_lsn, pg_size_pretty(pg_wal_lsn_diff(master_lsn, a.restart_lsn)) as latency from pg_replication_slots a, pg_current_wal_lsn() as master_lsn; 复制时延:副本滞后时延,即数据写入主数据库和复制到副本之间的时间延迟。 当数据库最滞后副本滞后量或复制时延高时,可能会产生以下影响: 数据库主服务器会保留所需要的wal日志,使得该部分wal日志无法被清理,从而导致wal日志积压,占用更多的磁盘空间,严重时会导致磁盘满。 复制时延高,说明回放速度落后主机,影响数据实时性。
  • 排查及解决方法 排查是否存在失效的逻辑复制槽。 在发布端执行如下SQL,排查是否存在失效的逻辑复制槽。 若有返回时,则说明数据库中存在失效的逻辑复制槽,其中返回的slot_name字段为失效逻辑复制槽的名称。 select slot_name,database,active from pg_replication_slots where active ='f' and slot_type='logical'; 业务确认是否需要继续使用该逻辑复制槽。 联系业务方排查是否要继续使用该逻辑复制槽,若不使用时执行3。 若需继续使用,建议业务按照以下方向排查: 订阅端创建订阅时未启用逻辑复制槽的复制,手动设置为disable状态。 在订阅端执行以下SQL查看subenabled列的字段返回。 select subname,subenabled from pg_subscription; 若subenabled列的字段返回为f,说明订阅未启用逻辑复制,执行以下SQL启用订阅的逻辑复制。 ALTER SUBSCRIPTION sub_name ENABLE; 若返回为t,则进行以下步骤排查。 使用其他工具执行任务时使用的逻辑复制槽未自动清理,由于任务中断或源数据库或目标数据库的某些操作,如备份、重建索引等意外情况产生。 在发布端执行如下SQL查询,观察返回的“slot_name”字段的值是否是以drs等开头,则说明是执行drs任务产生的该逻辑复制槽,此时可根据任务情况,判断是否执行3清理。 select slot_name,database,active from pg_replication_slots where active ='f' and slot_type='logical'; 如果确认不再使用逻辑复制槽,则删除失效的逻辑复制槽。 select pg_drop_replication_slot('slot_name');
  • 指标异常说明(影响) 生产数据库一定要及时清理非活跃逻辑复制槽。配置非活跃逻辑复制槽监控指标(连续3个周期 上报值≥1 Counts),当存在时,需要及时关注并处理。 存在非活跃逻辑复制槽产生的影响: 数据库残留的非活跃逻辑复制槽,会一直保留逻辑复制所需要的资源。数据库wal日志无法被清理,从而导致wal日志积压,占用更多的磁盘空间,严重时会导致磁盘满。 可能意味着应用侧的业务未按预期运行,存在风险。
  • 解决方法 对于长事务,业务确认后可终止该事务。 参考2,查到长事务的pid后,使用如下SQL执行: 推荐使用如下命令: select pg_cancel_backend($PID); 若pg_cancel_backend语句无效,再使用本语句: select pg_terminate_backend($PID); 对于涉及批量操作的业务可以等到业务低峰期进行。 关注oldest_transaction_duration_2pc指标,并及时提交未决事务。
  • 解决方法 正常业务变更或业务并发升高 为保证数据库健康运行,可提高实例规格来解决问题。 连接数满 临时解决方法: 通过已存在的root用户连接,执行以下SQL释放无用的空闲连接。 以查询用户user的空闲连接为例,获取pid的SQL如下: select * from pg_stat_activity where state = 'idle' and usename = 'user'; 释放无用的空闲连接: select pg_terminate_backend(pid); 调高“max_connections”参数值,该参数重启生效。 长期解决方法: 限制业务,降低业务连接。 如果评估业务本身需要很多连接无法继续优化时,可进行规格变更扩大实例规格。 OOM或crash 如果内存使用率长时间处于较高位置,可提高实例规或优化业务系统,减少常驻内存占用。如果由于SQL导致的数据库重启,对SQL进行优化。 慢SQL 定位到对应的慢SQL,对SQL进行优化。 锁冲突 判断连接的客户端业务是否可以断开,可以则及时通过pg_cancel_backend函数断开对应的数据库连接。 长事务 参考长事务问题定位及处理方法中的处理方法。
  • 问题排查思路 以下现象不考虑正常的业务变更情况,如连接池参数修改,业务规模改变等。 如用户无法及时判断自身是否有业务变更,或者突然的业务高并发,可先通过当前数据库连接信息进行反向判断。 数据库连接数异常降低后正常 可能原因:数据库断开了连接 ,数据库发生OOM或crash导致数据库异常重启。 数据库连接数异常增加或者直至连接数满 可能原因:单位时间新建连接数大于关闭的连接数会导致连接数上升。 存在以下情况,会降低并发性从而导致连接未能及时释放 存在慢SQL 存在锁冲突 存在长事务
  • 排查及解决方法 查询数据库、表、WAL日志等大小的SQL会占用较多的磁盘IO,请在业务低峰期运行。 查看WAL日志大小是否异常并进行处理 查看wal日志大小 可以通过rds040_transaction_logs_usage监控指标或者以下SQL查看WAL日志大小,如果发现WAL非常多,可以通过后续步骤依次排查。 select round(sum(size)/1024/1024/1024,2) "GB" from pg_ls_waldir(); RDS for PostgreSQL 12之后的版本才有pg_ls_waldir() 函数。 需要root用户执行pg_ls_waldir函数。 查看WAL日志保留相关参数 对于RDS for PostgreSQL 12及以下版本,查看“wal_keep_segments”参数(单位MB)的值;对于12以上版本,查看“wal_keep_size”参数(单位为MB)。 WAL日志保留参数的值不宜太大,一般设置要小于磁盘总空间的10%;也不宜太小,一般要大于4GB,否则容易导致主库将备库需要的wal日志清理,进而导致备库异常。 查看复制槽状态,及延迟未清理的日志大小 复制槽会阻塞WAL的回收,如果发现非活动的复制槽或者不需要的复制槽,可以根据需要进行删除。 查询slot状态、WAL日志滞后量的SQL: select slot_name, active, pg_size_pretty(pg_wal_lsn_diff(b, a.restart_lsn)) as slot_latency from pg_replication_slots as a, pg_current_wal_lsn() as b; 删除slot命令的SQL: select pg_drop_replication_slot('slot_name'); 查看写业务繁忙程度 可以通过rds044_transaction_logs_generations指标查看写业务繁忙程度,该指标表示平均每秒生成的事务日志(WAL日志)大小。 如果该指标较大,说明写业务较多,数据库内核会自动预留更多的WAL日志以便回收使用,WAL日志占用的磁盘空间会增加,建议通过磁盘扩容保证一定的磁盘冗余。 查看数据文件大小否异常并进行处理 查询磁盘占用前10的数据库 select datname, pg_database_size(oid)/1024/1024 as dbsize_mb from pg_database order by dbsize_mb desc limit 10; 查看磁盘占用前10的对象(表/索引) 可以通过pg_class的“relpages”字段估算表或者索引的大小,SQL如下: select relname, relpages*8/1024 as tablesize_mb from pg_class order by tablesize_mb desc limit 10; 如果要获取表或者索引的精确大小,需要通过以下函数获取: 表1 函数说明 名称 返回类型 描述 pg_relation_size(relation regclass, fork text) bigint 指定表或索引的指定分叉('main'、'fsm'、'vm'或'init')使用的磁盘空间。 pg_relation_size(relation regclass) bigint pg_relation_size(..., 'main')的简写。 pg_table_size(regclass) bigint 被指定表使用的磁盘空间,排除索引(但包括 TOAST、空闲空间映射和可见性映射)。 pg_total_relation_size(regclass) bigint 指定表所用的总磁盘空间,包括所有的索引和TOAST数据。 查看表是否发生了膨胀 一旦确认了占用磁盘较多的表后,可以通过pgstattuple插件分析表是否发生了膨胀,插件可以通过如下方式安装: create control_extension('create', 'pgstattuple'); select * from pgstattuple('table_name'); 部分内核版本不支持pgstattuple插件,详见支持的插件列表。 插件使用参考:https://www.postgresql.org/docs/15/pgstattuple.html 清理表数据 如果发现是表膨胀,可以选择在维护时间窗内对表的磁盘占用整理。 vacuum full会锁表,请确保操作期间没有DML等操作。 vacuum full table_name; 如果发现不需要的表或数据,可以通过truncate table或是drop table清理掉不需要的数据。 truncate table table_name; 通过执行delete操作不会释放磁盘空间,反而因生产大量wal日志加剧磁盘空间消耗。磁盘满时禁止通过delete来释放磁盘空间。 由于PostgreSQL的MVCC机制,delete操作不会释放磁盘空间(被delete的数据被标记为不可见,空间不释放),需要结合vauum full(会锁表)才能真正释放空间。vacuum full操作自身也会消耗空间,并且会锁表,影响业务,请于业务低峰期执行,并至少预留2倍现有表大小的空闲空间。 另外,如果需要保留的数据相对较少,也可以新建一张表转移需要保留的数据,参考步骤: 保存原表的结构、索引等信息。 创建新表。 向新表插入数据。 检查新表的数据是否符合预期,符合则进行下一步,否则检查前面操作是否有异常。 删除原表。 将新表重命名、创建索引等。 vacuum full(会锁表)会对表及其索引进行重建,重建期间还会生成WAL日志,需要预留足够的磁盘空间(假设重建后的表大小为1GB,索引为0.5GB,建议预留2.5GB以上的磁盘空间)。 vacuum介绍:https://www.postgresql.org/docs/current/routine-vacuuming.html 磁盘使用率达到97%以上,实例会进入只读状态,此时无法通过drop、truncate进行清理,解决方法如下: 扩容磁盘空间,确保磁盘空间足够。如果原有规格的磁盘已是最大,请先升级规格。 磁盘扩容后,若空间利用率低于87%,则会只读状态会自动解除,之后删除无用数据。注意:云盘实例可以设置存储空间自动扩容,在实例存储空间达到阈值时,会触发自动扩容,避免实例磁盘打满进入只读。 如果不想进行扩容,只能联系客服解除只读,再删除无用数据。注意:解除只读前请停止业务,避免继续写入。如果解开只读,数据继续写入,会导致磁盘再次爆满,实例异常。 查看临时文件大小是否异常并进行处理 如果总的磁盘占用减去数据文件和WAL日志还有较大的剩余,那么可能是临时文件占用较多的磁盘空间。查看临时文件大小的SQL如下: select round(sum(size)/1024/1024/1024,2) "GB" from pg_ls_tmpdir(); RDS for PostgreSQL 12之后的版本才有pg_ls_waldir() 函数。 需要root用户执行pg_ls_waldir函数。 当临时文件非常多时,该SQL执行会非常缓慢。 一般来说,临时文件会在复杂SQL执行完成后释放,但如果生过OOM等异常,可能会导致临时文件不能正常释放。当发现临时文件非常多时,一方面需要分析并优化慢SQL,减少临时文件的产生,另一方面需要在维护时间窗内对数据库进行重启,重启数据库可以清除所有的临时文件。
  • 指标异常说明 生产数据库的磁盘要有一定的冗余,一旦磁盘使用率过高要及时处理,防止出现磁盘满导致数据库损坏等问题。 数据库提供了多项体现磁盘使用的监控指标,建议重点关注以下指标: 磁盘利用率:rds039_disk_util 磁盘总大小:rds047_disk_total_size 磁盘使用量:rds048_disk_used_size 事务日志(WAL日志)使用量:rds040_transaction_logs_usage 最滞后副本滞后量(因复制槽积压的WAL日志):rds045_oldest_replication_slot_lag
  • 解决方法 autovacuum进程不起作用 确认客户数据库上的autovacuum参数是否开启,如果参数未开启,需要开启autovacuum参数,等待观察数据库年龄恢复情况。 查看autovacuum_freeze_max_age参数值,云上数据库默认值是4亿,如果修改了参数值超过10亿,建议改小参数值,等待观察数据库年龄恢复情况。 写入数据量太大 如果磁盘吞吐量达到性能上限,需要更换磁盘类型。 需要手动执行vacuum清理年龄大的表。 临时表长时间未释放 临时表不会执行autovacuum,如果是临时表导致数据库年龄增长,需要释放客户端连接使临时表被回收。 长事务导致数据库年龄增加 如果是长事务,先取消长事务,再对数据库年龄大的表执行vacuum。 取消长事务 select pg_cancel_backend($PID); 清理表 vacuum 表名;
  • 指标异常说明(影响) 生产数据库的内存要有一定的冗余,正常使用应保持在70%以下,若内存使用率长期高于阈值,建议考虑扩大内存规格。当内存使用率超过阈值并产生告警时,可能会产生以下问题。 系统会频繁地进行内存交换,数据会在内存与磁盘之前大量交换,会消耗大量CPU,使数据库性能下降,影响数据的读取和写入速度等。 严重时可能会发生OOM,若发生OOM,数据库服务进程会发生重启,数据库会断开现有连接,且新连接无法接入。此时HA会重新拉起数据库,期间数据库会回放从上一次checkpoint到发OOM时之间产生的wal日志内容,以保证事务一致性。
  • 内存使用率说明 PostgreSQL数据库中内存使用率主要是由共享内存和本地内存组成。 共享内存:主要用于数据的缓冲区、wal日志的缓冲区等,以便提高读写性能。除此之外也包含一些全局信息,如进程、锁信息等。 shared_buffers参数的值决定初始申请共享内存的大小,RDS for PostgreSQL设置该参数开始值为系统物理内存的25%,该参数合理设置区间为25%~40%,如超过物理内存的 40%,就会发现缓冲的效果并不明显,这是因为PostgreSQL是运行在文件系统之上的,若文件系统也有缓存,将导致双缓存过多,造成负面影响。 本地内存:后台服务会申请一些本地内存,以便暂存一些不需要全局存储的数据,一般分为以下几类: temp_buffers:设置每个会话用于访问临时表的本地缓冲区的最大块数量。 work_mem:内部排序聚合操作和hash表在使用临时磁盘文件时使用的内存缓冲区。注意:每个排序操作都会消耗一个work_mem内存,并不是一个SQL消耗一个。 maintenance_work_mem:维护操作使用的最大内存数。
  • 解决方法 连接/活跃连接数 若连接数或空闲连接数过多,可执行如下SQL释放当前数据库的所有空闲连接,使用连接池或配置客户端连接超时参数及时释放空闲的连接。若活跃连接数过多,可减少业务并发量,或扩大内存规格。 select pg_terminate_backend(pid) from pg_stat_activity where state = 'idle'; 慢SQL被大量执行 定位到导致内存消耗增加的SQL,对SQL进行优化,或扩大内存规格。 TPS事务数过高 降低事务数,或扩大内存规格。 长连接数量多/连接存活时长久 避免长连接,长连接的缓存可能较大,导致内存不足,建议定期释放长连接。
  • 常见问题 Q:使用pg_dump时导出数据时,为什么内存使用率会升高,如何避免出现该问题? A:使用pg_dump导出数据时,有一个进程会访问目标库中所有的表、索引等对象来获取结构数据,如果访问的表、索引等对象过大,可能会导致 relcache(关系表缓存)、catcache(系统目录表缓存)过大,且无法释放,从而导致存使用率升高,严重时会发生OOM。 建议执行pg_dump任务时: 不要执行DDL操作。 监控好慢SQL的指标,出现锁冲突时直接kill掉对应冲突的进程。 低峰期执行pg_dump任务。 将shared_buffers、work_mem参数继续降低到当前的1/2或1/4甚至更多,任务结束后回退修改的参数。 扩大内存规格。
  • RDS自定义策略样例 示例1:授权用户创建RDS实例 { "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["rds:instance:create"] }] } 示例2:拒绝用户删除RDS实例 拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先。 如果您给用户授予RDS FullAccess的系统策略,但不希望用户拥有RDS FullAccess中定义的删除RDS实例,您可以创建一条拒绝删除云服务的自定义策略,然后同时将RDS FullAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以对RDS实例执行除了删除RDS实例外的所有操作。拒绝策略示例如下: { "Version": "1.1", "Statement": [{ "Action": ["rds:instance:delete"], "Effect": "Deny" }] }
  • 示例流程 图1 给用户授权RDS权限流程 创建用户组并授权 在 IAM 控制台创建用户组,并授予关系型数据库只读权限“RDS ReadOnlyAccess”。 如果需要使用到对接其他服务的一些功能时,除了需要配置“RDS ReadOnlyAccess”权限外,还需要配置对应服务的权限。 例如:使用控制台连接实例时,除了需要配置“RDS ReadOnlyAccess”权限外,您还需要配置数据管理服务“DAS FullAccess”权限后,才可正常使用控制台登录数据库实例。 创建用户并加入用户组 在IAM控制台创建用户,并将其加入1中创建的用户组。 用户登录并验证权限 新创建的用户登录控制台,切换至授权区域,验证权限: 在“服务列表”中选择云数据库 RDS,进入RDS主界面,单击右上角“购买关系型数据库”,尝试购买关系型数据库,如果无法购买关系型数据库(假设当前权限仅包含RDS ReadOnlyAccess),表示“RDS ReadOnlyAccess”已生效。 在“服务列表”中选择除云数据库 RDS外(假设当前策略仅包含RDS ReadOnlyAccess)的任一服务,若提示权限不足,表示“RDS ReadOnlyAccess”已生效。
  • 事件监控支持的事件说明 表1 资源异常事件 事件来源 事件名称 事件ID 事件级别 事件说明 处理建议 事件影响 RDS 创建实例业务失败 createInstanceFailed 重要 创建实例失败产生的事件,一般是磁盘个数,配额大小不足,底层资源耗尽导致。 检查磁盘个数、配额大小,释放资源后重新创建。 无法创建数据库实例。 实例全量备份失败 fullBackupFailed 重要 单次全量备份失败产生的事件,不影响以前成功备份的文件,但会对“恢复到指定时间点”的功能有一些影响,导致“恢复到指定时间点”时增量备份的恢复时间延长。 重新执行一次手工备份。 备份失败。 主备切换异常 activeStandBySwitchFailed 重要 主备切换异常是由于网络、物理机有某种故障导致备机没有接管主机的业务,短时间内会恢复到原主机继续提供服务。 检查应用和数据库之间的连接是否重新建立了连接。 无 复制状态异常 abnormalReplicationStatus 重要 出现”复制状态异常“事件通常有两种情况: 1、主备之间复制时延太大(一般在写入大量数据或执行大事务的时候出现),在业务高峰期容易出现阻塞。 2、主备间的网络中断,导致主备复制异常。 提交工单。 但不会导致原来单实例的读写中断,客户的应用是无感知的。 复制状态异常已恢复 replicationStatusRecovered 重要 即复制时延已回到正常范围内,或者主备之间的网络通信恢复。 不需要处理。 无 实例运行状态异常 faultyDBInstance 重要 由于灾难或者物理机故障导致单机或者主实例故障时会上报本事件,属于关键告警事件。 检查是否有设置自动备份策略,并且提交工单。 可能导致数据库服务不可用。 实例运行状态异常已恢复 DBInstanceRecovered 重要 RDS单机实例灾难或物理机故障恢复,主备实例自动进行主备故障切换完成后会上报本事件。 不需要处理。 无 单实例转主备实例失败 singleToHaFailed 重要 创建备机时或备机创建完成后主备机之间配置同步发生故障时会产生此事件,一般是由于备节点所在数据中心资源不足导致。 提交工单。 “单实例转主备实例失败”不会导致原来单实例的读写中断,客户的应用是无感知的。 数据库进程重新启动 DatabaseProcessRestarted 重要 一般是内存不足、负载过高导致数据库进程停止 通过 云监控 的数据,查看是否有内存飙升、cpu长期过高、磁盘满使用率不足等的情况,可以选择提升CPU内存规格或者优化业务逻辑 进程挂掉的时候,业务中断。RDS服务会自动拉起进程,尝试恢复业务。 实例磁盘满 instanceDiskFull 重要 一般是由于数据空间占用过大导致。 对实例进行扩容操作。 实例由于磁盘空间满将会变成只读实例,数据库不可进行写入操作。 实例磁盘满恢复 instanceDiskFullRecovered 重要 实例磁盘状态恢复正常。 不需要处理。 实例解除只读状态,恢复写操作。 kafka连接失败 kafkaConnectionFailed 重要 一般是由于网络波动或kafka服务端出现异常等原因导致。 检查网络状况和kafka服务端状态。 审计日志无法发送到kafka服务端。 表2 操作类事件 事件来源 事件名称 事件ID 事件级别 事件说明 RDS 重置数据库管理员密码 resetPassword 重要 重置数据库管理员密码 集群扩容等操作 instanceAction 重要 磁盘扩容、规格变更 删除集群下的实例 deleteInstance 次要 删除集群下的实例 修改备份策略 setBackupPolicy 次要 修改备份策略 修改参数组 updateParameterGroup 次要 修改参数组 删除参数组 deleteParameterGroup 次要 删除参数组 重置参数组 resetParameterGroup 次要 重置参数组 修改数据库端口号 changeInstancePort 重要 修改数据库端口号 父主题: 事件监控
  • 事件监控简介 事件监控提供了事件类型数据上报、查询和告警的功能。方便您将业务中的各类重要事件或对云资源的操作事件收集到 云监控服务 ,并在事件发生时进行告警。 事件即云监控服务保存并监控的RDS资源的关键操作,您可以通过“事件”了解到谁在什么时间对系统哪些资源做了什么操作,如重置数据库管理员密码、修改备份策略等。 事件监控默认开通,您可以在事件监控中查看系统事件和自定义事件的监控详情,目前支持的系统事件请参见事件监控支持的事件说明。 事件监控为您提供上报自定义事件的接口,方便您将业务产生的异常事件或重要变更事件采集上报到云监控服务。 上报自定义事件请参见上报事件。 父主题: 事件监控
  • 支持审计的关键操作列表 通过 云审计 服务,您可以记录与华为云云数据库RDS实例相关的操作事件,便于日后的查询、审计和回溯。 表1 云审计服务支持的RDS操作列表 操作名称 资源类型 事件名称 创建实例、创建只读、恢复到新实例 instance createInstance 扩容、规格变更 instance instanceAction 实例重启 instance instanceRestart 恢复到原有实例 instance instanceRestore 实例重命名 instance instanceRename 重置密码 instance resetPassword 设置数据库版本配置参数 instance setDBParameters 重置实例的数据库版本配置参数 instance resetDBParameters 设置备份策略-打开,关闭,修改 instance setBackupPolicy 修改数据库端口号 instance changeInstancePort 绑定解绑EIP instance setOrResetPublicIP 修改安全组 instance modifySecurityGroup 创建标签 instance setInstanceTag 删除标签 instance setInstanceTag 修改标签 instance setInstanceTag 删除实例 instance deleteInstance 主备倒换 instance instanceFailOver 修改主备同步模式 instance instanceFailOverMode 修改主备倒换策略 instance instanceFailOverStrategy 单机转主备实例 instance modifySingleToHaInstance 创建快照 backup createManualSnapshot 复制快照 backup copySnapshot 下载备份(通过OBS下载) backup downLoadSnapshot 下载备份(通过浏览器下载) backup backupsDownLoad 删除快照 backup deleteManualSnapshot 合并下载binlog backup packBackupsDownLoad 创建参数模板 parameterGroup createParameterGroup 修改参数模板 parameterGroup updateParameterGroup 删除参数模板 parameterGroup deleteParameterGroup 复制参数模板 parameterGroup copyParameterGroup 重置参数模板 parameterGroup resetParameterGroup 应用参数模板 parameterGroup applyParameterGroup 保存参数模板 parameterGroup saveParameterGroup 冻结删除 all rdsUnsubscribeInstance 实例冻结 all rdsfreezeInstance 按需转包周期、续费 all bssUpdateMetadata 父主题: CTS 审计
  • 前提条件 云数据库RDS正常运行。 故障、删除状态的云数据库RDS,无法在云监控中查看其监控指标。当云数据库RDS再次启动或恢复后,即可正常查看。 故障24小时及以上的云数据库RDS,云监控将默认该云数据库RDS不存在,并在监控列表中删除,不再对其进行监控,但告警规则需要用户手动清理。 云数据库RDS已正常运行一段时间(约10分钟)。 对于新创建的云数据库RDS,需要等待一段时间,才能查看上报的监控数据和监控视图。
  • 实例监控指标 RDS for PostgreSQ L实例 性能监控指标,如表 RDS for PostgreSQL实例支持的监控指标所示。 表1 RDS for PostgreSQL实例支持的监控指标 指标ID 指标名称 指标含义 取值范围 测量对象 监控周期(原始指标) rds001_cpu_util CPU使用率 该指标用于统计测量对象的CPU使用率,以比率为单位。 0-100% RDS for PostgreSQL实例 1分钟 rds002_mem_util 内存使用率 该指标用于统计测量对象的内存使用率,以比率为单位。 0-100% RDS for PostgreSQL实例 1分钟 rds003_iops IOPS 该指标用于统计当前实例,单位时间内系统处理的I/O请求数量(平均值)。 ≥ 0 counts/s RDS for PostgreSQL实例 1分钟 read_count_per_second 读IOPS 该指标用于统计当前实例,单位时间内系统处理的读I/O请求数量(平均值)。 ≥ 0 counts/s RDS for PostgreSQL实例 1分钟 write_count_per_second 写IOPS 该指标用于统计当前实例,单位时间内系统处理的写I/O请求数量(平均值)。 ≥ 0 counts/s RDS for PostgreSQL实例 1分钟 rds004_bytes_in 网络输入吞吐量 该指标用于统计平均每秒从测量对象的所有网络适配器输入的流量,以字节/秒为单位。 ≥ 0 bytes/s RDS for PostgreSQL实例 1分钟 rds005_bytes_out 网络输出吞吐量 该指标用于统计平均每秒从测量对象的所有网络适配器输出的流量,以字节/秒为单位。 ≥ 0 bytes/s RDS for PostgreSQL实例 1分钟 rds039_disk_util 磁盘利用率 该指标用于统计测量对象的磁盘利用率,以比率为单位。 0-100% RDS for PostgreSQL实例 1分钟 rds040_transaction_logs_usage 事务日志使用量 事务日志所占用的磁盘容量。 ≥ 0 MB RDS for PostgreSQL实例 1分钟 rds041_replication_slot_usage 复制插槽使用量 复制插槽文件所占磁盘容量。 ≥ 0 MB RDS for PostgreSQL实例 1分钟 rds042_database_connections 数据库连接数 当前连接到数据库的后端量。 ≥ 0 counts RDS for PostgreSQL实例 1分钟 rds043_maximum_used_transaction_ids 事务最大已使用ID数 事务最大已使用ID。 ≥ 0 counts RDS for PostgreSQL实例 1分钟 rds044_transaction_logs_generations 事务日志生成速率 平均每秒生成的事务日志大小。 ≥ 0 MB/s RDS for PostgreSQL实例 1分钟 rds045_oldest_replication_slot_lag 最滞后副本滞后量 多个副本中最滞后副本(依据接收到的WAL数据)滞后量。 ≥ 0 MB RDS for PostgreSQL实例 1分钟 rds046_replication_lag 复制时延 副本滞后时延。 ≥ 0 ms RDS for PostgreSQL实例 1分钟 rds047_disk_total_size 磁盘总大小 该指标用于统计测量对象的磁盘总大小。 40GB~4000GB 部分用户支持40GB~15000GB,如果您想创建存储空间最大为15000GB的数据库实例,或提高扩容上限到15000GB,请联系客服开通。 RDS for PostgreSQL实例 1分钟 rds048_disk_used_size 磁盘使用量 该指标用于统计测量对象的磁盘使用大小。 0GB~4000GB 部分用户支持0GB~15000GB,如果您想创建存储空间最大为15000GB的数据库实例,或提高扩容上限到15000GB,请联系客服开通。 RDS for PostgreSQL实例 1分钟 rds049_disk_read_throughput 硬盘读吞吐量 该指标用于统计每秒从硬盘读取的字节数。 ≥ 0 bytes/s RDS for PostgreSQL实例 1分钟 rds050_disk_write_throughput 硬盘写吞吐量 该指标用于统计每秒写入硬盘的字节数。 ≥ 0 bytes/s RDS for PostgreSQL实例 1分钟 rds082_tps TPS 该指标用于统计每秒事务执行次数,含提交的和回退的。 ≥ 0 次/秒 RDS for PostgreSQL实例 1分钟 rds083_conn_usage 连接数使用率 该指标用于统计当前已用的PgSQL连接数占总连接数的百分比。 0-100% RDS for PostgreSQL实例 1分钟 row_per_second 操作行数 实例每秒增删改查操作的行数。 ≥ 0 RDS for PostgreSQL实例 1分钟 active_connections 活跃连接数 该指标为统计数据库当前活跃连接数。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 idle_transaction_connections 事务空闲连接数 该指标为统计数据库当前空闲连接数。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 oldest_transaction_duration 最长事务存活时长 该指标为统计当前数据库中存在的最长事务存活时长。 ≥ 0 ms RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 oldest_transaction_duration_2pc 最长未决事务存活时长 该指标为统计当前数据库存在的最长未决事务存活时长。 ≥ 0 ms RDS for PostgreSQL实例 1分钟 disk_io_usage 磁盘IO使用率 该指标为统计磁盘IO使用率。磁盘IO使用率是指磁盘正在处理IO请求的时间与总时间的百分比。 说明: 当磁盘IO使用率达到100%,只能说明在统计时间段内,磁盘一直有数据写入,磁盘性能还需要结合IOPS、磁盘的吞吐量、读写时延等多个指标共同决定。 0-100% RDS for PostgreSQL实例 1分钟 lock_waiting_sessions 等待锁的会话数 该指标为统计当前处于阻塞状态的会话个数。 ≥ 0 RDS for PostgreSQL实例 1分钟 swap_in_rate swap in速率 该指标为统计每秒从交换区写到内存的大小。 ≥ 0 KB/s RDS for PostgreSQL实例 1分钟 swap_out_rate swap out速率 该指标为统计每秒写入交换区的内存的大小。 ≥ 0 KB/s RDS for PostgreSQL实例 1分钟 swap_total_size 交换区总容量大小 该指标为统计交换区总量。 ≥ 0 MB RDS for PostgreSQL实例 1分钟 swap_usage 交换区容量使用率 该指标为统计交换区使用率。 0-100% RDS for PostgreSQL实例 1分钟 db_max_age 最大数据库年龄 该指标为统计当前数据库的最大数据库年龄(获取表pg_database中max(age(datfrozenxid))值)。 ≥ 0 RDS for PostgreSQL实例 1分钟 cpu_user_usage 用户态CPU时间占比 该指标为统计用户态CPU时间占比。 0-100% RDS for PostgreSQL实例 1分钟 cpu_sys_usage 内核态CPU时间占比 该指标为统计内核态CPU时间占比。 0-100% RDS for PostgreSQL实例 1分钟 cpu_wait_usage 硬盘IO等待时间占比 该指标为统计硬盘IO等待时间占比。 0-100% RDS for PostgreSQL实例 1分钟 io_read_delay IO读响应延迟 该指标为统计磁盘读响应平均延迟(以毫秒为单位)。 ≥ 0 ms RDS for PostgreSQL实例 1分钟 io_write_delay IO写响应延迟 该指标为统计磁盘写响应平均延迟(以毫秒为单位)。 ≥ 0 ms RDS for PostgreSQL实例 1分钟 slow_sql_one_second 已执行1s的SQL数 该指标为统计数据库执行时长1秒以上的慢SQL个数。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 slow_sql_three_second 已执行3s的SQL数 该指标为统计数据库执行时长3秒以上的慢SQL个数。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 slow_sql_five_second 已执行5s的SQL数 该指标为统计数据库执行时长5秒以上的慢SQL个数。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 slow_sql_log_min_duration_statement 已执行log_min_duration_statement时长的SQL数 该指标为统计数据库执行时长比参数log_min_duration_statement大的慢SQL个数,该参数大小可根据业务需要进行更改。 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL10及以上版本。 1分钟 pg_dr_repl_stat 灾备节点复制状态 灾备状态状况。各数字含义如下: 异常:0 startup:1 catchup:2 streaming:3 backup:4 stopping:5 ≥ 0 RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL12版本的灾备实例。 1分钟 pg_dr_wal_delay 主机与灾备机间lsn延迟 该指标为统计数据库主机当前lsn和灾备机replay lsn的延迟。 ≥ 0 bytes/s RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL12版本的灾备实例。 1分钟 round_trip_time 主机与灾备机间网络延迟 该指标为统计数据库主机与灾备机间往返时延。 ≥ 0 ms RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL12版本的灾备实例。 1分钟 packet_loss_rate 主机与灾备机间丢包率 该指标为统计数据库主机与灾备机间丢包率。 0-100% RDS for PostgreSQL实例 说明: 仅支持RDS for PostgreSQL12版本的灾备实例。 1分钟 inactive_logical_replication_slot 非活跃逻辑复制槽数量 该指标用于统计当前数据库中存在的非活跃逻辑复制槽数量。 ≥ 0 RDS for PostgreSQL实例 1分钟 pgaudit_log_size 审计日志大小 该指标为获取当前审计日志的大小。 ≥ 0 GB RDS for PostgreSQL实例 5分钟 slave_replication_status 备机流复制状态 该指标为获取备机流复制状态,0:备机异常,1:备机正常,2:该实例为主机。 此处备机也包括只读实例。 Count RDS for PostgreSQL实例 1分钟 synchronous_replication_blocking_time 同步复制阻塞时间 该指标为获取同步复制主备机间复制阻塞的时长。 ≥ 0 s RDS for PostgreSQL实例 1分钟 temporary_files_generation_num 每分钟临时文件生成数量 该指标为获取临时文件在1分钟内生成的数量。 ≥ 0 Count/min RDS for PostgreSQL实例 1分钟 temporary_files_generation_size 每分钟临时文件生成大小 该指标为获取临时文件在1分钟内生成的大小。 ≥ 0 Byte/min RDS for PostgreSQL实例 1分钟 sent_lsn_replication_latency_size 主备间wal日志发送延迟 该指标为获取主机待发送wal日志延迟大小 ≥ 0 byte RDS for PostgreSQL只读实例 1分钟 write_lsn_replication_latency_size 主备间wal日志写入延迟 该指标为获取备机写入到磁盘的wal日志的延迟大小。 ≥ 0 byte RDS for PostgreSQL只读实例 1分钟 flush_lsn_replication_latency_size 主备间wal日志落盘延迟 该指标为获取备机刷入到磁盘的wal日志的延迟大小。 ≥ 0 byte RDS for PostgreSQL只读实例 1分钟 replay_lsn_replication_latency_size 主备间wal日志回放延迟 该指标为获取备机回放wal日志的延迟大小。 ≥ 0 byte RDS for PostgreSQL只读实例 1分钟 data_disk_inode_used inode数 数据盘已使用的inode数。 ≥ 0 Counts RDS for PostgreSQL实例 5分钟 user_current_connections 用户使用连接数 该指标为统计用户实际使用的连接数(不包括监控运维使用的内置连接)。 ≥ 0 Counts RDS for PostgreSQL实例 1分钟 user_active_connections 用户活跃连接数 该指标为统计用户实际使用的活跃连接数(不包括监控运维使用的内置活跃连接)。 ≥ 0 Counts RDS for PostgreSQL实例 1分钟 wal_size WAL日志占用空间大小 该指标为获取当前WAL日志所占空间大小。 ≥ 0 GB RDS for PostgreSQL实例 5分钟 dbuser_passwd_deadline 数据库用户最快过期时间 查询数据库用户密码过期时间,返回过期时间减去当前时间的最小值。 说明: 如果没有设置用户密码过期时间,这个指标采集不到。 ≥ 0 s RDS for PostgreSQL实例 5分钟 sys_memory_hit_rate 内存命中率 内存命中率 ≥ 0 % RDS for PostgreSQL实例 1分钟
  • 操作系统更新 云数据库 RDS for PostgreSQL实例需要适时进行操作系统更新,以提高数据库性能和数据库的整体安全状况。 实例内核版本升级时,云数据库 RDS for PostgreSQL会根据操作系统的实际情况,决定是否更新以及更新适合的操作系统冷补丁版本。 操作系统更新不会更改数据库实例的版本或数据库实例信息。 此外,云数据库 RDS for PostgreSQL会在用户设置的运维时间段内,通过热补丁方式及时修复影响重大的操作系统漏洞。 父主题: 变更实例
  • 操作场景 云数据库RDS支持切换主备实例的数据同步方式,以满足不同业务需求。可选择“异步”或者“同步”两种方式。 异步(默认选择):应用向主库写入数据时,数据写入主库,不需要等待备库收到日志,主库就向应用返回响应。 优点:主库因为底层故障等原因故障时,可以立即进行主备切换,不阻塞写入操作,具有很高的可用性;同时,异步复制的开销很少,具有较高的性能。 缺点:某些极限场景下,主备有复制延迟,倒换后可能发生数据丢失。 同步:应用向主库写入数据时,需要等待备库收到日志(日志持久化到磁盘),主库才向应用返回响应。 优点:主备数据强一致,倒换后不会丢失数据。 缺点:备库或者主库发生故障(底层或其他原因),在故障恢复前,会阻塞写入操作,可用性较低;同时,同步复制的开销较大,性能较异步模式低。 对数据库在线时间要求较高的业务,建议选择“异步”模式。 对数据一致性要求极高且能容忍写入操作被阻塞的业务,建议选择“同步”模式。 写入操作指非SELECT操作,如DDL和DML等。
共100000条