在查詢分析器中順序執行以下三步,其中 databasename 為你的數據庫文件名
1.清空日志:DUMP TRANSACTION databasename WITH NO_LOG
2.截斷事務日志:BACKUP LOG databasename WITH NO_LOG
3.收縮數據庫:DBCC SHRINKDATABASE(databasename)
--//////////////////////////////////////////////////////////////////
SQL Server日志清空方法
一種方法:清空日志。
1.打開查詢分析器,輸入命令 DUMP TRANSACTION 數據庫名 WITH NO_LOG
2.再打開企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了。
方法二:
清空日志:
------------------------------------------
BACKUP LOG 庫名 WITH NO_LOG
DBCC SHRINKFILE( '日志文件名 ',新的大小數值型如1)
日志文件名是這樣的:
select name from sysfiles
如:
mastlog
---------------------------------------------
backup log DATABASENAME
with truncate_only
dbcc shrinkdatabase (DATABASENAME,SIZE)
若每天有whole back up 的話可以設置一job,
每隔三天或一個星期清空一次
這樣的話日志就不會長大了哦
-------------------------------------
1: 刪除LOG
1:分離數據庫
2:刪除LOG文件
3:附加數據庫
此法生成新的LOG,大小只有500多K
再將此數據庫設置自動收縮
2:清空日志
DUMP TRANSACTION 庫名 WITH NO_LOG
再:
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
方法三:
第一步:
backup log database_name with no_log
或者 backup log database_name with truncate_only --no_log和truncate_only是在這里是同義的,隨便執行哪一句都可以
第二步:
1.收縮特定數據庫的所有數據和日志文件,執行 dbcc shrinkdatabase (database_name,[,target_percent])--database_name是要收縮的數據庫名稱;target_percent是數據庫收縮后的數據庫文件中所要的剩余可用空間百分比
2.收縮一次一個特定數據庫中的數據或日志文件,執行 dbcc shrinkfile(file_id,[,target_size]) --file_id是要收縮的文件的標識 (ID) 號,若要獲得文件 ID,請使用 FILE_ID 函數或在當前數據庫中搜索 sysfiles;target_size是用兆字節表示的所要的文件大小(用整數表示)。如果沒有指定,dbcc shrinkfile 將文件大小減少到默認文件大小
兩個dbcc都可以帶上參數notruncate或truncateonly,具體意思看幫助。
方法四:
(這個方法在sqlserver2000的環境下做一般能成功,在sqlserver7及以下版本就不一定了):
第一步:
先備份整個數據庫以備不測
第二步:
備份結束后,在Query Analyzer中執行如下的語句:
exec sp_detach_db yourDBName,true --卸除這個DB在MSSQL中的注冊信息
第三步:
到日志的物理文件所在的目錄中去刪除該日志文件或者將該日志文件移出該目錄
第四步:
在Query Analyzer中執行如下的語句:
exec sp_attach_single_file_db yourDBName, 'd:/mssql7/data/yourDBName_data.mdf '
--以單文件的方式注冊該DB,如果成功則MSSQL將自動為這個DB生成一個500K的日志文件。
以上方法在清除log日志中均有效。
但,能否讓sql server 不產生log日志呢?以上方法好像均無效。
我這兒正好有個case:
我客戶的sql server每天都會產生4,500M的log日志,每天都清除一下,非常不便。有沒有辦法實現不產生log日志呢?
我分析了一下客戶產生log日志的原因,並且做了相應測試。
客戶是每天將數據庫清空,從總系統中將數據導入到sql server里。我感決sqlserver在插入時產生log不大,在delete整個庫時產生log極大。
比如:
SELECT * into test_2 from b_bgxx
共45000條記錄,產生十幾M log,如果
delete from test_2
產生80多M log ,這明顯存在問題。
雖然可以換成:
truncate table test_2
1.清空日志:DUMP TRANSACTION databasename WITH NO_LOG
2.截斷事務日志:BACKUP LOG databasename WITH NO_LOG
3.收縮數據庫:DBCC SHRINKDATABASE(databasename)
--//////////////////////////////////////////////////////////////////
SQL Server日志清空方法
一種方法:清空日志。
1.打開查詢分析器,輸入命令 DUMP TRANSACTION 數據庫名 WITH NO_LOG
2.再打開企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了。
方法二:
清空日志:
------------------------------------------
BACKUP LOG 庫名 WITH NO_LOG
DBCC SHRINKFILE( '日志文件名 ',新的大小數值型如1)
日志文件名是這樣的:
select name from sysfiles
如:
mastlog
---------------------------------------------
backup log DATABASENAME
with truncate_only
dbcc shrinkdatabase (DATABASENAME,SIZE)
若每天有whole back up 的話可以設置一job,
每隔三天或一個星期清空一次
這樣的話日志就不會長大了哦
-------------------------------------
1: 刪除LOG
1:分離數據庫
2:刪除LOG文件
3:附加數據庫
此法生成新的LOG,大小只有500多K
再將此數據庫設置自動收縮
2:清空日志
DUMP TRANSACTION 庫名 WITH NO_LOG
再:
企業管理器--右鍵你要壓縮的數據庫--所有任務--收縮數據庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了
方法三:
第一步:
backup log database_name with no_log
或者 backup log database_name with truncate_only --no_log和truncate_only是在這里是同義的,隨便執行哪一句都可以
第二步:
1.收縮特定數據庫的所有數據和日志文件,執行 dbcc shrinkdatabase (database_name,[,target_percent])--database_name是要收縮的數據庫名稱;target_percent是數據庫收縮后的數據庫文件中所要的剩余可用空間百分比
2.收縮一次一個特定數據庫中的數據或日志文件,執行 dbcc shrinkfile(file_id,[,target_size]) --file_id是要收縮的文件的標識 (ID) 號,若要獲得文件 ID,請使用 FILE_ID 函數或在當前數據庫中搜索 sysfiles;target_size是用兆字節表示的所要的文件大小(用整數表示)。如果沒有指定,dbcc shrinkfile 將文件大小減少到默認文件大小
兩個dbcc都可以帶上參數notruncate或truncateonly,具體意思看幫助。
方法四:
(這個方法在sqlserver2000的環境下做一般能成功,在sqlserver7及以下版本就不一定了):
第一步:
先備份整個數據庫以備不測
第二步:
備份結束后,在Query Analyzer中執行如下的語句:
exec sp_detach_db yourDBName,true --卸除這個DB在MSSQL中的注冊信息
第三步:
到日志的物理文件所在的目錄中去刪除該日志文件或者將該日志文件移出該目錄
第四步:
在Query Analyzer中執行如下的語句:
exec sp_attach_single_file_db yourDBName, 'd:/mssql7/data/yourDBName_data.mdf '
--以單文件的方式注冊該DB,如果成功則MSSQL將自動為這個DB生成一個500K的日志文件。
以上方法在清除log日志中均有效。
但,能否讓sql server 不產生log日志呢?以上方法好像均無效。
我這兒正好有個case:
我客戶的sql server每天都會產生4,500M的log日志,每天都清除一下,非常不便。有沒有辦法實現不產生log日志呢?
我分析了一下客戶產生log日志的原因,並且做了相應測試。
客戶是每天將數據庫清空,從總系統中將數據導入到sql server里。我感決sqlserver在插入時產生log不大,在delete整個庫時產生log極大。
比如:
SELECT * into test_2 from b_bgxx
共45000條記錄,產生十幾M log,如果
delete from test_2
產生80多M log ,這明顯存在問題。
雖然可以換成:
truncate table test_2
近來發現數據庫過大,空間不足,因此打算將數據庫的數據進行全面的清理,但表非常多,一張一張的清空,實在麻煩,因此就想利用SQL語句一次清空所有數據.找到了三種方法進行清空.使用的數據庫為MS SQL SERVER.
1.搜索出所有表名,構造為一條SQL語句
declare
@trun_name
varchar
(
8000
)
set
@trun_name
=
''
select
@trun_name
=
@trun_name
+
'
truncate table
'
+
[
name
]
+
'
'
from
sysobjects
where
xtype
=
'
U
'
and
status
>
0
exec
(
@trun_name
)
該方法適合表不是非常多的情況,否則表數量過多,超過字符串的長度,不能進行完全清理.
2.利用游標清理所有表
declare
@trun_name
varchar
(
50
)
declare
name_cursor
cursor
for
select
'
truncate table
'
+
name
from
sysobjects
where
xtype
=
'
U
'
and
status
>
0
open
name_cursor
fetch
next
from
name_cursor
into
@trun_name
while
@@FETCH_STATUS
=
0
begin
exec
(
@trun_name
)
print
'
truncated table
'
+
@trun_name
fetch
next
from
name_cursor
into
@trun_name
end
close
name_cursor
deallocate
name_cursor
這是我自己構造的,可以做為存儲過程調用, 能夠一次清空所有表的數據,並且還可以進行有選擇的清空表.
3.利用微軟未公開的存儲過程
exec
sp_msforeachtable "
truncate
table
?"
該方法可以一次清空所有表,但不能加過濾條件.
