Bagikan melalui


Masalah dan kesalahan yang diketahui dengan CDC

Berlaku untuk: SQL Server Azure SQL Managed Instance

Artikel ini menjelaskan masalah dan kesalahan yang diketahui dengan change data capture (CDC) untuk SQL Server dan Azure SQL Managed Instance.

Untuk Azure SQL Database, lihat Masalah umum dengan CDC di Azure SQL Database.

Memodifikasi metadata

Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, tabel perubahan, prosedur tersimpan sistem CDC, izin default cdc user (sys.database_principals) atau mengganti nama cdc user.

Objek apa pun dalam sys.objects dengan is_ms_shipped properti diatur ke 1 tidak boleh dimodifikasi.

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

Perbedaan kolabasi

Penting untuk mengetahui situasi di mana Anda memiliki kolase yang berbeda antara database dan kolom tabel yang dikonfigurasi untuk mengubah pengambilan data. CDC menggunakan penyimpanan sementara untuk mengisi tabel sisi. Jika tabel memiliki kolom CHAR atau VARCHAR dengan kolase yang berbeda dari kolase database dan jika kolom tersebut menyimpan karakter non-ASCII (seperti karakter DBCS byte ganda), CDC mungkin tidak dapat mempertahankan data yang diubah konsisten dengan data dalam tabel dasar. Ini karena variabel penyimpanan sementara tidak dapat memiliki kolase yang terkait dengannya.

Pertimbangkan salah satu pendekatan berikut untuk memastikan data perubahan yang diambil konsisten dengan tabel dasar:

  • Gunakan jenis data NCHAR atau NVARCHAR untuk kolom yang berisi data non-ASCII.

  • Atau, Gunakan kolatasi yang sama untuk kolom dan untuk database.

Misalnya, jika Anda memiliki satu database yang menggunakan kolatasi SQL_Latin1_General_CP1_CI_AS, pertimbangkan tabel berikut:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

CDC mungkin gagal mengambil data biner untuk kolom C2, karena kolabnya berbeda (Chinese_PRC_CI_AI). Gunakan NVARCHAR untuk menghindari masalah ini:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

Pemulihan Database Dipercepat (ADR) dan Change Data Capure (CDC)

Saat ini, mengaktifkan pengambilan data perubahan (CDC) dan Pemulihan Database Dipercepat (ADR) tidak didukung. Saat Anda mengaktifkan ubah pengambilan data (CDC) di SQL Server, fitur pemotongan log agresif ADR dinonaktifkan. Ini karena pemindaian CDC mengakses log transaksi database. Transaksi aktif terus menahan pemotongan log transaksi sampai transaksi dilakukan dan pemindaian CDC mengejar ketinggalan, atau transaksi dibatalkan. Hal ini dapat menyebabkan berbagai masalah termasuk log transaksi yang mengisi lebih dari biasanya atau operasi data yang dicatat dalam tabel samping menjadi tidak normal.

Saat mengaktifkan CDC, sebaiknya gunakan opsi Indeks yang dapat dilanjutkan. Indeks yang dapat dilanjutkan tidak perlu membuka transaksi yang berjalan lama untuk membuat atau membangun kembali indeks, memungkinkan pemotongan log selama operasi ini dan manajemen ruang log yang lebih baik. Untuk informasi selengkapnya, lihat Panduan untuk operasi indeks online - Pertimbangan Indeks yang Dapat Dilanjutkan.

Mengaktifkan CDC gagal jika skema atau pengguna bernama cdc sudah ada

Saat Anda mengaktifkan CDC pada database, CDC membuat skema dan pengguna baru bernama cdc. Jadi secara manual membuat skema kustom atau pengguna bernama cdc tidak disarankan, karena dicadangkan untuk penggunaan sistem.

Jika Anda telah menentukan skema kustom atau pengguna yang dinamai cdc secara manual dalam database Anda yang tidak terkait dengan CDC, prosedur sys.sp_cdc_enable_db tersimpan sistem gagal mengaktifkan CDC pada database dengan pesan kesalahan di bawah ini.

Database <database_name> tidak dapat diaktifkan untuk mengubah pengambilan data karena pengguna database bernama 'cdc' atau skema bernama 'cdc' sudah ada di database saat ini. Objek ini diperlukan secara eksklusif oleh CDC. Hilangkan atau ganti nama pengguna atau skema dan coba lagi operasi.

Untuk mengatasi masalah ini:

  • Letakkan skema dan cdc pengguna kosong cdc secara manual. Kemudian, CDC dapat berhasil diaktifkan pada database.

CDC gagal setelah MENGUBAH KOLOM ke VARCHAR dan VARBINARY

Saat tipe data kolom pada tabel yang diaktifkan CDC diubah dari TEXT ke VARCHAR atau IMAGE ke VARBINARY dan baris yang sudah ada diperbarui ke nilai di luar baris. Setelah pembaruan, pemindaian CDC akan mengakibatkan kesalahan.

Perubahan DDL pada tabel sumber

Mengubah ukuran kolom tabel yang diaktifkan CDC menggunakan pernyataan DDL dapat menyebabkan masalah dengan proses pengambilan CDC berikutnya, yang mengakibatkan kesalahan 2628 atau kesalahan 8115. Ingat bahwa data dalam tabel perubahan CDC dipertahankan berdasarkan pengaturan yang dikonfigurasi pengguna. Jadi, sebelum membuat perubahan pada ukuran kolom, Anda harus menilai apakah perubahan kompatibel dengan data yang ada dalam tabel perubahan CDC.

sys.dm_cdc_errors Jika menunjukkan bahwa pemindaian gagal karena kesalahan 2628 atau kesalahan 8115 untuk tabel perubahan, Anda harus terlebih dahulu menggunakan data perubahan dalam tabel perubahan yang terpengaruh. Setelah itu, Anda perlu menonaktifkan dan kemudian mengaktifkan kembali CDC pada tabel untuk mengatasi masalah secara efektif.

Mengimpor database menggunakan operasi Impor/Ekspor/Ekstrak/Terbitkan tingkat data

Untuk database SQL yang diaktifkan CDC, saat Anda menggunakan SqlPackage, SSDT, atau alat SQL lainnya untuk Mengimpor/Mengekspor atau Mengekstrak/Menerbitkan, cdc skema dan pengguna dikecualikan dalam database baru. Objek CDC lain yang tidak disertakan dalam operasi Impor/Ekspor dan Ekstrak/Sebarkan menyertakan tabel yang ditandai sebagai is_ms_shipped=1 dalam sys.objects.

Bahkan jika CDC tidak diaktifkan dan Anda telah menentukan skema kustom atau pengguna bernama cdc dalam database Anda yang juga akan dikecualikan dalam operasi Impor/Ekspor dan Ekstrak/Sebarkan untuk mengimpor/menyiapkan database baru.

Peralihan partisi dengan variabel

Menggunakan variabel dengan pengalihan partisi pada database atau tabel dengan change data capture (CDC) tidak didukung untuk pernyataan tersebut ALTER TABLE ... SWITCH TO ... PARTITION ... . Lihat batasan pengalihan partisi untuk mempelajari selengkapnya.

Pemecahan Masalah Kesalahan

Langkah-langkah bagian ini untuk memecahkan masalah kesalahan yang terkait dengan CDC di SQL Server, dan Azure SQL Managed Instance. Kesalahan terkait CDC dapat menghalangi fungsi yang tepat dari proses pengambilan dan menyebabkan perluasan log transaksi database.

Untuk memeriksa kesalahan ini, Anda bisa mengkueri tampilan manajemen dinamis sys.dm_cdc_errors. Jika sys.dm_cdc_errors tampilan manajemen dinamis mengembalikan kesalahan apa pun, lihat bagian berikut untuk memahami langkah-langkah mitigasi.

Catatan

Untuk informasi selengkapnya tentang kode kesalahan tertentu, lihat Peristiwa dan kesalahan Mesin Database.

Ini adalah berbagai kategori pemecahan masalah yang disertakan dalam bagian ini:

Kategori Deskripsi
Metadata Diubah Menyertakan informasi tentang cara mengurangi masalah yang terkait dengan CDC ketika tabel terlacak telah dimodifikasi atau dihilangkan.
Manajemen Ruang Database Menyertakan informasi tentang cara mengurangi masalah ketika ruang database telah habis.
Batasan CDC Menyertakan informasi tentang cara mengurangi masalah yang disebabkan oleh keterbatasan CDC.

Metadata dimodifikasi

Kesalahan 200/208 - Nama objek tidak valid

  • Penyebab: Kesalahan mungkin terjadi ketika metadata CDC telah dihilangkan. Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, tabel perubahan, prosedur tersimpan sistem CDC, izin default cdc user (sys.database_principals) atau mengganti nama cdc user.

  • Rekomendasi: Untuk mengatasi masalah ini, Anda perlu menonaktifkan dan mengaktifkan kembali CDC untuk database Anda. Saat mengaktifkan perubahan pengambilan data untuk database, ia membuat skema cdc, pengguna cdc, tabel metadata, dan objek sistem lainnya untuk database.

Catatan

Objek yang ditemukan dalam tampilan katalog sistem sys.objects dengan is_ms_shipped=1 dan schema_name='cdc' tidak boleh diubah atau dihilangkan.

Kesalahan 1202 - Prinsipal database tidak ada, atau pengguna bukan anggota

  • Penyebab: Kesalahan mungkin terjadi ketika pengguna CDC telah dihilangkan. Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, tabel perubahan, prosedur tersimpan sistem CDC, izin default cdc user (sys.database_principals) atau mengganti nama cdc user.

  • Rekomendasi: Pastikan cdc pengguna ada di database Anda, dan juga memiliki peran yang db_owner ditetapkan. Untuk membuat cdc pengguna, lihat contoh Membuat pengguna cdc dan menetapkan peran.

Kesalahan 15517 - Tidak dapat dijalankan sebagai prinsipal database karena prinsipal tidak ada

  • Penyebab: Jenis prinsipal ini tidak dapat ditiru, atau Anda tidak memiliki izin. Kesalahan mungkin terjadi ketika metadata CDC telah dihilangkan atau bukan lagi bagian db_owner dari peran. Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, tabel perubahan, prosedur tersimpan sistem CDC, izin default cdc user (sys.database_principals) atau mengganti nama cdc user.

  • Rekomendasi: Pastikan cdc pengguna ada di database Anda, dan juga memiliki peran yang db_owner ditetapkan. Untuk membuat cdc pengguna, lihat contoh Membuat pengguna cdc dan menetapkan peran.

Kesalahan 18807 - Tidak dapat menemukan ID objek untuk tabel sistem replikasi

  • Penyebab: Kesalahan ini terjadi ketika SQL Server tidak dapat menemukan atau mengakses tabel sistem replikasi '%s.' Ini bisa karena tabel hilang atau tidak dapat dijangkau. Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, tabel perubahan, prosedur tersimpan sistem CDC, izin default cdc user (sys.database_principals) atau mengganti nama cdc user.

  • Rekomendasi: Verifikasi bahwa tabel sistem ada dan dapat diakses dengan mengkueri tabel secara langsung. Kueri katalog sistem sys.objects, atur klausa predikat dengan is_ms_shipped=1 dan schema_name='cdc' untuk mencantumkan semua objek terkait CDC. Jika kueri tidak mengembalikan objek apa pun, Anda harus menonaktifkan lalu mengaktifkan kembali CDC untuk database Anda. Mengaktifkan ubah pengambilan data untuk database membuat skema cdc, pengguna cdc, tabel metadata, dan objek sistem lainnya untuk database.

Kesalahan 21050 - Hanya anggota peran server tetap sysadmin atau db_owner yang dapat melakukan operasi ini

  • Penyebab: Pengguna cdc telah dihapus dari db_owner peran database, atau dari sysadmin peran server.

  • Rekomendasi: Pastikan cdc pengguna memiliki peran yang db_owner ditetapkan. Untuk membuat cdc pengguna, lihat contoh Membuat pengguna cdc dan menetapkan peran.

Manajemen Ruang Database

Kesalahan 1105 - Tidak dapat mengalokasikan ruang untuk objek dalam database karena grup file penuh

  • Penyebab: Kesalahan ini terjadi ketika grup file utama database kehabisan ruang, dan SQL Server tidak dapat mengalokasikan lebih banyak ruang untuk objek (seperti tabel atau indeks) dalam grup file tersebut.

  • Rekomendasi: Untuk mengatasi masalah ini, hapus data yang tidak perlu dalam database Anda untuk mengosongkan ruang. Identifikasi tabel, indeks, atau objek lain yang tidak digunakan dalam grup file yang dapat dihapus dengan aman. Memantau pemanfaatan ruang dengan cermat, untuk informasi selengkapnya, lihat Mengelola ruang file untuk database di Azure SQL Database

    Jika menghilangkan data/objek yang tidak perlu bukanlah opsi, pertimbangkan untuk mengalokasikan lebih banyak ruang untuk log transaksi database Anda. Untuk informasi selengkapnya tentang manajemen log transaksi, lihat arsitektur log transaksi SQL Server dan panduan manajemen

Batasan CDC

Kesalahan 2628 - string atau data biner akan dipotong dalam tabel

  • Penyebab: Mengubah ukuran kolom tabel yang diaktifkan CDC menggunakan pernyataan DDL dapat menyebabkan masalah dengan proses pengambilan CDC berikutnya. Tampilan Manajemen Dinamis (DMV) 'sys.dm_cdc_errors' berguna untuk memeriksa CDC apa pun untuk masalah yang dilaporkan, seperti nomor kesalahan 2628 dan 8115.

  • Rekomendasi: Sebelum membuat perubahan pada ukuran kolom, Anda harus menilai apakah perubahan kompatibel dengan data yang ada dalam tabel perubahan CDC. Untuk mengatasi masalah ini, Anda perlu menonaktifkan dan mengaktifkan kembali CDC untuk database Anda. Untuk informasi selengkapnya tentang mengaktifkan CDC untuk database atau tabel, lihat Mengaktifkan CDC untuk database dan Mengaktifkan CDC untuk tabel.

Kesalahan 913 - Pekerjaan penangkapan CDC gagal saat memproses perubahan untuk tabel dengan tipe data CLR sistem

  • Penyebab: Kesalahan ini terjadi saat mengaktifkan CDC pada tabel dengan tipe data CLR sistem, membuat perubahan DML, lalu membuat perubahan DDL pada tabel yang sama saat pekerjaan penangkapan CDC memproses perubahan yang terkait dengan tabel lain.

  • Rekomendasi: Langkah-langkah yang direkomendasikan adalah menghentikan DML ke tabel, menjalankan pekerjaan penangkapan untuk memproses perubahan, menjalankan DDL untuk tabel, menjalankan pekerjaan pengambilan untuk memproses perubahan DDL, lalu mengaktifkan kembali pemrosesan DML. Untuk informasi selengkapnya, lihat Pekerjaan penangkapan CDC gagal saat memproses perubahan.

Membuat pengguna dan menetapkan peran

cdc user Jika dihapus, Anda dapat menambahkan kembali pengguna secara manual.

Gunakan skrip T-SQL berikut, untuk membuat pengguna (cdc), dan menetapkan peran yang tepat untuk yang sama (db_owner).

IF NOT EXISTS 
(
    SELECT * 
    FROM sys.database_principals 
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] 
    WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

Memeriksa dan menambahkan keanggotaan peran

Untuk memverifikasi apakah cdc pengguna termasuk dalam sysadmin peran atau db_owner , jalankan kueri T-SQL berikut:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

cdc Jika pengguna bukan milik salah satu peran, jalankan kueri T-SQL berikut untuk menambahkan db_owner peran kepada cdc pengguna.

EXEC sp_addrolemember 'db_owner' , 'cdc';

Langkah berikutnya