19c ADG环境中主库PDB调整参数自动同步到备库

2025年2月19日 作者 XiaofeiHuangfu

• 概念描述
• 测试验证
• 知识总结
• 参考文档

概念描述

19c 主库PDB中设置PDB级参数会自动同步到备库中。pdb级的参数存在pdb_spfile$中,通过redo同步会将pdb_spfile$中的信息同步到备库。
本文以SGA_TARGET为例进行验证。
Oracle中SGA_TARGET 指定所有SGA 组件的总大小,19c中可以在CDB和PDB级设置该参数。

测试验证

1、检查SGA_TARGET参数
在根容器cdb$root中检查

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

当前是在根容器中。
检查cdb环境中sga_target参数

SQL>select p.name,s.NAME,s.ISSES_MODIFIABLE,s.ISSYS_MODIFIABLE,s.ISPDB_MODIFIABLE,s.CON_ID from 
v$system_parameter s,v$pdbs p
where s.name='sga_target'
and s.con_id=p.con_id;
NAME                 NAME                 ISSES ISSYS_MOD ISPDB     CON_ID
-------------------- -------------------- ----- --------- ----- ----------
PDB$SEED             sga_target           FALSE IMMEDIATE TRUE           2
HRPDB                sga_target           FALSE IMMEDIATE TRUE           3
SQL> show parameter sga_target
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------
sga_target                 big integer 2352M

该环境cdb中sga_target总大小为2352m,sga_target参数支持在PDB中设置。
2、在主库pdb中设置sga_target
切换到hrpdb中

SQL> alter session set container=hrpdb;
Session altered.
修改前pdb中sga_target是默认值为0
SQL> show parameter sga_target
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 0
SQL>
SQL>  alter system set sga_target=1G;
System altered.
SQL>

3、主库中查询sga_target

SQL> set linesize 120
column pdb_name format a10
column name format a30
column value$ format a30
select ps.db_uniq_name,
       ps.pdb_uid,
       p.name as pdb_name,
       ps.name,
       ps.value$
from   pdb_spfile$ ps
       join v$pdbs p on ps.pdb_uid = p.con_uid
order by 1, 2, 3;
DB_UNIQ_NAME              PDB_UID PDB_NAME   NAME                VALUE$
------------------------------ ---------- ---------- ------------------------------ ------------------------------
*                                     3293159541 HRPDB     sga_target                           1073741824
SQL> show parameter sga_target
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_target                 big integer 1G
SQL>

在主库PDB中sga_target已经是1G。
4、备库中查询sga_target

SQL> set linesize 120
column pdb_name format a10
column name format a30
column value$ format a30
select ps.db_uniq_name,
       ps.pdb_uid,
       p.name as pdb_name,
       ps.name,
       ps.value$
from   pdb_spfile$ ps
       join v$pdbs p on ps.pdb_uid = p.con_uid
order by 1, 2, 3;
DB_UNIQ_NAME              PDB_UID PDB_NAME   NAME                VALUE$
------------------------------ ---------- ---------- ------------------------------ ------------------------------
*                                     3293159541 HRPDB     sga_target                           1073741824
SQL> show parameter sga_target
 

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_target                 big integer 1G
SQL>

在备库PDB中sga_target已经是1G,主库pdb级调整的sga_target已成功同步到备库。
另外,在生产环境中,有些主备环境的配置不一样,比如备库的CPU和内存等资源比主库低,这样的场景能否使用主库pdb修改sga_target同步到备库呢?
答案是可以。
1、可以通过隐藏参数让主库PDB级修改的sga_target参数同步到备库不应用到PDB中
SQL> alter system set “_parameter_spfile_sync”=false;
2、主库调整的sga_target超过了备库的内存大小,备库pdb会自动使用sga_max_size的值
主库PDB中

SQL> alter system set sga_target=2g;
备库PDB中
SQL> show parameter sga
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga         boolean     FALSE
lock_sga                         boolean     FALSE
pre_page_sga                     boolean     TRUE
sga_max_size                     big integer 1G
sga_min_size                     big integer 0
sga_target                         big integer 1G
unified_audit_sga_queue_size     integer     1048576
SQL>    

12c以后PDB的参数存在哪里?

SQL> select owner,table_name,tablespace_name,con_id from cdb_tables where table_name='PDB_SPFILE$';
OWNER                TABLE_NAME      TABLESPACE_NAME                    CON_ID
-------------------- --------------- ------------------------------ ----------
SYS                  PDB_SPFILE$     SYSTEM                                  1
SYS                  PDB_SPFILE$     SYSTEM                                  3

知识总结

12c以后PDB的参数存在哪里?
image.png
在Oracle 12c开启,引入了容器的概念将Oracle提供的对象和用户数据(包括元数据)分离到不同的容器中,可将其视为水平分区。存放数据字典的每个容器中有一个SYSTEM表空间。存储放PDB参数的有一个数据字典,
12c以后PDB参数保存在了PDB_SPFILE$ 中,每个PDB或容器中都有PDB_SPFILE$ 字典。