exp和imp導入導出時表空間問題【未完】


 

准備工作

第一步: 創建教師和學生用戶

  • 教師用戶/密碼  TEACHER/t123456
  • 學生用戶/密碼  STUDENT/s123456

參考鏈接 http://www.cnblogs.com/whatlonelytear/articles/5009464.html#createUser 

第二步: 創建教師表空間和學生表空間

http://www.cnblogs.com/whatlonelytear/articles/5009464.html#createTablespace

  • 參考以上鏈接,創建教師表空間TBS_TEACHER和學生表空間TBS_STUDENT ,

第三步: 以指定用戶創建教師表和學生表

  • 以學生用戶登錄創建學生表(不用)
  • 以老師用戶登錄創建老師表1(teacher1)和教師表2(teacher2)

  學生表樣例sql

--建學生表
create table STUDENT
(
  id   INTEGER not null,
  name VARCHAR2(100),
  age  INTEGER
);

CREATE INDEX IDX_STU_NAME ON STUDENT(NAME);--添加索引
ALTER TABLE STUDENT ADD CONSTRAINT CST_ID PRIMARY KEY(ID);--添加主鍵
COMMENT ON COLUMN STUDENT.NAME IS '姓名';--添加注釋

INSERT INTO STUDENT (ID, NAME, AGE) VALUES (1, 'aaa', 10);
INSERT INTO STUDENT (ID, NAME, AGE) VALUES (2, 'bbb', 12);
INSERT INTO STUDENT (ID, NAME, AGE) VALUES (3, 'ccc', 11);
COMMIT;
View Code

 第三步: 給學生和教師指定默認表空間

-- 修改用戶表空間
ALTER USER student DEFAULT TABLESPACE TBS_STUDENT;
ALTER USER teacher DEFAULT TABLESPACE TBS_TEACHER;
-- 回收unlimited tablespace無限表空間權限,不讓student使用之前的user表空間其它空間
 revoke unlimited tablespace from student;
-- 將student用戶在 TBS_TEACHER 表空間的配額置為 0
  alter user student quota 0 on TBS_TEACHER;
-- 設置student用戶在 TBS_STUDENT 表空間配額不受限
 alter user student quota unlimited on TBS_STUDENT;
-- 查看用戶表空間配額,MAX_BYTES為0代表用戶對表空間無使用權,為-1代表可以無限使用
SELECT * FROM USER_TS_QUOTAS;

 

 

我的導出導入語句

我的目標 : 把TEACHER用戶下的teacher1表導從TBS_TEACHER表空間導入到STUDENT用戶下的TBS_STUDENT表空間下.

參數說明如下:

  1. ROWS=N 表示只導表結構,不導表數據 (導出數據行數,N代表0行)
  2. TABLES=表示導哪些表,和FULL不可共存
  3. IGNORE=y 表示忽略創建錯誤,繼續后面的操作
  4. FILE=xxx.dmp 表示要導入導出的dmp文件位置
  5. LOG=xxx.log 表示導入導出時的日志
  6. BUFFER=1024000 表示數據行的緩沖區大小,單位Byte默認值根據系統而定,1024000是一個比較好的值,這也是別人的經驗。回滾端的問題主要出現在commit選項,大數據量的exp和 imp中commit=y可以避免回滾段益出。
  7. FULL=y 表示全庫導出: 導出除ORDSYS,MDSYS,CTXSYS,ORDPLUGINS,LBACSYS 這些系統用戶之外的所有用戶的數據.

 

-------導出,導出teacher1,teacher2表----------
exp "TEACHER/t123456@1.2.3.4:1521/orcl" ROWS=N BUFFER=1024000 tables=teacher1,teacher2 file=/data/oradata/dmp/backup.dmp LOG=/DATA/logs/exp.log  
-------導入,只導入teacher1表----------
imp "STUDENT/s123456@1.2.3.4:1521/orcl" ROWS=N tables=teacher1 BUFFER=1024000 IGNORE=y  file=/data/oradata/dmp/backup.dmp  log=/data/logs/imp.log IGNORE=y fromuser=TEACHER touser=STUDENT 

 

然而導入到student用戶下的teacher1表的表空間還是TBS_TEACHER, 上面的語句是不可能實現表空間的TEACHER表遷移的,原因參考下一小節.

  • 使用UltraEdit CTRL+H來批量修改表空間------what a ball shit
  • 指定fromuser touser shit 方法: 不啟作用------what a ball shit

如果我們有dba權限,那這個時候最好使用expdp和impdp服務端程序,它可以滿足要求.

 

imp和dmp導入導出用戶表空間touser問題 #重點#

同一個dmp文件在導入生產庫的時候導入的表空間是 a_tbs (目標a用戶的默認表空間),在導入測試環境的時候導入的表空間是 users .
使用的導入腳本也是完全相同的,所以這里就涉及了imp的導入機制

經過測試發現:
imp在使用touser進行制定用戶導入的時候,導入哪個表空間不是由目標用戶決定,
而是由導出用戶fromuser決定的。

比如:
文件是由 s 用戶導出,對應的表空間是 users ,   導入到用戶 a, 對應的表空間是 a_tbs

導入的時候如果目標環境有users表空間,就算使用了touser參數,也會導入到users表空間下,而如果目標環境沒有users表空間,就會導入touser用戶的默認表空間了。

主要參考鏈接: imp使用touser導入表空間問題

其它參考: 何種情況下imp的fromuser/touser改變tablespace失效

 

表空間其它相關輔助語句

 
         
-- 查看表空間的名稱及大小 
SELECT T.TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024)), 0) TS_SIZE
  FROM DBA_TABLESPACES T, DBA_DATA_FILES D
 WHERE T.TABLESPACE_NAME = D.TABLESPACE_NAME
 GROUP BY T.TABLESPACE_NAME;
-- 查看表空間物理文件的名稱及大小 
SELECT TABLESPACE_NAME,
       FILE_ID,
       FILE_NAME,
       ROUND(BYTES / (1024 * 1024), 0) TOTAL_SPACE
  FROM DBA_DATA_FILES
 ORDER BY TABLESPACE_NAME;
 
-- 查看有哪些用戶
SELECT USERNAME FROM DBA_USERS;
-- 查看用戶有哪些角色權限
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'student';
-- 查看用戶有哪些系統權限
SELECT * FROM DBA_SYS_PRIVS WHERE grantee = 'student' ;
-- 查看當前用戶下的表
SELECT * FROM USER_TABLES;

 

 

查看當前表空間

SELECT TBS 表空間名,
       SUM(TOTALM) 總共大小M,
       SUM(USEDM) 已使用空間M,
       SUM(REMAINEDM) 剩余空間M,
       SUM(USEDM) / SUM(TOTALM) * 100 已使用百分比,
       SUM(REMAINEDM) / SUM(TOTALM) * 100 剩余百分比
  FROM (SELECT B.FILE_ID ID,
               B.TABLESPACE_NAME TBS,
               B.FILE_NAME NAME,
               B.BYTES / 1024 / 1024 TOTALM,
               (B.BYTES - SUM(NVL(A.BYTES, 0))) / 1024 / 1024 USEDM,
               SUM(NVL(A.BYTES, 0) / 1024 / 1024) REMAINEDM,
               SUM(NVL(A.BYTES, 0) / (B.BYTES) * 100),
               (100 - (SUM(NVL(A.BYTES, 0)) / (B.BYTES) * 100))
          FROM DBA_FREE_SPACE A, DBA_DATA_FILES B
         WHERE A.FILE_ID = B.FILE_ID
         GROUP BY B.TABLESPACE_NAME, B.FILE_NAME, B.FILE_ID, B.BYTES
         ORDER BY B.TABLESPACE_NAME)
 GROUP BY TBS;

 

參考鏈接

Oracle創建表空間、創建用戶,給用戶分配表空間以及可操作權限

Oracle數據庫導入導出命令總結 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM