准備工作
第一步: 創建教師和學生用戶
- 教師用戶/密碼 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;
第三步: 給學生和教師指定默認表空間
-- 修改用戶表空間 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表空間下.
參數說明如下:
- ROWS=N 表示只導表結構,不導表數據 (導出數據行數,N代表0行)
- TABLES=表示導哪些表,和FULL不可共存
- IGNORE=y 表示忽略創建錯誤,繼續后面的操作
- FILE=xxx.dmp 表示要導入導出的dmp文件位置
- LOG=xxx.log 表示導入導出時的日志
- BUFFER=1024000 表示數據行的緩沖區大小,單位Byte默認值根據系統而定,1024000是一個比較好的值,這也是別人的經驗。回滾端的問題主要出現在commit選項,大數據量的exp和 imp中commit=y可以避免回滾段益出。
- 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導入表空間問題
表空間其它相關輔助語句
-- 查看表空間的名稱及大小 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創建表空間、創建用戶,給用戶分配表空間以及可操作權限
