最近使用oracle9i時,遇到了數(shù)據(jù)庫備份和恢復(fù)的問題,很多時候與exp和imp的命令使用有關(guān)。針對遇到的問題,簡單的總結(jié)。
創(chuàng)新互聯(lián)是一家專業(yè)提供臨淄企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站設(shè)計、HTML5、小程序制作等業(yè)務(wù)。10年已為臨淄眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
問題的背景,就是需要對某張表導(dǎo)入和導(dǎo)出。數(shù)據(jù)庫database1,dateabase2在數(shù)據(jù)庫中涉及的用戶主要是 user1,user2,備份的對象主要是表table1。
對于exp和Imp命令的內(nèi)容網(wǎng)上較多的解說,這里主要解決具體的問題,使用的只是常用的命令項。
1.從database2中導(dǎo)出表 table1
exp userid=system/mypawd@dateabase2 tables=(user1.table1) rows=y log=d:\log.txt file=d:\table1.dmp
這個一般沒有什么問題,最好是在命令行窗口中運(yùn)行。把database2數(shù)據(jù)庫中user1方案中的table1導(dǎo)出。導(dǎo)出似乎有一個原則,哪個方案(用戶)的表,只有擁有者可以執(zhí)行。也就是說,雖然使用的是system用戶,但是在exp時,數(shù)據(jù)庫會把用戶切換為user1,就是table1的擁有者,在開始exp。不過一般導(dǎo)出時還是使用權(quán)限相對高一些的用戶比如sysem。
exp userid=lj/ljjtw@hmis1 full=n tables=(CT231) rows=y log=d:\log1.txt file=d:\ct2311.dmp
2. 在Imp時,遇到的問題如下:
1)權(quán)限對等的用戶才可以執(zhí)行導(dǎo)入。
如果這樣寫命令,imp user2/mypawd@dateabase1 tables=(table1) rows=y log=d:\log.txt file=d:\table1.dmp
提示:有dba權(quán)限的用戶導(dǎo)出,導(dǎo)入也要是用同等權(quán)限的用戶導(dǎo)入。就是要導(dǎo)入的用戶user2,不具有dba的權(quán)限,不允許導(dǎo)入
2)IMP-00033: 警告: 在導(dǎo)出文件中未找到表
imp system/mypasswd@database2 rows=y log=d:\log.txt file=d:\table1.dmp
--IMP-00033: 警告: 在導(dǎo)出文件中未找到表
通過查詢相關(guān)資料,應(yīng)該是沒有指定方案的備份對象,就在命令中加入了touser=user2,運(yùn)行問題還是存在,imp system/mypasswd@database2 rows=y log=d:\log.txt file=d:\table1.dmp touser=user2 --IMP-00033: 警告: 在導(dǎo)出文件中未找到表
又思考是不是必須在database1中建立一個與user2不同命的方案,又創(chuàng)建了user3方案,還是同樣的問題。imp system/mypasswd@database2 rows=y log=d:\log.txt file=d:\table1.dmp touser=user3 --user3實在database2 數(shù)據(jù)庫中建立的用戶(方案)不同于database1中user1。
在繼續(xù)的查閱中,很多人都指出了一個問題,就是命令在使用的時候,必須要保證最低的完整,就是方案,擁有者要指明,也就是fromuser=user1 ,touser=user2 要給出。問題就解決了。
imp system/mypasswd@database2 fromuser=user1 touser=user2 rows=y log=d:\log.txt file=d:\table1.dmp
其實touser也可以指明在目標(biāo)數(shù)據(jù)庫中的不同名用戶,不僅可以是user2,還可以是其他的用戶,這樣table1在目標(biāo)數(shù)據(jù)庫中的擁有者就變換成指明的用戶。這樣就可以更改某一張表的owner,在Oracle數(shù)據(jù)庫中通常數(shù)據(jù)對象的所有者是不能更改的。
數(shù)據(jù)表的導(dǎo)入導(dǎo)出可以多張表。一般是很難保證表約束和創(chuàng)建的其他對象的完整。如果指明是owner=(),就是說要導(dǎo)出某個方案,此時就不能指定tables=(),這樣會有沖突。
整個數(shù)據(jù)庫導(dǎo)入導(dǎo)出也是可以的。當(dāng)然也可以全庫導(dǎo)出,只導(dǎo)入需要的部分方案,只需修改命令參數(shù)使用。