实验环境
| 数据库角色 | 操作系统 | 数据库版本 | 主机名 | 数据库唯一名 | |
|---|---|---|---|---|---|
| 主库 | Oracle linux 7.8 | oracle 19.3 | node2 | rac单节点 | ora19cdg |
| 备库 | Oracle linux 7.8 | oracle 19.3 | node1 | rac单节点 | ora19c |
创建实验用例
查看主库 cdb db_create_file_dest 参数
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
查看备库 cdb db_create_file_dest 参数
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
创建pdb,并修改db_create_file_dest(pdb默认继承cdb的参数,除非在pdb级别进行修改)
SQL> create pluggable database zky admin user admin identified by admin;
Pluggable database created.
SQL> alter pluggable database zky open instances=all;
Pluggable database altered.
SQL> alter session set container=zky;
Session altered.
SQL> alter system set db_create_file_dest='+FRA' sid='*';
System altered.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
pdb中的参数
pdb没有init.ora file 或者是 spfile,只有cdb有,pdb 的参数存放在数据字典里面,在表pdb_spfile$里。
但是在pdb里面的pdb_spfile$是空的,只有当pdb拔出时才会将参数复制到pdb的pdb_spfile$里面。
当pdb被删除时pdb_spfile$,存放在cdb中的pdb_spfile$里关于pdb 的参数信息将会删除
SQL> show con_name
CON_NAME
------------------------------
TEST
SQL> select * from pdb_spfile$;
no rows selected
SQL> alter session set container=cdb$root;
Session altered.
SQL> select a.name,a.dbid,b.pdb_uid,b.name,b.value$ from v$pdbs a ,pdb_spfile$ b where a.dbid = b.pdb_uid and a.name = 'TEST';
NAME DBID PDB_UID NAME VALUE$
-------------------- ---------- ---------- -------------------- --------------------
TEST 3516706060 3516706060 db_securefile 'PREFERRED'
TEST 3516706060 3516706060 db_create_file_dest '+TEST'
当然并不是所有的参数都可以在pdb进行修改,要确定可以为 PDB 修改哪些参数,V$SYSTEM_PARAMETER 或 V$PARAMETER 视图中的 ISPDB_MODIFIABLE 列必须为 TRUE。
select name, value from v$parameter where ISPDB_MODIFIABLE = 'TRUE';
想看查看pdb的当前值
首先连接到pdb中
使用 show parameter
可以查询 V$SYSTEM_PARAMETER 或 V$PARAMETER
V$SPPARAMETER视图也可以用来显示PDB的SPFILE参数。
当pdb是mount状态时,在pdb中指定的参数不会生效,将继承cdb的参数
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
SQL> shutdown immediate
Pluggable Database closed.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
SQL> show con_name
CON_NAME
------------------------------
ZKY
SQL> alter session set container=cdb$root;
Session altered.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
SQL> show con_Name
CON_NAME
------------------------------
CDB$ROOT
RAC中修改pdb的参数
如果您想为RAC实例设置相同参数的不同值,您需要添加SID子句,就像您在正常的非多租户DB中所做的那样,惟一的区别是所提供的SID是多租户DB的SID
ALTER SESSION SET CONTAINER = PDBP1;
alter system set open_cursors=150 comment='setting open_cursors to RAC instance 1 from PDBP1' scope=spfile sid='CBD_PRD1';
alter system set open_cursors=250 comment='setting open_cursors to RAC instance 2 from PDBP1' scope=spfile sid='CBD_PRD2';
standby database 修改参数
由于pdb的参数时存在数据字典里的,所以不能直接修改备库中的pdb参数,因为备库是以只读的状态下打开的。
因此我们可以在主库修改,通过备库的日志应用来完成对备库的参数修改。
主库和备库同时进行修改(MRP进程正常运行)
在主库
SQL> alter session set container=zky;
Session altered.
SQL> alter system set db_create_file_dest='+FRA' sid='*';
System altered.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
备库
SQL> alter session set container=zky;
Session altered.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
此时发现参数并没有改变,需要重启一下pdb
SQL> alter session set container=zky;
Session altered.
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
通过生成pdb的pfile文件来查看
主库
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node2 ~]$ cat zky.ora
*.db_create_file_dest='+FRA'
*.db_securefile='PREFERRED'
[oracle@node2 ~]$
备库
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node1 ~]$ cat zky.ora
*.db_create_file_dest='+FRA'
*.db_securefile='PREFERRED'
[oracle@node1 ~]$
只备库修改
从12.1.0.2开始,有一个语法增强,可以使用DB_UNIQUE_NAME子句执行ALTER SYSTEM SET语句。
这个子句提供了一种在主数据库的PDB中使用SCOPE=SPFILE修改系统参数的方法,但是指定了备用数据库的db_unique_name,在备用数据库中,参数值应该真正生效。这种方法确保DML在主服务器上执行,目的是在备用服务器上生效。
主库
SQL> alter session set container=zky;
Session altered.
SQL> alter system set db_create_file_dest='+TEST' sid='*' db_unique_name='ora19c' scope=spfile;
System altered.
备库
SQL> alter session set container=zky;
Session altered.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DATA
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +TEST
通过生成pdb的pfile文件来查看
主库
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node2 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
[oracle@node2 ~]$
备库
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node1 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
*.db_create_file_dest='+TEST'
[oracle@node1 ~]$
可以发现,只有备库的spfile文件里有记录
在内存中修改pdb参数
由于是在内存中修改,不存在修改数据字典的行为,所以可以直接在备库进行修改
alter system set db_create_file_dest='+FRA' sid='*' scope=memory;
取消 PDB 管理参数
alter session set container=zky;
alter system reset db_create_file_dest sid='*';
当执行reset命令时,主库和备库的pdb参数将都会移除,即使在reset时指定了db_unique_name也不起作用
alter system reset db_create_file_dest sid='*' db_unique_name='ora19c';
主库
SQL> alter system set db_create_file_dest='+FRA' sid='*';
System altered.
SQL> show con_name
CON_NAME
------------------------------
ZKY
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
SQL> !
[oracle@node2 ~]$ exit
exit
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node2 ~]$ cat zky.ora
*.db_create_file_dest='+FRA'
*.db_securefile='PREFERRED'
[oracle@node2 ~]$ exit
exit
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string ora19cdg
SQL> alter system reset db_create_file_dest sid='*' db_unique_name='ora19c' scope=spfile;
System altered.
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node2 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
备库
SQL> alter session set container=zky;
Session altered.
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +FRA
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node1 ~]$ cat zky.ora
*.db_create_file_dest='+FRA'
*.db_securefile='PREFERRED'
[oracle@node1 ~]$ exit
exit
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node1 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
有以下几点需要注意:
1.reset命令执行以后虽然参数被移除了,但是pdb_spfile$基表里的记录不会移除。oracle认为不是一个bug,oracle认为Pdb_spfile $是一个内部字典表,不应该用来查询初始化参数。为了详细说明技术细节,该行存在于pdb_spfile$中,但被标记为DELETED参数。所以行的存在是内部实现,不会影响用户。
当pdb删除时pdb_spfile$里的记录将会一并删除
2.当使用db_unique_name只指定备库参数值时,也就是说主库pdb的参数值没有被赋值(是继承cdb的参数),将无法通过reset进行移除,无论在reset时是否指定db_unique_name。(这一点未找到oracle的官方说明)
主库
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node2 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
[oracle@node2 ~]$ exit
SQL> show con_name
CON_NAME
------------------------------
ZKY
备库
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +TEST
SQL> create pfile='/home/oracle/zky.ora' from spfile;
File created.
SQL> !
[oracle@node1 ~]$ cat zky.ora
*.db_securefile='PREFERRED'
*.db_create_file_dest='+TEST'
[oracle@node1 ~]$ exit
SQL> show con_name
CON_NAME
------------------------------
ZKY
主库
SQL> alter system reset db_create_file_dest sid='*' db_unique_name='ora19c';
alter system reset db_create_file_dest sid='*' db_unique_name='ora19c'
*
ERROR at line 1:
ORA-32010: cannot find entry to delete in SPFILE
SQL> alter system reset db_create_file_dest sid='*';
alter system reset db_create_file_dest sid='*'
*
ERROR at line 1:
ORA-32010: cannot find entry to delete in SPFILE
参考
Initialization parameters in a Multitenant database - FAQ and Examples (Doc ID 2101638.1)
Initialization parameters in a Multitenant database - Facts and additional information (Doc ID 2101596.1)
ALTER SYSTEM RESET DOESN’T UPDATE PARAM VALUE IN PDB_SPFILE$ (Doc ID 2287601.1)




