十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
不影响的。
创新互联是一家集网站建设,西市企业网站建设,西市品牌网站建设,网站定制,西市网站建设报价,网络营销,网络优化,西市网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
对于insert操作:回滚段只需要记录插入记录的rowid,如果回退,只需要将该记录根据rowid删除即可。
oracle从回滚段中将前映像数据提取出来,覆盖被更新的数据块。
删除表后,可以采用如下操作:
在 user_recyclebin中找到最近操作过的表名称,然后用闪回(只能用于10G及以上版本)。
FLASH BACK TABLE TABLE_NAME TO BEFORE DROP;
如果是删了或修改里面的数据,可以先建立一个快表将删除修改之前状态的数据找回到这个表中:
CREATE TABLE QUICK_TABLE AS
SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSTEM-1/24 (一小时前的),减去的时间可以自己定。如楼上F_253那位老兄的写法就不错,能自由定制时间
execute执行后
可以回滚
commit提交后
不可以回滚
其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交。对应的PL\SQL也是要先点execute执行,执行后再点commit提交。
但是
commit提交后
可以用闪回查询恢复原来的数据
因为oracle会将近期的数据保存到快照中
如:
SELECT
*
FROM
TABLE_1
AS
OF
TIMESTAMP
TO_TIMESTAMP('20080606
20:00:00','YYYYMMDD
HH24:MI:SS');
这里'20080606
20:00:00'就是你想恢复数据到哪个时间状态
TABLE_1是数据库的表名
这样查询到的数据就是执行更新操作之前的数据
Oracle概念问题 假如数据没有提交 但是却被dbwn进程写入了数据文件 会怎么样呢?
案例分析
首先说明的是dbwn写脏数据跟mit提交没有关系!
在一个transaction发生的过程中 online redo log首先记录transaction中修改的数据块相关信息 修改的数据块会被缓存在database buffer cache中 由于database buffer cache写满或者checkpoint等等条件触发dbwn进程 会导致这些缓存的数据块写入数据文件 但此时可能该transaction仍然还没有提交 所以在数据文件中 可能会有mited 和 unmited 的数据块 而原有的数据块镜像会存放在undo segment
IXDBA NET社区论坛
然而 dbwn写脏数据时不管这个要写的transaction是否提交
也没有必要去管
这样就发生了所谓的已经提交的数据 但是还没有写入数据文件的现象
还有一种情况 数据没有提交 但是已经被写入数据文件 此时发生回退 撤销没有提交的数据
那么 引发Oracle前滚与回退的根本原因就是什么呢?
根本原因是mit后写redo buffer和触发lgwr写 redo buffer的区别
事务在执行完毕后 随即会被写入redo buffer和undo中 同时在redo buffer和undo中对该事务都有一个是否提交的标记 两者的默认状态都是active的 即没有提交时刻处于激活状态
mit操作执行时刻把此前的所有事务操作全部写入redo log file mit成功后 redo buffer信息全部写入redo file 同时修改两者中的事务提交标识为inactive 表示此前事务已经递交
oracle的前滚和回退根据就是依据事务是否提交而进行的
在触发lgwr进程后 oracle同样把此前的redo buffer信息写入redo file 但是与mit触发写日志不同的是 redo file本身对lgwr写日志操作不记录任何信息标识 lgwr写到那里就是那里 就算此时掉电也无妨 redo file就记录到掉电时刻的信息
lgwr是一个Oracle后台执行的进程 具体的日志写操作都有oracle去控制 这对于oracle来说是透明的 因此不用在redo file中写入任何标记信息 这也是正常的
mit操作是唯一一个可以前台操作与oracle后台通信的指令 因此当加入这个操作以后 oracle本身必须要了解各个事务的读写状况 那么怎么了解整个状况 在redo以及undo中加入是否递交的标识 对于已经提交的操作 但是还没有写入数据文件 那么就要前滚 相反 对于没有提交 执行回退!
于是 Oracle崩溃恢复步骤如下
首先rolling forward 前滚 由于oracle failure sga中的内存信息丢失了 但是online redo log中还是存储了transaction信息 包括mited or unmited data 可能这些修改信息并没有被oracle正确的来处理 包含两种情况 已经提交的还没有写入数据文件 或者没有提交的却被写入了数据文件 针对已经提交的还没有写入数据文件就要发生前滚 在前滚过程中 *** on会根据online redo log中的记录来完成对datafile的修改 保证已经提交的数据已经写入数据文件
接下来 前滚结束后 数据库正常open 此时用户可以正常连接 可以访问已经recover的mited data 但是对于那些属于unrecoverable transaction的unmited data 会被oracle 加锁 是不可以访问的
lishixinzhi/Article/program/Oracle/201311/16619
execute执行后
可以回滚
commit提交后
不可以回滚
其实oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交。对应的pl\sql也是要先点execute执行,执行后再点commit提交。
但是
commit提交后
可以用闪回查询恢复原来的数据
因为oracle会将近期的数据保存到快照中
如:
select
*
from
table_1
as
of
timestamp
to_timestamp('20080606
20:00:00','yyyymmdd
hh24:mi:ss');
这里'20080606
20:00:00'就是你想恢复数据到哪个时间状态
table_1是数据库的表名
这样查询到的数据就是执行更新操作之前的数据