【德哥说库系列】-Oracle 19C容器数据库日常管理

??????
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验
一位上进心十足的【大数据领域博主】!???
中国DBA联盟(ACDU)成员,目前服务于工业互联网
擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】???
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

前言

本文详细阐述了Oracle 19C容器数据库日常管理

? 1.多租户架构

容器是多租户容器数据库(CDB)中模式、对象和相关结构的集合,在逻辑上应用程
序将其显示为单独的数据库。在 CDB 中,每个容器都有一个唯一的 ID 和名称。 根和每
个可插拔数据库(pdb)都被视为一个容器。pdb 隔离数据和操作,因此从用 户或应用程
序的角度来看,每个 pdb 看起来都像是传统的非 cdb。

✨ 1.1 CDB 根容器

根容器是所有 pdb 所属的模式、模式对象和非模式对象的集合。每个 cdb 都有且 只
有一个根容器,根容器被命名 CDB$ROOT。用于存储管理 pdb 所需的系统元数据。 所有
pdb 都属于根目录。 根目录不存储用户数据。因此,不能将用户数据添加到根目录或修改
根目录中系 统提供的架构。但是,可以为数据库管理创建公共用户和角色。

✨ 1.2 PDB

pdb 是用户创建的一组模式、对象和相关结构,在逻辑上对应用程序显示为单独 的数
据库。每个 pdb 都归 sys 所有,sys 是 cdb 中的一个公共用户。

1)存储特定应用程序的数据
例如,销售应用程序可以有自己的专用 PDB,人力资源应用程序可以有自己的专用PDB。
2)将数据移动到其他 CDB
数据库是“可插入的”,可以将其打包为一个独立的单元,然后将其移动到另一个 cdb中。
3)在 PDB 中隔离授权
具有适当权限的本地或公共用户可以授予单个 pdb 中的 public。

在 CDB 中,所有数据库对象都位于架构中,而架构又位于容器中。因为 pdb 在用 户
看来是非 cdb,所以模式必须在容器中唯一命名,而不能跨容器命名。例如,rep 模式既可
以存在于 SalePDB 中,也可以存在于 HrPDB 中。这两个模式是独立的。
连接到一个 pdb 的用户必须使用 database links 来访问另一个 pdb 中的对象。 这种
行为直接类似于非 cdb 中的用户访问不同非 cdb 中的对象。
连接到一个 pdb 的用户必须使用 database links 来访问另一个 pdb 中的对象。 这种行为直接类似于非 cdb 中的用户访问不同非 cdb 中的对象。

在这里插入图片描述

在物理层,CDB 是一组文件,控制文件、联机重做日志文件和数据文件。
在物理层,每个 PDB 都有自己的一组数据文件,用于存储 PDB 的数据。

多租户体系结构的好处:
1)降低成本(10 台服务器变成 1 台,共享进程,共享系统资源)
2)更容易和更快速的数据和代码的移动(可拔插数据库,像 U 盘一样)
3)更轻松地管理和监控物理数据库(至少不用连接 N 多服务器来观察)
4)分离数据和代码
5)安全分离管理权限(各个 PDB 之间的权限依旧独立)
6)轻松性能调优

多租户体系结构对可管理性的好处
•更容易升级数据和代码
•更容易在服务器之间迁移
•防止 PDB 中的数据损坏
•能够在一个地方安装、管理和升级特定于应用程序的数据和元数据

✨ 1.3 cdb 表空间

在这里插入图片描述

cdb 的结构与非 cdb 相同,只是每个 pdb 和应用程序根目录都有自己的表空间集,包
括自己的 SYSTEM, SYSAUX, and undo 表空间。
1)SYSTEM and SYSAUX tablespaces for every container
2)每个 pdb 都有自己的一组非系统表空间。这些表空间包含 pdb 中用户定义的模式 和
对象的数据。 在 pdb 中,管理永久表空间和临时表空间的方式与在非 cdb 中管理它们的
方式相同。
3)CDB 根存在一个默认临时表空间,每个 PDB 都有一个临时表空间。

? 2.PDB和CDB的管理

✨ 2.1 确认CDB

SQL> select name, decode(cdb, ‘YES’, ‘Multitenant Option enabled’,
'Regular 19c Database: ') “Multitenant Option” , open_mode, con_id from
v$database;

在这里插入图片描述

✨ 2.2 连接到 CDB

1)简易方式连接
[oracle@OEL7 ~]$ sqlplus / as sysdba
2)使用 net service 方式连接
[oracle@OEL7 ~]$ sqlplus system/oracle@192.168.6.30:1521/prod

在这里插入图片描述

✨ 2.3 连接到 PDB

1)使用简单连接方式连接到 pdb3
[oracle@OEL7 ~]$ sqlplus / as sysdba
SYS@orcl(CDB$ROOT)> alter session set container=pdb3;
2)使用 net service 方式连接
[oracle@OEL7 ~]$ sqlplus system/oracle@192.168.6.30:1521/pdb3

✨ 2.4 PDB创建及删除

从 seed PDB 创建一个 PDB,每个 CDB 有一个 PDBtemplate,名为 PDB$Seed创建一个操作系统的目录用来存放新创建的 PDB 数据库的数据文件和临时文件:
mkdir -p /u01/app/oracle/oradata/cdb1/prod3

1)创建 PDB
select name from v$datafile where con_id=(select con_id from v$pdbs where name='PDB$SEED');

create pluggable database pdb4 admin user jeames identified by 123456
file_name_convert=('/u01/app/oracle/oradata/ORCL/pdbseed','/u01/app/oracle/oradata/ORCL/pdb4') ;

在这里插入图片描述
2)重命令PDB

rename  pdb 时,pdb需要处于 open restricted 状态。
SQL> select name ,open_mode from v$pdbs ;
SQL> alter pluggable database pdb4 close immediate ;
SQL> alter pluggable database pdb4 open restricted ;
SQL> select name ,restricted from v$pdbs ;
SQL> conn sys/oracle@192.168.6.5:1521/pdb4 as sysdba
SQL> alter pluggable database pdb4 rename global_name to pdb4_his ;
SQL> alter pluggable database close immediate ;
SQL> select name ,open_mode from v$pdbs ;
SQL> conn / as sysdba
SQL> alter pluggable database pdb4 open;
SQL> select name ,open_mode from v$pdbs ;

3)PDB 删除

SQL> conn / as sysdba
SQL> alter pluggable database PDB4_HIS close;
SQL> select name ,open_mode from v$pdbs ;
SQL> drop pluggable database PDB4_HIS including datafiles ;
SQL> select name ,open_mode from v$pdbs ;

? 3.容器数据库自启动

✨ 3.1 PDB 自动启动

在 pdb open 状态下打以下命令,才会自动启动 PDB
SQL> alter pluggable database all save state;
取消自动启动 PDB
SQL> alter pluggable database all discard state;

在这里插入图片描述

✨ 3.1 Oracle19c开机启动

# 1、root用户修改 /etc/oratab, 将上面的N改为Y
vi /etc/oratab
PROD:/u01/app/oracle/product/19.3.0/dbhome_1:N
将上面的N改为Y

# 2、oracle用户修改
su - oracle
cd $ORACLE_HOME/bin
vi dbstart
修改 #ORACLE_HOME_LISTNER=$1 为 ORACLE_HOME_LISTNER=$ORACLE_HOME

vi dbshut
修改 #ORACLE_HOME_LISTNER=$1 为 ORACLE_HOME_LISTNER=$ORACLE_HOME

# 3、root用户修改
chmod 777 /etc/rc.d/rc.local
vi /etc/rc.d/rc.local

添加 
# for oracle
su - oracle -lc 'lsnrctl start'
su - oracle -lc 'dbstart'

# 4. 重启,测试成功
reboot 或 init 6

注意: su - oracle -lc 'lsnrctl start'

-l 表示同时切换用户目录。比如你要换到oracle用户下你的目录就同时在oracle目录下了。
-c则表示执行完命令好再返回到原来的用户。

经过测试我们发现,服务器库开机自启动容器数据库19C

在这里插入图片描述