Oracle数据IMP和EXP命令用法详解
作者:没有实现不了的梦
前言
Oracle 的 EXP(Export)和 IMP(Import)是两个非常重要的命令,它们用于数据库的备份和恢复。下面我们将详细介绍这两个命令及其参数的用法。
1. EXP(Export)
EXP命令可以看作是一个搬运工人,他的工作就是将你指定的物品(数据)从Oracle数据库搬出,并打包成一个 .dmp
文件。这个过程就像是你要搬家,需要将你的所有物品打包好,准备搬到新家。
以下是EXP命令的一般格式和常用参数:
exp userid=<用户名>/<密码>@<数据库连接> file=<导出文件的路径和名称> owner=<要导出的用户名称> tables=<要导出的表名称> full=<是否全库导出>
userid
:这是告诉搬运工人钥匙在哪(数据库连接信息),以及如何开门(用户名和密码)。file
:这是告诉搬运工人将物品搬到哪个箱子里(即导出文件的路径和名称)。owner
:这是指定要导出哪个公司的物品(即用户名称)。如果没有指定,那么搬运工人将打包你拥有权限的所有物品。tables
:这是指定要搬运哪些特定的物品(即表名称)。如果没有指定,那么就搬运全部的物品。full
:这是告诉搬运工人是否要打包整栋楼的物品(即是否全库导出)。如果设置为y
,则不论你是否拥有权限,只要能搬走的,他都会搬。
举例
假设我们有一个用户名为scott
,密码为tiger
,在数据库orcl
中,我们想导出该用户下的所有表,并保存到D:\backup\scott.dmp
。
exp scott/tiger@orcl file=D:\backup\scott.dmp owner=scott
在这个命令中:
- 必须的参数:
userid
(在这里是scott/tiger@orcl
),file
(在这里是D:\backup\scott.dmp
) - 可选的参数:
owner
,tables
,full
2. IMP(Import)
IMP命令就像是EXP的反向操作,是另一位搬运工人,他的工作是从 .dmp
文件中取出物品(数据)并将它们放入Oracle数据库。这个过程就像是你搬到新家后,需要将你的物品从箱子中取出并放置到合适的位置。
以下是IMP命令的一般格式和常用参数:
imp userid=<用户名>/<密码>@<数据库连接> file=<导入文件的路径和名称> fromuser=<原用户> touser=<新用户> tables=<要导入的表名称> full=<是否全库导入> ignore=<是否忽略错误>
userid
:这是告诉搬运工人钥匙在哪(数据库连接信息),以及如何开门(用户名和密码)。file
:这是告诉搬运工人在哪个箱子里取物品(即导入文件的路径和名称)。fromuser
:这是告诉搬运工人原来的物品是属于哪个公司的(即原用户)。touser
:这是告诉搬运工人将物品放到新公司的哪个地方(即新用户)。tables
:这是指定搬运工人取出箱子中的哪些特定物品(即表名称)。如果没有指定,那么就取出全部的物品。full
:这是告诉搬运工人是否要把箱子里的所有物品都取出并放到新家(即是否全库导入)。如果设置为y
,则不论是否需要,只要箱子里有,他都会取出来。ignore=y
:如果目标表已存在,将忽略错误,继续将数据导入到已存在的表中。
举例
假设我们想将上面导出的文件D:\backup\scott.dmp
导入到用户scott
,密码为tiger
在数据库orcl
中。
命令如下:
imp scott/tiger@orcl file=D:\backup\scott.dmp fromuser=scott touser=scott
在这个命令中:
- 必须的参数:
userid
(在这里是scott/tiger@orcl
),file
(在这里是D:\backup\scott.dmp
) - 可选的参数:
fromuser
,touser
,tables
,full
希望以上的解释能帮助你理解EXP和IMP命令的工作方式。
使用导入工具imp时可能出现的问题 :
(1) 数据库对象已经存在
一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等;
数据库对象已经存在, 按缺省的imp参数, 则会导入失败
如果用了参数ignore=y, 会把exp文件内的数据内容导入
如果表有唯一关键字的约束条件, 不合条件将不被导入
如果表没有唯一关键字的约束条件, 将引起记录重复
(2) 数据库对象有主外键约束
不符合主外键约束时, 数据会导入失败
解决办法: 先导入主表, 再导入依存表
disable目标导入对象的主外键约束, 导入数据后, 再enable它们
(3) 权限不够
如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限
(4) 导入大表( 大于80M ) 时, 存储分配失败
默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上
导入时, 如果不存在连续一个大数据块, 则会导入失败
导出80M以上的大表时, 记得compress= N, 则不会引起这种错误
(5) imp和exp使用的字符集不同
如果字符集不同, 导入会失败, 可以注册表里NLS_LANG相关信息
导入完成后再改回来
--查询当前系统所使用的字符集 select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
--查询所有有关字符集的参数 select * from v$nls_parameters;
修改系统的字符集:
在oracle8之前,可以用直接修改数据字典表props$ 来改变数据库的字符集,但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下
若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
SQL>STARTUP MOUNT; SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION; SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0; SQL>ALTER DATABASE OPEN; SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; //跳过超子集检测 AL32UTF8; SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;AL32UTF8;
流程为:关库,启动数据库到mount状态,进入数据库维护模式,此时只有system和sys用户可登录数据库。关闭DBMS调度程序和DBMS调度任务,关闭自动任务启动,跳过字符超子集检查,设定系统字符集,关库,重新启动数据库。
(6) imp和exp版本不能往上兼容
imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件
根据情况我们可以用
exp和imp与数据泵expdp和impdp的区别:
1、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。exp在客户端使用,要受到网速的影响,因此会比较慢。
2、expdp和impdp是服务端的工具程序,他们只能在Oracle服务端使用,不能在客户端使用。
3、imp只适用于exp导出的文件,不适用于expdp导出文件;impdp只适用于expdp导出的文件,而不适用于exp导出文件。
4、对于10g以上的服务器,使用exp通常不能导出0行数据的空表,而此时必须使用expdp导出。
5、数据泵expdp和impdp导出可以使用parallel属性指定并行任务导出,parallel=2就是并行2个任务导出。当然,这个并不是越多越好,需要考虑服务器的性能和cpu的个数等等因素。还可以通过导出多个文件的方式提高性能,即使用dumpfile=expdp.dp1,expdp.dp2这种方式提高性能。需要用户根据实际情况设置
6、exp导出时读取的是sql,通过加载sql查询结果到缓存,然后在写进目标文件,而expdp是直接读取的数据块,直接从数据块写进目标文件。
总结
到此这篇关于Oracle数据IMP和EXP命令用法详解的文章就介绍到这了,更多相关Oracle IMP和EXP命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!