Известные проблемы и ошибки с CDC

Применимо к: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), технология отслеживания измененных данных не всегда будет сохранять измененные данные в соответствии с данными в базовых таблицах. Это связано с тем, что промежуточные переменные хранилища не могут иметь связанные с ними параметры сортировки.

Рассмотрим один из следующих подходов, чтобы убедиться, что данные об изменениях соответствуют базовым таблицам:

  • Используйте тип данных NCHAR и NVARCHAR для столбцов, содержащих данные, не относящиеся к набору ASCII.

  • Также можно использовать одинаковые параметры сортировки для столбцов и для базы данных.

Например, если в базе данных используются параметры сортировки SQL_Latin1_General_CP1_CI_AS, можно использовать следующую таблицу:

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

Технология отслеживания измененных данных может не получать двоичные данные для столбца 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) не поддерживается. Если включить запись измененных данных (CDC) на SQL Server, функция агрессивного усечения журналов ADR отключена. Это связано с тем, что при проверке CDC выполняется обращение к журналу транзакций базы данных. Активные транзакции продолжают удерживать усечение журнала транзакций до тех пор, пока транзакция не зафиксирует, и проверка CDC не перехватывается или прерваны транзакции. Это может привести к различным проблемам, включая заполнение журнала транзакций больше, чем обычно, или операции с данными, записанные в боковой таблице, являются ненормальными.

При включении CDC рекомендуется использовать параметр повторного индекса. Возобновление индекса не требует открытия длительной транзакции для создания или перестроения индекса, что позволяет усечение журнала во время этой операции и более эффективное управление пространством журнала. Дополнительные сведения см. в руководстве по операциям с индексами в сети . Вопросы возобновления индексов.

Включение CDC завершается ошибкой, если схема или имя cdc пользователя уже существует

При включении CDC в базе данных создается новая схема и имя cdcпользователя. Поэтому не рекомендуется создавать пользовательскую схему или пользователя cdc вручную, так как она зарезервирована для использования системы.

Если вы вручную определили пользовательскую схему или пользователя cdc в базе данных, которая не связана с CDC, системная хранимая процедура sys.sp_cdc_enable_db не сможет включить CDC в базе данных со следующим сообщением об ошибке.

База данных не может быть включена для отслеживания измененных данных, так как пользователь базы данных <database_name> с именем CDC или схема с именем CDC уже существует в текущей базе данных. Эти объекты требуются исключительно CDC. Удалите или переименуйте этого пользователя или схему и повторите операцию.

Для разрешения этой проблемы:

  • Вручную удалите пустую cdc схему и cdc пользователя. После этого CDC можно успешно включить в базе данных.

Сбой CDC после сбоя ALTER COLUMN в VARCHAR и VARBINARY

Если тип данных столбца в таблице с поддержкой CDC изменяется на TEXTVARCHAR или на, IMAGEVARBINARY а существующая строка обновляется до значения вне строки. После обновления проверка CDC приведет к ошибкам.

Изменения DDL в исходных таблицах

Изменение размера столбцов таблицы с поддержкой CDC с помощью инструкций DDL может вызвать проблемы с последующим процессом записи CDC, что приведет к ошибке 2628 или ошибке 8115. Помните, что данные в таблицах изменений CDC сохраняются на основе параметров, настроенных пользователем. Поэтому перед внесением изменений в размер столбца необходимо оценить совместимость изменения с существующими данными в таблицах изменений CDC.

sys.dm_cdc_errors Если проверка завершается сбоем из-за ошибки 2628 или ошибки 8115 для таблиц изменений, сначала следует использовать данные об изменениях в затронутых таблицах изменений. После этого необходимо отключить и повторно включить 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 и Управляемый экземпляр SQL Azure. Ошибки, связанные с CDC, могут препятствовать надлежащему функционированию процесса захвата и привести к расширению журнала транзакций базы данных.

Чтобы изучить эти ошибки, можно запросить динамическое представление управления sys.dm_cdc_errors. Если sys.dm_cdc_errors динамическое представление управления возвращает любые ошибки, ознакомьтесь со следующим разделом, чтобы понять действия по устранению рисков.

Примечание.

Дополнительные сведения об определенном коде ошибки см. в ядро СУБД событиях и ошибках.

Это различные категории устранения неполадок, включенные в этот раздел:

Категория Description
Измененные метаданные Содержит сведения о том, как устранять проблемы, связанные с 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. Для правильной работы CDC не следует вручную изменять метаданные CDC, такие как CDC schema, таблицы изменений, системные хранимые процедуры CDC, разрешения по умолчанию cdc user илиsys.database_principals переименование 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 пользователь был удален из db_owner роли базы данных или из sysadmin роли сервера.

  • Рекомендация. Убедитесь, что cdc у пользователя назначена db_owner роль. Чтобы создать cdc пользователя, см. пример создания пользователя cdc и назначение роли.

Управление пространством базы данных

Ошибка 1105. Не удалось выделить пространство для объекта в базе данных, так как файловая группа заполнена

  • Причина. Эта ошибка возникает, когда основная файловая группа базы данных не занимает места, и SQL Server не может выделить больше места для объекта (например, таблицы или индекса) в этой файловой группе.

  • Рекомендация. Чтобы устранить эту проблему, удалите ненужные данные в базе данных, чтобы освободить место. Определите неиспользуемые таблицы, индексы или другие объекты в файловой группе, которые можно безопасно удалить. Внимательно отслеживайте использование пространства, дополнительные сведения см. в статье "Управление пространством файлов для баз данных в База данных SQL Azure

    Если удаление ненужных данных или объектов не является вариантом, рассмотрите возможность выделения большего пространства для журнала транзакций базы данных. Дополнительные сведения об управлении журналами транзакций см . в руководстве по архитектуре и управлению журналами транзакций SQL Server.

Ограничение CDC

Ошибка 2628 — строковые или двоичные данные будут усечены в таблице

  • Причина. Изменение размера столбцов таблицы с поддержкой CDC с помощью инструкций DDL может вызвать проблемы с последующим процессом записи CDC. Динамическое административное представление (DMV) "sys.dm_cdc_errors" удобно для проверка для любых обнаруженных проблем, таких как ошибки 2628 и 8115.

  • Рекомендация. Прежде чем вносить изменения в размер столбца, необходимо оценить совместимость изменения с существующими данными в таблицах изменений CDC. Чтобы устранить эту проблему, необходимо отключить и повторно включить CDC для базы данных. Дополнительные сведения о включении CDC для базы данных или таблицы см. в разделе "Включение CDC для базы данных" и включение CDC для таблицы.

Ошибка 913 — задание записи CDC завершается сбоем при обработке изменений таблицы с типом данных system CLR

  • Причина. Эта ошибка возникает при включении CDC в таблице с типом данных system CLR, внесении изменений DML и последующем внесении изменений DDL в той же таблице, в то время как задание записи CDC обрабатывает изменения, связанные с другими таблицами.

  • Рекомендация. Рекомендуемые действия — выполнить задание отслеживания DML для обработки изменений, запустить DDL для таблицы, запустить задание записи для обработки изменений DDL, а затем повторно включить обработку DML. Дополнительные сведения см. в статье о сбое задания записи CDC при обработке изменений.

Создание пользователя и назначение роли

Если он 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 пользователь либо sysadmindb_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';

Следующие шаги