Oracle数据库管理每周一例(12.2,18c,19c) 2020-06-28
第四期 容器数据库的性能管理
本周赶上端午节放假,差点忘了写这篇文档,赶在周日写出来。
1.PDB的IO管理
IO管理一直是数据库运维管理中比较头痛的问题,特别是多租户PDB环境下,各个PDB之间会对存储IO性能进行争用,在一些情况下会造成部分PDB的性能问题。在一些情况下,一些作为研发测试的PDB也不需要那么大的IO,那么作为DBA我们希望可以限制这些PDB的IO使用。
作为目前功能最完善的数据库产品,Oracle数据库从12.2开始引入了PDB的IO管理功能,在PDB中由max_iops和max_mbps参数进行控制,可以限制PDB的IOPS和IOMBPS,具体参数如下图所示:
这两个参数是可以动态调节的:
alter system set max_iops=xxx;
alter system set max_mbps=xxx;
这里还需要注意两点:
1.这两个在Exadata数据库一体机上是不生效的,一体机上是使用其他机制来管理IO
2.这两个参数在使用asmlib和AFD的时候并不能很好的实现功能,只能一定程度的实现IO控制,根据Oracle Support相关bug及文档反馈,该功能于19.6.0.0.200114 DBRU及20.1版本中修复(所以大家尽量升级到19.6吧,-)。
2.PDB的PGA和SGA管理
PDB中也有PGA和SGA的管理,通过pga_aggregate_limit,pga_aggregate_target和sga_target来控制:
同一般数据库一样,在PDB中pga_aggregate_limit限制PDB使用的最大SGA大小(类似于PGA使用的硬限制),pga_aggregate_target为PDB使用的PGA大小(类似于PGA使用的软限制);PDB使用PGA内存如果超过pga_aggregate_limit设置的限制,就会出现[ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT]的报错,并杀掉超过PGA使用限制的当前会话。
sga_target限制了PDB使用的SGA大小,如果CDB使用ASMM,那么该参数默认为0,PDB可以使用全部SGA。
PDB中PGA和SGA参数默认是读取CDB的参数设置,因此一般来说是需要根据实际情况进行调整,PGA参数是可以动态调整,SGA参数调整需要重启PDB:
alter system set pga_aggregate_limit=xxx;
alter system set pga_aggregate_target=xxx;
alter system set sga_target=xxx scope=spfile;
alter pluggable database close;
alter pluggable database open;
3.Resource Manager
从12.2开始Oracle引入了Resource Manager来对PDB进行资源管理,可以限制PDB的shares(CPU和并行执行服务器资源的资源分配共享值),utilization_limit(PDB使用CPU最大百分比)和parallel_server_limit(PDB可以使用的并行执行服务器的最大百分比)。PDB资源管理分为两种:第一种是指定PDB进行资源管理;第二种是通过性能概要进行的PDB资源管理。
4.指定PDB的资源管理
通过srvctl status service命令可以查看SERVICE状态:
1.创建CDB resource plan:
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'newcdb_plan',
comment => 'CDB resource plan for newcdb');
END;
/
2.创建指定PDB的资源管理
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
pluggable_database => 'pdb1',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
pluggable_database => 'pdb2',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
pluggable_database => 'pdb3',
shares => 1,
utilization_limit => 70,
parallel_server_limit => 70);
END;
/
3.修改默认资源管理
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_DEFAULT_DIRECTIVE(
plan => 'newcdb_plan',
new_shares => 1,
new_utilization_limit => 50,
new_parallel_server_limit => 50);
END;
/
4.验证并释放pending area
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
5.启用、停用资源管理
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'newcdb_plan';
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = ' ';
6.修改指定PDB资源管理
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
pluggable_database => 'pdb1',
new_shares => 1,
new_utilization_limit => 10,
new_parallel_server_limit => 20);
END;
/
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
7.删除指定PDB资源管理
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.DELETE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
pluggable_database => 'pdb2');
END;
/
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
8.删除资源管理
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.DELETE_CDB_PLAN('newcdb_plan');
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
5.通过性能概要进行的PDB资源管理
1.创建CDB resource plan:
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'newcdb_plan',
comment => 'CDB resource plan for newcdb');
END;
/
2.创建性能概要(db_performance_profile)
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'gold',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'silver',
shares => 2,
utilization_limit => 40,
parallel_server_limit => 40);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'bronze',
shares => 1,
utilization_limit => 20,
parallel_server_limit => 20);
END;
/
3.修改默认资源管理
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_DEFAULT_DIRECTIVE(
plan => 'newcdb_plan',
new_shares => 1,
new_utilization_limit => 10,
new_parallel_server_limit => 10);
END;
/
4.验证并释放pending area
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
5.修改PDB中db_performance_profile参数
alter session set container=pdb1;
alter system set db_performance_profile=gold scope=spfile;
alter pluggable database close;
alter pluggable database open;
alter session set container=pdb2;
alter system set db_performance_profile=sliver scope=spfile;
alter pluggable database close;
alter pluggable database open;
alter session set container=pdb3;
alter system set db_performance_profile=bronze scope=spfile;
alter pluggable database close;
alter pluggable database open;
6.启用、停用资源管理
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'newcdb_plan';
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = ' ';
6.修改性能概要
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'bronze',
new_shares => 1,
new_utilization_limit => 10,
new_parallel_server_limit => 20);
END;
/
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
8.删除性能概要
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
BEGIN
DBMS_RESOURCE_MANAGER.DELETE_CDB_PLAN_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'brozen');
END;
/
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
9.删除资源管理
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.DELETE_CDB_PLAN('newcdb_plan');
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
目前我管理的生产环境使用的是第二种PDB资源管理方式。
下期预告:
在PDB中限制一些命令执行。