Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
HRESULTdanDWORDdiubah 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:
Jalankan klien VDI sebagai
mssqlpengguna.Jalankan perintah berikut untuk beralih ke
mssqlpengguna:sudo su mssqlmssqlTambahkan pengguna kevdiusergrup, danvdiuserpengguna kemssqlgrup.Jalankan perintah berikut:
sudo useradd vdiuser sudo usermod -a -G mssql vdiuser sudo usermod -a -G vdiuser mssqlMulai 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.