1.打開查詢分析器,輸入命令
DUMP TRANSACTION 數據庫名 WITH NO_LOG
2.再打開企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了。
清除Log有兩種方法:
1.自動清除法
開放數據庫選項 Trunc Log on Chkpt,使數據庫系統每隔一段時間自動清除Log。此方法的優點是無須人工干預,由SQL Server自動執行,並且一般不會出現Log溢滿的情況;缺點是只清除Log而不做備份。
2.手動清除法
執行命令“dump transaction”來清除Log。以下兩條命令都可以清除日志:
dump transaction with truncate_only
dump transaction with no_log
通常刪除事務日志中不活躍的部分可使用“dump transaction with trancate_only”命令,這條命令寫進事務日志時,還要做必要的並發性檢查。SYBASE提供“dump transaction with no_log”來處理某些非常緊迫的情況,使用這條命令有很大的危險性,SQL Server會彈出一條警告信息。為了盡量確保數據庫的一致性,你應將它作為“最后一招”。
以上兩種方法只??清除日志,而不做日志備份,若想備份日志,應執行“dump transaction database_name to dumpdevice”命令。
PS:附一個更好的方法
先分離數據庫后,直接刪除日志以后,再在查詢分析器里用
exec sp_attach_single_file_db '數據庫名', '.mdf文件路徑'
命令附加數據庫。 OVER.在別的地方看到的 不錯。
數據庫日志操作
先提供一種復雜的方法壓縮日志及數據庫文件如下:
1.清空日志
DUMP TRANSACTION 庫名 WITH NO_LOG
2.截斷事務日志:
BACKUP LOG 數據庫名 WITH NO_LOG
3.收縮數據庫文件(如果不壓縮,數據庫的文件不會減小
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件
--選擇日志文件--在收縮方式里選擇收縮至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.分離
E X E C sp_detach_db @dbname = 'pubs'
b.刪除日志文件
c.再附加
E X E C sp_attach_single_file_db @dbname = 'pubs',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'
5.為了以后能自動收縮,做如下設置:
企業管理器--服務器--右鍵數據庫--屬性--選項--選擇"自動收縮"
--SQL語句設置方式:
E X E C sp_dboption '數據庫名', 'autoshrink', 'TRUE'
6.如果想以后不讓它日志增長得太大
企業管理器--服務器--右鍵數據庫--屬性--事務日志
--將文件增長限制為xM(x是你允許的最大數據文件大小)
--SQL語句的設置方式:
alter database 數據庫名 modify file(name=邏輯文件名,maxsize=20)
特別注意:
請按步驟進行,未進行前面的步驟,請不要做后面的步驟
否則可能損壞你的數據庫.
一般不建議做第4,6兩步
第4步不安全,有可能損壞數據庫或丟失數據
第6步如果日志達到上限,則以后的數據庫處理會失敗,在清理日志后才能恢復.
另外提供一種更簡單的方法,本人屢試不爽,建議大家使用。
更簡單的方法:
1。右建數據庫屬性窗口--故障還原模型--設為簡單
2。右建數據庫所有任務--收縮數據庫
3。右建數據庫屬性窗口--故障還原模型--設為大容量日志記錄
可能有不少朋友遇到過這樣的問題:
update或delete語句忘帶了where子句,或where子句精度不夠,執行之后造成了嚴重的后果,
這種情況的數據恢復只能利用事務日志的備份來進行,所以如果你的SQL沒有進行相應的全庫備份
或不能備份日志(truncate log on checkpoint選項為1),那么就無法進行數據的恢復了,或者
只能恢復到最近一次的備份的數據了。
以下簡單說明恢復數據方法:
1,如果誤操作之前存在一個全庫備份(或已有多個差異備份或增量備份),首先要做的事就是進進行一次日志備份(如果為了不讓日志文件變大而置trunc. log on chkpt.選項為1那你就死翹了)
backup log dbName to disk='fileName'
2,恢復一個全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個恢復
restore database dbName from disk='fileName' with norecovery
3,恢復最后一個日志備份即剛做的日志備份,指定恢復時間點到誤操作之前的時刻
restore log dbName from disk='fileName'
with stopat='date_time'
以上這些操作都可以在SQL SERVER企業管理器里完成,難度不大。。。
日志文件滿而造成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
另外,Truncate log on checkpoint(此選項用於SQL7.0,SQL 2000中即故障恢復模型選擇為簡單模型)當執行CHECKPOINT 命令時如果事務日志文件超過其大小的70% 則將其內容清除在開發數據庫時時常將此選項設置為True Auto shrink定期對數據庫進行檢查當數據庫文件或日志文件的未用空間超過其大小的25%時,系統將會自動縮減文件使其未用空間等於25% 當文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大於或等於其初始大小對事務日志文件的縮減只有在對其作備份時或將Truncate log on checkpoint 選項設為True 時才能進行。
注意:一般立成建立的數據庫默認屬性已設好,但碰到意外情況使數據庫屬性被更改,請用戶清空日志后,檢查數據庫的以上屬性,以防事務日志再次充滿。
當然,如果誤操作是一些不記日志的操作比如truncate table,select into等操作,那么是無法利
用上述方法來恢復數據的...
刪除SQL日志1: 刪除LOG
1:分離數據庫 企業管理器->服務器->數據庫->右鍵->分離數據庫
2:刪除LOG文件
3:附加數據庫 企業管理器->服務器->數據庫->右鍵->附加數據庫
此法生成新的LOG,大小只有520多K
再將此數據庫設置自動收縮
或用代碼:
下面的示例分離 77169database,然后將 77169database 中的一個文件附加到當前服務器。
EXEC sp_detach_db @dbname = '77169database'
EXEC sp_attach_single_file_db @dbname = '77169database',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\77169database.mdf
2:清空日志
DUMP TRANSACTION 庫名 WITH NO_LOG /// DUMP TRANSACTION ulionmis WITH NO_LOG
再:
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
3: 如果想以后不讓它增長
企業管理器->服務器->數據庫->屬性->事務日志->將文件增長限制為2M
自動收縮日志,也可以用下面這條語句
Alter DATABASE 數據庫名
SET AUTO_SHRINK ON
故障還原模型改為簡單,用語句是
USE MASTER
GO
Alter DATABASE 數據庫名 SET RECOVERY SIMPLE
GO
-------------------------------------------------------------------------------
截斷事務日志:
BACKUP LOG { database_name | @database_name_var }
{
[ WITH
{ NO_LOG | TRUNCATE_ONLY } ]
}
--壓縮日志及數據庫文件大小
/*--特別注意
請按步驟進行,未進行前面的步驟,請不要做后面的步驟
否則可能損壞你的數據庫.
--*/
1.清空日志
DUMP TRANSACTION 庫名 WITH NO_LOG
2.截斷事務日志:
BACKUP LOG 數據庫名 WITH NO_LOG
3.收縮數據庫文件(如果不壓縮,數據庫的文件不會減小
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件
--選擇日志文件--在收縮方式里選擇收縮至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
或用代碼:
下面的示例分離 77169database,然后將 77169database 中的一個文件附加到當前服務器。
a.分離
EXEC sp_detach_db @dbname = '77169database'
b.刪除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '77169database',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\77169database.mdf'
5.為了以后能自動收縮,做如下設置:
企業管理器--服務器--右鍵數據庫--屬性--選項--選擇"自動收縮"
--SQL語句設置方式:
EXEC sp_dboption '數據庫名', 'autoshrink', 'TRUE'
6.如果想以后不讓它日志增長得太大
企業管理器--服務器--右鍵數據庫--屬性--事務日志
--將文件增長限制為xM(x是你允許的最大數據文件大小)
--SQL語句的設置方式:
alter database 數據庫名 modify file(name=邏輯文件名,maxsize=20)
-------------------------------------------------------------------------------
/*--壓縮數據庫的通用存儲過程
壓縮日志及數據庫文件大小
因為要對數據庫進行分離處理
所以存儲過程不能創建在被壓縮的數據庫中
--*/
/*--調用示例
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
另外,Truncate log on checkpoint(此選項用於SQL7.0,SQL 2000中即故障恢復模型選擇為簡單模型)當執行CHECKPOINT 命令時如果事務日志文件超過其大小的70% 則將其內容清除在開發數據庫時時常將此選項設置為True Auto shrink定期對數據庫進行檢查當數據庫文件或日志文件的未用空間超過其大小的25%時,系統將會自動縮減文件使其未用空間等於25% 當文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大於或等於其初始大小對事務日志文件的縮減只有在對其作備份時或將Truncate log on checkpoint 選項設為True 時才能進行。
注意:一般立成建立的數據庫默認屬性已設好,但碰到意外情況使數據庫屬性被更改,請用戶清空日志后,檢查數據庫的以上屬性,以防事務日志再次充滿。
如何刪除sql 2000日志
2004年9月24日11:23
前幾天也碰到日志文件過大的問題,數據庫實際大小為600M, 日志文件實際大小為33M, 但日志文件占用空間為2.8G!!!
試了多種方式,SHIRNK DATABASE, TRUNCATE LOG FILE, 都沒辦法將文件縮小。無論如何,這應該算SQL SERVER的一個BUG吧。
后來找到下面的代碼,就可以將日志文件縮小到自己想要的大小了。把代碼COPY到查詢分析器里,,然后修改其中的3個參數(數據庫名,日志文件名,和目標日志文件的大小),運行即可(我已經用過多次了)
-----
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE Marias -- 要操作的數據庫名
Select @LogicalFileName = ‘Marias_log‘, -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 100 -- 你想設定的日志文件的大小(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 has not expired
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
刪除MS SQL Server 2000日志
1.打開MS SQL Server 2000企業管理器
2.打開數據庫,選中需要刪除日期的數據庫,點擊“察看”,選擇“任務板”:
3.鼠標右鍵點中需要刪除日期的數據庫,選擇右鍵菜單“所有任務”-“備份數據庫”:
4.選擇“事務日志”:
5.點擊“添加”,選擇“文件名”:
6.選擇備份目錄,輸入文件名,點擊“確定”:
7.點擊“確定”:
8.選擇“重寫現有媒體”,點擊“確定”:
9.開始備份:
10.備份完成:
事務日志刪除了一部分,如果還不夠小,則再重復一次。
11.重新鼠標右鍵點中需要刪除日志的數據庫,選擇右鍵菜單“所有任務”-“收縮數據庫”:
12.點擊“文件”:
13.選擇日志“數據庫文件”,在“收縮操作”中選擇“從文件結尾截斷可用空間”,點擊“確定”:
14.日志收縮完畢:
關於SQL Server事務日志的問題匯總
1、用BACKUP LOG database WITH NO_LOG清除日志
把數據庫屬性中的故障還原模型改為“簡單”可以大大減慢日志增長的速度。如果把還原模型調到簡單,這樣就不支持時間點還原了,但是日志文件會很小,如果數據比較重要推薦還是把數據庫的還原模型調為完全。
用BACKUP LOG database WITH NO_LOG命名后,會截斷不活動日志,不減小物理日志文件的大小,但邏輯日志會減小,收縮數據庫后會把不活動虛擬日志刪除來釋放空間,不會損壞數據。
如果日志被截斷並收縮數據庫后,就不能直接用最近的一個全庫備份做時間點還原,建議立即備份數據庫,以防萬一。
2、sql server運行中,刪除主數據庫事務日志文件
步驟如下:(1)、分離數據庫:企業管理器--數據庫--右擊你要刪除日志的數據庫--所有任務--分離數據庫
(2)、然后刪除日志文件
(3)、然后再附加數據庫:企業管理器--數據庫--右擊數據庫--所有任務--附加數據庫。這時候只附加mdf就可以了。
3、壓縮SQL數據庫及日志的詳細方法
數據庫在使用一段時間后,時常會出現因數據刪除而造成數據庫中空閑空間太多的情況,這時就需要減少分配給數據庫文件和事務日志文件的磁盤空間,以免浪費磁盤空間。當數據庫中沒有數據時,可以修改數據庫文件屬性直接改變其占用空間,但當數據庫中有數據時,這樣做會破壞數據庫中的數據,因此需要使用壓縮的方式來縮減數據庫空間。可以在數據庫屬性選項中選擇“Auto shrink”選項,讓系統自動壓縮數據庫,也可以用人工的方法來壓縮。人工壓縮數據庫有以下兩種方式:
1)、用Enterprise Manager 壓縮數據庫
在Enterprise Manager 中在所要壓縮的數據庫上單擊右鍵,從快捷菜單中的“所有任務(All Tasks)”中選擇“Shrink Database(壓縮數據庫)”選項,可以在對話框中選擇數據庫的壓縮方式,也可以選擇使用壓縮計划或壓縮單個文件。單擊“Files”按鈕,會出現壓縮數據庫文件對話框,可以針對每個數據庫文件進行不同的壓縮設置。單擊“Change” 按鈕,會出現壓縮計划編輯對話框,可以指定壓縮計划的執行方式。單擊“Change” 按鈕,會出現循環工作計划編輯對話框,可以編輯計划執行的周期或時間點。設置完成后單擊“OK” 按鈕就開始壓縮數據庫,在壓縮結束后會顯示一個壓縮情況信息框。
2)、用Transact-SQL 命令壓縮數據庫
可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE 命令來壓縮數據庫。其中DBCC SHRINKDATABASE 命令對數據庫進行壓縮,DBCC SHRINKFILE 命令對數據庫中指定的文件進行壓縮。
(1)、DBCC SHRINKDATABASE
DBCC SHRINKDATABASE 命令語法如下:
DBCC SHRINKDATABASE (database_name [, target_percent][, {NOTRUNCATE | TRUNCATEONLY}] )
各參數說明如下:
·target_percent 指定將數據庫壓縮后,未使用的空間占數據庫大小的百分之幾。如果指定的百分比過大,超過了壓縮前未使用空間所占的比例,則數據庫不會被壓縮。並且壓縮后的數據庫不能比數據庫初始設定的容量小。
·NOTRUECATE
將數據庫縮減后剩余的空間保留在數據庫,中不返還給操作系統。如果不選擇此選項,則剩余的空間返還給操作系統。
·TRUNCATEONLY
將數據庫縮減后剩余的空間返還給操作系統。使用此命令時SQL Server 將文件縮減到最后一個文件分配,區域但不移動任何數據文件。選擇此項后,target_percent 選項就無效了。
例:壓縮數據庫mytest 的未使用空間為數據庫大小的20%。
dbcc shrinkdatabase (mytest, 20)
運行結果如下:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
(2)、DBCC SHRINKFILE
DBCC SHRINKFILE 命令壓縮當前數據庫中的文件。其語法如下:
DBCC SHRINKFILE ( {file_name | file_id }{ [, target_size] |[, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } )
各參數說明如下:
·file_id
指定要壓縮的文件的鑒別號(Identification number, 即ID)。文件的ID 號可以通過 FILE_ID()函數或如本章前面所講述的Sp_helpdb 系統存儲過程來得到。
·target_size
指定文件壓縮后的大小。以MB 為單位。如果不指定此選項,SQL Server 就會盡最大可能地縮減文件。
·EMPTYFILE
指明此文件不再使用,將移動所有在此文件中的數據到同一文件組中的其它文件中去。執行帶此參數的命令后,此文件就可以用Alter DATABASE 命令來刪除了。
其余參數NOTRUNCATE 和TRUNCATEONLY 與DBCC SHRINKDATABASE 命令中的含義相同。
例: 壓縮數據庫mydb 中的數據庫文件mydb_data2 的大小到1MB。
use mydb dbcc shrinkfile (mydb_data2, 1)
目前的狀況是:MDF文件保存完好(已拷出來),LDF已丟失。使用
EXEC sp_attach_single_file_db @dbname = 'TyBusiness',
@physname = 'E:\Help\TyBusiness.MDF'
報如下錯誤:
未能打開新數據庫 'TyBusiness'。Create DATABASE 將終止。
設備激活錯誤。物理文件名 'd:\Program Files\Microsoft SQL Server\MSSQL\TyBusiness_log.ldf' 可能有誤。
1.先建一個與你要恢復的數據庫名稱一樣的數據庫.
2.停止sql server,把你的數據庫替換這個數據庫
3.重起sql server,把數據庫設成緊急狀態:
sp_configure 'allow',1
reconfigure with overirde
update sysdatabases set status=32768 where name='yourdata'
4.重建日志文件
dbcc rebuild_log('yourdata','your data path\newdata_log.ldf')
5.取消緊急模式
update sysdatabases set status=0 where name='yourdata'
restore sysdatabases yourdata with recovery
sp_configure 'allow',0
reconfigure with override
6.重起sql server
7.ok
減小SQL日志。
use yourdatabasename
GO
backup log yourdatabasename with TRUNCATE_ONLY
GO
DBCC SHRINKFILE (邏輯文件名, 收縮后的大小)
GO
在Query Analyzer中:
1.執行:
EXEC sp_detach_db 'dbname', 'true'; --將你的數據庫卸除
然後將SQL Server安裝路徑下的data目錄中的dbname_log.ldf文件移走或刪除
2.
EXEC sp_attach_single_file_db
'dbname','d:\mssql7\data\dbname.mdf';
--以單文件形式恢復數據庫,系統自動分配給你一個500K大小的日誌文件.
use yourdatabasename
GO
backup log yourdatabasename with TRUNCATE_ONLY
GO
DBCC SHRINKFILE (邏輯文件名, 收縮后的大小)
GO
徹底刪除數據庫日志的方法
現在私服運行了一段時間,特別是人比較多的服,相信大家的數據庫日志log文件已經相當大了吧。其實這些log文件對於我們普通用戶來說是沒什么用,上面只是詳細的記錄了所有對該數據庫的每一步操作,實際的數據已經保存到數據庫文件中了,所以是不可能有什么回檔之類的問題的。以前我們也問過微軟的人,據說是如果你的數據庫文件壞掉了,有這個他們有辦法幫助你恢復數據庫,但是由於方法並不公開,所以對於我們來說,這只是占空間的東西。因為原先沒覺得這個是問題,所以也沒站出來介紹一下,現在看越來越多的朋友問這個問題,就提供一下方法。下面是主題了:
1、進入企業管理器,選中數據庫,比如muonline
2、所有任務->分離數據庫
3、到數據庫文件的存放目錄,將MuOnline_log.LDF文件刪除,你怕S的話可以拷出去
4、企業管理器->附加數據庫,選muonline,這個時候你會看見日志文件這項是一個叉,不要緊繼續,此時數據庫就會提示你該數據庫無日志是否創建一個新的,確定就是了。
5、記得數據庫重新附加后用戶要重新設置一下。
以后如果新的日志文件變大了,再繼續這個步驟就行了
--假設test2為數據庫名稱
在查詢分析器中執行:
backup log MuOnline with NO_LOG
backup log MuOnline with TRUNCATE_ONLY
DBCC SHRINKDATABASE(MuOnline)
將上面的語句多次執行,直到日志文件縮小。
exec sp_dboption MuOnline,autoshrink,on
建立作業,每半個小時一次日志備份,每天一次完全數據庫備份。
在Log收縮到正常大小后,將autoshrink選項設置為off。
查詢分析器里運行:
backup log MuOnlie with NO_LOG
backup log MuOnlie with TRUNCATE_ONLY
DBCC SHRINKDATABASE(MuOnlie)
關於SQL的日志清理命令!大家看看有沒有用吧!
BACKUP LOG MuOnline WITH NO_LOG
DBCC SHRINKDATABASE(MuOnline,10)
這是清理MuOnline日志的 千萬點到MuOnline再選查詢分析器 不然整理了其他數據庫會出錯的
看看這個
關於各種日志暴大的解決辦法(3種)
關於各種日志暴大的解決辦法
要限制sql日志的大小很容易,只要選到那兩個數據庫(muonline和ranking)然后右鍵屬性,在數據文件和事務日志里面就可以改
關鍵是那個joinserver的日志,有時候很正常,一天下來頂多幾十m,有時候1分鍾就能賞到4個G,其實要他不生成那么大的日志很簡單,只要到joinserver的目錄里面把log那個目錄刪除或改名就可以了(我就是這么干的),一點都不影響使用,開joinserver的時候它只會說write log error,對正常使用沒有影響,這樣joinserver目錄就一直是700多k了,哈哈
對於GS和其他的日志,因為都很小,所以就沒改,個人認為其實也可以這么干的
真正解決數據庫日志大的方法
首先在數據庫屬性里把按百分比增長從10%改為1%,這樣就大大限制了增長速度
其次在每次重啟服務器的時候,在查詢器里執行下面的,這樣的方法是我認為最安全也是最簡單的,建議置頂
感覺好用的朋友頂了
backup log MuOnline with NO_LOG
backup log MuOnline with TRUNCATE_ONLY
DBCC SHRINKDATABASE(MuOnline)
解決數據庫日志大的方法
、進入企業管理器,選中數據庫,比如muonline
2、所有任務->分離數據庫
3、到數據庫文件的存放目錄,將MuOnline_log.LDF文件刪除,你怕S的話可以拷出去
4、企業管理器->附加數據庫,選muonline,這個時候你會看見日志文件這項是一個叉,不要緊繼續,此時數據庫就會提示你該數據庫無日志是否創建一個新的,確定就是了。
5、記得數據庫重新附加后用戶要重新設置一下
[推薦]數據庫自動備份、縮小以及防止回檔
不要在屬性里限制數據庫大小,這樣文件容量滿的時候會出現回檔
建立作業,每天自動備份數據庫,自動刪除2天前的備份
建立作業,每天運行一次以下代碼,縮小日志文件
backup log MuOnline with NO_LOG
backup log MuOnline with TRUNCATE_ONLY
DBCC SHRINKDATABASE(MuOnline)
我就是這么做的,什么問題都沒有,MU服務端全部用到的空間頂多2個G
日志可以這樣減肥!!
右擊MuOnline,所有任務,分離數據庫
然后到D:\Muserver\db 把那個.log文件刪掉
你會發現MuOnline數據庫消失了
右擊一下,所有任務,點 附加數據庫
路徑指向D:\Muserver\db 選中里面的.mdf
你會發現日志有個大叉叉
不管它,直接點確定。
系統提示找不到日志,要不要新建一個
新建一個就Ok了。
這樣減肥效果不錯吧。
解決方法
日志文件滿而造成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
另外,如上圖中數據庫屬性有兩個選項,與事務日志的增長有關:
Truncate log on checkpoint(此選項用於SQL7.0,SQL 2000中即故障恢復模型選擇為簡單模型)當執行CHECKPOINT 命令時如果事務日志文件超過其大小的70% 則將其內容清除在開發數據庫時時常將此選項設置為True Auto shrink定期對數據庫進行檢查當數據庫文件或日志文件的未用空間超過其大小的25%時,系統將會自動縮減文件使其未用空間等於25% 當文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大於或等於其初始大小對事務日志文件的縮減只有在對其作備份時或將Truncate log on checkpoint 選項設為True 時才能進行。
注意:一般立成建立的數據庫默認屬性已設好,但碰到意外情況使數據庫屬性被更改,請用戶清空日志后,檢查數據庫的以上屬性,以防事務日志再次充滿。
減少SQL日志的方法
--------------------------------------------------------------------------------
一:
分享]解決SQL日志增大的辦*[望置頂]
--假設test2為數據庫名稱
在查詢分析器中執行:
backup log MuOnline with NO_LOG
backup log MuOnline with TRUNCATE_ONLY
DBCC SHRINKDATABASE(MuOnline)
將上面的語句多次執行,直到日志文件縮小。
exec sp_dboption 'MuOnline','autoshrink','on'
建立作業,每半個小時一次日志備份,每天一次完全數據庫備份。
在Log收縮到正常大小后,將autoshrink選項設置為off。
二:
數據庫增大是因為你的日志增大了,以前大家討論過的,最簡單可行的辦法就是在你數據庫屬性->選項->故障還原里面選成簡單模式(缺省為完全模式),然后選收縮數據庫進行一次收縮,以后你的數據庫基本就不怎么會增長了
三:
1、進入企業管理器,選中數據庫,比如muonline
2、所有任務->分離數據庫
3、到數據庫文件的存放目錄,將MuOnline_log.LDF文件刪除,你怕S的話可以拷出去
4、企業管理器->附加數據庫,選muonline,這個時候你會看見日志文件這項是一個叉,不要緊繼續,此時數據庫就會提示你該數據庫無日志是否創建一個新的,確定就是了。
5、記得數據庫重新附加后用戶要重新設置一下。