Der tägliche Wahnsinn
Beiträge getaggt mit SQL Server
SQL Server Backup mit Idera SQLSafe Freeware Edition
12. Jun
Heute will ich ein kostenloses Tool von Idera vorstellen. Leider ist das Backup von gerade sehr großen Datenbanken mit den Boardmitteln des SQL Servers oft eine sehr langwierige Angelegenheit (von den größenb der Backup File mal ganz zu schweigen).
Da kommt der SQLSafe von Idera ins Spiel, von dem es auch eine Freeware Edition gibt (im vergleich zur Vollversion kann man diesen nicht per Policies bzw. der Console steuern). Wer aber nur eine Hand voll Datenbanken sichern möchte, sollte sich den Safe einmal genauer ansehen.
Die größten Vorteile:
- Komprimierung der Backups bis zu 95%
- Schnellere Backups bis zu 50% Zeitersparnis im vergleich zu nativen Backups
- Einfach zu Scripten
Nachdem Ihr den SQLSafe installiert habt, stehen euch zwei Möglichkeiten zum sichern der Datenbanken zur Verfügung. Zum einen über die Kommandozeile (SQLSafecmd) oder über die Stored Procedures (xp_ss_backup oder xp_ss_restore). Beispiele zu der Verwenung der Scripte findet ihr in den mitgelieferten Hilfefiles.
Als kleines Beispiel zum Sichern der Datenbanken via Kommandozeile:
SQL safecmd backup northwind c:\backup\northwind.safe SQL safecmd backup northwind c:\backup\nw_%timestamp%.safe
Beispiel zum Sichern der Datenbanken über T-SQL:
DECLARE @Returncode int EXEC @Returncode = [master].[dbo].[xp_ss_backup] @database = “Northwind”, @filename = "c:\backup\northwind.safe"
Thank God it’s Friday!
16. Jan
Und wieder einmal haben wir es geschafft, endlich Freitag! Ich wünsche allen Lesern ein schönes Wochenende!

SQLAdminToolset
Wenn ich so auf die Woche zurückblicke, ist das beste das eintreffen unserer Idera Lizenzen gewesen. Jetzt habe ich eine Version des SQL Admin Toolsets, welches ich jedem DBA nur empfehlen kann, da es für den Preis von 495 USD auch für kleinere Betriebe erschwinglich ist und eine menge Arbeit einen abnimmt.
Hier ein kleiner Auszug der Funktionen:
- Abfragen über mehrere SQL Server
- Clonen und Kopieren von Logins
- Datenbanken über Server kopieren
- Server inventarisieren
- Patchlevel auslesen
- u.v.m…
Ich will jetzt nicht weiter darauf eingehen, da der Feierabend langsam näher rückt, aber wer mag kann sich auf der Herstellerseite eine 14-Tage Testversion herunterladen und selbst ausgiebig testen.
Ausgabe von sp_help_job in Temptable speichern
15. Jan
Ich brauchte eine Übersicht von SQL Agent Jobs (Name, LastRunDate, Current Execution Status und LastRunOutcome), doch da die Job Hisorty auf 10 Tage auf diesem Server begrenzt ist, fällt der Ansatz über die Tabellen msdb.dbo.sysjobs und msdb.dbo.sysjobhistory aus (siehe Beispiel).
select distinct [name] as 'Job Name',
case [enabled] when 1 then 'Enabled' else 'Disabled' end as 'Enabled',
cast (ltrim(str(run_date))+' '+stuff(stuff(right('000000'+ltrim(str(run_time)), 6) , 3, 0, ':'), 6, 0, ':') as datetime) as 'Last Run',
step_id as Step,
case [h].[run_status]
when 0 then 'Failed' else 'Success'
end as 'Status'
from msdb.dbo.sysjobs j
left join msdb.dbo.sysjobschedules s
on j.job_id = s.job_id
LEFT join msdb.dbo.sysjobhistory h
on j.job_id = h.job_id
where step_id = 0
and h.instance_id in (select max(sh.instance_id)
from msdb.dbo.sysjobs sj
join msdb.dbo.sysjobhistory sh
on sj.job_id = sh.job_id
where h.step_id = 0
group by sj.[name])
Die einzigste Möglichkeit von allen Jobs diese Werte zu ermitteln, ist über die Prozedur sp_help_job. Leider ist es nicht möglich das Ergebnis in eine TempTable umzuleiten (siehe Beispiel)
insert into #TempJobTable execute sp_help_job
Dies Endet dann meist in folgender Fehlermeldung:
Server: Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 67
An INSERT EXEC statement cannot be nested.
Nun bleibt nur noch der Weg über OPENROWSET (siehe Beispiel) was wunderbar funktioniert.
SELECT * INTO #JobInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes', 'set fmtonly off exec msdb.dbo.sp_help_job')
Select
[name],
cast(ltrim(str(last_run_date))+' '+stuff(stuff(right('000000'+ltrim(str(last_run_time)), 6) , 3, 0, ':'), 6, 0, ':') as NVARCHAR(255)) as 'Last Run',
CASE [current_execution_status]
WHEN 1 THEN 'Executing'
WHEN 2 THEN 'Waiting For Thread'
WHEN 3 THEN 'Between Retries'
WHEN 4 THEN 'Idle'
WHEN 5 THEN 'Suspended'
WHEN 7 THEN 'PerformingCompletion'
ELSE 'Unknown'
END AS Status
, CASE [last_run_outcome]
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Success'
ELSE 'Unknown'
END AS Result
from #JobInfo
ORDER BY [name]
DROP TABLE #JobInfo
T-SQL Script zum shrinken des Logfiles
07. Jan
Hier ein kleines T-SQL Script, welches ich verwende, um Logfiles zu shrinken.
USE [DBName] GO DBCC SHRINKFILE([DBName]_log, 1) BACKUP LOG [DBName] WITH TRUNCATE_ONLY DBCC SHRINKFILE([DBName]_log, 1)
Einfach [DBName] in den gewünschen Datenbanknamen ersetzen.
Alle Tabellen in einer Datenbank löschen
21. Okt
Bei großen Datenbanken hat man oft das Problem, daß man nicht alle Tabellen auf einfache Art un Weise löschen kann. Mehr >
Ich mag kein newid()
20. Okt
Wer kennt nicht das Problem mit dem Primary Key, Dataset und der NoNullAllowedException?
Ich habe mir die Finger wund gegoogelt um eine “einfache” Lösung des Problems zu finden, und bin über folgenden kleinen Codefetzen gestoßen, welchen man nur in seinem Dataset einpflegen muß (Rechtsklick auf das Dataset (XSD) im Designer und “View Code” auswählen.
private bool CreateDefaultGuids = false;
public void CtreateDefaultGuids()
{
if (CreateDefaultGuids) return;
CreateDefaultGuids = true;
foreach (DataTable dt in this.Tables)
{
if (dt.Columns[0] != null)
{
dt.TableNewRow += new DataTableNewRowEventHandler(TableNewRowStudy);
}
}
}
private void TableNewRowStudy(object sender, DataTableNewRowEventArgs e)
{
if (e.Row[0] is DBNull)
e.Row[0] = Guid.NewGuid();
}
Jetzt muß dies im _Load Event deiner Form einmalig CtreateDefaultGuids() aufgerufen werden, und schon ist Schluß mit der NoNullAllowed Exception.
Letzte Kommentare