ORACLE数据库数据的备份与恢复
? 原创作品,转自请在文字开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10052949.html 数据备份恢复在数据库管理中至关重要,今天,总结一下数据库备份与恢复需要注意的方面和实际操作!、 一、在备份之前首先应该执行commit语句,将所有未提交的数据进行提交,(提交了的数据也有可能在内存),执行alter system checkpoint语句,所有的脏数据(内存中所有修改过的数据,这些数据有可能被提交,也有可能未被提交)都会被写入到了磁盘上,但是如果被写入磁盘的数据块处于未提交状态,那么另外一个会话登入后是不可见的! commit:标志了事务的提交,数据的生效,其他用户或者会话才是可见的,不管该数据是在磁盘上还是在内存中。 commit后首先将redo保存到磁盘,首先保存redo而不保存数据的原因是redo的保存比修改数据的保存快很大,保证了数据提交的速度,而且一旦redo被保存,那么即使数据没有被保存,也可以通过redo将该数据恢复,所以,redo的保存保证了数据的安全。 redo保证了数据的安全,此时再执行checkpoint,并不是多此一举,将内存数据写入磁盘,一是保证内存的利用率,不至于内存脏数据太大,二是对于数据恢复有很大的作用 ? 二、实例恢复发生在oracle启动的第三个阶段 第一阶段:startup nomount(读取spfile),没有进行实例恢复 第二阶段:alter database mount(读取控制文件),没有进行实例恢复 第三阶段:alter database open(检查控制文件,数据文件头,检查数据完整性),进行实例恢复 下面将数据库强制关闭,shutdown abort(强制关闭,这样关闭快速,但是一些内存数据不会被保存到数据库磁盘,在数据库下次启动的时候就会进行实例恢复,在实际环境中不建议这样关闭),然后分阶段启动数据库: 数据库实例恢复的大概原理:Oracle在打开数据库时(alter database open),会检查每个文件头上的信息(SCN),并同控制文件中相应的信息(SCN)比较,如果不一致,则进行实例恢复。 ? 实例恢复的过程 : 首先:前滚 rolling forward ,读取状态为current和active状态的日志(redo log),将发生crash时,没有来得及写到磁盘上的数据块,使用redo的信息来恢复。 其次:打开数据库(alter database open) 最后:回滚 rolling back: 将没有提交的事务进行回滚。 ? 三:介质恢复 当发生以下情况时,实例恢复无效,需要进行介质恢复: 1、数据文件丢失,损坏 2、在线日志文件(online redo)丢失,损坏 3、数据文件太旧 (比如从一个备份集中恢复过来的文件) 4、文件太新(比如,其它所有的文件都是从备份中恢复过来的) 如下图:将数据文件11号文件offline之后,进行11号文件恢复,显示出错,这种错误就是数据文件太旧无法恢复 ? ?四、数据库的备份方式 1、Rman(物理备份):针对 数据库,表空间,数据文件,数据块,这种方案备份的速度很慢,不建议备份在线日志文件,其他文件都可以备份 2、exp,expdp(逻辑备份):针对 用户,数据库对象(表,分区...),这种备份方案对数据的完整性保证不是很好 3、只读表空间+传递表空间,这种备份方案要求将某些表空间置为只读形式,类似与数据仓库,不能再改变 4、Data guard,这种备份方案比较常用 ? 五、数据库备份操作 1、Rman备份:首先建议将数据运行在归档模式下 其次,以rman模式登录数据库,如果全库备份,直接使用下面命令备份就好 ? 如果备份个别表空间,则首先我们看看有哪些表空间 随便选择一个表空间,我们就选择users表空间进行备份,可以看到速度很快 接下来恢复该表空间,过程都是很快的 2、export 备份:export? 用户名/密码 file=用户名.dmp? 导出该用户下的所有表 恢复: import??用户名/密码 file=用户名.dmp full=y(表示全部导入) ? ? ? ? ? ??import??用户名/密码 file=用户名.dmp tables=tt(表示导入tt表) ? ? ? ?持续更新...... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |