ORACLE数据库PDB管理- unplug和plug迁移容器数据库

1 说明


  在Oracle 12c 的CDB 架构中,可以对PDB 进行unplug 和 plug。 就是把一个库从CDB 的架构拔出,然后在附加到CDB中。 那么可以利用这个特性,在2个不同的数据库之间进行数据迁移。

2 环境介绍 

源库:

SQL> select * from v$version;

BANNER                                             CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production          0
PL/SQL Release 12.1.0.2.0 - Production                              0
CORE    12.1.0.2.0    Production                                  0
TNS for Linux: Version 12.1.0.2.0 - Production                          0
NLSRTL Version 12.1.0.2.0 - Production                              0

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               READ WRITE NO
     4 CNDBA              READ WRITE NO
SQL>

目标库:

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED

3 实施目标
 

现在的操作,就是把CNDBA 这个PDB 从源库unplug 下来,然后plug 到目标库上。

4 实施步骤
 

1 在源库进行unplug 操作
 

先查看CNDBA 这个PDB数据文件的信息:

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1                  READ WRITE NO
     4 CNDBA                 READ WRITE NO
SQL> alter session set container=CNDBA;

Session altered.

SQL> select file_name from dba_data_files;

FILE_NAME
------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/dave/cndba/users.dbf
/u01/app/oracle/oradata/dave/cndba/ado1.dbf
/u01/app/oracle/oradata/dave/cndba/sysaux.dbf
/u01/app/oracle/oradata/dave/cndba/ado2.dbf
/u01/app/oracle/oradata/dave/cndba/system.dbf

关闭PDB,并unplug:
SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     4 CNDBA              READ WRITE NO
SQL> alter pluggable database cndba close;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     4 CNDBA              MOUNTED
SQL> alter pluggable database cndba unplug into '/tmp/cndba.xml';
alter pluggable database cndba unplug into '/tmp/cndba.xml'
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database


SQL> alter session set container=CDB$ROOT;

Session altered.

SQL> alter pluggable database cndba unplug into '/tmp/cndba.xml';

Pluggable database altered.

SQL> drop pluggable database cndba keep datafiles;

Pluggable database dropped.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               READ WRITE NO
SQL>



2 在目标库进行plug 操作


在目标库创建与源库相同的目录结构,当然也可以不同。

3.1     源库与目标库目录结构相同的情况

在目标库上创建目录:

[oracle@Ora12c cndba]$ pwd
/u01/app/oracle/oradata/dave/cndba
[oracle@Ora12c cndba]$ ls
[oracle@Ora12c cndba]

把源库上CNDBA 对应的所有数据文件,和含有元数据的XML 文件全部cp过去:
[oracle@Ora12c cndba]$ pwd
/u01/app/oracle/oradata/dave/cndba[oracle@Ora12c cndba]$ ls
ado1.dbf  ado2.dbf  sysaux.dbf  system.dbf  users.dbf[oracle@Ora12c cndba]$ scp * 192.168.3.40:`pwd`
[email protected]'s password:
ado1.dbf                                                                                                                   100%   50MB  50.0MB/s   00:01    
ado2.dbf                                                                                                                   100%   50MB  50.0MB/s   00:01    
sysaux.dbf                                                                                                                 100%  710MB  54.6MB/s   00:13    
system.dbf                                                                                                                 100%  810MB  57.9MB/s   00:14    
users.dbf                                                                                                                  100% 5128KB   5.0MB/s   00:00    
[oracle@Ora12c cndba]$
[oracle@Ora12c cndba]$ scp /tmp/cndba.xml 192.168.3.40:/tmp
[email protected]'s password:
cndba.xml                                                                                                                  100% 6884     6.7KB/s   00:00    
[oracle@Ora12c cndba]$


在目标库上plug:

SET SERVEROUTPUT ON
DECLARE
  l_result BOOLEAN;
BEGIN
  l_result := DBMS_PDB.check_plug_compatibility(
                pdb_descr_file => '/tmp/cndba.xml',
                pdb_name       => 'cndba');
  IF l_result THEN
    DBMS_OUTPUT.PUT_LINE('compatible');
  ELSE
    DBMS_OUTPUT.PUT_LINE('incompatible');
  END IF;
END;
/
compatible
SQL>  create pluggable database cndba using '/tmp/cndba.xml' nocopy;

Pluggable database created.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED
     4 CNDBA              MOUNTED

SQL> alter pluggable database cndba open;
Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED
     4 CNDBA              READ WRITE NO
SQL>




查看数据文件位置,并测试:

SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/dave/cndba/ado2.dbf
/u01/app/oracle/oradata/dave/cndba/ado1.dbf
/u01/app/oracle/oradata/dave/cndba/users.dbf
/u01/app/oracle/oradata/dave/cndba/sysaux.dbf
/u01/app/oracle/oradata/dave/cndba/system.dbf

SQL> create table cndba as select * from dba_data_files;

Table created.

SQL> select count(1) from cndba;

  COUNT(1)
----------
     5


3.2     源库与目标库目录结构不同的情况

先把刚plug上去的cndba 这个PDB drop 掉:

SQL> alter session set container=CDB$ROOT;
Session altered.

SQL> alter pluggable database cndba close;
Pluggable database altered.

SQL> drop pluggable database cndba including datafiles;
Pluggable database dropped.

SQL> show pdbs
    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED
SQL>


新建个目录,然后把XML 文件和数据文件复制过来:

[oracle@Ora12c cndba]# mkdir -p /u01/app/oracle/oradata/dave/cndba2[oracle@Ora12c cndba]$ scp * 192.168.3.40:/u01/app/oracle/oradata/dave/cndba2
[email protected]'s password:
ado1.dbf                                                                                                                   100%   50MB  50.0MB/s   00:01    
ado2.dbf                                                                                                                   100%   50MB  50.0MB/s   00:00    
sysaux.dbf                                                                                                                 100%  710MB  44.4MB/s   00:16    
system.dbf                                                                                                                 100%  810MB  45.0MB/s   00:18    
users.dbf                                                                                                                  100% 5128KB   5.0MB/s   00:00    
[oracle@Ora12c cndba]$



因为路径不一样,需要使用source_file_name_convert 来plug。source_file_name_convert 就是用来更改XML 文件记录的文件的位置。

官方文档对source_file_name_convert的说明:
Specify this clause only if the contents of the XML file do not accurately describe the locations of the source files. If the files that must be used to plug in the source database are no longer in the location specified in the XML file, then use this clause to map the specified file names to the actual file names.

SQL> create pluggable database cndba using '/tmp/cndba.xml' source_file_name_convert=('/u01/app/oracle/oradata/dave/cndba','/u01/app/oracle/oradata/dave/cndba2') nocopy tempfile reuse;

Pluggable database created.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED
     4 CNDBA              MOUNTED
SQL> alter pluggable database cndba open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED              READ ONLY  NO
     3 PDB1               MOUNTED
     4 CNDBA              READ WRITE NO

SQL> alter session set container=CNDBA;

Session altered.

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/dave/cndba2/ado2.dbf
/u01/app/oracle/oradata/dave/cndba2/ado1.dbf
/u01/app/oracle/oradata/dave/cndba2/users.dbf
/u01/app/oracle/oradata/dave/cndba2/sysaux.dbf
/u01/app/oracle/oradata/dave/cndba2/system.dbf


切换成功。
 


5  扩展说明



上面演示的是使用Oracle 12c 的unplug 和plug 进行数据迁移,在12c 之前的版本里,我们迁移数据,可以使用数据泵,RMAN,传输表空间,而在12c 的plug的功能,明显进一步简化了迁移的成本。

如果在库大的情况,我们可以考虑另外一种方法:
1.    Unplug db。
2.    启动plug db,到只读状态,保证部分业务。
3.    迁移到新服务器,进行plug。
4.    切换业务。

这个过程,基本是一个平滑的操作,而影响这个操作的主要因素就是带宽和IO。

在Infiniband 和 PCIE 闪存卡的硬件加速情况下,IB 每秒最高到40G,闪存卡可以支持2G的传输。 对于我们大数据量的迁移,结合12c 的plug 功能,真的是一个非常高效的方法。

之前一直提到XML 的元数据文件,其主要就是记录我们PDB的元数据,类似与传输表空间。 这样元数据我们用XML 导入,CDB 中就不用关系我们数据文件,只要XML 是正确的就可以完成迁移操作。


附录一个完成的XML 元数据文档:

[root@Ora12c cndba]# cat /tmp/cndba.xml


  1
  CNDBA
  4
  1
  202375680
  
    12.1.0.2.0
    12.1.0.2.0
    12.1.0.2.0
    0.0.0.0.22
    22
    8.0.0.0.0
  
  142169581
  0
  925913465
  144C163289BF0781E0531E02A8C0AFE3
  2558320
  0
  4194824
  
    SYSTEM
    0
    0
    1
    0
    
      /u01/app/oracle/oradata/dave/cndba/system.dbf
      22
      1
      2088055
      0
      1
      103680
      8192
      202375680
      142169581
      0
      2558316
      0
      1594143
      863031228
    
  
  
    SYSAUX
    0
    1
    1
    0
    
      /u01/app/oracle/oradata/dave/cndba/sysaux.dbf
      23
      3
      2088058
      0
      1
      90880
      8192
      202375680
      142169581
      0
      2558316
      0
      1594143
      863031228
    
  
  
    TEMP
    1
    3
    1
    0
    128
    
      /u01/app/oracle/oradata/dave/cndba/temp.dbf
      4
      1
      2088056
      0
      0
      7680
      8192
      202375680
      1
      4194302
      80
    
  
  
    USERS
    0
    4
    1
    0
    
      /u01/app/oracle/oradata/dave/cndba/users.dbf
      24
      6
      2088061
      0
      1
      640
      8192
      202375680
      142169581
      0
      2558316
      0
      1594143
      863031228
    
  
  
    ADO1
    0
    6
    1
    0
    
      /u01/app/oracle/oradata/dave/cndba/ado1.dbf
      25
      5
      2088063
      0
      1
      6400
      8192
      202375680
      142169581
      0
      2558316
      0
      1594143
      863031228
    
  
  
    ADO2
    0
    7
    1
    0
    
      /u01/app/oracle/oradata/dave/cndba/ado2.dbf
      26
      2
      2088065
      0
      1
      6400
      8192
      202375680
      142169581
      0
      2558316
      0
      1594143
      863031228
    
  
  
    0
    852
    2000
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    0
    0
    4.2.5.00.08:1
    
      processes=300
      memory_target=1627389952
      db_block_size=8192
      compatible='12.1.0.2.0'
      enable_pluggable_database=TRUE
      *.heat_map='ON'
      *.open_cursors=300
    
    
      PSU bundle patch 4 (Database Patch Set Update : 12.1.0.2.4 (20831110)): APPLY SUCCESS
    
    
      primary version:18
      secondary version:0
    
    0
    
      cndbaXDB,cndbaXDB
    
    
      19769480
      20299023
      20831110
    
    1
    
      CPU Usage Per Sec=0.000000
      DB Block Changes Per Sec=0.000000
      Database Time Per Sec=0.000000
      Executions Per Sec=0.000000
      Hard Parse Count Per Sec=0.000000
      Logical Reads Per Sec=0.000000
      Logons Per Sec=0.000000
      Physical Reads Per Sec=0.000000
      Physical Writes Per Sec=0.000000
      Redo Generated Per Sec=0.000000
      Total Parse Count Per Sec=0.000000
      User Calls Per Sec=0.000000
      User Rollbacks Per Sec=0.000000
      User Transaction Per Sec=0.000000
    
    0
  
[root@Ora12c cndba]#

你可能感兴趣的:(ORACLE数据库pdb管理,oracle)