Pemecah masalah: Menemukan kesalahan dengan replikasi transaksional SQL Server

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Memecahkan masalah kesalahan replikasi dapat merepotkan tanpa pemahaman dasar tentang cara kerja replikasi transaksional. Langkah pertama dalam membuat publikasi adalah meminta Agen Rekam Jepret membuat rekam jepret dan menyimpannya ke folder rekam jepret. Selanjutnya, Agen Distribusi menerapkan rekam jepret ke pelanggan.

Proses ini membuat publikasi dan menempatkannya dalam status sinkronisasi . Sinkronisasi berfungsi dalam tiga fase:

  1. Transaksi terjadi pada objek yang direplikasi, dan ditandai "untuk replikasi" dalam log transaksi.
  2. Agen Pembaca Log memindai melalui log transaksi dan mencari transaksi yang ditandai "untuk replikasi." Transaksi ini kemudian disimpan ke database distribusi.
  3. Agen Distribusi memindai melalui database distribusi dengan menggunakan utas pembaca. Kemudian, dengan alur penulis, agen ini tersambung ke pelanggan untuk menerapkan perubahan tersebut ke pelanggan.

Kesalahan dapat terjadi dalam langkah apa pun dari proses ini. Menemukan kesalahan tersebut dapat menjadi aspek yang paling menantang dari pemecahan masalah sinkronisasi. Untungnya, penggunaan Replication Monitor memudahkan proses ini.

Catatan

  • Tujuan dari panduan pemecahan masalah ini adalah untuk mengajarkan metodologi pemecahan masalah. Ini dirancang untuk tidak menyelesaikan kesalahan spesifik Anda, tetapi untuk memberikan panduan umum dalam menemukan kesalahan dengan replikasi. Beberapa contoh spesifik disediakan, tetapi resolusi untuk mereka dapat bervariasi tergantung pada lingkungan.
  • Kesalahan yang disediakan panduan ini sebagai contoh didasarkan pada tutorial Mengonfigurasi replikasi transaksional.

Metodologi pemecahan masalah

Pertanyaan untuk ditanyakan

  1. Di mana dalam proses sinkronisasi replikasi gagal?
  2. Agen mana yang mengalami kesalahan?
  3. Kapan terakhir kali replikasi berhasil berhasil? Apakah ada yang berubah sejak saat itu?

Langkah-langkah yang harus diambil

  1. Gunakan Monitor Replikasi untuk mengidentifikasi di titik mana replikasi mengalami kesalahan (agen mana?):
    • Jika kesalahan terjadi di bagian Penerbit ke Distributor, masalahnya terletak di Agen Pembaca Log.
    • Jika kesalahan terjadi di bagian Distributor ke Pelanggan, masalah terdapat di Agen Distribusi.
  2. Lihat riwayat pekerjaan agen tersebut di Monitor Aktivitas Pekerjaan untuk mengidentifikasi detail kesalahan. Jika riwayat pekerjaan tidak menampilkan detail yang cukup, Anda dapat mengaktifkan pengelogan verbose pada agen tertentu.
  3. Cobalah untuk menentukan solusi untuk kesalahan tersebut.

Menemukan kesalahan dengan Agen Rekam Jepret

Agen Rekam Jepret menghasilkan rekam jepret dan menulisnya ke folder rekam jepret yang ditentukan.

  1. Lihat status Agen Rekam Jepret Anda:

    a. Di Object Explorer, perluas simpul Publikasi Lokal di bawah Replikasi.

    b. Klik kanan publikasi Anda AdvWorksProductTrans>Melihat Status Agen Snapshot.

    Cuplikan layar perintah Tampilkan Status Agen Rekam Jepret pada menu pintasan.

  2. Jika kesalahan dilaporkan dalam status Agen Rekam Jepret, Anda dapat menemukan detail selengkapnya dalam riwayat pekerjaan Agen Rekam Jepret:

    a. Perluas SQL Server Agent di Object Explorer dan buka Monitor Aktivitas Pekerjaan.

    b. Urutkan menurut Kategori dan identifikasi Agen Rekam Jepret berdasarkan kategori REPL-Snapshot.

    c. Klik kanan Agen Rekam Jepret lalu pilih Tampilkan Riwayat.

    Cuplikan layar Pilihan untuk membuka riwayat Agen Rekam Jepret.

  3. Di riwayat Agen Rekam Jepret, pilih entri log yang relevan. Ini biasanya baris atau dua sebelum entri yang melaporkan kesalahan. (X merah menunjukkan kesalahan.) Tinjau teks pesan dalam kotak di bawah log:

    Cuplikan layar kesalahan Agen Rekam Jepret untuk akses yang ditolak.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Jika izin Windows Anda tidak dikonfigurasi dengan benar untuk folder rekam jepret, Anda akan melihat kesalahan "akses ditolak" untuk Agen Rekam Jepret. Anda harus memverifikasi izin ke folder tempat rekam jepret Anda disimpan, dan memastikan bahwa akun yang digunakan untuk menjalankan Agen Rekam Jepret memiliki izin untuk mengakses berbagi.

Menemukan kesalahan dengan Agen Pembaca Log

Agen Pembaca Log tersambung ke database penerbit Anda dan memindai log transaksi untuk setiap transaksi yang ditandai "untuk replikasi." Kemudian menambahkan transaksi tersebut ke database distribusi.

  1. Koneksi ke penerbit di SQL Server Management Studio. Perluas simpul server, klik kanan folder Replikasi , lalu pilih Luncurkan Monitor Replikasi:

    Cuplikan layar perintah

    Monitor Replikasi terbuka:

    Cuplikan layar Monitor Replikasi.

  2. X merah menunjukkan bahwa publikasi tidak disinkronkan. Perluas Penerbit Saya di sisi kiri, lalu perluas server penerbit yang relevan.

  3. Pilih publikasi AdvWorksProductTrans di sebelah kiri, lalu cari X merah di salah satu tab untuk mengidentifikasi di mana masalahnya berada. Dalam hal ini, X merah ada di tab Agen , sehingga salah satu agen mengalami kesalahan:

    Cuplikan layar Red X pada tab

  4. Pilih tab Agen untuk mengidentifikasi agen mana yang mengalami kesalahan:

    Cuplikan layar Red X pada Agen Pembaca Log yang gagal di Monitor Replikasi.

  5. Tampilan ini menunjukkan kepada Anda dua agen, Agen Rekam Jepret dan Agen Pembaca Log. Salah satu yang mengalami kesalahan memiliki X merah. Dalam hal ini, ini adalah Agen Pembaca Log.

    Klik dua kali baris yang melaporkan kesalahan agar dapat membuka riwayat agen untuk Agen Pembaca Log. Riwayat ini menyediakan informasi selengkapnya tentang kesalahan:

    Cuplikan layar Detail kesalahan untuk Agen Pembaca Log.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.        
    
  6. Kesalahan biasanya terjadi ketika pemilik database penerbit tidak diatur dengan benar. Ini dapat terjadi ketika database dipulihkan. Untuk memverifikasi ini:

    a. Perluas Database di Object Explorer.

    b. Klik kanan Properti AdventureWorks2022>.

    c. Verifikasi bahwa pemilik ada di bawah halaman File . Jika kotak ini kosong, ini adalah kemungkinan penyebab masalah Anda.

    Cuplikan layar halaman

  7. Jika pemilik kosong di halaman File , buka jendela Kueri Baru dalam konteks AdventureWorks2022 database. Jalankan kode T-SQL berikut:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets. 
    EXECUTE sp_changedbowner '<useraccount>'
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator' 
    
  8. Anda mungkin perlu memulai ulang Agen Pembaca Log:

    a. Perluas simpul SQL Server Agent di Object Explorer dan buka Monitor Aktivitas Pekerjaan.

    b. Urutkan menurut Kategori dan identifikasi Agen Pembaca Log menurut kategori REPL-LogReader .

    c. Klik kanan pekerjaan Agen Pembaca Log dan pilih Mulai Pekerjaan di Langkah.

    Cuplikan layar Pilihan untuk memulai ulang Agen Pembaca Log.

  9. Validasi bahwa publikasi Anda sekarang disinkronkan dengan membuka Monitor Replikasi lagi. Jika belum terbuka, Anda dapat menemukannya dengan mengklik kanan Replikasi di Object Explorer.

  10. Pilih publikasi AdvWorksProductTrans, pilih tab Agen, dan klik dua kali Agen Pembaca Log untuk membuka riwayat agen. Anda sekarang akan melihat bahwa Agen Pembaca Log sedang berjalan dan mereplikasi perintah atau memiliki "tidak ada transaksi yang direplikasi":

    Cuplikan layar Agen Pembaca Log yang berjalan tanpa transaksi yang direplikasi.

Menemukan kesalahan dengan Agen Distribusi

Agen Distribusi menemukan data dalam database distribusi lalu menerapkannya ke pelanggan.

  1. Koneksi ke penerbit di SQL Server Management Studio. Perluas simpul server, klik kanan folder Replikasi , lalu pilih Luncurkan Monitor Replikasi.

  2. Di Monitor Replikasi, pilih publikasi AdvWorksProductTrans , dan pilih tab Semua Langganan . Klik kanan langganan dan pilih Lihat Detail:

    Cuplikan layar perintah

  3. Kotak dialog Distributor ke Riwayat Pelanggan terbuka dan mengklarifikasi kesalahan apa yang dialami agen:

    Cuplikan layar Detail kesalahan untuk Agen Distribusi.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. Kesalahan menunjukkan bahwa Agen Distribusi mencoba kembali. Untuk menemukan informasi selengkapnya, periksa riwayat pekerjaan untuk Agen Distribusi:

    a. Perluas SQL Server Agent di Object Explorer >Job Activity Monitor.

    b. Urutkan pekerjaan menurut Kategori.

    c. Identifikasi Agen Distribusi berdasarkan kategori REPL-Distribusi. Klik kanan agen dan pilih Tampilkan Riwayat.

    Cuplikan layar Pilihan untuk melihat riwayat Agen Distribusi.

  5. Pilih salah satu entri kesalahan dan lihat teks kesalahan di bagian bawah jendela:

    Cuplikan layar Teks kesalahan yang menunjukkan kata sandi yang salah untuk agen distribusi.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Kesalahan ini menunjukkan bahwa kata sandi yang digunakan Agen Distribusi salah. Untuk mengatasinya:

    a. Perluas simpul Replikasi di Object Explorer.

    b. Klik kanan Properti langganan>.

    c. Pilih elipsis (...) di samping Akun Proses Agen dan ubah kata sandi.

    Cuplikan layar Pilihan untuk mengubah kata sandi untuk Agen Distribusi.

  7. Periksa Lagi Monitor Replikasi, dengan mengklik kanan Replikasi di Object Explorer. X merah di bawah Semua Langganan menunjukkan bahwa Agen Distribusi masih mengalami kesalahan.

    Buka riwayat Distribusi ke Pelanggan dengan mengklik kanan langganan di Detail Tampilan Monitor>Replikasi. Di sini, kesalahannya sekarang berbeda:

    Cuplikan layar Kesalahan yang menunjukkan Agen Distribusi tidak dapat tersambung.

    Connecting to Subscriber 'NODE2\SQL2016'        
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Kesalahan ini menunjukkan bahwa Agen Distribusi tidak dapat tersambung ke pelanggan, karena login gagal untuk pengguna NODE2\repl_distribution. Untuk menyelidiki lebih lanjut, sambungkan ke pelanggan dan buka log kesalahan SQL Server saat ini di bawah simpul Manajemen di Object Explorer:

    Cuplikan layar Kesalahan yang menunjukkan login gagal untuk pelanggan.

    Jika Anda melihat kesalahan ini, login hilang pada pelanggan. Untuk mengatasi kesalahan ini, lihat Izin untuk replikasi.

  9. Setelah kesalahan masuk diselesaikan, periksa Lagi Monitor Replikasi. Jika semua masalah telah diatasi, Anda akan melihat panah hijau di samping Nama Publikasi dan status Berjalan di bawah Semua Langganan.

    Klik kanan langganan untuk membuka riwayat Distributor Ke Pelanggan sekali lagi untuk memverifikasi keberhasilan. Jika ini pertama kalinya Anda menjalankan Agen Distribusi, Anda akan melihat bahwa rekam jepret telah disalin secara massal ke pelanggan:

    Cuplikan layar Agen Distribusi dengan status

Mengaktifkan pengelogan verbose pada agen apa pun

Anda dapat menggunakan pengelogan verbose untuk melihat informasi lebih rinci tentang kesalahan yang terjadi dengan agen apa pun dalam topologi replikasi. Langkah-langkahnya sama untuk setiap agen. Pastikan Anda memilih agen yang benar di Monitor Aktivitas Pekerjaan.

Catatan

Agen dapat berada di penerbit atau pelanggan, berdasarkan apakah itu langganan penarikan atau pendorongan. Jika agen tidak tersedia di server yang Anda selidiki, periksa server lain.

  1. Tentukan di mana Anda ingin pembuatan log verbose disimpan, dan pastikan folder ada. Contoh ini menggunakan c:\temp.

  2. Perluas simpul SQL Server Agent di Object Explorer dan buka Monitor Aktivitas Pekerjaan.

    Cuplikan layar perintah

  3. Urutkan menurut Kategori dan identifikasi agen yang diminati. Contoh ini menggunakan Agen Pembaca Log. Klik kanan agen Properti yang menarik.>

    Cuplikan layar Pilihan untuk membuka properti agen.

  4. Pilih halaman Langkah-langkah , lalu sorot langkah Jalankan agen . Pilih Edit.

    Cuplikan layar Pilihan untuk mengedit langkah

  5. Dalam kotak Perintah , mulai baris baru, masukkan teks berikut, dan pilih OK:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Anda dapat mengubah lokasi dan tingkat verbositas sesuai dengan preferensi Anda.

    Cuplikan layar output Verbose di properti untuk langkah pekerjaan.

    Catatan

    Saat menambahkan parameter output verbose, berikut ini dapat menyebabkan agen Anda gagal, atau agar file outfile hilang:

    • Ada masalah pemformatan di mana tanda hubung menjadi tanda hubung.
    • Lokasi tidak ada di disk, atau akun yang menjalankan agen tidak memiliki izin untuk menulis ke lokasi yang ditentukan.
    • Ada ruang yang hilang antara parameter terakhir dan -Output parameter .
    • Agen yang berbeda mendukung tingkat verbositas yang berbeda. Jika Anda mengaktifkan pengelogan verbose tetapi agen Anda gagal memulai, coba turunkan tingkat verbositas yang ditentukan sebesar 1.
  6. Mulai ulang Agen Pembaca Log dengan mengklik kanan agen >Hentikan Pekerjaan di Langkah. Refresh dengan memilih ikon Refresh dari toolbar. Klik kanan agen >Mulai Pekerjaan di Langkah.

  7. Tinjau output pada disk.

    Cuplikan layar file teks Output.

  8. Untuk menonaktifkan pengelogan verbose, ikuti langkah-langkah sebelumnya yang sama untuk menghapus seluruh -Output baris yang Anda tambahkan sebelumnya.

Dapatkan bantuan

Berkontribusi pada dokumentasi SQL

Tahukah Anda bahwa Anda dapat mengedit konten SQL sendiri? Jika Anda melakukannya, Anda tidak hanya membantu meningkatkan dokumentasi kami, tetapi Anda juga dikreditkan sebagai kontributor ke halaman.

Untuk informasi selengkapnya, lihat Cara berkontribusi pada dokumentasi SQL Server