Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

14. März 2007 um 19:56

SQL-Server: Deadlocks besser steuern

Durch den Artikel "Subtle Changes You Might Have Missed" von Kalen Delaney in der Februar-Ausgabe des SQL Server Magazine wurde ich auf eine Änderung aufmerksam, die ich tatsächlich noch nicht bemerkt hatte.
Bislang war es im Wesentlichen so, dass der SQL-Server im Falle eines Deadlock die Transaktion zurück setze, die die wenigsten Änderungen durchgeführt hatte.
Durch die neuen Änderungen wird die Option "SET DEADLOCK_PRIORITY" so aufgemwertet, dass sie tatsächlich sinnvoll eingesetzt werden kann:
Man kann jetzt die Priorität von -10 bis 10 angeben. Neben den alten Werten LOW (=-5) und NORMAL (=0) wurde jetzt auch HIGH (=5) eingeführt.

Jetzt kann man diejenigen Transaktionen kennzeichnen, die nicht als Opfer ausgesucht werden sollen, bisher (also vor SQL Server 2005) konnte man nur festlegen, welche Transaktionen gerne Opfer wären.
Das war natürlich etwas weltfremd, wer ist schon gerne ein Opfer… Mit der neuen nummerischen Abstufung kann man ziemlich gut steuern, wer welche Priorität hat.

Dennoch sollte das nicht darüber hinwegtäuschen, dass man am besten auch gleich Deadlockvermeidungsstrategien verwendet, um die Situation möglichst zu verhindern….

12. März 2007 um 21:01

Die dreckigen Zehn

Als ich heute alle Newsletter querlas, fiel mir eine Info über einen Artikel aus Simple-Talk.com in die Hände: "Ten common database design mistakes". Über das Thema wurden schon wirklich viele Artikel geschrieben, aber der Autor hat 100%ig recht. Seine Tipps kann ich komplett unterschreiben: genau diese Fehler werden immer wieder gemacht und immer wieder kostet es Mühen und Schmerzen die Architekten bzw. Entwickler zu überzeugen. Aber es sind immer die gleichen Fehler, die Performance kosten.

Naja, da ich davon lebe, könnte ich mich einerseits darüber freuen, aber andererseits sind mir die anderen Aufgaben meines Jobs bedeutend lieber…

10. März 2007 um 19:52

Update: Critical Update for SQL Server 2005 SP2

Oh, weh: Während ich alle Viere von mir streckte und die Bazillen im Dutzend begrüßte, haben meine Kollegen sicher ordentlich geschwitzt als sie den sicherheitkritischen Hotfix von Microsoft zum Service-Pack-2 des SQL-Servers-2005 bekamen und unter Hochdruck in unsere Standard-Installation einbauen durften.

Wenn ich die nebulöse Erklärung richtig verstehe, dann werden wohl ein paar Daten etwas zu früh gelöscht:
"The initial release of SQL Server 2005 Service Pack 2 (SP2) contained an issue that caused maintenance plan cleanup tasks to remove data before the specified cleanup interval."

Daher schnell zugreifen: er ist immer noch heiss: "Download details: SQL Server 2005 SP2 Update"

Der Update wiegt 18MBytes und liefert bei deutsch und englisch die gleichen Dateien, die auf "ENU" enden, was ich eigenartig finde, weil das üblicherweise nur für die US-englische Edition steht.

gefunden bei TheDailyGrind.

Update: Da wäre mir der Kommentar von Spencer doch fast durchgegangen (Danke für die Erinnerung), er machte bereits vor diesem Artikel auf den Download aufmerksam und verweist dabei auf den Artikel in dem endlich ein paar Details zum Problem stehen: http://support.microsoft.com/?scid=KB;en-us;933508

1. März 2007 um 20:28

Anregungen zu den Books-Online

Wenn jemand Anregungen zu den Books-Online, der Hilfe zum Microsoft SQL-Server, hat, z.B. Fehler oder Dinge, die er schon immer sagen wollte, der kann das jetzt ganz frei nutzen. Buck Woody, einer der technischen Dokumentare, berichtet in seinem Weblog vom Erstellungsprozess und dem Hintergrund der Schreiberlinge. Außerdem fordert er dazu auf ihm Feedback zur Hilfe zu geben.

Mehr dazu in "Carpe Datum : SQL Server Books Online".

Interessant finde ich, dass die Schreiberlinge, bei MS werden sie "Content Developer" genannt, offenbar allesamt hochdekorierte Veteranen der SQL-Bücher sind…

Many of the technical writers here are database professionals before coming to work here, and some have authored a few commercial books on SQL Server. They not only have to know the technical side of the product, but also be able to write.

Buck Woody trifft das offenbar tatsächlich zu.

gefunden bei Kevin Kline (ja, dem Kevin Kline – nein, nein, nicht dem, dem anderen…)
😉
28. Februar 2007 um 22:28

Gartner-Bericht zu Data-Warehouse-Systemen

Durch den Newsletter des SQL Server Magazine wurde ich auch schon auf den letztjährigen Gartner-Bericht zu Data-Warehouse-Systemen aufmerksam:
"Magic Quadrant for Data Warehouse Database Management Systems, September 2006".
Zusätzlich dazu steht sogar schon der Januar-Bericht zu BI online bereit:
Magic Quadrant for Business Intelligence Plattfoms, 1Q.2007

Diese Berichte sind nicht allein selig machend, wirken meiner Erfahrung nach auf Manager aber ungeheuer überzeugend. Das liegt vermutlich daran, dass sie so teuer sind…

26. Februar 2007 um 18:20

Fehlerbehandlung am SQL-Server

Grant Fritchey stellt den sehr guten Workshop "SQL Server Error Handling Workbench" bereit. Eigentlich wollte ich auch mal was zu dem Thema schreiben, aber Grant hat die Latte ziemlich hoch gelegt. Sein Workshop ist gleichermaßen verständlich und nahezu vollständig.

Es nennt es Workshop, weil man die SQL-Datei in das Management-Studio lädt und dann dort schrittweise ausprobiert. Er ist meiner Ansicht nach für alle (angehenden) TSQL-Profis sehr zu empfehlen.

26. Februar 2007 um 18:13

PowerSMO – Powershell für Datenbank-Admins

Wer von der Powershell nicht genug bekommen kann und auch mit dem SQL-Server-2005 arbeiten muss/mag, der wird sich über
PowerSMO freuen.

Damit kann man im Rahmen der Powershell auf Objekte im SQL-Server zugreifen. Ich persönlich finde das schon mal einen guten Anfang, aber es ist einfach noch zu kompliziert. Es ist zu stark an die SMO angelehnt. Ich persönlich würde mir eine stärkere Anbindung an SQL wünschen. Wenn ich mir die Beispiele so ansehe, finde ich das alles noch sehr umständlich, z.B. das Anlegen einer Datenbank. Eigentlich kann man statt dessen ja auch einfach einen SQL-Befehl ("create database") an den Server schicken und gut is… 😉

Dan Sullivan, der Erfinder, bietet selber auch zwei Artikel an die sich vor allem an Einsteiger in die PowerShell richten:

25. Februar 2007 um 22:45

Server-Default-Collation ändern

Weil ich gerade etwas über Collations schrieb, musste ich wieder daran denken, wie ich neulich von meinem Kollegen Matthias lernte, dass man am SQL-Server-2005 die Server-Default-Collation viel einfacher ändern kann als früher. Bis inkl. SQL-Server-2000 war ein explizites "Rebuild Master" notwendig. Neuerdings geht das mittels des Setup-Befehls. Da wird zwar auch ein "rebuild master" durchgeführt, aber der Aufruf ist erheblich einfacher.

start /wait setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=test SQLCOLLATION=SQL_Latin1_General_CP1_CI_AI

Weitere Infos stehen in der Online-Hilfe. Das Beispiel ist auch von dort.

25. Februar 2007 um 22:35

temporäre Tabellen – heute hier, morgen fort

Am Microsoft SQL Server gibt es drei offizielle Arten von temporären Tabellen, aber tatsächlich sind es sogar fünf. Je nach Art der Verwendung findet sich leicht etwas passendes.

sitzungsbezogene temporäre Tabellen

Die lokale Tabelle wird direkt in einer Session angelegt. Beispiel:

create table #localtable(
id integer identity(1,1) not null primary key,
f nvarchar(100) collate Latin1_General_CI_AS not null
);

  • Die Tabelle existiert in der gesamten Verbindung ("Session") und damit in allen Prozeduren, die innerhalb aufgerufen werden.
    Erst nach dem Ende der Verbindung wird die Tabelle automatisch entfernt. Es sei denn sie wird vorher explizit mit einem DROP-Befehl entfernt.
  • Andere Verbindungen können nicht auf die Tabelle zugreifen. Sie existiert nur "lokal" in dieser Session.
  • Wird in einer Stored-Procedure (SP) eine gleichnamige Tabelle angelegt, dann wird dort eine eigene, unabhängige, temporäre Tabelle mit gleichem Namen angelegt. In diesem Fall kann man nur auf die "innere" zugreifen. (siehe nächster Typ)
  • Es ist möglich einen Index auf die Tabele zu legen und/oder nachträglich weitere Constraints anzulegen.

lokale temporäre Tabellen

Die lokale Tabelle wird in einer Stored-Procedure (oder einem anderen Gültigkeitsbereich) angelegt. Die Syntax ist genau wie beim obigen Beispiel.

  • Die Tabelle existiert aber nur in dieser Stored-Procedure (nennen wir sie mal SP1) und allen Prozeduren, die innerhalb von SP1 aufgerufen werden.
    Nach dem Ende der Prozedur wird die Tabelle automatisch entfernt. Es sei denn sie wird vorher explizit entfernt.
  • Andere Prozeduren oder Verbindungen können nicht auf die Tabelle zugreifen. Sie existiert nur "lokal" in dieser Instanz der SP.
  • Wird die Prozedur in anderen Sitzungen erneut aufgerufen, werden dort jeweils eigene, unabhängige temporäre Tabellen angelegt.
  • Es ist möglich einen Index auf die Tabele zu legen und/oder nachträglich weitere Constraints anzulegen.

globale temporäre Tabellen

Bei der globalen Tabelle ist es egal in welchem Gültigkeitsbereich sie angelegt, wird. Sie kann in allen Stored-Procedures und Funktions zugegriffen werden. Für die Syntax anbei noch ein Beispiel:

create table ##globaltable(
id integer identity(1,1) not null primary key,
f nvarchar(100) collate Latin1_General_CI_AS not null
);

  • Die Tabelle ist von jeder Verbindung aus zugreifbar, kann also von allen Stored-Procedures, Funktionen verwendet werden.
  • Wird von einer anderen Verbindung (egal mit welchem Benutzer) versucht eine gleichnamibe Tabelle anzulegen, kommt die Fehlermeldung, dass es die Tabelle schon gibt.
  • Nach dem Ende der ursprünglichen Verbindung wird die Tabelle automatisch entfernt, sofern keine andere Verbindung eine Sperre auf einen Datensatz, eine Seite oder die ganze Tabelle hält. Natürlich kann sie auch vorher explizit entfernt werden.
  • Sobald die anderen Verbindungen auf die so eben entfernte Tabelle zuzugreifen, kommt die Meldung, dass sie nicht existiert.
  • Es ist möglich einen Index auf die Tabele zu legen und/oder nachträglich weitere Constraints anzulegen.

In der Praxis finde ich diese Art der Tabellen sehr unpraktisch und würde von deren Verwendung abraten. Was hat man davon, wenn die Existenz der Tabelle so stark mit der anlegenden Verbindung zusammenhängt, dann wäre doch die sitzungsbezogene temporäre Tabelle deutlich verständlicher.

(normale) Tabelle in TempDB

Bei der normalen Tabelle in der TempDB muss man das Recht haben Tabellen anzulegen, also z.B. SysAdmin oder DdlAdmin in der TempDB sein. Für die Syntax wieder ein Beispiel:

create table tempdb.dbo.mytable(
id integer identity(1,1) not null primary key,
f nvarchar(100) collate Latin1_General_CI_AS not null
);

  • Die Tabelle ist von jeder Verbindung aus zugreifbar, kann also von allen Stored-Procedures, Funktionen verwendet werden.
  • Die Tabelle wird erst beim nächsten Start des SQL-Servers entfernt, sofern sie nicht vorher explizit entfernt wurde.
  • Es ist möglich einen Index auf die Tabele zu legen und/oder nachträglich weitere Constraints anzulegen.

Rechte in der Praxis

1. Möglichkeit: Man kann die Benutzer, die diese Tabellen anlegen dürfen als User in der TempDB anlegen. Dass muss man allerdings nach jedem Server-Start machen, weil da die TempDB gelöscht und neu aus einer Kopie der Model-Datenbank angelegt wird. Diese Benutzer bekommen dann das Recht "CREATE TABLE". Dazu könnte man sich eine Autostart-Prozedur anlegen, die die anzulegenden User aus einer eigens dafür anzulegenden Tabelle liest und anlegt.
Nach dem Anlegen der Tabelle muss dann der Benutzer die Rechte auf die Tabelle explizit vergeben. Das alles ist umständlich und erfordert jede Menge Aufwand. Dafür ist es "nach Vorschrift": Jeder hat nur so viele Rechte, wie er benötigt.
2. Möglichkeit: Man gibt der Gruppe Public in der TempDB das Recht "CREATE TABLE". Auch hier schlage ich eine Autostart-Prozedur vor. Die anzulegenden Tabellen nennt man "tempdb.guest.". Dann darf sie automatisch jeder lesen, schreiben, allerdings auch löschen. Sicherheitskritische Daten sollte man aber in so eine Tabelle ohnehin nicht schreiben.

Tabellenvariablen

Und dann gibt es da noch die Tabellenvariablen. Sie funktionieren im Grunde fast genau wie lokale temporäre Tabellen

DECLARE @MyTempTable table (
id integer identity(1,1) not null primary key,
f nvarchar(100) collate Latin1_General_CI_AS not null);

  • Die Tabellenvariable existiert aber nur in dieser Stored-Procedure (SP), aber nicht in den Prozeduren, die aufgerufen werden.
  • Andere Prozeduren oder Verbindungen können nicht auf die Tabellenvariable zugreifen. Sie existiert nur "lokal" in dieser Instanz der SP.
  • Wird die Prozedur in anderen Sitzungen erneut aufgerufen, werden dort jeweils eigene, unabhängige temporäre Tabellenvariablen angelegt.
  • Es ist nicht möglich einen Index auf die Tabele zu legen oder nachträglich weitere Constraints anzulegen.

Collate in der Praxis

In obigen Beispielen habe ich immer die Collation angegeben. Das ist immer dann wichtig, wenn ich nicht sicher davon ausgehen kann, dass sie Server-Default-Collation mit der Collation in "meiner" Datenbank übereinstimmt. Da temporäre Tabellen in der TempDb angelegt werden, wird für Zeichenketten automatisch die Default-Collation des Servers verwendet, wenn es nicht anders angegeben wird.

18. Februar 2007 um 15:45

Haltbarkeit von Festplatten

Bei Heise.de kann man eine sehr ausführlich Zusammenfassung der Google-Studie zur Haltbarkeit von Festplatten nachlesen.
Diese Studie sollte man in alle Sprachen übersetzen un deren Zusammenfassung zur Pflichtlektüre für jeden EDV-Verantwortlichen machen…

Prometeo wundert sich darüber, dass einer der Haupteinflussfaktoren auch der Hersteller ist. Das wundert mich hingegen nicht, schon früher gab es im "Flurfunk" einige Hersteller von deren Festplatten gewarnt wurde. Als Software-Firma tut man sich allerdings schwer die Namen solcher Firmen ohne zuverlässige Quellenangaben zu veröffentlichen. Deswegen stimme ich zu: es wäre schön gewesen, wenn Google die Namen genannt hätte. Immerhin haben sie ja eine echte Studie mit zuverlässigen Angaben.

16. Februar 2007 um 21:30

Webcasts – die etwas andere Erfahrung

Gestern versuchte ich zum ersten Mal bei einem Webcast teilzunehmen: "Versionierung & Deployment von Datenbankänderungen". Dabei geht es um die neue "Visual Studio Team Edition for Database Professionals".

Leider stellte ich fest, dass auf dem Internet-Rechner in der Firma der Ton nicht klappte. Ich bekam die Meldung, dass zum Audio-Server keine Verbindung aufgebaut werden kann. Die Folien zu sehen ohne ton, war irgendwie nicht so prickelnd. Nachdem ich alle Tipps von MS durchprobiert hatte, inkl. Installation der neuesten Patches und diversen Konfigurationen, habe ich dann aufgegeben. Heute habe ich die Info bekommen, welchen Proxi unserer Firma ich dafür nehmen muss und schon klappte es.

Ich bin schon auf den nächsten Versuch gespannt…
Wer noch mit aufspringen will: Offenbar hatte der Referent keine Lust mehr, nachdem ich weggegangen war. Das Ganze wurde dann abgebrochen und auf den 22.2. um 14 Uhr vertagt…

MSDN Webcast: Versionierung & Deployment von Datenbankänderungen – Team System und die Database Professional Rolle (Level 200)

Hier ist die aktuelle Liste aller deutschsprachigen WebCasts in nächster Zeit. Die meisten kann man auch nachträglich ansehen.

15. Februar 2007 um 20:38

Kein Scherz – Jim Gray verschollen

Als ich erst heute dazu kam einen Eintrag aus dem Newsletter des SQL-Server-Magazine vom 8.2.2007 zu lesen, dachte ich zuerst es handelt sich um einen schlechten Scherz, aber es scheint zu stimmen: Jim Gray ist verschollen.

Das macht mich sehr betroffen, er war eine ganz besondere Persönlichkeit, aber ist jetzt einfach verschwunden.

Es folgenden die Fakten, wie ich sie verstand:

Am Sonntag den 28. Januar fuhr der 63ig-jährige Turing-Preisträger und Datenbank-Guru bei klarer Sicht und gutem Wetter mit seinem Segelboot "Tenacious" raus, um die Asche seiner Mutter zu verstreuen. Er wollte nach kurzer Zeit zurückkommen. Seine Frau benachrichtigte am Abend (um 20:30 Uhr, also lange Sonnenuntergang) die Küstenwache. Er war auch nicht auf seinem Handy erreichbar.

Die Küstenwache suchte ab dem nächsten Morgen 4 Tage lang vergeblich die Gewässer ab. Anschließend suchten am Donnerstag den 3.Februar noch drei Freunde mit Privatflugzeugen ebenso erfolglos die Gegend ab.

Am gleichen Tag überquerte der Satellit "Digital Globe" die Gegend und machte Aufnahmen. Die Leute aus seinem ehemaligen Team und befreundete IT-Leute (von der NASA, Digital Globe, Microsoft, Google, Oracle, Amazon, …) machten die Satellitenbilder der Gegend öffentlich verfügbar und baten darum die Bilder nach Spuren eines Segelschiffes abzusuchen.

6000 Menschen beteiligten sich, sichteten 560.000 Bilder, die etwa 3.500 Quadratmeilen Ozean abdeckten und markierten davon 2000 Bilder für eine genauere Untersuchung. Jetzt wird all diesen Hinweisen nachgegangen.

Es wurde der Weblog Tenacious Search mit Infos zu den aktuellen Maßnahmen eingerichtet.

Seine Freunde haben noch nicht aufgegeben und bitten weiter um Mithilfe unter www.helpfindjim.com.

Hier noch ein paar Presseberichte:

Das Ganze ist ein komplettes Rätsel, wie man dem oben genannten Artikel entnehmen kann:

Officials said that Gray has about 10 years of sailing experience and that his boat is "well-equipped with communication, safety and emergency gear," including a marine radio.

"We've had no leads or signs during the search," said Coast Guard Lt. Amy Mars. "Search conditions the entire time have been good."

Compounding the mystery of what may have happened to Gray's vessel was the gorgeous weather of the past two days.

[…]

"It's spooky," said San Francisco sailor John McNeill. "In that kind of weather, there's almost no way you can get into trouble. … The most likely thing in my experience, though I'm not saying this is what happened, is that he literally made a mistake and went over the side. The boat could have been set to sail on its own, and it could be way the heck offshore now."

Wie kann ein Boot einfach so verschwinden?