逻辑备份中的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