一、SQLServer2000数据库崩溃后的补救措施
SQL Server 2000数据库崩溃后的补救措施:
案例描述:
SQL Server 2000数据库崩溃后,重装数据库前的准备:
1.三个系统库(master,msdb,model)的完全备份:
2.两个用户数据库(user01,user02)的备份(周日的完全备份+除周日外每天的差异备份):
三个系统数据库是早期备份的,之间没有更新过帐号信息,没有增减过饕档鹊取?
两个用户数据库在上周日晚做过完全备份(user01.bak和user02.bak)
需求:一次性恢复到用户数据库最后一个备份前的状态。
下文中,我们将介绍一下常规的恢复过程:
1.备份可用的数据,包含所有系统数据库和用户数据库的数据文件和日志文件(*.mdf/ldf/ndf)
2.卸载原来的安装
3.系统表查找和删除所有的MSSQLServer项
4.磁盘上删除安装SQL SErver产生的所有文件
5.重新安装SQL Server,所需安装的补丁的版本要求保持与备份系统数据库时安装的补丁版本一致
6.单用户模式下恢复master数据库
7.恢复其他系统数据库
8.恢复用户数据库
此外,我们还可以尝试用下面的方法:
假如你的时间比较充裕,而且想尽量恢复数据到最近的时间点,可以在上述步骤中做以下的尝试:
1.首先,将第6,7两个步骤改为:
a.停止MSSQL服务
b.用步骤1备份的系统数据库的数据文件和日志文件替换安装后生成的系统数据库的对应文件
c.建立与SQL Server系统崩溃之前一样的用户数据库的存放目录,并且把用户数据库文件按原来的位置存放
d.启动MSSQL服务
e.如果MSSQL服务成功,在企业管理看看用户数据库有没有置疑,如果没有置疑,则其他操作都不用做了,数据已经恢复
注意事项:
在具体操作以上的步骤b之前,先备份准备覆盖的文件。
2.如果步骤1的尝试不成功,则再做下面的尝试,把步骤8修改为下面的:
a.停止MSSQL服务
b.用备份的文件还原被覆盖的文件
c.尝试用附加的方式恢复用户数据库
d.如果成功,则修复各用户数据库中的孤立用户
恢复过程会涉及到的一些具体处理 1.恢复系统数据库:
在SQL Server数据库中,系统信息存储在系统数据库中,主要的系统数据库包括:
master-从整体上控制用户数据库和SQL Server操作,在创建了任何用户定义的对象后,都要备份它
model-为新数据库提供模版和原型
msdb-包含了有关作业、报警及操作员等信息
假如包含系统数据库的介质已经改变,则必须重建系统数据库,如果你目前仍然可以启动SQL Server服务,则可以通过RESTORE语句从系统数据库的备份中恢复数据库。
如果master坏了,不能启动系统,可以按照下面步骤进行恢复
(1)重建系统数据库运行c:\mssql7\binn\rebuildm.exe,按照提示进行即可,
过程中需要系统数据库样本的路径,可在安装光盘中找到;
(2)重建系统数据库后,启动SQL Server服务,用系统数据库的备份恢复数据库
就行了通常恢复顺序为master->msdb->model
在恢复master的备份时要注意:必须在单用户(single user)模式下进行
进入单用户模式的方法:
a.在命令行模式下输入:sqlservr-c-f-m或者输入sqlservr-m
其中:-c可以缩短启动时间,SQL Server不作为Windows NT的服务启动
-f用最小配置启动SQL Server
-m单用户模式启动SQL Server
b.可以在控制面板-服务-MSSQLServer的启动参数中输入-c-f-m或者输入-m,点击开始
(3)进行master数据库的恢复
a.直接进入查询分析器,有个提示不要理会它
输入恢复语句进行数据库恢复:
RESTORE DATABASE master from disk='c:\具体的备份文件名'
b.或者用这个,在命令提示符下输入,注意大小写
使用"windows身份验证"的,输入:isql/E
使用"sql server和windows身份验证"的,输入:isql/U"用户名"/P"密码"
然后在出现的提示符下输入(注意1>,2>是提示符):
1>RESTORE DATABASE master from disk='c:\具体的备份文件名'
2>GO
2.还原数据库的具体步骤:
(1)恢复最近一次的完整备份
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中输入还原后的数据库名,设为:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"数据库--完全"
--选项--将"移至物理文件名"中的物理文件名修改为你的数据文件要存放的文件名
--如果要还原的数据库已经存在,选择"在现有数据库上强制还原"
--"恢复完成状态",选择"使数据库不再运行,但能还原其它事务日志"
--确定--或用SQL语句:
RESTORE DATABASE数据库名
FROM DISK='c:\你的完全备份文件名'
WITH NORECOVERY
(2)恢复完全备份后,最近一次的差异备份(如果有的话)
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中选择数据库名:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"数据库--差异"
--"恢复完成状态",选择"使数据库不再运行,但能还原其它事务日志"
--确定
--或用SQL语句:
--或用SQL语句:
RESTORE DATABASE数据库名
FROM DISK='c:\你的差异备份文件名'
WITH NORECOVERY
(3)按时间先后,恢复差异备份后(如果没有差异备份,则是完全备份)的所有日志备份
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中选择数据库名:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"事务日志"
--"恢复完成状态"
如果是恢复最后一个日志文件,选择"使数据库可以继续运行,但无法还原其它事务日志"
否则选择"使数据库不再运行,但能还原其它事务日志"
--确定
--或者使用SQL语句:
RESTORE DATABASE数据库名
FROM DISK='c:\你的日志文件名'
WITH RECOVERY
3.解决孤立用户:
(1)查看某个数据库的孤立用户:
USE库名
EXEC sp_change_users_login'Report'
(2)自动修复某个孤立的用户:
USE库名
EXEC sp_change_users_login'Auto_Fix','孤立用户名', NULL,'密码'
--假如密码指示用户对应的登录不存在时,系统自动建立登录,为登录分配密码。
二、怎么修复已经损坏的SQL数据库
有两种方法,一种方法使用mysql的check table和repair table的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。
前者使用起来比较简便。推荐使用。
1、check table和 repair table登陆mysql终端: mysql-uxxxxx-p dbname check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用: repair table tabTest;进行修复,修复之后可以在用check table命令来进行检查。
在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。
这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。
当发现某个数据表出现问题时可以使用: myisamchk tablename.MYI进行检测,如果需要修复的话,可以使用: myisamchk-of tablename.MYI关于myisamchk的详细参数说明,可以参见它的使用帮助。
需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
2、另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前: [-x/tmp/mysql.sock ]&&/pathtochk/myisamchk-of/DATA_DIR/*/*.MYI。
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的是,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!
最后检测修复所有数据库(表)。
三、如何修复 SQL 数据库置疑
修复sql2000数据库置疑
在实际的操作中由于突然断电或者突然断网造成数据库置疑(在企业管理器中数据库后面出现置疑两个字),下面我们通过以下方法来进行修复置疑的数据库。
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。
B.停掉数据库服务器。
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
use master
go
sp_configure'allow updates',1
go
reconfigure with override
go
F.设置test为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID('test')
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
G.下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
执行过程中,如果遇到下列提示信息:
服务器:消息 5030,级别 16,状态 1,行 1
未能排它地锁定数据库以执行该操作。
DBCC执行完毕。如果 DBCC输出了错误信息,请与系统管理员联系。
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
正确执行完成的提示应该类似于:
警告:数据库'test'的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC执行完毕。如果 DBCC输出了错误信息,请与系统管理员联系。
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
H.验证数据库一致性(可省略)
dbcc checkdb('test')
一般执行结果如下:
CHECKDB发现了 0个分配错误和 0个一致性错误(在数据库'test'中)。
DBCC执行完毕。如果 DBCC输出了错误信息,请与系统管理员联系。
I.设置数据库为正常状态
sp_dboption'test','dbo use only','false'
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成
sp_configure'allow updates',0
go
reconfigure with override
go
非常感谢您的阅读!我们希望本文对于解决您关于SQL数据库修复例子的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。