背景:
正常逻辑是删除数据,接口抽取其他业务系统全量数据。事故发生是数据删除(被物理删除),接口抽取异常,数据未抽取成功。数据被物理删除,也无法即刻恢复,导致业务无法进行。
1、物理删除和逻辑删除的区别:
逻辑删除是在设计删除接口时一部分多为逻辑删除,所谓的逻辑删除其实不是真正的删除,而是通过在表中将对应的是否删除标识(is_delete)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。一些大型的、数据关联性高、数据重要性高的应用往往会采用这种删除方式,它可以实现回收站、删除恢复、查看历史版本等实用功能,根据业务的需要有不同的应用场景。
物理删除就是真正的从数据库中做删除操作,将数据库中该信息彻底删除无法恢复。可以使用DELETE FROM SQL语句实现,这种方式产生的后果就是记录永久性删除,无法找回,一般适用于小型或数据重要性不高的项目,可以提高数据库资源利用率。
最后在实际删除接口设计中,需要根据实际的业务场景来判别需要用哪种删除方式。不同的业务需要根据其应用场景来选择合适的数据删除方式,一般的应用可以采用物理删除的方式,简单粗暴地将数据擦除,这样可以有效提高数据库地利用率。但是有些项目如金融、交通、能源等领域的历史数据,往往具有很高的利用价值,通过对这些数据进行分析总结,可以更好的了解该领域的发展情况和健康程度,以及对未来的发展规划起到一定指导作用,这时就要采用逻辑删除的方式,虽然数据管理平台为了便于管理,删除了过期的数据,但数据分析系统仍能从数据库中获取到历史数据,通过抽取转换加载的过程,将历史数据转化为高价值的内容,这是目前信息技术发展的主要趋势。
2、测试角度:
这个数据能不能删除,与其他数据是否有关联,删除之后会造成什么后果,不能删除又该怎么做,删除之后能否恢复
3、数据库的三种删除方法
(1)delete
- 可以按照条件清除数据
- 只限于清除数据,表的定义、设置都不会清除
(2)truncate
- 清空表内的所有数据,没有条件
- 相当于将当前表初始化,恢复到刚创建的状态
(3)drop
- 清除关于当前表的所有信息,表不再存在
删除数据的速度,一般来说: drop> truncate > delete。与 DELETE 语句相比,TRUNCATE TABLE语句具有以下优点:所用的事务日志空间较少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。使用的锁通常较少。当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。如无例外,在表中不会留有任何页。执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。与 DELETE 语句相同,使用 TRUNCATE TABLE语句清空的表的定义与其索引和其他关联对象一起保留在数据库中。