場景
公司需要遷移數據庫。有幾個表的數據量比較大,有2000萬條數據。
navicat 遷移
navicat的遷移數據庫的方式最簡單,但是原理是sql導出和插入,實測速度大概3000條/秒 。 3小時只導入了60萬條數據。 遠遠無法滿足要求。
pl/sql進行遷移
用pl/sql的導出dmp導出速度可以達到 10萬/秒。但是導入很慢,只有 100條/秒。
用pl/sql的導出dpe導出速度可以達到 10萬/秒。
還是無法滿足要求。
解決方案
決定採用oracle自帶的命令行導出方式。
單表導出導入
單表操作過程:
# 源庫 切換到oracle用戶 導出命令
# directory=dpdata1 用來設置文件夾,但是實測不成功,先不管
exp userid=zhangsan/1234@crm tables=t_user file=t_user .dmp;
# 目標庫 切換到oracle用戶 導入命令
imp lisi/1234@crmnew file=t_user.dmp full=y ignore=y;
然後循環所有表即可:
-- 查看錶名 和 大概條數
SELECT table_name,num_rows FROM user_tables order by num_rows desc;
庫導出導入(未成功)
用單表的方式,循環可以完成。 但是比較麻煩。 oracle也有導庫的方式,實測沒有成功。
-- 導出庫
expdp zhangsan/1234@crm schemas=crmdata dumpfile=mydump.dmp ;
報錯:only a DBA can import a file exported by another DBA
是因爲沒有授權。
sqlplus / as sysdba;
grant imp_full_database to jxskdata;
授權之後不報這個錯了,繼續報錯。
報錯信息
UDE-03113: operation generated ORACLE error 3113
ORA-03113: end-of-file on communication channel
Process ID: 1001
Session ID: 785 Serial number: 195
再次執行報錯:
UDE-12514: operation generated ORACLE error 12514
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
太麻煩了,不搞了。
導入命令:
impdp lisi/1234@crmnew SCHEMAS=crmdata dumpfile=mydump.dmp ;
其他
這篇文章介紹的不錯:
expdp / impdp 用法詳解