Discussion:
Fortschritt beim Backup/Restore abfragen? (Transact-SQL)
(zu alt für eine Antwort)
Ronny
2008-03-27 14:19:01 UTC
Permalink
Hallo liebe Gemeinde,

ich nutze derzeit den SQL Server 2005. Dort möchte ich über SQL einen Backup
und Restore Prozess implementieren. Beide funktionieren bereits.

Jetzt kam bei mir die Frage auf, ob es nicht möglich ist, während des
Backup-/Restoreprozesses ein Feedback über den aktuellen Fortschritt zu
bekommen?

Den einzigsten Hinweis den ich bisher finden konnte, war das Statement
"STATS" mit dem ich wohl die prozentualen Schritte angeben kann, in denen ein
Feedback aktualisiert wird. Jetzt stellt sich mir nur die Frage, wie ich und
in welcher Form ich ein Feedback vom Server bekommen kann?

Mein Programm ist derzeit in C++ implementiert und kommuniziert über ADO mit
der Datenbank.

Für Hinweise bin ich dankbar.
MFG,
Ronny
Elmar Boye
2008-03-27 19:08:33 UTC
Permalink
Hallo Ronny,
Post by Ronny
ich nutze derzeit den SQL Server 2005. Dort möchte ich über SQL einen Backup
und Restore Prozess implementieren. Beide funktionieren bereits.
Jetzt kam bei mir die Frage auf, ob es nicht möglich ist, während des
Backup-/Restoreprozesses ein Feedback über den aktuellen Fortschritt zu
bekommen?
Den einzigsten Hinweis den ich bisher finden konnte, war das Statement
"STATS" mit dem ich wohl die prozentualen Schritte angeben kann, in denen ein
Feedback aktualisiert wird.
STATS ist im Prinzip schon richtig.
Post by Ronny
Jetzt stellt sich mir nur die Frage, wie ich und in welcher Form ich ein
Feedback vom Server bekommen kann?
Mein Programm ist derzeit in C++ implementiert und kommuniziert über ADO mit
der Datenbank.
Das Problem ist an die gelieferte Information ranzukommen:
<URL:http://support.microsoft.com/kb/301667>
"PRB: Asynchronous Fetching Is Not Available with OLE DB"
weist darauf hin und gilt bei ADO als Wrapper für Ole Db ebenso.

Für SQL Server 2005 gilt das äquivalent, so dass man die Informationen
nur mit nativem ODBC und bzw. SQL-SMO bekommt, alle anderen liefern
die Informationsmeldungen erst zum Schluß (wenns nichts mehr nützt).

Auf SMO hatte ich Dich AFAIK schon hingewiesen, dort wäre es das
PercentComplete Ereignis:
<URL:http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.percentcomplete.aspx>

Der nutzt ein Feature des SqlClient (ab NET 2.0), wo die SqlConnection,
eine Eigenschaft FireInfoMessageEventOnUserErrors besitzt, die solche
Meldungen direkt aus dem TDS Stream zurückliefert (Standard ist da
auch da Verhalten von OleDb).

Also müßtest Du ggf. die Nutzung von ADO überlegen.
Denn anscheinend hat sich das beim Native Client nicht geändert:
<URL:http://msdn2.microsoft.com/en-us/library/ms131350.aspx>
(STATS verwendet 3211/Severity 10 und fällt in die Kategorie)

Gruß Elmar
Ronny
2008-03-28 10:32:03 UTC
Permalink
Danke für die Infos.

Bei SMO hab ich das Problem, dass ich es nicht in mein VS Projekt
eingebunden bekomm. Hab sowohl den Assembly Verweis gesetzt, als auch das
Headerverzeichnis eingebunden.

In der meisten Literatur find ich immer nur Beispiele zur Benutzung mit C#
oder ähnlichem. Gibt es irgendwo eine Anleitung wie ich die SMO Libs in ein
Visual Studio 2005 C++ Konsolenprojekt einbinden kann?

Ich hab es noch über #import versucht (so wie ich es bei Ado mache), bekomm
aber immer die Meldung:
fatal error C1083: Cannot open type library file: 'c:\program
files\microsoft sql server\90\sdk\assemblies\microsoft.sqlserver.smo.dll':
Fehler beim Laden der Typbibliothek/DLL.

Also nehm ich mal an, dass es auf diesem Wege wohl nicht so einfach
funktioniert. Irgendwie seh ich da im Visual Studio auch noch nicht so
wirklich durch.

Für Tipps bin ich offen und vielen Dank schonmal.

MFG,
Ronny
Elmar Boye
2008-03-28 12:38:21 UTC
Permalink
Hallo Ronny,
Post by Ronny
Bei SMO hab ich das Problem, dass ich es nicht in mein VS Projekt
eingebunden bekomm. Hab sowohl den Assembly Verweis gesetzt, als auch das
Headerverzeichnis eingebunden.
Mit einem CLR Konsolen-Projekt gehen, die Assemblies unter References
einbinden wie in:
<URL:http://msdn2.microsoft.com/en-us/library/ms162166.aspx>

Daraus habe ich mal ein (mein erstes) VS 2005 C++ Konsolenprojekt gebastelt,
acverkürzt von oben dafür mit PercentComplete.

// VCSqlSmo.cpp : main project file.
#include "stdafx.h"

using namespace System;
using namespace Microsoft::SqlServer::Management::Common;
using namespace Microsoft::SqlServer::Management::Smo;

ref class BackupEventHandler
{
public:
void OnPercentComplete(System::Object ^sender, PercentCompleteEventArgs^ e)
{
Console::WriteLine(L"Backup {0} % done.", e->Percent);
}
};

int main(array<System::String ^> ^args)
{
Server ^server = gcnew Server(L".\\SQL2005");
Database ^database = server->Databases[L"AdventureWorks"];

Backup ^backup = gcnew Backup();
backup->Action = BackupActionType::Database;
backup->BackupSetDescription = L"Adventureworks Backup";
backup->BackupSetName = L"AdventureWorks Backup";
backup->Database = L"AdventureWorks";
backup->Incremental = false;

BackupDeviceItem ^deviceItem = gcnew BackupDeviceItem(
System::String::Format(
"AdventureBackup_{0:yyyyMMddHHmmSS}.bkf",
System::DateTime::Now),
DeviceType::File);
backup->Devices->Add(deviceItem);

BackupEventHandler^ handler = gcnew BackupEventHandler();
backup->PercentCompleteNotification = 5;
backup->PercentComplete += gcnew PercentCompleteEventHandler(
handler, &BackupEventHandler::OnPercentComplete);

backup->SqlBackup(server);
return 0;
}

Solltest Du noch Schwierigkeiten haben, kann ich das Mini-Projekt
als Download bereitstellen.

Gruß Elmar
Ronny
2008-03-28 13:00:00 UTC
Permalink
Hallo,

danke erstmal für deine Geduld. :-)

Ich hab versucht die Verweise wie in
Post by Elmar Boye
<URL:http://msdn2.microsoft.com/en-us/library/ms162166.aspx>
beschrieben, einzubinden.

Im Menü "Project" gibt es gar kein "Add References". Ich muss sind "Project
Properties" und dort unter "Configuration Properties" -> "Linker" die
Verzeichnisse bei "Additional Library Directories" eintragen.

Bei
using namespace Microsoft::SqlServer::Management::Common;

kommt dann der Fehler, dass er es nicht finden kann.
error C2653: 'Microsoft' : is not a class or namespace name

Kann ich das noch irgendwie anders einbinden?

MFG,
Ronny
Elmar Boye
2008-03-28 14:21:11 UTC
Permalink
Hallo Ronny,
Post by Ronny
Ich hab versucht die Verweise wie in
Post by Elmar Boye
<URL:http://msdn2.microsoft.com/en-us/library/ms162166.aspx>
beschrieben, einzubinden.
Im Menü "Project" gibt es gar kein "Add References".
Das findest Du entweder im Kontextmenü des Projekts als "References..."
bzw. über das Projekt Menü
oder über über Properties -> Common Properties->References.
Post by Ronny
Bei
using namespace Microsoft::SqlServer::Management::Common;
Ohne die zusätzlichen Assemblies ist das zu erwarten.
Post by Ronny
kommt dann der Fehler, dass er es nicht finden kann.
error C2653: 'Microsoft' : is not a class or namespace name
Damit Du schneller zum Ergebnis kommst, habe ich das Projekt abgelegt unter

<URL:http://www.elmarboye.de/download/VCSqlSmo.zip>

Da das Thema hier ziemlich Off-Topic ist als Hinweis.
Für VC++ NET gibt es eine eigene Newsgroup:
<news://msnews.microsoft.com/microsoft.public.de.german.entwickler.dotnet.vc>
wo man Dir zu .NET <-> C++ managed weiterhelfen sollte.

(Denn ich bin zwar in C#, VB.NET ganz gut, bei C++ managed müßte ich
aber viel zusammensuchen, da ich C++ zuletzt vor etwa 10 Jahren
und Unix gebraucht habe.)

Wenn es wiederum ums Framework bzw. SQL Server SMO geht kannst Du
Fragen dazu in
<news://msnews.microsoft.com/microsoft.public.de.german.entwickler.dotnet.framework>
bzw.
<news://msnews.microsoft.com/microsoft.public.de.german.entwickler.dotnet.datenbank>
stellen, dort schaue ich regelmäßig rein.

Gruß Elmar
Ronny
2008-03-28 15:25:00 UTC
Permalink
Vielen Dank.

Es lag einfach daran, dass ich in meinem Projekt keine /clr aktiviert hatte.

MFG, Ronny

Loading...