SQL Server Cập nhật bản ghi trên Filegroup chỉ đọc?


8

Tôi có một cơ sở dữ liệu rất lớn trong kho dữ liệu của chúng tôi, nơi chúng tôi đã triển khai phân vùng để quản lý bảo trì và sao lưu. Các bản ghi ở một độ tuổi nhất định cuối cùng được chuyển sang nhóm tệp chỉ đọc mỗi tháng một lần.

Đôi khi, quá trình ETL của chúng tôi cố gắng cập nhật các hồ sơ cũ hơn đã được di chuyển vào kho lưu trữ và chúng tôi hy vọng những điều này sẽ thất bại. Tuy nhiên, tôi có ít nhất hai ví dụ gần đây trong đó bản ghi trong kiểm tra được cập nhật ngay cả khi nó xuất hiện trong một phân vùng trên nhóm tệp chỉ đọc trong môi trường thử nghiệm của chúng tôi (truy vấn sys.partition_functionssys.partition_range_values).

Một bản ghi giống hệt trong sản xuất gây ra sự thất bại dự kiến ​​khi cố gắng cập nhật bản ghi. Hai lần chúng tôi đã bắt gặp điều này cho đến nay bản cập nhật thất bại trong sản xuất nhưng thành công trong thử nghiệm (không bao giờ có cách khác).

Sự thật môi trường có liên quan:

  • Máy chủ SQL 2012 SP3 CU3 (bản dựng 11.0,6537.0)
  • Kiểm tra là phiên bản dành cho nhà phát triển, sản xuất là doanh nghiệp
  • Có thể cung cấp cho người khác theo yêu cầu: Nghiêm túc bị vấp ngã ngay bây giờ ...

CẬP NHẬT 2016-08-19

Có hồ sơ mới được cập nhật bằng cách nào đó qua đêm. Xác nhận nó nằm trong nhóm tập tin chỉ đọc. Tìm thấy rằng tôi có thể cập nhật các bản ghi được chèn cùng một lúc (nghĩa là cũng nằm trên cùng một phân vùng trên filegroup chỉ đọc). Tôi đã xác định một bản ghi trên cùng một phân vùng và đã có thể cập nhật bản ghi nhiều lần. Nỗ lực cập nhật hồ sơ cập nhật kết quả qua đêm trong thất bại dự kiến.

CẬP NHẬT 2016-08-11

Các cập nhật tiếp tục xảy ra trong quá trình xử lý hàng đêm trong thử nghiệm trên phân vùng chỉ đọc. Cố gắng cập nhật các hồ sơ tương tự từ quá trình không thành công. Cố gắng cập nhật các bản ghi tương tự trong khi đăng nhập là người dùng đã cập nhật nó trước đó không thành công. Tôi cũng không thể sao chép vấn đề bằng cách cập nhật một bản ghi tương tự chưa được xử lý bởi quy trình hàng đêm.

CẬP NHẬT 2016-08-04

Hôm nay phát hiện ra rằng nó không bị giới hạn trong một bảng duy nhất khi tôi phát hiện ra một sự xuất hiện khác của cùng một hành vi trên một bảng khác bằng cách sử dụng cùng một sơ đồ phân vùng.

CẬP NHẬT 2016-08-03

Chạy tập lệnh từ tập lệnh MSDN này xác nhận những gì tôi nhận được khi sử dụng chế độ xem trình trợ giúp phân vùng của Kendra Little ph.FilegroupDetailph.ObjectDetailtừ bản demo này . Bản ghi trong câu hỏi nằm trong phân vùng số 2 (giá trị cột phân vùng cho bản ghi được đề cập là 2015 / 03-18)

Filegroup     Low Boundary     UpperBoundary
Archive  (RO) NULL             1900-01-01
Archive  (RO) 1900-01-01       2015-04-01
ActiveFG (RW) 2015-04-01       2015-07-01
ActiveFG (RW) 2015-07-01       2015-10-01
ActiveFG (RW) 2015-10-01       2015-01-01
ActiveFG (RW) 2016-01-01       2016-04-01
ActiveFG (RW) 2016-04-01       2016-07-01
ActiveFG (RW) 2016-07-01       2016-10-01
ActiveFG (RW) 2016-10-01       2017-01-01
ActiveFG (RW) 2017-01-01       2115-01-01
ActiveFG (RW) 2115-01-01       NULL

Mã để đặt bảng trên phân vùng (không có chỉ mục nào khác)

ALTER TABLE [dbo].[TABLE_NAME] ADD  CONSTRAINT [pk_TABLE_NAME] PRIMARY KEY CLUSTERED 
(
    [ETL_VERS_START_DTM] ASC,
    [ACCT_NO] ASC,
    [ACCT_TYPE] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ps_SmallTablesDate(ETL_VERS_START_DTM)

Tuyên bố cập nhật sẽ thất bại (thông qua Informatica):

UPDATE TABLE_NAME SET ETL_JOB_SEQ_NUM = ?, ETL_IUD_CD = ?, ETL_UPD_DTM = ?, ETL_DEL_DTM = ? WHERE ETL_VERS_START_DTM = ? AND ACCT_NO = ? AND ACCT_TYPE = ?
ETL_VERS_START_DTM (ETL_VERS_START_DTM:Date:): "03/17/2015 23:30:02.140000000"
ETL_JOB_SEQ_NUM (ETL_JOB_SEQ_NUM:Int:): "1173651"
ETL_IUD_CD (ETL_IUD_CD:Char.1:): "D"
ETL_UPD_DTM (ETL_UPD_DTM:Date:): "08/02/2016 02:32:45.000000000"
ETL_DEL_DTM (ETL_DEL_DTM:Date:): "08/02/2016 00:10:03.567000000"
ACCT_NO (ACCT_NO:Char.12:): "1234567890"
ACCT_TYPE (ACCT_TYPE:Char.3:): "OLN"

CẬP NHẬT 2017 / 02-21

Vì vậy, sau tất cả thời gian này, chúng tôi đã phát hiện ra rằng bằng cách nào đó khi phân vùng hoạt động lâu đời nhất được sáp nhập vào kho lưu trữ, một phần hồ sơ không được chuyển trên đĩa từ nhóm tệp hoạt động sang nhóm tệp lưu trữ. Truy vấn sau đây cho thấy các bản ghi từ phân vùng 2 đã được ánh xạ tới ActiveFG trong khi kiểm tra sơ đồ phân vùng thực tế cho thấy rằng các bản ghi tương tự sẽ được sắp xếp vào nhóm tệp Lưu trữ theo chức năng phân vùng.

SELECT  OBJECT_NAME(P.[object_id]) ,
    P.index_id ,
    P.partition_number ,
    F.name ,
    F.filegroup_guid
FROM    sys.allocation_units AU
    JOIN sys.partitions P ON P.partition_id = AU.container_id
    JOIN sys.filegroups F ON F.data_space_id = AU.data_space_id
WHERE   P.partition_number IN ( 1, 2, 3 )
    AND P.[object_id] = OBJECT_ID('TABLE_NAME')
ORDER BY P.partition_number;

Tôi đã sao lưu tất cả các phân vùng trong cơ sở dữ liệu sử dụng thực tế và giữ một phiên bản của cơ sở dữ liệu đã bị hỏng để làm việc với vé Microsoft. Tôi cần phải điều chỉnh lại kế hoạch phân vùng với nhóm DW của chúng tôi nhưng tôi sẽ thừa nhận là một người nhưng lại ngại ngùng khi thử lại lần nữa.

Microsoft đã không thể sao chép hành vi này và vì vậy được thực hiện với vé tại thời điểm này. Họ dường như đã sẵn sàng để nhún vai và cho rằng nó không có mặt trong 2014/2016? Họ dường như không thể sao chép nó trong phòng thí nghiệm của họ mặc dù khả năng của tôi để nó tiếp tục tồn tại trong cơ sở dữ liệu ngay cả khi tôi khôi phục nó từ bản sao lưu trong hệ thống của mình.


Tôi đã sao lưu tất cả các phân vùng trong cơ sở dữ liệu sử dụng thực tế và giữ một phiên bản của một cơ sở dữ liệu đã bị hỏng để làm việc với vé MS. Tôi cần sửa đổi kế hoạch phân vùng với nhóm DW của chúng tôi nhưng tôi sẽ thừa nhận mình là một kẻ ngại ngùng khi thử lại lần nữa ...
toosuto

Câu trả lời:


1

Tôi có một lời thú nhận những thứ đã làm.

Một lần, khi tôi còn trẻ, tôi đã xây dựng một quy trình ETL bắt đầu bằng việc thay đổi các nhóm tập tin chỉ đọc thành đọc-ghi, thực hiện công việc ETL của nó và sau đó đặt chúng trở lại chỉ đọc.

Vì vậy, chỉ trong trường hợp bạn có một đồng nghiệp mắc bệnh tiểu đường như tôi (tôi còn trẻ, tôi cần tiền), bạn có thể kiểm tra bằng cách:

  1. Thay đổi tên của nhóm tập tin chỉ đọc - theo cách đó, nếu ai đó có tập lệnh được mã hóa cứng làm thay đổi tập tin theo tên, tập lệnh của họ sẽ thất bại và bạn sẽ bắt được thủ phạm. Hoặc, khó hơn một chút:

  2. Sử dụng Profiler hoặc Sự kiện mở rộng để theo dõi bất cứ ai thực hiện CẬP NHẬT THAY ĐỔI.


Chúng tôi thực sự đã cung cấp một kịch bản cho nhóm DW để thực hiện thay đổi này để họ không phải đánh thức chúng tôi trong đêm vào dịp hiếm hoi nhưng dự kiến ​​công việc của họ thất bại. Chúng tôi cũng có một trình kích hoạt kiểm toán cấp máy chủ (trên DDL_SERVER_LEVEL_EVENT) để thiết lập các lần truy cập thuộc tính đọc / ghi của nhóm tệp. Nó sẽ gửi cho chúng tôi tập lệnh SQL, người dùng và địa chỉ IP để được nhóm DBA xem xét.
toosuto

Mặc dù tôi có thể thấy chúng đủ sai lệch để sử dụng tập lệnh của chúng tôi để thay đổi cài đặt nhóm tệp trước khi xử lý ETL, nhưng chúng không đủ nhận thức về mặt kỹ thuật để tìm kiếm và vô hiệu hóa trình kích hoạt của chúng tôi.
toosuto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.