Batasan, masalah, dan kesalahan yang diketahui dengan CDC
Berlaku untuk: SQL Server Azure SQL Managed Instance
Artikel ini menjelaskan batasan, 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 ubah pengambilan data (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.
Pernyataan DDL online tidak didukung
Pernyataan DDL online tidak didukung saat perubahan pengambilan data diaktifkan pada database.
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 kosongcdc
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 defaultcdc user
(sys.database_principals
) atau mengganti namacdc 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 defaultcdc user
(sys.database_principals
) atau mengganti namacdc user
.Rekomendasi: Pastikan
cdc
pengguna ada di database Anda, dan juga memiliki peran yangdb_owner
ditetapkan. Untuk membuatcdc
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 sepertiCDC schema
, tabel perubahan, prosedur tersimpan sistem CDC, izin defaultcdc user
(sys.database_principals
) atau mengganti namacdc user
.Rekomendasi: Pastikan
cdc
pengguna ada di database Anda, dan juga memiliki peran yangdb_owner
ditetapkan. Untuk membuatcdc
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 defaultcdc user
(sys.database_principals
) atau mengganti namacdc 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 daridb_owner
peran database, atau darisysadmin
peran server.Rekomendasi: Pastikan
cdc
pengguna memiliki peran yangdb_owner
ditetapkan. Untuk membuatcdc
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
- Untuk gambaran umum CDC untuk SQL Server, lihat Apa itu perubahan pengambilan data (CDC)?
- Untuk informasi selengkapnya tentang masalah dan batasan yang diketahui untuk CDC dengan Azure SQL Database, lihat Masalah dan batasan yang diketahui CDC dengan Azure SQL Database
- Untuk informasi selengkapnya tentang cara mengaktifkan dan menonaktifkan CDC, lihat Mengaktifkan dan menonaktifkan penangkapan data perubahan