开发者学堂课程【数据仓库 ACP 认证课程:[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上) 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/928/detail/14626
[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上)
(4)UDF和存储过程:捕获异常
PL/pgSQL通过 EXCEPTION从句捕获异常。
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
Statements
EXCEPTION
WHEN condition [ OR condition ...] THEN
handler_statements
WHEN condition [ OR condition ... ] THEN
handler_statements
...]
END;
注意事项
condition表示异常类别。参考errcodes。
特殊的异常类别OTHERS,可以匹配所有类别的异常。块中包含EXCEPTION从句,则能够行成一个子事务,并且能够在不影响外部事务的前提下回滚。
(5)UDF和存储过程∶捕获异常-示例
CREATE OR REPLACE FUNCTION f_block_exception()
RETURNS integer
LANGUAGE plpgsql
As $function$
DECLARE
x integer := 0;
y integer := 0;
BEGIN
SELECT COUNT(*) INTO x FROM mytab WHERE lastname = "zhang";
INSERT INTo mytab(firstname, lastname) VALUES('san'," zhang);
DECLARE
msg text
BEGIN
UPDATE mytab SET firstname = "three WHERE lastname = "zhang";
x:= x+1;
y := x /0; -- Exception occurs
EXCEPTION WHEN OTHERS THEN
GET STACKED DIAGNOSTcs msg := MESSAGE_TEXT;
RAISE NOTICE "Caught exception: %" , msg;
RETURN x;
END;
END;
$function$;
(6)UDF和存储过程:UDF示例
--创建表student,插入3条记录
create table student(name varchar(30), score float4);
insert into student values("张三",88),('李四",99),('王五",92);
--创建函数将student记录转换成json格式
create or replace function f_student_to_json(student)
returns json
language plpgsql
strict
as $function$
declare
stu alias for $1;
begin
return row_to_json(stu);
end;
$function$;
--创建操作符>!<使用f_student_to_json函数
create operator >!< (procedure = f_student_to_json,leftarg = student);
--使用操作符>!<遍历student表
select s >!< from student s;
4.备份恢复
物理备份技术
(1)备份恢复:技术原理介绍
基础备份+日志归档+一致性恢复点→集群恢复
ADBPG集群物理基础备份,不会阻塞用户业务执行,因此,集群的基础备份期间,依然会产生大量WAL日志。集群恢复需要WAL持续归档。
一致性恢复点,通过在数据库的访问入口处( QD节点)独占获取事务提交锁,阻塞其他事务的提交,从而保证恢复点创建时刻的集群事务一致性。
通过一致性恢复点,恢复时,将集群各个节点对齐到事务一致的数据库状态。
保证恢复一致性
(2)备份恢复:基础备份
定期做
基础备份,又称全量备份,是对整个集群的所有primary 节点(包括master,但不包括secondary master )进行全量数据备份。
公有云默认备份到OSS。
备份不阻塞业务,备份期间产生的增量WAL日志由归档操作保证备份到OSS。
备份期间,会自动重新备份异常的节点,如主备切换、连接异常等情况。
备份完成后,创建一致性恢复点,最为恢复时的恢复目标,以保证恢复集群一致性。
一些不变动数据,不进行备份,减少备份数据量,提升备份性能
(3)备份恢复:日志备份
日志备份,又称增量备份。通过归档命令,对集群的所有primary节点上的WAL日志段进行备份。
公有云默认备份到OSS
(4)备份恢复:创建一致性恢复点
请求创建一致性恢复点
独占申请两阶段提交锁,阻塞其他分布式事务提交。
Master节点创建恢复点。
Segment节点创建恢复点。
释放两阶段提交锁。
等待恢复点WAL日志归档。
通过分布式提交锁,确保恢复点创建时刻的集群事务一致性。一致性恢复点在集群的每个primary节点新增一条WAL日志记录。
只有完成WAL日志归档的一致性恢复点,才能够用于分布式集群的归档恢复。
(5)备份恢复:恢复新实例
并行从OSS下载基本备份。
更新集群拓扑结构,并重启集群。
设置一致性恢复点作为恢复目标。
添加高可用备机,完成恢复。
持续下载并恢复归档的WAL日志。
5.资源隔离使用
(1)资源隔离:资源管理简介
ADB PG实例的资源的定义:
CPU
内存
IO
并发连接
查询计划
资源管理方案:
资源队列( Resource Queue )
资源组( Resource Group )
并行度的设置以及 CPU 优先级的设置
并发连接数被占满,无法接受连接
内存超过可用内存范围,进程被杀死;
IO带宽争用导致查询和写入性能下降
(2)资源隔离:资源队列技术介绍
资源队列能够对数据库的CPU、内存等资源进行限制,对多租户资源限制、保障数据库稳定运行具有一定的作用;
支持进行四种类型的资源限制∶并发限制、CPU限制、内存限制和查询计划限制。
配置名 |
配置说明 |
MEMORY_LIMIT |
队列中所有查询所使用的的内存的量。例如,对ETL查询设置2GB的MEMORY_LIMIT,这样每个Segment里的ETL查询最多使用2GB的内存。 |
ACTIVE_STATEMENTS |
队列中槽位的数量;一个队列中最大可并行数,当所有槽位都占用时,新的查询必须等待。默认每个查询使用等量的内存。 |
PRIORITY |
查询使用的相对CPU使用量,可以设置为以下级别:LOW、MEDIUM、HIGH和MAX。默认级别是MEDIUM,查询优先权的机制会监控系统中所有正在运行的查询的CPU使用量,并根据其优先权别来调整其CPU使用量。例如,你可以为执行资源队列设置MAX优先权,为其他查询设置MEDIUM优先权,确保执行查询可以获得比较多的CPU资源。 |
MAX_COST.MIN_COST |
查询计划消耗限制。数据库优化器会为每个查询计算消耗,如果该消耗超过了资源队列所设定的的MAX_COST的值,该查询就会被拒绝。 |
(3)资源隔离:创建资源队列
CREATE RESOURCE QUEUE name WITH (queue_attribute=value [...]) where queue attribute is:
ACTIVE_STATEMENTS=integer
[ MAX_COST=float[CoST_OVERCOMMIT={TRUE|FALSE)] ]
[ MIN_COST=float ]
[ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
[ MEMORY_LIMIT='memory_units' ]
=#CREATE RESOURCE QUEUE adhoc wITH (ACTIVE_STATEMENTS=3 ) ;
创建带有并发限制的队列
=#CREATE RESOURCE QUEUE myqueue wITH(ACTIVB_STATEMENTS=20,
MEMORY_LIMIT="2000MB " );
创建带有内存限制的队列
=#CREATEZRESOURCE QUEUE executive wITH (ACTIVB_STATEMENTS=3,PRIORITY=MAX);
设置优先级
(4)资源隔离︰指派角色(用户)到资源队列
指派角色到优先级队列
一旦创建了一个资源队列,用户必须把角色(用户)指派到它们合适的资源队列。
如果没有显式地把角色指派给资源队列,它们将进入默认资源队列pg_default。默认资源队列的活动语句限制是20,没有代价限制,优先权设
=#ALTER ROLE name RESOURCE QUEUE queue_name ;
=#CREATE ROLE name wITH LOGIN RESOURc QUEUE queue_name ;
从资源队列移除角色
如果用户想要从一个资源队列移除一个角色并且把它们放在默认队列中,可以将该角色的队列指派改成none。例如∶
=#ALTER ROLE role_name RESOURCE QUEUE none;
修改资源队列配置
ALTER RESOURCE QUEUE命令更改资源队列的限制。要更改一个资源队列的限制,可以为该队列指定想要
=#ALTER RESOURCE QUEUE adhoc wITH(ACTIVE_STATEMENTS=5);
=#ALTER RESOURCE QUEUE exec wITH(PRIORITY=MAX);
删除资源队列
DROP RESOURCE QUEUE命令可以删除资源队列。要删除一个资源队列,该队列不能有指派给它的角色,也不能有任何语句在其中等待。
(5)资源隔离:状态监控
监控操作 |
说明 |
语句 |
查看队列中的语句和资源队列状态 |
gp_toolkit.gp_resqueue_status视图允许管理员查看一个负载管理资源队列的状态和活动 |
SELECT * FROM gp_toolkit.gp_resqueue_status; |
查看资源队列统计信息 |
如果想要持续跟踪资源队列的统计信息和性能,用户可以使用pg_stat_resqueues系统视图来查看在资源队列使用上收集的统计信息 |
SELECT * FROM pg_stat_resqueues; |
查看指派到资源队列的角色 |
要查看指派给资源队列的角色,执行下列在pg_roles和gp_toolkit.gp_resqueue_status系统目录表 |
SELECT rolname, rsqname FROM pg_roles.gp_toolkit.gp_resqueue_status WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid; |
查看资源队列的等待查询 |
用户可以看到所有资源队列的所有当前活跃的以及在等待的查询 |
SELECT*FROM gp_toolkit.gp_locks_on_resqueue WHERE lorwaiting='true' |
查看活动语句的优先权 |
查看当前正在被执行的语句并且提供优先权、会话ID和其他信息 |
SELECT * FROM gp_toolkit.gp_resq priority_statement; |
重置活动语句的优先权 |
gp_adjust_priority(session_id,statement_count.priority)调整当前正在被执行的语句的优先权。使用这个函数,超级用户可以提升或者降低任意查询的优先权. |
SELECT gp_adjust_priority(752,24905,"HIGH) |