数据库管理员最重要的工作可能是确保数据库不会丢失数据。无论DBA进行过任何操作,重做与撤销机制都能够保证数据库绝对不会出现讹误。但是,如果DBA没有做任何的预防措施,那么Oracle数据库仍然可能丢失数据,所以,我们必须通过配置Oracle数据库在任何情况下都不会有数据的损失,同时使其配置环境百分之百的可用。
DBA的目标就是在减少MTTR(平均恢复时间即数据库出现失败后的停机,解决办法就是:实践、实践、实践!不断的进行仿真实验)和数据损失(解决办法就是:Data Guard)的同时增加MTBF(平均失败时间即数据库出现失败的频繁度,解决方法就是:RAC和Streams)。
数据库失败原因各种各样:
语句失败,一条SQL语句也可能是由于多种原因失败的,例如无效数据(invalid data)是语句失败的常见原因,这种情况通常是由于违反了格式或完整性约束所造成的,DBA必须与用户一起处理问题,从而使数据正确有效,并且还必须与编程人员一起尝试自动进行这些处理;第二个原因是由于应用程序中的逻辑错误(logic error)组成,例如死锁、试图在父记录前插入一条子记录;空间管理(space management)问题是一个常见问题,同时又是一个不应该出现的问题,应当及时发现或预测空间的容量。
用户进程失败,用户的非登出的异常退出、终端的重启、导致地址违规的程序都可能导致用户进程失败,但是结果是相同的。PMON后台进程通过定时的轮询所有的服务器进程来确定会话的状态。如果某个服务器进程报告丢失了与其用户进程的联系,此时PMON进程会解决这个问题。
网络失败,DBA应该通过Oracle Net来杜绝网络失败,注意三个方面:侦听器、网络接口卡及路由。
用户错误,就Oracle而言,其所关心的是事务。ACID测试中表示“持久性Durability”的“D”规定,一旦事务被提交,那么其他所有的用户都必须能够立刻看到所作的变化,并且这些变化是绝对不可逆的。不过对于DML(Data Manipulation Language 数据操作语言——用于检索或修改数据) 错误来说,用户在提交前发现的错误仍然有机会回滚,但是对于DDL(Data Definition Language 数据定义语言——用于定义数据的结构,如创建、修改或者删除数据库对象) 语句来说,用户无法回滚错的语句。解决的办法:
闪回查询 ,例如
--删除表emp 中的所有数据
delete from emp;
--提交事务
commit;
--查询结果为0
select count(*) from emp;
--插入5分钟之前的emp表中的数据
inset into emp select * from emp as of timestamp(syadata - 5/24/60);
--提交事务
commit;
--查询结果不为零
select count(*) from emp;
闪回删除,例如
--删除表emp
drop table emp;
--该表不存在
desc emp;
--闪回删除
flashback table emp to before drop;
--查询,该表存在
desc emp;
Log MinerC ,从联机和归档的重做日志中抽取信息的高级工具。Log Miner与闪回查询类似,但是Log Miner不受时间的限制,它是从重做日志中抽取撤销数据的,而闪回查询是当前存在于撤销段内的撤销数据。
介质失败,磁盘的损坏。利用控制文件、联机重做日志和数据文件进行数据库恢复。
实例失败(instance failure)是实例的无需关闭,通常称为崩溃(crash)。