ORACLE 12C/19C 手工建立多租户数据库

我作为ORACLE OCP/OCM的讲师在教学的过程中总会遇到这么一类问题:很多学生对ORACLE多租户数据库都是比较茫然的。那么今天我就利用多租户手工建库的方式,带大家去从数据库这个层面去理解一下多租户的相关概念。

第一部分:手工创建CDB

美好的一天从这里开始:

首先修改oracle环境变量为cdb1:

可以使用以下命令进行修改:

切换到oracle用户中: 后续步骤都在oracle用户中操作。

su - oracle

使用这个sed命令修改oracle用户环境变量中的ORACLE_SID名称:如果不擅长LINUX命令的话,还是建议手动修改。这里注意加了 -i 这个参数后,sed

就会去修改源文件,如果你要是确定不了,就可以先使用下面命令测试:

sed 's#ORACLE_SID=.*#ORACLE_SID=cdb1#' /home/oracle/.bash_profile

当你确定无误后 再使用下面的命令去修改环境变量文件:-i的主要作用就是去修改你的原文件中的内容

sed -i 's#ORACLE_SID=.*#ORACLE_SID=cdb1#' /home/oracle/.bash_profile

生成环境变量

source ~/.bash_profile

检查一下,看看是不是ORACLE_SID修改成功了!!!

cat /home/oracle/.bash_profile

或者使用下面的命令看看是否成功

echo $ORACLE_SID

应该输出:cdb1

如果修改完成,并环境变量生成后,我们使用sqlplus / as sysdba将得到以下结果:

oracle@oracle12c-cdb \~$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 9 01:48:44 2020

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Connected to an idle instance.

SQL>

看到了吗!空实例。说明我们要从spfile开始一步一步的手工建库了,不过我们这里建立的不是单实例数据库,而是CDB(容器数据库)!退出sqlplus

oracle@oracle12c-cdb \~$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 9 01:51:20 2020

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Connected to an idle instance.

SQL> exit;

Disconnected

创建密码文件:(还记得他吧!sys/system用户都要用到,没有它后面就很多东西玩不转,如果忘了回头看看071)

orapwd file=$ORACLE_HOME/dbs/orapwcdb1 password=oracle force=y format=12

下面开始手工创建CDB:

第零步:请确定你已经建立好了一个监听。这里我已经创建好监听了。如果不会创建监听,建议回顾062的第五章。或者使用以下的内容:

请到下面查找创建动态监听的内容。(推荐大家直接使用文件关键字的方式查找:关键字为"创建一个监听程序"。)

第一步:创建pfile。使用下面的命令和参数去创建pfile。

cd /home/oracle --注意这是LINUX操作系统命令不能在sqlplus下执行。

mkdir -p /u01/app/oracle/admin/cdb1/adump --建立cdb1的审计目录

mkdir -p /u01/app/oracle/oradata/cdb1 --建立cdb1的数据文件存放目录

mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed --创建pdbseed目录

vi /home/oracle/init_cdb1.ora

*.audit_file_dest='/u01/app/oracle/admin/cdb1/adump'

*.audit_trail='db'

*.control_files='/u01/app/oracle/oradata/cdb1/control01.ctl','/u01/app/oracle/oradata/cdb1/control02.ctl'

*.db_block_size=8192

*.db_name='cdb1'

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=cdb1XDB)'

*.enable_pluggable_database=true

*.open_cursors=300

*.pga_aggregate_target=200m

*.processes=300

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=800m

*.undo_tablespace='UNDOTBS1'

修改后保存退出。这里我们必须要注意下面的参数必须要添加进去:

*.enable_pluggable_database=true

第二步:使用sqlplus / as sysdba进入到oracle数据库。

oracle@oracle12c-cdb \~$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 9 02:16:05 2020

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Connected to an idle instance.

SQL>

第三步:使用我们创建出来的pfile启动数据库到nomount状态,并创建spfile然后重新把数据库启动到startup nomount

SQL> startup nomount pfile='/home/oracle/init_cdb1.ora' 或者使用 startup pfile='/home/oracle/init_cdb1.ora' nomount

ORACLE instance started.

Total System Global Area 838860800 bytes

Fixed Size 8798312 bytes

Variable Size 322965400 bytes

Database Buffers 503316480 bytes

Redo Buffers 3780608 bytes

SQL> create spfile from pfile='/home/oracle/init_cdb1.ora';

File created.

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup nomount

ORACLE instance started.

Total System Global Area 838860800 bytes

Fixed Size 8798312 bytes

Variable Size 322965400 bytes

Database Buffers 503316480 bytes

Redo Buffers 3780608 bytes

SQL>

一连串的操作!对吧。。。哈哈哈哈放轻松。

第四步:我们需要创建一个CDB的建库脚本。脚本如下

cd /home/oracle --不是重复了,是我要一直提醒大家,所有的相关文件都必须放到这里。

vi /home/oracle/create_cdb1.sql

CREATE DATABASE cdb1

USER SYS IDENTIFIED BY oracle

USER SYSTEM IDENTIFIED BY oracle

LOGFILE GROUP 1 ('/u01/app/oracle/oradata/cdb1/redo01a.log','/u01/app/oracle/oradata/cdb1/redo01b.log')

SIZE 100M BLOCKSIZE 512,

GROUP 2 ('/u01/app/oracle/oradata/cdb1/redo02a.log','/u01/app/oracle/oradata/cdb1/redo02b.log')

SIZE 100M BLOCKSIZE 512,

GROUP 3 ('/u01/app/oracle/oradata/cdb1/redo03a.log','/u01/app/oracle/oradata/cdb1/redo03b.log')

SIZE 100M BLOCKSIZE 512

MAXLOGHISTORY 1

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 1024

CHARACTER SET AL32UTF8

NATIONAL CHARACTER SET AL16UTF16

EXTENT MANAGEMENT LOCAL

DATAFILE '/u01/app/oracle/oradata/cdb1/system01.dbf'

SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

SYSAUX DATAFILE '/u01/app/oracle/oradata/cdb1/sysaux01.dbf'

SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

DEFAULT TABLESPACE deftbs

DATAFILE '/u01/app/oracle/oradata/cdb1/deftbs01.dbf'

SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED

DEFAULT TEMPORARY TABLESPACE tempts1

TEMPFILE '/u01/app/oracle/oradata/cdb1/temp01.dbf'

SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED

UNDO TABLESPACE undotbs1

DATAFILE '/u01/app/oracle/oradata/cdb1/undotbs01.dbf'

SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED

USER_DATA TABLESPACE usertbs

DATAFILE '/u01/app/oracle/oradata/cdb1/pdbseed/usertbs01.dbf'

SIZE 50M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED

ENABLE PLUGGABLE DATABASE

SEED

FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/cdb1/', '/u01/app/oracle/oradata/cdb1/pdbseed/')

SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED

SYSAUX DATAFILES SIZE 100M

LOCAL UNDO ON;

在已经启动到nomount状态下的数据库sqlplus工具中执行该脚本。

SQL> @/home/oracle/create_cdb1.sql

Database created.

成功了!下一步我们执行一个脚本。不过我们在执行下一个脚本之前,我们需要运行点其他的东西,不然会出现错误。

export PERL5LIB=ORACLE_HOME/rdbms/admin:PERL5LIB

export PATH=ORACLE_HOME/bin:ORACLE_HOME/perl/bin:$PATH

cd $ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash

ln -s Util.pm util.pm

运行完成后,我们现在去运行下面的脚本

@?/rdbms/admin/catcdb.sql

如果遇到让你输入参数的时候 ,输入下面的参数:

Enter value for 1: /home/oracle

Enter value for 2: /home/oracle/cdb.log

Enter new password for SYS: oracle

Enter new password for SYSTEM: oracle

Enter temporary tablespace name: temp

当最后输出这些时候代表脚本运行成功:

catcon: See /home/oracle/catbundleapply\*.log files for output generated by scripts

catcon: See /home/oracle/catbundleapply_\*.lst files for spool files, if any

catcon.pl: completed successfully

catcon: ALL catcon-related output will be written to /home/oracle/utlrp_ catcon_9786.lst

catcon: See /home/oracle/utlrp\*.log files for output generated by scrip ts

catcon: See /home/oracle/utlrp_\*.lst files for spool files, if any

catcon.pl: completed successfully

使用语句去验证一下:

SQL> select name,cdb,con_id,open_mode from v$database;

NAME CDB CON_ID OPEN_MODE


CDB1 YES 0 READ WRITE

SQL> select status from v$instance;

STATUS


OPEN

好现在我们做一下实例的关闭和开启实验。

oracle@oracle12c-cdb Hash$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 9 18:48:01 2020

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Connected to:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 838860800 bytes

Fixed Size 8798312 bytes

Variable Size 322965400 bytes

Database Buffers 503316480 bytes

Redo Buffers 3780608 bytes

Database mounted.

Database opened.

SQL>set lines 300

SQL>col NAME for a40

SQL>select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

CON_ID DBID NAME OPEN_MODE


2 1124557470 PDB$SEED READ ONLY

SQL>

可以看到没问题。

创建一个监听程序:(如果你要是已经有监听了,就不用创建了)

这里我们可以创建一个动态监听程序,因为静态静态监听程序在062中已经讲过了。而且在创建监听之前最好把数据库关闭。

请使用下面的创建语句创建动态监听。ORACLE12C以后的版本在使用监听的方面,官方推荐使用动态监听。

vi $ORACLE_HOME/network/admin/listener.ora

listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora

Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = oracle12c-cdb)(PORT = 1521))

)

)

如果写IP地址的话:

listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora

Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.166)(PORT = 1521))

)

)

保存退出。

这里我们需要注意的是HOST必须填你自己机器的主机名或IP.

启动监听。

lsnrctl start

oracle@oracle12c-cdb admin$ lsnrctl start

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 09-NOV-2020 19:10:10

Copyright (c) 1991, 2016, Oracle. All rights reserved.

Starting /u01/app/oracle/product/12.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.2.0.1.0 - Production

System parameter file is /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora

Log messages written to /u01/app/oracle/diag/tnslsnr/oracle12c-cdb/listener/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c-cdb)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle12c-cdb)(PORT=1521)))

STATUS of the LISTENER


Alias LISTENER

Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production

Start Date 09-NOV-2020 19:10:10

Uptime 0 days 0 hr. 0 min. 0 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/oracle12c-cdb/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c-cdb)(PORT=1521)))

The listener supports no services

The command completed successfully

使用sqlplus / as sysdba 打开你的数据库(startup)命令。

先别着急!等一会。。。。在查看监听的状态,因为,我们这个是用动态监听自动注册实例,所以可能要等一会。

查看监听状态:

lsnrctl status

oracle@oracle12c-cdb admin$ lsnrctl status

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 09-NOV-2020 19:12:27

Copyright (c) 1991, 2016, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle12c-cdb)(PORT=1521)))

STATUS of the LISTENER


Alias LISTENER

Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production

Start Date 09-NOV-2020 19:10:10

Uptime 0 days 0 hr. 2 min. 17 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/oracle12c-cdb/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c-cdb)(PORT=1521)))

Services Summary...

Service "cdb1" has 1 instance(s).

Instance "cdb1", status READY, has 1 handler(s) for this service...

Service "cdb1XDB" has 1 instance(s).

Instance "cdb1", status READY, has 1 handler(s) for this service...

The command completed successfully

看我们的cdb1 已经成功被监听了。这时你可以使用sqldeveloper去测试一下。

###############################################################################

这里给大家附送一个静态监听创建代码:(请酌情使用。动态 静态挑一个就行。我建议使用动态监听)

vi $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = cdb1)

(ORACLE_HOME = /u01/app/oracle/product/12.2.0/db_1)

(SID_NAME = cdb1)

)

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = pdb1)

(ORACLE_HOME = /u01/app/oracle/product/12.2.0/db_1)

(SID_NAME = cdb1)

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = oracle12c-cdb)(PORT = 1521))

)

(DESCRIPTION =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

ADR_BASE_LISTENER = /u01/app/oracle

###################################################################################

至此手工创建CDB的所有步骤完成了。

第二部分:手工创建PDB

1.利用PDB$SEED创建PDB

在SQLPLUS中执行以下的SQL语句

CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle

FILE_NAME_CONVERT=(

'/u01/app/oracle/oradata/cdb1/pdbseed/system01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/system01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/sysaux01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/sysaux01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/undotbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/undotbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/deftbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/deftbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/usertbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/usertbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/temp01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/temp01.dbf'

)

STORAGE UNLIMITED TEMPFILE REUSE;

如果你想对新建成的pdb1进行使用空间限制的话,可以写成以下格式。

CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY oracle

FILE_NAME_CONVERT=(

'/u01/app/oracle/oradata/cdb1/pdbseed/system01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/system01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/sysaux01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/sysaux01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/undotbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/undotbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/deftbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/deftbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/usertbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/usertbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/temp01.dbf', '/u01/app/oracle/oradata/cdb1/pdb1/temp01.dbf'

)

STORAGE (

MAXSIZE 2G

MAX_SHARED_TEMP_SIZE 200M

)

TEMPFILE REUSE;

查询一下:

set lines 300

col NAME for a40

select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

第二种 使用已有的PDB去创建新的PDB。

我们需要注意几点:

使用的用户必须拥有'CREATE PLUGGABLE DATABASE'的权限(测试里使用sys用户)

源PDB不可以是关闭状态或者是mount状态的

如果CDB为shared undo,PDB必须为READ-ONLY状态。才能进行相关复制,不然丢失事务。

如果CDB不是归档模式,那么PDB必须为READ-ONLY状态。才能进行相关复制

创建测试PDB:pdbt

CREATE PLUGGABLE DATABASE pdbt ADMIN USER pdbtadmin IDENTIFIED BY oracle

FILE_NAME_CONVERT=(

'/u01/app/oracle/oradata/cdb1/pdbseed/system01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/system01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/sysaux01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/sysaux01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/undotbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/undotbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/deftbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/deftbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/usertbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/usertbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbseed/temp01.dbf', '/u01/app/oracle/oradata/cdb1/pdbt/temp01.dbf'

)

STORAGE UNLIMITED TEMPFILE REUSE;

尝试把pdbt以READ ONLY方式打开:

ALTER PLUGGABLE DATABASE PDBt OPEN READ ONLY;

新的PDB一定要先启动到READ WRITE模式,因为新的PDB状态是NEW,而在NEW的这个模式下时,是不能启动到READ ONLY的,第一次启动到READ WRITE后,将PDB关掉,下次就能启动到READ ONLY状态了。

PDB状态检查语句:

set lines 500

col pdb_name for a10

col db_name for a10

col db_unique_name for a10

col db_version_string for a20

查询PDB的详细信息:

select pdb_name,pdb_id,pdb_dbid,pdb_guid,OP_TIMESTAMP,operation,db_version,db_name,db_unique_name,db_dbid,db_version_string from dba_pdb_history order by OP_TIMESTAMP;

查询PDB的状态

select pdb_name, status from cdb_pdbs;

pdb的status有NEW、NORMAL、UNPLUGGED、NEEDS UPGRADE、CONVERTING、UNUSABLE几种状态,对这几种状态的解释如下:(文档的最后有英文原版内容)

NEW-自创建以来,从未打开过PDB。 必须以READ WRITE模式打开该文件,Oracle才能执行将PDB集成到CDB中并将其标记为NORMAL所需的处理。 如果尝试以只读方式打开PDB,将引发错误。

NORMAL-准备使用(准许使用)的PDB。

UNPLUGGED-PDB已拔出。可以对其执行的唯一操作是DROP PLUGGABLE DATABASE。

NEEDS UPGRADE-PDB需要升级到已插入的CDB的版本。

CONVERTING-非CDB已插入CDB,并且正在进行转换,以使其表现得像真实的PDB。

UNUSABLE-正在创建PDB或在创建PDB时遇到不可恢复的错误。 当状态设置为"不可用"时,无法打开PDB。 如果PDB在创建过程中由于遇到错误而保持此状态,则只能将其删除。 可以检查告警日志以确定是否存在错误

启动PDB到READ WRITE状态

ALTER PLUGGABLE DATABASE PDBt OPEN READ WRITE;

关闭

ALTER PLUGGABLE DATABASE PDBt close;

然后启动到READ ONLY状态

ALTER PLUGGABLE DATABASE PDBt OPEN READ ONLY;

执行PDB的克隆语句

CREATE PLUGGABLE DATABASE pdb2 FROM pdbt

STORAGE UNLIMITED TEMPFILE REUSE

FILE_NAME_CONVERT=(

'/u01/app/oracle/oradata/cdb1/pdbt/system01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/system01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbt/sysaux01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/sysaux01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbt/undotbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/undotbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbt/deftbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/deftbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbt/usertbs01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/usertbs01.dbf',

'/u01/app/oracle/oradata/cdb1/pdbt/temp01.dbf', '/u01/app/oracle/oradata/cdb1/pdb2/temp01.dbf'

)

PARALLEL 2;

第三种 把已拔出的PDB再插回到CDB中

首先关掉PDB

alter pluggable database pdb2 close;

alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml';

删除PDB有两种方式 第一个是保留文件第二个是不保留文件

drop pluggable database pdb2 including datafiles; #删除数据库和文件

drop pluggable database pdb2 keep datafiles; #删除数据库并保存文件

默认状态下是保留文件的。

drop pluggable database pdb2;

创建PDB

create pluggable database pdb2 using '/home/oracle/pdb2.xml' nocopy;

alter pluggable database pdb2 open read wirte ;

alter pluggable database pdb2 open;

附注:

pdb的status有NEW、NORMAL、UNPLUGGED、NEEDS UPGRADE、CONVERTING、UNUSABLE几种状态,对这几种状态的解释如下:

NEW - The PDB has never been opened since it was created. It must be opened in READ WRITE mode for Oracle to perform processing needed to complete the integration of the PDB into the CDB and mark it NORMAL. An error will be thrown if an attempt is made to open the PDB read only.

NORMAL - The PDB is ready to be used.

UNPLUGGED - The PDB has been unplugged. The only operation that can be performed on it is DROP PLUGGABLE DATABASE.

NEEDS UPGRADE - A PDB needs to be upgraded to the version of the CDB into which it was plugged.

CONVERTING - A non-CDB was plugged into the CDB and is undergoing conversion required to make it behave like a real PDB.

UNUSABLE - The PDB is being created or an unrecoverable error was encountered during its creation. The PDB cannot be opened while its state is set to UNUSABLE. If the PDB remains in this state because of an error encountered during its creation, it can only be dropped. The alert log can be checked to determine if there was an error

BEGIN

EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE "PDB3" CLOSE IMMEDIATE';

EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE "PDB3" UNPLUG INTO ''PDB3.XML''';

EXECUTE IMMEDIATE 'DROP PLUGGABLE DATABASE "PDB3" KEEP DATAFILES';

END;

相关推荐
折哥的程序人生 · 物流技术专研2 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
AOwhisky2 小时前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
李白的天不白2 小时前
数据库连接报错问题
数据库
一条泥憨鱼2 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
爱喝水的鱼丶3 小时前
SAP-ABAP:SAP视图开发入门:四类标准视图的适用场景与创建步骤详解
服务器·数据库·性能优化·sap·abap
大白要努力!3 小时前
MySQL 8.0 + Navicat 完整操作指南
数据库·mysql
云絮.4 小时前
数据库操作
数据库·mysql·算法·oracle
小小工匠4 小时前
Redis 缓存替换策略:8 种淘汰策略与 LRU 实现剖析
数据库·redis·缓存
小小龙学IT6 小时前
Go 泛型深度解析:从设计哲学到工程实践
服务器·数据库·golang