Oracle Study之案例--异构平台传输表空间(Linux至AIX)

系统架构

Oracle Study之案例--异构平台传输表空间(Linux至AIX)_第1张图片可        


                  源    库               目标库
操作系统 Linux RH6    AIX 5.3-09
主机名 rh6(192.168.8.245) aix211(192.168.8.211)
数据版本 Oracle 11gR2 Oracle 11gR2
数据库名 prod orcl
表空间 test1 test1   

可传输表空间概述

        Oracle 的可传输表空间特性通过将 元数据和数据文件 简单地从一个数据库移动到另一个数据库,提供 在数据库之间有效移动大数据的一种简易方法。代替重新创建对象,可移植表空间可以让 毫不费力地移动大对象,而所花费的时间是你手动创建这些对象的时间。 可移植表空间包括将属于源数据库的所有数据文件拷贝到目标数据库,并将关于表空间 数据目录信息从源数据库拷贝到目标数据库。因此,数据泵取导出和导入实用程序是可移 表空间特性的一部分。还可以传送属于表的索引表空间,使整个数据移植非常地快。

可移植表空间的应用场景 : 
把数据从源数据库移动到数据仓库 
把数据从升级数据库移动到数据集
把数据从数据仓库移动到数据集
执行表空间时间点恢复 (PITR) 

归档历史数据

        然而,在 Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 — 例如,您不能在 Solaris 和 HP-UX 平台之间传输表空间。
在Oracle 数据库 10g 中,这个局限消失了。

数据文件所以不能跨平台,主要是由于不同平台的字节顺序不同,这是计算机领域由来已久的问题之一,在各种计算机体系结构中,由于对于字、字节等的存储机制有所不同,通信双方交流的信息单元(比特、字节、字、双字等)应该以什么样的顺序进行传送就成了一个问题,如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。
        目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian 。
       一些操作系统(包括Windows)在低位内存地址中存放二进制数据的最低有效字节,因此这种系统被称为Little Endian;一些操作系统(包括Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为Big Endian。
举一个简单点的例子,假如1122这样一个数据要存入不同系统,对于Little Endian的系统,存储的顺序就是2211,小头在前;而对于Big Endian的系统来说,存储顺序就是1122,大头在前,显然Big Endian更符合我们通常的语言习惯。
那么跨平台的问题就出现了,当一个Little Endian的系统试图从一个Big Endian的系统中读取数据时,就需要通过转换,否则不同的字节顺序将导致数据不能被正确读取。

1、查看操作系统字节顺序

SQL> col PLATFORM_NAME for a50

SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME

PLATFORM_ID PLATFORM_NAME                                      ENDIAN_FORMAT
----------- -------------------------------------------------- --------------
          6 AIX-Based Systems (64-bit)                         Big
         16 Apple Mac OS                                       Big
         21 Apple Mac OS (x86-64)                              Little
         19 HP IA Open VMS                                     Little
         15 HP Open VMS                                        Little
          5 HP Tru64 UNIX                                      Little
          3 HP-UX (64-bit)                                     Big
          4 HP-UX IA (64-bit)                                  Big
         18 IBM Power Based Linux                              Big
          9 IBM zSeries Based Linux                            Big
         10 Linux IA (32-bit)                                  Little
PLATFORM_ID PLATFORM_NAME                                      ENDIAN_FORMAT
----------- -------------------------------------------------- --------------
         11 Linux IA (64-bit)                                  Little
         13 Linux x86 64-bit                                   Little
          7 Microsoft Windows IA (32-bit)                      Little
          8 Microsoft Windows IA (64-bit)                      Little
         12 Microsoft Windows x86 64-bit                       Little
         17 Solaris Operating System (x86)                     Little
         20 Solaris Operating System (x86-64)                  Little
          1 Solaris[tm] OE (32-bit)                            Big
          2 Solaris[tm] OE (64-bit)                            Big
20 rows selected.

本案例从Linux系统传输到AIX系统,需要进行转换!

传输表空间的简要操作步骤

1) 确定平台的 Endian 格式 
2) 确保表空间为自包含并使其只读(如果利用rman操作,可不用将表空间至于只读)
3) 用 exp、expdp等实用程序导出元数据 
4) 转换数据文件以匹配 Endian 格式 ( 若一致可跳过)

5) 拷贝文件到目标系统
6) 使用 imp、impdp导入实用程序导入元数据

2、查看数据库信息

源库:(Linux)

数据库版本:
09:42:59 SYS@ prod >select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

11:35:13 SYS@ prod >select name,dbid from v$database;
NAME            DBID
--------- ----------
PROD       219724276

11:35:32 SYS@ prod >col file_name for a50
11:35:54 SYS@ prod >select file_id,file_name,tablespace_name from dba_data_files;
FILE_ID FILE_NAME                                          TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
         4 /u01/app/oracle/oradata/prod/users01.dbf           USERS
         3 /u01/app/oracle/oradata/prod/undotbs01.dbf         UNDOTBS1
         2 /u01/app/oracle/oradata/prod/sysaux01.dbf          SYSAUX
         1 /u01/app/oracle/oradata/prod/system01.dbf          SYSTEM
         5 /u01/app/oracle/oradata/prod/example01.dbf         EXAMPLE
         6 /u01/app/oracle/oradata/prod/users02.dbf           USERS
         7 /u01/app/oracle/oradata/prod/catatbs1.dbf          CATATBS
         8 /u01/app/oracle/oradata/prod/perfertbs1.dbf        PERFERTBS
         9 /u01/app/oracle/oradata/prod/oggtbs1.dbf           OGG_TBS
        10 /u01/app/oracle/oradata/prod/test1.dbf             TEST1
10 rows selected.

test1表空间用于传输:
11:40:34 SCOTT@ prod >create table emp2 tablespace test1 as select * from emp;
Table created.

在test1表空间建立对象用于测试:
11:40:54 SCOTT@ prod >alter table emp2 add constraint pk_emp2 primary key (empno);
Table altered.

11:41:18 SCOTT@ prod >select count(*) from emp2;
  COUNT(*)
----------
        14
Elapsed: 00:00:00.01

操作系统信息:

11:42:52 SYS@ prod >SELECT d.PLATFORM_NAME, ENDIAN_FORMAT

11:43:25   2       FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d

11:43:25   3       WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_NAME                                                                                         ENDIAN_FORMAT
----------------------------------------------------------------------------------------------------- --------------
Linux IA (32-bit)                                                                                     Little

数据库字符集:

11:43:26 SYS@ prod >select userenv('LANGUAGE') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK


目标库:(AIX)

数据库信息:

数据库版本:
SQL> set linesize 120
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> select name,dbid from v$database;
NAME            DBID
--------- ----------
CUUG      1340865938

SQL> col file_name for a50
SQL> select file_id,file_name,tablespace_name from dba_data_files;
   FILE_ID FILE_NAME                                          TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
         4 /u01/app/oracle/oradata/cuug/users01.dbf           USERS
         3 /u01/app/oracle/oradata/cuug/undotbs01.dbf         UNDOTBS1
         2 /u01/app/oracle/oradata/cuug/sysaux01.dbf          SYSAUX
         1 /u01/app/oracle/oradata/cuug/system01.dbf          SYSTEM
         5 /u01/app/oracle/oradata/cuug/example01.dbf         EXAMPLE

主机操作系统信息:

SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
  2       FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
  3       WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
PLATFORM_NAME                                      ENDIAN_FORMAT
-------------------------------------------------- --------------
AIX-Based Systems (64-bit)                         Big

数据库字符集:

SQL> select userenv('LANGUAGE') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

3、传输之前检查表空间自包含

11:46:45 SYS@ prod >EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TEST1',true);
PL/SQL procedure successfully completed.
Elapsed: 00:00:39.30
11:47:43 SYS@ prod >SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
------------------------------------------------------------------------------------------------------------------------
ORA-39908: Index SCOTT.PK_EMP2 in tablespace USERS enforces primary constraints  of table SCOTT.EMP2 in tablespace TEST1

由于EMP2主键建立的索引在users表空间,所以导致test1表空间不能自包含,将索引rebuild到test1表空间

11:47:46 SYS@ prod >conn scott/tiger
Connected.
11:48:09 SCOTT@ prod >select index_name,table_name,tablespace_name from user_indexes
11:48:37   2   where index_name='PK_EMP2';
INDEX_NAME                     TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
PK_EMP2                        EMP2                           USERS

11:48:47 SCOTT@ prod >alter index pk_emp2 rebuild tablespace test1;
Index altered.

11:49:24 SCOTT@ prod >select index_name,table_name,tablespace_name from user_indexes
11:49:32   2   where index_name='PK_EMP2';
INDEX_NAME                     TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
PK_EMP2                        EMP2                           TEST1
Elapsed: 00:00:00.00

重新检查,解决自包含
11:49:56 SYS@ prod >EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TEST1',true);
PL/SQL procedure successfully completed.
Elapsed: 00:00:36.44
11:50:41 SYS@ prod >SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

4、导出传输表空间(test1)

设置test1为read only模式:
11:50:48 SYS@ prod >alter tablespace test1 read only;
Tablespace altered.

建立导出目录:
11:53:16 SYS@ prod >create directory dump_dir as '/home/oracle/data';
Directory created.

11:54:20 SYS@ prod >grant read ,write on directory dump_dir to public;
Grant succeeded.

导出表空间元数据:
[oracle@rh6 data]$ expdp system dumpfile=expdat.dmp directory=dump_dir  transport_full_check=y logfile=tbs.log transport_tablespaces=test1
Export: Release 11.2.0.1.0 - Production on Tue Sep 30 13:25:58 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Password:
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "transport_tablespace=TRUE" Location: Command Line, Replaced with: "transport_tablespaces=test1"
Legacy Mode has set reuse_dumpfiles=true parameter.
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdat.dmp directory=dump_dir transport_full_check=y logfile=tbs.log reuse_dumpfiles=true
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
  /home/oracle/data/expdat.dmp
******************************************************************************
Datafiles required for transportable tablespace TEST1:
  /u01/app/oracle/oradata/prod/test1.dbf
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 13:27:04

查看导出文件:

[oracle@rh6 data]$ ls -lh
total 116K
-rw-r----- 1 oracle oinstall 112K Sep 30 12:01 expdat.dmp
-rw-r--r-- 1 oracle oinstall 1.4K Sep 30 12:01 tbs.log

在源端转换数据文件(RMAN)

[oracle@rh6 data]$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Tue Sep 30 12:02:27 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
connected to target database: PROD (DBID=219724276)

RMAN> convert tablespace test1
2> to platform 'AIX-Based Systems (64-bit)'
3> format '/home/oracle/data/test1_%s.dbf';

Starting conversion at source at 30-SEP-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=46 device type=DISK
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00010 name=/u01/app/oracle/oradata/prod/test1.dbf
converted datafile=/home/oracle/data/test1_2.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
Finished conversion at source at 30-SEP-14

在目标库建立导入目录:

SQL> create directory dump_dir as '/home/oracle/data';
Directory created.
SQL> grant read,write on directory dump_dir to public;
Grant succeeded.
SQL> r
  1* select * from dba_directories
OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------
SYS                            ORACLE_OCM_CONFIG_DIR          /u01/app/oracle/product/11.2.0/db_1/ccr/state
SYS                            DATA_PUMP_DIR                  /u01/app/oracle/admin/cuug/dpdump/
SYS                            MEDIA_DIR                      /u01/app/oracle/product/11.2.0/db_1/demo/schema/pr
                                                              oduct_media/
SYS                            XMLDIR                         /ade/b/3705469564/oracle/rdbms/xml
SYS                            DATA_FILE_DIR                  /u01/app/oracle/product/11.2.0/db_1/demo/schema/sa
                                                              les_history/
SYS                            LOG_FILE_DIR                   /u01/app/oracle/product/11.2.0/db_1/demo/schema/lo
                                                              g/
OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------
SYS                            SS_OE_XMLDIR                   /u01/app/oracle/product/11.2.0/db_1/demo/schema/or
                                                              der_entry/
SYS                            SUBDIR                         /u01/app/oracle/product/11.2.0/db_1/demo/schema/or
                                                              der_entry//2002/Sep
SYS                            DUMP_DIR                       /home/oracle/data
9 rows selected.

5、传输dmp文件和转换后数据文件到目标库

[oracle@rh6 data]$ ftp 192.168.8.211         ;;以二进制方式上传
Connected to 192.168.8.211 (192.168.8.211).
220 aix211 FTP server (Version 4.2 Wed Apr 2 15:38:27 CDT 2008) ready.
Name (192.168.8.211:oracle): oracle
331 Password required for oracle.
Password:
230-Last unsuccessful login: Tue Sep 30 10:02:26 2014 on /dev/pts/1 from 192.168.8.22
230-Last login: Tue Sep 30 14:13:31 2014 on /dev/pts/1 from 192.168.8.22
230 User oracle logged in.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> bin
200 Type set to I.
ftp> mput /home/oracle/data/*.dmp
mput /home/oracle/data/expdat.dmp? y
227 Entering Passive Mode (192,168,8,211,139,18)
150 Opening data connection for /home/oracle/data/expdat.dmp.
226 Transfer complete.
114688 bytes sent in 0.0466 secs (2461.86 Kbytes/sec)
ftp> mput test1*
mput test1_2.dbf? y
227 Entering Passive Mode (192,168,8,211,139,21)
150 Opening data connection for /home/oracle/data/test1_2.dbf.
226 Transfer complete.
10493952 bytes sent in 2.52 secs (4168.10 Kbytes/sec)
ftp> quit
221 Goodbye.

目标库查看文件:

[oracle@aix211 data]$ls -l
total 20720
-rw-r-----    1 oracle   oinstall   10493952 Sep 30 14:30 test2.dbf
-rw-r-----    1 oracle   oinstall     114688 Sep 30 14:30 expdat.dmp


6、目标库转换数据文件并导入表空间

转换数据文件:

RMAN> convert datafile
2>  '/home/oracle/data/test1_2.dbf'
3>  db_file_name_convert=
4>  '/home/oracle/data/test1_2.dbf','/u01/app/oracle/oradata/cuug/test1.dbf';
Starting conversion at target at 30-SEP-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input file name=/home/oracle/data/test1_2.dbf
converted datafile=/u01/app/oracle/oradata/cuug/test1.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Finished conversion at target at 30-SEP-14

导入表空间:

[oracle@aix211 data]$impdp userid=\'sys/oracle as sysdba\' dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/u01/app/oracle/oradata/cuug/test1.dbf  logfile=test.log

Import: Release 11.2.0.1.0 - Production on Tue Sep 30 16:14:32 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_TRANSPORTABLE_01":  userid="sys/******** AS SYSDBA" dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/u01/app/oracle/oradata/cuug/test1.dbf logfile=test.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 16:14:41

7、查看目标库传输结果

查看表空间及数据文件:
SQL> set linesize 120
SQL> r
  1* select file_id,file_name,tablespace_name from dba_data_files
   FILE_ID FILE_NAME                                          TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
         4 /u01/app/oracle/oradata/cuug/users01.dbf           USERS
         3 /u01/app/oracle/oradata/cuug/undotbs01.dbf         UNDOTBS1
         2 /u01/app/oracle/oradata/cuug/sysaux01.dbf          SYSAUX
         1 /u01/app/oracle/oradata/cuug/system01.dbf          SYSTEM
         5 /u01/app/oracle/oradata/cuug/example01.dbf         EXAMPLE
         6 /u01/app/oracle/oradata/cuug/test1.dbf             TEST1
6 rows selected.

查看导入对象:
SQL> conn scott/tiger
Connected.
SQL> select * from emp2;
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
14 rows selected.

SQL> select table_name,tablespace_name from user_tables
  2   where table_name='EMP2';
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
EMP2                           TEST1

设置表空间到read write:
14:55:32 SYS@ prod >alter tablespace test1 read write;
Tablespace altered.

SQL> alter tablespace test1 read write;
Tablespace altered.

@至此,跨平台表空间传输成功!