Schema umbenennen / einzelne Tabelle wiederherstellen/verschieben

06/04/2010 - 08:15 von Matthias Schuppe | Report spam
Hallo zusammen,

ich habe eine Datenbank - SQL 2005 - mit einem speziellen
Archivierungs-Konzept, das Schema-weise funktioniert, es gibt
beispielsweise folgende Tabellen:

Archiv2008.Tabelle
Archiv2009.Tabelle
Archiv.Tabelle
dbo.Tabelle

In Wirklichkeit sind das mehrere Tabellen mit jeweils einigen
Millionen Datensàtzen. Ich muss nun die Daten von "Archiv.Tabelle" in
"Archiv2009.Tabelle" verschieben, hab' ich so versucht:

INSERT INTO Archiv2009.Tabelle (
Feld1,
Feld2,
Feld3,
...)
SELECT Feld1,
Feld2,
Feld3,
...
FROM Archiv.Tabelle

Das funktioniert auch, aber wohl nicht, wenn die Datenbank im
Produktiv-Betrieb ist, dann nimmt der INSERT-Prozess so viele
Ressourcen, dass andere Ablàufe nicht mehr funktionieren bzw. ins
Timeout laufen. Also habe ich die Feiertage für das Daten Umschaufeln
genutzt, hat auch geklappt, aber leider hat die Zeit nicht
ausgereicht.

Nun habe ich folgende Fragen:

Kann man ein Schema umbenennen? Dann bràuchte ich keine Daten zu
verschieben.

Kann ich die Datenbank sichern und nur eine Tabelle in ein anderes
Schema wiederherstellen?

Ich könnte die Datenbank auf einen anderen Server kopieren und dort
die Massen-Inserts durchlaufen lassen, aber auch dann stellt sich die
Frage, wie kann ich einzelne Tabellen in eine vorhandene Datenbank
hinein wiederherstellen?

Könnte man den Insert-Prozess mit niedriger Prioritàt laufen lassen,
es darf ruhig ein bisschen lànger dauern, aber der Produktiv-Betrieb
sollte nicht beeintràchtigt werden.

Gruß,

Matthias
 

Lesen sie die antworten

#1 Christoph Muthmann
08/04/2010 - 14:41 | Warnen spam
Matthias Schuppe wrote:
Hallo zusammen,

ich habe eine Datenbank - SQL 2005 - mit einem speziellen
Archivierungs-Konzept, das Schema-weise funktioniert, es gibt
beispielsweise folgende Tabellen:

Archiv2008.Tabelle
Archiv2009.Tabelle
Archiv.Tabelle
dbo.Tabelle

In Wirklichkeit sind das mehrere Tabellen mit jeweils einigen
Millionen Datensàtzen. Ich muss nun die Daten von "Archiv.Tabelle" in
"Archiv2009.Tabelle" verschieben, hab' ich so versucht:

INSERT INTO Archiv2009.Tabelle (
Feld1,
Feld2,
Feld3,
...)
SELECT Feld1,
Feld2,
Feld3,
...
FROM Archiv.Tabelle

Das funktioniert auch, aber wohl nicht, wenn die Datenbank im
Produktiv-Betrieb ist, dann nimmt der INSERT-Prozess so viele
Ressourcen, dass andere Ablàufe nicht mehr funktionieren bzw. ins
Timeout laufen. Also habe ich die Feiertage für das Daten Umschaufeln
genutzt, hat auch geklappt, aber leider hat die Zeit nicht
ausgereicht.

Nun habe ich folgende Fragen:

Kann man ein Schema umbenennen? Dann bràuchte ich keine Daten zu
verschieben.

Kann ich die Datenbank sichern und nur eine Tabelle in ein anderes
Schema wiederherstellen?

Ich könnte die Datenbank auf einen anderen Server kopieren und dort
die Massen-Inserts durchlaufen lassen, aber auch dann stellt sich die
Frage, wie kann ich einzelne Tabellen in eine vorhandene Datenbank
hinein wiederherstellen?

Könnte man den Insert-Prozess mit niedriger Prioritàt laufen lassen,
es darf ruhig ein bisschen lànger dauern, aber der Produktiv-Betrieb
sollte nicht beeintràchtigt werden.




Hallo Matthias,
das ist schon sehr speziell.
Eine Alternative wàre Partitionierung der Tabellen.
Eine andere wàre es, diese Aktion in kleinere Transaktionen runter zu
brechen.
Du kannst entsprechend mit
Select top(10000) Feldliste
where Primary_Key_Feld > @meinWert
order by Primary_Key_Feld
arbeiten und dann den zuletzt transferierten Primary Key ermitteln. Damit
werden dann die nàchsten Sàtze übertragen. Das reduziert die Sperren und den
Durchsatz. Falls notwendig, kannst Du auch noch mit
WAITFOR DELAY '00:00:02';
arbeiten.

Es gibt Drittanbieter, wie z. B. Quest (LiteSpeed), die auch den Restore
einzelner Tabellen ermöglichen.

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

Ähnliche fragen