資料泵不同工作方式效能比較(一)
根據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 Database 10g Enterprise Edition Release 10.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 Database 10g Enterprise Edition Release 10.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> COL PROPERTY_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
下面就可以準備測試了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-626197/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 效能比較
- 如何比較兩個資料庫表結構的不同資料庫
- Linux 比較不同命令Linux
- Dapper, Ef core, Freesql 插入大量資料效能比較(二)APPSQL
- 不同解決方案的比較
- 主流資料庫比較資料庫
- 圖資料庫比較資料庫
- 大資料入門課程:Hadoop和spark的效能比較大資料HadoopSpark
- python 批量resize效能比較Python
- difflib: Python 比較資料集Python
- HHDESK資料夾比較功能
- AWS Graviton2上資料壓縮演算法效能比較演算法
- 通過append hint來插入資料,演示它和普通插入資料的效能比較。APP
- 請比較下for、forEach、for of的效能的效能
- 一頓騷操作版本號比較效能提升300%
- javascript訪問不同物件的速度比較JavaScript物件
- 關於 PHP 不同資料型別在比較時該如何轉化問題PHP資料型別
- Java中List集合效能比較Java
- 排序演算法效能比較排序演算法
- 77種資料建模工具比較
- 殺停資料泵
- IocPerformance 常見IOC 功能、效能比較ORM
- 堆排序和快速排序效能比較排序
- Java Bean Copy元件的效能比較JavaBean元件
- Java JIT與AOT效能比較 - foojayJava
- 一個比 Redis 效能更強的資料庫Redis資料庫
- 比較兩個物件是否相同,輸出不同的屬性值(一)物件
- 淺談前端MOCK資料工具比較前端Mock
- NLP 中不同詞嵌入技術的比較 - KDnuggets
- 資料庫升級之-資料泵資料庫
- mysql資料庫中decimal資料型別比較大小MySql資料庫Decimal資料型別
- Redis 不同插入方法的效能對比Redis
- 雲主機的硬碟IO效能比較硬碟
- Java幾種常用JSON庫效能比較JavaJSON
- WCF與ASP.NET Core效能比較ASP.NET
- PostgreSQL、Redis與Memcached的效能比較 - CYBERTECSQLRedis
- influxdb與傳統資料庫的比較UX資料庫
- 比較 Apache Hadoop 資料儲存格式 - techwellApacheHadoop
- mongodb資料遷移2種方式比較MongoDB