Docker容器內Oracle使用exp/imp命令進行數據庫遷移

接上篇:Linux服務器使用Docker安裝Oracle12c

環境:

Centos7.5

使用Docker安裝的Oracle

要對同一內網下裝有Oracle的兩臺服務器數據遷移(導出與導入),使用exp和imp命令

1、將服務器A內數據庫中的數據使用exp導出到服務器B數據庫目錄下

2、將導入到服務器B目錄下的dmp文件使用imp導入服務器B上的數據庫內

首先在服務器B上需要配置一個tnsname,然後使用tnsping測試B是否能夠連接到服務器A上的數據庫,這是所有操作的起點與基礎

操作如下:

1.1、導出數據庫文件

全局搜索tnsnames.ora文件,Linux命令:

find / -name tnsnames.ora

然後在Docker容器下可以找到,此處沒有進入docker而是在linux搜索是想將路徑直接複製到xftp,然後修改

劉大佬指導,同樣可以通過進入Oracle容器內進行搜索(在已知正在運行容器ID的情況下)

docker ps 
docker exec -it 7485d22f2fd5 /bin/bash
find / -name tnsnames.ora

目測diff文件是差異文件夾,暫時直接使用的

/var/lib/docker/overlay2/ce41d80b81d5160e26c3e5017c4cf95ad429603e9023d27fc593b497de9134d5/merged/u01/app/oracle-product/12.1.0/xe/network/admin/samples/tnsnames.ora

大佬指點,sample文件是示例目錄,故新建一個tnsnames.ora在admin文件夾下,如下

添加內容如下

T =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xx.xxx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = xxx)
    )
  )

後面命令行進入Oracle容器進行測試

# 查看所有在運行的容器
docker ps
# 使用返回的容器ID進入容器命令行
docker exec -it 7485d22f2fd5 /bin/bash 運行容器
# 如果進入root@62a5a35737c1:/#類似這種容器內命令行則表示成功,此時進入Oracle容器,可使用Oracle自
# 帶SQLPlus等,tnsping也是Oracle自帶的Oracle Net 工具,可以
# 1)驗證名字解析(tnsnames.ora內配置的Service)
# 2)遠程的listener是否啓動
# 驗證是否連接到服務器A的Oracle
tnsping X

此時一路暢通,沒踩到坑。。此時同樣在Oracle容器內,執行exp

exp account/password@tnsName file=/u01/app/oracle/file.dmp log=/u01/app/oracle/file.log full=y
# exp 服務器A上數據庫賬號/密碼@本地服務器B配置的tnsnames.ora內的name file=導出路徑(此處爲Oracle容器內相對路徑) log=日誌路徑(相對路徑+1) full=數據庫完全導出

同時因爲在Oracle安裝時就掛載文件到其他目錄,所以此時在備份目錄也可以同步看到

尚未停止。。。

2.1、導入數據庫文件

在導入數據庫dmp前,需創建表空間、用戶、修改Oracle編碼

之前測試掛載是否成功時創建了一個tablespace,命令爲

create tablespace test
logging
datafile '/u01/app/oracle/xxx.dbf' 
size 32m 
autoextend on 
next 32m maxsize 2048m
extent management local;

後來shoucan,直接刪除了xxx.dbf文件,但是根據

select * from dba_tablespaces;

select file_name,online_status from dba_data_files ;

查詢出路徑還在,且想要drop tablespace時,一直提示無法找到文件,使用重啓大法:後果如下

ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Process ID: 0
Session ID: 0 Serial number: 0

Oracle無法正常啓動,百度中求生:oracle initialization or shutdown in progress解決方法

# ERROR:
# ORA-01033: ORACLE initialization or shutdown in progress
# Process ID: 0
# Session ID: 0 Serial number: 0
# 解決方法:使用sqlplus登錄
root@6d9e4ca51d51:/# sqlplus /nolog
# 使用sys登錄(system無法登陸)
SQL>connect sys/password as sysdba
SQL> shutdown normal
ORA-01109: 數據庫未打開
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> start mount
SP2-0310: 無法打開文件 "mount.sql"
SQL> startup mount
ORACLE 例程已經啓動。

Total System Global Area  612368384 bytes
Fixed Size                  1332348 bytes
Variable Size             183151492 bytes
Database Buffers          423624704 bytes
Redo Buffers                4259840 bytes
數據庫裝載完畢。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01157: 無法標識/鎖定數據文件 5 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 5: 'C:\TYKM.DBF'

# 就在此處將不小心刪除的文件狀態設爲offline
SQL> alter database datafile 5 offline drop;【5是數據文件中的5】

數據庫已更改。

SQL> alter database open;【我們一直循環這個語句,直至不再提示錯誤】

數據庫已更改。

SQL> shutdown normal
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啓動。

Total System Global Area  612368384 bytes
Fixed Size                  1332348 bytes
Variable Size             187345796 bytes
Database Buffers          419430400 bytes
Redo Buffers                4259840 bytes

啓動完成後執行上方的tablespace查詢結果

這時候狀態不再是ONLINE,再次drop tablespace即可成功

# 刪除名爲tpms的文件及關聯的datafiles
drop tablespace tpms including contents and datafiles;

另外在創建表空間的時候,單個表空間不能大於32G

imp導入命令

imp tpms/Tpms2015 fromuser=tpms touser=tpms   file=/u01/app/oracle/tpms20181127.dmp log=/u01/app/oracle/tpms20181127.log ignore=y;
# imp 要導入數據庫的用戶名/密碼 fromuser=從用戶 touser=到用戶 file=原導出的dmp數據文件 log=日誌文件 ignore=忽略錯誤

另外在dmp導入報錯value too large for column (actual: 27, maximum: 20)

猜測是因爲新裝數據庫與原數據庫編碼不同,因爲所有表都來自原封不動導出的文件

來自修改oracle的編碼格式,解決亂碼問題:

1、管理員用戶連接
SQL>conn sys/密碼 as sysdba;
2、關閉數據庫。
SQL>shutdown immediate;
3、啓動數據庫到Mount狀態下。
SQL> STARTUP MOUNT;
# 這些都要執行,以修改狀態
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
Session altered.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
System altered.
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
System altered.
4、啓動數據庫
SQL> Alter database open;
5、修改字符集
# 需要使用INTERNAL_USE來使跳過 新字符集必須爲舊字符集的超集 的檢查
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
或 ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
6、關閉數據庫
SQL> Shutdown immediate;
7、重新啓動數據庫
SQL> startup;

成功!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章