今天在往linux系統下的oracle數據庫中導入dmp數據庫的數據的時候,出現一些問題,經過多次調整和嘗試,最終將數據庫調整好,特此記錄。
首先,在導出本地的數據庫的時候,由於本地的數據庫中有建 dblink連接,在用exp命令導出數據的時候,命令行提示 大概 是連接失敗的意思,但是看着又不像是數據庫用戶本身連接失敗,經過百度查詢知道是因為該用戶下存在dblink連接,數據庫服務器的版本(11.2.0.4.0 - 64bit)比我本地的客戶端的版本(11.2.0.1.0- 64bit)高,百度上說如果使用同樣高版本的客戶端應該可以順利導出帶有dblink的用戶下的數據為dmp,幾經周折,也不想將本地的數據庫拆除重裝,最后確認dblink沒有其他用處,索性直接將3個dblink備份sql並刪除掉了,刪除掉之后,數據庫就順利導出數據了。其實這里還有一種不用刪除dblink也能將數據庫導出為dmp文件的方式,那就是直接在plsql上導出(只是這種方式導出數據的速度比exp命令導出數據庫的速度慢很多)。
順利導出數據庫以為就可以將數據順利導入到另外一台linux服務的數據庫中,當導入數據的時候,問題又來了!導入數據的時候,日志中報錯:沒有相應的表空間。導致很多相關的表都導入失敗,於是drop掉這個user,重新建user和表空間,並授權給擴展該表空間的授權給新建的用戶。具體步驟如下:
1、drop掉原來的用戶
sqlplus登陸數據庫
sqllus /nolong;
conn system/manager as sysdba;
drop user user_name cascade;
2、新建表空間
create tablespace tablespace_name
datafile '/data/oracle/tablespace_name.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
關於上面新建表空間的時候 datafile 想要放的地方,建議放在和 USERS 表空間同一目錄下,如果不知道在哪個路徑下,可以使用sql查詢
SELECT * FROM Dba_Data_Files ddf WHERE ddf.tablespace_name = 'USERS';
查詢結果中的file_name字段即是表空間所在的路徑
3、新建用戶並做授權
create user user_name identified by password;
grant connect,resource,dba to user_name;
alter user user_name quota unlimited on tablespace_name;
4、重新導入數據庫dmp文件
imp user_name/password file=/home/oracle/dmp/dmp_file.dmp log=/home/oracle/dmp/log_name.log FULL=y;
這次看日志,應該是順利導入大部分表數據了,當興沖沖的登上plsql查看數據的時候,發現中文都是亂碼的數據,問題又來了!
這不用說,一定是導出dmp文件的數據庫服務器的字符編碼(ZHS16GBK)和導入的數據庫的服務器的字符集編碼(AL16UTF16)是不一致導致的。
無奈!繼續drop用戶cascade 並修改導入的數據庫服務器的字符集編碼格式。具體步驟如下:
1、查看兩邊數據庫的字符集編碼
select * from nls_instance_parameters where parameter='NLS_LANGUAGE';
2、修改字符集編碼
2.1.以sysdba的身份登錄上去 conn /as sysdba
2.2.關閉數據庫shutdown immediate;
2.3.以mount打來數據庫,startup mount
2.4設置session
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
2.5.啟動數據庫
alter database open;
2.6.修改字符集
ALTER DATABASE CHARACTER SET ZHS16GBK;
這會可能會報錯,提示我們的字符集:新字符集必須為舊字符集的超集,這時我們可以跳過超集的檢查做更改:
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
這條語句就可以了,TERNAL_USE提供的幫助就會使oracle繞過了子集與超集的驗證,這條語句和上面的語句內部操作時完全相同的。
2.7.關閉,重新啟動
SQL>shutdown immediate;
SQL> startup
當然字符集最好不要輕易修改,因為這會對數據庫的數據有直接的影響,如果是生產環境的話,可能會造成不可估計得損失。
3、重新刪除用戶並重建user並授權。
4、重新導入dmp數據。
導入數據之后,在sqlus中查詢相關表數據都是正常的,以為大功告成了。可是問題又來了,plsql連不上數據庫了,報錯:TNS:ORA-12514 我很難受!!!
經過百度查詢,嘗試如下辦法,問題解決:
首先,要找到 新生成的listener.ora文件所在的位置,可以通過
cd $ORACLE_HOME命令 找到 oracle_home 所在的位置,然通過
lsnrctl命令stop 之后 start監聽,日志中會打印出listener文件所在的位置
[oracle@ps-server5 ~]$ cd $ORACLE_HOME [oracle@ps-server5 dbhome_1]$ lsnrctl LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-DEC-2018 23:39:53 Copyright (c) 1991, 2013, Oracle. All rights reserved. Welcome to LSNRCTL, type "help" for information. LSNRCTL> stop Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ps-server5)(PORT=8083))) The command completed successfully LSNRCTL> start Starting /u01/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.4.0 - Production System parameter file is /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/diag/tnslsnr/ps-server5/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8083))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC8083))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ps-server5)(PORT=8083))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 23-DEC-2018 23:40:15 Uptime 0 days 0 hr. 0 min. 5 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/diag/tnslsnr/ps-server5/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8083))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC8083))) Services Summary... Service "ocp" has 1 instance(s). Instance "ocp", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully LSNRCTL>
找到新的listener的位置,之后做如下操作:
1. 修改listener.ora文件
默認情況下該文件內容:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 你的服務器IP地址)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
))
出現ORA-12514的問題時候,我們需要增加的服務配置:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
GLOBAL_DBNAME = 一般和sid是一樣的 )
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = 自己的sid))
)
2. 啟動相關數據庫和監聽服務
進入 sqlplus 控制台:sqlplus /nolog
connect / as sysdba
關閉數據庫:shutdown immediate
開啟數據庫:startup;
退出sqlplus控制台:exit
重啟oracle監聽,重新用plsql連接數據庫,連接成功,大功告成!
