问题:本人在做一个项目,测试环境和生产环境不同用户指向同一表空间,传统的exp/imp导出导入,会出现导入数据后一用户没有表,网上找了很多方法,总结如下:
1、新建逻辑目录
最好以system等管理员创建逻辑目录,Oracle不会自动创建实际的物理目录“E:\dir”(务必手动创建此目录),仅仅是进行定义逻辑路径dump_dir;
create directory mydata as '逻辑目录路径';
例如:
create directory mydata as 'E:/dir';
2、查看逻辑目录是否创建成功
select * from dba_directories
3、用sys管理员赋予指定用户在该目录的操作权限
grant read,write on directory data_dir to user;
4、创建表空间和用户,为用户指定表空间
①查询表空间
select name from v$tablespace;
②创建表空间
create tablespace date --表空间名字
datafile 'E:\app\Administrator\oradata\fpmv\data.dbf' --存储路径
size 200M autoextend on next 50M maxsize unlimited; --表空间大小设置200M,每次50M自动扩展,最大不限制
③创建用户
create user test--创建用户名
identified by test--设置密码
default tablespace date --指定默认表空间
temporary tablespace TEMP; --临时表空间默认 temp
④用户授权
grant connect,dba,resource to test with admin option;
⑤修改用户密码(忘记用户密码时,可登录sys进行密码修改)
alter user portal identified by portal;
4、用expdp导出数据
用法及解释:
userid=test/test --导出的用户,本地用户
directory=dmpfile --导出的逻辑目录,一定要在oracle中创建完成的,并且给用户授权读写权限
dumpfile=xx.dmp --导出的数据文件的名称,如果想在指定的位置的话可以写成dumpfile=/home/oracle/userxx.dmp
logfile=xx.log --日志文件,如果不写这个参数的话默认名称就是export.log,可以在本地的文件夹中找到
schemas=userxx --使用dblink导出的用户不是本地的用户,需要加上schema来确定导出的用户,类似于exp中的owner,但还有一定的区别
EXCLUDE=TABLE:"IN('T1','T2','T3')" --exclude 可以指定不导出的东西,table,index等,后面加上不想导出的表名
network_link=db_local --这个参数是使用的dblink来远程导出,需要指定dblink的名称
1、如果想导入的用户已经存在:
①. 导出用户
expdp test/test@orcl directory=mydata dumpfile=test.dmp
②. 导入用户
impdp test2020 /test2020@orcl directory=mydata dumpfile=test.dmp REMAP_SCHEMA=test:test2020 EXCLUDE=USER
2、如果想导入的用户不存在:
①. 导出用户
expdp test/test@orcl directory=mydata dumpfile=test.dmp
②. 导入用户
impdp system/system@orcl directory=mydata dumpfile=test.dmp REMAP_SCHEMA=test:test2020
注意:
test2020会自动建立,其权限和使用的表空间与test相同,但此时用test2020无法登录,必须修改test2020的密码