熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

如何修復SQLSERVER 數據庫置疑問題

2013-11-15 14:43:41  來源: SQL Server 

  你可以看到在SQLSERVER 的ERROR LOG 和OS的應用程序日志中應該有的錯誤信息:
  
  SQL Server事務日志可能會被填滿這會阻止之後的數據庫操作包括UPDATE DELETE INSERT 和CHECKPOINT
  事務日志填滿會導致錯誤:
  Cant allocate space for object syslogs in database dbname because
  the logsegment is full If you ran out of space in syslogs dump
  the transaction log Otherwise use ALTER DATABASE or
  sp_extendsegment to increase the size of the segment
  
  這種現象可能出現於任何一個數據庫中包括Master和TempDB一些難以預見的因素可能消耗日志空間 例如:
  一個大型事務 尤其像批量數據更新插入或刪除
  一個未提交的事務
  檢查點處理程序截除時所需的帶寬過大
  截除時超過阈值
  上述各種條件互相作用的結果
  用於發布的標記事務沒有被日志讀取程序讀走
  
  下面是修復的步驟和收縮日志的步驟:
  
  在命令提示符下運行以下命令啟動 SQL Server
  SQLSERVER f m
  
  備注m 開關以單用戶模式啟動 SQL Server在單用戶模式下只能成功建立一個連接 請注意是否有任何其他客戶機或服務可能會在您通過 SQL Server 查詢分析器  建立連接前使用那個連接
  
   重置置疑數據庫的狀態
  sp_resetstatus database_name
  
  下面是結果集
  
  Databasedatabase_namestatus reset!
  WARNING: You must reboot SQL Server prior to accessing this database!
  
   用 ALTER DATABASE 向數據庫添加一個數據文件或日志文件:
  USE master
  GO
  CREATE DATABASE db_name ON
  (
  NAME = dbname_dat
  FILENAME = D:\MSSQL\Data\dbname_datndf
  SIZE = MB
  FILEGROWTH = MB
  )
  GO
  更改該數據庫以添加一個 GB 大小的新數據文件
  ALTER DATABASE db_name
  ADD FILE
  (
  NAME = dbname_dat
  FILENAME = F:\MSSQL\DATA\dbname_datndf
  SIZE = MB
  FILEGROWTH = MB
  )
  GO
  更改該數據庫以添加一個GB 大小的新日志文件
  ALTER DATABASE db_name
  ADD LOG FILE
  ( NAME = db_name_log
  FILENAME = F:\MSSQL\Data\db_name_logldf
  SIZE = MB
  FILEGROWTH = MB)
  GO
  
   停止並重新啟動 SQL Server:
  用新的數據文件或日志文件所提供的額外空間SQL Server 應該能完成數據庫的恢復
  
   釋放磁盤空間並且重新運行恢復操作按照下面的步驟收縮日志
  sp_resetstatus 關閉數據庫的置疑標志但是原封不動地保持數據庫的其它選項
  
  為從根本上解決這樣的問題你可以按下面的操作配置SQLSERVER :
  a如果不需要恢復到指定的時間點你可以將數據庫的恢復模式配置為簡單這樣
  UPDATEDELETESELECT就不會記錄日志日志就不會增加的很大:
  
  USE MASTER
  
  GO
  ALTER DATABASE DB_NAME SET RECOVERY SIMPLE
  b如果你的恢復模式是全部你一定要配置日志字段收縮:
  
  USE MASTER
  
  GO
  sp_dboption databasenametrunc log on chkpttrue
  sp_dboption databasenameautoshrinktrue
  c通過每日備份將日志收縮:
  BACKUP DATABASE DATABASE_NAME TO BACKUP_DEVICES
  BACKUP LOG DATABASE_NAME TO LOG_DEVICES
  OR
  BACKUP LOG DATABASE_NAME with truncate_only
  
  **檢查日志的容量:DBCC SQLPERF (LOGSPACE) 這時日志並沒有收縮!
  
  d每天在備份數據庫完成之後重新啟動MS SQLSERVER SERVICE
  USE DATABASE_NAME
  go
  DBCC SHRINKFILE(truncateonly)
  
  **檢查日志的容量:DBCC SQLPERF (LOGSPACE) 這時日志已經收縮!
  
  e手動快速收縮日志:
  / *run below scriptyou will shrink you database log files
  immediately in my experienceyou need to run the script for  or
   minutes before stopping it manually */
  use databasename
  dbcc shrinkfile(notruncate)
  dbcc shrinkfile(truncateonly)
  create table t(char char())
  go
  declare @i int
  select @i=
  while(=)
  begin
  while(@i<100)
  begin
  INSERT INTO T1 VALUES ('A')
  SELECT @I=@I+1
  END
  TRUNCATE table T1
  BACKUP LOG youdatabasename with truncate_only
  end
  GO
  
  注意 只有在您的主要支持提供者指導下或有疑難解答建議的做法時,才可以使用
  sp_resetstatus。Tw.WiNgwIt.CoM否則,可能會損壞數據庫。
  
  由於該過程修改了系統表,系統管理員必須在運行 sp_resetstatus這個過程前,啟用系統表更新。要
  啟 用更新,使用下面的過程:
  
  USE master
  GO
  sp_configure 'allow updates', 1
  GO
  RECONFIGURE WITH OVERRIDE
  GO
  過程創建後,立即禁用系統表更新:
  
  sp_configure 'allow updates', 0
  GO
  RECONFIGURE WITH OVERRIDE
  GO
  只有系統管理員才能執行 sp_resetstatus。執行該過程後,立即關閉 SQL Server

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22242.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.