事务与数据库恢复原理
数据存储的逻辑单位是数据块,数据操作的逻辑单位是事务。
事务是用户定义的一组操作序列,有一条或多条相关SQL语句组成,是数据库应用程序的基本逻辑单位。事务管理技术主要包括数据库的恢复技术和并发控制技术。
事务的处理逻辑过程
1、 服务器进程捡取该事务的SQL语句,然后检查共享池,查看是否包含该SQL语句的共享SQL区。
2、 如有,则检查该用户是否有访问所涉及的数据的权限,如有,则使用共享SQL区处理该SQL语句。如果没有找到共享SQL区,则分配一个新的SQL区,以便分析、处理该SQL语句。如果无权限,则返回提示权限不足。
3、 锁定该SQL语句所涉及的操作对象;
4、 服务器进程在SGA中操作数据,或从数据文件中奖数据读入到SGA中然后操作数据。
5、 在适当的时候,LGWR后台进程将语句缓冲的重做日志写入到联机重做日志文件中,DBWR后台进程将数据高速缓存中的被修改过的数据块写入到数据文件中。
6、 为该事务产生一个递增的SCN。SCN被写入到控制文件、数据文件的头部、数据块的头部、重做记录中。SCN确定数据库在某个时间点的一致性状态,用来进行并发控制、数据库的恢复。
7、 LGWR后台进程将所有剩余的、已经缓冲的重做日志和当前的SCN写入到联机重做日志文件中。
8、 释放该事务中各个SQL语句所占用的系统资源,并解除对所涉及的操作对象的锁定;
9、 如果事务是成功的,返回成功提示,否则返回错误提示;
10、 在某个恰当的时候,DBWR后台进程将仍然保留在数据高速缓存中的被更改过的数据块(脏数据块)写入到数据文件中。
事务控制的基本语句及功能
1、 提交事务 (commit)
2、 回滚事务 (rollback)
3、 设置保存点 (savepoint)
4、 回退到保存点 (rolbackto savepoint)
5、 设置事务的属性 (settransaction)
6、 设置可延迟约束的检验时机 (setconstrants)
事务提交执行的任务:
1、 为该事务自动产生一个递增的SCN。
2、 LGWR后台进程将所有剩余的已缓冲的重做日志和当前的SCN写入到联机重做日志文件中。
3、 释放该事务中各个SQL语句所占有的系统资源,并解除对所涉及的对象上的锁定。
4、 给用户返回相对应的提示代码信息。
5、 将该事务标记为已完成。
6、 在某个合适的时候,DBWR后台进程将仍然保留在数据高速缓存中的被更改的数据块写入到数据文件中。
事务回退执行的任务:
1、 撤销所有已执行的更改。即从生成的UNDO信息里读取。如果插入则执行删除操作,如果是删除就执行插入操作。如果是更改,就更改成原来的数据。
2、 释放该事务中各个SQL语句所占用的系统资源,并解除对所涉及的操作对象上的锁定。
3、 给用户返回相应的提示代码信息。
4、 将该事务标记为已完成。
保存点
保存点是一个事务中某些中间标志,它可以将一个大的事务划分成几个短小的部分。这样就可以实现部分事务的回退操作。
部分事务回退
由于有了保存点就可以实现部分事务回退。语法:
ROLLBACK TO SAVEPOINT spname 或 ROLLBACK TO spname;
进行部分事务回退操作执行的任务:
1、 撤销保存点之后所有语句执行的更改,但保留保存点之前的更改。
2、 释放保存点之后各个SQL语句所占用的系统资源,并解除对所涉及的操作对象上的锁定,但保留保存点之前各个SQL语句所占用的系统资源和对所涉及的操作对象的锁定。
3、 给用户返回一个回退到保存点的成功提示代码信息。
4、 用户可以继续执行当前的事务。
事务的属性
1、读写;SET TRANSACTION READ WRITE 即事务的默认设置;
2、只读; SET TRANSACTIONREAD ONLY;
该状态下执行: SELECT、LOCKTABLE、SET ROLE、 ALTER SYSTEM/SESSION;
3、隔离级别
A、读已提交: SET TRANSACTION ISOLATIONLEVEL READ COMMITTED
即事务中每个DML语句所操作的数据,是在该语句开始之前已经提交了的数据。它提供语句级的度一致性。该隔离等级下不会出现脏读,但是可能会产生不可重复读和幻像读的现象(因为在该隔离等级下ORACLE并不会禁止其他事务对当前事务所操作的数据进行操作(增、删、改))。是默认的隔离等级。
B、串行化: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
即事务中的每个DML语句所操作的数据,是在该事务开始之前语句提交了的数据,并且可以执行DML语句来更改数据库中的数据,还可以查看到更改的结果。在该隔离等级下不会发生脏读、不可重复读和幻像现象(READ ONLY也一样不会发生脏读、不可重复读、幻像)。它提供事务级的度一致性。
可延迟约束的检验时机
可以使用SET CONSTRAINTS语句为一个事务所涉及到的可延迟约束指定检验的时机。
语法:
SETCONSTRAINTS { constraint_name1 [,constraint_name2 ]…| ALL}
{IMMEDIATE| DEFERRED };
IMMEDIATE 表示在每条DML语句之后就立即校验;
DEFERRED 表示在提交事务的时候才校验;
事务的状态及性质
一个事务从开始到结束经历的不同状态有:
事务初态、活动状态、失败状态、中止状态、提交状态。
4大特性:
1、 原子性 (Atomicity)
即事务是一个不可分割的逻辑单位,一个事务中的所有操作要么成功要么失败。
2、 一致性 (Consistency)
即一个语句、一个事务操作后的结果必须要使数据库中的所有数据处于一种逻辑上的一致性状态。
3、 隔离性 (Isolation)
即一个事务的执行,不能受到其他事务的干扰。也即一个事务内部的操作与使用的数据对其他事务是隔离性的,并发执行的各个事务之间不能够相互干扰。在提交之前只有该事务的用户才可看到正在修改的数据,而其他事务的用户只能看到修改之前的数据。
隔离性解决了:
脏读(一个事务读取到了另一个事务中的、还没有提交的、更改过的数据);
不可重复读(当一个事务读取了某些数据后,另一个事务修改了这些数据并进行了提交。当再次读取这些数据时,发现这些数据被修改了。)
幻向 (当一个事务读取了某些数据后,另一个事务又插入或删除了符合查询条件的某些行,当再次查询时发现符合查询条件的记录多了或少了。)
4、 持久性 (Durability)
即一个事务一旦提交成功,它对数据库中的数据所做的修改也就永久性的保存下来了。
ORACLE 是利用保存在撤销段中的信息为语句或事务提供对一致性视图。在撤销段中保存了所有未提交的事务和最近提交的事务修改之前的数据即“前映像”。
读一致性实现机制(执行原理):
查询语句进入执行状态时,ORACLE会为它分配以个当前的SCN。该查询语句在数据缓冲区中搜索所需的数据块时,只会读取SCN小于或等于该SCN的数据块。如果所需的数据块的SCN大于该SCN,则该查询语句就会从撤销段中获得对应的数据块的原始版本,并且该版本的SCN同样需要小于或等于该SCN,这样通过对数据块SCN的比较,该查询语句就只会返回在它开始之前就语句提交的数据。保证了不会读取到未提交事务所产生的脏数据块,也不会读取到该查询语句开始执行之后才提交的数据块。
事务与数据库恢复原理
数据库恢复的基本单位就是事务。数据库的恢复机制包括一个恢复子系统和一条特定的数据结构。实现可恢复性的基本原理就是重复存储数据,即数据冗余(data redundancy).
数据转储
即手动地火借助实用工具将部分或整个数据库导出或复制到指定的盘符或介质上保存起来的过程。被转储后得到的文件被称为备份或副本。
按转储时的状态分为:静态转储和动态转储
静态转储:在没有事务运行的情况下进行转储,即在数据库处于一致性状态下操作。得到的副本一定是一致性的。但是会降低数据库的可用性。因为在转储期间不能运行任何事务。
动态转储:即不需要等待事务停止就可以执行转储操作。得到的副本不能保证一致性。转储的副本加上转储后的事务日志文件才能够把数据恢复到一定时刻的一致性状态。
按转储的方式分为:海量转储和增量转储
海量转储:即将整个数据库全部每次转储。
增量转储:指每次只转储自上次转储以来修改过的数据。
日志文件是用来在数据文件之外记录事务对数据库的修改操作的文件。数据文件记录的是操作结果。而日志文件记录的是事务及其操作。
日志文件中一般记录以下重要信息:
1、 事务的标识。(开始标记、结束标记、或自动产生的唯一性标识号);
2、 操作的类型(增、删、改);
3、 操作的对象;
4、 修改前的数据(块)(对插入而言,该项为空);
5、 修改后的数据(块)(对删除而言,该项为空);
故障的种类与恢复策略
故障分类:事务故障、系统故障、介质故障
恢复数据库的基本策略:定期转储数据库、登记日在文件、针对不同故障采用不同的方法、考虑数据丢失对业务的影响。
事务故障及恢复策略
事务故障是指事物在运行到正常结束之前被中止的故障。
恢复方式是ORACLE系统自动恢复的。即反向扫描日在文件,查找故障事务的一个修改操作。对该事务的该修改操作执行逆操作,直到事务的开始标记。
系统故障及恢复策略
是指造成DBMS停止运行的任何事件,使得需要重新启动DBMS。
恢复方式是ORACLE系统自动恢复的。即正向扫描日志文件,查找在故障发生前已经提交的事务,将其事务标记为重做(redo)队列;同时查找在故障发生时还没有完成的事务,将其事务标记为撤销(undo)队列;然后对重做队列中的各个事务进行重做处理(即正向扫描日志文件,对每个需要重做的事务重新执行在日志文件中登记的操作,然后将操作后的结果写入数据文件)。最后对撤销队列中的各个事务进行撤销处理(即反向扫描日志文件,对其中的各个事务的各个修改操作执行逆操作。)。
介质故障及恢复策略
介质故障是指硬件上的故障(磁盘损坏、电路故障等)。
恢复方式是:先重新安装数据库,然后重做所有已完成的事务(即 1、装入离故障发生时刻最近的转储副本。对于动态转储的情况,还需要装入转储开始时的日志文件副本,利用恢复系统故障的方法,这样才能恢复到转储开始时刻的数据库一致性状态。2、装入离故障发生时刻最近的日志文件副本,利用恢复系统故障的方法,将数据库恢复到转储该日志文件时的一致性状态。 3、重新运行自最近转储日志文件时刻到发生故障时刻的所有修改数据的事务。即可将数据库恢复到发生故障时刻的一致性状态)。
具有检查点的数据库恢复技术
具有检查点的数据库恢复技术就是在日志文件中增加了一类新的记录(检查点记录),并增加了一个重新开始文件。DBMS会动态地去维护日志文件,主要所做的工作有:
1、 暂时中止现有的事务的执行;
2、 将内存中的当前日志缓冲区中的日志记录写入到日志文件中;
3、 把内存中的当前数据缓冲区中的数据写入数据文件中;
4、 在日志文件中写入检查点记录(内容为:发生检查点事件时所有正在执行的事务清单;这些事务的最近一个日志记录的地址;),并将该检查点记录在日志文件中的位置写入重新开始文件中;
5、 重新开始执行现有的事务。
具有检查点的数据库恢复步骤;
1、 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,再由该地址在日志文件中找到最后一个检查点记录;
2、 由该检查点记录得到在检查点时刻所有正在执行的事务清单;
3、 从检查点时刻开始,正向扫描日志文件,如果有新开始的事务(即在检查点时刻还有没有提交的事务,或在检查点之后才启动的事务),就将其放入撤销队列中。如果该新事务在故障发生之前已经被提交过,就将其从撤销队列放入重做队列中。
4、 由该检查点记录得到事务最近一个日志记录的地址,从而得到日志记录的内容;
5、 按日志记录的内容,对撤销队列中的事务执行UNDO操作,对重做队列中的事务执行REDO操作。
ORACLE 数据库的备份及恢复概要
物理备份(Physical Backups) :将要备份的文件即数据文件、日志文件、初始化参数文件、重做日志文件、控制文件等从一个位置复制到另一个位置。
逻辑备份(Logical Backups) :利用数据泵(EXPDP)等工具或命令,将数据库中的数据读出,然后再写入一个文件。
数据库的恢复分为:数据库修复、数据库恢复
数据库修复(database restore):指利用备份的文件替换已经损坏的文件。
数据库恢复(database recovery):利用重做日志文件或数据文件来重新建立已经失去的数据。
ORACLE 中除了介质故障需要DBA参与对数据库的修复和恢复外,当出现事务故障、系统故障时,ORACLE会自动进行崩溃恢复(crash recovery)和例程恢复(instance revovery)。