Memecahkan masalah konektivitas dan kesalahan lainnya dengan Azure SQL Database dan Azure SQL Managed Instance

Berlaku untuk:Azure SQL DatabaseAzure SQL Managed Instance

Anda menerima pesan kesalahan saat koneksi ke Azure SQL Database atau Azure SQL Managed Instance gagal.

Seperti biasa, terapkan praktik terbaik dan panduan desain selama proses desain aplikasi.

Catatan

Anda dapat menggunakan Azure SQL Koneksi ivity Checker untuk mendeteksi dan memperbaiki berbagai kesalahan konektivitas ke Azure SQL Database, Azure SQL Managed Instance, dan di lingkungan Azure Synapse Analytics.

Langkah-langkah untuk memperbaiki masalah koneksi umum

  1. Pastikan TCP/IP diaktifkan sebagai protokol klien di server aplikasi. Pada server aplikasi tempat Anda tidak menginstal alat SQL, verifikasi bahwa TCP/IP diaktifkan dengan menjalankan cliconfg.exe (utilitas Jaringan Klien SQL Server).

  2. Periksa string koneksi aplikasi untuk memastikan string dikonfigurasi dengan benar. Misalnya, pastikan bahwa string koneksi menentukan port yang benar (1433) dan nama server yang sepenuhnya memenuhi syarat. Lihat Mendapatkan informasi koneksi menggunakan SQL Server Management Studio.

  3. Coba tingkatkan nilai waktu habis koneksi. Sebaiknya gunakan waktu habis koneksi setidaknya 30 detik.

  4. Uji konektivitas antara server aplikasi dan Azure SQL Database menggunakan SQL Server Management Studio (SSMS), file UDL, ping, atau telnet. Untuk informasi selengkapnya, lihat Memecahkan masalah konektivitas dan Diagnostik untuk masalah konektivitas.

    Catatan

    Sebagai langkah pemecahan masalah, Anda juga dapat menguji konektivitas di komputer klien yang berbeda.

  5. Sebagai praktik terbaik, aplikasi yang terhubung ke cloud harus menggunakan logika coba lagi.

Jika langkah-langkah ini tidak mengatasi masalah Anda, cobalah untuk mengumpulkan lebih banyak data lalu hubungi dukungan. Jika aplikasi Anda adalah layanan cloud, aktifkan pengelogan. Langkah ini mengembalikan stempel waktu UTC dari kegagalan tersebut. Untuk informasi selengkapnya tentang cara mengaktifkan pengelogan, lihat Mengaktifkan pengelogan diagnostik untuk aplikasi di Azure App Service. Selain itu, SQL Database mengembalikan ID pelacakan. Layanan Dukungan Pelanggan Microsoft dapat menggunakan informasi ini.

Menerapkan logika coba ulang

Sangat disarankan agar aplikasi klien Anda menggunakan logika coba lagi sehingga dapat membangun kembali koneksi setelah memberikan waktu kesalahan sementara untuk memperbaiki dirinya sendiri. Sebaiknya Anda menunda selama 5 detik sebelum mencoba kembali untuk pertama kali. Mencoba kembali setelah penundaan yang lebih singkat dari 5 detik berisiko membuat layanan cloud kewalahan. Untuk setiap percobaan berikutnya, penundaan harus tumbuh secara eksponensial, hingga maksimum 60 detik.

Untuk contoh kode logika coba lagi, lihat:

Untuk informasi selengkapnya tentang menangani kesalahan sementara di aplikasi Anda, tinjau Pemecahan masalah kesalahan koneksi sementara ke SQL Database

Diskusi tentang periode pemblokiran untuk klien yang menggunakan ADO.NET tersedia di Connection Pooling (ADO.NET).

Pesan kesalahan kegagalan sementara (40197, 40613, dan lainnya)

Infrastruktur Azure memiliki kemampuan untuk mengonfigurasi ulang server secara dinamis ketika beban kerja berat muncul di layanan Database SQL. Perilaku dinamis ini dapat menyebabkan program klien Anda kehilangan koneksi ke database atau instans. Kondisi kesalahan semacam ini disebut kesalahan sementara. Peristiwa konfigurasi ulang database terjadi karena peristiwa yang direncanakan (misalnya, peningkatan perangkat lunak) atau peristiwa yang tidak direncanakan (misalnya, crash proses, atau penyeimbangan beban). Sebagian besar peristiwa konfigurasi ulang berumur pendek dan harus diselesaikan dalam waktu kurang dari 60 detik paling lama. Namun, peristiwa ini terkadang membutuhkan waktu lebih lama untuk diselesaikan, seperti saat transaksi besar menyebabkan pemulihan yang berjalan lama. Tabel berikut ini mencantumkan berbagai kesalahan sementara yang bisa diterima aplikasi saat menyambungkan ke Azure SQL Database.

Daftar kode galat kesalahan sementara

Kode kesalahan Tingkat keparahan Deskripsi
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Kesalahan ini mungkin dicatat pada log kesalahan SQL Managed Instance, untuk waktu yang singkat, selama tahap terakhir konfigurasi ulang, sementara primer lama mematikan lognya.
Skenario nontransient lainnya yang melibatkan pesan kesalahan ini dijelaskan dalam dokumentasi Kesalahan MSSQL.
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

Untuk informasi selengkapnya, lihat Kesalahan 4000 hingga 4999
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

Anda menerima kesalahan ini ketika layanan tidak berfungsi karena peningkatan perangkat lunak atau perangkat keras, kegagalan perangkat keras, atau masalah kegagalan lainnya. Kode galat (%d) yang disematkan di dalam pesan kesalahan 40197 menyediakan informasi tambahan tentang jenis kegagalan atau failover yang terjadi. Beberapa contoh kode galat disematkan dalam pesan kesalahan 40197 adalah 40020, 40143, 40166, dan 40540.

Menyambungkan kembali secara otomatis menyambungkan Anda ke salinan database Anda yang sehat. Aplikasi Anda harus menangkap kesalahan 40197, mencatat kode galat yang disematkan (% d) di dalam pesan untuk pemecahan masalah, dan mencoba menyambungkan kembali ke SQL Database hingga sumber daya tersedia, dan koneksi Anda tersambung lagi. Untuk informasi selengkapnya, lihat Kesalahan sementara.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Untuk mengetahui informasi selengkapnya, silakan lihat:
Batas sumber daya server SQL logis.
Batas berbasis DTU untuk database tunggal.
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk database tunggal.
Batas berbasis vCore untuk kumpulan elastis.
Batas sumber daya Azure SQL Managed Instance.
40613 17 Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

Kesalahan ini mungkin terjadi jika sudah ada koneksi administrator khusus (DAC) yang dibuat ke database. Untuk informasi selengkapnya, lihat Kesalahan sementara.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Untuk mengetahui informasi selengkapnya, silakan lihat:
Batas sumber daya server SQL logis.
Batas berbasis DTU untuk database tunggal.
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk database tunggal.
Batas berbasis vCore untuk kumpulan elastis.
Batas sumber daya Azure SQL Managed Instance.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

Layanan ini sibuk memproses beberapa permintaan buat atau perbarui untuk langganan atau server Anda. Permintaan saat ini diblokir untuk pengoptimalan sumber daya. Kueri sys.dm_operation_status untuk operasi yang tertunda. Tunggu hingga permintaan buat atau perbarui tertunda selesai atau hapus salah satu permintaan tertunda Anda dan coba lagi permintaan Anda nanti. Jika operasi Anda tampaknya macet, tunggu hingga operasi lain yang sedang berlangsung selesai, atau batalkan jika memungkinkan. Misalnya, Anda mungkin dapat membatalkan salinan database atau pembuatan geo-replika dengan menghapus database atau replika yang sedang dibuat. Jika tidak dapat membatalkan operasi yang tampaknya macet, buka tiket dukungan dengan Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

Layanan ini sibuk memproses beberapa permintaan untuk langganan tersebut. Permintaan saat ini diblokir untuk pengoptimalan sumber daya. Kueri sys.dm_operation_status untuk status operasi. Tunggu hingga permintaan tertunda selesai atau hapus salah satu permintaan tertunda Anda dan coba lagi permintaan Anda nanti. Jika operasi Anda tampaknya macet, tunggu hingga operasi lain yang sedang berlangsung selesai, atau batalkan jika memungkinkan. Misalnya, Anda mungkin dapat membatalkan salinan database atau pembuatan geo-replika dengan menghapus database atau replika yang sedang dibuat. Jika tidak dapat membatalkan operasi yang tampaknya macet, buka tiket dukungan dengan Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

Replika tidak tersedia untuk masuk karena versi baris hilang untuk transaksi yang sedang dalam proses ketika replika didaur ulang. Masalah ini dapat diatasi dengan menggulung balik atau melakukan transaksi aktif pada replika utama. Kejadian kondisi ini dapat diminimalisir dengan menghindari transaksi tulis panjang di replika utama.
615 21 Could not find database ID %d, name '%.*ls'

Ini berarti cache dalam memori tidak sinkron dengan instans server SQL dan pencarian mengambil ID database kedaluarsa.

Login SQL menggunakan cache dalam memori untuk mendapatkan nama database ke pemetaan ID. Cache harus sinkron dengan database backend dan diperbarui setiap kali melampirkan dan melepaskan database ke/dari instans SQL server terjadi.
Anda menerima kesalahan ini ketika alur kerja pelampiran gagal membersihkan cache dalam memori tepat waktu dan pencarian berikutnya ke database menunjuk ke ID database kedaluarsa.

Coba sambungkan kembali ke SQL Database hingga sumber daya tersedia, dan sambungan dibuat kembali. Untuk informasi selengkapnya, lihat Kesalahan sementara.

Langkah-langkah untuk mengatasi masalah konektivitas sementara

  1. Periksa Dasbor Layanan Microsoft Azure untuk setiap pemadaman yang diketahui yang terjadi selama waktu di mana aplikasi melaporkan.
  2. Aplikasi yang terhubung ke layanan cloud seperti Azure SQL Database harus mengharapkan peristiwa konfigurasi ulang berkala dan menerapkan logika coba lagi untuk menangani kesalahan ini alih-alih memunculkan kesalahan aplikasi kepada pengguna.
  3. Saat database mendekati batas sumber dayanya, tampaknya ini bisa menjadi masalah konektivitas sementara. Lihat Batas sumber daya.
  4. Jika masalah konektivitas berlanjut, atau jika durasi aplikasi Anda mengalami kesalahan melebihi 60 detik atau jika Anda melihat beberapa kemunculan kesalahan pada hari tertentu, ajukan permintaan dukungan Azure dengan memilih Dapatkan Dukungan di situs Dukungan Azure.

Masalah terjadi jika aplikasi tidak dapat terhubung ke server.

Untuk mengatasi masalah ini, cobalah langkah-langkah (dalam urutan yang disajikan) di bagian Langkah-langkah untuk memperbaiki masalah koneksi umum.

Server/instans tidak ditemukan atau tidak dapat diakses (kesalahan 26, 40, 10053)

Kesalahan 26: Kesalahan Menemukan server yang ditentukan

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

Kesalahan 40: Tidak dapat membuka koneksi ke server

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Kesalahan 10053: Kesalahan tingkat transportasi telah terjadi saat menerima hasil dari server

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

Masalah terjadi jika aplikasi tidak dapat terhubung ke server.

Untuk mengatasi masalah ini, cobalah langkah-langkah (dalam urutan yang disajikan) di bagian Langkah-langkah untuk memperbaiki masalah koneksi umum.

Tidak bisa tersambung ke server karena masalah firewall

Kesalahan 40615: Tidak dapat terhubung ke < servername >

Untuk mengatasi masalah ini, konfigurasikan pengaturan firewall pada SQL Database melalui portal Microsoft Azure.

Kesalahan 5: Tidak dapat terhubung ke < servername >

Untuk mengatasi masalah ini, pastikan port 1433 terbuka untuk koneksi outbound pada semua firewall antara klien dan internet.

Tidak dapat masuk ke server (kesalahan 18456, 40531)

Proses masuk gagal untuk pengguna '< Nama pengguna >'

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

Untuk mengatasi masalah ini, hubungi administrator layanan Anda untuk menyediakan nama pengguna dan kata sandi yang valid.

Biasanya, administrator layanan dapat menggunakan langkah-langkah berikut untuk menambahkan info masuk:

  1. Masuk ke server menggunakan SQL Server Management Studio (SSMS).

  2. Untuk memeriksa apakah nama masuk dinonaktifkan, jalankan kueri SQL berikut ini dalam master database:

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Jika nama yang sesuai dinonaktifkan, Anda mungkin memutuskan untuk mengaktifkannya dengan menggunakan pernyataan berikut:

    ALTER LOGIN <User name> ENABLE;
    
  4. Jika nama pengguna masuk SQL tidak ada, edit dan jalankan kueri SQL berikut untuk membuat masuk SQL baru:

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. Di SQL Server Management Studio Object Explorer, perluas Database.

  6. Pilih database yang ingin Anda beri izin kepada pengguna.

  7. Klik kanan Keamanan, lalu pilih Baru, Pengguna.

  8. Dalam skrip yang dihasilkan dengan tempat penampung, ikuti langkah-langkah untuk mengganti parameter templat SSMS dan menjalankannya, misalnya:

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    Anda juga dapat menggunakan sp_addrolemember untuk memetakan pengguna tertentu ke peran database tertentu.

    Catatan

    Di Azure SQL Database, pertimbangkan sintaks ALTER ROLE yang lebih baru untuk mengelola keanggotaan peran database.

Untuk informasi selengkapnya, lihat Mengelola database dan masuk di Azure SQL Database.

Kesalahan waktu habis koneksi kedaluwarsa

System.Data.SqlClient.SqlException (0x80131904): Waktu Habis Koneksi Kedaluwarsa

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904): Waktu habis kedaluwarsa

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException: Penyedia yang mendasarinya gagal pada Buka

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

Tidak dapat tersambung ke < nama server >

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

Pengecualian ini dapat terjadi baik karena masalah koneksi atau kueri. Untuk mengonfirmasi bahwa masalah konektivitas telah menyebabkan kesalahan ini, lihat Mengonfirmasi apakah kesalahan disebabkan oleh masalah konektivitas.

Waktu habis koneksi terjadi karena aplikasi tidak dapat tersambung ke server. Untuk mengatasi masalah ini, cobalah langkah-langkah (dalam urutan yang disajikan) di bagian Langkah-langkah untuk memperbaiki masalah koneksi umum.

Kesalahan penghentian koneksi jaringan

Pustaka klien SQL tersambung ke Azure SQL Database dan Azure SQL Managed Instance menggunakan protokol jaringan TCP. Pustaka klien menggunakan komponen tingkat bawah yang disebut penyedia TCP untuk mengelola koneksi TCP. Ketika penyedia TCP mendeteksi bahwa host jarak jauh secara tak terduga mengakhiri koneksi TCP yang ada, pustaka klien menimbulkan kesalahan. Karena kesalahan adalah kesalahan klien dan bukan kesalahan server SQL, tidak ada nomor kesalahan SQL yang disertakan. Sebaliknya, nomor kesalahan adalah 0, dan pesan kesalahan dari penyedia TCP digunakan.

Contoh kesalahan penghentian koneksi jaringan meliputi:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

kesalahan penghentian Koneksi ion dapat terjadi karena database atau kumpulan elastis untuk sementara tidak tersedia. Mereka juga terjadi karena berbagai masalah dalam infrastruktur jaringan antara server database dan aplikasi klien, termasuk firewall, peralatan jaringan, dll. Masalah ini mungkin bersifat sementara atau permanen. Sebagai panduan umum, aplikasi harus menggunakan sejumlah upaya coba lagi tetap untuk kesalahan ini sebelum mempertimbangkan kegagalan permanen.

Kesalahan tata kelola sumber daya

Azure SQL Database menggunakan implementasi pemerintahan sumber daya berdasarkan Resource Governor untuk menerapkan batas sumber daya. Pelajari lebih lanjut tentang manajemen sumber daya di Azure SQL Database.

Kesalahan pemerintahan sumber daya yang paling umum dicantumkan terlebih dahulu dengan detail, diikuti oleh tabel pesan kesalahan pemerintahan sumber daya.

Kesalahan 10928 dan 10936: ID Sumber Daya : 1. Batas permintaan untuk [database atau kumpulan elastis] adalah %d dan telah tercapai

Jika batas tingkat database tercapai, pesan kesalahan terperinci dalam hal ini berbunyi: Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Jika batas kumpulan elastis tercapai, pesan kesalahan terperinci dalam hal ini berbunyi: Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. Batas kumpulan elastis lebih tinggi dari batas database, untuk informasi selengkapnya, lihat Batas sumber daya. Batasan mungkin ditemui ketika beberapa database di kumpulan menggunakan sumber daya (seperti pekerja) secara bersamaan.

Pesan kesalahan ini menunjukkan bahwa batas pekerja untuk database atau kumpulan elastis telah tercapai. Nilai pekerja bersamaan maksimum untuk tujuan layanan database atau kumpulan elastis akan ada alih-alih tempat penampung %d.

Catatan

Penawaran awal kueri Azure SQL Database hanya mendukung kueri utas tunggal. Pada saat itu, jumlah permintaan selalu sama dengan jumlah pekerja. Pesan kesalahan 10928 dan 10936 di Azure SQL Database berisi kata -kata "Batas permintaan [...] adalah N dan telah tercapai" untuk tujuan kompatibilitas mundur. Batas yang tercapai sebenarnya adalah jumlah pekerja. Jika pengaturan tingkat paralelisme maksimum (MAXDOP) Anda sama dengan nol atau lebih besar dari satu, jumlah pekerja bisa jauh lebih tinggi daripada jumlah permintaan, dan batasnya mungkin tercapai jauh lebih cepat daripada ketika MAXDOP sama dengan satu.

Pelajari lebih lanjut Sesi, pekerja, dan permintaan.

Sambungkan dengan Koneksi Admin Khusus (DAC) jika diperlukan

Jika insiden langsung sedang berlangsung di mana batas pekerja tercapai, Anda mungkin menerima Kesalahan 10928 saat terhubung menggunakan SQL Server Management Studio (SSMS) atau Azure Data Studio. Satu sesi dapat tersambung menggunakan Koneksi Diagnostik untuk Administrator Database (DAC) bahkan saat ambang batas maksimum pekerja telah tercapai.

Untuk membuat koneksi dengan DAC dari Management Studio:

  • Dari menu, pilih File > Baru > Kueri Mesin Database
  • Dari kotak dialog koneksi di bidang Nama Server, masukkan admin:<fully_qualified_server_name> (misalnya, admin:servername.database.windows.net).
  • Pilih Opsi >>
  • Pilih tab Properti Koneksi
  • Dalam kotak Sambungkan ke database:, ketikkan nama database Anda
  • Pilih Sambungkan.

Jika Anda menerima Kesalahan 40613, Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls', ini mungkin menunjukkan bahwa sesi lain sudah tersambung ke DAC. Hanya satu sesi yang mungkin tersambung ke DAC untuk database tunggal atau kumpulan elastis pada satu waktu.

Jika Anda mengalami kesalahan 'Gagal tersambung ke server' setelah memilih Koneksi, sesi DAC mungkin masih berhasil dibuat jika Anda menggunakan versi SSMS sebelum 18.9. Management Studio versi sebelumnya berusaha menyediakan Intellisense untuk koneksi ke DAC. Ini gagal, karena DAC hanya mendukung pekerja tunggal dan Intellisense memerlukan pekerja terpisah.

Anda tidak dapat menggunakan koneksi DAC dengan Object Explorer di SSMS.

Meninjau penggunaan max_worker_percent Anda

Untuk menemukan statistik konsumsi sumber daya untuk database Anda selama 14 hari, buat kueri tampilan katalog sistem sys.resource_stats. Kolom max_worker_percent menunjukkan persentase pekerja yang digunakan relatif terhadap batas pekerja untuk database Anda. Koneksi ke master database di server logis Anda untuk mengkueri sys.resource_stats.

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

Anda juga dapat membuat kueri statistik konsumsi sumber daya dari jam terakhir dari tampilan manajemen dinamis sys.dm_db_resource_stats. Sambungkan secara langsung database Anda untuk mengkueri sys.dm_db_resource_stats.

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

Penggunaan pekerja yang lebih rendah bila memungkinkan

Memblokir rantai dapat menyebabkan perubahan yang tiba-tiba pada jumlah pekerja di dalam database. Sejumlah besar kueri paralel bersamaan dapat menyebabkan jumlah pekerja yang tinggi. Meningkatkan derajat maksimum paralel (MAXDOP) atau mengatur MAXDOP menjadi nol dapat menambah jumlah pekerja aktif.

Triase insiden dengan pekerja yang tidak mencukupi dengan mengikuti langkah berikut:

  1. Selidiki apakah pemblokiran terjadi atau apakah Anda dapat mengidentifikasi sejumlah pekerja bersamaan yang sangat besar. Jalankan kueri berikut untuk memeriksa permintaan saat ini dan memeriksa pemblokiran saat database menampilkan Kesalahan 10928. Anda mungkin perlu terhubung dengan Koneksi ion Admin Khusus (DAC) untuk menjalankan kueri.

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. Cari baris dengan blocking_session_id untuk mengidentifikasi sesi yang diblokir. Temukan blocking_session_id masing-masing dalam daftar untuk menentukan apakah sesi tersebut juga diblokir. blocking_session_id Mengikuti nilai dan session_id pada akhirnya akan mengarahkan Anda ke pemblokir kepala: sesi yang tidak diblokir tetapi memblokir. Sesuaikan kueri pemblokir head.

      Tip

      Untuk informasi selengkapnya tentang pemecahan masalah kueri yang berjalan lama atau memblokir, lihat Memahami dan mengatasi masalah pemblokiran Azure SQL Database.

    2. Untuk mengidentifikasi jumlah pekerja serentak dalam jumlah besar, tinjau jumlah permintaan secara keseluruhan dan kolom worker_count untuk setiap permintaan. Worker_count adalah jumlah pekerja pada saat diambil sampelnya dan dapat berubah dari waktu ke waktu saat permintaan dijalankan. Menyelaraskan kueri untuk mengurangi penggunaan sumber daya jika penyebab penambahan pekerja adalah kueri serentak yang berjalan pada derajat paralel yang optimal. Untuk informasi lebih lanjut, lihat Penyetelan/Petunjuk Kueri.

  2. Evaluasi pengaturan tingkat maksimum paralel (MAXDOP) untuk database.

Menambah batas pekerja

Jika database atau kumpulan elastis secara konsisten mencapai batas pekerjanya meskipun pemblokiran alamat, mengoptimalkan kueri, dan memvalidasi pengaturan MAXDOP Anda, pertimbangkan untuk meningkatkan database atau kumpulan elastis untuk meningkatkan batas pekerja.

Menemukan batas sumber daya Azure SQL Database menurut tingkat layanan dan ukuran komputasi:

Pelajari lebih lanjut pemerintahan sumber daya pekerja Azure SQL Database.

Kesalahan 10929: ID Sumber Daya: 1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

Kesalahan 40501: Layanan sedang sibuk

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Kesalahan 40501 adalah kesalahan pembatasan mesin, indikasi bahwa batas sumber daya terlampaui.

Untuk informasi selengkapnya tentang batas sumber daya, lihat Batas sumber daya server SQL logis.

Kesalahan 40544: Database telah mencapai kuota ukurannya

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

Kesalahan ini terjadi ketika database telah mencapai kuota ukurannya.

Langkah berikut dapat membantu Anda mengatasi masalah atau memberi Anda opsi tambahan:

  1. Periksa ukuran database saat ini dengan menggunakan dasbor di portal Microsoft Azure.

    Catatan

    Untuk mengidentifikasi tabel mana yang paling banyak menghabiskan ruang sehingga menjadi kandidat potensial untuk penghapusan, jalankan kueri SQL berikut:

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. Jika ukuran saat ini tidak melebihi ukuran maksimum yang didukung untuk edisi Anda, Anda dapat menggunakan ALTER DATABASE untuk meningkatkan pengaturan MAXSIZE.

  3. Jika database sudah melewati ukuran maksimum yang didukung untuk edisi Anda, cobalah satu atau beberapa langkah berikut ini:

    • Lakukan aktivitas penghapusan database normal. Misalnya, hapus data yang tidak diinginkan dengan menggunakan memotong/menghapus, atau memindahkan data dengan menggunakan utilitas SQL Server Integration Services (SSIS) atau program salinan massal (bcp).
    • Partisi atau hapus data, hilangkan indeks, atau lihat dokumentasi untuk kemungkinan resolusi.
    • Untuk penskalaan database, lihat Menskalakan sumber daya database tunggal dan Menskalakan sumber daya kumpulan elastis.

Kesalahan 40549: Sesi dihentikan karena Anda memiliki transaksi yang berjalan lama

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

Jika Anda berulang kali mengalami kesalahan ini, cobalah untuk mengatasi masalah tersebut dengan mengikuti langkah-langkah berikut:

  1. Jalankan kueri berikut untuk melihat setiap sesi terbuka yang memiliki nilai tinggi untuk kolom duration_ms:

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    Anda dapat mengabaikan baris di mana input_buffer kolom memperlihatkan pembacaan kueri dari sys.fn_MSxe_read_event_stream: permintaan ini terkait dengan sesi Kejadian yang Diperluas.

  2. Tinjau kolom blocking_session_id untuk melihat apakah pemblokiran memberikan kontribusi untuk transaksi yang berjalan lama.

    Catatan

    Untuk informasi selengkapnya tentang pemblokiran pemecahan masalah di Azure SQL Database, lihat Memahami dan mengatasi masalah pemblokiran Azure SQL Database.

  3. Pertimbangkan untuk melakukan batching pada kueri Anda. Untuk informasi tentang batching, lihat Cara menggunakan batching untuk meningkatkan performa aplikasi SQL Database.

Kesalahan 40551: Sesi telah dihentikan karena penggunaan tempdb yang berlebihan

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

Untuk mengatasi masalah ini, ikuti langkah-langkah berikut:

  1. Ubah kueri untuk mengurangi penggunaan ruang tabel sementara.
  2. Hilangkan objek sementara setelah tidak lagi diperlukan.
  3. Potong tabel atau hapus tabel yang tidak digunakan.

Kesalahan 40552: Sesi telah dihentikan karena penggunaan ruang log transaksi yang berlebihan

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Untuk mengatasi masalah ini, coba metode berikut ini:

  • Masalah dapat terjadi karena operasi sisipkan, perbarui, atau hapus. Cobalah untuk mengurangi jumlah baris yang segera dioperasikan dengan menerapkan batching atau pemisahan menjadi beberapa transaksi yang lebih kecil.
  • Masalah ini dapat terjadi karena operasi pembangunan kembali indeks. Untuk mengatasi masalah ini, pastikan jumlah baris yang terpengaruh dalam tabel * (ukuran rata-rata bidang yang diperbarui dalam byte + 80) < 2 gigabyte (GB).
  • Untuk pembangunan ulang indeks, ukuran rata-rata bidang yang diperbarui harus diganti dengan ukuran indeks rata-rata.
  • Untuk informasi selengkapnya, lihat Memecahkan masalah log transaksi penuh di Azure SQL Database dan Memecahkan masalah log transaksi penuh di Azure SQL Managed Instance.

Kesalahan 40553: Sesi telah dihentikan karena penggunaan TEMPDB yang berlebihan

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Untuk mengatasi masalah ini, cobalah untuk mengoptimalkan kueri.

Untuk prosedur pemecahan masalah mendalam, lihat Apakah kueri saya berjalan dengan baik di cloud?.

Untuk informasi lebih lanjut tentang kesalahan kehabisan memori dan kueri sampel lainnya, lihat Memecahkan masalah kesalahan kehabisan memori dengan Azure SQL Database.

Tabel pesan kesalahan pemerintahan sumber daya

Kode kesalahan Tingkat keparahan Deskripsi
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

ID Sumber Daya menunjukkan sumber daya yang telah mencapai batas. Saat ID Sumber Daya = 1, ini menunjukkan bahwa batas pekerja telah tercapai. Pelajari lebih lanjut dalam Kesalahan 10928: ID Sumber Daya : 1. Batas permintaan untuk database adalah %d dan telah tercapai. Saat ID Sumber Daya = 2, ini menunjukkan batas sesi telah tercapai.

Pelajari selengkapnya tentang batas sumber daya:
Batas sumber daya server SQL logis.
Batas berbasis DTU untuk database tunggal.
Batas berbasis vCore untuk database tunggal.
Batas sumber daya Azure SQL Managed Instance.
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

ID Sumber Daya menunjukkan sumber daya yang telah mencapai batas. Saat ID Sumber Daya = 1, ini menunjukkan bahwa batas pekerja telah tercapai. Pelajari lebih lanjut di Kesalahan 10936: ID Sumber Daya : 1. Batas permintaan untuk kumpulan elastis adalah %d dan telah tercapai.. Ketika ID Sumber Daya = 2, ini menunjukkan batas sesi telah tercapai.

Pelajari selengkapnya tentang batas sumber daya:
Batas sumber daya server SQL logis.
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk kumpulan elastis.
Batas sumber daya Azure SQL Managed Instance.
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

ID Sumber Daya menunjukkan sumber daya yang telah mencapai batas. Untuk utas pekerja, ID Sumber Daya = 1. Untuk sesi, ID Sumber Daya = 2. Untuk mengetahui informasi selengkapnya, silakan lihat:
Batas sumber daya server SQL logis.
Batas berbasis DTU untuk database tunggal.
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk database tunggal.
Batas berbasis vCore untuk kumpulan elastis.
Batas sumber daya Azure SQL Managed Instance.
Jika tidak, coba lagi nanti.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Untuk penskalaan database, lihat Menskalakan sumber daya database tunggal dan Menskalakan sumber daya kumpulan elastis.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Untuk informasi tentang batching, lihat Cara menggunakan batching untuk meningkatkan performa aplikasi SQL Database.
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Untuk informasi tentang batching, lihat Cara menggunakan batching untuk meningkatkan performa aplikasi SQL Database.
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Jika Anda menggunakan objek sementara, hemat ruang dalam database tempdb dengan menghilangkan objek sementara setelah objek tidak lagi diperlukan oleh sesi. Untuk informasi selengkapnya tentang tempdb batasan di SQL Database, lihat Database Tempdb di SQL Database.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Untuk informasi tentang batching, lihat Cara menggunakan batching untuk meningkatkan performa aplikasi SQL Database.

Jika Anda melakukan penyisipan massal menggunakan utilitas bcp.exe atau kelas System.Data.SqlClient.SqlBulkCopy, coba gunakan opsi -b batchsize atau BatchSize untuk membatasi jumlah baris yang disalin ke server di setiap transaksi. Jika Anda membangun ulang indeks dengan pernyataan ALTER INDEX, coba gunakan opsi REBUILD WITH ONLINE = ON tersebut. Untuk informasi tentang ukuran log transaksi untuk model pembelian vCore, lihat:
Batas berbasis vCore untuk database tunggal.
Batas berbasis vCore untuk kumpulan elastis.
Batas sumber daya Azure SQL Managed Instance.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Mengurangi jumlah operasi ORDER BY dan GROUP BY dalam kode T-SQL Anda mengurangi persyaratan memori kueri Anda. Untuk penskalaan database, lihat Menskalakan sumber daya database tunggal dan Menskalakan sumber daya kumpulan elastis. Untuk informasi lebih lanjut tentang kesalahan kehabisan memori dan kueri sampel, lihat Memecahkan masalah kesalahan kehabisan memori dengan Azure SQL Database.

Kesalahan kumpulan elastis

Kesalahan berikut terkait dengan membuat dan menggunakan kumpulan elastis:

Kode kesalahan Tingkat keparahan Deskripsi Tindakan korektif
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Mencoba menulis data ke database ketika batas penyimpanan kumpulan elastis telah tercapai. Untuk informasi tentang batas sumber daya, lihat:
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk kumpulan elastis.
Jika memungkinkan, pertimbangkan untuk meningkatkan DTU dan/atau menambahkan penyimpanan ke kumpulan elastis untuk meningkatkan batas penyimpanannya, mengurangi penyimpanan yang digunakan oleh database individual dalam kumpulan elastis, atau menghapus database dari kumpulan elastis. Untuk penskalaan kumpulan elastis, lihat Menskalakan sumber daya kumpulan elastis. Untuk informasi selengkapnya tentang menghapus ruang yang tidak digunakan dari database, lihat Mengelola ruang file untuk database di Azure SQL Database.
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Untuk informasi tentang batas sumber daya, lihat:
Batas berbasis DTU untuk kumpulan elastis.
Batas berbasis vCore untuk kumpulan elastis.
Jika tidak, coba lagi nanti. DTU/vCore min per database; DTU/vCore maks per database. Jumlah total pekerja serentak di semua database di kumpulan elastis berusaha melebihi batas kumpulan.
Pertimbangkan untuk meningkatkan DTU atau vCore dari kumpulan elastis jika memungkinkan untuk meningkatkan batas pekerjanya, atau menghapus database dari kumpulan elastis.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. T/A
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Berikan nama kumpulan elastis yang valid.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Berikan nama kumpulan elastis baru.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Berikan edisi yang benar atau biarkan tingkat layanan kosong untuk menggunakan tingkat layanan default.
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. Tentukan kombinasi yang benar dari kumpulan elastis dan tingkat layanan.
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. Jangan tentukan edisi database yang berbeda dari tingkat layanan kumpulan elastis. Edisi database tidak perlu ditentukan.
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. Tentukan nama kumpulan elastis jika menggunakan tujuan layanan kumpulan elastis.
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. Coba lagi mengatur DTU untuk kumpulan elastis ke setidaknya batas minimum.
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. Coba lagi mengatur DTU untuk kumpulan elastis agar tidak lebih besar dari batas maksimum.
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. Pertimbangkan untuk menggunakan tingkat layanan kumpulan elastis yang mendukung pengaturan yang diinginkan.
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. Pertimbangkan untuk menggunakan tingkat layanan kumpulan elastis yang mendukung pengaturan yang diinginkan.
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. Pertimbangkan untuk menggunakan tingkat layanan kumpulan elastis yang mendukung pengaturan yang diinginkan.
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. Pertimbangkan untuk meningkatkan DTU dari kumpulan elastis, mengurangi DTU min per database, atau mengurangi jumlah database di kumpulan elastis.
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. Hapus database dari kumpulan elastis untuk menghapusnya.
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. Jika memungkinkan, pertimbangkan untuk meningkatkan DTU kumpulan elastis untuk meningkatkan batas databasenya, atau menghapus database dari kumpulan elastis.
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. Pertimbangkan untuk mengurangi penggunaan penyimpanan database individual di kumpulan elastis atau hapus database dari kumpulan untuk mengurangi DTU atau batas penyimpanannya.
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. Pastikan DTU min per database tidak melebihi DTU maks per database.
TBD 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. Tetapkan ukuran maksimum database dalam batas ukuran maksimum yang diizinkan oleh tingkat layanan kumpulan elastis.

Tidak dapat membuka database "master" yang diminta oleh proses masuk. Gagal masuk

Masalah ini terjadi karena akun tidak memiliki izin untuk mengakses database master. Namun secara default, SQL Server Management Studio (SSMS) mencoba membuat sambungan ke database master.

Untuk mengatasi masalah ini, ikuti langkah-langkah berikut:

  1. Pada layar masuk SQL Server Management Studio, pilih Opsi, lalu pilih Properti Koneksi.

  2. Di bidang Sambungkan ke database, masukkan nama database default pengguna sebagai database masuk default, lalu pilih Sambungkan.

    Cuplikan layar dialog Koneksi di SSMS, memperlihatkan tab Properti Koneksi ion.

Kesalahan baca-saja

Jika Anda mencoba menulis ke database yang bersifat baca-saja, Anda menerima kesalahan. Dalam beberapa skenario, penyebab status baca-saja database mungkin tidak segera jelas.

Kesalahan 3906: Gagal memperbarui database 'databaseName' karena database bersifat baca-saja.

Saat mencoba mengubah database baca-saja, kesalahan berikut dimunculkan.

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

Ada beberapa kemungkinan penjelasan mengapa database bersifat baca-saja.

Setelah failover manual, aplikasi masih tersambung ke replika lama

Di Azure SQL Database, setelah failover ke replika lain, aplikasi Anda mungkin masih tersambung ke replika utama sebelumnya karena DNS. Perutean koneksi grup failover diimplementasikan menggunakan DNS.

Potensi akar penyebab:

  1. Selama failover, titik akhir grup failover diperbarui untuk menunjuk ke server primer dan sekunder baru yang sesuai dengan mengubah target entri DNS yang sesuai. Secara default, entri DNS dibuat dengan TTL 30 detik, yang berarti bahwa klien DNS menyimpan entri ini selama 30 detik. Akibatnya, pembaruan pada catatan DNS tidak segera disebarluaskan; entri akan basi sampai semua klien dan simpul perantara telah menyegarkan cache mereka. Jadi, dapat memakan waktu dari 0 hingga sekitar 10 menit (tergantung pada topologi jaringan) untuk masuk ke titik akhir grup failover untuk dirutekan ke target baru mereka setelah failover. Menghapus cache DNS mungkin atau mungkin tidak membantu masalah, karena simpul jaringan menengah yang merespons permintaan DNS juga menyimpan hasil DNS untuk satu waktu.

    Solusi yang disarankan untuk masalah ini hanyalah menunggu sampai entri DNS disegarkan pada klien. Saat ini, solusi ini akan menyebabkan masalah menyelesaikan sendiri dalam 10 menit.

  2. Beberapa pustaka klien SQL menggunakan fitur yang disebut "pengumpulan koneksi" yang menggunakan kembali koneksi ke sumber data yang sama daripada menutup dan membukanya kembali setiap kali koneksi database baru diperlukan. Secara khusus, pengumpulan koneksi diaktifkan di ADO.NET secara default. Ketika digabungkan ketika masalah yang dijelaskan dalam 1), pengumpulan koneksi dapat menyebabkan koneksi yang baru dibuka untuk menggunakan kembali koneksi ke database lama, sehingga mencegah aplikasi tersambung ke database utama baru tanpa batas waktu.

Solusi:

Ada tiga solusi potensial untuk masalah DNS ini setelah failover Grup Failover:

  1. Ubah aplikasi untuk memanggil SQLConnection.ClearAllPools atau SQLConnection.ClearPool(conn) setiap kali terjadi kesalahan "baca-saja".
  2. Dalam string koneksi aplikasi, tentukan Pooling=False untuk menonaktifkan pengumpulan koneksi. Ini harus diuji, karena mungkin berdampak signifikan pada performa jika aplikasi sering membuka dan menutup koneksi.
  3. Opsi lain untuk menghindari penundaan replikasi/penembolokan DNS adalah langsung terhubung menggunakan nama server logis Azure SQL Database (dari server sekunder asli, sekarang primer baru) untuk jendela waktu setelah 3906 ditemui.

Anda mungkin tersambung ke replika baca-saja

Untuk Azure SQL Database dan Azure SQL Managed Instance, Anda mungkin tersambung ke database pada replika baca-saja. Dalam hal ini, kueri berikut menggunakan fungsi DATABASEPROPERTYEX() mengembalikan READ_ONLY:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

Jika Anda menyambungkan menggunakan SQL Server Management Studio, verifikasi apakah Anda telah menentukan ApplicationIntent=ReadOnly di tab Parameter Koneksi Tambahan di opsi koneksi Anda.

Jika koneksi berasal dari aplikasi atau klien menggunakan string koneksi, validasi apakah string koneksi telah ditentukan ApplicationIntent=ReadOnly. Pelajari selengkapnya di Koneksi replika baca-saja.

Database mungkin diatur ke baca-saja

Jika Anda menggunakan Azure SQL Database, database itu sendiri mungkin telah diatur ke baca-saja. Anda dapat memverifikasi status database dengan kueri berikut:

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

Anda dapat mengubah status baca-saja untuk database di Azure SQL Database menggunakan ALTER DATABASE Transact-SQL. Saat ini Anda tidak dapat mengatur database dalam instans terkelola ke baca-saja.

Mengonfirmasi apakah kesalahan disebabkan oleh masalah konektivitas

Untuk mengonfirmasi apakah kesalahan disebabkan oleh masalah konektivitas, tinjau jejak tumpukan untuk bingkai yang menunjukkan panggilan untuk membuka koneksi seperti yang berikut (perhatikan referensi ke kelas SqlConnection):

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

Saat pengecualian dipicu oleh masalah kueri, Anda akan melihat tumpukan panggilan yang mirip dengan yang berikut ini (perhatikan referensi ke kelas SqlCommand). Dalam situasi ini, sesuaikan kueri Anda.

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

Untuk informasi selengkapnya tentang performa penyempurnaan, lihat sumber daya berikut ini: