公司有一台需要更換的Oralce服務器,需要把里面的數據導出,但是因為是內網所以沒法用pl/sql連接,所以就嘗試用Oracle自帶的exp在服務器端導出dmp文件,然后在外網使用Docker 拉取Oracle鏡像,用imp命令導入。
准備工作:
1、在內網將使用exp導出的dmp文件復制到外網機器Docker啟動的Oracle容器內
這里需要用到的命令就是宿主文件復制到容器內
#查詢Oracle容器名稱
[root@liwei ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9c0373c27212 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g "/bin/sh -c '/home/o…" About an hour ago Up About an hour 0.0.0.0:1521->1521/tcp oracle11g #將宿主文件復制到容器內
[root@liwei ~]# docker cp /home/platform.dmp oracle11g:/home/
2、准備一台外網機器,並安裝Docker
3、使用doker拉取Oracle鏡像(Docker 拉取 oracle 11g鏡像配置)
步驟:
1、將dmp文件使用SecureFX工具上傳至外網機器
2、在外網機器進入Docker 按照上面的播客創建的oracle容器,輸入下面的命令;
--使用imp命令導入dmp文件
imp USERID=/用戶名/密碼 FILE=dmp文件位置
imp USERID=test/test FILE=/home/platform.dmp IGNORE=Y FULL=Y;
--這個時候提示
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
export client uses ZHS16GBK character set (possible charset conversion)
IMP-00031: Must specify FULL=Y or provide FROMUSER/TOUSER or TABLES arguments
IMP-00000: Import terminated unsuccessfully
上面錯誤是因為客戶端和服務器端的Oracle字符集不一樣,這個時候就要將客戶端的字符集改成與服務器一致,下面是修改Oracle字符集的步驟,按照下面的步驟即可設置成功(不要在線上Oracle執行這些命令,他會關閉數據庫再重啟)
sqlplus /nolog
SQL> conn /as sysdba;
SQL>select userenv('language') from dual;
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP MOUNT
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
SQL>select userenv('language') from dual;
--然后再執行上面的導入命令
. . importing table "T_USER_GROUP" 2 rows imported
. . importing table "T_USER_PRVG" 455 rows imported
About to enable constraints...
Import terminated successfully with warnings.
到這個時候就導入成功了