当前位置:Gxlcms > 数据库问题 > Oracle检索数据一致性与事务恢复(转)

Oracle检索数据一致性与事务恢复(转)

时间:2021-07-01 10:21:17 帮助过:25人阅读

 table c(a int);  
  • Table created.  
  • SQL> alter table c add b number;  
  • Table altered.  
  • SQL> desc c   
  •  Name                                      Null?    Type  
  •  ----------------------------------------- -------- --------------------------------------------  
  •  A                                                  NUMBER(38)  
  •  B                                                  NUMBER  
  • 表中插入数据并提交

    1. SQL> insert into c values(1,2);  
    2. 1 row created.  
    3. SQL> insert into c values(3,4);  
    4. 1 row created.  
    5. SQL> select * from c;  
    6.          A          B  
    7. ---------- -----------------------------  
    8.          1          2  
    9.          3          4  
    10. SQL> commit;  
    11. Commit complete.  

    再打开一个SecureCRT.(第二个session)

    查询

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- --------------------------  
    4.          1          2  
    5.          3          4  

    第一个session更改表中的数据但不提交

    1. SQL> update c set b=10 where a=1;  
    2. 1 row updated.  

    第二个session查询(修改但没有提交检索的是UNDO中的数据)

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- --------------------------  
    4.          1          2  
    5.          3          4  

    第一个session提交

    1. SQL> commit;  
    2. Commit complete.  

    第二个会话查询(可见只有提交后才能检索到数据段的数据)

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- -------------------------  
    4.          1         10  
    5.          3          4  

    结论:如果用户修改数据但没有提交,其它用户检索的都是UNDO段的数据,这样就保证了数据的一致性

    2.回滚数据(事务恢复)

    1.当用户updata数据但还没有提交

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- -----------------------------  
    4.          1          10  
    5.          3          4  
    6. SQL> update c set b=2 where a=1;  
    7. SQL> select * from c;  
    8.          A          B  
    9. ---------- -----------------------------  
    10.          1          2  
    11.          3          4  

    这时用户突然后悔了,想恢复到原来的状态

    1. SQL> rollback;  
    2. Rollback complete.  
    3. SQL> commit;  
    4.    
    5. SQL> select * from c;  
    6.          A          B  
    7. ---------- -----------------------  
    8.          1         10  
    9.          3          4  

    可见当用户用命今rollback还能回滚到初始状态.

    2.当用户updata数据且已提交

    当用户updata数据且已提交后,可以根据SCN记录把数据还源.

    先查看原始数据

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- ----------  
    4.          1         10  
    5.          3          4  

    找到SCN

    1. SQL> select current_scn from v$database;  
    2. CURRENT_SCN  
    3. -----------  
    4.      693636  

    现在删除表中的数据并提交

    1. SQL> delete from c;  
    2. rows deleted.  
    3. SQL> commit;         
    4. Commit complete.  

    查询(现在表中已没有数据了)

    1. SQL> select * from c;  
    2. no rows selected  

    检索特定SCN的数据

    1. SQL> select * from c as of scn 693636;  
    2.          A          B  
    3. ---------- ----------  
    4.          1         10  
    5.          3          4  

    恢复数据

    1. SQL> insert into c select * from c as of scn 693636;  
    2. rows created.  
    3. SQL> commit;  
    4. Commit complete.  

    现在再查询

    1. SQL> select * from c;  
    2.          A          B  
    3. ---------- ----------------------  
    4.          1         10  
    5.          3          4  

    可见可以根据SCN恢复到某一检查点的数据,如果把SCN转换成时间,,就可以把数据恢复到某一时间点.

     

    Oracle检索数据一致性与事务恢复(转)

    标签:无法   href   检查点   数据   插入   date   http   desc   特定   

    人气教程排行