您的位置:首页 > 数据库 > Oracle

oracle技术之oracle数据泵不同工作方式性能比较(一)

2013-05-27 10:23 387 查看
根据Oracle的文档的描述,数据泵采用不同的方式导出导入,性能也会有明显的差别,这次正好有机会测试一下,迁移表空间、直接路径、外部表方式,以及数据库链方式导出、导入的性能差异。

这篇介绍一下测试环境。

源数据库和目标数据库的版本都是10.2.0.3,不存在版本差异,字符集都是ZHS16GBK,国家字符集都是AL16UTF16字符集,源数据库和目标数据库都是16k的BLOCK_SIZE,因此采用迁移表空间的方式不存在任何的问题:

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME;

GLOBAL_NAME

------------------------------------------------------------------------

NEWDEMO

SQL> SELECT * FROM V$VERSION;

BANNER

----------------------------------------------------------------

Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi

PL/SQL Release 10.2.0.3.0 - Production

CORE 10.2.0.3.0 Production

TNS for Linux: Version 10.2.0.3.0 - Production

NLSRTL Version 10.2.0.3.0 - Production

SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE

2 FROM DATABASE_PROPERTIES

3 WHERE PROPERTY_NAME LIKE '%CHARACTERSET';

PROPERTY_NAME PROPERTY_VALUE

------------------------------ --------------------------------------------------

NLS_CHARACTERSET ZHS16GBK

NLS_NCHAR_CHARACTERSET AL16UTF16

SQL> SHOW PARAMETER DB_BLOCK_SIZE

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_block_size integer 16384

上面是源数据库的查询结果,目标数据库上面的查询结果完全一致,除了GLOBAL_NAME之外:

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME;

GLOBAL_NAME

----------------------------------------------------------------------------

TJSQ

SQL> SELECT * FROM V$VERSION;

BANNER

----------------------------------------------------------------

Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi

PL/SQL Release 10.2.0.3.0 - Production

CORE 10.2.0.3.0 Production

TNS for Linux: Version 10.2.0.3.0 - Production

NLSRTL Version 10.2.0.3.0 - Production

SQL>COLPROPERTY_VALUE FORMAT A50

SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE

2 FROM DATABASE_PROPERTIES

3 WHERE PROPERTY_NAME LIKE '%CHARACTERSET';

PROPERTY_NAME PROPERTY_VALUE

------------------------------ --------------------------------------------------

NLS_CHARACTERSET ZHS16GBK

NLS_NCHAR_CHARACTERSET AL16UTF16

SQL> SHOW PARAMETER DB_BLOCK_SIZE

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_block_size integer 16384

要迁移的数据分布在两个表空间中:

SQL> SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024/1024

2 FROM DBA_DATA_FILES

3 WHERE TABLESPACE_NAME LIKE 'TJ%'

4 ORDER BY 1, 2;

TABLESPACE_NAME FILE_NAME BYTES/1024/1024/1024

--------------- -------------------------------------------------- --------------------

TJSQ /data/oracle/oradata/newdemo/tjsq01.dbf 20

TJSQ /data/oracle/oradata/newdemo/tjsq02.dbf 4

TJSQ_TMP /data/oracle/oradata/newdemo/tjsq_tmp.dbf 4

数据分布在5个SCHEMA中:

SQL> SELECT OWNER, SUM(BYTES)/1024/1024/1024

2 FROM DBA_SEGMENTS

3 WHERE TABLESPACE_NAME LIKE 'TJ%'

4 GROUP BY OWNER

5 ORDER BY 2 DESC;

OWNER SUM(BYTES)/1024/1024/1024

------------------------------ -------------------------

TJSQ_TRADE 14.0916138

TJSQ_NDMAIN 8.00140381

TJSQ_NDMAIN_OPER 1.71221924

TJSQ_TRADE_OPER .194641113

TJSQ_GOV .080993652

可以看到,用户对象占用了大于24G的空间,仅比数据文件小4G,这种情况还是比较适合迁移表空间方式的,否则如果数据文件中包含了大量的空闲空间,使用迁移表空间方式效率很可能比直接数据泵导入导出效率还低。

虽然测试的数据量并不大,但是28G也可以说明一定问题了。

目标数据库使用的本地磁盘,6块300G做的RAID 1+0,IO性能肯定不会太好。局域网是百兆网络,同样也可能成为性能的瓶颈。有时候用一个普通的环境测试更能说明问题,因为如果IO不是瓶颈、网络也不是瓶颈,那么很可能几种方式的效率相差不了太多。

为了能体现数据泵的优势,显示外部表方式和直接路径效率的区别,目标数据库为非归档模式。

SQL> SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE

------------

NOARCHIVELOG

SQL> SHOW SGA

Total System Global Area 3707764736 bytes

Fixed Size 2077104 bytes

Variable Size 721423952 bytes

Database Buffers 2969567232 bytes

Redo Buffers 14696448 bytes

由于测试的方法包括数据库链直接导入的方式,而这种方式将导出、数据传递以及导入合成到一个操作中进行,因此这个测试的最终时间由导出时间、数据传递时间,以及导入时间3个部分之和构成。

最后准备目标数据库重建用户的角色和权限:

SQL> SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE || ';'

2 FROM DBA_ROLE_PRIVS

3 WHERE GRANTEE LIKE 'TJ%'

4 ORDER BY GRANTEE, GRANTED_ROLE;

'GRANT'||GRANTED_ROLE||'TO'||GRANTEE||';'

-----------------------------------------------------------------------

GRANT CONNECT TO TJSQ_GOV;

GRANT RESOURCE TO TJSQ_GOV;

GRANT CONNECT TO TJSQ_NDMAIN;

GRANT RESOURCE TO TJSQ_NDMAIN;

GRANT CONNECT TO TJSQ_NDMAIN_OPER;

GRANT RESOURCE TO TJSQ_NDMAIN_OPER;

GRANT CONNECT TO TJSQ_TRADE;

GRANT RESOURCE TO TJSQ_TRADE;

GRANT CONNECT TO TJSQ_TRADE_OPER;

GRANT RESOURCE TO TJSQ_TRADE_OPER;

10 rows selected.

SQL> SELECT 'GRANT ' || PRIVILEGE || ' TO ' || GRANTEE || ';'

2 FROM DBA_SYS_PRIVS

3 WHERE GRANTEE LIKE 'TJ%'

4 AND PRIVILEGE NOT IN

5 (SELECT PRIVILEGE FROM DBA_SYS_PRIVS

6 WHERE GRANTEE IN ('CONNECT', 'RESOURCE'))

7 ORDER BY GRANTEE;

'GRANT'||PRIVILEGE||'TO'||GRANTEE||';'

---------------------------------------------------------------------------------

GRANT CREATE SYNONYM TO TJSQ_GOV;

GRANT CREATE SYNONYM TO TJSQ_NDMAIN;

GRANT CREATE SYNONYM TO TJSQ_NDMAIN_OPER;

GRANT CREATE DATABASE LINK TO TJSQ_TRADE;

GRANT CREATE SYNONYM TO TJSQ_TRADE;

GRANT CREATE SYNONYM TO TJSQ_TRADE_OPER;

6 rows selected.

在源数据库和目标数据库上建立对应DIRECTORY:

SQL> SELECT * FROM DBA_DIRECTORIES;

OWNER DIRECTORY_NAME DIRECTORY_PATH

--------------- --------------- ----------------------------------------

SYS TRAN /data/dmp

SYS D_DMPDP /data/dmp

SYS DATA_PUMP_DIR /data/oracle/product/10.2/rdbms/log/

SQL> CREATE DIRECTORY D_DATAFILE AS '/data/oracle/oradata/newdemo';

Directory created.

目标数据库建立DIRECTORIES:

SQL> CREATE DIRECTORY D_DMP AS '/data/dmp';

Directory created.

SQL> CREATE DIRECTORY D_DATAFILE AS '/data/oracle/oradata/tjsq';

Directory created.

建立到源数据库的数据库链,数据库链方式的导出,以及利用DBMS_FILE_TRANSFER包都会用到这个数据库链:

SQL> CREATE DATABASE LINK NEWDEMO

2 CONNECT TO SYSTEM

3 IDENTIFIED BY PASSWORD

4 USING 'NEWDEMO';

Database link created.

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@NEWDEMO;

GLOBAL_NAME

------------------------------------------------------------------------------------

NEWDEMO

下面就可以准备测试了。

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息