Oracle 12c 之后的架构由 11g 之前的单库模式更改为多库模式。在容器库与租户库之间的切换成了日常。
查看当前所在数据库
SQL> show con_name
CDB$ROOT
SQL> alter session set container=mhis;
SQL> show con_name
MHIS
SQL> alter session set container=cdb$root;
通过 alter session 语句可以切换至不同的 pdb,或重新切换到 cdb。cdb 的名字是固定的,都叫 cdb$root ,也叫根数据库,还有一个 pdb$seed 叫种子数据库,这俩库名字固定。
查看 pdb 库的信息
SQL> conn / as sysdba
Connected.
SQL> show pdbs
2 PDB$SEED READ ONLY NO
3 ZZXTDB READ WRITE NO
3 TMIS READ WRITE NO
4 MHIS READ WRITE NO
SQL> alter session set container=mhis;
Session altered.
SQL> show pdbs
4 MHIS READ WRITE NO
其中 show pdbs 在根数据库中可以查看到全部 pdb 的信息,而在 pdb 中时只显示当前 pdb 的信息。切换到根数据库,除了使用 alter sesson 命令之外,还可以使用 conn / as sysdba 命令,这条命令更短。
我们知道使用操作系统认证时,sys 用户是不需要输入密码的。切换至根数据库时,可以使用sys空密码直接切换,在不同 pdb 用户间切换也是使用的 sys 用户。如果想通过网络远程使用sys用户登录pdb怎么办?每个 pdb 的 sys 密码是否可以单独设置?答案是不能,当在 pdb 中重置 sys 密码时会报错:
SQL> alter user sys identified by fakepasswd;
alter user sys identified by fakepasswd
*
ERROR at line 1:
ORA-65066: The specified changes must apply to all containers
所有 pdb 的 sys 密码都与 cdb 的密码一致,不能单独为 pdb 设置密码。Oracle 11g 的密码文件是存在操作系统中的,目录也比较固定,Linux 下为:
$ORACLE_HOME/dbs/orapwXXX
Oracle 11g 密码文件的问题是,如果是 RAC 多实例,那么密码文件就有多套,sys 用户的密码并不存在数据库中,而是单独存在密码文件中。Oracle 19c 的密码文件存在 ASM 文件系统中,这样多个实例就可以共享一套密码文件了。
查看 19c 密码文件位置的方法
$ srvctl config database
his
cdb
$ srvctl config database -d cdb
[...]
Spfile: +dg_data01/cdb/PARAMETERFILE/spfile.919.1112413315
Password file: +DG_DATA01/cdb/orapwcdb1
在 pdb 下修改 sys 密码会报错,我们可以在 cdb 下修改 sys 用户的密码,修改完后所有 pdb 共用一套 sys 密码。
修改 sys 用户密码的过程
SQL> conn / as sysdba
SQL> alter user sys identified by fakepasswd;
SQL> select name from v$services;
NAME
-------
mhis
SQL> conn sys/fakepasswd@192.168.1.1:1521/mhis
Connected.
修改完 sys 密码,通过 ezconnnect 方式连接数据库,验证密码是否正确。
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。