Bagikan melalui


Spesifikasi SQL Server pada SDK klien Linux VDI

Berlaku untuk:SQL Server di Linux

Artikel ini membahas antarmuka yang disediakan oleh SQL Server di SDK klien antarmuka perangkat virtual (VDI) Linux.

Catatan

Untuk SQL Server 2022 (16.x) di Linux, Anda dapat membuat cadangan rekam jepret Transact-SQL sebagai gantinya.

Vendor perangkat lunak independen (ISV) dapat menggunakan antarmuka pemrograman aplikasi (API) Perangkat Cadangan Virtual untuk mengintegrasikan SQL Server ke dalam produk mereka. Secara umum, VDI di Linux berulah mirip dengan VDI di Windows dengan perubahan berikut:

  • Memori berbagi Windows menjadi memori bersama POSIX.
  • Semaphores Windows menjadi posix semaphores.
  • Jenis Windows seperti HRESULT dan DWORD diubah menjadi setara bilangan bulat.
  • Antarmuka COM dihapus dan diganti dengan sepasang kelas C++.
  • SQL Server di Linux tidak mendukung instans bernama, sehingga referensi ke nama instans telah dihapus.
  • Pustaka bersama diimplementasikan di libsqlvdi.so, diinstal di /opt/mssql/lib/libsqlvdi.so.

Artikel ini adalah referensi addendum ke Antarmuka perangkat virtual (VDI) yang merinci Spesifikasi VDI SQL Server di Windows.

Tinjau juga contoh solusi cadangan VDI pada repositori GitHub Sampel SQL Server.

Penyetelan izin pengguna

Di Linux, primitif POSIX dimiliki oleh pengguna yang membuatnya dan grup default mereka. Untuk objek yang dibuat oleh SQL Server, objek ini dimiliki oleh mssql pengguna dan mssql grup secara default. Untuk mengizinkan berbagi antara SQL Server dan klien VDI, salah satu dari dua metode berikut disarankan:

  1. Jalankan klien VDI sebagai mssql pengguna.

    Jalankan perintah berikut untuk beralih ke mssql pengguna:

    sudo su mssql
    
  2. mssql Tambahkan pengguna ke vdiuser grup, dan vdiuser pengguna ke mssql grup.

    Jalankan perintah berikut:

    sudo useradd vdiuser
    sudo usermod -a -G mssql vdiuser
    sudo usermod -a -G vdiuser mssql
    

    Mulai ulang server untuk mengambil grup baru untuk SQL Server dan vdiuser.

Fungsi klien

Bagian ini berisi deskripsi setiap fungsi klien. Deskripsinya mencakup informasi berikut:

  • Tujuan fungsi
  • Sintaksis fungsi
  • Daftar parameter
  • Mengembalikan nilai
  • Keterangan

ClientVirtualDeviceSet::Create

Tujuan

Fungsi ini membuat set perangkat virtual.

Sintaks

int ClientVirtualDeviceSet::Create (
    char     *    name,    // name for the set
    VDConfig *    cfg      // configuration for the set
);
Parameter Argumen Penjelasan
nama Ini mengidentifikasi set perangkat virtual. Aturan untuk nama yang digunakan oleh CreateFileMapping() harus diikuti. Karakter apa pun kecuali garis miring terbalik (\) mungkin digunakan. Ini adalah string karakter. Disarankan untuk memberi awalan string dengan nama produk atau perusahaan dan nama database pengguna.
cfg Ini adalah konfigurasi untuk set perangkat virtual.
Mengembalikan nilai Argumen Penjelasan
NOERROR Fungsi berhasil.
VD_E_NOTSUPPORTED Satu atau beberapa bidang dalam konfigurasi tidak valid atau tidak didukung.
VD_E_PROTOCOL Set perangkat virtual sudah ada.

Keterangan

Metode Create harus dipanggil hanya sekali per BACKUP atau RESTORE operasi. Setelah memanggil Close metode , klien dapat menggunakan kembali antarmuka untuk membuat set perangkat virtual lain.

ClientVirtualDeviceSet::GetConfiguration

Tujuan

Fungsi ini digunakan untuk menunggu server mengonfigurasi set perangkat virtual.

Sintaks

int ClientVirtualDeviceSet::GetConfiguration (
    time_t        timeout,    // in milliseconds
    VDConfig *    cfg         // selected configuration
);
Parameter Argumen Penjelasan
Timeout Ini adalah waktu habis dalam milidetik. Gunakan INFINITE atau bilangan bulat negatif apa pun untuk mencegah waktu habis.
cfg Setelah eksekusi berhasil, ini berisi konfigurasi yang dipilih oleh server.
Mengembalikan nilai Argumen Penjelasan
NOERROR Konfigurasi dikembalikan.
VD_E_ABORT SignalAbort dipanggil.
VD_E_TIMEOUT Waktu fungsi habis.

Keterangan

Fungsi ini memblokir dalam keadaan Alertable . Setelah pemanggilan berhasil, perangkat dalam set perangkat virtual mungkin dibuka.

ClientVirtualDeviceSet::OpenDevice

Tujuan

Fungsi ini membuka salah satu perangkat dalam set perangkat virtual.

Sintaks

int ClientVirtualDeviceSet::OpenDevice (
    char                *     name,              // name for the set
    ClientVirtualDevice **    ppVirtualDevice    // returns interface to device
);
Parameter Argumen Penjelasan
nama Ini mengidentifikasi set perangkat virtual.
ppVirtualDevice Ketika fungsi berhasil, penunjuk ke perangkat virtual dikembalikan. Perangkat ini digunakan untuk GetCommand dan CompleteCommand.
Mengembalikan nilai Argumen Penjelasan
NOERROR Fungsi berhasil.
VD_E_ABORT Pembatalan diminta.
VD_E_OPEN Semua perangkat terbuka.
VD_E_PROTOCOL Set tidak dalam status inisialisasi atau perangkat tertentu ini sudah terbuka.
VD_E_INVALID Nama perangkat tidak valid. Ini bukan salah satu nama yang diketahui terdiri dari set.

Keterangan

VD_E_OPEN mungkin dikembalikan tanpa masalah. Klien mungkin memanggil OpenDevice dengan cara perulangan hingga kode ini dikembalikan. Jika lebih dari satu perangkat dikonfigurasi, misalnya n perangkat, set perangkat virtual mengembalikan n antarmuka perangkat unik.

Fungsi GetConfiguration ini dapat digunakan untuk menunggu hingga perangkat dapat dibuka.

Jika fungsi ini tidak berhasil, maka nilai null dikembalikan melalui ppVirtualDevice.

ClientVirtualDevice::GetCommand

Tujuan

Fungsi ini digunakan untuk mendapatkan perintah berikutnya yang diantrekan ke perangkat. Ketika diminta, fungsi ini menunggu perintah berikutnya.

Sintaks

int ClientVirtualDevice::GetCommand (
    time_t           timeout,    // time-out in milliseconds
    VDC_Command**    ppCmd       // returns the next command
);
Parameter Argumen Penjelasan
Timeout Ini adalah waktu untuk menunggu, dalam milidetik. Gunakan INFINITE untuk menunggu tanpa batas waktu. Gunakan 0 untuk melakukan polling untuk perintah. VD_E_TIMEOUT dikembalikan jika saat ini tidak ada perintah yang tersedia. Jika waktu habis terjadi, klien memutuskan tindakan berikutnya.
Timeout Ini adalah waktu untuk menunggu, dalam milidetik. Gunakan INFINITE atau nilai negatif untuk menunggu tanpa batas waktu. Gunakan 0 untuk melakukan polling untuk perintah. VD_E_TIMEOUT dikembalikan jika tidak ada perintah yang tersedia sebelum batas waktu berakhir. Jika waktu habis terjadi, klien memutuskan tindakan berikutnya.
ppCmd Ketika perintah berhasil dikembalikan, parameter mengembalikan alamat perintah untuk dijalankan. Memori yang dikembalikan bersifat baca-saja. Ketika perintah selesai, pointer ini diteruskan ke CompleteCommand rutinitas.
Mengembalikan nilai Argumen Penjelasan
NOERROR Perintah diambil.
VD_E_CLOSE Perangkat telah ditutup oleh server.
VD_E_TIMEOUT Tidak ada perintah yang tersedia dan waktu habis kedaluwarsa.
VD_E_ABORT Klien atau server telah menggunakan SignalAbort untuk memaksa pematian.

Keterangan

Ketika VD_E_CLOSE dikembalikan, SQL Server telah menutup perangkat. Ini adalah bagian dari pematian normal. Setelah semua perangkat ditutup, klien memanggil ClientVirtualDeviceSet::Close untuk menutup set perangkat virtual. Ketika rutinitas ini harus memblokir untuk menunggu perintah, utas dibiarkan dalam kondisi Alertable .

ClientVirtualDevice::CompleteCommand

Tujuan

Fungsi ini digunakan untuk memberi tahu SQL Server bahwa perintah telah selesai. Informasi penyelesaian yang sesuai untuk perintah harus dikembalikan.

Sintaks

int ClientVirtualDevice::CompleteCommand (
    VDC_Command      pCmd,                // the command
    int              completionCode,      // completion code
    unsigned long    bytesTransferred,    // bytes transferred
    int64_t          position             // current position
);
Parameter Argumen Penjelasan
pCmd Ini adalah alamat perintah yang sebelumnya dikembalikan dari ClientVirtualDevice::GetCommand.
completionCode Ini adalah kode status yang menunjukkan status penyelesaian. Parameter ini harus dikembalikan untuk semua perintah. Kode yang dikembalikan harus sesuai dengan perintah yang sedang dilakukan. ERROR_SUCCESS digunakan dalam semua kasus untuk menunjukkan perintah yang berhasil dijalankan. Untuk daftar lengkap kemungkinan kode, lihat file vdierror.h.
bytesTransferred Ini adalah jumlah byte yang berhasil ditransfer. Ini dikembalikan hanya untuk perintah Read transfer data dan Write.
posisi Ini adalah respons terhadap GetPosition perintah saja.
Mengembalikan nilai Argumen Penjelasan
NOERROR Penyelesaian dicatat dengan benar.
VD_E_INVALID pCmd bukan perintah aktif.
VD_E_ABORT Abort disinyalir.
VD_E_PROTOCOL Perangkat tidak terbuka.

Keterangan

Tidak

ClientVirtualDeviceSet::SignalAbort

Tujuan

Fungsi ini digunakan untuk memberi sinyal bahwa penghentian abnormal harus terjadi.

Sintaks

int ClientVirtualDeviceSet::SignalAbort ();
Parameter Argumen Penjelasan
Tidak Tidak berlaku
Mengembalikan nilai Argumen Penjelasan
NOERROR Pemberitahuan Abort berhasil diposting.

Keterangan

Kapan saja, klien mungkin memilih untuk membatalkan BACKUP operasi atau RESTORE . Rutinitas ini menandakan bahwa semua operasi harus dihentikan. Status set perangkat virtual keseluruhan memasuki status Abnormally Terminated . Tidak ada perintah lebih lanjut yang dikembalikan pada perangkat apa pun. Semua perintah yang belum selesai secara otomatis diselesaikan, dikembalikan ERROR_OPERATION_ABORTED sebagai kode penyelesaian. Klien harus memanggil ClientVirtualDeviceSet::Close setelah dihentikan dengan aman setiap penggunaan buffer yang luar biasa yang diberikan kepada klien.

ClientVirtualDeviceSet::Close

Tujuan

Fungsi ini menutup set perangkat virtual yang dibuat oleh ClientVirtualDeviceSet::Create. Ini menghasilkan rilis semua sumber daya yang terkait dengan set perangkat virtual.

Sintaks

int ClientVirtualDeviceSet::Close ();
Parameter Argumen Penjelasan
Tidak Tidak berlaku
Mengembalikan nilai Argumen Penjelasan
NOERROR Ini dikembalikan ketika set perangkat virtual berhasil ditutup.
VD_E_PROTOCOL Tidak ada tindakan yang diambil karena set perangkat virtual tidak terbuka.
VD_E_OPEN Perangkat masih terbuka.

Keterangan

Pemanggilan Close adalah deklarasi klien bahwa semua sumber daya yang digunakan oleh set perangkat virtual harus dirilis. Klien harus memastikan bahwa semua aktivitas yang melibatkan buffer data dan perangkat virtual dihentikan sebelum memanggil Close. Semua antarmuka perangkat virtual yang dikembalikan oleh OpenDevice tidak valid oleh Close.

Klien diizinkan untuk mengeluarkan Create panggilan pada antarmuka set perangkat virtual setelah Close panggilan dikembalikan. Panggilan seperti itu akan membuat perangkat virtual baru yang ditetapkan untuk operasi atau BACKUP berikutnyaRESTORE.

Jika Close dipanggil ketika satu atau beberapa perangkat virtual masih terbuka, VD_E_OPEN dikembalikan. Dalam hal ini, SignalAbort dipicu secara internal, untuk memastikan pematian yang tepat jika memungkinkan. Sumber daya VDI dirilis. Klien harus menunggu VD_E_CLOSE indikasi pada setiap perangkat sebelum memanggil ClientVirtualDeviceSet::Close. Jika klien tahu bahwa set perangkat virtual sudah dalam keadaan Abnormally Terminated , maka seharusnya tidak mengharapkan VD_E_CLOSE indikasi dari GetCommand, dan mungkin memanggil ClientVirtualDeviceSet::Close segera setelah aktivitas pada buffer bersama dihentikan.

ClientVirtualDeviceSet::OpenInSecondary

Tujuan

Fungsi ini membuka perangkat virtual yang diatur dalam klien sekunder. Klien utama harus sudah menggunakan Create dan GetConfiguration untuk menyiapkan set perangkat virtual.

Sintaks

int ClientVirtualDeviceSet::OpenInSecondary (
    char *    setName    // name of the set
);
Parameter Argumen Penjelasan
setName Ini mengidentifikasi set. Nama ini peka huruf besar/kecil dan harus cocok dengan nama yang digunakan oleh klien utama saat memanggil ClientVirtualDeviceSet::Create.
Mengembalikan nilai Argumen Penjelasan
NOERROR Fungsi berhasil.
VD_E_PROTOCOL Set perangkat virtual belum dibuat, telah dibuka pada klien ini, atau set perangkat virtual belum siap untuk menerima permintaan terbuka dari klien sekunder.
VD_E_ABORT Operasi ini dibatalkan.

Komentar Saat menggunakan model beberapa proses, klien utama bertanggung jawab untuk mendeteksi penghentian normal dan abnormal klien sekunder.

ClientVirtualDeviceSet::GetBufferHandle

Tujuan

Beberapa aplikasi mungkin memerlukan lebih dari satu proses untuk beroperasi pada buffer yang dikembalikan oleh ClientVirtualDevice::GetCommand. Dalam kasus seperti itu, proses yang menerima perintah dapat digunakan GetBufferHandle untuk mendapatkan handel independen proses yang mengidentifikasi buffer. Handel ini kemudian dapat dikomunikasikan ke proses lain yang juga memiliki Set Perangkat Virtual yang sama terbuka. Proses itu kemudian akan digunakan ClientVirtualDeviceSet::MapBufferHandle untuk mendapatkan alamat buffer. Alamat kemungkinan akan menjadi alamat yang berbeda dari pada mitranya karena setiap proses mungkin memetakan buffer di alamat yang berbeda.

Sintaks

int ClientVirtualDeviceSet::GetBufferHandle (
    uint8_t*         pBuffer,         // in: buffer address
    unsigned int*    pBufferHandle    // out: buffer handle
);
Parameter Argumen Penjelasan
pBuffer Ini adalah alamat buffer yang diperoleh dari perintah Read atau Write .
BufferHandle Pengidentifikasi unik untuk buffer dikembalikan.
Mengembalikan nilai Argumen Penjelasan
NOERROR Fungsi berhasil.
VD_E_PROTOCOL Set perangkat virtual saat ini tidak terbuka.
VD_E_INVALID Ini pBuffer bukan alamat yang valid.

Keterangan

Proses yang memanggil GetBufferHandle fungsi bertanggung jawab untuk memanggil ClientVirtualDevice::CompleteCommand ketika transfer data selesai.

ClientVirtualDeviceSet::MapBufferHandle

Tujuan

Fungsi ini digunakan untuk mendapatkan alamat buffer yang valid dari handel buffer yang diperoleh dari beberapa proses lain.

Sintaks

int ClientVirtualDeviceSet::MapBufferHandle (
    int          dwBuffer,    // in: buffer handle
    uint8_t**    ppBuffer     // out: buffer address
);
Parameter Argumen Penjelasan
dwBuffer Ini adalah handel yang dikembalikan oleh ClientVirtualDeviceSet::GetBufferHandle.
ppBuffer Ini adalah alamat buffer yang valid dalam proses saat ini.
Mengembalikan nilai Argumen Penjelasan
NOERROR Fungsi berhasil.
VD_E_PROTOCOL Set perangkat virtual saat ini tidak terbuka.
VD_E_INVALID ppBuffer handel tidak valid.

Keterangan

Berhati-hatilah untuk mengkomunikasikan handel dengan benar. Handel bersifat lokal untuk satu set perangkat virtual. Proses mitra berbagi handel harus memastikan bahwa handel buffer hanya digunakan dalam cakupan set perangkat virtual, tempat buffer awalnya diperoleh.