数据库备份和恢复

使用导出(Export)备份
Export是操作系统下一个可执行的文件,存放目录/ORACLE_HOME/bin。

exp 导出工具将数据库中数据备份压缩成一个二进制系统文件。可以在不同OS间迁移。有三种类型的导出:
    FULL(完全)导出——导出数据库中的全部对象、结构和数据。
    OWNER(拥有者)导出——只导出那些属于特定帐户的对象。
    TABLE(表)导出——只导出指定的表和分区。

1.  Full 导出,即导出整个数据库,导出所用的帐户必须被授予EXP_FULL_DATABASE系统特权。
    对于拥有数据库系统管理员权限的帐户,例如SYSTEM。
    进入DOS,执行如下命令:
    Exp system/system@数据库网络服务名 file=export.dmp full=y

2.  OWNER 导出
    导出所用的帐户可以是被授予EXE系统特权的用户,也可以不是。
    如果是授予系统特权的用户,
    执行命令:Exp system/system@数据库网络服务名 file=export.dmp owner=用户名
    如果不是授予系统特权的用户,P_FULL_DATABAS
    执行命令:Exp 导出用户名/密码@数据库网络服务名 file=export.dmp

3.  TABLE 导出
1)  导出用户不必授予系统特权,执行命令:Exp 导出用户名/密码@数据库网络服务名  tables=表1,表2,... file=export.dmp
2)  也可以在exp里面加上导出表的查询条件,例如:exp scott/tiger@orcl tables=emp query=\"where job='salesman' and sal<1600\" file=scott2.dmp
3)  导出一个表的某个分区,执行命令:Exp 导出用户名/密码@数据库网络服务名 tables=(表名:分区名1,分区名2…) file=export.dmp

在导出会话中可以使用23个参数,可以在命令行或指定的参数文件中指明它们。
例如:
rows参数,指明是否导出表与对象的数据。如果ROWS=N,只导出对象定义。
log参数,指明放置导出会话的文件的名字,及将屏幕上的信息保存到文件中。
查看其它参数,输入exp help=y。

冷备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。
冷备份是将关键性文件拷贝到另外位置的一种做法。对于备份Oracle信息而言,冷备份是最快和最安全的方法。
值得注意的是冷备份必须是数据库关闭的情况下完成,当数据库开着的时候,执行数据库文件系统备份无效。
冷备份所需备份的文件包括以下几种:
     所有数据文件所在路径:%ORACLE_HOME%\ORADATA\ORACLE_SID\*.DBF(和*.ORA)
     所有控制文件所在路径:%ORACLE_HOME%\ORADATA\ORACLE_SID\*.CLT
     所有联机重做日志文件所在路径:%ORACLE_HOME%\ORADATA\ORACLE_SID\*.LOG
     口令文件所在路径:%ORACLE_HOME%\ORA92\DATABASE\PWD%ORACLE_SID%.ORA
     参数文件所在路径:%ORACLE_HOME%\ORA92\DATABASE\SPFILE%ORACLE_SID%.ORA
                     %ORACLE_HOME%\ADMIN\%ORACLE_SID%\PFILE\INIT.ORA.*
以上两个都是参数文件,这两种参数文件都是用来存储参数配置以供oracle读取的,但也有不同点,注意以下几点:
第一,pfile是文本文件,spfile是二进制文件;
第二,对于参数的配置,pfile可以直接以文本编辑器打开手工配置,而spfile不行,必须在数据库启动后,通过sql命令进行在线修改。
第三,pfile配置改变后,要使用其生效,必须重新启动数据库,spfile的配置生效时限和作用域可以由修改参数的sql命令指定,可以立即生效,也可以不立即生效。当然有些参数的修改必须重启数据库才能生效;
第四,可用sql命令由pfile创建spfile,也可以由spfile创建pfile;
第五,如果是手动创建数据库而不是通过DBCA,则开始创建数据库时,你只能定义pfile。因为它是文本格式的;
第六,oracle数据库只使用一个参数文件,要么是pfile,要么是spfile,那么如何判断数据库当前使用的是哪一个参数文件呢?
一种方法是能过create pfile来鉴别,如果当前使用的不是spfile,则相应格式的create pfile会产生错误。
另一种方法是show parameter spfile命令,用来显示spfile的位置,如果显示的值为空,则表示使用的是pfile。
如果不特殊指定数据库启动时使用pfile,默认使用的则是spfile,如果启动时没有找到spfile,则自动去找pfile。

冷备份的步骤:
1.正常关闭要备份的实例(instance)
2.备份涉及的文件到一个目录
3.启动数据库。

数据库恢复
使用导入(IMPORT)恢复

导入工具imp是操作系统下一个可执行的文件,存放目录/ORACLE_HOME/bin。imp导入工具将EXP形成的二进制系统文件导入到数据库中。
它有三种类型的导入:
    FULL(完全)导入——导入数据库中的全部对象、结构和数据。
    OWNER(拥有者)导入——只导入那些属于特定帐户的对象。
    TABLE(表)导入——只导入指定的表和分区。
导入步骤:
1)  创建表;
2)  插入数据;
3)  创建索引;
4)  创建触发器,约束限制。

1.  Full导入(对应Full导出)
    即导入整个数据库,导入所用的帐户必须被授予IMP_FULL_DATABASE系统特权。对于拥有数据库系统管理员权限的帐户,例如SYSTEM。
    进入DOS,执行如下命令:
    Imp system/system@数据库网络服务名 file=export.dmp full=y
2.  OWNER导入(对应OWNER导出)
    导入所用的帐户可以是被授予IMP_FULL_DATABASE系统特权的用户,也可以不是。
    执行命令:Imp system/system@数据库网络服务名 file=export.dmp fromuser=导出用户名 touser= 要导入的用户名
3.  TABLE导入(对应TABLE导出)
1)  导入用户不必授予系统特权,执行命令Imp 导入用户名/密码@数据库网络服务名 tables=表1,表2… file=export.dmp
2)  导入一个表的某个分区,执行命令:Imp 导入用户名/密码@数据库网络服务名 tables=(表名:分区名1,分区名2…) file=export.dmp

在导入会话中可以使用27个参数,可以在命令行或指定的参数文件中指明它们。
例如:
rows参数,指明是否导入表与对象的数据。如果ROWS=N,只导入对象定义,不导入数据。
log参数,指明放置导入会话的文件的名字,及将屏幕上的信息保存到文件中。
Ignore参数,如果想要将数据导入一个早已存在的表中,使用Ignore=y参数声明。这会导致数据追加到表中。
如果违反约束,如具有相同主键的重复记录,不装载那些违反约束的记录。约束的存在对于防止向表中导入重复记录是有帮助的。
查看其它参数,输入imp help=y,
下面是一些导入语句的例子:
$ imp system/manager fromuser=jones tables=(accts)
$ imp system/manager fromuser=scott tables=(emp,dept)
$ imp system/manager fromuser=scott touser=joe tables=emp
$ imp scott/tiger file=expdat.dmp full=y
$ imp scott/tiger file=/mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log

导入工具imp可能出现的问题:
(1)  数据库对象已经存在
     一般情况,导入数据前应该彻底删除目标数据下的表,序列,函数/过程,触发器等;
     数据库对象已经存在,按缺省的imp参数,则会导入失败;
     如果用了参数ignore=y,会把exp文件内的数据内容导入;
     如果表有唯一关键字的约束条件,不合条件将不被导入;
     如果表没有唯一关键字的约束条件,将引起记录重复。
(2)  数据库对象有主外键约束不符合主外键约束时,数据会导入失败;
     解决办法:先导入主表,再导入依存表;
     isable目标导入对象的主外键约束,导入数据后,再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生成的文件根据情况我们可以用
     $ imp username/password@connect_string
     说明:connect_string是在/ORACLE_HOME/network/admin/tnsnames.ora定义的本地或者远端数据库的名称
注意事项:要定义本地或者远端数据库服务器的主机名和IP地址的对应关系
UNIX: /etc/hosts
win98: windows\hosts
win2000: winnt\system32\drivers\etc\hosts

用冷备份进行数据库恢复
如果数据库是运行在非归档日志模式下,将备份文件拷贝回原来的目录即可。非归档日志模式下数据库只能恢复到备份时刻的状态。
如果数据库是运行在归档日志模式下,将数据文件拷回原来的目录(不包括联机重做日志文件),
然后依次选择相应的重做日志文件进行恢复,即可恢复冷备份后的所有操作,即是说可以恢复到系统崩溃前的状态。
windows环境下的冷备份恢复:
在同一机器的同一数据库上进行恢复
1.  进入sql*plus,以sysdb 的身份登录数据库
SQL>sys/密码@网络服务名 as sysdba
2.  关闭数据库 SQL>shutdown immediate
3.  拷贝备份文件到对应的目录下
4.  open 数据库
在不同机器上进行恢复(数据库安装路径相同)前提:数据库为同样版本,所在机器为同样操作系统平台
1.  新建一个实例(名称和原来相同)
2.  进入sql*plus,以 sysdba 的身份登录数据库
SQL>sys/密码@网络服务名 as sysdba
3.  关闭数据库 SQL>shutdown immediate
4.  拷贝备份文件到对应的目录下
5.  open 数据库
在不同机器上进行恢复(数据库安装路径不同)前提:数据库为同样版本,所在机器为同样操作系统平台
1.  新建一个实例(名称和原来相同)
2.  进入sql*plus,以 sysdba 的身份登录数据库
    SQL>sys/密码@网络服务名 as sysdba
3.  关闭数据库 SQL>shutdown immediate
4.  拷贝备份文件到对应的目录下 注意:不要拷贝参数文件
5.  mount 数据库
6.  调整控制文件中的文件指针 数据文件:
    SQL>alter database rename file 'C:\oracle\oradata\%oracle_sid%\system01.dbf' to 'D:\oracle\oradata\%oracle_sid%\system01.dbf'
    重做日志文件:
    SQL>alter database rename file 'C:\oracle\oradata\%oracle_sid%\ redo01.log' to' D:\oracle\oradata\%oracle_sid%\redo01.log'
7.  open 数据库

posted on 2008-01-03 12:40  Game_over  阅读(1565)  评论(0编辑  收藏  举报