Oracle_数据库导入导出

1. Oracle 导入导出

Oracle 的备份是 Oracle 操作中常见的工作,常见的备份方案有:逻辑备份(IMP&EXP命令进行备份)、物理文件备份(脱机及联机备份)、利用 RMAN(Recovery Manager)的增量物理文件系统备份。ORACLE 数据库的逻辑备份分为四种模式:表空间备份(tablespace)、表备份(table)、用户备份(user)和完全备份(full)。Oracle 的逻辑备份是使用 IMP&EXP 命令进行数据导入导出的操作。使用 EXP 命令导出或者使用 IMP 命令导入时,需要 Create Session 系统权限,但是如果要导出其他的表,必须拥有权限:EXP_FULL_DATABASE。

调用导入导出命令时,首先要估计所需的空间。EXP 命令导出的文件是二进制文件(*.dmp)只能由对应的 IMP 命令进行读取恢复。导入导出的用途是:

  • 备份与恢复
  • Oracle 平台更换:可以在相同版本之间进行备份与恢复,Oracle 较低版本的 export数据文件可以 import 到高版本的 Oracle 数据库中,但是 Oracle 的版本只能是相邻的,不能垮版本。

2. EXP 导出数据

EXP 命令可以在交互环境下导出数据库中的数据,也可以在非交互环境下执行命令。交互环境下的命令执行,是一步一步执行的过程。

代码演示:exp 的交互环境

[oracle@db ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Sep 19 16:16:51 2018

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> grant exp_full_database to scott;    //赋权

Grant succeeded.
[oracle@db ~]$ exp scott/tiger@orcl11g

Export: Release 11.2.0.1.0 - Production on Wed Sep 19 16:38:24 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Enter array fetch buffer size: 4096 > 

Export file: expdat.dmp > 

(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 

Export grants (yes/no): yes > 

Export table data (yes/no): yes > 

Compress extents (yes/no): yes > 

Export done in US7ASCII character set and UTF8 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)

About to export specified users ...
User to be exported: (RETURN to quit) > 

Export terminated successfully without warnings.

代码解析:

  1. Exp 是导出命令,该命令后面紧跟“用户名/密码@服务器网络连接”。
  2. Exp 程序导出时使用的缓冲区大小,缓冲区越大,导出速度越快。直接回车代表使用默认值 4096B。
  3. Exp 命令会把所有要到处的数据导出到一个 Dmp 文件中,该步骤是 Exp 询问导出的数据文件名称。
  4. Exp 程序询问导出整个用户还是导出某个表。默认导出整个用户。
  5. Exp 程序询问是否导出每张表的访问权限。默认导出访问权限。
  6. Exp 程序询问是否导出表中的数据。默认导出数据库表中的数据。
  7. Oracle 表中的数据可能来自不同的分区中的数据块,默认导出时会把所有的数据压缩在一个数据块上,IMP 导入时,如果不存在连续一个大数据块,则会导入失败。

也可以使用 Exp 命令时,设置各种参数,使准备就绪的 Exp 命令不需要与用户交互,按照参数的要求,Exp 命令会一次性执行导出工作。要指定参数,您可以使用关键字:

EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

例如: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)

参数名 说明
USERID 表示“用户名/密码”。
BUFFER 数据缓冲区大小。以字节为单位,一般在 64000 以上。
FILE 指定输出文件的路径和文件名。一般以.dmp 为后缀名,注意该文件包括完整路径,但是路径必须存在,导出命令不能自动创建路径。
COMPRESS 是否压缩导出,默认 yes。
GRANTS 是否导出权限,默认 yes
INDEXES 是否导出索引,默认 yes
DIRECT 是否直接导出,默认情况,数据先经过 Oracle 的数据缓冲区,然后再导出数据。
LOG 指定导出命令的日志所在的日志文件的位置。
ROWS 是否导出数据行,默认导出所有数据。
CONSTRAINTS 是否导出表的约束条件,默认 yes
PARFILE 可以把各种参数配置为一个文本键值形式的文件,该参数可以指定参数文件的位置。
TRIGGERS 是否导出触发器,默认值是 yes。
TABLES 表的名称列表,导出多个表可以使用逗号隔开。
TABLESPACES 导出某一个表空间的数据。
Owner 导出某一用户的数据。
Full 导出数据库的所有数据。默认值是 no。
QUERY 把查询的结果导出。

代码演示:exp 的非交互环境

[oracle@db ~]$ exp scott/tiger file=/home/oracle/employee.dmp tables=emp,dept

Export: Release 11.2.0.1.0 - Production on Wed Sep 19 16:58:08 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in US7ASCII character set and UTF8 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)

About to export specified tables via Conventional Path ...
. . exporting table                            EMP         14 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
. . exporting table                           DEPT          4 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
[oracle@db ~]$ ls
1.txt  backup  employee.dmp  oraInventory  response

3. IMP 导入

IMP 程序导入就是把 Exp 导出的文件重新导入到数据库的过程。导入时也有一些重要的参数:

  • Fromuser:指出导出时 dmp 文件中记载的用户信息。
  • Touser:dmp 文件要导入到什么目标用户中。
  • Commit:默认是 N,在缓冲区满时是否需要 commit,如果设为 N,需要较大的回滚段。
  • Igore: Oracle 在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据 ignore

参数的设置来决定如何操作。若 ignore=y,Oracle 不执行 CREATE TABLE 语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到表中。若 ignore=n,Oracle 不执行 CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。

代码演示:Imp 导入

[oracle@db ~]$ imp system/oracle file=/home/oracle/employee.dmp fromuser=scott touser=ageeklet commit=y

Import: Release 11.2.0.1.0 - Production on Wed Sep 19 17:07:20 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V11.02.00 via conventional path

Warning: the objects were exported by SCOTT, not by you

import done in US7ASCII character set and UTF8 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing SCOTT's objects into AGEEKLET
. . importing table                          "EMP"         14 rows imported
. . importing table                         "DEPT"          4 rows imported
About to enable constraints...
Import terminated successfully without warnings.

4. 常见问题

(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 使用的字符集不同

如果字符集不同,导入会失败,可以改变 unix 环境变量或者 NT 注册表里 NLS_LANG 相关信息。

(6)Imp 和 Exp 版本不能往上兼容

Imp 可以成功导入低版本 Exp 生成的文件, 不能导入高版本 Exp 生成的文件根据情况我们可以用。

猜你喜欢

转载自blog.csdn.net/ageeklet/article/details/82766677
今日推荐