oracle導(dǎo)入導(dǎo)出某個(gè)schema數(shù)據(jù)的步驟
背景
公司之前部門拆分,但一些服務(wù)并沒有拆分清楚。其中一個(gè)老服務(wù),兩個(gè)部門都在用,現(xiàn)在為了避免互相影響,決定克隆該服務(wù)。克隆就要克隆全套,當(dāng)然也包括數(shù)據(jù)庫,我們這個(gè)老服務(wù),用的oracle,所以,就涉及到從舊的oracle中導(dǎo)出數(shù)據(jù),然后再導(dǎo)入到另一套新的oracle實(shí)例中。
屆時(shí)在線上肯定是要物理隔離的,就是oracle要建在各自的服務(wù)器上,服務(wù)器間網(wǎng)絡(luò)隔離;但我現(xiàn)在只是在開發(fā)環(huán)境驗(yàn)證拆分后功能是否正常,所以偷了個(gè)懶,沒有新建實(shí)例,只是新建了個(gè)用戶,進(jìn)行邏輯隔離。
下午簡(jiǎn)單弄了下,踩了幾個(gè)小坑,記錄下來備忘。
導(dǎo)出步驟
schema、用戶
一個(gè)oracle實(shí)例下,可以有多個(gè)用戶,用戶間邏輯隔離。用戶和schema是什么關(guān)系呢?可以看我在dbeaver中建schema時(shí)候的彈框,直接就說創(chuàng)建schema等同于創(chuàng)建用戶:

創(chuàng)建用戶的時(shí)候,默認(rèn)就會(huì)創(chuàng)建一個(gè)同名的schema。像表這種東西,不會(huì)直接和用戶掛鉤,而是掛在某個(gè)schema下,簡(jiǎn)單而言,schema相當(dāng)于是用戶和表、索引這些object間的一個(gè)中間層。具體可以看看這篇文章:
https://www.modb.pro/db/508147

要導(dǎo)出的目標(biāo)
我這邊就是要把如下左側(cè)這個(gè)HX_PLAT_NEW這個(gè)schema中的所有數(shù)據(jù)導(dǎo)出,然后再導(dǎo)入到一個(gè)新的schema中(做邏輯隔離)。其實(shí)本來想做物理隔離,重新搭個(gè)oracle實(shí)例,感覺有點(diǎn)繁瑣,先偷個(gè)懶吧。

導(dǎo)出的話,我先是看了下dbeaver,發(fā)現(xiàn)好像沒有這塊功能,于是在網(wǎng)上找,發(fā)現(xiàn)有兩種方式:
- expdp/impdp命令,其優(yōu)勢(shì)是速度快,但是稍微復(fù)雜一點(diǎn);
- exp/imp命令,速度慢,適用于數(shù)據(jù)量較小的情況,使用上簡(jiǎn)單一些。
詳細(xì)可以參考://m.fzitv.net/article/98363.htm
我這邊表比較多,使用的是expdp/impdp方式。
導(dǎo)出過程遇到的錯(cuò)誤
首先是找運(yùn)維拿到了開發(fā)機(jī)器的ssh密碼,然后利用netstat -nltp根據(jù)端口找進(jìn)程,根據(jù)進(jìn)程找到數(shù)據(jù)庫cwd目錄。
找到后,在機(jī)器上執(zhí)行expdp -h,也提示沒有幫助文檔,只能去網(wǎng)上找,改了改如下:
expdp \'sys/1234 as sysdba\' schemas=hx_plat_new DIRECTORY=hx_plat_new_dump DUMPFILE=hx_plat_new.dmp
這里大概就是使用sys這個(gè)用戶(密碼:1234)作為sysdba身份登錄,要導(dǎo)出的schema是hx_plat_new,導(dǎo)出后的文件名是hx_plat_new.dmp,文件放到哪里呢,由DIRECTORY這個(gè)參數(shù)指定(我自己在當(dāng)前目錄下建了個(gè)hx_plat_new_dump這個(gè)目錄)
結(jié)果一執(zhí)行,說 ORACLE_HOME 環(huán)境變量不存在,設(shè)置:
vim /etc/profile export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 source /etc/profile
再一執(zhí)行,說 ORACLE_SID 這個(gè)環(huán)境變量找不到,雖然幾年前搞過一陣oracle,現(xiàn)在我都不記得這玩意是啥,怎么設(shè)置了。
網(wǎng)上找到個(gè)sql查sid:
SELECT sys_context('USERENV', 'DB_NAME') AS ORACLE_SID FROM dual;
或者
SELECT sys_context('userenv','instance_name') FROM dual;
接著設(shè)置環(huán)境變量:
export ORACLE_SID=orcl
再執(zhí)行,說目錄不存在,查了下,原來directory后面不是亂寫的,目錄需要先創(chuàng)建,這里再引用。我這邊是直接查了下現(xiàn)在有哪些可以用的目錄:
SELECT directory_name, directory_path FROM dba_directories

所以,這邊把目錄改成了第四個(gè)(隨便選一個(gè)),或者自己也可以自己新建,建完還要給用戶授權(quán):
# 創(chuàng)建文件夾 create directory 文件夾名稱 as '路徑,基于系統(tǒng)'; # 將文件夾讀寫權(quán)限給被授權(quán)用戶 grant read,write on directory 文件夾名稱 to 被授權(quán)用戶;
最終的命令是:
expdp \'sys/1234QWER as sysdba\' schemas=hx_plat_new DIRECTORY=DATA_PUMP_DIR DUMPFILE=hx_plat_new.dmp
然后在 /u01/app/oracle/admin/orcl/dpdump/hx_plat_new.dmp 下就生成文件了。
導(dǎo)入步驟
建立新的schema
先是在dbeaver上建了個(gè)schema叫:hx_plat_split_test。
然后構(gòu)造好了導(dǎo)入的命令:
impdp \'sys/oracle as sysdba\' DIRECTORY=DATA_PUMP_DIR DUMPFILE=hx_plat_new.dmp schemas=HX_PLAT_SPLIT_TEST
結(jié)構(gòu)一直報(bào)錯(cuò)說schema:HX_PLAT_SPLIT_TEST找不到:

后邊比較了下這個(gè)在dbeaver中建的用戶和其他用戶,感覺有點(diǎn)不一樣:

于是把dbeaver建出來的刪了,在sqlplus中創(chuàng)建。
SQL> CREATE USER HX_PLAT_SPLIT_TEST IDENTIFIED BY "1qazxxxx"; User created.
建用戶的過程中,當(dāng)時(shí)也報(bào)錯(cuò),后來發(fā)現(xiàn)是說,密碼如果是數(shù)字開頭,必須用雙引號(hào)。
參考:https://stackoverflow.com/questions/36612365/oracle-sql-plus-error-ora-00922-missing-or-invalid-option-when-creating-user
導(dǎo)入
新建用戶后執(zhí)行,還是報(bào)相同錯(cuò)誤,后來以為是權(quán)限問題導(dǎo)致,準(zhǔn)備對(duì)比下這個(gè)用戶是不是權(quán)限和其他人不一樣。網(wǎng)上看了幾篇講權(quán)限的文章,發(fā)現(xiàn)挺復(fù)雜,于是先不深究,找了個(gè)sql先執(zhí)行下授權(quán):
GRANT IMP_FULL_DATABASE TO HX_PLAT_SPLIT_TEST;
結(jié)果還是沒效果。后面網(wǎng)上查了下,發(fā)現(xiàn)有個(gè)文章很像我的問題:
http://m.fzitv.net/database/297406wu3.htm
通過以下命令導(dǎo)入數(shù)據(jù)到oracle數(shù)據(jù)庫,報(bào)"ORA-39002: 操作無效","ORA-39165: 未找到方案" 錯(cuò)誤
impdp tms/tms123@orcl schema=tms directory=dump_dir dumpfile=ZBTMS2021031701.DMP原因是通過expdp導(dǎo)出的用戶,與需要導(dǎo)入的用戶名稱不一致
意思就是,導(dǎo)出和導(dǎo)入的用戶不一樣會(huì)有這個(gè)問題,于是照著改了改。
impdp \'sys/oracle as sysdba\' remap_schema=HX_PLAT_NEW:HX_PLAT_SPLIT_TEST remap_tablespace=HX_PLAT_NEW:HX_PLAT_SPLIT_TEST DIRECTORY=DATA_PUMP_DIR DUMPFILE=hx_plat_new.dmp schemas=HX_PLAT_SPLIT_TEST
發(fā)現(xiàn)還是報(bào)錯(cuò),后面去掉了最后的 schemas=HX_PLAT_SPLIT_TEST :
impdp \'sys/oracle as sysdba\' remap_schema=HX_PLAT_NEW:HX_PLAT_SPLIT_TEST remap_tablespace=HX_PLAT_NEW:HX_PLAT_SPLIT_TEST DIRECTORY=DATA_PUMP_DIR DUMPFILE=hx_plat_new.dmp
嗯,這下ok了。
總結(jié)
oracle這個(gè)還是過于復(fù)雜了,幾年前也是小公司,dba出差了,項(xiàng)目需要,被迫搞了一陣,太痛苦了,幾年下來,又全忘了。
參考資料
這里記錄下后續(xù)發(fā)現(xiàn)的一些不錯(cuò)的參考資料:
官方,包含命令的各個(gè)選項(xiàng)的意思(11g版本的):
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_export.htm#SUTIL824
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm#SUTIL300
https://mp.weixin.qq.com/s/voGgQseZQCp30J6Rx-vNcQ
https://mp.weixin.qq.com/s/m7GrQnJ-QalTf1lluUO4Gg
https://mp.weixin.qq.com/s/IvzXv4CKAQELGKcH3tbW4Q
如果沒有服務(wù)器登錄權(quán)限,可以采用第三方工具如TOAD:
https://mp.weixin.qq.com/s/hFmH-k6Bs65xlswU50bhfg
到此這篇關(guān)于oracle導(dǎo)入導(dǎo)出某個(gè)schema數(shù)據(jù)的文章就介紹到這了,更多相關(guān)oracle導(dǎo)入導(dǎo)出某個(gè)schema數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle 觸發(fā)器實(shí)現(xiàn)主鍵自增效果
這篇文章主要介紹了Oracle 觸發(fā)器實(shí)現(xiàn)主鍵自增,說白了就是數(shù)據(jù)確認(rèn)(after)與安全性檢查(before),此外觸發(fā)器不針對(duì)select操作,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-12-12
安裝oracle11g時(shí)遇到INS-13001的問題及解決
在Win10安裝Oracle 11g時(shí)出現(xiàn)INS-13001錯(cuò)誤,需修改解壓目錄下stage/cvu的cvu_prereq.xml文件,將32-bit改為64-bit,保存后重新運(yùn)行安裝程序即可解決兼容性問題2025-07-07
Oracle 當(dāng)前用戶下所有表的記錄總數(shù)
Oracle 數(shù)據(jù)庫下 查詢當(dāng)前用戶下所有表的記錄總數(shù)2009-07-07
oracle sql語言模糊查詢--通配符like的使用教程詳解
這篇文章主要介紹了oracle sql語言模糊查詢--通配符like的使用教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04
Oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出超詳細(xì)教程
最近做項(xiàng)目的時(shí)候遇到過oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出,在這里我做下記錄,防止自己忘記了,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出的相關(guān)資料,需要的朋友可以參考下2023-12-12
Oracle數(shù)據(jù)泵的導(dǎo)入與導(dǎo)出實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)泵的導(dǎo)入與導(dǎo)出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

