none
SQL 2008R2 gesplittete DB Dateien wieder zusammenführen RRS feed

  • Frage

  • Hallo zusammen, ich habe einen SQL 2008R8 Server. Dieser Server hat mehrere Volumen (RAID-1). Zur besseren Performance ist die Haupt DB gesplittet. Es gibt 3 DB Dateien, die jeweils ein eigenes Volumen nutzen. Weil die DB weiter wächst will ich nun die Daten auf einen SAN Storage auslagern. Da es dann nicht mehr vorteilhaft ist die DB zu splitten würde ich die 3 DB Dateien gerne wieder zusammenführen. Da ich zurzeit kein passendes Equipment habe um das einfach mal zu probieren, wollte ich mal in die Runde Fragen ob hier schon Jemand damit Erfahrungen gesammelt hat.

    Über ein Feedback würde ich mich sehr freuen.

      
    Montag, 11. August 2014 13:19

Antworten

  • Sind die Dateien in der gleichen oder in unterschiedlichen FileGroups?

    Zum Zusammenführen von Dateien in der gleichen FileGroup kannst du wie folgt vorgehen:

    DBCC SHRINKFILE(LogischerDateiName, EMPTYFILE)

    ALTER DATABASE DeineDB REMOVE FILE LogischerDateiName

    Falls Du den logischen Dateinamen nicht kennst:

    SELECT
    name AS LogicalName
    ,sys.database_files.physical_name AS PhysicalName
    FROM
    sys.database_files

    Auf jeden Fall das Ganze vorher testen! Und natürlich vor dem Ausführen ein Backup ziehen!!

    Montag, 11. August 2014 22:56

Alle Antworten

  • Sind die Dateien in der gleichen oder in unterschiedlichen FileGroups?

    Zum Zusammenführen von Dateien in der gleichen FileGroup kannst du wie folgt vorgehen:

    DBCC SHRINKFILE(LogischerDateiName, EMPTYFILE)

    ALTER DATABASE DeineDB REMOVE FILE LogischerDateiName

    Falls Du den logischen Dateinamen nicht kennst:

    SELECT
    name AS LogicalName
    ,sys.database_files.physical_name AS PhysicalName
    FROM
    sys.database_files

    Auf jeden Fall das Ganze vorher testen! Und natürlich vor dem Ausführen ein Backup ziehen!!

    Montag, 11. August 2014 22:56
  • Welchen Vorteil versprichst Du Dir davon, die Daten wieder in einem File zusammen zu führen?
    Wenn Du mehrere LUNs bekommen könntest, die unterschiedliche Platten im SAN verwenden, könntest Du auch dort den Vorteil der vielen Köpfe nutzen.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Dienstag, 12. August 2014 05:57
    Beantworter
  • Hallo LMU92, vielen Dank das ist ein guter Vorschlag. Die drei Dateien sind alle in der primären Dateigruppe, also sollte es funktionieren. Ich werde es Testen.

    Dienstag, 12. August 2014 07:18
  • Hallo Christoph,

    unser SAN Storage verwaltet die LUNs dynamisch. Das heißt auf die Anzahl der Spindeln hat man beim Einrichten keinen Einfluss. Das funktioniert in der Praxis auch sehr gut. Ich denke, bei einer gesplitteten Dateigruppe ist die Verwaltung für den SQL Server aufwendiger als wenn alle Daten in einer Datei sind.

    Dienstag, 12. August 2014 07:26
  • Hallo!
    Zu dem Thema gibt es diverse Empfehlungen, wobei ich sagen würde, dass man sich zuerst einmal das System anschauen sollte, ob wirklich ein Engpass auftritt, wenn man nur einen Datafile verwendet.
    Linchi Shea hat einen guten Artikel (http://sqlblog.com/blogs/linchi_shea/archive/2007/01/29/how-many-data-files-should-i-create-for-a-user-database.aspx) zum Thema How Many Data Files Should I Create for a User Database? verfasst, wo er auch auf die Microsoft Whitepaper hinweist. Seine Tests haben erst einen Performance- Unterschied bei mehr als 100 Usern gezeigt. Interessant ist auch noch dieser Artikel (http://www.toadworld.com/platforms/sql-server/w/wiki/10373.configuring-database-files-for-optimal-perfomance.aspx#Using_Filegroups_and_Secondary_Data_Files) von Jen McCown. Sie beschreibt auch, dass man zuerst einmal analysieren sollte, ob dort überhaupt ein Engpass vorherrscht.
    Ansonsten gilt natürlich, dass die Verlagerung auf möglichst viele Spindeln die Performance erhöhen kann. Andererseits kann man mit Memory eine Menge abpuffern.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu


    Dienstag, 12. August 2014 07:30
    Beantworter
  • Einer meiner Kunden hat damit auch schon herumexperimentiert und hat eine 190 GB Datenbank auf 8 Einzeldateien separiert.

    Der Gedanke dahinter war daß das SAN die IO-Transaktionen bei gesplitteten Datenbanken - die an unterschiedlichen SCSI Controllern gehostet werden - parallelisiert abarbeitet und somit z.B. ein "full table scan" auf nicht-indizierte Spalten dann achtfach schneller vonstatten geht.

    Am Ende zeigte sich aber daß das SAN selbst der Flaschenhals war, das war z.B. schon bei 40.000 iops "am Ende". Das hat er aber nur mit synthetischen Tests herausgefunden. Praktisch schicken alle 250 User "unserer" Applikation die der Kunde hat, im Normalbetrieb zwischen 100 und 200 Transaktionen/Sekunde an den Server, was dieser dann in ca. 1000 iops aufgesplittet hat da die Statements "No SQL" waren.

    Auch hat die Applikation, die die Datenbank nutzt, bei einer massiven Wartungsoperation weniger als 2000 iops an den Server geschickt so daß sich der Kunde am Ende dazu entschlossen hat, die Dateien wieder zusammenzuführen, und den Server mit 100% der Datenbankgröße an Arbeitsspeicher auszustatten.

    Mehr gewinnt man dann nur noch durch In Memory ab SQL 2014, da der physische Commit auf dem Datenträger nicht mehr als Teil einer Traksaktion betrachtet wird auf deren Commit man noch warten müßte (bei Schreibvorgängen) und bei lesenden Vorgängen entfällt die Prüfung, ob die Daten schon gecacht sind oder nicht.

    Mittwoch, 13. August 2014 15:46
  • Hallo Christoph,

    unser SAN Storage verwaltet die LUNs dynamisch. Das heißt auf die Anzahl der Spindeln hat man beim Einrichten keinen Einfluss. Das funktioniert in der Praxis auch sehr gut. Ich denke, bei einer gesplitteten Dateigruppe ist die Verwaltung für den SQL Server aufwendiger als wenn alle Daten in einer Datei sind.

    Ein kleiner Tipp:

    Datenbanken ab einigen GB Größe sollte man tunlichst in mindestens 2 Dateien aufteilen, und keine User-Tabellen in der PRIMARY speichern.

    Ich würde es sogar als Regel für alle DBs einführen, da diese meist ohnehin wachsen und die Diskussionen "ab welcher Größe genau denn jetzt" entfällt.

    Hintergrund ist nicht Performance sondern RTO / Recovery und andere Vorteile, die man beim Handling von kleineren Dateien naturgemäß hat. Vor multiplen Dateien sollte man im Enterprise-Umfeld keine Angst haben :-)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 13. August 2014 18:29