Oracle 12c 使用SQL*Plus来创建与移动应用程序Seeds

可以使用多种方法来创建应用程序seeds,包括使用CDB seed,克隆现有的PDB或Non-CDB,与附加一个卸载的PDB。也可以从应用程序容器中删除应用程序seeds。

为了在应用程序容器中创建新的应用程序seed,可以执行带有as seed子句的create pluggable database语句。可以使用应用程序种子为应用程序提供一个应用程序容器。通常在应用程序seed创建之前应用程序容器的应用程序被安装在应用程序root中。在应用程序seed创建之后它将与应用程序root进行同步,因此应用程序被安装在应用程序seed中。当创建应用程序seed之后,使用应用程序seed创建的任何PDB都安装应用程序。当应用程序root中的应用程序被升级或打补丁后,应用程序seed必须使用应用程序root进行同步来应用这些改变。

通过执行带有as seed子句的create pluggable database语句来创建应用程序seed。

一个应用程序容器可以有零或一个应用程序seed。当使用as seed子句创建应程序seed时,不用指定它的名字。应用程序seed名字总是以application_container_name$SEED命名,其中application_container_name是应用程序seed的应用程序容器的名字。例如,在salesact应用程序容器中的应用程序seed它的名字必须是salesact$SEED。

当创建一个新的应用程序seed时,必须为在create pluggable database语句中为应用程序容器指定管理员。这个语句将在应用程序容器中创建一个本地用户的管理员,并且被授予pdb_dba角色。

创建应用程序seed的所需要满足的条件:
.CDB必须存在

.CDB必须处于读写模式

.应用程序seed所属的应用程序容器必须处于读写模式

.当前用户必须是一个公共用户,应用程序seed所属的应用程序root是当前容器

.当前用户有create pluggable database系统权限

.在应用程序容器中对于包含应用程序的应用程序seed,应用程序必须安装在应用程序root

创建应用程序seed
可以通过执行带有as seed子句的create pluggable database语句来创建应用程序。应用程序容器中的应用程序seed类似于CDB中的seed。一个应用程序seed能用来快速与简单的创建满足应用程序容器要求的应用程序PDB。创建应用程序seed的操作如下:
1.在SQL*Plus中,确保当前容器是应用程序root。

2.执行带有as seed子句的create pluggable database语句来创建应用程序seed。根据需要还可以指定其它子句。在创建完应用程序seed后,它处于mounted模式,状态为new。可以通过查询v$pdbs视图的open_mode列来检查应用程序seed的打开模式。可以通过查询cdb_pdbs或者dba_pdbs视图的status列来查看应用程序seed的状态。还会为应用程序seed创建缺省的服务名。服务名与应用程序seed同名并且可以被用来访问应用程序seed。

3.以读写模式来打开新的应用程序seed

4.为了将新应用程序seed集成到应用程序容器中必须以读写模式来打开新的应用程序seed。如果试图以只读模式来打开新的应用程序seed将会返回错误信息。在应用程序seed以读写模式打开后,它的状态将为normal。

5.执行一个或多个以下操作:
5.a 如果使用CDB seed中创建应用程序seed,那么将容器切换到应用程序seed,并且执行带有sync子句的alter pluggable database语句来同步应用程序seed。同步使用应用程序root来实例化应用程序seed中的一个或多个应用程序root的应用程序。

5.b 如果使用应用程序root中创建应用程序seed,那么将容器切换到应用程序seed,然后执行pdb_to_apppdb.sql脚本来将应用程序root转换为应用程序PDB。

当通过克隆一个应用程序PDB来创建应用程序seed时这些操作不需要执行。

6.关闭应用程序seed,然后以只读模式来打开它。

7.备份应用程序seed。

使用CDB seed来创建应用程序seed
这个例子假设满足以下条件:
.应用程序seed将被创建在名为salesact的应用程序容器中。

.对应用程序seed不使用存储限制,因此不指定storage子句。

.应用程序seed不创建缺省表空间。

.不指定path_prefix子句。

.不指定file_name_convert与create_file_dest子句。可以对CDB启用OMF或设置pdb_file_name_convert初始化参数。与CDB相关的文件将会基于OMF配置或参数设置被复制到新目录中。

.在目标目录中没有与新temp文件同名的文件存在,将会创建新的temp文件,因此不用指定tempfile reuse子句。

.不需要预先定义Oracle角色被授予给pdb_dba角色。

执行的语句如下:
先切换到应用程序容器salesact中

SQL> alter session set container=salesact;

Session altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE

执行语句来使用CDB seed来在应用程序容器salesact中创建应用程序seed,并打开应用程序seed。

SQL> create pluggable database as seed admin user actseedadm identified by "xxzx7817600";

Pluggable database created.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESACT$SEED                                                                                                                    MOUNTED

SQL> alter pluggable database salesact$seed open;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESACT$SEED                                                                                                                    READ WRITE

切换容器到应用程序seed(salesact$SEED)中,使用应用程序root中的所有应用程序来同步应用程序seed。

SQL> alter session set container=salesact$seed;

Session altered.

SQL>  select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT$SEED                                                                                                                    READ WRITE

SQL> alter pluggable database application all sync;

Pluggable database altered.

关闭应用程序seed(salesact$seed),然后以只读模式来打开应用程序seed。

SQL> alter pluggable database close immediate;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT$SEED                                                                                                                    MOUNTED

SQL> alter pluggable database  open read only;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT$SEED                                                                                                                    READ ONLY

因为应用程序容器名为salesact,所以应用程序seed名为salesact$seed。在创建应用程序seed时一起创建了一个本地管理用户并且被授予了pdb_dba公共角色。如果这个用户在创建应用程序seed时没有授予管理权限,那么使用sys与system公共用户来管理应用程序seed。当创建应用程序seed时,将使用应用程序root来同步应用程序seed。因此应用程序seed将包含安装在应用程序root中的应用程序与应用程序公共对象它们是这些应用程序的一部分。当使用应用程序seed来创建新的应用程序PDB时,应用程序PDB也会包含这些安装的应用程序与应用程序公共对象。

使用应用程序PDB创建应用程序seed
这个例子假设满足以下条件:
.在应用程序容器salesact中创建了应用程序seed。

.将在应用程序PBD(salesapppdb)所在的应用程序容器中创建应用程序seed。

.对应用程序seed不使用存储限制,因此不指定storage子句。

.应用程序seed不包含缺省表空间。

.不指定path_prefix子句。

.不指定file_name_convert与create_file_dest子句。可以启用OMF或设置pdb_file_name_convert初始化参数。与应用程序root相关的文件会基于OMF的配置或初始化参数设置被复制到新目录中。

.在目标目录中没有与新temp文件同名的文件存在,因此不需要使用tempfile reuse子句。

切换容器到应用程序容器(salesact),并执行以下命令来创建应用程序seed。

SQL> create pluggable database as seed from salesapppdb;

Pluggable database created.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE
SALESACT$SEED                                                                                                                    MOUNTED

然后打开应用程序seed,再关闭应用程序seed,最后再以只读方式打开应用程序seed。

SQL> alter pluggable database salesact$seed open;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE
SALESACT$SEED                                                                                                                    READ WRITE

SQL> alter pluggable database salesact$seed close immediate;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE
SALESACT$SEED                                                                                                                    MOUNTED

SQL> alter pluggable database salesact$seed open read only;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE
SALESACT$SEED                                                                                                                    READ ONLY

因为应用程序容器名为salesact,所以应用程序seed名字默认为salesact$seed。应用程序seed是使用应用程序pdb而创建的,因此应用程序seed就包含了安装在应用程序root中的应用程序与应用程序公共对象,它们是这些应用程序的一部分。当使用应用程序seed来创建新的应用程序pdb时,应用程序pdb也会包含安装的应用程序与应用程序公共对象。

使用应用程序root来创建应用程序seed
这个例子假设满足以下条件:
.应用程序seed将创建在应用程序容器(salesact)中。应用程序seed使用对应用程序容器的root进行克隆进行创建。

.对应用程序seed不使用存储限制,因此不使用storage子句。

.应用程序seed不包含缺省表空间。

.不使用path_prefix子句。

.不使用file_name_convert与create_file_dest子句。可以启用OMF或设置pdb_file_name_convert初始化参数。基于OMF配置或初始化参数的设置与应用程序root相关的文件会被复制到新目录中。

.在目标目录中没有与新temp文件同名的文件存在,因此不需要使用tempfile reuse子句。

切换到应用程序容器(salesact)中,执行下面的命令来创建应用程序seed。

SQL> create pluggable database as seed from salesact;

Pluggable database created.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESACT$SEED                                                                                                                    MOUNTED
SALESAPPPDB                                                                                                                      READ WRITE

打开应用程序seed,切换容器到应用程序seed,然后执行pdb_to_apppdb.sql脚本将应用程序root转换为应用程序pdb。

SQL> alter pluggable database salesact$seed open;

Warning: PDB altered with errors.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESACT$SEED                                                                                                                    READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE

SQL> alter session set container=salesact$seed;

Session altered.

SQL> @$ORACLE_HOME/rdbms/admin/pdb_to_apppdb.sql

...
SQL> BEGIN
  2    execute immediate '&open_sql &restricted_state';
  3  EXCEPTION
  4    WHEN OTHERS THEN
  5    BEGIN
  6      IF (sqlcode <> -900) THEN
  7        RAISE;
  8      END IF;
  9    END;
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL> 
SQL> WHENEVER SQLERROR CONTINUE;



SQL> alter pluggable database close immediate instances=all;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT$SEED                                                                                                                    MOUNTED

1 row selected.

SQL> alter pluggable database open read only instances=all;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT$SEED                                                                                                                    READ ONLY

1 row selected.

因为应用程序容器名为salesact,所以应用程序seed名为salesact$seed。应用程序seed是使用应用程序root进行创建的。因此应用程序seed包含安装在应用程序root中的应用程序与应用程序公共对象,它们是这些应用程序的一部分。当使用应用程序seed来创建新应用程序PDB时,应用程序pdb也会包含安装的应用程序与应用程序公共对象。

从应用程序容器中拔出应用程序seed
拔出应用程序seed就是断开应用程序seed与应用程序容器的关联。当不再需要应用程序seed时可以将其删除。拔出应用程序seed类似于拔出PDB。为了拔出应用程序seed,连接到它的应用程序root并使用alter pluggable database语句来指定生成xml文件或.pdb文件。当指定xml文件后,在卸载完成后生成的xml文件会包含描述应用程序seed的元数据。

SQL> alter pluggable database salesact$seed close immediate instances=all;

Pluggable database altered.



SQL>  select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESACT$SEED                                                                                                                    MOUNTED
SALESAPPPDB                                                                                                                      READ WRITE

3 rows selected.



SQL> alter pluggable database salesact$seed unplug into '/tts/plug/salesact_seed.xml';

Pluggable database altered.

删除应用程序seed
当不再需要应用程序seed时,可以执行drop pluggable database语句来删除。当删除应用程序seed时,CDB的控制文件会被修改来删除与被删除应用程序seed的所有相关信息,但是归档重做日志与备份不会被删除,但可以使用RMAN来删除它们。

SQL> drop pluggable database salesapppdb including datafiles;

Pluggable database dropped.

创建应用程序PDB
可以在应用程序root容器中执行create pluggable database语句来创建应用程序PDB。创建应用程序pdb与在CDB root中创建PDB都是使用相同的SQL语句。当在应用程序root中执行create pluggable database语句时新创建的PDB为应用程序PDB。SQL语句必须在应用程序root中执行并且对应用程序root中所定义的应用程序数据库有显式依赖性。创建应用程序PDB的操作如下:

1.在SQL*Plus中,确保当前容器为应用程序root

2.执行create pluggable database语句。在应用程序PDB完成创建之后,它处于mounted模式并且状态为NEW。可以通过查询v$pdbs视图的open_mode列来查看应用程序pdb的打开模式,可以通过查询cdb_pdbs或dba_pdbs视图的status列来查看应用程序pdb的状态。对于新创建的应用程序PDB也会创建一个缺省的服务名,服务名与应用程序PDB同名并且可以被用来访问应用程序PDB。

3.以读写模式来打开应用程序PDB

4.为了将新的应用程序PDB集成到应用程序容器必须以读写模式来打开新的应用程序PDB。如果试图以只读模式来打开应用程序PDB将会返回错误信息。在应用程序PDB以读写模式打开后它的状态将变为NORMAL。

5.切换容器为应用程序PDB

6.执行alter pluggable database … sync来同步应用程序PDB。同步使用应用程序PDB来实例化应用程序PDB中的一个或多个应用程序root中的应用程序。

7.关闭应用程序PDB,然后以只读模式打开。

8.备份应用程序PDB。

SQL> alter session set container=salesact;

Session altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE

1 row selected.



SQL> create pluggable database salesapppdb admin user salesapppdbadm identified by "xxzx7817600";

Pluggable database created.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      MOUNTED

2 rows selected.

SQL> alter pluggable database salesapppdb open read write instances=all;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESACT                                                                                                                         READ WRITE
SALESAPPPDB                                                                                                                      READ WRITE

2 rows selected.

SQL> alter session set container=salesapppdb;

Session altered.


SQL> alter pluggable database application all sync; 

Pluggable database altered.

SQL> alter pluggable database salesapppdb close immediate instances=all;

Pluggable database altered.

SQL>  select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESAPPPDB                                                                                                                      MOUNTED

1 row selected.

SQL> alter pluggable database salesapppdb open read only instances=all;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME                                                                                                                             OPEN_MODE
-------------------------------------------------------------------------------------------------------------------------------- ----------
SALESAPPPDB                                                                                                                      READ ONLY

1 row selected.

发表评论

电子邮件地址不会被公开。