Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server Управляемый экземпляр SQL Azure
В этой статье описываются известные ограничения, проблемы и ошибки с записью измененных данных (CDC) для SQL Server и управляемого экземпляра SQL Azure.
Сведения о базе данных SQL Azure см. в статье Известные проблемы с CDC в базе данных SQL Azure.
Изменение метаданных
Для правильной работы CDC не следует вручную изменять метаданные CDC, такие как CDC schema
, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчанию cdc user
(sys.database_principals) или переименовать cdc user
.
Любые объекты в sys.objects с is_ms_shipped
набором 1
свойств не должны быть изменены.
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'
Различия в параметрах сортировки
Обязательно учитывать ситуацию, когда между базой данных и столбцами таблицы, настроенной для захвата изменений, существуют различные параметры сортировки. Для заполнения вспомогательных таблиц используется промежуточное хранилище. Если в таблице есть char или столбцы varchar с параметрами сортировки, отличающимися от сортировки базы данных, и если эти столбцы хранят символы, отличные от ASCII (например, двойные символы DBCS), CDC может не сохранять измененные данные в соответствии с данными в базовых таблицах. Это связано с тем, что промежуточные переменные хранилища не могут иметь связанные с ними параметры сортировки.
Рассмотрим один из следующих подходов, чтобы убедиться, что данные об изменениях соответствуют базовым таблицам:
Используйте nchar или тип данных nvarchar для столбцов, содержащих данные, отличные от ASCII.
Также можно использовать одинаковые параметры сортировки для столбцов и для базы данных.
Например, если у вас есть одна база данных, которая использует параметр сортировки SQL_Latin1_General_CP1_CI_AS, рассмотрите следующую таблицу:
CREATE TABLE T1(
C1 INT PRIMARY KEY,
C2 VARCHAR(10) collate Chinese_PRC_CI_AI)
Система CDC может не получить двоичные данные для столбца C2, поскольку используется другая сортировка (Chinese_PRC_CI_AI). Используйте 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
)
Ускорение восстановления базы данных (ADR) и запись измененных данных (CDC)
Включение отслеживания измененных данных (CDC) и ускорение восстановления базы данных (ADR) для одной базы данных не поддерживается в SQL Server 2019 (15.x). Включение как CDC, так и ADR поддерживается в более поздних версиях SQL Server, начиная с SQL Server 2022 (16.x) Накопительное обновление 18.
Если включить CDC, функция агрессивного усечения журнала ADR будет отключена. Это связано с тем, что при проверке CDC выполняется обращение к журналу транзакций базы данных. Активные транзакции продолжают удерживать усечение журнала транзакций до тех пор, пока транзакция не будет зафиксирована и проверка CDC не догонит, или транзакция не будет прервана. Если включить CDC в базе данных, в которой включен ADR, вы можете наблюдать более высокую загрузку журнала транзакций. Убедитесь, что достаточно места в журнале транзакций доступно для всех рабочих нагрузок.
При включении CDC мы рекомендуем использовать опцию возобновляемого индекса. Возобновляемый индекс не требует открытия длительной транзакции для создания или перестроения индекса, что позволяет усечение журнала во время создания или перестроения индекса и более эффективное использование пространства журнала. Дополнительные сведения см. в Рекомендациях по операциям с индексами в сети — вопросы, касающиеся возобновления индексов.
Операторы DDL в Сети неподдерживаются
Онлайн операторы DDL не поддерживаются при включении отслеживания изменений данных в базе данных.
Включение CDC завершается ошибкой, если схема или пользователь с именем cdc
уже существует.
При включении CDC в базе данных создается новая схема и пользователь с именем cdc
. Поэтому создание схемы или пользователя с именем cdc
вручную не рекомендуется, так как имя зарезервировано для системного использования.
Если вы вручную определили пользовательскую схему или пользователя с именем cdc
в базе данных, которая не связана с CDC, системная хранимая процедура sys.sp_cdc_enable_db
не сможет включить CDC в базе данных со следующим сообщением об ошибке.
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.
Для разрешения этой проблемы:
- Вручную удалите пустую схему
cdc
и пользователяcdc
. После этого CDC можно успешно активировать на базе данных.
Сбой CDC после использования ALTER COLUMN для изменения на varchar и varbinary.
Если тип данных столбца в таблице с поддержкой CDC изменяется с text на nvarcharили image на varbinary, и существующая строка обновляется до значения, хранящегося вне строки. После обновления проверка CDC приведет к ошибкам.
Изменения DDL в исходных таблицах
Изменение размера столбцов таблицы с поддержкой CDC с помощью инструкций DDL может вызвать проблемы с последующим процессом записи CDC, что приведет к ошибке 2628 или ошибке 8115. Помните, что данные в таблицах изменений CDC сохраняются на основе параметров, настроенных пользователем. Поэтому перед внесением изменений в размер столбца необходимо оценить совместимость изменения с существующими данными в таблицах изменений CDC.
sys.dm_cdc_errors
Если индикация показывает, что сканирования завершаются сбоем из-за ошибки 2628 или ошибки 8115 для таблиц изменений, сначала следует обработать данные об изменениях в затронутых таблицах изменений. После этого необходимо отключить и затем вновь включить CDC на таблице, чтобы эффективно устранить проблему.
Включение CDC завершается ошибкой при наличии триггеров CREATE OBJECT
При включении CDC создается cdc user
для управления процессом создания CDC.
cdc user
запускает ряд хранимых процедур для включения CDC, а некоторые из этих хранимых процедур создают объекты, которые вызывают существующие триггеры CREATE OBJECT
. Так как cdc user
не имеет разрешения на запись в базу данных master
, эти хранимые процедуры CDC завершаются ошибкой 22830.
Отключите все триггеры CREATE OBJECT
перед активацией CDC в базе данных. Включите заново эти триггеры после настройки CDC.
Импорт базы данных с использованием операций импорта/экспорта уровня данных, а также извлечения и публикации.
Для баз данных SQL с поддержкой CDC при использовании SqlPackage, SSDT или других средств SQL при импорте/экспорте, извлечении или публикации схема cdc
и пользователь исключаются в новой базе данных. Другие объекты CDC, не участвующие в операциях импорта/экспорта и извлечения/развертывания, включают таблицы, помеченные как is_ms_shipped=1
в sys.objects.
Даже если CDC не включен и вы определили пользовательскую схему или пользователя cdc
в вашей базе данных, которая также будет исключена из процессов импорта и экспорта и извлечения и развертывания в ходе операций по импорту/установке новой базы данных.
Переключение секций с помощью переменных
Использование переменных с переключением секций в базах данных или таблицах с записью измененных данных (CDC) не поддерживается для инструкции ALTER TABLE ... SWITCH TO ... PARTITION ...
. Подробную информацию см. в разделе об ограничениях переключения разделов.
Устранение ошибок
В этом разделе представлены шаги по устранению ошибок, связанных с CDC на SQL Server и Azure SQL Managed Instance. Ошибки, связанные с CDC, могут препятствовать надлежащему функционированию процесса захвата и привести к расширению журнала транзакций базы данных.
Чтобы изучить эти ошибки, выполните запрос к представлению динамического управления sys.dm_cdc_errors. Если sys.dm_cdc_errors динамическое представление управления возвращает любые ошибки, ознакомьтесь со следующим разделом, чтобы понять действия по устранению рисков.
Примечание.
Дополнительные сведения об определенном коде ошибки см. в разделе события и ошибки СУБД.
Это различные категории устранения неполадок, включенные в этот раздел:
Категория | Описание |
---|---|
Измененные метаданные | Содержит информацию о том, как устранять проблемы, связанные с CDC, когда отслеживаемая таблица была изменена или удалена. |
Управление пространством базы данных | Содержит сведения о том, как устранять проблемы при исчерпании пространства базы данных. |
Ограничение CDC | Содержит сведения о том, как устранять проблемы, вызванные ограничениями CDC. |
Измененные метаданные
Ошибка 200/208 — недопустимое имя объекта
Причина. Ошибка может возникать при удалении метаданных CDC. Для правильной работы CDC не следует вручную изменять метаданные CDC, такие как
CDC schema
, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчаниюcdc user
(sys.database_principals) или переименоватьcdc user
.Рекомендация. Чтобы устранить эту проблему, необходимо отключить и повторно включить CDC для базы данных. При включении отслеживания измененных данных для базы данных создаются схема cdc, пользователь cdc, таблицы метаданных и другие системные объекты для базы данных.
Примечание.
Объекты, обнаруженные в представлении системного каталога sys.objects с is_ms_shipped=1 и schema_name='cdc', не должны быть изменены или удалены.
Ошибка 1202 — субъект базы данных не существует, или пользователь не является членом
Причина: ошибка может возникать, если
cdc user
был удален. Для правильной работы CDC не следует вручную изменять метаданные CDC, такие какCDC schema
, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчанию, такие какcdc user
, или переименовыватьcdc user
.Рекомендация: Убедитесь, что
cdc
пользователь существует в вашей базе данных, и также убедитесь, что назначенаdb_owner
роль. Чтобы создатьcdc
пользователя, посмотрите, например, создание пользователя cdc и назначение роли.
Ошибка 15517. Не удается выполнить в качестве субъекта базы данных, так как субъект не существует
Причина: этот тип субъекта не может быть олицетворен или у вас нет разрешения. Ошибка может возникать, когда метаданные CDC удалены или более не являются частью роли
db_owner
. Для правильной работы CDC не следует вручную изменять метаданные CDC, такие какCDC schema
, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчаниюcdc user
(sys.database_principals) или переименоватьcdc user
.Рекомендация: Убедитесь, что
cdc
пользователь существует в вашей базе данных и ему назначенаdb_owner
роль. Чтобы создатьcdc
пользователя, см. пример создание пользователя cdc и назначение роли.
Ошибка 18807. Не удается найти идентификатор объекта для таблицы системы репликации
Причина. Эта ошибка возникает, когда SQL Server не может найти или получить доступ к системной таблице репликации "%s". Это может быть связано с отсутствием или недоступной таблицей. Для правильной работы CDC не следует вручную изменять метаданные CDC, такие как
CDC schema
, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчаниюcdc user
(sys.database_principals) или переименоватьcdc user
.Рекомендация. Убедитесь, что системная таблица существует и доступна, запрашивая таблицу напрямую. Выполните запрос каталога системы sys.objects, установите предикат с is_ms_shipped=1 и schema_name='cdc', чтобы перечислить все объекты, связанные с CDC. Если запрос не возвращает объекты, необходимо отключить и повторно включить CDC для базы данных. Включение отслеживания изменений для базы данных создает схему cdc, пользователя cdc, таблицы метаданных и другие системные объекты для базы данных.
Ошибка 21050. Только члены предопределенных ролей сервера sysadmin или db_owner могут выполнять эту операцию.
причина:
cdc user
удален из роли базы данныхdb_owner
или из роли сервераsysadmin
.Рекомендация: Убедитесь, что у
cdc user
назначена рольdb_owner
. Для созданияcdc
пользователя см. пример Создание пользователя cdc и назначение роли.
Ошибка 22830. Не удалось обновить метаданные, указывающие, что база данных <database name>
включена для отслеживания измененных данных. При выполнении команды <CDC stored procedure name>
произошел сбой.
причина. Эта ошибка возникает, когда триггер CREATE OBJECT существует в базе данных или на сервере. При включении CDC создается
cdc user
для управления процессом создания CDC.cdc user
запускает ряд хранимых процедур для включения CDC, а некоторые из этих хранимых процедур создают объекты, которые вызывают существующие триггерыCREATE OBJECT
. Так какcdc user
не имеет разрешения на запись в базу данныхmaster
, эти хранимые процедуры CDC завершаются ошибкой 22830.Рекомендация: Перед тем как включить CDC в базе данных, отключите все триггеры
CREATE OBJECT
. Повторно включим эти триггеры после настройки CDC.
Управление пространством базы данных
Ошибка 1105. Не удалось выделить пространство для объекта в базе данных, так как файловая группа заполнена
Причина. Эта ошибка возникает, когда основная файловая группа базы данных не занимает места, и SQL Server не может выделить больше места для объекта (например, таблицы или индекса) в этой файловой группе.
Рекомендация. Чтобы устранить эту проблему, удалите ненужные данные в базе данных, чтобы освободить место. Определите неиспользуемые таблицы, индексы или другие объекты в файловой группе, которые можно безопасно удалить. Внимательно отслеживайте использование пространства, дополнительные сведения см. в статье "Управление пространством файлов для баз данных в База данных SQL Azure
Если удаление ненужных данных или объектов не является вариантом, рассмотрите возможность выделения большего пространства для журнала транзакций базы данных. Дополнительные сведения об управлении журналами транзакций см . в руководстве по архитектуре и управлению журналами транзакций SQL Server.
Ограничение CDC
Ошибка 2628 — строковые или двоичные данные будут усечены в таблице
Причина: Изменение размера столбцов таблицы с поддержкой CDC с помощью инструкций DDL может вызвать проблемы с последующим процессом захвата CDC. Динамическое административное представление (DMV) "sys.dm_cdc_errors" полезно для проверки любых сообщений об ошибках в CDC, таких как ошибки под номерами 2628 и 8115.
Рекомендация. Прежде чем вносить изменения в размер столбца, необходимо оценить совместимость изменения с существующими данными в таблицах изменений CDC. Чтобы устранить эту проблему, необходимо отключить и повторно включить CDC для базы данных. Дополнительные сведения о включении CDC для базы данных или таблицы см. в разделах Включение CDC для базы данных и Включение CDC для таблицы.
Ошибка 913 — задание записи CDC завершается сбоем при обработке изменений таблицы с типом данных system CLR
Причина: Эта ошибка возникает при включении CDC в таблице с типом данных system CLR, внесении изменений в DML и последующем внесении изменений в DDL в той же таблице, в то время как задание захвата CDC обрабатывает изменения, связанные с другими таблицами.
Рекомендация: Рекомендуемые действия — приостановить DML на таблице, запустить задание захвата для обработки изменений, выполнить DDL для таблицы, запустить задание захвата для обработки изменений DDL, а затем снова включить обработку DML. Дополнительные сведения см. в разделе о том, как задание захвата CDC завершается сбоем при обработке изменений для таблицы с типом данных CLR системы (geometry, geography или hierarchyid).
Создание пользователя и назначение роли
Если cdc user
был удален, вы можете вручную добавить пользователя заново.
Используйте следующий скрипт T-SQL, чтобы создать пользователя (cdc
) и назначить соответствующую роль для той же (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';
Проверка и добавление членства в роли
Чтобы проверить, принадлежит ли cdc
пользователь либо роли sysadmin
или db_owner
, выполните следующий запрос T-SQL:
EXECUTE AS USER = 'cdc';
SELECT is_srvrolemember('sysadmin'), is_member('db_owner');
cdc
Если пользователь не принадлежит ни к той или иной роли, выполните следующий запрос T-SQL, чтобы добавить db_owner
роль пользователюcdc
.
EXEC sp_addrolemember 'db_owner' , 'cdc';