1. 程式人生 > >Oracle imp匯入資料指定表空間

Oracle imp匯入資料指定表空間

假設資料使用者USER1使用預設表空間TS1,使用者USER2使用預設表空間TS2,現在將USER1的資料匯入到USER2,要求使用表空間TS2。通過IMP命令引數tablespaces指定表空間是不行的,其他複雜方法要修改配額什麼的,麻煩。整理了一下,大致有以下幾種方法可以:
1. 有一個簡單的方法,適用於資料比較少的情況:直接使用UltraEdit打方DMP檔案,預設是16進位制,切換成文字模式,將裡面的:TABLESPACE "TS1"全部替換成TABLESPACE "TS2",然後再匯入,不用加什麼tablespaces=TS2之類的引數即可,當然加了也無所所謂。
C:\>IMP USER2/USER2 log=C:\plsimp.log file=D:\database\USER1.dmp fromuser=USER1 touser=USER2 ignore=yes tablespaces=TS2

不過有個缺點,如果DMP檔案有幾百M甚至幾G,嘿嘿嘿嘿,不知道UltraEdit有啥反應?

2. 還有另外一種比較好的方法。

基本思路都是先從USER1匯出表結構(DMP或者SQL指令碼),然後在USER2使用者下建立空的資料庫表(如果是DMP,則參見方法1;如果是SQL指令碼,則稍作修改後以USER2使用者執行即可),再將包括資料的DMP匯入,注意要設IGNORE=Y,並指定FROMUSER和TOUSER。具體實現方法為:
(1)先用工具匯出USER1的表結構(不要匯出CHECK和FK,特別是FK!),TOAD和PL/SQL都有此功能。PL/SQL Developer匯出表結構:Tools-->Export User Objects(匯出使用者物件) -->選擇要匯出的表(包括Sequence等)-->.sql檔案,匯出的都為sql檔案。或者使用imp的indexfile選項生成表結構的SQL指令碼。
(2)
在USER2使用者下建立相同的表結構
(3)匯入完整的資料

PS:
PL/SQL Developer工具操作步驟:
(1)匯出表結構:
Tools-->Export User Objects(匯出使用者物件) -->選擇要匯出的表(包括Sequence等)-->.sql檔案,匯出的都為sql檔案
(這一步也可以匯出一個只包括表結構的DMP檔案。)

(2)匯出表資料:
Tools-->Export Tables-->選擇表,選擇SQL Inserts-->.sql檔案
(這一步也可以匯出一個包括表結構和資料或者只有資料沒有表結構圖的DMP檔案。)

(3)匯入表結構:
執行剛剛匯出的sql檔案,記住要刪掉table前的使用者名稱,比如以前這表名為sys.tablename,必須刪除sys
(如果是隻包括表結構的DMP檔案,則使用UltraEdit修改表空間,再匯入。如方法1)

(4)匯入表資料:
執行剛剛匯出的sql檔案
(如果是DMP檔案,則直接匯入即可,注意要設IGNORE=Y,並指定FROMUSER和TOUSER。)

IMP命令操作步驟:

首先:exp user/pw file=file.dmp owner=yourUser1
然後:imp user/pw file=file.dmp indexfile=xxxx.sql fromuser=yourUser1 touser=yourUser2
隨後:修改xxxx.sql中的關於有表空間設定的地方為新的表空間,並去掉相關的註釋(rem),然後執行xxxx.sql建立相關物件。
最後:imp user/pw file=file.dmp fromuser=yourUser1 touser=yourUser2 ignore=y

一直以來,我都認為只要指定使用者的預設表空間,向該使用者匯入資料時,會自動進入到預設表空間。後來發現從System匯出的dmp檔案在匯入時,即使指定新使用者的預設表空間,還是要往System表空間中導資料。

上網搜了一下,還是有解決方法的,常見的方法如下:

SQL> create user myhuang identified by myhuang default tablespace myhuang;

SQL> grant resource,connect to myhuang;

SQL> grant dba to myhuang;//賦DBA許可權

SQL> revoke unlimited tablespace from myhuang;//撤銷此許可權

SQL> alter user myhuang quota 0 on system;//將使用者在System表空間的配額置為0

SQL> alter user myhuang quota unlimited on myhuang;//設定在使用者在myhuang表空間配額不受限。

經過上述設定後,就可以用imp匯入資料,資料將會進入指定的myhuang表空間:

C:\Documents and Settings\myhuang>imp system/[email protected] fromuser=lnxh tous

er=myhuang file=G:\myhuang\lnxh.dmp ignore=y grants=n

順便說兩個小問題:

(1)IMP-00003: 遇到 ORACLE 錯誤 1658

ORA-01658: 無法為表空間 MYHUANG 中的段建立 INITIAL 區

通常這個問題可以通過Resize增加表空間資料檔案大小來解決。

(2)刪除表空間

SQL> drop tablespace myhuang including contents and datafiles;

在10g中實驗,drop表空間之後,仍然需要手動去刪除資料檔案。


//2008-08-24補充————————————————————————
另一種比較好的方法:

Create tablespace {tbs_name} datafile ‘{file_path}’ size 500M autoextend on next 10M;

Create user {u_name} identified by {u_pwd} default tablespace {tbs_name} quota unlimited on {tbs_name};

Grant connect,imp_full_database to {u_name};

Imp {u_name}/{u_pwd}@{local_svrname} fromuser={from_user} touser={u_name} file={dmp_file_path} ignore=y tablespaces={tbs_name};

此方法不需要授予新使用者DBA許可權。
此方法的存在的問題是:可能導致包含BLOB、CLOB欄位的表匯入失敗,這種情況下可以先用sql指令碼將表結構建立起來,再匯入相應的資料。

相關推薦

Oracle imp匯入資料指定空間

假設資料使用者USER1使用預設表空間TS1,使用者USER2使用預設表空間TS2,現在將USER1的資料匯入到USER2,要求使用表空間TS2。通過IMP命令引數tablespaces指定表空間是不行的,其他複雜方法要修改配額什麼的,麻煩。整理了一下,大致有以下幾種方法可以:1. 有一個簡單的方法,適用於

oracle imp匯入資料到另一個空間

 資料庫中使用者try的資料一直放在system表空間中;今天把該使用者的所有資料exp到檔案try.dmp中,準備再匯入到另一個測試資料資料中的test使用者中,同時放在test表空間中。 1、在第一個資料庫匯出資料:exp try/try wner=try file=/t

Oracle exp/imp匯入不同的空間

    我們在做Oracle資料庫表遷移時,通常會有這種需求,在開發階段,可能所有使用者的資料都放在一個表空間中,比如users表空間,但是在生產中,我們希望將每個使用者的資料分別放到不同表空間中,此時直接使用exp/imp是不具備選擇表空間功能的(expdp/impdp可

Oracle imp命令匯入資料指定空間

找了一個幾百萬行資料的庫,準備匯入的本地Oracle中: imp sam/lee file=D:\agent.dmp FROMUSER=system TOUSER=SAM SAM使用者的預設表空間是SAM,但是資料卻匯入到了system表空間。Google了一下,應該這樣做: 1.收回unlimited

oracle通過exp imp 匯出或匯入指定

指定表: exp test/oracle  file=/u01/b.dmp tables=mema.t1,mema.t3 imp user/password file=file.dmp TABLES=t1,T2; 全部: exp test/[email 

oracle imp匯入庫到指定空間

1.建立表空間 create tablespace example_tablespace datafile 'e:\****.dbf' size 100m reuse autoextend on next 10m maxsize unlimited; 2.建立使用者

ORACLE 錯誤 1659,資料庫匯入dmp臨時空間記憶體不夠

今兒在自己電腦上搭建開發環境,在給資料庫匯入表結構以及資料時出現“IMP-00017: 由於 ORACLE 錯誤 1659, 以下語句失敗:”錯誤。查看錶空間是夠用的。下面是解決方法(原文連結:http://songworld.diandian.com/post/2012-08-11/4003373603

oracle(建立/刪除/修改使用者,建立/刪除/修改空間,授權使用者,刪除所有,給使用者指定空間

--oracle刪除某個使用者下的所有表 --此句只是查詢並且拼接sql,然後將執行的sql複製然後執行即可 select 'drop table '||table_name||';' from cat where table_type='TABLE'; export O

oracle的dmp匯入到不同空間 oracle的dmp檔案匯入到不同空間 oracle將dmp檔案匯入到不同的空間方法: 1、exp USER/
oracle的邏輯結構包括空間、段、區和資料

oracle的邏輯結構包括表空間(tablespace),段(segment),區(extent),資料塊(data block) oracle資料庫在邏輯上是由多個表間組成的,表空間中儲存的物件叫段,比如資料段,索引段,和回退段。段由區組成,區是磁碟分配的最小單位。段的增大是通過增加區的個數來實現的。每個區

oracle的em控制面板啟動以及imp匯入資料

開啟oracle database 控制面板(oracle enterprise manager) 1:先檢查自己的環境變數設定包括了ORACLE_HOME,ORACLE_SID已經設定 linux中3個儲存環境變數位置/etc/profile,使用者目錄~/.bash_p

Oracle】刪除(釋放)資料檔案/空間流程

oracle刪除(釋放)資料檔案/表空間流程 生產環境:資料庫裡空間不足,niptest 表空間251G,只使用了17G 再alter database datafile '...../niptest1' resize 10G; 的時候說超出了範圍要求  由於表變動比較頻繁

Oracle create tablespace 創建空間語法詳解

系統回滾段 語法 判斷 臨時 extent 數值 off offline 文件的 CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ..

oracle第二步創建空間、用戶、授權

toe 數據 表空間 nag gem 分享 reat 登錄 light Windows+r→鍵入sqlplus,輸入已安裝好的oracle數據庫超級管理員賬號密碼登錄。顯示: 成功。 創建表空間: 創建用戶並默認表空間: 授權該創建用戶對數據庫的操作: 代碼:

Oracle小技巧_不同空間不同用戶導入導出數據dmp

16px 這就是 直接 改變 索引 什麽 rom oracle數據庫 添加 【博主註:數據庫方面 ITPUB網站及博客內容非常豐富翔實】 轉載來源 ITPUB 博客經常有人會問:原來的數據在USERS表空間裏面,我想把它IMP進APP表空間,我已經修改了目的

oracle 11g手工熱備-空間

shu mat glob 備份 插入數據 mod 插入 rtu rm -rf 手工熱備必須在歸檔模式下進行,只讀表空間不能做熱備,臨時表空間不需要做熱備。 SYS@PROD> archive log list;——開啟了歸檔 Database log mode

Oracle數據庫的空間基本管理

12c 圖片 write sysaux 創建數據庫 9.png taf oracle數據庫 res 一、概述 Oracle數據庫是通過表空間來存儲物理表的,一個數據庫實例可以有N個表空間,一個表空間下可以有N張表。 有了數據庫,就可以創建表空間。 表空間(tablespa

Oracle資料庫入門使用者與空間(二)

目錄 甲骨文使用者 協議介面卡錯誤解決方案 檢視使用者 啟動scott使用者 表空間 建立永久表空間 修改永久表空間 增加資料檔案 刪除資料檔案(注意不能刪除第一個建立的資料檔案,除非刪除所有) 刪除表空間     甲骨

匯入匯出建立空間建立使用者刪除空間

select * from all_users where username not in  ('ANONYMOUS','APEX_030200','APEX_PUBLIC_USER','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS',

Oracle檢視使用者所在的空間

oracle 查看錶空間有哪些表 select * from dba_tables where tablespace_name='表空間名',注意表空間名大小寫敏感。select table_name,tablespace_name from user_tables;