Hàng khoá trùng lặp khỏi bảng sys.syscommittab trong SQL Server

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 3083381
Triệu chứng
Khi bạn so sánh SYSCOMMITTABLE trong bộ nhớ và tệp trên ổ đĩa sys.syscommittab trong Microsoft SQL Server, bạn có thể thấy hàng khoá trùng lặp. Các giá trị lặp lại có thể gây ra hoạt động sao lưu và kiểm tra không thành công.

Nguyên nhân
Sự cố này xảy ra do vấn đề trong SQL Server thay đổi theo dõi.
Giải pháp
Để giải quyết các yếu tố gây ra các khoá trùng lặp, áp dụng một trong các bản vá, tuỳ theo trường hợp của bạn:

Khắc phục: Thao tác sao lưu vào bộ máy cơ sở dữ liệu SQL Server 2008 hay SQL Server 2008 R2 không thành công nếu bạn cho phép thay đổi theo dõi này bộ máy cơ sở dữ liệu
http://support.Microsoft.com/kb/2522893

Khắc phục: sao lưu không thành công trong SQL Server 2008, SQL Server 2008 R2 hoặc SQL Server 2012 nếu bạn cho phép thay đổi theo dõi trên bộ máy cơ sở dữ liệu
http://support.Microsoft.com/kb/2603910

Khắc phục: Thao tác sao lưu không thành công trong bộ máy cơ sở dữ liệu SQL Server 2008, SQL Server 2008 R2 hoặc SQL Server 2012 sau khi bạn kích hoạt thay đổi được theo dõi
http://support.Microsoft.com/kb/2682488

Mặc dù các bản vá lỗi ngăn hàng khoá trùng lặp tiếp tục xuất hiện, họ không tự động xoá hàng trùng lặp. Không xoá hàng trùng lặp, bộ máy cơ sở dữ liệu bị ảnh hưởng không thể hoàn thành điểm kiểm tra bộ máy cơ sở dữ liệu và sao lưu có thể không thành công.

Xoá hàng trùng lặp, sử dụng một trong các phương pháp sau.

Phương pháp 1: Vô hiệu hoá và kích hoạt thay đổi được theo dõi

  1. Vô hiệu hoá các thay đổi theo dõi bảng bị ảnh hưởng và bộ máy cơ sở dữ liệu.
  2. Vấn đề bộ máy cơ sở dữ liệu hướng dẫn sử dụng kiểm tra.
  3. Cho phép thay đổi theo dõi trên bảng bộ máy cơ sở dữ liệu bị ảnh hưởng.

Để biết thêm thông tin về thay đổi theo dõi, hãy xemBật và tắt thay đổi được theo dõi.

Để biết thông tin về cách vấn đề kiểm tra thủ công, hãy xem Kiểm tra (Transact-SQL)

Phương pháp 2: Tự xoá hàng trùng lặp

  1. Sao chép tập lệnh Transact-SQL vào phần "Giải pháp" vào một trình soạn thảo văn bản.
  2. Định vị các <AFFECTED_DB>giữ chỗ trong kịch bản, và thay thế bằng tên của bộ máy cơ sở dữ liệu bị ảnh hưởng.</AFFECTED_DB>
  3. Lưu tập lệnh sửa đổi vào đĩa cứng của bạn dưới dạng tệp .sql. Ví dụ:
    C:\temp\remove_duplicates.SQL
Nếu bạn đang chạy SQL Server 2014, bạn phải cấp cho bản ghi dịch vụ SID kiểm soát hoàn toàn các tập tin mssqlsystemresource.ldf và mssqlsystemresource.mdf. Cần làm điều này, hãy làm theo các bước sau:
  1. Điều hướng tới mục tin thư thoại Binn tương ứng với phiên bản ID của bạn Ví dụ:

    C:\Program Files\Microsoft SQL Server\<Instance id="">\MSSQL\Binn</Instance>
  2. Mở các thuộc tính mssqlsystemresource.ldf và mssqlsystemresource.mdf, và sau đó nhấp vào tab bảo mật .
  3. Định vị SID cho một bản ghi dịch vụ bản ghi dịch vụ SQL Server, và ghi lại các quyền mặc định:

    * Đọc & thực thi
    * Đọc
  4. Cấp bản ghi dịch vụ SQL Server kiểm soát hoàn toàn SID cho một bản ghi dịch vụ, và sau đó đóng các quyền hộp thoại.
  5. Khởi động SQL Server trong chế độ một người dùng. Để biết thêm thông tin, hãy xemKhởi động SQL Server trong chế độ một người dùng.
  6. Muốn sqlcmddòng lệnh để kết nối với SQL Server trong phần dành riêng cho quản trị kết nối (DAC). Ví dụ:

    sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Sau đó, chạy lệnh Transact-SQL sửa đổi.
  7. Khởi động SQL Server trong chế độ nhiều người dùng, và sau đó kiểm tra rằng đồng gửi lưu và kiểm tra hoạt động bộ máy cơ sở dữ liệu bị ảnh hưởng hoàn tất thành công. Nếu bước 4 được sử dụng trở lại quyền cho giá trị mặc định.

Tập lệnh Transact-SQL

--Create a temporary database to store the necessary rows required to remove the duplicate dataif exists(select 1 from sys.databases where name = 'dbChangeTrackingMetadata')begindrop database dbChangeTrackingMetadataendgocreate database dbChangeTrackingMetadatago --Table to store the contents of the SYSCOMMITTABLEuse dbChangeTrackingMetadatagocreate table dbo.t_SYSCOMMITTABLE (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime)go --Table to store the duplicate rows to be removed from the sys.syscommittab tablecreate table dbo.t_syscommittab (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime,dbfragid int)go --Enable the usage of OPENROWSETexec sys.sp_setbuildresource 1go --Change <AFFECTED_DB> to the database that contains the duplicate valuesUSE <AFFECTED DB>godeclare @rowcount bigintSET @rowcount = 0 --Copy all rows from the SYSCOMMITTABLE into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLESELECT commit_ts, xdes_id, commit_lbn, commit_csn, commit_timeFROM OpenRowset (table SYSCOMMITTABLE, db_id (), 0, 0) --Save the duplicate values into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_syscommittabselect ondisk_ct.* from sys.syscommittab as ondisk_ctjoin dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLE as inmem_cton ondisk_ct.xdes_id = inmem_ct.xdes_id --Delete the duplicate valuesdelete from sys.syscommittabwhere xdes_id in ( select xdes_id from dbChangeTrackingMetadata.dbo.t_syscommittab )set @rowcount = @@rowcountif (@rowcount > 0)beginprint ''print 'DELETED '+CAST(@rowcount as NVARCHAR(10))+' rows from sys.syscommittab that were also stored in SYSCOMMITTABLE'print ''endelsebeginprint ''print 'Failed to DELETE DUP rows from sys.syscommittab'print ''endexec sys.sp_setbuildresource 0go

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 3083381 - Xem lại Lần cuối: 09/26/2015 08:19:00 - Bản sửa đổi: 2.0

Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2014 Standard, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Web

  • kbmt KB3083381 KbMtvi
Phản hồi