精华内容
下载资源
问答
  • Undo

    2021-01-23 19:53:13
    Undo,利用闭包捕获外部变量,将带有变量值的函数压栈 package main import ( "errors" "fmt" ) type Undo []func() func (undo *Undo) Add(function func()) { *undo = append(*undo, function) } func ...

    Undo,利用闭包捕获外部变量,将带有变量值的函数压栈

    package main
    
    import (
    	"errors"
    	"fmt"
    )
    
    type Undo []func()
    
    func (undo *Undo) Add(function func()) {
    	*undo = append(*undo, function)
    }
    
    func (undo *Undo) Undo() error {
    	functions := *undo
    	if len(functions) == 0 {
    		return errors.New("No functions to undo")
    	}
    	index := len(functions) - 1
    	if function := functions[index]; function != nil {
    		function()
    		functions[index] = nil // Free closure for garbage collection
    	}
    	*undo = functions[:index]
    	return nil
    }
    
    
    type IntSet struct {
    	data map[int]bool
    	undo Undo
    }
    
    func (this IntSet)String()string{
    	fmt.Print("{")
    	for k,v:= range this.data {
    		fmt.Print(k,":",v,"\t")
    	}
    	fmt.Print("}")
    	fmt.Println()
    	return ""
    }
    
    func NewIntSet() IntSet {
    	return IntSet{data: make(map[int]bool)}
    }
    
    /*
       Add 操作时加入 Delete 操作的 Undo。
       Delete 操作时加入 Add 操作的 Undo。
    */
    
    func (set *IntSet) Add(x int) {
    	if !set.Contains(x) {
    		set.data[x] = true
    		set.undo.Add(func() { set.Delete(x) })
    	} else {
    		set.undo.Add(nil)
    	}
    }
    
    func (set *IntSet) Delete(x int) {
    	if set.Contains(x) {
    		delete(set.data, x)
    		set.undo.Add(func() { set.Add(x) })
    	} else {
    		set.undo.Add(nil)
    	}
    }
    
    func (set *IntSet) Undo() error {
    	return set.undo.Undo()
    }
    
    func (set *IntSet) Contains(x int) bool {
    	return set.data[x]
    }
    
    
    func main() {
    	ints := NewIntSet()
    	for _, i := range []int{1, 3, 5, 7} {
    		ints.Add(i)
    		fmt.Println(ints)
    	}
    	for _, i := range []int{1, 2, 3, 4, 5, 6, 7} {
    		fmt.Println("contains:",i,":", ints.Contains(i))
    		ints.Delete(i)
    		fmt.Println(ints)
    	}
    	fmt.Println()
    	for {
    		fmt.Println("---------------------------------")
    		if err := ints.Undo(); err != nil {
    			break
    		}
    		fmt.Println(ints)
    	}
    }
    
    

    本文整理自网络资源,以学习为目的,侵删!

    展开全文
  • UNDO

    2018-12-04 20:07:36
    UNDO产生数据备份,为了回滚用 UNDO作用 1、 数据的回滚 2、一致性读 3、表的闪回(事务,查询的闪回…) 4、失败会话的恢复 UNDO放在UNDO表空间,与其他表空间一样,UNDO表空间中有回滚段。 show parameter undo ...

    UNDO产生数据备份,为了回滚用
    UNDO作用
    1、 数据的回滚
    2、一致性读
    3、表的闪回(事务,查询的闪回…)
    4、失败会话的恢复
    在这里插入图片描述
    UNDO放在UNDO表空间,与其他表空间一样,UNDO表空间中有回滚段。
    show parameter undo

    Undo表空间的损坏
    如果有活动的事务,需要恢复Undo表空间,如果没有备份,将导致数据库损坏。
    如果没有活动事务,可以重建一个undo表空间。

    展开全文
  • undo

    2019-06-20 22:01:00
    undo和redo正好相反,对于数据库进行修改时,数据库不但会产生redo,而且还会产生一定量的undo,即使你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些信息将数据回滚到...

    重做日志记录了事务的行为,可以很好地通过其进行“重做”。但是事务有时还需要撤销,这时就需要undo。undo和redo正好相反,对于数据库进行修改时,数据库不但会产生redo,而且还会产生一定量的undo,即使你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些信息将数据回滚到修改之前的样子。与redo不同的是,redo存放在重做日志文件中,undo存放在数据库内部的一个特殊段(segment)中,这成为undo段 (undo segment),undo段位于共享表空间内,可以通过py_innodb_page_info.py工具,来查看当前共享表空间中undo的数量:

     

    [roo@xen-server ~]# python py_innodb_page_info.py /usr/local/mysql/data/ibdata1

    Total number of page: 46208:

    Insert Buffer Free list: 13093

    Insert Buffer Bitmap: 3

    System Page: 5

    Transaction system Page: 1

    Freshly Allocated Page:4579

    undo Log Page:2222 ——可以看到,当前的共享表空间ibdata内有2222个undo页。

    File Segment inode: 6

    B-tree Node: 26296

    File Space Header: 1

    扩展描述页:2

     

    我们通常对于undo有这样的误解:undo用于将数据库物理地恢复到执行语句或事物之前的样子——但事实并非如此。数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构本身在回滚之后可能大不相同,因为在多用户并发系统中,可能会有数十数百甚至数千个并发事务。数据库的主要任务就是协调对于数据记录的并发访问。如一个事务修改当前一个页中某几条记录,但同时还有别的事务在对同一页中另几条记录进行修改。因此,不能将一个页回滚到事务开始的样子,因为这样会影响其他事务正在进行的工作。

    例如:我们的事务执行了一个insert 10万条记录的SQL语句,这条语句可能会导致分配一个新的段,即表空间会增大。如果我们执行rollback时,会将插入的事务进行回滚,但是表空间的大小并不会因此而收缩。因此,当InnoDB存储引擎回滚时,它实际上做的是与先前相反的工作。对于每一个insertinnodb存储引擎都会完成一个delete;对于每一个deleteinnodb存储引擎都会完成一个insert;对于每一个updateinnodb存储引擎都会执行一个相反的update。将修改前的行放回去。

    oracleMicrosoft server数据库都有内部的数据字典来观察当前undo的信息;InnoDB存储引擎在这方面做得还是不够的,所以DBA只能通过原理和经验来进行判断。我写了一个补丁(patch)来扩展show engine innodb status命令的显示结果,可以用来查看当前内存缓冲池中undo页的数量,如下代码所示。

    Per second averages calculated from the last 14 seconds

    ······

    -------------

    UNDO PAGE INFO

    --------------

    Undo Page count: 1 ——可以看到,当前内存缓冲中有1undo页。

    ······

    -----------------

    END OP INNODB MONITOR OUTPUT

    =================

    1 row in set (0.01 sec)

     

    接着我们开启一个事务,执行插入10万条记录的操作,注意,这并不进行提交操作:

    mysql> create table t like order line

    Query OK, 0 rows affected (0. 23 sec)

     

    mysql> insert into t select * from order_line limit 100000:

    Query OK, 100000 rows affected (45.01 sec)

    Records: 100000 Duplicates: 0 Warnings: o

    之后在另一个会话中执行命令SHOW ENGINE INNODB STATUS,可以看到之前的会话产生的undo:

    mysql> show engine innodb status\G

    ********************* 1.row **************************

    -----------------

    UNDO PAGE INFO

    -----------------

    Undo Page count:129.

    ·······

    ---------------

    END OF INNODB MONITOR OUTPUT

    ========================

    1 row in set (12.38 sec)

    可以看到,此时undo页的数量变成了129.也就是说,刚才的一个事务大致产生了129undo页。另外,即使对insert的事务进行了提交,我们在一段时间内还是可以看到内存中有129undo页。这是因为,对于undo页的回收实在master thread中进行的,master thread也不是每次回收所有的undo页。

     

    转载于:https://www.cnblogs.com/5945yang/p/11061671.html

    展开全文
  • undo:低级的undo-redo功能
  • undo_retention简单定义,就是最多数据的最少保留时间。AUM模式下,undo_retention参数用于事务commit后undo数据保留的时间。单位为秒。这是个no guarantee的限制。也就是,若空间足够,他只是个‘花瓶’;当可用...

    undo_retention简单定义,就是最多数据的最少保留时间。AUM模式下,undo_retention参数用于事务commit后undo数据保留的时间。单位为秒。这是个no guarantee的限制。也就是,若空间足够,他只是个‘花瓶’;当可用空间不足而又有事务需要回滚空间,则这些数据依然会被覆盖。这个行为可能会导致ORA-01555错误,这些数据被记忆的时间可用v$undostat里面的字段TUNED_UNDORETENTION来查询。

    UNDO主要用于以下方面:

    1.在执行rollback语句的时候rollback事物

    2.恢复数据库

    3.提供读一致性

    4.为oracle flashback query提供支持

    5.使用oracle flashback特性恢复数据库逻辑失败

    一般来讲事物的undo信息存储在回滚段中,事物的undo信息一直存在,直到一个commit或者rollback语句执行。自动回滚段管理允许DBA指定oracle数据库保留多久的commit之后的undo信息。防止在长时间的查询产生ora-01555:snapshot too old.通过设置UNDO_RETENTION参数来达到这个目的,默认是900s(15min).可以设置这个参数保证数据库保留undo日志的时间.设置UNDO_MANAGEMENT = AUTO参数就可以设置自动管理回滚段特性。

    undo段中的区有以下三种状态:

    Unexpired Extents – Undo data whose age is less than the undo retention period.

    Expired Extents – Undo data whose age is greater than the undo retention period.

    Active Extents – Undo data that is part of the active transaction.

    以下介绍oracle是怎么利用undo回滚段的:

    第一步.当需要回滚段的时候,一个undo信息需要被写入到回滚段中。如果当前使用区已经不足,并且下一个区是expired状态,优先使用expired状态的区,而不是从空闲区间池中产生一个空闲的区间。

    第二步.如果第一步由于没有可用的区间而失败,并且undo数据文件不是自动扩展的。则oracle试图去利用另一个回滚段的expired状态区间。

    第三步.如果第二步由于其他回滚段没有expired状态的区间,则oracle试图去利用当前回滚段的unexpired区间

    第四步.如果第三步仍然失败,则oracle视图利用另一个回滚段的unexpired状态区间

    第五步.如果以上全部失败,则an Out-Of-Space error 就会产生。

    以下实验:

    SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;

    TABLESPACE_NAME STATUS GB

    ------------------------------ --------- ----------

    UNDOTBS1 UNEXPIRED .010742188

    UNDOTBS1 EXPIRED .015014648

    SQL> update t1 set name='eeeee' where id=5;

    SQL> select tablespace_name, status, sum(blocks) * 8192/1024/1024/1024 GB from dba_undo_extents group by tablespace_name, status;

    TABLESPACE_NAME STATUS GB

    ------------------------------ --------- ----------

    UNDOTBS1 UNEXPIRED .009765625

    UNDOTBS1 EXPIRED .015014648

    UNDOTBS1 ACTIVE .000976563

    Undo Blocks per Second

    参考资料:

    展开全文
  • Mysql undo

    2021-01-07 13:53:26
    Undo tablespaces contain undo logs, which are collections of undo log records that contain information about how to undo the latest change by a transaction to a clustered index record.Undo logs exist...
  • oracle更换undo,ORACLE UNDO

    2021-05-05 09:06:52
    undo 是用来回滚的,而且oracle 的undoundo segment在数据文件的目录下有UNDO.LOG有这么一个物理的文件还有undo实际上只是逻辑上的undo,也就是说:undo是这样工作的insert-deleteupdate-update执行一个逻辑上相反...
  • mysql undo_mysql undo原理

    2021-01-18 18:42:17
    一.undo存储管理1.innodb存储引擎对undo的管理同样采用段的方式。每个rollback segment 包含1024个undo log segment,事务再每个undo log segment中进行undo页的申请。2.innodb1.2开始,可以通过下面参数对rollback ...
  • mysql undo buffer_MySQL undo

    2021-01-19 00:42:35
    标签:MySQL标签:MySQL结构标签:MySQL undo一、undo结构:rseg0预留在系统表空间ibdata中;rseg 1~rseg 32这32个回滚段存放于临时表的系统表空间中;rseg33~ 则根据配置存放到独立undo表空间中(如果没有打开独立Undo...
  • MySQL设置undo_mysql undo

    2021-01-27 08:32:18
    mysql> show variables like '%undo%';+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| innodb_undo_directory | . || innodb_undo_logs ...
  • innodb undo--undo page

    2017-03-29 20:19:11
    normalundo page: undo log header page:
  • java undo_后悔药undo

    2021-03-06 20:51:55
    现实中没有后悔药,oracle中有后悔药,这个后悔药就是undo。02我们对数据执行修改时,数据库会生成undo信息,以便将来需要的时候可以把数据变更回修改之前的状态。此外,当你执行的事务或语句由于某种原因失败的时候,...
  • <h2>undo for zoomed motion <p>this PR fixes #861 <h2>undo for font-changes <p>this PR fixes #1249 <h1>undo for <em>object</em>-states <p>this PR attempts to resolved the issue outlined in #856 by ...
  • undo100% 重建undo

    2019-04-15 16:53:41
    undo表空间已分配60G,还是报100%;虽然没影响,还是通过设置为自动扩展. 但是对于自动扩展的文件还有监控来判断是否还有可分配的空间。所以需要重建。 步骤: 1.创建默认表空间 create UNDO  tablespace ...
  • 水平有限,如果有误请指出 参考: 阿里内核月报 姜老师的MySQL内核:innodb存储引擎 做一个简单的记录,自己备用 一、大体结构 rollback segments(128) ...undo segments(1024) ...undo log (header insert/...undo...
  • 水平有限,如果有误请指出 参考: 阿里内核月报 姜老师的MySQL内核:innodb存储引擎 做一个简单的记录,自己备用 一、大体结构 rollback segments(128) ...undo segments(1024) ...undo log (header insert/...undo...
  • Oracle Undo

    2011-12-20 07:57:00
    Oracle Undo学习资料,对Undo的介绍有利于对回滚和Undo表空间有一个比较清晰地认识
  • innodb undo--insert undo log

    2017-04-09 22:15:26
    对于INSERT_UNDO,调用函数trx_undo_page_report_insert进行插入。 该函数最后会生成回滚指针: *roll_ptr = trx_undo_build_roll_ptr(op_type == TRX_UNDO_INSERT_OP,rseg->id, page_no, offset); roll_ptr = ...
  • mysql undo管理声明:本文内容是笔者阅读《MySQL运维内参》后整理的笔记innodb支持的回滚段总共有128*1024=131072个。在事务的执行过程中,会产生两种回滚日志,一种是insert的undo日志,一种是update的undo日志。...
  • UndoManager Improvements

    2021-01-09 13:34:37
    <div><p>This pull request implements #334, and provides a form of improvement for the undo manager behavior as suggested in #335: 1. Replaces the current undo manager with a new undo manager. The new ...
  • <div><p>In order for Undo to really work the "Automatically pass priority" setting has to be off. Otherwise the ability to undo is few and far between. Would be more useful if undo stepped ...
  • 一.什么是undo log ?1.定义undo,顾名思义“回滚日志”,是事务日志的一种。记录内存数据页修改之前的状态(类似于快照)在故障...在MySQL5.6中,undo的存放位置还可以通过变量innodb_undo_directory来自定义存放目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,060
精华内容 8,824
关键字:

undo