Linux下的Oracle的数据库备份与恢复(emp和imp命令)

Oracle 专栏收录该内容
12 篇文章 1 订阅

                                      Linux下的Oracle的数据库备份与恢复(emp和imp命令)

相比MySQL,Oracle的备份与恢复命令更为强大,备份命令为emp,恢复命令为imp。其中所使用的逻辑文件通常后缀为dmp,oracle的逻辑备份文件,常用于数据库逻辑 备份,数据库 迁移等操作。

 

exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移

它有三种模式:
       a.  用户模式: 导出用户所有对象以及对象中的数据;
       b.  表模式: 导出用户所有表或者指定的表;
       c.  整个数据库: 导出数据库中所有对象。

imp导入工具它有三种模式:
       a.  用户模式: 导入用户所有对象以及对象中的数据;
       b.  表模式: 导入用户所有表或者指定的表;
       c.  整个数据库: 导入数据库中所有对象。

imp所执行的步骤: 
   (1) create table  (2) insert data  (3) create index (4) create triggers,constraints --新建表,插入数据,生成索引,新建触发器,各类约束。

需要注意的是,只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入 

使用导入工具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使用的字符集不同 
      如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息. 
      导入完成后再改回来. 

select * from v$nls_parameters where parameter='NLS_CHARACTERSET'; --查询当前系统所使用的字符集

select * from v$nls_parameters; --查询所有有关字符集的参数

修改系统的字符集:

在oracle 8之前,可以用直接修改数据字典表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是直接读取的数据块,直接从数据块写进目标文件。

 

先来个简单的示例,导出用户zsk的emp表和导入emp表。

a,导出用户zsk的emp表

说明,zsk用户是一个新用户,emp表也自己建立,建表完成后,导出这个emp表为文件,然后删除emp表,在导入文件恢复emp表。

b,建立zsk用户并赋予相应的权限

进入sqlplus,使用sys用户登陆数据库,新建zsk用户,赋予建表权限,数据插入权限,删除表权限。

create user zsk identified by zsk; grant create session to zsk;grant  unlimited tablespace to zsk;​​​​​​​grant create any table to zsk;--连接数据库权限,读取表空间权限,新建表权限,就这几个权限够了,zsk用户密码为zsk。

c,建立示例表emp,建表SQL语句如下,插入14条记录:

create table EMP
(
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2)
)
;
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (1, 'dog', 'code', 7369, to_date('05-06-2018', 'dd-mm-yyyy'), 5000, 5000, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 
30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 
20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 
30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, null, 
30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 
20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000, null, 
10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 0, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);
commit;

d,导出该emp表

在Oracle用户下,输入命令exp进入交互式

[oracle@centos11 ~]$ exp

Export: Release 11.2.0.1.0 - Production on Tue Jan 19 20:13:43 2021

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


Username: zsk
Password: 

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 > 

(2)U(sers), or (3)T(ables): (2)U > T

Export table data (yes/no): yes > 

Compress extents (yes/no): yes > 

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

About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > emp

. . exporting table                            EMP         14 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > 

Export terminated successfully without warnings.

保存的文件在Oracle用户目录下的oracle目录下,以上都是默认,在RETURN toquit 这一行后面输入要备份的表名,然后一路回车即可。以上导出是默认开启压缩,导出表数据,输入的T表示导出单表。第二个RETURN to quit 是当你想要在导出第二张表的时候输入,如果不想导出,直接回车即可。

e,导入emp数据库。

首先sqlplus登陆zsk,删除emp表。drop table emp;

然后执行命令: imp zsk/zsk@test file=/home/oracle/expdat.dmp

数据库名称为test,因此@后写test,输入如下为正常:

[oracle@centos11 ~]$ imp zsk/zsk@test file=/home/oracle/emp.dmp

Import: Release 11.2.0.1.0 - Production on Tue Jan 19 20:25:06 2021

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
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing ZSK's objects into ZSK
. importing ZSK's objects into ZSK
. . importing table                         "EMPS"         14 rows imported
Import terminated successfully without warnings.

如果原表没有删除就导入的话,那么会报错对象以存在,报错如下,虽然也是successfully:

[oracle@centos11 ~]$ imp zsk/zsk@test file=/home/oracle/expdat.dmp

Import: Release 11.2.0.1.0 - Production on Tue Jan 19 20:27:24 2021

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
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing ZSK's objects into ZSK
. importing ZSK's objects into ZSK
IMP-00015: following statement failed because the object already exists:
 "CREATE TABLE "EMPS" ("EMPNO" NUMBER(4, 0), "ENAME" VARCHAR2(10), "JOB" VARC"
 "HAR2(9), "MGR" NUMBER(4, 0), "HIREDATE" DATE, "SAL" NUMBER(7, 2), "COMM" NU"
 "MBER(7, 2), "DEPTNO" NUMBER(2, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRA"
 "NS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST"
 " GROUPS 1 BUFFER_POOL DEFAULT)                    LOGGING NOCOMPRESS"
Import terminated successfully with warnings.

 

 

 


    
   i

 

  • 0
    点赞
  • 0
    评论
  • 5
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:鲸 设计师:meimeiellie 返回首页

打赏作者

zsk_john

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值