Oracle commit详细用法

本文详细阐述了Oracle在commit操作中的工作流程,包括事务提交前的撤销记录生成、提交时的事务唯一标识添加以及提交后的日志写入与锁释放等关键步骤。同时介绍了commit参数的设置,包括commit_wait和commit_logging的用途与应用场景,以及如何通过不同参数配置来优化事务处理效率。
commit工作过程
  • commit提交之前
        Oracle在SGA撤销段缓冲区中生成撤销记录,撤销记录包含更新和删除表行的旧值
        Oracle在SGA重做日志缓冲区生成重做日志记录
        Oracle修改SGA数据库中的缓冲区
  • commit提交时
        重做记录中的事务被标记上为所提交事务的唯一scn
        日志写入程序将事务重做日志信息和事务scn,从重做日志缓冲区写到磁盘上的重做日志文件
        释放Oracle持有的锁,标记事务为完成

commit参数
    commit_wait初始化参数
    commit_wait={nowait|wait|force_wait}
    Oracle默认是commit方式是wait
    作用:控制重做日志写入方式
    备注:nowait适用场景(a,有大量的事务redo,信息需要写入redo log;b,容忍部分数据丢失;c,等待LGWR写对运用程序来说不可以忍受)。
              force_wait:将会适用oracle默认方式提交

    commit_logging 初始化参数
    commit_logging={immediat|batch}
    immediat:LGWR将redo信息立即写入到重做日志文件
    batch:redo信息会被buffer,即redo不立即写入到重做日志文件
    
commit用法
     commit
     commit write wait;
    commit write nowait
    commit write batch;
    commit write immediate;

wait、nowait控制什么时候将redo信息写入到redo logs
immediat 、batch控制redo信息以怎样的方式写入到redo logs
备注:pl/sql默认方式batch nowait
<think> 我们正在讨论的是Oracle数据库中已提交事务的退回方法。在数据库管理系统中,事务一旦提交(COMMIT),就意味着事务对数据库的修改已经永久保存,通常认为这是不可逆的。然而,在某些特定情况下,我们可以通过一些手段来恢复数据到之前的状态,但这并不是真正意义上的“退回”已提交的事务(因为提交的事务不能像未提交的事务那样回滚)。以下是一些常见的方法: 1. **闪回技术(Flashback)**:Oracle提供了多种闪回技术,可以将数据恢复到过去的某个时间点。这包括: - **闪回查询(Flashback Query)**:查询过去某个时间点的数据状态。 - **闪回表(Flashback Table)**:将表恢复到过去的某个时间点。 - **闪回删除(Flashback Drop)**:恢复被删除的表(实际上是从回收站中恢复)。 - **闪回数据库(Flashback Database)**:将整个数据库回退到过去的某个时间点。 2. **数据库时间点恢复(Point-in-Time Recovery, PITR)**:使用备份和归档日志,可以将数据库或某个表空间恢复到过去的某个时间点。这种方法通常需要数据库处于归档模式,并且有可用的备份。 3. **逻辑备份恢复**:如果之前使用数据泵(Data Pump)或传统的导出工具(exp)进行了逻辑备份,可以通过导入工具(impdp/imp)将数据恢复到备份时的状态。 4. **日志挖掘(LogMiner)**:通过分析归档日志和在线日志,可以获取到历史事务的详细信息,并生成反向的SQL语句(撤销操作)来撤销某些已提交的事务的影响。但是,这需要非常谨慎,因为生成反向SQL并执行是一个复杂且容易出错的过程。 需要注意的是,以上方法都需要具备相应的备份、归档日志或启用特定的功能(如闪回)。而且,操作可能会影响数据库的其他数据,因此通常在生产环境中执行这些操作前,需要制定详细的恢复计划,并在测试环境中验证。 由于直接“退回”已提交的事务并不是标准操作,建议在操作前充分评估,并考虑使用以上方法实现类似需求。 §§相关问题§§ 1. 如何配置Oracle数据库以启用闪回功能? 2. 数据库时间点恢复的具体步骤是什么? 3. 如何使用LogMiner工具来撤销已提交的事务? 4. 闪回技术和时间点恢复有何区别? </think> 在Oracle数据库中,已提交的事务无法直接"退回"或撤销,因为提交操作(COMMIT)意味着事务的持久化完成。但可以通过以下技术实现**数据回退**效果: ### 一、核心恢复方案 1. **闪回查询(Flashback Query)** 查询历史数据状态(需在UNDO保留期内): ```sql SELECT * FROM 表名 AS OF TIMESTAMP TO_TIMESTAMP('2023-10-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` 适用于恢复**短时间**内的误操作数据(默认UNDO保留期15分钟)[^1]。 2. **闪回表(Flashback Table)** 将整表回退到特定时间点(需启用行移动): ```sql ALTER TABLE 表名 ENABLE ROW MOVEMENT; FLASHBACK TABLE 表名 TO TIMESTAMP TO_TIMESTAMP('2023-10-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` 3. **时间点恢复(PITR)** 数据库/表空间级恢复(需归档模式和完整备份): ```sql RECOVER DATABASE UNTIL TIME '2023-10-01:14:00:00'; ALTER DATABASE OPEN RESETLOGS; ``` ### 二、关键前提条件 - ✅ **归档模式必须启用**:`ALTER DATABASE ARCHIVELOG;` - ✅ **闪回功能开启**:`ALTER DATABASE FLASHBACK ON;` - ✅ **足够的UNDO空间**:保留期由`UNDO_RETENTION`参数控制 - ✅ **有效备份存在**:RMAN备份+归档日志链完整 ### 三、操作风险预警 1. **闪回依赖UNDO数据**:超过保留期后不可用 2. **PITR导致数据丢失**:恢复点之后的所有更改丢失 3. **系统级影响**:表空间恢复期间相关对象不可访问 4. **权限要求**:需`SYSDBA`或`FLASHBACK ANY TABLE`权限 > 📌 最佳实践: > 生产环境务必先执行 `CREATE TABLE 表名_backup AS SELECT * FROM 表名;` 创建临时备份,再进行恢复操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值