数据库(表)的逻辑备份与恢复
介绍
逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程。
逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程。
物理备份即可在数据库open的状态下进行也可在关闭数据库后进行,但是逻辑备份和恢复只能在open的状态下进行。
导出
导出具体的分为:导出表,导出方案,导出数据库三种方式。
导出使用exp命令来完成的,该命令常用的选项有:
userid: 用于指定执行导出操作的用户名,口令,连接字符串 连接字符串指网络服务命令。指定谁来执行导出操作
tables: 用于指定执行导出操作的表 导出哪个表
owner: 用于指定执行导出操作的方案 导出哪个方案
full=y: 用于指定执行导出操作的数据库 导出哪个数据库
inctype: 用于指定执行导出操作的增量类型 导出操作的增量类型
rows: 用于指定执行导出操作是否要导出表中的数据 是否要导出表中的数据
file: 用于指定导出文件名 导出到的文件
导出表
1.导出自己的表
exp userid=scott/[email protected] tables=(emp,dept) file=d:\e1.dmp
2.导出其它方案的表
如果用户要导出其它方案的表,则需要dba的权限或是exp_full_database的权限,比如system就可以导出scott的表
E:\oracle\ora92\bin>exp userid=system/[email protected] tables=(scott.emp) file=d:\e2.emp
特别说明:在导入和导出的时候,要到oracle目录的bin目录下。 我想设完环境变量后就不用了。
3. 导出表的结构
exp userid=scott/[email protected] tables=(emp) file=d:\e3.dmp? rows=n
4. 使用直接导出方式
exp userid=scott/[email protected] tables=(emp) file=d:\e4.dmp? direct=y
这种方式比默认的常规方式速度要快,当数据量大时,可以考虑使用这样的方法。
这时需要数据库的字符集要与客户端字符集完全一致,否则会报错...
导出方案
导出方案是指使用export工具导出一个方案或是多个方案中的所有对象(表,索引,约束...)和数据。并存放到文件中。
1. 导出自己的方案
exp userid=scott/[email protected] owner=scott file=d:\scott.dmp
2. 导出其它方案
如果用户要导出其它方案,则需要dba的权限或是exp_full_database的权限,比如system用户就可以导出任何方案
exp userid=system/[email protected] owner=(system,scott) file=d:\system.dmp
导出数据库
导出数据库是指利用export导出所有数据库中的对象及数据,要求该用户具有dba的权限或者是exp_full_database权限
增量备份(好处是第一次备份后,第二次备份就快很多了)
exp userid=system/[email protected] full=y inctype=complete file=d:\all.dmp
导入
介绍
导入就是使用工具import将文件中的对象和数据导入到数据库中
,但是导入要使用的文件必须是export所导出的文件。
与导出相似,导入也分为导入表,导入方案,导入数据库三种方式。
imp常用的选项有
userid: 用于指定执行导入操作的用户名,口令,连接字符串
tables: 用于指定执行导入操作的表
formuser: 用于指定源用户
touser: 用于指定目标用户
file: 用于指定导入文件名
full=y: 用于指定执行导入整个文件
inctype: 用于指定执行导入操作的增量类型
rows: 指定是否要导入表行(数据)
ignore: 如果表存在,则只导入数据
导入表
1. 导入自己的表
imp userid=scott/[email protected] tables=(emp) file=d:\xx.dmp 这里面不用写fromuser touser 默认的是自己
2. 导入表到其它用户
要求该用户具有dba的权限,或是imp_full_database
imp userid=system/[email protected] tables=(emp) file=d:\xx.dmp touser=scott 这里面没有写fromuser 默认的是自己
3. 导入表的结构
只导入表的结构而不导入数据
imp userid=scott/[email protected] tables=(emp) file=d:\xx.dmp? rows=n
4. 导入数据
如果对象(如比表)已经存在可以只导入表的数据
imp userid=scott/[email protected] tables=(emp) file=d:\xx.dmp? ignore=y
导入方案
导入方案是指使用import工具将文件中的对象和数据导入到一个或是多个方案中。如果要导入其它方案,要求该用户具有dba的权限,或者imp_full_database
1. 导入自身的方案
imp userid=scott/tiger file=d:\xxx.dmp
2. 导入其它方案
要求该用户具有dba的权限
imp userid=system/manager file=d:\xxx.dmp fromuser=system touser=scott
导入数据库
在默认情况下,当导入数据库时,会导入所有对象结构和数据,案例如下:
imp userid=system/manager full=y file=d:\xxx.dmp
查看具体的命令模式
$exp help=y
$imp help=y
一、导出工具exp
1 它是操作系统下一个可执行的文件
存放目录/ORACLE_HOME/bin
exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移
它有三种模式:
a. 用户模式: 导出用户所有对象以及对象中的数据;
b. 表模式: 导出用户所有表或者指定的表;
c. 整个数据库: 导出数据库中所有对象。
二、导入工具imp 它是操作系统下一个可执行的文件
存放目录/ORACLE_HOME/bin
imp导入工具将EXP形成的二进制系统文件导入到数据库中.
它有三种模式:
a. 用户模式: 导出用户所有对象以及对象中的数据;
b. 表模式: 导出用户所有表或者指定的表;
c. 整个数据库: 导出数据库中所有对象。
只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入
导入导出(imp/exp) 某个用户表下面的所有数据 注意:必须是用oracle用户登录
1、导出某个用户的所有对象 exp testa/[email protected] owner= testa file=/home/oracle/testa.dmp
如果有多个用户的话,可以用逗号隔开 如
exp testa/[email protected] owner=(testa,testb) file=/home/oracle/testa.dmp
2、导入某个用户的数据 imp testa/[email protected] fromuser =testa touser =testa file=/home/oracle/testa.dmp 注意:
注:如果在导入时有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上ignore=y 就可以了。
要保证导入的用户的表空间的名称和导出的表空间名称是一样的
导入前最好保证要导入用户里面没有重复的对象和数据,要不导入会不成功。
3、导出和导入某个用户下的某张表
exp test/[email protected] file=/home/oracle/Desktop/t_area.dmp log=t_area.log tables=t_area
Export: Release 11.2.0.1.0 - Production on Mon May 7 15:03:47 2012 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 ZHS16GBK character set and AL16UTF16 NCHAR
character set server uses AL32UTF8 character set (possible charset conversion)
About to export specified tables via Conventional Path ... . . exporting table
T_AREA 31 rows exported EXP-00091: Exporting questionable statistics. Export
terminated successfully with warnings.
会出现这个提示是因为终端的字符集和数据库的字符集不一样,
解决方法是将终端的字符集设置的和数据库的一样,这样之后,
有关数据库的提示从英文也变成中文
解决步骤: oracle身份登陆 sqlplus / as sysdba
SQL>?select?PROPERTY_VALUE?from?database_properties?where?property_name?like?‘%SET%‘;?
PROPERTY_VALUE?
--------------------------------------------------------------------------------?AL32UTF8?AL16UTF16?
然后退出sqlplus,回到linux终端?
?echo?$NLS_LANG?
AMERICAN_AMERICA.ZHS16GBK?
?export?NLS_LANG="Simplified?Chinese_china.AL32UTF8"?
?exp?test/[email protected]?file=t_area.dmp?log=t_area.log?tables=t_area?
Export:?Release?11.2.0.1.0?-?Production?on?星期一?5月?7?15:04:44?2012?Copyright?(c)?1982,?2009,?Oracle?and/or?its?affiliates.??All?rights?reserved.?
连接到:?Oracle?Database?11g?Enterprise?Edition?Release?11.2.0.1.0?-?64bit?Production?With?the?Partitioning,?OLAP,?Data?Mining?and?Real?Application?Testing?options?已导出?AL32UTF8?字符集和?AL16UTF16?NCHAR?字符集?即将导出指定的表通过常规路径...?
.?.?正在导出表??????????????????????????T_AREA导出了????????31?行?
成功终止导出,?没有出现警告。?
?
4、导入某个用户下的某张表?
?imp?test/[email protected]??file=/home/oracle/Desktop/t_area.dmp?tables=t_area?commit=y?ignore=y?
注意导入之前最好保证该用户没有相关的表和数据?
5、怎样用SYS用户执行EXP操作?方法1?
exp?\‘sys/ab123489?as?sysdba\‘?file=/home/oracle/s.dmp?full=y?compress=y?方法2?
exp?\"sys/[email protected]?as?sysdba\"?file=/home/oracle/u.dmp?full=y?compress=y?
方法3?
?exp?"‘/@实例名?as?sysdba‘"?Enter?array?fetch?buffer?size:?4096?>
Export?file:?expdat.dmp?>?
(1)E(ntire?database),?(2)U(sers),?or?(3)T(ables):?(2)U?>???1?Export?grants?(yes/no):?yes?>?Export?table?data?(yes/no):?yes?>?Compress?extents?(yes/no):?yes?>?
?
8、解决使用oracle11g无法导出(exp/imp)空表的问题?
?11G中有个新特性,当表无数据时,不分配segment,以节省空间,这样就会没有导出数据??现在常用的方法?
?????
IMP-00008:?unrecognized?statement?in?the?export?file:?????
IMP-00008:?unrecognized?statement?in?the?export?file:?
在用imp?导入数据的时候出现IMP-00008:?unrecognized?statement?in?the?export?file:的错误,?
解决方法?
在Oracle?11g中,exp默认不能导出空表。用传统的exp,imp进行异构平台数据库迁移会比较麻烦。不过可以使用expdp、impdp进行迁移。???
把64位windows?2003的Oracle11gR2数据库迁移到64位Linux?RedHat?Enterprise?5中,可以使用expdp、impdp进行迁移数据。???
如:Linux?为A服务器,Linux为B服务器,数据库用户为test,把A服务器的数据迁移到B服务器中???
在A服务器操作?1、创建目录?
SQL>?create?directory?expdp_dir?as?‘/home/oracle/expdp_dir‘;??//一台服务器只要创建一次?2?赋予导出的用户权限?
SQL>?grant?read,write?on?directory?expdp_dir?to?test;//一台服务器只要创建一次
3、在Linux目录创建目录/home/oracle/expdp_dir mkdir -p /home/oracle/expdp_dir //一台服务器只要创建一次 4、在命令窗口导出: expdp test/test DIRECTORY=expdp_dir DUMPFILE=test.dmp logfile=testexpdp.log //每次都要操作 在B服务器中操作: 5、SQL> create directory impdp_dir as ‘/home/Oracle/impdp_dir‘;//一台服务器只要创建一次 SQL> grant read,write on directory impdp_dir to test;//一台服务器只要创建一次 6、在系统中需要有/home/Oracle/impdp_dir目录,在impdp_dir目录下必须有读写权限 (chmod 777 impdp_dir) 7、用ftp把A服务器导出的数据上传到B服务器的/home/Oracle/impdp_dir目录中 在A服务器中配置好B服务器的服务器名,在A服务器导入数据 8、在命令窗口导入: impdp test/[email protected]_database DIRECTORY=impdp_dir DUMPFILE=test.dmp logfile=testimpdp.log (这里注意大小写,如果test.dmp在linux中为大写,必须更改为大写。Linux区分大小写)
导入imp可能出现的问题
1数据库对象已经存在
一般情况,导入数据前应该彻底删除目标数据下的表,序列,函数过程,触发器
数据库对象已经存在,按缺省的imp参数,则会导入失败。
如果用了参数ignore=y,会把exp文件内的数据内容导入
如果表有唯一关键字的约束条件,不合条件将不被导入
如果表没有唯一关键字的约束条件,将引起记录重复
2 数据库对象有主外键约束
不符合汉主外键约束时,数据会导入失败。
解决办法:先导入主表,再导入已存表。
disable 目标导入对象的主外键约束,导入数据后,在enable他们
3权限不够
如果要把a用户的数据导入到b用户下,a需要拥有imp_full_database
权限。
4导入大表(大于80m)时,存储分配失败
默认的exp时,compress=y,也就是把所有的数据压缩在一个数据块上。
导入时,如果不存在连续一个大数据块,则会导入失败。
导出80m以上的大表时,记得compress=n,则不会引起这种错误。
5imp和exp使用的字符集不同
如果字符集不同,导入会失败。可以改变unix环境变量或者nt注册表里
nls_lang相关信息。
导入后再改过来。
6imp和exp版本不能往上兼容
imp可以成功导入低版本的exp生成的文件,不能导入高版本exp生成的文件
数据库的逻辑备份