Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server – Linux
In diesem Artikel werden die Schnittstellen beschrieben, die vom VDI-Client SDK (Client SDK für Schnittstellen virtueller Geräte) bereitgestellt werden.
Hinweis
Für SQL Server 2022 (16.x) unter Linux können Sie stattdessen eine Sicherung einer Transact-SQL-Momentaufnahme erstellen.
Unabhängige Softwarehersteller können mit der API für virtuelle Sicherungsmedien SQL Server in ihre eigenen Produkte integrieren. Das Verhalten von VDI für Linux ähnelt dem von VDI für Windows. Folgende Unterschiede müssen jedoch beachtet werden:
- Anstelle des gemeinsam verwendeten Windows-Speichers wird der gemeinsam verwendete POSIX-Speicher genutzt.
- Anstelle von Windows-Semaphoren werden POSIX-Sempahore verwendet.
- Anstelle von Windows-Typen wie
HRESULT
undDWORD
werden die entsprechenden Integertypen verwendet. - Die COM-Schnittstellen wurden entfernt und durch C++-Klassen ersetzt.
- SQL Server für Linux unterstützt keine benannten Instanzen. Verweise auf Instanznamen wurden daher entfernt.
- Die freigegebene Bibliothek wird implementiert in
libsqlvdi.so
, installiert unter/opt/mssql/lib/libsqlvdi.so
.
Dieser Artikel ist eine Ergänzung zur VDI-Referenz (Virtual Device Interface), in der die SQL Server VDI-Spezifikationen unter Windows beschrieben werden.
Ein Beispiel für eine VDI-Sicherungslösung finden Sie im GitHub-Repository für SQL Server-Beispiele.
Einrichten der Benutzerberechtigungen
Unter Linux sind primitive POSIX-Typen dem Benutzer, der sie erstellt, und ihrer Standardgruppe zugeordnet. Im Fall von Objekten, die von SQL Server erstellt werden, sind diese standardmäßig dem mssql
-Benutzer und der mssql
-Gruppe zugeordnet. Damit diese Typen gemeinsam von SQL Server und dem VDI-Client verwendet werden können, empfiehlt sich eine der folgenden Methoden:
Führen Sie den VDI-Client als Benutzer
mssql
aus.Führen Sie den folgenden Befehl aus, um zum Benutzer
mssql
zu wechseln:sudo su mssql
Fügen Sie den Benutzer
mssql
der Gruppevdiuser
und den Benutzervdiuser
zur Gruppemssql
hinzu.Führen Sie die folgenden Befehle aus:
sudo useradd vdiuser sudo usermod -a -G mssql vdiuser sudo usermod -a -G vdiuser mssql
Starten Sie den Server neu, damit die neuen Gruppen für SQL Server und
vdiuser
übernommen werden.
Clientfunktionen
In diesem Abschnitt werden die einzelnen Clientfunktionen beschrieben. Die Beschreibungen enthalten die folgenden Informationen:
- Zweck der Funktion
- Funktionssyntax
- Parameterliste
- Rückgabewerte
- Bemerkungen
ClientVirtualDeviceSet::Create
Zweck
Diese Funktion erstellt die Gruppe virtueller Geräte.
Syntax
int ClientVirtualDeviceSet::Create (
char * name, // name for the set
VDConfig * cfg // configuration for the set
);
Parameter | Argument | Erklärung |
---|---|---|
name | Mit diesem Argument wird die Gruppe virtueller Geräte identifiziert. Die Benennungsregeln, die von CreateFileMapping() verwendet werden, müssen beachtet werden. Jedes Zeichen außer dem umgekehrten Schrägstrich (\ ) kann verwendet werden. Bei dem Argument handelt sich um eine Zeichenfolge. Es wird empfohlen, der Zeichenfolge den Produkt- oder Firmennamen des Benutzers und den Datenbanknamen voranzustellen. |
|
cfg | Dieses Argument ist die Konfiguration für die Gruppe virtueller Geräte. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Funktion wurde erfolgreich ausgeführt. | |
VD_E_NOTSUPPORTED | Mindestens ein Feld in der Konfiguration war ungültig oder wurde nicht unterstützt. | |
VD_E_PROTOCOL | Die Gruppe virtueller Geräte ist bereits vorhanden. |
Bemerkungen
Die Create
-Methode sollte nur einmal pro BACKUP
- oder RESTORE
-Vorgang aufgerufen werden. Nachdem die Close
-Methode aufgerufen wurde, kann der Client die Schnittstelle wiederverwenden, um eine weitere Gruppe virtueller Geräte zu erstellen.
ClientVirtualDeviceSet::GetConfiguration
Zweck
Diese Funktion wird verwendet, um solange zu warten, bis der Server die Gruppe virtueller Geräte konfiguriert hat.
Syntax
int ClientVirtualDeviceSet::GetConfiguration (
time_t timeout, // in milliseconds
VDConfig * cfg // selected configuration
);
Parameter | Argument | Erklärung |
---|---|---|
timeout | Mit diesem Argument wird der Timeout in Millisekunden angegeben. Mit INFINITE oder einer negativen ganzen Zahl können Sie einen Timeout verhindern. |
|
cfg | Wenn die Ausführung erfolgreich ist, enthält dieses Argument die vom Server ausgewählte Konfiguration. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Konfiguration wurde zurückgegeben. | |
VD_E_ABORT | SignalAbort wurde aufgerufen. |
|
VD_E_TIMEOUT | Bei der Funktionsausführung ist ein Timeout aufgetreten. |
Bemerkungen
Diese Funktion wird im Alertable
-Zustand blockiert. Nach dem erfolgreichen Aufruf können die Geräte in der Gruppe virtueller Geräte geöffnet werden.
ClientVirtualDeviceSet::OpenDevice
Zweck
Diese Funktion öffnet eines der Geräte in der Gruppe virtueller Geräte.
Syntax
int ClientVirtualDeviceSet::OpenDevice (
char * name, // name for the set
ClientVirtualDevice ** ppVirtualDevice // returns interface to device
);
Parameter | Argument | Erklärung |
---|---|---|
name | Mit diesem Argument wird die Gruppe virtueller Geräte identifiziert. | |
ppVirtualDevice | Wenn die Funktion erfolgreich ausgeführt wird, wird ein Zeiger auf das virtuelle Gerät zurückgegeben. Dieses Gerät wird für GetCommand und CompleteCommand verwendet. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Funktion wurde erfolgreich ausgeführt. | |
VD_E_ABORT | Ein Abbruch wurde angefordert. | |
VD_E_OPEN | Alle Geräte sind geöffnet. | |
VD_E_PROTOCOL | Die Gruppe befindet sich nicht im Initialisierungszustand, oder das Gerät ist bereits geöffnet. | |
VD_E_INVALID | Der Gerätename ist ungültig. Er lässt sich keinem Gerät der Gruppe zuordnen. |
Bemerkungen
VD_E_OPEN
kann ohne Problem zurückgegeben werden. Der Client kann OpenDevice
mithilfe einer Schleife aufrufen, bis dieser Code zurückgegeben wird.
Wenn mehr als ein Gerät konfiguriert ist (z. B. n Geräte), werden von der Gruppe virtueller Geräte n eindeutige Geräteschnittstellen zurückgegeben.
Die GetConfiguration
-Funktion kann verwendet werden, um solange zu warten, bis sich die Geräte öffnen lassen.
Wenn diese Funktion nicht erfolgreich ausgeführt wird, wird ein NULL-Wert über ppVirtualDevice
zurückgegeben.
ClientVirtualDevice::GetCommand
Zweck
Mit dieser Funktion wird der nächste Befehl abgerufen, der sich in der Warteschlange des Geräts befindet. Wenn diese Funktion aufgerufen wird, wartet sie auf den nächsten Befehl.
Syntax
int ClientVirtualDevice::GetCommand (
time_t timeout, // time-out in milliseconds
VDC_Command** ppCmd // returns the next command
);
Parameter | Argument | Erklärung |
---|---|---|
timeout | Mit diesem Argument wird die Wartezeit in Millisekunden angegeben. Verwenden Sie INFINITE , um unbegrenzt zu warten. Mit 0 rufen Sie einen Befehl ab. VD_E_TIMEOUT wird zurückgegeben, wenn aktuell kein Befehl verfügbar ist. Wenn der Timeout auftritt, entscheidet der Client, welche Aktion als Nächstes ausgeführt wird. |
|
Timeout | Mit diesem Argument wird die Wartezeit in Millisekunden angegeben. Mit INFINITE oder einem negativen Wert legen Sie eine unbegrenzte Wartezeit fest. Mit 0 rufen Sie einen Befehl ab. VD_E_TIMEOUT wird zurückgegeben, wen kein Befehl vor Ablauf des Timeouts verfügbar ist. Wenn der Timeout auftritt, entscheidet der Client, welche Aktion als Nächstes ausgeführt wird. |
|
ppCmd | Wenn ein Befehl erfolgreich zurückgegeben wird, gibt der Parameter die Adresse eines auszuführenden Befehls zurück. Der zurückgegebene Speicher ist schreibgeschützt. Nachdem der Befehl abgeschlossen wurde, wird dieser Zeiger der CompleteCommand -Routine übergeben. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Ein Befehl wurde abgerufen. | |
VD_E_CLOSE | Das Gerät wurde vom Server geschlossen. | |
VD_E_TIMEOUT | Es war kein Befehl verfügbar, und der Timeout ist abgelaufen. | |
VD_E_ABORT | Der Client oder Server hat mit SignalAbort das Herunterfahren erzwungen. |
Bemerkungen
Wenn VD_E_CLOSE
zurückgegeben wird, hat SQL Server das Gerät geschlossen. Dieser Vorgang findet während des regulären Herunterfahrens statt. Nachdem alle Geräte geschlossen wurden, ruft der Client ClientVirtualDeviceSet::Close
auf, um die Gruppe virtueller Geräte zu schließen.
Wenn diese Routine blockiert werden muss, um auf einen Befehl zu warten, wird der Thread in den Alertable
-Zustand versetzt.
ClientVirtualDevice::CompleteCommand
Zweck
Mit dieser Funktion wird SQL Server benachrichtigt, dass ein Befehl abgeschlossen wurde. Für den Befehl sollten geeignete Abschlussinformationen zurückgegeben werden.
Syntax
int ClientVirtualDevice::CompleteCommand (
VDC_Command pCmd, // the command
int completionCode, // completion code
unsigned long bytesTransferred, // bytes transferred
int64_t position // current position
);
Parameter | Argument | Erklärung |
---|---|---|
pCmd | Mit diesem Argument wird die Adresse eines Befehls angegeben, der vorher von ClientVirtualDevice::GetCommand zurückgegeben wurde. |
|
completionCode | Mit diesem Argument wird ein Statuscode angegeben, der auf den Abschlussstatus hinweist. Dieser Parameter muss für alle Befehle zurückgegeben werden. Der zurückgegebene Code sollte für den Befehl geeignet sein, der ausgeführt wird. ERROR_SUCCESS wird immer verwendet, um einen erfolgreich ausgeführten Befehl anzugeben. Eine vollständige Liste der Codes finden Sie in der Datei vdierror.h . |
|
bytesTransferred | Mit diesem Argument wird die Anzahl der erfolgreich übertragenen Bytes angegeben. Dieses Argument wird nur für die Datenübertragungsbefehle Read und Write zurückgegeben. |
|
position | Mit diesem Argument wird ausschließlich eine Antwort für den GetPosition -Befehl angegeben. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Der Abschluss wurde korrekt erfasst. | |
VD_E_INVALID | pCmd war kein aktiver Befehl. |
|
VD_E_ABORT | Abort wurde signalisiert. |
|
VD_E_PROTOCOL | Das Gerät ist nicht geöffnet. |
Bemerkungen
Keine
ClientVirtualDeviceSet::SignalAbort
Zweck
Mit dieser Funktion wird angegeben, dass ein Vorgang unplanmäßig beendet werden soll.
Syntax
int ClientVirtualDeviceSet::SignalAbort ();
Parameter | Argument | Erklärung |
---|---|---|
Keine | Nicht verfügbar |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Abort -Benachrichtigung wurde erfolgreich bereitgestellt. |
Bemerkungen
Der Client kann jederzeit den Vorgang BACKUP
oder RESTORE
abbrechen. Mit dieser Routine wird angegeben, dass alle Vorgänge beendet werden sollen. Die gesamte Gruppe virtueller Geräte wird in den Zustand Abnormally Terminated
versetzt. Von Geräten werden keine weiteren Befehle zurückgegeben. Alle nicht abgeschlossenen Befehle werden automatisch abgeschlossen. Als Abschlusscode wird ERROR_OPERATION_ABORTED
zurückgegeben. Sobald der Client ausstehende Vorgänge zur Verwendung von Clientpuffern sicher beendet, sollte er ClientVirtualDeviceSet::Close
aufrufen.
ClientVirtualDeviceSet::Close
Zweck
Diese Funktion schließt die Gruppe virtueller Geräte, die von ClientVirtualDeviceSet::Create
erstellt wurde. Dadurch werden alle Ressourcen freigegeben, die der Gruppe virtueller Geräte zugeordnet sind.
Syntax
int ClientVirtualDeviceSet::Close ();
Parameter | Argument | Erklärung |
---|---|---|
Keine | Nicht verfügbar |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Dieses Argument wird zurückgegeben, wenn die Gruppe virtueller Geräte erfolgreich geschlossen wurde. | |
VD_E_PROTOCOL | Es wurde keine Aktion ausgeführt, weil die Gruppe virtueller Geräte nicht geöffnet war. | |
VD_E_OPEN | Die Geräte waren noch geöffnet. |
Bemerkungen
Wenn der Client Close
aufruft, wird damit darauf hingewiesen, dass alle Ressourcen, die von der Gruppe virtueller Geräte genutzt werden, freigegeben werden sollten. Der Client muss sicherstellen, dass alle Aktivitäten, die Datenpuffer und virtuelle Geräte betreffen, vor dem Aufrufen von Close
beendet werden. Dies liegt daran, dass durch OpenDevice
sämtliche von Close
zurückgegebenen Schnittstellen virtueller Geräte ungültig werden.
Nach der Rückgabe des Create
-Aufrufs hat der Client die Möglichkeit, einen Close
-Aufruf an die Schnittstelle für die Gruppe virtueller Geräte zu senden. Durch einen solchen Aufruf wird eine Gruppe virtueller Geräte für einen nachfolgenden BACKUP
- oder RESTORE
-Vorgang erstellt.
Wenn Close
aufgerufen wird und noch mindestens ein virtuelles Gerät geöffnet ist, wird VD_E_OPEN
zurückgegeben. In diesem Fall wird SignalAbort
intern ausgelöst, um nach Möglichkeit ein ordnungsgemäßes Herunterfahren zu gewährleisten. Dabei werden VDI-Ressourcen freigegeben. Der Client sollte auf einen VD_E_CLOSE
-Hinweis auf jedem Gerät warten, bevor er ClientVirtualDeviceSet::Close
aufruft. Wenn dem Client bekannt ist, dass sich die Gruppe virtueller Geräte bereits im Zustand Abnormally Terminated
befindet, sollte der Client nicht annehmen, dass die Angabe VD_E_CLOSE
von GetCommand
übermittelt wird. Der Client hat die Möglichkeit, ClientVirtualDeviceSet::Close
aufzurufen, sobald die Aktivität im Zusammenhang mit den gemeinsam verwendeten Puffern beendet wird.
ClientVirtualDeviceSet::OpenInSecondary
Zweck
Mit dieser Funktion wird die Gruppe virtueller Geräte auf einem sekundären Client geöffnet. Der primäre Client muss vorher bereits Create
und GetConfiguration
verwendet haben, um die Gruppe virtueller Geräte einzurichten.
Syntax
int ClientVirtualDeviceSet::OpenInSecondary (
char * setName // name of the set
);
Parameter | Argument | Erklärung |
---|---|---|
setName | Mit diesem Argument wird die Gruppe identifiziert. Die Groß-/Kleinschreibung dieses Namens wird beachtet. Der Name muss außerdem mit dem Namen übereinstimmen, der vom primären Client beim Aufruf von ClientVirtualDeviceSet::Create verwendet wurde. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Funktion wurde erfolgreich ausgeführt. | |
VD_E_PROTOCOL | Die Gruppe virtueller Geräte wurde noch nicht erstellt, wurde bereits auf diesem Client geöffnet oder akzeptiert keine Öffnungsanforderungen von sekundären Clients. | |
VD_E_ABORT | Der Vorgang wird abgebrochen. |
Hinweise: Wenn ein Modell mit mehreren Prozessen genutzt wird, ist der primäre Client dafür verantwortlich, eine planmäßige und unplanmäßige Beendigung der sekundären Clients zu erkennen.
ClientVirtualDeviceSet::GetBufferHandle
Zweck
Für einige Anwendungen sind möglicherweise mehrere Prozesse erforderlich, damit Puffer verarbeitet werden können, die von ClientVirtualDevice::GetCommand
zurückgegeben werden. In solchen Fällen kann der Prozess, der den Befehl empfängt, GetBufferHandle
verwenden, um ein prozessunabhängiges Handle abzurufen, das den Puffer identifiziert. Dieses Handle kann dann jedem Prozess übergeben werden, für den dieselbe Gruppe virtueller Geräte geöffnet ist. Dieser Vorgang würde dann ClientVirtualDeviceSet::MapBufferHandle
zum Abrufen der Adresse des Puffers verwenden. Bei der Adresse handelt es sich wahrscheinlich um eine andere Adresse als die im zugehörigen Partnerprozess, da jeder Prozess verschiedene Adressen verwenden kann, um Puffer zuzuordnen.
Syntax
int ClientVirtualDeviceSet::GetBufferHandle (
uint8_t* pBuffer, // in: buffer address
unsigned int* pBufferHandle // out: buffer handle
);
Parameter | Argument | Erklärung |
---|---|---|
pBuffer | Mit diesem Argument wird die Adresse eines Puffers angegeben, der von einem Read oder Write -Befehl abgerufen wird. |
|
BufferHandle | Ein eindeutiger Bezeichner für den Puffer wird zurückgegeben. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Funktion wurde erfolgreich ausgeführt. | |
VD_E_PROTOCOL | Die Gruppe virtueller Geräte ist aktuell nicht geöffnet. | |
VD_E_INVALID | Der pBuffer ist keine gültige Adresse. |
Bemerkungen
Der Prozess, der die Funktion GetBufferHandle
aufruft, ist auch für den Aufruf von ClientVirtualDevice::CompleteCommand
verantwortlich, nachdem die Datenübertragung abgeschlossen wurde.
ClientVirtualDeviceSet::MapBufferHandle
Zweck
Mit dieser Funktion wird eine Adresse eines gültigen Puffers aus einem Pufferhandle abgerufen, das wiederum aus einem anderen Prozess abgerufen wurde.
Syntax
int ClientVirtualDeviceSet::MapBufferHandle (
int dwBuffer, // in: buffer handle
uint8_t** ppBuffer // out: buffer address
);
Parameter | Argument | Erklärung |
---|---|---|
dwBuffer | Dies ist das von ClientVirtualDeviceSet::GetBufferHandle zurückgegebene Handle. |
|
ppBuffer | Mit diesem Argument wird die Adresse des Puffers angegeben, der im aktuellen Prozess gültig ist. |
Rückgabewerte | Argument | Erklärung |
---|---|---|
NOERROR | Die Funktion wurde erfolgreich ausgeführt. | |
VD_E_PROTOCOL | Die Gruppe virtueller Geräte ist aktuell nicht geöffnet. | |
VD_E_INVALID | ppBuffer ist ein ungültiges Handle. |
Bemerkungen
Achten Sie auf die korrekte Kommunikation der Handles. da sie für eine einzelne Gruppe virtueller Geräte nur lokal verfügbar sind. Die Partnerprozesse, die ein Handle gemeinsam nutzen, müssen sicherstellen, dass Pufferhandles nur innerhalb des Bereichs der Gruppe virtueller Geräte verwendet werden, aus dem der Puffer ursprünglich abgerufen wurde.