Posts Tagged ‘SQL’

Change the path SQL 2008 Server Database

Sunday, August 30th, 2009

In the most cases there are benefits when all data (log and db) files are on the network storage. Think off the benefit in terms of performance and backup. The Install wizard of Microsoft SQL Server 2008 shows only the option to change the path of the temporary database. In this guide I show you how to move the databases. Please keep in mind to create a backup of your db’s before starting. I know backup is only for hot shower takers, gym bag losers and armpit hair blow-dryers;-). On my test server the path looks like:

master.mdf, masterlog.ldf

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA

Model.mdf, modellog.ldf

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA

MSDBdata.mdf, MSDBlog.mdf

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA

Tempdbv.mdf, templog.ldf

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA

planetgeek.mdf, planetgeek_log.ldf

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA

First thing you notice the filenames are all tuned in the same schema, pls. Microsoft it cannot be so hard. Our mission is to move all log files in the path D:\mssqlserver08 and all data files to E:\mssqlserver08. The first thing we should do is give the sqlserver service account user read and write rights to this two directories. This step is not quiet necessary but the remote db creation and auto grow features will not work. Let’s start with the master db. Start the SQL Server Configuration Manager. Click “start” -> “run” and type “SQLServerManager10.msc” and right click on the properties from the SQL server Service.

clip_image002

In the advanced tab you have to edit the Startup Parameters

clip_image004

The default value is (keep in mind there are no spaces!!!):

-dC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA\master.mdf;

-eC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\Log\ERRORLOG;

-lC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER08\MSSQL\DATA\mastlog.ldf

-d is the path to the master.mdf

-e path of the “ERRORLOG” File.


-l is path to the ldf File

After change the path to (keep in mind there are no spaces!!!):

-dD:\mssqlserver08\master.mdf;

-eD:\errorlog\ERRORLOG;

-lE:\mssqlserver08\mastlog.ldf

stop the sql server (for cluster use you can use an UNC path and share name. This is useful on relaxed security cluster environments). Copy the master db files to the new path. And start the SQL server Service. One step done four steps are left, so let’s move on with the temporary db. Open the SQL Server Management Studio and open a new query and enter the following lines

clip_image006

After the alter database statement you need to stop the Sql Server move the files in explorer to their new location and start the SQL Server Service. Many of you are maybe wondering why “ … name = tempdev, …” and the “name = templog” in the SQL query. This is the internal database name. A very easy name to get this name is stored procedure sp_help

clip_image007

with this procedure you are able to easily modify the path of all other databases. Normally we would have finished at this point. But after then years of experience as IT guy I know that “developers” often don’t care about path in the file system (developers who write for planetgeek are not this kind of developers ;-) . So we should change the default database creation path to ensure it will work even when we are not in the office (Yes the IT Professionals have Holydays;-).

clip_image009

Enjoy the comfort of non direct attached storage, RIDE ON

Konrad

Restore einer MSSQL DB ohne Transaktions Log

Wednesday, April 30th, 2008

Das Wichtigste zuerst, Nicht am Produktiven System üben. Das folgende Beispiel nur im Absoluten Notfall verwenden. Alles ohne Garantie das es funzt und ihr nicht noch mehr zerstört. Bei allen die sich etwas mit dem MS SQL Server auseinander gesetzt haben wissen das es sich beim Transaktion log um das LDF File. Zuerst möchte ich aber etwas näher auf die Funktion des Transaktionslog  eingehen für alle welche nicht so versiert mit Datenbanken sind. Wenn ein Programm eine Update in einer Datenbank macht wird dieses zuerst in das Transaktion log geschrieben. Der SQL Server Schreibt dann die Änderung  in die Eigentliche Datenbankldf1 (mdf). Für alle welche sich mal etwas im Transaktion log umschauen möchten gibt’s den Befehl “DBCC log ( {dbid|dbname}, [, type={0|1|2|3|4}] )”. Wobei ich eigentlich meistens zum Debuggen die Option 0 oder 1 verwende. Insgeheim Denke ich auch das man die leute welche mit der Option 4 Debuggen in der Matrix Leben und keine rl freunde haben ;-)

Aber wieder zurück zum Thema. Also gehen wir mal davon aus das unser DB Server geratscht ist wegen einer Hard Disk wo das LDF File drauf war (Möchte hier nur anmerken das mir das noch nie passiert ist und so ein File auf ein Riad System gehört !!) Des weiter haben wir ein Backup der Datenbank welches ldif2 eine stunden alt ist. Um dies zu simulieren habe ich im Windows Task Manager den “sqlservr.exe” beendet und die ldf Datei gelöscht. Da wir ja kein 0815 Admin sind. Geben wir uns nicht damit zufrieden unser Backup einfach so zurückzustellen und die Armen Kunden (Anwender) die letzen stunden einfach nochmal so einzugeben. Also werfen wir den DB Server mal wieder an. Das unsere Datenbank sich als suspect meldet springt uns als erstes in Auge (sihe PRTSCR 2). Wenn wir versuchen einen Zugriff zu machen wird dies geblockt das kein Transaktion log da ist. Aber wir komme ich weiter ?

Wir besinnen uns auf den SQL Kurs den wir nie hatten und beginnen zu weinen ;-) . Wir können auch etwas Rumsuchen in dem SQL Books Online bei Microsoft. Oder wir Erinnern uns an den von Microsoft nicht dokumentierten befehl DBCC. Ok ich gebe zu in diversen KB artikeln wird mit dem ding rumgebastelt. Oder wir können etwas Googeln und gelangen zu einem Scribt was so ähnlich ist wie dieses Hier.

EXEC sp_configure ‘allow updates’, 1
RECONFIGURE WITH OVERRIDE
GO

BEGIN TRAN
UPDATE master..sysdatabases
SET status = status | 32768
WHERE name = ‘RocketSience’
IF @@ROWCOUNT = 1
BEGIN
   COMMIT TRAN
   RAISERROR(‘emergency mode set’, 0, 1)
END
ELSE
BEGIN
   ROLLBACK
   RAISERROR(‘unable to set emergency mode’, 16, 1)
END
GO
EXEC sp_configure ‘allow updates’, 0
RECONFIGURE WITH OVERRIDE
GO
– Hier den SQL Server neu starten (Service Reicht).

DBCC REBUILD_LOG(‘RocketSience’,'D:\SQLDB\MSSQL$STARFLEETDB\Data\RocketSience_log.LDF’)
/*Hier Testen ob alles wieder geht !!!!!!
Keine garantie das meine DB Konsistent ist */
ALTER DATABASE RocketSience SET MULTI_USER
GO

Und schon lebt unsere Datenbank Wieder. Zum beweis das wir auch ein neues TRN Log haben noch dieser PRTSCR ldif4

Das Scribt habe ich euch natürlich auch als TXT Datei bereit gelegt.

Rocket Sience on SQL Server 2k Transaktion

Friday, April 11th, 2008

Wir hatten das Letzte mal bei einer Pizza eine Spande  Diskussion über Transaktionen im SQL Server 2000. Die runde bestand aus zwei Sys-Admins  einem WI und einen Software Devloper. Irgendwann Kamm das Thema mit der Lange einer Transaktion auf bzw was passiert wen ein anderer Prozess in der gleichen Zeit auf eine Row (Zeile) zugeiffen will. Nach dem wir uns nicht richtig einig geworden sein will ich den beweis antreten. Das Setup besteht aus einem SQL Server 2000 ohne SP und SA PW(ich weiss das ist böse aber in VM was Solls).

Die ganze Ding  ist auch ganz Easy aufgebaut.

RS1

Zum Simulieren von 2 Verschiedenen Prozessen nehme ich 2 SQL Query Anlyzer. Im Ersten starte ich eine Transaktion und werde das "Value" um eins nachzählen, die Transaktion aber noch nicht abschliessen. Dann werde ich im zweiten Query Anlyzer den wert der zuerst auslesen und danach auf 20 Setzen. Jetzt werde ich die Transaktion abschliessen.

Jetzt ist die Grosse Frage was ist der Wert im "Value" möglich währe 20, 2, 22 oder ein Absturz des SQL Server’s :-)

rs2

 

 

Wir Start also die Transaktion und machen einen Update um plus eins. Wir bemerken die "–" welche das "commit tran" zum Kommentar erklären.

 

 RS3

Der Select kann keinen wert auslesen da sie Tabelle von der Transaktion blockiert wird. Wir sehen das Query lauft auf diesem bild bereits 3min 12 Sek. Also brechen wir das mal ab und starten den Update auf den Wert "20". es zeigt sich wieder das gleiche Phänomen.

 

 

RS4

Im Enterprise Manager sehen wir schön die Gebockten Prozesse. in der Datenbank.

So also zur Auflösung: Da ich den Update gemacht habe während der Transaktion und ihn laufen lassen habe, "commit tran" ausfuhrt habe. Der Update sich innert Sekunden gelöst hat, wurde das Value welches 2 wahr mit 20 überschreiben. Das Ergebniss ist also ZWANZIG

I Win You Lose :-)

Suchen in SQL Server 2k

Thursday, February 28th, 2008

Heute habe ich was "geiles" (sorry für das Wort) gelernt bzw. Kopiert. Da ich im Moment am Migrieren von Datei Servern bin habe ich das Problem das ca 1000 Anwendungen da ihre Pfade haben. Inklusive einer Netten Datenbank Anwendung. Also anstatt gefühlte 10′000′000′000′000 Tabellen durchzusehen gibt’s ein kleines Scribt welches Spaltennamen sucht.

SELECT     distinct object_name(id)
FROM         syscolumns
WHERE     (name LIKE ‘%folder%’)

Ok ich gebe zu das Ding ist nicht der Stein der Weisen. Aber immerhin mal ein Anfang. Nur das %folder%" durch den Suchbegriff ersetzen.

SQLQueryA

THX to DOG & RIGGI