先捋一下oracle的概念
oracle的概念稍微有点复杂:
用户账号和表空间关联,表空间分为永久表空间和临时表空间,通过表空间配置数据库的大小等参数,表空间用于存储数据表,一个用户可以关联多个表空间,也可以拥有同义词,索引等配置
oracle的用户等同于mysql的数据库
tnsname里面的server是oracle服务端的连接配置,是用来连接数据库的
操作步骤
1.导出oracle数据库
exp 账号/密码@127.0.0.1:1521/server_name file=D:\dbbak\test.dmp
导出完之后,压缩dmp文件,并下载
2.导入oracle数据库
(1)新建永久表空间和临时表空间
#在oracle服务器上以sysdba身份登录,也可以通过plsql登陆 sqlplus / as sysdba
#查看表空间存储位置
select * from dba_data_files
#创建一个永久表空间,大小200M,可以自动扩展
create tablespace test_data datafile 'D:\APP\ADMINISTRATOR\ORADATA\ETL\test\test_data.dbf' size 200M autoextend on;
#或者大小 100M,每次 5M 自动增大,最大不限制
create tablespace test_tablespace datafile 'testfile.dbf' size 100M autoextend on next 5M maxsize unlimited;
#临时表空间创建
create temporary tablespace test_temp tempfile 'D:\APP\ADMINISTRATOR\ORADATA\ETL\test\test_temp.dbf' size 200m;
(2)新建用户
#新建用户并指定登录密码,同时指定表空间
create user test identified by 123456 default tablespace test_data temporary tablespace test_temp;
#高版本的oracle普通用户前面要加c##,如果不带c##可以执行如下命令
alter session set "_ORACLE_SCRIPT"=true;
#新建完用户后再给改回来
alter session set "_ORACLE_SCRIPT"=false;
也可以先建用户再指定表空间
# 创建用户名test 密码 123456 create user test identified by 123456;
# 可以将tablespace表空间分配给指定用户来管理
ALTER USER test QUOTA UNLIMITED ON test_tablespace;
# 或者为用户指定默认表空间
ALTER USER test DEFAULT TABLESPACE test_tablespace;
(3)给用户赋权
-- 给用户分配权限,必须赋予sysdba权限,imp命令需要sysdba身份导入
grant create session,create table,create view,create sequence,unlimited tablespace,connect,resource,dba to test;
(4)查看表空间
# 查看表空间对应关系
SELECT username, default_tablespace, temporary_tablespace, profile FROM dba_users;
可以看出最下面那个用户没有赋予单独的临时表空间,oracle这种情况会默认赋予系统临时表空间
#查看表空间信息 select * from dba_tablespaces
# 查看系统目录 select * from dba_directories;
确认表空间关系对应无误后,导入数据库
(5)导入数据库
把dmp文件上传到相关目录并解压,在cmd中执行导入命令
imp test/123456 file=D:\app\Administrator\admin\etl\dpdump\test.dmp log=D:\app\Administrator\admin\etl\dpdump\test.log fromuser=test touser=test constraints=N ignore=y
另外还有远程导入命令供参考:
imp ds/123456@*.*.*.28:1521/orcl file=/home/sawl/tools/oracle11g/data/nmgzc2.dmp log=/home/sawl/tools/oracle11g/data/test.log fromuser=test111 touser=ds constraints=N ignore=y
导入中遇到的错误:
ORA-39143: 转储文件可能是原始的导出转储文件
问题
options
ORA-39001: 参数值无效
ORA-39000: 转储文件说明错误
ORA-39143: 转储文件 “.dmp” 可能是原始的导出转储文件
原因分析:
.dmp文件是使用exp命令导出的,而使用
impdp 无法识别exp命令导出的文件,需要使用imp命令进行导入
当时导出用的exp,导入用的impdp,所以报错了。。
参考文档:
https://www.jianshu.com/p/9745ae3cb9b0
https://www.cnblogs.com/aeolian/p/16935162.html
https://blog.csdn.net/Crazy_young_man/article/details/131162884
https://zhuanlan.zhihu.com/p/484128583
https://blog.csdn.net/roamer314/article/details/50901893
表空间知识扩展:
https://blog.csdn.net/m0_71406734/article/details/131135587
-----------------------------------------------------------------------改进分割线-------------------------------------------------------------
后来经过实测,exp/imp命令并不能很好的完成oracle数据库的导出导入工作,原因在于exp默认不导出空表,导致数据库有些表缺失造成的程序起不来,所以只能选用expdb/impdb命令
imp impdb命令也不能像mysql那样,默认强制覆盖老表,这对于需要频繁的同步数据库来说很不方便(比如测试环境A同步到测试环境B),经过摸索,采用了删除表空间,删除用户(不删除用户,原来的索引,存储过程都在),新建表空间,新建用户,再导入的方式
以下为操作步骤
一、导出数据库
1.查看逻辑目录
使用expdb命令需要指定逻辑目录
SELECT * FROM DBA_DIRECTORIES
这里可以看到系统有专门的数据库备份目录
2.查询表空间名
select * from dba_data_files
这里的表空间名称,在导入新建时要保持一致,如果不一样,导入时需要指定参数
3.全量备份指定数据库
以下命令在cmd中执行
expdp 用户名/密码@127.0.0.1:1521/数据库名 directory=DATA_PUMP_DIR schemas=用户名 dumpfile=备份文件名.dmp
注意:这里的directory=DATA_PUMP_DIR 就是上面查出的逻辑目录,备份文件会存放在D:\app\Administrator/admin/jsglcsk/dpdump/ 目录下
schemas指定的用户名实际就是这个用户关联的命名空间下的所有数据以及用户下的索引,视图等,类似于mysql的数据库,如果不想由于多下载而误覆盖掉其他表空间的内容(比如system的内容),这个一定要配置!
4.把数据库文件压缩并下载
二、导入数据库
以下命令需要dba用户执行,可以在plsql中执行
1.查询逻辑目录,并上传数据库文件
-- 查询目录
SELECT * FROM DBA_DIRECTORIES
这里把数据库文件上传到 D:\app\Administrator/admin/etl/dpdump/
2.查询表空间,并删除原来旧数据的表空间和用户
-- 查询表空间 SELECT username, default_tablespace, temporary_tablespace, profile FROM dba_users; select * from dba_data_files -- 重新导入数据之前,删除表空间和用户 drop tablespace 表空间名 including contents and datafiles; drop tablespace 临时表空间名 including contents and datafiles; drop user 用户名 cascade;
select * from dba_data_files 可以看到表空间的本机目录,这里不同系统的表空间建议新建子文件夹分类
SELECT username, default_tablespace, temporary_tablespace, profile FROM dba_users; 可以看到用户名对应的表空间和临时表空间
3.创建表空间
-- 创建表空间 create tablespace TBS_GGJZHGY_LMGL_DATA datafile 'D:\APP\ADMINISTRATOR\ORADATA\ETL\GGJLMGL\TBS_GGJZHGY_LMGL_DATA.DBF' size 200M autoextend on next 5M maxsize unlimited; create temporary tablespace TBS_GGJZHGY_LMGL_TEMP tempfile 'D:\APP\ADMINISTRATOR\ORADATA\ETL\GGJLMGL\TBS_GGJZHGY_LMGL_TEMP.DBF' size 200m autoextend on next 5M maxsize 5G;
创建的表空间名可以和源数据不一致,如果不一致,导入时需要用参数指定
4.创建用户并授权
create user 用户名 identified by 密码 default tablespace TBS_GGJZHGY_LMGL_DATA temporary tablespace TBS_GGJZHGY_LMGL_TEMP;
grant create session,create table,create view,create sequence,unlimited tablespace,connect,resource,dba to 用户名;
创建的用户名可以和源数据不一致,如果不一致,导入时需要用参数指定
5.导入数据库文件
在cmd窗口中执行
-- 导入命令
cmd:
impdp 用户名/密码 directory=DATA_PUMP_DIR dumpfile=数据库文件名.DMP logfile=数据库文件名.log full=y
以上命令是原数据和导入数据的用户名和表空间名一致的情况下的导入,下面列出不一致的导入命令
-- 导入命令 cmd: impdp 用户名/密码@127.0.0.1:1521/数据库名 directory=DATA_PUMP_DIR dumpfile=数据库文件名.dmp remap_schema=原用户名:新用户名 remap_tablespace=原永久表空间名:新永久表空间名 transform=OID:N
说明:
REMAP_SCHEMA可以定义用户的切换
REMAP_TABLESPACE可以定义切换对象的不同表空间
可以定义多个转换,用逗号隔开
导入遇到的报错:ORA-02304: 无效的对象标识符文字
解决方法:
如果Schema中有type类型,就会出现 ORA-02304 错误。
对于create type失败,可在导入命令中末尾加上 transform=OID:N
可以参考下面的说明。
大意就是说如果TRANSFORM参数设置成OID=N,表示在imp的时候,新创建的表或这个类型会赋予新的OID,
而不是dmp文件中包含的OID的值。但是这个参数的默认值是OID=Y,因此在进行Imp的时候,
新创建的表或者type会赋予同样的OID,如果是位于同一个数据库上的不同schema,那就会造成OID冲突的问题,
因此解决这个问题也很简单,只需要在impdp的时候,显示设置transform 参数为OID=N既可以了。
如下所示,
impdp test/test directory=dump_dir dumpfile=dump.dmp logfile=dump.log remap_schema=frank:test transform=OID:N
导入结束
参考文档:
https://blog.csdn.net/weixin_46291263/article/details/131974468
https://blog.csdn.net/seeseait/article/details/40932161
https://blog.csdn.net/zkk1973/article/details/88572237
https://blog.csdn.net/zutsoft/article/details/45331041
https://blog.itpub.net/69950231/viewspace-2671750/