逻辑备份中的EXP/IMP备份

一、备份方式分类

 逻辑备份提取数据库的数据内容,而不是备份数据块;物理备份是拷贝整个的数据文件。

 

二、备份策略

 

三、逻辑备份与恢复

1、三种模式

a、用户模式:导出用户所有对象以及对象中的数据

b、表模式:导出用户所有表或指定的表

c、整个数据库:导出数据库的所有对象

 

2、exp/imp和expdp/impdp的区别

a、imp只适用于exp导出的文件,不适用于expdp导出的文件;impdp只是用与expdp导出的文件,不适用于exp导出的文件。

b、exp和imp工具是传统的导出和导入,在10g之前使用;10g后提供数据泵expdp和impdp工具

c、exp和imp是客户端工具程序,既可以在客户端也可以在服务器端使用(即电脑上有数据库的服务器端,或者拥有远程服务器的TNSNAME),效率低;expdp和impdp是服务端的工具程序,只能在服务端使用(电脑上要有数据库的服务器端),效率高。

 

3、exp

查看相关参数讲解

exp help=y

 

a、常用相关参数项

USERID              --用户名/口令
FULL                --导出整个文件
BUFFER              --数据缓冲区的大小
OWNER               --导出指定的所有者用户名列表
FILE                --输出文件
TABLE               --导出指定的表名列表
GRANTS              --导出权限
ROWS                --导出数据行
LOG --屏幕输出的日志文件
INDEXES --导出索引
INCTYPE --增量导入导出类型,有complete(默认,完全增量导出,全备)、cumulative(累积型增量导出,导出自上次完全增量导出后变化的数据)、incremental(增量型增量导出,导出上一次备份后变化的结果)三种
COMPRESS --是否压缩导出的文件
FEEDBACK --显示每x行的进度 TABLESPACES
--导出指定的表空间列表

 

b、查询可以导出的数据库

select account_status,username from dba_users order by 1;
--查看用户状态
--状态是OPEN的用户可以导出

 

这样显示不简洁,可以通过SQL语句进行调整。

set linesize 300;
--修改显示列数,set这三个英文字符占了3列
set pagesize 100;
--修改显示行数
col col_name for a50;
--col_name列占50列,这里col_name=account_status或username,其中for相当于format

 

c、创建目录

①首先在主机某目录下创建一个实体文件夹(D盘下的expTest文件夹),用管理员身份登录数据库,创建逻辑目录。

create directory expTest as 'D:\expTest';
--逻辑目录是expTest,导出的文件存储在D盘下的expTest目录下
--如果没有在主机下创建一个实体文件夹,会出现"exp-00028无法打开文件进行写入"的警告,而且导出的文件也不知道在哪找

 

②查看管理员目录

select * from dba_directories;

 

d、导出

(导入导出数据语句执行是在系统层面,而不是在数据库层面)

①完全模式(整个数据库)

EXP CMH/123456 FILE=D:\expTest\all.dmp log=D:\expTest\all.log FULL=Y;
--EXP USERID FILE=LOCATION.DMP LOG=LOCATION.LOG FULL=Y
--USERID=CMH/123456,CMH是用户名,123456是密码
--LOCATION.DMP=D:\expTest\all.dmp,LOCATION.LOG=D:\expTest\all.log,备份文件和日志保存在D盘expTest文件夹
--FULL=Y将整个数据库全部导出,如果没有full=y则将模式CMH下的所有数据库对象
--(用户与模式一一对应,用户是用连接数据库和访问数据库对象的,模式是管理对象的)

 

 

 出现EXP-00091问题,导出成功终止,但出现警告。查询相关解答之后发现是“字符集不匹配”的原因。

select * from nls_database_parameters;
--查询数据库的字符集
--NLS_LANGUAGE指定服务器消息的语言,影响提示信息是中文还是英文
--NLS_TERRITORY指定服务器的日期和数字格式
--NLS_CHARACTERSET指定服务器的字符集
--也可用select * from v$nls_parameters;

 

查看主机环境变量的NLS_LANG。cmd输入regedit,在HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraDb11g_home1

 

在命令窗口设置nls_lang与服务器保持一致,后导出成功且没有警告

set nls_lang=american_america.al32utf8
--方法二:statistics=none显示的不进行统计量导出;
--方法三:直接使用Data Pump工具

全导出出现EXP-00107错误原因:VirTual columns是ORACLE Database 11g开始支持的feature,传统的exp和imp工具不支持

 

②用户模式

EXP CMH/123456 FILE=D:\expTest\USER.DMP log=D:\expTest\user.log OWNER=(CMH,scott);
--EXP USERID FILE=LOCATION.DMP LOG=LOCATION.LOG OWNER=(USER);
--USERID=CMH/123456,CMH是用户名,123456是密码
--LOCATION.DMP=D:\expTest\USER.DMP,备份到D盘expTest文件夹下的USER.DMP文件
--OWNER=(CMH,scott);表示备份某用户下的所有表

 

③表模式

EXP CMH/123456 FILE=D:\expTest\TABLES.DMP LOG=D:\expTest\table.log TABLES=(ACCU,ATEST);
--EXP USERID FILE=LOCATION.DMP OWNER=(TABLE1,TABLE2);
--USERID=CMH/123456,CMH是用户名,123456是密码
--LOCATION.DMP=D:\expTest\TABLES.DMP,备份到D盘expTest文件夹下的TABLES.DMP文件
--TABLES=(ACCU,ATEST);表示备份指定的ACCU\ATEST表

 

 

4、imp

查看相关参数项

imp help=y

 

a、常用相关参数项

USERID       --用户名/口令
FULL         --导入整个文件
BUFFER       --数据缓冲区大小
FILE         --输入文件
FROMUSER --导入某用户下的数据
TOUSER --将FROMUSER用户下的数据导到TOUSER用户下 TABLES
--需要导入的表名列表 COMMIT --提交数组插入 ROWS --导入数据行 LOG --屏幕输出的日志文件

b、导入

imp cmh/123456 file=D:\expTest\all.dmp log=D:\expTest\imp-all.log full=y;

 执行之后会出现错误IMP-00015:由于对象已存在,下列语句失败

这是因为库里面已经有该用户和该表,导入不会覆盖原来的对象,可以将用户删除之后再导入,但是full=y是全导入,删除所有用户很难实现,可以删除某用户之后再导入该用户

drop user cmh cascade;
--删除用户cmh
create user cmh identified by 123456;
--创建用户cmh
grant create session to cmh;
--给用户cmh授权create session权限
imp cmh/123456 file=D:\expTest\all.dmp log=D:\expTest\imp-all.log fromuser=cmh
--如果后面是用户名就不要加上 ; 分号,否则会出现IMP-00034:警告:在导出文件中未找到 FromUser "CMH;"

导入特定用户之后会出现IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件

解决方法是grant  dba to cmh

 

参考连接:完全备份、差异备份以及增量备份1

                 完全备份、差异备份以及增量备份2

                 逻辑备份exp/imp方式1

                 逻辑备份exp/imp方式2

                 逻辑备份exp/imp方式

posted @ 2022-01-20 14:33  微风徐徐$  阅读(1137)  评论(0编辑  收藏  举报