精华内容
下载资源
问答
  • 相信大家无论是开发、测试还是运维过程中,都可能会因为误操作、连错数据库、用错用户、语句条件有误等原因,导致错误删除、错误更新等问题。当你捶胸顿足或吓得腿软时,肯定希望有办法来恢复这些数据。oracle就提供...
  • 数据库 数据丢失问题 及解决方案

    千次阅读 2017-12-15 17:07:03
    什么是数据丢失 两个线程基于同一个查询结果进行修改,后修改的人会将先修改人的修改覆盖掉.  让我们先来看这么个小案例:  我们给游戏充值100,支付成功后,银行会向游戏服务器发送支付成功信息,有一个订单...

    什么是数据丢失

    两个线程基于同一个查询结果进行修改,后修改的人会将先修改人的修改覆盖掉. 
    让我们先来看这么个小案例: 
    我们给游戏充值100,支付成功后,银行会向游戏服务器发送支付成功信息,有一个订单支付信息表(order)和一个账户信息表(account),首先要去order表中查询该订单支付状态state(select state from order where id=1)如果是0未支付,接下来要做的就是更新state为已支付,并且向你的账户account中加上100. 但是网络是有延迟的银行为了确保信息能送达可能会再次向服务器发送支付成功信息。这时第二次请求也是先去查询state,若此次请求和第一次正好是并发执行,他查询到的state也是0,所以也会给你的account加100块钱。也就是后来的修改覆盖掉了前边的修改,这就是数据丢失。 
    这里写图片描述
    操作流程如下: 
    这里写图片描述

    怎么防止数据丢失

    先来看一下数据库中的锁机制: 
    共享锁:在非Serializable隔离级别做查询不加任何锁,而在Serializable隔离级别下做的查询加共享锁, 
    共享锁的特点:共享锁和共享锁可以共存,但是共享锁和排他锁不能共存 
    排他锁:在所有隔离级别下进行增删改的操作都会加排他锁, 
    排他锁的特点:和任意其他锁都不能共存

    悲观锁:

    悲观锁悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时就加上排他锁。 
    select state from order for update 
    这样第二个请求在查询时发现已经有个排他锁,就在那等着,等第一个事务操作完成后才轮到他,不过此时state已经变成1已支付,这样就避免再次加100块。

    乐观锁:

    乐观锁会乐观的认为每次查询都不会造成更新丢失.利用一个版本字段进行控制。 
    为order表加一个字段version 
    第一次请求查询出未支付后,在加100块钱之前,将更新state操作修改为: 
    update order set state=1 and version =version+1 where id=1 and version=0 
    这样第二个请求也执行这句是version就不是0了,执行失败。从而也防止了第一次数据的丢失。

    两种方案对比

    • 查询非常多,修改非常少,使用乐观锁(悲观查询都加排他锁 效率会降低)

    • 修改非常多,查询非常少,使用悲观锁(多管理员修改时,某种一个可能一直等待,所以用悲观)转载

    展开全文
  • Oracle数据库数据发生丢失后的恢复方法.pdf
  • 最近在开发excel导入简历(excel文件)功能,在导入excel时经常会出现插进数据库数据并不完整(只是部分数据),所以在插入之前打印了获取的excel表中数据, 发现打印出来的是富文本对象 (由未格式化文本、控制字、...

    最近在开发excel导入简历(excel文件)功能,在导入excel时经常会出现插进数据库的数据并不完整(只是部分数据),所以在插入之前打印了获取的excel表中数据,

    发现打印出来的是富文本对象 (由未格式化文本、控制字、控制符号组成,例如excel中的字体有宋体、楷体等等多种字体格式),这是插入失败的根本原因。

    解决办法:类型强制转换为string

    更改前:




    更改之后:


    问题解决了,,,就是这么简单,希望可以帮到困扰中的你!

    展开全文
  • 为什么数据库丢失数据

    千次阅读 2020-02-07 09:00:00
    数据库管理系统在今天已经是软件的重要组成部分,开源的 MySQL、PostgreSQL 以及商业化的 Oracle 等数据库已经随处可见,几乎所有的服务都需要依赖数据库管理系统存储数据。...

    数据库管理系统在今天已经是软件的重要组成部分,开源的 MySQL、PostgreSQL 以及商业化的 Oracle 等数据库已经随处可见,几乎所有的服务都需要依赖数据库管理系统存储数据。

    数据库不会丢失数据听起来像是理所当然的事情,持久化能力也应该是数据库的最基本保障,但是在这个复杂的世界上想要保证数据不丢失是很困难的。在今天,我们能找到很多数据库出现问题导致数据丢失的例子:

    • MongoDB 在过去很长的一段时间都不能保证持久性,很容易就会丢失数据[^1];

    • RocksDB DeleteRange 功能导致的数据丢失问题[^2];

    • 腾讯云硬盘故障,导致创业公司线上生产数据完全丢失[^3];

    无论是开源数据库还是云服务商提供的服务,都有可能发生数据丢失的。本文将数据库丢失数据的原因归结到以下的几个方面,我们将详细展开介绍这些原因:

    • 人为因素导致的运维和配置错误是数据库丢失数据的首要原因;

    • 数据库存储数据使用的磁盘损坏导致数据丢失;

    • 数据库的功能和实现复杂,数据没有及时刷入磁盘就有丢失的风险;

    人为错误

    人为错误是造成数据丢失的首要原因。在腾讯云数据丢失事故中,我们会发现,虽然事故的起因是硬件故障,但是最终导致数据完整性受损的还是运维人员的不当操作:

    第一是正常数据搬迁流程默认开启数据校验,开启之后可以有效发现并规避源端数据异常,保障搬迁数据正确性,但是运维人员为了加速完成搬迁任务,违规关闭了数据校验;

    第二是正常数据搬迁完成之后,源仓库数据应保留24小时,用于搬迁异常情况下的数据恢复,但是运维人员为了尽快降低仓库使用率,违规对源仓库进行了数据回收。

    减少人为错误的最好方式是将数据的备份和运维等操作标准化,使用自动化的流程处理涉及数据安全的操作,这样才能降低人为干预带来的风险。

    对于软件工程师来说,我们应该敬畏生产环境,谨慎地在生产环境执行一切操作,认识到所有的操作都可能对线上正在运行的服务产生影响,这样才能降低类似问题发生的概率。

    硬件错误

    任何一个线上的服务能够正常运行都是极其偶然的,只要时间拉的足够长,我们就没有办法保证服务 100% 的可用性[^4]。

    磁盘等硬件如果使用的时间足够长,很有可能会发生损坏,根据 Google 论文中的数据,5 年内硬盘的年平均故障率(Annualized Failure Rates,AFR)为 8.6%[^5]。

    2018 年,腾讯云数据损坏事故的起因就是磁盘静默错误(Silent data corruption)[^6]导致的单副本数据错误。磁盘静默错误是没有被磁盘固件或者宿主操作系统发现的错误,包括以下情况:电缆松了、电源供给不可靠、外部震动、网络引起的数据丢失等问题。

    正是因为磁盘的数据损坏非常常见,所以我们需要数据冗余的方式保证磁盘在发生不可修复读错误(Unrecoverable Read Error)时能够恢复磁盘数据。

    独立冗余磁盘阵列(Redundant Array of Independent Disks,RAID)是一种能够将多个物理磁盘组合成一个逻辑磁盘的数据存储虚拟化技术,它能够增加数据冗余并提高性能[^7]。

    raid-strategy

    RAID 主要使用分割(Striping)、镜像(Mirroring)和奇偶校验(Parity)三大策略管理磁盘中的数据,我们这里举几个简单的例子:

    • RAID 0 使用了数据分割技术,但是没有镜像和奇偶校验。它对磁盘上的数据几乎不进行任何的保护,任意一块磁盘磁盘损坏都意味着其中的数据无法恢复,但是因为不存在冗余,所以它也会提供较好的性能;

    • RAID 1 使用了数据镜像的功能,但是没有奇偶校验和数据分割。所有的数据都会写入两个相同的磁盘,两个磁盘都能对外提供数据读取的服务。这种方式降低了磁盘的使用率,但是能够提高读取性能并提供备份;

    • ...

    RAID 使用的分割和镜像策略与分布式数据库中的分片(Partition)和副本(Replication)比较相似,分割和分片将数据切分后分配到不同的磁盘或者机器,而镜像和副本的作用都是复制数据。

    很多现代的操作系统都会提供基于软件的 RAID 实现,一些云服务厂商也会使用自研的文件系统或者冗余备份机制:

    • Google 使用 Google 文件系统管理文件,它以块的方式存储文件并且通过主服务管理所有的文件块[^8];

    • Microsoft 在 Azure 中使用擦除编码的方式计算冗余数据[^9];

    硬件错误在生产环境中很常见,我们只有通过数据冗余和校验才能降低数据丢失的可能性,但是增加冗余的方式也只能不断降低数据丢失的概率,不能 100% 的避免。

    实现复杂

    数据库管理系统最终会将数据存储在磁盘上,对于很多数据库来说,数据落到磁盘上就意味着持久化完成了。磁盘作为数据库系统的下层,磁盘能够稳定存储数据是数据库能够持久化数据的基础。

    database-and-disk

    很多人都误认为使用 write 就能将数据写入到磁盘上,然而这是错误的。函数 write 不仅不能保证数据写入磁盘,有的实现甚至都不能保证目标空间保留给了写入的数据[^10]。

    一般情况下,对文件的 write 只会更新内存中的页缓存,这些页缓存不会立刻刷入磁盘,操作系统的 flusher 内核线程会在满足以下条件时将数据落盘[^11]:

    • 空闲内存下降到了特定的阈值,需要释放脏页占用的内存空间;

    • 脏数据持续了一定时间,最老的数据就会被写入磁盘;

    • 用户进程执行 sync 或者 fsync 系统调用;

    如果我们想要将数据立刻刷入磁盘,就需要在执行 write 后立刻调用 fsync 等函数[^12],当 fsync 等函数返回后,数据库才会通知调用方数据已经成功写入。

    write-and-fsyn

    writefsync 在数据库管理系统中非常重要,它们是提供持久性保证的核心方法,一些开发者对 write 的理解错误写出错误的代码就会导致数据丢失。

    除了持久化的特性之外,数据库可能还需要提供 ACID(Atomicity, Consistency, Isolation, Durability)或者 BASE(Basically Available, Soft state, Eventual consistency)的保证,有些数据库还会提供分片、副本以及分布式事务等复杂功能,这些功能的引入也增加了数据库系统的复杂性,而随着程序复杂性的增加,出现问题的可能性也随之增长。

    总结

    数据库管理系统是软件工程中最复杂、最重要的系统之一,几乎所有服务的正常运行都建立在数据库不会丢失数据的假设上。

    然而因为如下所示的原因,数据库不能完全保证数据的安全:

    • 运维人员在配置和运维时极有可能因为操作失误导致数据丢失;

    • 数据库依赖的底层磁盘发生硬件错误,导致数据无法恢复;

    • 数据库系统支持的功能非常多而且复杂,数据没有及时落盘就可能造成数据丢失;

    一旦发生数据丢失的事故,造成的影响就会非常大,我们在使用数据库存储核心业务数据时也不能完全信任数据库的稳定性,可以考虑使用热备以及快照等方式容灾。

    到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:

    • 除了文中列出的数据丢失事故,还有哪些数据库或者云服务商丢失过数据?

    • Redis 的 RDB 和 AOF 机制什么时候会将数据落盘?

    • 数据成功写入数据库究竟应该如何定义?

    [^1]: Brandur. May 7, 2017. "The long road to Mongo's durability" https://brandur.org/fragments/mongo-durability

    [^2]: Huachao HUANG. Fri, Sep 8, 2017. "How We Found a Data Corruption Bug in RocksDB" https://pingcap.com/blog/2017-09-08-rocksdbbug/

    [^3]: 腾讯云. Aug, 2018. 关于客户“前沿数控”数据完整性受损的技术复盘 https://mp.weixin.qq.com/s/8JSPY6vHPhg8pX0JwjqttQ

    [^4]: Draven. Dec, 2019. "为什么基础服务不应该高可用 · Why's THE Design?" https://draveness.me/whys-the-design-unstable-infrastructure

    [^5]: Eduardo Pinheiro, Wolf-Dietrich Weber and Luiz Andre Barroso. Feb, 2007. "Failure Trends in a Large Disk Drive Population" https://static.googleusercontent.com/media/research.google.com/en//archive/disk_failures.pdf

    [^6]: Wikipedia: Silent Data corruption https://en.wikipedia.org/wiki/Data_corruption#Silent

    [^7]: Wikipedia: RAID https://en.wikipedia.org/wiki/RAID

    [^8]: Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung. Oct, 2003. "The Google File System" https://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf

    [^9]: Cheng Huang. Jun, 2012. "Erasure Coding in Windows Azure Storage" https://www.cs.princeton.edu/courses/archive/spring13/cos598C/atc12-final181.pdf

    [^10]: write(2) - Linux man page https://linux.die.net/man/2/write

    [^11]: John Madieu. "The flusher threads" https://www.oreilly.com/library/view/linux-device-drivers/9781785280009/457ca621-7f40-431f-b8f4-2a9ae03201de.xhtml

    [^12]: Difference between fflush and fsync https://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync

    有道无术,术可成;有术无道,止于术

    欢迎大家关注Java之道公众号

    好文章,我在看❤️

    展开全文
  • 在archivelog mode(归档模式)只要其归档日志文件不丢失,就可以有效地防止数据丢失

    在archivelog mode(归档模式)只要其归档日志文件不丢失,就可以有效地防止数据丢失。

    展开全文
  • 当把EXCEL内的数据导入到数据库中的时候经常会遇到数据丢失问题。就这个问题在网上找了很多解决方法,但都不是很理想。根据这个问题做以下解释和解决方法:首先:我们最常用的数据导入方法是将EXCEL做为OLEDB数据源...
  • 数据库数据迁移方法

    万次阅读 2019-05-14 10:55:47
    1.从旧数据库中将数据迁移到全新的数据库 2.有两个数据库A和B,A中需迁移表的结构和B一样,A和B中都有各自的数据,现在要同步两个数据库 方法: 通过单表查询插入SQL语句 通过写数据库存储过程 通过写程序(...
  • greendao操作数据库升级导致表数据丢失,原来表中数据拷贝到新表失败导致。
  • JPA或者Hibernate插入数据的时候上条数据会被覆盖,或者数据库数据丢失 这个问题产生的主要原因就是你配置文件中hibernate.hbm2ddl.auto配置参数的问题, 你可能设置成为了你可以把update修改为update或者none. ...
  • MySQL数据库导入或者同步大量数据时数据丢失解决方案
  • 数据的长生不死和死而复生——从ORACLE数据库中找回丢失数据.pdf
  • 数据库作为我们生活中常用的数据统计工具,其重要性不言而喻,可是在工作生活中,我们经常因为各种原因导致数据库出现故障,进而造成数据库文件的丢失。  对于大家来说,数据库文件是非常重要的,一旦发生数据库...
  • Sql Server数据库数据恢复成功案例

    千次阅读 2018-10-11 16:33:44
    故障描述: 5块2T硬盘组建RAID5,划分LUN供windows服务器使用。...丢失原因未知,且不能确定数据存储位置。三个数据库的大小分别为8G、15G、20G。在文件丢失后服务器仍处于开机状态,但并未写入...
  • 最近项目中除了宿主机系统与Docker环境之外,其他所有的服务都打成镜像了可以用docker来运行,只剩下数据库Mysql还不敢放入docker中,有哪位兄弟...Docker中使用mysql数据库,如何防止Docker重启后数据丢失问题? ...
  • Oracle数据库任意距离零数据丢失保护的解决方案.pdf
  • ClickHouse数据库数据

    千次阅读 2020-09-28 11:17:22
    文章目录ClickHouse数据库数据表大小写敏感数据库数据库操作ClickHouse数据库引擎数据存储目录数据数据表操作创建数据表复制表结构复制表结构和数据 ClickHouse数据库数据表 ClickHouse的语法与MySQL很类似,...
  • 关于使用dbms_logmnr进行恢复 ----------------- Oracle LogMiner, 作为Oracles数据库配套工具,可以...所有关于数据库数据以及数据字典的变更都会被记录在Oracle重做日志中,它们被用于在需要时进行数据库恢复。因...
  • 一旦数据库出现无法启动的情况,首先需要检查system表是否为未损坏状态,通常情况而言,如果system表未被损坏那么很容易进行数据恢复,如果system表已经被损坏,那么就需要数据恢复工作人员手动对表结构进行分析核对...
  • 当配置create之后,每次调用hibernate都会从新创建数据库,导致数据丢失。所以在第一次启动服务器之后,最好把这个配置删除掉。
  • oracle数据库中的空间表数据丢失以后可以用此方法恢复。
  • Access数据库数据转存到MySql数据库中

    千次阅读 2019-01-04 20:51:41
    一、Navicat自带导入Access(*.mdb)数据的方式 二、借助ODBC当然Access数据 1. 建立ODBC数据源 2. 通过Navicat导入数据 3. 添加键等 使用Navicat 8 for MySql来导入数据,Access是2003版本的,当前office是2017...
  • NoSQL数据库数据模型(笔记)

    千次阅读 2017-06-04 11:50:02
    NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。 数据之间无关系,这样就非常容易扩展,也无形之间在架构的层面上带来了可扩展的能力。NoSQL无需事先为要存储的数据建立字段,随时可以...
  • //插入的数据如果已经存在表中,则替换掉旧数据(根据主键来检测是否已经存在) MovieCollect movieCollect; mMovieCollectDao.insertOrReplace(movieCollect); //单个数据 List<MovieCollect> listMovieCollect...
  • 遇到个很奇怪的问题。为什么mongodb的数据库一重启数据就会丢失数据引用的是一些初始的json文件。可是后来有添加数据,为什么已重启后面添加的数据就全部都丢失
  • 数据库数据处理性能提升技术

    千次阅读 2016-01-07 10:57:05
    一、数据处理性能存在的问题1、企业的数据都集中存储在数据库中,从海量的数据中查找和定位数据是非常耗时的; 2、数据集中存储后,所有用户都要来访问数据库,当很多用户同时访问数据库时,数据库服务器的负载就...
  • 在导出数据项前加上 导入Excel 时, 数字字符的数据会因Excel中的科学计数法, 导致数值过大的数据丢失后几位数.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 332,750
精华内容 133,100
关键字:

怎么防止数据库数据丢失