日志文件已损坏,如何修复SQLSERVER2000数据库文件
给你一个我日常维护数据库的方法吧。
SQL Server 2000数据库LDF损坏,只有mdf的恢复方法。
SQL Server 2000数据库文件遭到破坏的现象经常出现,数据库出错是否可以修复呢?答案是可以的,本日志以一个sql server 2000数据库,数据库日志文件ldf损坏了,mdf正常,数据库附加失败的修复方法总结一下,数据库数据恢复在很多时候比较复杂,当数据库存在大量错误的时候,使用DBCC修复也是不可以的,需要拆解数据库来抢救重要的数据,下面是较为常见的一种SQL Server 2000数据库修复方式:
1) 先及时把原来的数据库文件(如test.mdf)备份到其他地方。
2) 停掉服务器。
3) 删除这个test.mdf。
4) 重新建立一个test同名数据库。
5) 删除这个新建立的test数据库的test.ldf文件,并用开始备份好test.mdf文件覆盖这个新建立的test.mdf文件。
6) 启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”。
7) 设置test为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID('test')
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
8) 下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
执行过程中,如果遇到下列提示信息:
服务器: 消息 5030,级别 16,状态 1,行 1
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
说明您的其他程序正在使用该数据库,如果刚才您在操作中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
正确执行完成的提示应该类似于:
警告: 数据库 'test' 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
9) 验证数据库一致性
dbcc checkdb('test')
10.设置数据库为正常状态
sp_dboption 'test','dbo use only','false'
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
11)最后一步,我们要将步骤6中设置的“允许对系统目录直接修改”一项恢复;
怎样恢复损坏的SQL Server数据文件
1、确保备份下的master数据库与要恢复的SQL SERVER的版本一致性。2、关闭打开SQL Server Management Studio,打开服务器管理器,点击“配置”-“服务”,找到SQL SERVER服务,右键点击出快捷菜单。点击“停止”停止MSSQLSERVER服务。3、以管理员账户打开cmd,输入以下的命令:net start mssqlserver /m。4、打开SQL Server Management Studio,出现连接到服务器的窗口,点击取消。5、点击“新建查询”,出现连接到服务器的窗口,点击确定。因为是单用户模式,因此只能有一个链接进入。6、在查询窗口输入以下的命令。7、重新启动SQL SERVER(MSSQLSERVER)服务,右键点击出快捷菜单。点击“启动”启动服务就可以了。
电脑安装数据库损坏了.怎么办 ? 有一漏洞无法修复了 ?
系统漏洞是指应用软件或操作系统软件在逻辑设计上的缺陷或在编写时产生的错误,这个缺陷或错误可以被不法者或者电脑黑客利用,通过植入木马、病毒等方式来攻击或控制整个电脑,从而窃取您电脑中的重要资料和信息,甚至破坏您的系统。Windows XP默认启动的UPNP服务存在严重安全漏洞。UPNP(Universal Plug and Play)体系面向无线设备、PC机和智能应用,提供普遍的对等网络连接,在家用信息设备、办公用网络设备间提供TCP/IP连接和Web访问功能,该服务可用于检测和集成 UPNP 硬件。 UPNP 协议存在安全漏洞,使攻击者可非法获取任何 Windows XP 的系统级访问、进行攻击,还可通过控制多台 XP 机器发起分布式的攻击。 对策 (1)建议禁用UPNP服务。 (2)下载补丁程序,网址如下所述:url=/technet/security/bulletin/MS01-059.asp 2.升级程序漏洞 漏洞描述 如将Windows XP升级至Windows XP Pro,IE 6.0即会重新安装,以前的补丁程序将被全部清除。 解释 Windows XP的升级程序不仅会删除IE的补丁文件,还会导致微软的升级服务器无法正确识别IE是否存在缺陷,即Windows XP Pro系统存在两个潜在威胁,如下所述: (1)某些网页或HTML邮件的脚本可自动调用Windows的程序。 (2)可通过IE漏洞窥视用户的计算机文件。 对策 如IE浏览器未下载升级补丁可至微软网站下载最新补丁程序。 3.帮助和支持中心漏洞 漏洞描述 删除用户系统的文件。 解释 帮助和支持中心提供集成工具,用户通过该工具获取针对各种主题的帮助和支持。在目前版本的 Windows XP 帮助和支持中心存在漏洞,该漏洞使攻击者可跳过特殊的网页(在打开该网页时,调用错误的函数,并将存在的文件或文件夹的名字作为参数传送)来使上传文件或文件夹的操作失败,随后该网页可在网站上公布,以攻击访问该网站的用户或被作为 邮件传播来攻击。 该漏洞除使攻击者可删除文件外,不会赋予其他权利,攻击者既无法获取系统管理员的权限,也无法读取或修改文件。 对策 安装 Windows XP的Service pack 1。 4.压缩文件夹漏洞 漏洞描述 Windows XP 压缩文件夹可按攻击者的选择运行代码。 解释 在安装“Plus!”包的Windows XP系统中,“压缩文件夹”功能允许将Zip文件作为普通文件夹处理。“压缩文件夹”功能存在两个漏洞,如下所述: (1)在解压缩Zip文件时会有未经检查的缓冲存在于程序中以存放被解压文件,因此很可能导致浏览器崩溃或攻击者的代码被运行。 (2)解压缩功能在非用户指定目录中放置文件,可使攻击者在用户系统的已知位置中放置文件。 建议 不接收不信任的邮件附件,也不下载不信任的文件。 5.服务拒绝漏洞 漏洞描述 服务拒绝。 解释 Windows XP支持点对点的协议(PPTP),是作为远程访问服务实现的虚拟专用网技术,由于在控制用于建立、维护和拆开 PPTP 连接的代码段中存在未经检查的缓存,导致Windows XP 的实现中存在漏洞。通过向一台存在该漏洞的服务器发送不正确的 PPTP 控制数据,攻击者可损坏核心内存并导致系统失效,中断所有系统中正在运行的进程。 该漏洞可攻击任何一台提供 PPTP 服务的服务器,对于 PPTP 客户端的工作站,攻击者只需激活PPTP会话即可进行攻击。对任何遭到攻击的系统,可通过重启来恢复正常操作。 对策 建议不默认启动PPTP。 6.Windows Media Player漏洞 漏洞描述 可能导致用户信息的泄漏;脚本调用;缓存路径泄漏。 解释 Windows Media Player漏洞主要产生两个问题:一是信息泄漏漏洞,它给攻击者提供了一种可在用户系统上运行代码的方法,微软对其定义的严重级别为“严重”。二是脚本执行漏洞,当用户选择播放一个特殊的媒体文件,接着又浏览一个特殊建造的网页后,攻击者就可利用该漏洞运行脚本。由于该漏洞有特别的时序要求,因此利用该漏洞进行攻击相对就比较困难,它的严重级别也就比较低。 对策 Windows Media Player的信息泄漏漏洞不会影响在本地机器上打开的媒体文件。因此,建议将要播放的文件先下载到本地再播放,即可不受利用此漏洞进行的攻击。脚本执行漏洞仅有完全按下面的顺序进行一系列操作,攻击者才可能利用该漏洞进行一次成功攻击,否则,攻击将不会成功。具体的操作如下:用户必须播放位于攻击者那边的一个特殊的媒体文件;播放该特殊文件后,该用户必须关闭Windows Media Player而不再播放其他文件;用户必须接着浏览一个由攻击者构建的网页。因此,只需用户不按照该顺序进行操作,即可不受攻击。 7.RDP漏洞 漏洞描述 信息泄露并拒绝服务。 解释 Windows 操作系统通过RDP(Remote Data Protocol)为客户端提供远程终端会话。RDP 协议将终端会话的相关硬件信息传送至远程客户端,其漏洞如下所述: (1)与某些 RDP 版本的会话加密实现有关的漏洞。 所有RDP 实现均允许对RDP 会话中的数据进行加密,然而在Windows 2000和Windows XP版本中,纯文本会话数据的校验在发送前并未经过加密,窃听并记录 RDP 会话的攻击者可对该校验密码分析攻击并覆盖该会话传输。 (2)与Windwos XP中的 RDP 实现对某些不正确的数据包处理方法有关的漏洞。 当接收这些数据包时,远程桌面服务将会失效,同时也会导致操作系统失效。攻击者只需向一个已受影响的系统发送这类数据包时,并不需经过系统验证。 对策 Windows XP 默认并未启动它的远程桌面服务。即使远程桌面服务启动,只需在防火墙中屏蔽3389端口,即可避免该攻击。 8.VM漏洞 漏洞描述 可能造成信息泄露,并执行攻击者的代码。 解释 攻击者可通过向 JDBC 类传送无效的参数使宿主应用程序崩溃,攻击者需在网站上拥有恶意的Java applet 并引诱用户访问该站点。 恶意用户可在用户机器上安装任意DLL,并执行任意的本机代码,潜在地破坏或读取内存数据。 对策 建议经常进行相关软件的安全更新。 9.热键漏洞 漏洞描述 设置热键后,由于Windows XP的自注销功能,可使系统“假注销”,其他用户即可通过热键调用程序。 解释 热键功能是系统提供的服务,当用户离开计算机后,该计算机即处于未保护情况下,此时Windows XP会自动实施“自注销”,虽然无法进了桌面,但由于热键服务还未停止,仍可使用热键启动应用程序。 对策 (1)由于该漏洞被利用的前提为热键可用,因此需检查可能会带来危害的程序和服务的热键。 (2)启动屏幕保护程序,并设置密码。 (3)建议在离开计算机时锁定计算机。 10.帐号快速切换漏洞 漏洞描述 Windows XP快速帐号切换功能存在问题,可被造成帐号锁定,使所有非管理员帐号均无法登录。 解释 Windows XP设计了帐号快速切换功能,使用户可快速地在不同的帐号间切换,但其设计存在问题,可被用于造成帐号锁定,使所有非管理员帐号均无法登录。 配合帐号锁定功能,用户可利用帐号快速切换功能,快速重试登录另一个用户名,系统则会认为判别为暴力破解,从而导致非管理员帐号锁定。
电脑配置注册表数据库损坏,该怎么办
电脑出现故障的原因很多,其中有不少是由注册表产生的。一般出现以下症状则可以初步断定为注册表出了问题:(1)运行程序时弹出“找不到*.dll”信息;(2)Windows应用程序出现“找不到服务器上的嵌入对象”或“找不到OLE控件”错误提示;(3)单击某个文档时,Windows XP给出“找不到应用程序打开这种类型的文档”信息;(4)Windows资源管理器中存在没有图标的文件夹、文件或奇怪的图标;(5)菜单、控制面板中的一些项目丢失或处于不可激活状态;(6)网络连接无法建立;(7)工作正常的硬件设备变得不起作用;(8)Windows XP根本无法启动,或仅能从安全模式启动;(9)Windows XP系统显示“注册表损坏”等信息。
此时可采取以下方法修复注册表:
A.在Windows XP下用备份文件还原
如果Windows XP还能启动,只是出现出错提示信息并且有些系统程序不能用,单击“开始”→“所有程序”→“附件”→“系统工具”→“备份”菜单项,调出“备份工具”对话框,然后点击“备份工具”对话框中的“还原与管理媒体”标签,将注册表还原到损坏前的状态。此方法有个前提条件,就是你必须有注册表损坏前的备份文件。
B.用Windows XP的“系统还原”功能还原
和上一方法一样,必须能启动进入Windows XP系统。单击“开始”→“所有程序”→“附件”→“系统工具”→“系统还原”菜单项,调出“系统还原”对话框,选择“恢复我的计算机到一个较早的时间”项,单击“下一步”,选择一个较早的还原点,然后单击“下一步”确认。Windows XP便会重新启动系统,将系统设置还原到指定的时间,并给出恢复完成的提示。如果你的Windows XP的系统还原功能被关闭,可单击“开始”→“控制面板”→“系统”项,并点击“系统还原”标签,去掉“在所有驱动器上关闭系统还原”复选框前面的“√”。
C.使用上次正常启动的注册表配置
如Windows XP无法正常启动,可使用上次正常启动的注册表配置。当电脑通过内存、硬盘自检后,按F8键,进入启动菜单,选择“最后一次正确的配置”项,这样Windows XP就可以正常启动,同时将当前注册表恢复为上次的注册表。这里需要注意的是选择“最后一次正确的配置”,并不能解决由于驱动程序或文件被损坏、丢失所导致的问题。同时,选择“最后一次正确的配置”,Windows XP只还原注册表项HKEY_LOCAL_MACHINE\System\CurrentControlSet中的信息。任何在其他注册表项中所作的更改均保持不变。
D.使用安全模式恢复注册表
如果使用“最后一次正确的配置”项无效,则可以在启动菜单中选择“安全模式”,这样Windows XP可自动修复注册表中的错误,从而使启动能够正常引导下去。引导进入系统后再执行方法1或方法2。
E.使用故障恢复控制台修复损坏后的Windows XP注册表
如果连安全模式都进不去,那么我们就不得不利用Windows XP的恢复控制台来修复系统了。
将Windows XP安装光盘放入光驱中,然后在BIOS中将光驱设为第一启动驱动器。启动电脑进入“欢迎使用安装程序”界面,按“R”键进入Windows XP的“故障恢复控制台”页面,系统会将电脑中的Windows XP系统都列出来,选择需要修复的系统,并键入管理员密码。为了尽可能修复注册表到损坏前的设置和状态,可按以下4步进行操作。
进入故障恢复控制台,新建一个临时文件夹,备份当前的注册表文件到临时文件夹中以备不时之需,然后将当前注册表文件删除,接着将“%SystemRoot%\Repair”目录下文件拷贝到“%SystemRoot%\System\Config”目录下,最后重新启动系统便可进入Windows XP系统。不过恢复此项操作的是Windows XP刚安装完后的注册表,因此,安装完后所做的任何改变和设置都将丢失。具体操作如下(这里假设Windows XP安装在E:\Windows下,具体操作应根据情况改变此文件夹):(1)进入故障恢复控制台
(2)键入以下命令,每键入1行便按回车键1次:
md tmp
copy e:\windows\system32\config\sam e:\windows\tmp\sam.bak
delete e:\windows\system32\config\sam
copy e:\windows\repair\sam e:\windows\system32\config\sam
接着将后3行中的“sam”字符分别替换为“software”、“system”、“security”和“default”,分别键入(即除上述4行命令,还另有12行命令)。这里需要注意的是,熟悉DOS命令的朋友可以将delete语句去除,在进行copy时选择“Yes”;此外这里的copy命令不支持通配符“*”和“?”,一次只能复制一个文件。如果你有另外一台电脑可用,为节省时间也可用记事本新建一个文本文件,并将全部命令拷入,例如将其取名为r1.txt,把它拷贝到Windows目录下,并在故障恢复控制台的Windows目录下运行“batch r1.txt”命令。
(3)键入“exit”退出故障恢复控制台,电脑将自动重新启动,直接以正常模式进入Windows XP系统。
这一步需要从System Volume Information文件夹中拷贝注册表文件,以恢复系统设置,不过此文件夹在故障恢复控制台下不能用,在正常情况下的Windows XP系统中也不可见,因此首先应改变几项设置使得文件夹可见。
(1)重新启动系统,从“安全模式”以管理员组成员(Adiministrators)的身份进入Windows XP系统。
(2)进入资源管理器窗口,点击“工具”→“文件夹选项”,然后点选“查看”标签,在“高级设置”框中的“隐藏文件和文件夹”下点选“显示所有文件和文件夹”项,再清除“隐藏受保护的操作系统文件”前的“√”,最后单击“确定”。
(3)进入Windows XP系统所在驱动器,进入System Volume Information\_restore{E3586CBC-4366-49A4-8B15-8C7E491AB54F}\RPn\snapshot目录(RPn中的“n”为数字,若有多个,选择最大的那个),将该目录中的_REGISTRY_USER_.DEFAULT、_REGISTRY_MACHINE_SECURITY、_REGISTRY_MACHINE_SOFTWARE、_REGISTRY_MACHINE_SYSTEM、_REGISTRY_MACHINE_SAM共5个文件拷贝到Windows\tmp文件夹中,分别将其重命名为default、security、software、system、sam。
在这一步中又要进入故障恢复台,将当前注册表文件删除,然后把刚才拷贝到Windows\tmp中的5个文件,复制到Windows\system32\config文件夹下替代当前注册表文件。具体操作请先进入故障恢复控制台,然后在命令行下输入如下命令:
del e:\windows\system32\config\sam
copy e:\windows\tmp\sam e:\windows\system32\config\sam
同理将“sam”字符分别替换为“software”、“system”、“security”和“default”,分别键入(共10行命令)。
同样的道理也可以用batch命令进行上述操作,另外如果Windows XP不安装在E盘,请根据实际情况更改。
以正常模式进入Windows XP系统,运行“系统还原”工具,将系统还原到所需的还原点。具体操作可以参照前面的方法
怎样修复已经损坏的SQL数据库?
1.停止SQL Server的服务,备份SQL Server安装目录下的\data子目录
下故障数据库的两个文件,一个数据文件hbposv6_branch_data.mdf,
一个hbposv6_branch_log.ldf(也有可能非此命名),同时查看磁盘
空间是否有足够的空间;
2.启动SQL Server服务(如已停止),创建一个新的数据库,命名为
原来数据库的名字。
3.停止SQL Server
4.把老数据库的MDF文件(hbposv6_branch_data.mdf)替换
新数据库的相应的MDF文件,
并把LDF文件(hbposv6_branch_log.ldg)删除。
5.重新启动SQL Server服务,然后运行如下命令:
Use Master
go
sp_configure 'allow updates', 1
reconfigure with override
go
begin tran
update sysdatabases set status = 32768 where name = 'hbposv6_branch'
--Verify one row is updated before committing
commit tran
go
6.停止SQL然后重新启动SQL Server服务,然后运行如下命令
(更换日志文件路径地址):
use master
go
DBCC TRACEON(3604)
DBCC REBUILD_LOG
('hbposv6_branch',
'c:\Program Files\Microsoft SQL Server\MSSQL\Data\hbposv6_branch_log.ldf')
--在这里,请输入你的数据库的路径
go
7.停止SQL然后重新启动SQL Server服务,然后运行:
use master
go
update sysdatabases set status = 8 where name = 'hbposv6_branch'
go
sp_configure 'allow updates', 0
reconfigure with override
go
8.运行dbcc checkdb(db_name) 检查数据库的完整性
9.修复数库
--请在查询分析器中执行下列语句.执行前断开其它
所有数据库连接,最好是断开网线
--如果不是该数据库名,请将数据库
--hbposv6_branch
--改为要修复的数据库
USE master
Go
--单用户模式
EXEC sp_dboption 'hbposv6_branch', 'single user', 'TRUE'
go
--数据库检查
DBCC CHECKDB ('hbposv6_branch')
Go
--如果返回结果出现了红色的提示文字,说明数据库中存在错误,需要修复
--数据库修复
DBCC CHECKDB ('hbposv6_branch','repair_rebuild')
Go
--再次数据库检查,如果返回结果中没有了红色的提示文字,
说明修复成功;
DBCC CHECKDB ('hbposv6_branch')
Go
--否则意味着还需要更高级别的修复;尝试将上面修复语句的
'repair_rebuild'换为'repair_allow_data_loss'再试,
之后再次检查数据库。
--如果还有错误未修复,请把这些信息以文字的方式发给我们
--退出前请一定要执行以下语句返回到多用户模式
EXEC sp_dboption 'hbposv6_branch', 'single user','FALSE'
go
注:都要把 dbname 替换成真实的数据库名字。
怎样修复已经损坏的SQL数据库呢
选择开始菜单中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打开【SQL Server Management Studio】窗口,并使用Windows或 SQL Server身份验证建立连接。在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。执行上述操作后,会弹出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。切换到【文件组】页,在这里可以添加或删除文件组。完成以上操作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。
数据库如何修复
可能有文件缺失或损坏,可以停掉SQL Server服务,先将数据库文件夹复制一份并安全存储,对数据库所在磁盘执行CHKDSK,排除磁盘错误,然后启动SQL Server服务,尝试修复数据库:
1.在SQL Server Management Studio中随便创建一个数据库,例如:PVLink。
2.停止SQL Server服务。
如果不停止此服务,刚才创建的PVLink数据库将即不能被拷贝,也不能被覆盖。
3.把已经损坏的数据库的mdf文件拷贝并覆盖刚才新建的数据库产生的mdf文件。
4.启动SQL Server服务。
此时可以看见刚才创建的PVLink数据库名字后面没有加号,无法察看其任何信息,其实目前它已经处于无法使用的状态。
5.把数据库设置为紧急状态。
通过在“查询分析器”中执行:alter database PVLink set EMERGENCY 可以将数据库设置为紧急状态,此时数据库PVLink的图标改变成粉红色并出现“紧急”字样。
6.将数据库设置为单用户模式。
如果不设置为单用户模式,我们将无法使用带有效repair选项的DBCC CHECKDB来检查/修复数据库,SQL Server 2005设置单用户模式比SQL Server 2000容易,只要在“查询分析器”中执行:
use master
go
sp_dboption 'PVLink',single,true
7.修复数据库
修复数据库主要使用DBCC来操作,一般来讲,我们可以使用以下三个选项来修复:
●REPAIR_ALLOW_ DATA_LOSS
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
●REPAIR_FAST
仅为保持向后兼容性而保留。
●REPAIR_REBUILD
执行由 REPAIR_FAST 执行的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。
一般我们通过执行:DBCC CHECKDB('PVLink',REPAIR_REBUILD) 即可完成修复工作,此时 SQL Server 2005会给出很多提示,因为这个过程可能会导致一些数据库设计或者数据的丢失,并且在这个过程中,会产生新的以ldf为扩展名的数据库日志文件。
8.完成以上的步骤后,一般情况下数据库应该可用了,如果数据库此时仍然是紧急状态,可以通过:alter database PVLink set ONLINE ,把数据库变成在线状态。
检查PVLink数据库内数据是否正常,是的话换回原数据库即可。
怎么修复数据库 修复数据库坏块方法
修复数据库坏块
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时已经进行了坏块标识了,这一步其实可以省略。(不过没有测试过!)
如何在SQL Server 2005中修复损坏的数据库
1. 在SQL Server Management Studio中随便创建一个数据库,例如:PVLink。
2. 停止SQL Server服务。
如果不停止此服务,刚才创建的PVLink数据库将即不能被拷贝,也不能被覆盖。
3. 把已经损坏的数据库的mdf文件拷贝并覆盖刚才新建的数据库产生的mdf文件。
4. 启动SQL Server服务。
此时可以看见刚才创建的PVLink数据库名字后面没有加号,无法察看其任何信息,其实目前它已经处于无法使用的状态。
5. 把数据库设置为紧急状态。
通过在“查询分析器”中执行:alter database PVLink set EMERGENCY 可以将数据库设置为紧急状态,此时数据库PVLink的图标改变成粉红色并出现“紧急”字样。
6. 将数据库设置为单用户模式。
如果不设置为单用户模式,我们将无法使用带有效repair选项的DBCC CHECKDB来检查/修复数据库,SQL Server 2005设置单用户模式比SQL Server 2000容易,只要在“查询分析器”中执行:
use master
go
sp_dboption 'PVLink',single,true
即可。
7. 修复数据库
修复数据库主要使用DBCC来*作,一般来讲,我们可以使用以下三个选项来修复:
REPAIR_ALLOW_ DATA_LOSS
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
REPAIR_FAST
仅为保持向后兼容性而保留。
REPAIR_REBUILD
执行由 REPAIR_FAST 执行的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。
一般我们通过执行:DBCC CHECKDB('PVLink',REPAIR_REBUILD) 即可完成修复工作,此时 SQL Server 2005会给出很多提示,因为这个过程可能会导致一些数据库设计或者数据的丢失,并且在这个过程中,会产生新的以ldf为扩展名的数据库日志文件。
8. 完成以上的步骤后,一般情况下数据库应该可用了,如果数据库此时仍然是紧急状态,可以通过:alter database PVLink set ONLINE ,把数据库变成在线状态。
以上介绍的方法对于通过“附加”的方法无法恢复受到比较严重损坏的数据库比较有效,总的来看,SQL Server 2005给数据库管理和开发提供了更加有效实用的工具和方法。