15.1.7 哪些情况将导致数据丢失
在数据库运行的过程中,很多情况都会导致数据的丢失,在不同情况下,恢复的方法也是不一样的。下面列出了几种典型情况。
1.语句失败
语句失败指的是用户的SQL语句没有执行成功,导致用户修改的数据没有写入数据库。例如,用户试图向表中写入错误类型的数据;用户写入的数据违反了表上的约束;用户执行了没有权限的访问;数据文件没有足够的存储空间且不能自动扩展;数据文件所在的磁盘没有足够的存储空间。
在这些情况下,数据库服务器将对事务进行回滚,保证这样的数据不能写入数据库。另一方面,应用程序的开发人员在开发应用程序时应该处理这种情况,保证把事务的处理结果通知用户。
2.用户进程失败
用户进程失败指的是访问数据库的客户机意外关机,或者客户端应用程序意外终止。无论是什么原因,实例中的PMON进程都将进行清理工作,把用户的事务进行回滚,把用户进程所占用的资源及锁全部释放。
3.用户错误
用户错误指的是由于误操作或者恶意的操作而导致数据的丢失。例如,不小心删除了某个重要的表,或者恶意清空了一个表中的数据。这时候需要人工进行恢复。可以采用下面方法:
·利用以前导出的数据恢复数据。
·对数据库进行基于时间点的恢复,把数据库恢复到丢失数据的时间点之前。
·利用Flashback进行恢复。
·利用回收站恢复被删除的表。
4.实例失败
实例失败指的是数据库服务器意外关闭的情况。在重新启动实例时,SMON后台进程将根据重做日志进行实例恢复,把所有没有提交的事务进行回滚。
假设用户执行了一个事务,但是还没有提交,那么这样的事务将被回滚。如果用户提交了这个事务,那么根据第4章中的介绍,这次事务修改的数据可能已经写入数据库,也可能没有,但是不管怎样,只要提交了,事务就是有效的。在重新启动实例时,SMON后台进程进行实例恢复,这样的数据将被写入数据库。
5.介质失败
介质失败指的是由于磁盘损坏、病毒感染,或者人为原因导致数据库中的文件无法访问的情况,这是管理员真正需要关心的情况。针对这种情况进行的恢复叫做介质恢复。在后面的章节中,主要介绍介质恢复。