• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

SQL错误823,数据库日志清除不了。备份也备份不了。。。

言士心 2007-12-08 12:06:22
SQL错误823,数据库日志清除不了。备份也备份不了。。。


先清除POSTEK数据库的时候 显示
服务器:消息823,级别24。状态 2行 4
连接中断


后来想用企业管理器备份下POSTEK数据库 出现了

错误823 严重度 24状态 2
I/O ERROR 23(数据错误(循环冗余检查))detaeted dumring read at affset 0X00000001 466-a000 in file` E:\porgram files\microsfot SQL Server\MSSQL\postek_new_dat.mdf


没办法 后来 想把 postek_new_dat.mdf和LOG 日志文件 在SQL 停止状态下 COPY 出来。。 结果COPY 了 10几分钟 时间越来越长 还是 I/0冗余。。COPY 不出来。。。 怎么办啊


救命啊
...全文
1282 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mewlost 2012-08-11
DATA 数据所在的硬盘磁盘比如D:盘 右键工具检查磁盘错误 检查完 .MDF就可以COPY了
回复
ljm2500005 2008-09-04
有所收获
回复
xiaoxiezi168 2008-09-03
JF
回复
胡矣 2008-09-03
接分
回复
UltraBejing 2008-05-01
我也想知道,正在找這方面的資料~~~~~
回复
这个简单啊,网上搜一下就得到答案了.
回复
meiZiNick 2008-05-01
等待牛人来答.
回复
pccastle 2008-04-27
再接
回复
pccastle 2008-04-27
不错
回复
jf
回复
ghd2004 2007-12-20
清除SQL数据库日志文件
/*--压缩数据库的通用存储过程

有两种方法 一是压缩日志,二是删除日志。

一、压缩日志及数据库文件大小
因为要对数据库进行分离处理
所以存储过程不能创建在被压缩的数据库中
/*--调用示例
exec p_compdb 'test'
--*/

use master --注意,此存储过程要建在master数据库中
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_compdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_compdb]
GO

create proc p_compdb
@dbname sysname, --要压缩的数据库名
@bkdatabase bit=1, --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库
@bkfname nvarchar(260)='' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间
as
--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')

--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')

--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')

--4.设置自动收缩
exec('EXEC sp_dboption '''+@dbname+''',''autoshrink'',''TRUE''')

--后面的步骤有一定危险,你可以可以选择是否应该这些步骤
--5.分离数据库
if @bkdatabase=1
begin
if isnull(@bkfname,'')=''
set @bkfname=@dbname+'_'+convert(varchar,getdate(),112)
+replace(convert(varchar,getdate(),108),':','')
select 提示信息='备份数据库到SQL 默认备份目录,备份文件名:'+@bkfname
exec('backup database ['+@dbname+'] to disk='''+@bkfname+'''')
end

--进行分离处理
create table #t(fname nvarchar(260),type int)
exec('insert into #t select filename,type=status&0x40 from ['+@dbname+']..sysfiles')
exec('sp_detach_db '''+@dbname+'''')

--删除日志文件
declare @fname nvarchar(260),@s varchar(8000)
declare tb cursor local for select fname from #t where type=64
open tb
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s='del "'+rtrim(@fname)+'"'
exec master..xp_cmdshell @s,no_output
fetch next from tb into @fname
end
close tb
deallocate tb

--附加数据库
set @s=''
declare tb cursor local for select fname from #t where type=0
open tb
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s=@s+','''+rtrim(@fname)+''''
fetch next from tb into @fname
end
close tb
deallocate tb
exec('sp_attach_single_file_db '''+@dbname+''''+@s)
go



二、删除数据库日志也有两种方法
日志文件满而造成SQL数据库无法写入文件时,可用两种方法:
一种方法:清空日志。
1.打开查询分析器,输入命令
DUMP TRANSACTION 数据库名 WITH NO_LOG
2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--

在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了


另一种方法有一定的风险性,因为SQL SERVER的日志文件不是即时写入数据库主文件的,如处理不当

,会造成数据的损失。
1: 删除LOG
分离数据库 企业管理器->服务器->数据库->右键->分离数据库
2:删除LOG文件
附加数据库 企业管理器->服务器->数据库->右键->附加数据库
此法生成新的LOG,大小只有500多K。
注意:建议使用第一种方法。
如果以后,不想要它变大。
SQL2000下使用:
在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。
或用SQL语句:
alter database 数据库名 set recovery simple
回复
-狙击手- 2007-12-09
dbcc checkdb ('数据库名', REPAIR_ALLOW_DATA_LOSS)
回复
dawugui 2007-12-09
清除日志:


DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE szwzcheck -- 要操作的数据库名
SELECT @LogicalFileName = 'szwzcheck_Log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 20 -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name =
@LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。
有全角的空格(为了显示好看),你自己把他换一下.


收缩日志:

企业管理器--所有任务--收缩数据库--文件--选日志文件收缩
回复
中国风 2007-12-08
给个通过日志恢复列子:
USE master

--创建数据库
CREATE DATABASE db
ON PRIMARY(
NAME='db_data',
FILENAME= 'c:\db_data.mdf')
LOG ON(
NAME='db_log',
FILENAME ='c:\db.ldf')
GO

--创建表
CREATE TABLE db.dbo.ta(id int)
INSERT db.dbo.ta SELECT id FROM sysobjects
GO
--做文件组备份
BACKUP DATABASE db TO DISK='c:\db.bak' WITH FORMAT

--备份后,再做数据处理
CREATE TABLE db.dbo.tb(id int)
INSERT db.dbo.tb SELECT id FROM sysobjects
GO

/*--下面演示了破坏数据文件的处理,这些操作在操作系统中进行

1. 停止SQL Server服务(msqlserver服务)
2. 删除文件 c:\db_data.ndf (模拟破坏)
3. 重新SQL Server服务,此时数据库DB置疑
--*/
GO

--下面演示了如何恢复数据
--首先要备份当前日志
BACKUP LOG db TO DISK='c:\db_log.bak' WITH FORMAT,NO_TRUNCATE
--利用文件组备份恢复破坏的文件
RESTORE DATABASE db FROM DISK='c:\db.bak' WITH NORECOVERY
--还原到日志点
RESTORE LOG db FROM DISK='c:\db_log.bak' WITH RECOVERY
--显示已经恢复的数据
SELECT COUNT(*) FROM db.dbo.ta
SELECT COUNT(*) FROM db.dbo.tb
GO

--删除测试
DROP DATABASE db
回复
言士心 2007-12-08
但是 日志文件是好的啊 LOG 50M 一下就COPY 出来了 就是MDF文件 根本COPY 不动。。。
回复
fa_ge 2007-12-08


先停止sql服务

exec sp_detach_db @dbname='book'

--重建日志
exec sp_attach_single_file_db @dbname='book',
@physname='D:\Program Files\Microsoft SQL Server\MSSQL\Data\book_Data.MDF'
回复
OracleRoob 2007-12-08
用dbcc checkdb检查一下数据库中是否存在分配错误和一致性错误。

如果存在,先修复这些错误。

dbcc checkdb ('数据库名', REPAIR_ALLOW_DATA_LOSS)
回复
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2007-12-08 12:06
社区公告
暂无公告