一个需求,需要将一个现有表空间的所有表及其它对象,拷贝一个空的新表空间中。表有点多,直接用脚本有点麻烦,用了一次手生的expdp和impdp,这个方法不会因为表为空而像exp/imp那样忽略。
一.创建新的表空间
CREATE TABLESPACE TH12
DATAFILE 'D:\ORACLEDB\ORADATA\ORCL\ORCL\TH12.DBF'
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
二.设置数据泵导出路径
--先查询,确定路径是否存在,如果没有需要自己手工建
SELECT directory_name, directory_path
FROM dba_directories
WHERE directory_name = 'DATA_PUMP_DIR';
C:\app\barcode/admin/orcl/dpdump/
--导出数据
expdp system/password@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=TH3_export.dmp LOGFILE=TH3_export.log TABLESPACES=TH3 CONTENT=METADATA_ONLY
三.新表空间创建权限
我开始没有想到这一点,是在几次导入失败后才明白的。因为每次导入都说表已存在,因为我用system登录。
-- 创建一个新用户(比如叫 TH12)
CREATE USER TH12 IDENTIFIED BY your_password;
-- 给这个用户赋予权限(能连库、建表、建会话)
GRANT CONNECT, RESOURCE TO TH12
GRANT CREATE SESSION, CREATE TABLE TO TH12
-- 最关键的一步:把 TH12 设为这个TH12用户的默认表空间
-- 这样以后这个用户创建的任何表,默认都会放到 TH12 里
ALTER USER TH12 DEFAULT TABLESPACE TH12;
-- 给TH12用户在 TH12 表空间的使用配额(无限)
ALTER USER TH12 QUOTA UNLIMITED ON TH12;
四.导入数据到新表空间
impdp system/password@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=Th3_export.dmp LOGFILE=TH3_to_Th12.log REMAP_SCHEMA=TH3:TH_12 REMAP_TABLESPACE=TH3:TH12 TRANSFORM=SEGMENT_ATTRIBUTES:N TABLE_EXISTS_ACTION=SKIP