# 1.连接到多租户容器数据库cdb2。 sqlplus /as sysdba # a.检查数据库是否为多租户容器数据库。 SELECT name, cdb, con_id from v$database; # b.检查实例名称 SELECT INSTANCE_NAME, STATUS, CON_ID from v$instance; # 2.探索服务。 # a.检查服务。 lsnrctl status # b.列出为每个容器自动创建的服务。 sqlplus /as sysdba col name format A20 SELECT name, con_id from v$services; # 请注意,未列出PDB$SEED服务。没有用户应连接到该服务,因为在此容器上不应执行任何操作。它保留作为创建其他PDB的模板。 # 3.使用新视图V$PDBS显示可插拔数据库。 SELECT CON_ID, NAME, OPEN_MODE from v$pdbs; # 4.查看新视图CDB_xxx: col PDB_NAME format a8 col CON_ID format 999999 SELECT PDB_ID, PDB_NAME, DBID, GUID, CON_ID from cdb_pdbs orderby1; # 5.检查CDB的所有文件。 # a.查看CDB的重做日志文件。 col MEMBER format A42 SELECTGROUP#, MEMBER, CON_ID from v$logfile; # b.查看CDB的控制文件。 col name format A55 SELECT name, con_id from v$controlfile; # c.使用以下命令查看CDB的所有数据文件,包括根目录和所有PDB的数据文件: col file_name format A65 SELECT FILE_NAME, TABLESPACE_NAME, FILE_ID, con_id from cdb_data_files orderby con_id ; # d.确保您仍连接到根目录;然后使用DBA_DATA_FILES视图。 col file_name format A42 col tablespace_name format A10 SELECT FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_data_files;
# g.连接到pdb1_1的CDB1和使用DBA_DATA_FILES查看。 sqlplus system/oracle_4U@pdb1_1 col file_name format A65 SELECT FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_data_files;
# h.现在使用V$TABLESPACE和V$DATAFILE视图。 col NAME format A12 SELECT FILE#, ts.name, ts.ts#, ts.con_id from v$datafile d, v$tablespace ts where d.ts#=ts.ts# and d.con_id=ts.con_id orderby4;
# i.列出cdb1和cdb2的密码文件和SPFILE 。 SELECT FILE_NAME, TABLESPACE_NAME from dba_temp_files;
# j.列出cdb1和cdb2的密码文件和SPFILE 。 cd $ORACLE_HOME/dbs ls -l orapw* spfile*
# k.在alert.log中检查ADR文件,目录,新的DDL语句。 cd $ORACLE_BASE/diag/rdbms/ ls cd cdb2/cdb2/trace less alert_cdb2.log
# 6.列出在新CDB cdb2中创建的所有用户。 # a.连接到cdb2实例。 sqlplus /as sysdba # b.验证是否创建了SYSTEM用户。 col username format A30 select username, common, con_id from cdb_users where username ='SYSTEM'; # 请注意,用户SYSTEM作为普通用户存在于所有容器中。 # c.列出CDB中的所有普通用户。 selectdistinct username from cdb_users where common ='YES'; # d.列出CDB中的所有本地用户 selectdistinct username, CON_ID from cdb_users where common ='NO'; # e.以root身份列出本地用户。 selectdistinct username from dba_users where common ='NO'; # 请注意,根容器中没有本地用户,因为不可能在根中创建任何本地用户。 # 7.查看不同容器对单个SGA的不同访问。 selectdistinct status, con_id from v_$bh orderby2 ;
# 3.检查pdb2_1的打开模式。 col con_id format 999 col name format A10 select con_id, NAME, OPEN_MODE,DBID, CON_UID from V$PDBS;
# 4.打开pdb2_1。 alter pluggable database pdb2_1 open; EXIT netca sqlplus sys/oracle_4U@pdb2_1 AS SYSDBA # 5.该服务现在可用并已在侦听器中注册。 !lsnrctl status
# 6. 使用EasyConnect 以sys用户身份然后以pdb2_1_admin用户身份连接到 pdb2_1。 CONNECT sys/oracle_4U@localhost:1521/pdb2_1 AS SYSDBA connect pdb2_1_admin/oracle_4U@PDB2_1 show con_name
# 7.列出创建的数据文件。 !ls -l $ORACLE_BASE/oradata/cdb2/pdb2_1/* # 8.使用视图检查服务,数据文件和表空间。 connect system/oracle_4U@pdb2_1 col name format A30 select name from v$services; col file_name format A50 col tablespace_name format A8 col file_id format 99 col con_id format 9 select FILE_NAME, TABLESPACE_NAME, FILE_ID, con_id from cdb_data_files order by con_id ; select FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_data_files; col file_name format A60 select FILE_NAME, TABLESPACE_NAME, FILE_ID from cdb_temp_files; select FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_temp_files; # 9.为了能够查看CDB中所有容器的所有对象,请连接到根目录并使用CDB_XXX connect / as sysdba show con_name select name from v$services; select FILE_NAME, TABLESPACE_NAME, FILE_ID, con_id from cdb_data_files order by con_id, file_id ; select FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_data_files; select FILE_NAME, TABLESPACE_NAME, FILE_ID from cdb_temp_files; select FILE_NAME, TABLESPACE_NAME, FILE_ID from dba_temp_files; EXIT
删除pdb2_1
sqlplus /AS SYSDBA ALTER PLUGGABLE DATABASE pdb2_1 CLOSE IMMEDIATE; DROP PLUGGABLE DATABASE pdb2_1 INCLUDING DATAFILES; EXIT rm -r $ORACLE_BASE/oradata/cdb2/pdb2_1
SET SERVEROUTPUT ON SET FEEDBACK 1 SET NUMWIDTH 10 SET LINESIZE 80 SET TRIMSPOOL ON SET TAB OFF SET PAGESIZE 100
SELECT pdb_name, status FROM cdb_pdbs; # 转换完成后,打开PDB并退出会话。 alter pluggable database pdb_orcl2 open; EXIT
# 4.连接到PDB_ORCL2。 sqlplus sys/oracle_4U@localhost:1521/PDB_ORCL2 as SYSDBA
# 5.验证应用程序数据是否在PDB pdb_orcl2中 selectcount(empno) from scott.emp; EXIT
练习3-6:将CDB的所有PDB合并为一个CDB
总览
在实践中,您将cdb1的所有PDB合并到单个CDB cdb2中。
将cdb1的所有PDB合并到cdb2中。
删除cdb1。
假设条件
CDB cdb2存在。该cdb2创建以来,在实践中3-1成功完成。
任务
# 1. 连接到多租户容器数据库cdb1,以拔出所有PDB。 # a.以具有ALTER PLUGGABLE DATABASE特权的普通用户身份连接到cdb1 root,以拔出pdb1_1。如果pdb1_1仍处于READ WRITE模式,请关闭PDB。在CDB_PDBS视图中拔出PDB时,请验证其状态。 sqlplus /as sysdba select name, open_mode from v$pdbs; alter pluggable database PDB1_1 close immediate; alter pluggable database PDB1_1 unplug into'xmlfilePDB1_1.xml'; col PDB_NAME format A20 select PDB_NAME, STATUS from CDB_PDBS where PDB_NAME='PDB1_1'; drop pluggable database PDB1_1 KEEP DATAFILES; EXIT
# b.DBMS_PDB.CHECK_PLUG_COMPATIBILITY用于检查pdb1_1与兼容cdb2的兼容性。 # 以具有CREATE PLUGGABLE DATABASE特权的普通用户身份连接到cdb2 root,以插入pdb1_1。 SET SERVEROUTPUT ON DECLARE compat BOOLEAN :=FALSE; BEGIN compat := DBMS_PDB.CHECK_PLUG_COMPATIBILITY( pdb_descr_file =>'/u01/app/oracle/product/12.1.0/dbhome_1/dbs/xmlfilePDB1_1.xml', pdb_name =>'pdb1_1'); if compat then DBMS_OUTPUT.PUT_LINE('Is pluggable compatible? YES'); else DBMS_OUTPUT.PUT_LINE('Is pluggable compatible? NO'); end if; end; /
# c.如果返回的值为“是”,则可以立即进入步骤d。 # 如果返回的值为NO,请检查PDB_PLUG_IN_VIOLATIONS视图以查看为什么它不兼容。 select message, action from pdb_plug_in_violations where name='PDB1_1';