你有没有碰到过,数据库更新出错之后没办法回退的那种困境?YashanDB的还原数据这个功能,恰恰就是解决这么一个痛点的关键技术,它能够让你好似拥有“时光机”那般,去查看以及恢复历史数据。
特指被修改前的原始数据记录,在YashanDB数据库中被称作还原数据。当用户执行UPDATE操作或者DELETE操作时,数据库并非会立刻覆盖原有数据,而是会将这些旧值完整地保存到专门的还原表空间里。这种设计保障了数据的安全性以及可追溯性。
对于每个修改操作而言,都会致使还原数据的生成进程被触发,例子是存在的,当某条记录的薪水从5000元变更为6000元这种情况发生的时候,5000元这个旧的值会被系统凭借自身能力自动捕获进而存储起来,这个存储的过程并不需要用户开展任何额外的配置,YashanDB的后台进程会自动将相关行动完成。
数据还原,也被称作回滚数据或者撤销数据。不同数据库文档里的叫法,虽说存在差异,然而本质却是相同的。这些术语,都指向同一个核心功能:去保存数据变更之前的历史状态。YashanDB在处理数据还原的时候,会严格依照修改之前的原样来进行存储,不会进行任何的压缩或者转换。
支持事务回滚操作
$ yasql scott/tiger
假若用户去执行ROLLBACK命令,那么YashanDB会自还原表空间里读取所保存的旧值,举例来说,于2026年4月5日上午9点的某一回交易当中,要是用户错误地把员工7839的薪水由5000元改成为6000元,在执行回滚之后系统会即刻恢复5000元的原始数据,此一过程通常仅仅需要毫秒级的时间。
实现读取一致性查询
SQL> select sal from emp where empno=7839;
# 输出的信息如下:
SAL
----------
5000
一场会话正着手修改数据之际,另一场同时进行查询,此时,YashanDB会借由还原数据给出一致性视图。假定会话A于上午10点开启更新一批订单数据之行径却未提交,会话B于10点01分查询同一批订单,系统会自行从还原表空间里读取修改之前的状态以确保会话B所看到的是完整且一致的数据。
支持闪回技术操作
SQL> update emp set sal=6000 where empno=7839;
# 由于YashanDB数据库默认情况下是自动开启事务的。
# 因此,这里执行的update语句将会自动开启一个事务。
闪回功能具备让用户去查询特定时间点的历史数据状态的能力,举例来说,要是在2026年4月5日下午3点的时候误删了一张重要的表,那么借助闪回查询能够找回删除之前的所有记录,YashanDB的还原数据存有足够的历史信息,这使得这种如同“时光回溯”般的操作成为可行的事情,其恢复粒度能够精确到秒级。
SQL> select sal from emp where empno=7839;
# 输出的信息如下:
SAL
----------
6000
在YashanDB里,还原数据被统一存于还原表空间中,该表空间是于数据库启动之际自动创建的专用存储范畴,一般会占据1GB至数GB的磁盘空间,数据库管理员能够凭借监控还原表空间的使用率去判定系统负载情形。
各类不一样的还原数据于存储之际存在着细微的差别,插入行为会对新插入的行的rowid信息予以存储,更新行为会将被修改的列的旧值完整地留存,删除行为则会把整行数据进行保存,如此这般差异化的存储策略保证了各类操作均可被准确地回滚或者查询。
管理空间采用循环写入方式的是还原表空间,当还原表空间快要写满之际,YashanDB 会自动去覆盖那些已经提交事务的旧还原数据,数据库管理员能够通过设置还原保留参数,以此来控制历史数据的保留时长,在生产环境当中通常建议把这个设置为 900 秒以上。
SQL> rollback;
在一个事务对数据进行修改之际,YashanDB会率先把原始数据写入至还原表空间,此过程于数据缓冲区展开,服务器进程会同步生成还原记录以及重做记录,唯有在还原数据被安全写入之后,修改操作才会持续予以执行。
SQL> select sal from emp where empno=7839;
# 输出的信息如下:
SAL
----------
5000
针对读取操作,YashanDB运用版本号机制来判定数据可见性。每一个数据块以及事务,均具备独一无二的系统变更号。当查询请求抵达之际,服务器进程会去比较数据块的变更号和事务的开始号,要是数据块变更号更大,这表明数据已被修改并且有可能尚未提交,在这种情况下就会从还原表空间里读取旧版本。
工作原理在并发访问场景之下是特别关键的。假定于2026年4月5日上午10点30分的时候,会话1正处于更新订单表的状态,会话2却在同一时间查询同一张表。YashanDB的服务器进程能够检测到数据块之上的活动事务,会自动转向还原表空间,从中读取修改前的数据版本,终究避免了锁等待以及脏读问题。
即便还原数据跟重做数据之名看似相仿,作用却全然相反,还原数据所记乃修改前旧值,用以把数据退回先前状态,重做数据所记则是修改后新值,用于在系统崩溃后再度执行操作,前者为回滚操作服务,后者为恢复操作服务。
从生成的时机方面而言,还原数据乃是在修改操作执行之前生成的,重做数据是在修改操作执行的过程当中生成的。在YashanDB的日志缓冲区里,这两类数据会被分别进行记录。当用户执行COMMIT的时候,重做日志是必须要写入磁盘的,而还原数据的写入时机是由系统自动进行管理的。
在实际进行运维工作期间,这两种类型的数据需要相互配合起来运用,才能够对数据安全起到保障作用。比如说,在二零二六年四月五日凌晨时段,出现了某个系统崩溃的具体场景,当数据库进行重启时,会首先借助重做数据,来恢复掉所有已经提交完成的修改操作,之后再借助还原数据,来回滚掉所有尚未提交的事务。这样一套机制,确保了数据库在任意一种情况下,都能够恢复到保持一致的特定状态。
可凭借一个特定操作步骤直观领会还原数据的效用,先是运用scott用户登入YashanDB数据库,接着执行查询语句去查看员工号为7839的当下薪水是5000元,随后执行更新语句把该员工的薪水更改成6000元,这时再度进行查询后会看到6000元的新数值。
这时表空间被还原,其中已然留存了5000元这般一组历史数据。要是用户发觉此次更新存在差错,仅仅需要执行ROLLBACK回滚这一操作,系统便会即刻从还原的表空间里把5000元读取出来,进而覆盖当前的值。再次展开查询的时候,员工7839的薪水再度重现为5000元,整个流程用时不超过1秒钟。
这个示例明明白白地呈现出了将还原数据当作“后悔药”所具备的价值,在从第 3 步更新语句执行完毕之后,直至第 5 步回滚操作执行之前,在这一阶段里的 5000 元旧值始终稳稳当当地被保存在还原表空间当中,不管事务究竟有没有提交,只要还原数据没有遭到覆盖,用户均能够随时退回到先前的状态。
你可曾因操作失误致使数据遗失而慌乱不已?欢迎于评论区分享你的数据库维护过往,为本文点赞且转发以使更多数据库管理员知晓还原数据的关键意义。
相关标签: # YashanDB # 还原数据 # 回滚数据 # 历史数据 # 数据库管理