Oracle19c的多租户笔记
1.多租户的概念
- PDB(PLUGGABLE DATABASE)可以理解为我们Oracle11gR2的数据库,只不过是一个实例上面可以放置多个数据库了。名称为插件式数据库。
- CDB(container DATABASE)容器数据库,作为插件式数据库的基石。所有的PDB都需要它,这里面有一个种子(seed)数据库的概念。可以以它为模板,克隆新的数据库。CDB的root存储了 Oracle-supplied metadata 和common users。其中common users,后面在讲。
2.实战
概念说多了,容易混淆。我们通过实践,来做一个感性的认识。
2.1 查看19c数据库是否为CDB
通过查看CDB这一列,判断是否为CDB。
SQL> SELECT NAME, CDB, CON_ID FROM V$DATABASE;
NAME CDB CON_ID
--------------------------- --------- ----------
ORADB YES 0
查看当前pdb有哪些:
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 HRPDB READ WRITE NO
这里有一个种子pdb和一个HRPDB。
关于何如通过tns连接这个HRPDB,我在监听配置的文章有写。不过多描述
2.2 创建一个新的PDB
假设:开发人员来需求了,需要创建一个新的财务数据库,要有自己的表空间。该如何操作?
CREATE PLUGGABLE DATABASE finpdb
ADMIN USER finadm IDENTIFIED BY fin123456
STORAGE (MAXSIZE 2G)
DEFAULT TABLESPACE fin
DATAFILE '/u01/app/oracle/oradata/ORADB/finpdb/fin01.dbf' SIZE 256M
AUTOEXTEND ON
PATH_PREFIX = '/u01/app/oracle/oradata/ORADB/finpdb/'
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ORADB/pdbseed/',
'/u01/app/oracle/oradata/ORADB/finpdb/');
上述可以看到:
- 有属于自己的表空间
fin
,大小为256M,自动扩展。 - 有属于自己的datafile的存储路径
/u01/app/oracle/oradata/ORADB/finpdb/
。 - 所有表空间不能超过2G,这个限制嘛,有待商榷。
- 复制的datafile是来自于种子插件式数据库。
查看当前finpdb的状态
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 HRPDB READ WRITE NO
4 FINPDB MOUNTED
我们该如何启动它呢?如下命令:
SQL> alter pluggable database FINPDB open;
开启后,我们查看finpdb的数据文件如下:
[oracle@localhost finpdb]$ pwd
/u01/app/oracle/oradata/ORADB/finpdb
[oracle@localhost finpdb]$ ls -l
total 979040
-rw-r----- 1 oracle oinstall 268443648 Jan 29 15:40 fin01.dbf
-rw-r----- 1 oracle oinstall 346038272 Jan 29 15:40 sysaux01.dbf
-rw-r----- 1 oracle oinstall 283123712 Jan 29 15:40 system01.dbf
-rw-r----- 1 oracle oinstall 37756928 Jan 29 15:41 temp012021-01-29_10-33-01-510-AM.dbf
-rw-r----- 1 oracle oinstall 104865792 Jan 29 15:40 undotbs01.dbf
可以看到,finpdb有完全属于自己一套的数据文件,如上。其中fin01是我们新建的表空间。
2.3 为新创建的PDB配置监听服务
listener.ora
文件,配置如下:
(SID_DESC=
(GLOBAL_DBNAME=FINPDB)
(SID_NAME=oradb)
(ORACLE_HOME=/u01/app/oracle/product/19.3/dbhome_1)
)
重启监听服务
[oracle@localhost admin]$ lsnrctl stop
[oracle@localhost admin]$ lsnrctl start
.........
Services Summary...
Service "FINPDB" has 1 instance(s).
Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
Service "HRPDB" has 1 instance(s).
Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
Service "ORADB" has 1 instance(s).
Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
如果可以看到Service "FINPDB",说明FINPDB的监听服务,配置正确。
tnsnames.ora文件,配置如下:
FINDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.99.202)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = FINPDB)
)
)
通过system用户,登录FINDB服务。如下:
[oracle@localhost admin]$ sqlplus system@FINDB
Enter password:xxxxxx
SQL>
这个验证了,system和sys用户,属于common user。在CDB和PDB是共有的概念。
2.4 common user的概念
这里正好可以说出common user的具体概念。 common user is a database user that has the same identity in the root and in every existing and future PDB within this container.
说白了,看system和sys。相同的唯一标识,可以在CDB root和PDB中切换使用。如下图:
根据图上,发现如果是common user只有两类
sys和systm的用户
C##为前缀定义的用户
创建C##DBA用户
[oracle@localhost ~]$ sqlplus system@ORADB
Enter password: xxxxxx
Connected.
CREATE USER C##DBA
IDENTIFIED BY dba123456
DEFAULT TABLESPACE SYSTEM
TEMPORARY TABLESPACE TEMP
CONTAINER = ALL;
GRANT SET CONTAINER, CREATE SESSION,DBA TO C##DBA CONTAINER = ALL;
用C##DBA用户连接FINDB 数据库
[oracle@localhost ORADB]$ sqlplus C##dba@FINDB
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 29 16:53:25 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
---------------------这里创建一个用户-----------------------
-- Create the user
create user fin identified by fin
default tablespace fin
temporary tablespace TEMP;
-- Grant/Revoke role privileges
grant connect to fin;
grant resource to fin;
-- Grant/Revoke system privileges
grant create materialized view to fin;
grant create synonym to fin;
grant create view to fin;
至此,fin用户创建完毕.后面和数据库Oracle11gR2没有任何区别的创建,表,视图等.