数据库误操作,如何恢复数据(SQL事务,或数据库还原)
数据库误操作
一般指,不小心删除/插入了某个数据,或是当有多个操作同时执行时,因为网络原因或者机器原因,导致整体操作只执行了一半,而数据已失去了逻辑性
例如:
- 删除A表数据
- 插入B表中与A表关联的某个字段
若此时刚进行完第一个操作,用户关掉网页。那么此时A表数据已经删除,无法进行第二步操作。
如果当用户重新打开网页时,继续从第一步开始执行,则无法进行第一步操作,因为删除操作已经做了。
当我们遇到这种情况下,有几种解决方法。
软处理
给A表增加一个status状态,第一步删除时,只将状态值改变,当第二步操作做完,才完全删除该条数据将操作顺序置换
先进行第二步操作,插入完成后再删除利用日志回滚数据库数据(太麻烦了,费时间,划不来)
使用开源框架中的方法
若运用了开源框架,例如hibernate,即可调用session.rollback()方法,进行对话回滚SQL事务
将这两步操作合并成一个整体的操作,即SQL事务
SQL事务
适用场景
适用于一组数据库操作命令。
对这组命令,要么全部执行,要么全部不执行。因此事务是一个不可分割的整体。
事务分类
1 显式事务:用begin transaction明确指定事务的开始。
2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
事务语法
BEGIN TRAN:设置起始点
数据库会忽略这个起点之后的最终没有提交的所有语句COMMIT TRAN:使事务成为数据库中永久的、不可逆转的一部分
事务的提交是一个事务的终点ROLLBACK TRAN:本质上说想要忘记它曾经发生过
ROLLBACK做的事情是回到起点。从关联的BEGIN语句开始发生的任何事情事实上都会被忘记SAVE TRAN:创建一个特定标记符,只允许部分回滚
保存事务从本质上说就是创建书签(bookmark)。为书签建立一个名称,在建立了”书签”之后,可以在回滚中引用它。创建书签的好处是可以回滚到代码中的特定点上-只要为想要回滚到的那个保存点命名。
事务代码例子
例子中的PO单头和PO单身是两张具有联系的表
/**作者Jurbo,时间:2016/8/6* PO/POline设定页面* 删除po单头和对应的PO单身**/public Boolean deletePo(string po_no){string sql = "BEGIN TRAN Tran_deletePo --开始事务"+ "DECLARE @tran_error int;"+ "SET @tran_error = 0;"+ "BEGIN TRY "+ "--删除PO单头"+ "delete from wms_po_header "+ "where po_no = @po_no; "+ "SET @tran_error = @tran_error + @@ERROR;"+ "--删除PO单身"+ "delete from wms_po_line "+ "where po_header_id = (select po_header_id from wms_po_header where po_no=@po_no)"+ "END TRY"+ "BEGIN CATCH"+ "PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()"+ "SET @tran_error = @tran_error + 1"+ "END CATCH"+ "IF(@tran_error > 0)"+ "BEGIN"+ "--执行出错,回滚事务"+ "ROLLBACK TRAN;"+ "PRINT '删除PO/POline失败,取消交易!';"+ "END"+ "ELSE"+ "BEGIN"+ "--没有异常,提交事务"+ " COMMIT TRAN;"+ "PRINT '删除PO/POline成功!';"+ "END";SqlParameter[] parameters = {new SqlParameter("po_no",po_no),};DB.connect();//返回受影响行数InfluenceNumint InfluenceNum = DB.delete(sql, parameters);if (InfluenceNum > 0)return true;elsereturn false;}
MySQL数据恢复
- 开启binary log功能
- 查看产生的binary log
- 利用bin_log恢复数据(date与position)
因为这块没有研究过,故开传送门
MySQL数据恢复--binlog
数据库误操作,如何恢复数据(SQL事务,或数据库还原)相关推荐
- SQLServer数据库误操作如何恢复
总目录 文章目录 总目录 前言 一.恢复数据实例 1.创建初始数据 2.保证数据恢复的前提条件 前提1 - 数据库创建时便已设置恢复模式为完整 前提2 - 至少做过一次完整的备份 3.模拟不小心误操作 ...
- TSPITR方式数据库找回误操作丢失的数据
一.TSPITR介绍 TSPITR全称是Tablespace Point In Time Recover(表空间基于时间点的不完全恢复).原理是通过辅助实例基于时间还原出误操作前的数据通过DataPu ...
- SQL Server 数据库常用操作:修改数据(ALTER、UPDATE语句的使用)
1.修改数据库 移动数据库文件 ALTER DATABASE Publish SET OFFLINE/*将Publish数据库设置为离线(脱机)状态*/ALTER DATABASE Publish M ...
- mysql binlog恢复sql_binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能. 原理不难理解,基于MySQL ...
- mysql权限的误操作的恢复
mysql权限的误操作的恢复 原因:由于误操作,我把repl用户授予了所有权限,但删除了数据库中的其他用户及权限,因此repl用户虽然具有操作所有数据库的权限,但没有grant权限,所以若想授予其他用 ...
- 分析一次磁盘分区表的误操作和恢复
前两天帮谢姨装Ubuntu到一个分区上做Win7和Ubuntu双系统,当时大脑发热就直接在Win7下把Ubuntu所在的分区格式化了.然后便是各种凶残的的误操作和恢复,折腾了一夜.现在把过程写下来,对 ...
- GHOST 误操作的恢复方法
GHOST 误操作的恢复方法 来自网络,重新整理并排版. 相信不少朋友有过使用GHOST误操作的经历,就象下面这样: 恢复系统的时候不慎选择了 LOCAL-DISK-FROM-IMAGE 直接选择恢复 ...
- oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...
本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...
- 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)
一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...
最新文章
- CTFshow 信息收集 web12
- TensorFlow数据统计
- BigDecimal运算的工具类
- 在vscode上运行linux代码,在linux上安装VSCode
- 100行代码让您学会JavaScript原生的Proxy设计模式
- ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
- pythonfor循环100次_以写代学: python for循环 range函数 xrange函数
- redis 公网 安全_redis漏洞复现
- 工作笔记-关于工具函数的编写问题
- deepsooncms在Ubuntu 14.04上部署教程
- 火狐浏览器快捷键大全
- 并发系列(二)----Java内存模型
- win+apache实现ssl的证书认证
- 【广告技术】用张量分解预测广告库存,广告投放更可靠!
- Koa v2.x 中文文档 上下文(Context)
- Android Layout XML属性
- Servlet+jsp入门教程
- Python——百度识图-相似图片爬虫下载解决方案
- 作为研发面试官,亲自教你面试技巧
- matlab时频工具箱简介,matlab时频工具箱