Shrink logfiles mit cursor

29/01/2009 - 11:11 von rk10059 | Report spam
Hallo Newsgroup

Da unsere Logfiles immer größer werden, möchte ich diese mit "dbcc
shrinkfile"
verkleinern.
Um das nicht für jede Datenbank einzeln machen zu müssen, möchte ich
in einer
Schleife und "use DB" jede Datenbank durchlaufen.
Das Durchlaufen der DBŽs funktioniert zwar, aber es wird immer nur das
selbe Logfile geshrinkt,
dh. die Variable "@LogName" àndert sich nicht mit den @DBName .


Herzlichen Dank für Eure Hilfe!
Kiepetz Rudolf

Mein SQL-Statement:
declare @DBName varchar(300)
declare dbcursor cursor for
select name from master..sysdatabases where sid!=0x01
open dbcursor
fetch next from dbcursor into @DBName
while (@@fetch_status <> -1) begin
exec ('use [' + @DBName + ']')
declare @LogName varchar(300)
SET @LogName=(select name from dbo.sysfiles1 where fileid=2)
print @DBName
print @LogName
fetch next from dbcursor into @dbname
end
deallocate dbcursor
 

Lesen sie die antworten

#1 Christa Kurschat
29/01/2009 - 11:33 | Warnen spam
Hallo Rudolf,

rk10059 schrieb:

Hallo Newsgroup

Da unsere Logfiles immer größer werden, möchte ich diese mit
"dbcc shrinkfile"
verkleinern.
Um das nicht für jede Datenbank einzeln machen zu müssen,
möchte ich in einer
Schleife und "use DB" jede Datenbank durchlaufen.
Das Durchlaufen der DBŽs funktioniert zwar, aber es wird immer
nur das selbe Logfile geshrinkt,
dh. die Variable "@LogName" àndert sich nicht mit den @DBName
.


Herzlichen Dank für Eure Hilfe!
Kiepetz Rudolf

Mein SQL-Statement:
declare @DBName varchar(300)
declare dbcursor cursor for
select name from master..sysdatabases where sid!=0x01
open dbcursor
fetch next from dbcursor into @DBName
while (@@fetch_status <> -1) begin
exec ('use [' + @DBName + ']')



das use wirkt nur innerhalb des exec, das ist eine eigene Verbindung
Du müßtest die gesamte Anweisung in das dyn. SQL mit aufnehmen und
ausführen.
Ich würde das aber nicht machen.

declare @sql varchar(4000)
set @sql = 'use [' + @DBName + '] '
declare @LogName varchar(300)
SET @LogName=(select name from dbo.sysfiles1 where fileid=2)
print @DBName
print @LogName
fetch next from dbcursor into @dbname
end
deallocate dbcursor



Ein Anwachsen der Logfiles wird eine Sicherung gestoppt.
Du mußt bedenken, daß verkleinerte Logs auch wieder wachsen müssen udn daß
das Performance kostet.
Es ist besser
1. eine regelmàßige Sicherung zu aktivieren, wenn das
Wiederherstellungsmodell auf "vollstàndig" oder "massenprotokolliert" steht
2. die Prozeduren durchforsten, ob da z.B. deletes sind, die sich durch das
nur minimal protokollierte "truncate table" ersetzen làßt.
3. Eine gewisse Größe der Logs in Kauf nehmen. Lieber in neue Platten
investieren.

Gruß
Christa
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
InsideSql: www.insidesql.org

Ähnliche fragen