我是在sql server2008运行的,报错信息:
消息 9002,级别 17,状态 4,第 1 行
数据库 '2010-5' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。在解决过程中遇到的问题有几个,请教下大侠,谢谢:
1、在网上搜了很多解决事务日志满的网页,发现清空日志的语句
DUMP TRANSACTION  "2010-5"  WITH NO_LOG
在sql server 2008里面报错:
消息156,级别15,状态1,第1 行
关键字'TRANSACTION' 附近有语法错误。是不是这个语句在sql server2008用不了?界面清空日志操作步骤是怎么样呢?2、网上很多提到收缩数据库,限制文件自动增长等等,如果日志文件达到了这个最大值,不是照样报错,这样的操作有什么实际意义呢?还有就是提到增大空间留给放日志文件等等,问题是打个比方我的硬盘空间是20G,日志文件设置为10G,意思是日志文件不能再大了,我也没有其他空间腾出来放了,我也不想备份,就想保留近段时间的日志文件就好了,这样我该怎么办?

解决方案 »

  1.   

    SQL Server 2008 先备份日志将日志截断.
    再用dbcc shrinkfile(日志文件,1024)收缩日志文件。
      

  2.   

    虽然没做过,我估计应该跟原来方法一样。
    --最好备份日志,以后可通过日志恢复数据
    以下为日志处理方法
    一般不建议做第4,6两步
    第4步不安全,有可能损坏数据库或丢失数据
    第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
    --*/--下面的所有库名都指你要处理的数据库的库名1.清空日志
    DUMP TRANSACTION 库名 WITH NO_LOG2.截断事务日志:
    BACKUP LOG 库名 WITH NO_LOG3.收缩数据库文件(如果不压缩,数据库的文件不会减小
    企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
    --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
    --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了也可以用SQL语句来完成 
    --收缩数据库
    DBCC SHRINKDATABASE(库名)--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
    DBCC SHRINKFILE(1)4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
    a.分离数据库:
    企业管理器--服务器--数据库--右键--分离数据库b.在我的电脑中删除LOG文件c.附加数据库:
    企业管理器--服务器--数据库--右键--附加数据库此法将生成新的LOG,大小只有500多K或用代码: 
    下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。a.分离
    EXEC sp_detach_db @dbname = '库名'b.删除日志文件c.再附加
    EXEC sp_attach_single_file_db @dbname = '库名', 
    @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf'5.为了以后能自动收缩,做如下设置:
    企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"--SQL语句设置方式:
    EXEC sp_dboption '库名', 'autoshrink', 'TRUE'6.如果想以后不让它日志增长得太大
    企业管理器--服务器--右键数据库--属性--事务日志
    --将文件增长限制为xM(x是你允许的最大数据文件大小)--SQL语句的设置方式:
    alter database 库名 modify file(name=逻辑文件名,maxsize=20)
      

  3.   

    SQL Server 2008  不能使用以下:
    1.清空日志
    DUMP TRANSACTION 库名 WITH NO_LOG
    2.截断事务日志:
    BACKUP LOG 库名 WITH NO_LOG只能采用正常的备份来截断日志.
      

  4.   

    在 sql server 2008 中截断日志,
    是将数据库切换到 simple 恢复模式(alter database dbname set recovery simple),
    再将数据库切换回原来的恢复模式(alter database dbname set recovery full)。如果不需要日志备份,可以直接将数据库设置为 simple 恢复模式。这样可以由 sql server 自动截断日志。
      

  5.   

    谢谢 请问下楼上大虾
    1,由 sql server2008 自动截断日志     一般保留多少时间的内容?一天?两天么?2、如果不需要日志备份,可以直接将数据库设置为 simple 恢复模式是不是如果不备份日志,每次日志满了,只是需要一个操作 alter database dbname set recovery simple 就行了?
      

  6.   

    在 simple 恢复模式下,SQL SERVER 在自动生成检查点(checkpoint)的同时也进行日志截断。SQL Server 有以下几种生成检查点的方式:checkpoint 语句;使用 ALTER DATABASE 更改数据库选项时;停止 SQL Server 服务时;SQL SERVER 自动执行检查点时。
    最后一条, SQL SERVER 会根据日志中的记录数自动调整生成检查点的时间间隔,当数据库被频繁修改时生成检查点的时间间隔就很短,反之则很长。具体机制有点复杂,需要理解事务日志机制、 checkpoint 机制、数据库恢复机制、recovery interval 服务器选项等等。lz 可以研究一下 inside sql server 中关于事务日志的论述。简单来说,在 simple 恢复模式下,每当日志中的记录数满足下面两个条件中的一个就生成自动检查点: 日志的 70% 已满;日志中的记录数达到 SQL SERVER 估计在 recovery interval 选项指定的时间内能处理的记录数。
      

  7.   

    谢谢  按照楼上的方案执行  alter database dbname set recovery simple 日志文件大小没有变化的捏,具体是进行怎么操作?请指教,谢谢
      

  8.   

    这个只是截断日志。如果要缩小日志文件,还需要收缩日志文件(DBCC SHRINKFILE),这个前几楼不是说了吗?SQL Server 的日志文件空间是可以循环使用的,截断日志就是清空日志空间(但这部分空间不会返回给文件系统),让 SQL Server 可以重新使用这部分空间(从而不会向文件系统请求新的存储空间,不会增大日志文件)。
      

  9.   

    LZ要知道一个东西:截断、备份日志文件 只是逻辑上让日志文件空间能重用 但是不能减少实际的物理占用空间 
    你要使用DBCC SHRINKFILE 命令收缩文件~