当前位置:首页 » 数据仓库 » 数据库坏快会影响表的历史数据吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库坏快会影响表的历史数据吗

发布时间: 2023-06-10 19:24:44

数据库为什么会损坏呢

数据库损坏常见的原因有以下几种:
1、事务日志问题。比如事务日志文件丢失;事务日志文件在操作过程中被误删;事务日志文件被损坏以及事务日志文件过大,导致硬盘的空间不足等;
2、意外掉电或异常强制关机,造成数据文件损坏,主要数据库正在被读写过程中异常关机;
3、数据库的表被破坏或索引等被破坏,或者数据库的其他对象被破坏或丢失等;
4、删除了数据文件,或者更改了它的名字;
5、硬盘损坏,造成数据和日志文件读写错误:
(1)感染病毒或者其他人为因素破坏;
(2)其他文件读写、存储等原因

② 数据库系统运行过程中的故障对数据库影响起来有哪两类

分为:事务故障、 系统故障、 介质故障
一、事务故障
什么是事务故障?
某个事务在运行过程中由于种种原因未运行至正常终止点 事务故障的常见原因 输入数据有误 运算溢出 违反了某些完整性限制 某些应用程序出错 并行事务发生死锁事务故障(续) 事务故障的恢复
事务故障的恢复:事务撤消(UND) 恢复程序要在不影响其它事务运行的情况下,强行回滚(RBACK)该事务,即清除该事务对数据库的所有修改,使得这个事务象根本没有启动过一样 二、系统故障
什么是系统故障 ?
由于某种原因造成整个系统的正常运行突然停止,致使所有正在运行的事务都以非正常方式终止。 发生系统故障时,内存中数据库缓冲区的信息全部丢失,但存储在外部存储设备上的数据未受影响 系统故障(续) 系统故障的常见原因 操作系统或DBMS 代码错误 操作员操作失误 特定类型的硬件错误(如CPU 故障) 突然停电 系统故障(续)
系统故障的恢复 1. 清除尚未完成的事务对数据库的所有修改 如果DBMS 无法确定哪些事务已更新过数据库,则系统重新启动后,恢复程序要强行撤消(UND ) 所有未完成事务,使这些事务象没有运行过一样。2. 将已完成事务提交的结果写入数据库 如果DBMS 无法确定哪些事务的提交结果尚未写入物理数据库,则系统重新启动后,恢复程序需要重做(RED ) 所有已提交的事务。
三、介质故障
什么是介质故障?
硬件故障使存储在外存中的数据部分丢失或全部丢失 介质故障比前两类故障的可能性小得多,但破坏性最大。 介质故障(续) 介质故障的常见原因 硬件故障 磁盘损坏 磁头碰撞 操作系统的某种潜在错误 瞬时强磁场干扰 介质故障(续) 介质故障的恢复 装入 数据库发生介质故障前某个时刻的数据副本 重做自此时始的所有成功事务 ,将这些事务已提交的结果重新记入数据库 故障的种类小结 数据库系统中各类故障对数据库的影响 数据库本身被破坏 (介质故障) 数据库处于不一致状态 数据库中包含了未完成事务对数据库的修改(事务故障、系统故障) 数据库中丢失了已提交事务对数据库的修改(系统故障)不同类型的故障应采用不同的恢复操作 故障的种类小结(续)
恢复操作的基本原理:简单 原理:利用 存储在系统其它地方的冗余数据 来重建 数据库中已经被破坏或已经不正确的那部分数据 恢复的实现技术:复杂 一般一个大型数据库产品,恢复子系统的代码要占全部代码的10% 以上。

希望能帮到楼主~~~也希望能成为最佳答案~~~要不都枉费了我打这么多字了啊

③ 怎么修复数据库 修复数据库坏块方法

修复数据库坏块
dbv
你也可以用dbv工具看一下你现在其他的数据文件有没有还有坏块的
dbv file='yourfilename'
恢复方法:
当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息:
ORA-01578: ORACLE data block corrupted (file # 7, block # )
ORA-01110: data file : '/oracle1/oradata/V920/oradata/V816/users01.dbf'
其中,<AFN>代表坏块所在数据文件的绝对文件号,代表坏块是数据文件上的第几个数据块
出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。
1.确定发生坏块的数据库对象
SELECT tablespace_name,
segment_type,
owner,
segment_name
FROM dba_extents
WHERE file_id =
AND between block_id AND block_id+blocks-1;
2.决定修复方法
如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建;
如果发生坏块的表的记录可以根据其它表的记录生成的话,那么颤中可以直接把这个表DROP掉后重建;
如果有数据库的备份,则恢复数据库的方法来进行修复;
如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据坏上的记录取出来,然后对这个表进行重建。
3.用Oracle提供的DBMS_REPAIR包标记出坏块
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');
4.使用Create table as select命令将表中其它块上的记录保存到另一张表上
create table corrupt_table_bak
as
select * from corrupt_table;
5.用DROP TABLE命令删除有坏块的表
drop table corrupt_table;
6.用alter table rename命令恢复原来的表
alter table corrupt_table_bak
rename to corrupt_table;
7.如果表上存在耐洞伍索引,则要重建表上的索引
PART2
2014.7.22研究恢复数据库坏块:
Oracle调用标准C的系统函数,对数据块进行读写操作,因此,坏块是有可能由以下几种原因产生:
硬件的I/O错误
操作系统的I/O错误或缓冲问题
内存或paging问题
磁盘修复工具
一个数据文件的一部分正在被覆盖
Oracle试图访问一个未被格式化的系统块失败
数据文件部分溢出
Oracle或者操作系统的bug
遇到“ORA-01578:ORACLE data block corrupted”错误
处理方法:1.rman的recover命令可以在数据库保持open状态下只恢复受损的数据块
2.如果没有备份,万不得已之下也可以采用DBMS_REPAIR包的存储过程将受损坏块隔离,同时尽可能地挽救部分数据。
rman backup命令也是检查坏数据块的好工具 一旦读取ORA-19566 即可有问题
此时可用backup validate tablespace user观察详细的信息,可查看到坏块数与跟踪文件
grep‘corrupt’/u01/app/oracle/diag/rdbms/br/br/trace/**.trc
恢复数据块:rman》recover datafile 5 block 203;
批量恢复受损的数据块:recover corruption list;
数据块坏块昌或一号坏块,需要做:
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql'alter database datafile 5 online'
}
使用exp/imp恢复
在这种情况下肯定会造成数据的丢失,在这种情况下应采取将数据导出然后重建表再进行导入的方法,来尽量恢复损坏数据块中的数据,但是在有坏块的情况下是不允许导出的,如下命令:Exp test/test file=t.dmp tables=t;
导出命令在执行中会报ORA-01578错误,在这错误提示中会提示那个文件号的文件以及这个文件中的哪个块被损坏,如:ORA—01578:ORACLE 数据块损坏(文件号 4,块号 35)
针对以上的提示首先查询那些对象被损坏:
Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;
如果被损坏的块是索引,通常可以通过索引重建来解决,如果损坏的是数据(segment_type为table),那么通过设置如下内部事件使得Exp操作跳过坏块。
Alter session set events=’10231 trace name context forever,level 10’;
然后重新执行导出命令,导出相关的表,然后执行Drop Table命令删除相关表,之后重建表最后导入数据。
使用DBMS_REPAIR恢复
用DBMS_REPAIR当然也会丢失数据。这里不做详细的介绍,有兴趣的可以查看oracle的在线文
3、使用dbms_repair包进行坏块处理
1)首先建立repair_table,用于存放dbms_repair.check_object检测出来的坏块信息
SQL> declare
2begin
3dbms_repair.admin_tables
4(table_name => 'REPAIR_TABLE',--表名
5table_type => dbms_repair.repair_table,
6action => dbms_repair.create_action,
7tablespace => 'USERS');--用于指定该表存放的表空间
8end;
9/
PL/SQL 过程已成功完成。
SQL> col owner format a10
SQL> col object_name format a20
SQL> col object_type format a20
SQL> select owner, object_name, object_type
2from dba_objects
3where object_name like '%REPAIR_TABLE';
OWNEROBJECT_NAMEOBJECT_TYPE
---------- -------------------- --------------------
SYSREPAIR_TABLETABLE
SYSDBA_REPAIR_TABLEVIEW
Oracle自动创建了一个DBA_REPAIR_TABLE视图。
2)使用dbms_repair.check_object进行坏块检测
SQL> set serveroutput on size 100000;
SQL> declare
2rpr_count int;
3begin
4rpr_count := 0;
5dbms_repair.check_object(
6schema_name => 'SYS',--指定对象模式,也就是对象的所有者
7object_name => 'TEST',--指定对象名,也就是表名
8repair_table_name => 'REPAIR_TABLE',
9corrupt_count => rpr_count);
10dbms_output.put_line('repair block count: '
11||to_char(rpr_count));
12end;
13/
repair block count: 4
PL/SQL 过程已成功完成。
SQL> select object_name, block_id, corrupt_type, marked_corrupt,
2corrupt_description, repair_description
3from repair_table;
OBJECT_NAMEBLOCK_ID CORRUPT_TYPE MARKED_COR
-------------------- ---------- ------------ ----------
CORRUPT_DESCRIPTION
-------------------------------------------------------------------------------
REPAIR_DESCRIPTION
-------------------------------------------------------------------------------
TEST196148 TRUE
mark block software corrupt
TEST206148 TRUE
mark block software corrupt
TEST236148 TRUE
mark block software corrupt
TEST316148 TRUE
mark block software corrupt
通过运行dbms_repair.check_object,将坏块信息存放到了repair_table表中,其中有个字段marked_corrupt,用于标识该块是否被标识为坏块,当被标识为true时,即该块被标识为坏块。其中这一步跟oracle文档中的描述有点进入,根据oracle文档,当执行完dbms_repair.check_object时,并不会进行坏块标识,也就是marked_corrupt列的值应该为false,而只有当执行dbms_repair.fix_corrupt_blocks过程后才会进行坏块标识。
3)使用dbms_repair.fix_corrupt_blocks进行坏块标识
SQL> declare
2fix_block_count int;
3begin
4fix_block_count := 0;
5dbms_repair.fix_corrupt_blocks (
6schema_name => 'SYS',
7object_name => 'TEST',
8object_type => dbms_repair.table_object,
9repair_table_name => 'REPAIR_TABLE',
10fix_count => fix_block_count);
11dbms_output.put_line('fix blocks count: ' ||
12to_char(fix_block_count));
13end;
14/
fix blocks count: 0
PL/SQL 过程已成功完成。
我们可以见到到fix blocks count=0,即在上一步进行check_object时已经进行了坏块标识了,这一步其实可以省略。(不过没有测试过!)

④ 数据库文件损坏了,还可以恢复吗

关于这个问题,要看损坏的是什么文件,以ORACLE数据库为例1控制文件,每个数据库默认有三个控制文件内容一样(比如CTRL01.DBF,CTRL02.DBF,CTRL03.DBF),损坏其中两个,只需把好的那个拷贝成另外两个的名称即可。如果所有控制文件都坏了,需要启动实例到nomount状态重建控制文件,前提是之前最好做过;会得到一个重建控制文件的脚本2在线日志(redolog),如果每个日志组(group)的member(成员)不止一个,同一组内的在线日志只要有一个完好,同样可以通过拷贝方式(停止数据库后)恢复。3TEMP表空间数据文件,可以理解为数据库用的临时文件,损坏后基本无数据损失,可以通过重建temp表空间恢复4.SYSTEM系统表空间,这个挂了基本上必须靠恢复了,前提是要有备份4.其它数据表空间4.1.有备份,可以恢复,但可能丢失数据4.2.未备份,无法恢复该表空间数据,可以选择使该表空间离线(offline),恢复其它数据

⑤ 一般情况下是什么原因导致数据库数据丢失的呢

硬盘是计算机中所常用的一种存储设备,主要也就是用来存储一些重要的数据文件,而电脑也是我们日常生活和学习中所常用的重要工具之一,很多人也都经常拿它来做一些PPT,Word,以及各种工作文档文件,给我们的生活也都提供了很大的便利。那么作为电脑的重要组成部分的硬盘来说,当我们在使用过程中,随着使用时间的延长,对硬盘的损坏也都是越来越大的。那么如果在使用过程中,不小心误删除,或者误清空硬盘中数据文件的话,我们又该如何恢复呢?怎样才能找回丢失的文件呢?下面就为大家介绍下,相关硬盘文件恢复的丰富,主要分为以下几点:

硬盘打不开的原因:
1、硬盘系统驱动出现问题,如果是驱动出现问题的话,在插入硬盘时会有所提示,此时也就需要重新安装对应的 USB3.0 驱动程序。
2、硬盘内部设备供电不足,导致硬盘无法打开。

3、人为因素导致接口出现问题,很多人在使用 USB 设备时,往往没有对硬盘进行定期的保养和维护,导致它内部的 USB 接口出现断针的现象。
4、文件或目录损坏,如果将硬盘插入电脑中,界面提示是否需要对硬盘进行格式化,此时也就说明硬盘的目录文件有损坏的现象,

以上就是移动硬盘打不开的几种原因介绍,相信大家也都有了一定的了解, 为了能够找回我们所丢失的文件,当硬盘数据丢失后,也就需要结合丢失文件类型选择不同的方法进行数据的修复。以”嗨格式数据恢复大师“为例,可修复误删除,误清空,误格式化等多种情景下丢失的文件,在操作过程中也都比较简单方便。
希望以上内容对大家有所帮助,不管是哪种原因造成数据丢失或损坏,首先也就需要及时停止对都是数据的硬盘进行扫描和读写,避免文件出现覆盖丢失的现象。

⑥ 数据库运行中可能产生的故障有哪几类哪些故障影响事务的正常执行哪些破坏数据库数据

在我上的“数据库系统实现”课程中是分为一下四类:
错晌孙误数据输入
介质故障
灾难性故障
系统故障
但是有些书上给出的是:
一、事务内部信此的故障; 二、系统故障; 三、介质故障; 四、计算机病毒;五、用户操作错误
这个很难说谁的匪类对错,比如计算机病毒,这个可以算作系统故障,错误数据输入可以分为事务内部和用户操作
按照我自己课程的分类,错误数据输入和系统故障是影响事物正常执行的,而介质故障和灾难性故障是破坏数据库数据的
具体要看你们用什宴坦链么教材,毕竟不是我判卷:)