Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server
Azure SQL Managed Instance
Artikel ini membahas batasan, masalah, dan kesalahan yang diketahui dengan penangkapan data perubahan (CDC) untuk SQL Server dan Azure SQL Managed Instance.
Untuk Azure SQL Database, lihat Masalah umum dengan CDC di Azure SQL Database.
Mengubah metadata
Agar CDC berfungsi dengan baik, Anda tidak boleh memodifikasi metadata CDC apa pun secara manual seperti CDC schema, mengubah tabel, prosedur tersimpan sistem CDC, izin cdc user default (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 kolasi
Penting untuk menyadari situasi di mana Anda memiliki pengurutan yang berbeda antara database dan kolom tabel yang dikonfigurasi untuk penangkapan data perubahan. CDC menggunakan penyimpanan sementara untuk mengisi tabel pendukung. Jika tabel memiliki kolom char atau varchar dengan kolasi yang berbeda dari kolasi database, dan jika kolom tersebut menyimpan karakter non-ASCII (seperti karakter DBCS byte ganda), CDC mungkin tidak dapat mempertahankan konsistensi data yang diubah 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 nchar
atau jenis data 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 kolasinya berbeda (Chinese_PRC_CI_AI). Gunakan nvarchar
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 yang dipercepat (ADR) dan pengambilan data perubahan (CDC)
Mengaktifkan pengambilan data perubahan (CDC) dan pemulihan database yang dipercepat (ADR) untuk database yang sama tidak didukung di SQL Server 2019 (15.x). Mengaktifkan CDC dan ADR didukung di versi SQL Server yang lebih baru yang dimulai dengan Pembaruan Kumulatif SQL Server 2022 (16.x) 18.
Saat Anda mengaktifkan CDC, fitur pemotongan log agresif ADR dinonaktifkan. Ini karena pemindaian CDC mengakses log transaksi database. Transaksi aktif terus menahan pemendekan log transaksi sampai transaksi diselesaikan dan pemindaian CDC terkejar, atau transaksi dibatalkan. Jika Anda mengaktifkan CDC pada database tempat ADR diaktifkan, Anda mungkin mengamati pemanfaatan log transaksi yang lebih tinggi. Pastikan ruang log transaksi yang memadai tersedia untuk kebutuhan semua beban kerja Anda.
Aktifkan 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, membuat skema kustom atau pengguna bernama cdc secara manual tidak dianjurkan, karena dikhususkan untuk penggunaan sistem.
Jika Anda telah menentukan skema kustom atau pengguna bernama cdc secara manual di database Anda yang tidak terkait dengan CDC, prosedur tersimpan sistem sys.sp_cdc_enable_db gagal mengaktifkan CDC pada database dengan pesan kesalahan berikut.
The database <database_name> cannot be enabled for change data capture because a database user named 'cdc' or a schema named 'cdc' already exists in the current database. These objects are required exclusively by CDC. Drop or rename the user or schema and retry the operation.
Untuk mengatasi masalah ini:
- Hapus skema kosong
cdcdan penggunacdcsecara manual. Kemudian, CDC dapat berhasil diaktifkan pada database.
CDC gagal setelah ALTER COLUMN
Saat jenis data kolom pada tabel yang diaktifkan CDC diubah ke konversi yang tidak didukung, pemindaian CDC mungkin mengakibatkan kesalahan setelah pembaruan.
Berikut ini adalah contoh ALTER COLUMN perubahan jenis data yang tidak didukung saat CDC diaktifkan pada tabel:
- bigint ke int
- char(x), nvarchar(x), atau nvarchar(x) ke uniqueidentifier, DATE, atau INT
Mengubah tipe data kolom dalam tabel berkemampuan CDC dapat mengakibatkan kesalahan berikut:
- Kesalahan 241 - Konversi gagal saat mengonversi tanggal dan/atau waktu dari string karakter.
- Kesalahan 245 - Konversi gagal saat mengonversi nilai.
- Kesalahan 8169 - Konversi gagal saat mengonversi dari string karakter ke uniqueidentifier.
Mengubah ukuran kolom dari tabel yang diaktifkan CDC dengan menggunakan pernyataan DDL dapat menyebabkan masalah pada proses penangkapan CDC berikutnya dan dapat mengakibatkan kesalahan berikut:
- Kesalahan 2628 - String atau data biner akan dipotong dalam tabel.
- Kesalahan 8115 - Kesalahan luapan aritmatika ketika mengonversi tipe data dari bigint ke int
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.
Mengaktifkan CDC gagal ketika pemicu CREATE OBJECT ada
Saat Anda mengaktifkan CDC, cdc user dibuat untuk mengelola proses pembentukan CDC.
cdc user menjalankan sejumlah prosedur tersimpan untuk mengaktifkan CDC, dan beberapa prosedur tersimpan ini membuat objek yang mengaktifkan pemicu CREATE OBJECT yang ada. Karena cdc user tidak memiliki izin untuk menulis ke database master, prosedur tersimpan CDC ini gagal dengan kesalahan 22830.
Nonaktifkan pemicu CREATE OBJECT apa pun sebelum mengaktifkan CDC pada database. Aktifkan kembali pemicu ini setelah CDC dikonfigurasi.
Mengimpor database menggunakan operasi Impor, Ekspor, Ekstrak, dan Terbitkan pada 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.
Perubahan partisi menggunakan variabel
Menggunakan variabel dengan pergantian partisi pada database atau tabel dengan penangkapan data perubahan (CDC) tidak didukung oleh pernyataan ALTER TABLE ... SWITCH TO ... PARTITION ... tersebut. Lihat batasan pengalihan partisi untuk mempelajari selengkapnya.
Operasi online
Pernyataan DDL online tidak didukung
Di Azure SQL Managed Instance dan versi SQL Server sebelum SQL Server 2025 (17.x), pernyataan DDL online ALTER TABLE tidak didukung saat tangkapan data perubahan diaktifkan pada database.
Operasi indeks online tidak didukung
Operasi indeks online tidak didukung saat pengambilan data perubahan diaktifkan pada database. Anda dapat mengalami Kesalahan 18773, "Tidak dapat menemukan rekaman informasi teks untuk kolom "%.*ls", ID %d selama konstruksi perintah.".
Batasan default pada kolom yang ditambahkan
Ketika CDC diaktifkan pada tabel dan kolom yang tidak dapat diubah ke null dengan batasan default ditambahkan, data baris yang ada akan memiliki nilai batasan default. Namun, CDC akan menggunakan NULL alih-alih nilai default untuk baris yang ada . Ini hanya berlaku untuk data yang ada sebelum DDL diterapkan. Sebagai solusinya, terbitkan pernyataan UPDATE yang tidak berubah ke baris yang ada, atau lakukan ALTER INDEX ... REBUILD pada indeks berkluster tabel. Gunakan ALTER TABLE ... REBUILD pada timbunan jika tidak ada indeks berkluster.
Troubleshooting
Langkah-langkah bagian ini untuk memecahkan masalah kesalahan yang terkait dengan CDC di SQL Server, dan Azure SQL Managed Instance. Kesalahan terkait CDC mungkin menghalangi berfungsinya dengan baik dari proses pencatatan dan menyebabkan perluasan log transaksi database.
Untuk memeriksa kesalahan-kesalahan ini, Anda bisa mengkueri tampilan manajemen dinamis sys.dm_cdc_errors. Jika sys.dm_cdc_errors tampilan manajemen dinamis mengembalikan kesalahan apa pun, tinjau informasi pemecahan masalah berikut.
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 dimodifikasi | Mencakup informasi tentang cara mengurangi masalah yang terkait dengan CDC ketika tabel yang dilacak telah dimodifikasi atau dihapus. |
| 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, mengubah tabel, prosedur tersimpan sistem CDC, izincdc userdefault (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 and schema_name='cdc' tidak boleh diubah atau dihilangkan.
Kesalahan 1202 - Prinsipal database tidak ada, atau pengguna bukan anggota
Penyebab: Kesalahan mungkin terjadi ketika
cdc usertelah dihilangkan. 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, atau mengganti namacdc user.Rekomendasi: Pastikan
cdcpengguna ada di database Anda, dan juga memiliki peran yangdb_ownerditetapkan. Untuk membuatcdcpengguna, lihat contoh Membuat pengguna cdc dan menetapkan peran.
Kesalahan 15517 - Tidak dapat dijalankan sebagai entitas database karena entitas tidak ada
Penyebab: Jenis prinsipal ini tidak dapat ditiru, atau Anda tidak memiliki izin. Kesalahan mungkin terjadi ketika metadata CDC telah dihapus atau tidak lagi menjadi bagian dari peran
db_owner. 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, atau mengganti namacdc user.Rekomendasi: Pastikan
cdcpengguna ada di database Anda, dan juga memiliki peran yangdb_ownerditetapkan. Untuk membuatcdcpengguna, 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, 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 and 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 perekaman data perubahan untuk database membentuk skema dan 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:
cdc usertelah dihapus dari peran databasedb_owner, atau dari peran serversysadmin.Rekomendasi: Pastikan
cdc usermemiliki perandb_owneryang telah ditetapkan. Untuk membuatcdcpengguna, lihat contoh Membuat pengguna cdc dan menetapkan peran.
Kesalahan 22830 - Tidak dapat memperbarui metadata yang menunjukkan database <database name> diaktifkan untuk Change Data Capture. Kegagalan terjadi saat menjalankan perintah <CDC stored procedure name>.
Penyebab: Kesalahan ini terjadi ketika pemicu
CREATE OBJECTada di database atau di server. Saat Anda mengaktifkan CDC,cdc userdibuat untuk mengelola proses pembentukan CDC.cdc usermenjalankan sejumlah prosedur tersimpan untuk mengaktifkan CDC, dan beberapa prosedur tersimpan ini membuat objek yang mengaktifkan pemicuCREATE OBJECTyang ada. Karenacdc usertidak memiliki izin untuk menulis ke databasemaster, prosedur tersimpan CDC ini gagal dengan kesalahan 22830.Rekomendasi: Sebelum Anda mengaktifkan CDC pada database, nonaktifkan pemicu
CREATE OBJECTapa pun. Aktifkan kembali pemicu-pemicu ini setelah CDC dikonfigurasi.
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 241 - Konversi gagal saat mengonversi tanggal dan/atau waktu dari string karakter
Penyebab: Kesalahan ini terjadi ketika ALTER COLUMN dilakukan pada jenis data tanggal dan tabel mengaktifkan CDC. Misalnya, jika tabel memiliki kolom nvarchar dan Anda mengubah jenis data menjadi tanggal (misalnya,
ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), Anda mungkin melihat kesalahan ini di sys.dm_cdc_errors DMV. Kesalahan 241 disebabkan oleh konversi data yang tidak didukung dalam tabel perubahan, meskipunALTERperintah pada tabel sumber berhasil.Rekomendasi: Untuk mengatasi masalah ini, nonaktifkan dan aktifkan kembali CDC untuk tabel Anda setelah mengubah kolom. Atau, nonaktifkan CDC sebelum mengubah kolom, lalu aktifkan kembali CDC setelah
ALTER COLUMNperubahan.
Kesalahan 245 - Konversi gagal saat mengonversi nilai dari string ke int
Penyebab: Kesalahan ini terjadi ketika perintah UBAH KOLOM dikeluarkan untuk mengubah jenis data kolom saat tabel mengaktifkan CDC. Misalnya, jika tabel memiliki kolom nvarchar dan Anda mengubah jenis data menjadi int (misalnya,
ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL), Anda mungkin melihat kesalahan ini di sys.dm_cdc_errors DMV. Kesalahan 245 disebabkan oleh konversi data yang tidak didukung dalam tabel perubahan, meskipunALTERperintah pada tabel sumber berhasil.Rekomendasi: Untuk mengatasi masalah ini, nonaktifkan dan aktifkan kembali CDC untuk tabel Anda setelah mengubah kolom. Atau, nonaktifkan CDC sebelum mengubah kolom, lalu aktifkan kembali CDC setelah
ALTER COLUMNperubahan.
Kesalahan 913 - Pekerjaan penangkapan CDC gagal saat memproses perubahan untuk tabel dengan jenis data CLR sistem
Penyebab: Kesalahan ini terjadi saat mengaktifkan CDC pada tabel dengan jenis 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 pencatatan untuk memproses perubahan, menjalankan DDL untuk tabel, menjalankan pekerjaan pencatatan untuk memproses perubahan DDL, lalu mengaktifkan kembali DML. Untuk informasi selengkapnya, lihat Pekerjaan penangkapan CDC gagal saat memproses perubahan untuk tabel dengan jenis data CLR sistem (geometri, geografi, atau hierarkiid).
Kesalahan 2628 - string atau data biner akan dipotong dalam tabel
Penyebab: Mengubah ukuran kolom pada tabel yang diaktifkan untuk CDC menggunakan pernyataan DDL dapat menyebabkan masalah dengan proses pengambilan data CDC berikutnya. Tampilan Dynamic Management View (DMV) sys.dm_cdc_errors berguna untuk memeriksa segala masalah yang dilaporkan pada CDC, seperti kesalahan nomor 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 8115 - Kesalahan luapan aritmatika mengonversi jenis data dari bigint ke int
Penyebab: Kesalahan ini terjadi ketika ALTER COLUMN DDL dijalankan pada tabel berkemampuan CDC yang menghasilkan penurunan presisi kolom (seperti mengubah jenis data kolom dari bigint ke int). Kolom dengan presisi yang dikurangi tidak dapat menampung nilai yang ada dalam tabel perubahan.
Rekomendasi: Untuk mengatasi masalah ini, nonaktifkan dan aktifkan kembali CDC untuk tabel Anda setelah mengubah kolom. Atau, nonaktifkan CDC sebelum menjalankan
ALTER COLUMNperintah, lalu aktifkan kembali CDC setelahALTER COLUMNperubahan.
Kesalahan 8169 - Konversi gagal saat mengonversi dari string karakter ke uniqueidentifier
Penyebab: Kesalahan ini terjadi ketika perintah ALTER COLUMN dikeluarkan untuk mengubah jenis data kolom saat tabel mengaktifkan CDC. Misalnya, jika tabel memiliki kolom char(x), nvarchar(x), nvarchar(x) dan Anda mengubah jenis data menjadi uniqueidentifier (seperti:
ALTER TABLE table_name ALTER COLUMN [column_name] uniqueidentifier), Anda mungkin melihat kesalahan ini di Tampilan Manajemen Dinamis (DMV) sys.dm_cdc_errors . Kesalahan 8169 menunjukkan konversi data yang tidak didukung dalam tabel perubahan, meskipun perintah UBAH pada tabel sumber berhasil.Rekomendasi: Untuk mengatasi masalah ini, nonaktifkan dan aktifkan kembali CDC untuk tabel Anda setelah mengubah kolom. Atau, nonaktifkan CDC sebelum menjalankan
ALTER COLUMNperintah, lalu aktifkan kembali CDC setelahALTER COLUMNperubahan.
Membuat pengguna dan menetapkan peran
Jika cdc user 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';
Periksa dan tambahkan 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');
Jika cdc pengguna bukan milik salah satu peran, jalankan kueri T-SQL berikut untuk menambahkan peran db_owner kepada pengguna cdc.
EXEC sp_addrolemember 'db_owner' , 'cdc';