Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tôi có thể xóa SSISDB bằng cách nào?

Phil Brammer gặp phải vấn đề này và một loạt những thứ khác liên quan đến việc chăm sóc và nuôi dưỡng danh mục SSIS, mà anh ấy đề cập trên bài đăng của mình Đề xuất lập chỉ mục danh mục .

Vấn đề gốc

Vấn đề gốc rễ là MS đã cố gắng thiết kế SSIS có lưu ý đến RI nhưng họ lười biếng và cho phép việc xóa theo tầng xảy ra thay vì xử lý chúng một cách rõ ràng.

Độ phân giải

Cho đến khi MS thay đổi cách mọi thứ hoạt động, tùy chọn được hỗ trợ sẽ là

Tôi biết ở khách hàng hiện tại của mình, chúng tôi chỉ tải dữ liệu trong vài giờ ngắn ngủi nên SSISDB không hoạt động trong giờ làm việc.

Nếu việc chạy công việc bảo trì trong một khoảng thời gian yên tĩnh không phải là một lựa chọn, thì bạn đang xem xét việc tạo các câu lệnh xóa của riêng mình để cố gắng làm cho các lần xóa theo tầng để hút ít hơn .

Tại khách hàng hiện tại của tôi, chúng tôi đã chạy khoảng 200 gói hàng đêm trong 10 tháng qua và cũng đã có lịch sử 365 ngày. Các bảng lớn nhất của chúng tôi, theo thứ tự độ lớn là.

Schema    Table                   RowCount
internal  event_message_context   1,869,028
internal  operation_messages      1,500,811
internal  event_messages          1,500,803

Trình điều khiển của tất cả dữ liệu đó, internal.operations chỉ có 3300 hàng trong đó, phù hợp với nhận xét của Phil về cách dữ liệu này phát triển theo cấp số nhân.

Vì vậy, hãy xác định operation_id được xóa và xóa khỏi các bảng lá hoạt động trở lại lõi, internal.operations bảng.

USE SSISDB;
SET NOCOUNT ON;
IF object_id('tempdb..#DELETE_CANDIDATES') IS NOT NULL
BEGIN
    DROP TABLE #DELETE_CANDIDATES;
END;

CREATE TABLE #DELETE_CANDIDATES
(
    operation_id bigint NOT NULL PRIMARY KEY
);

DECLARE @DaysRetention int = 100;
INSERT INTO
    #DELETE_CANDIDATES
(
    operation_id
)
SELECT
    IO.operation_id
FROM
    internal.operations AS IO
WHERE
    IO.start_time < DATEADD(day, [email protected], CURRENT_TIMESTAMP);

DELETE T
FROM
    internal.event_message_context AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

DELETE T
FROM
    internal.event_messages AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

DELETE T
FROM
    internal.operation_messages AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

-- etc
-- Finally, remove the entry from operations

DELETE T
FROM
    internal.operations AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

Những lưu ý thông thường được áp dụng

  • không tin tưởng mã từ các ngẫu nhiên trên internet
  • sử dụng sơ đồ từ ssistalk và / hoặc bảng hệ thống để xác định tất cả các phần phụ thuộc
  • bạn có thể chỉ cần phân đoạn các thao tác xóa của mình thành các thao tác nhỏ hơn
  • bạn có thể được lợi bằng cách giảm RI cho các hoạt động nhưng hãy nhớ bật lại chúng bằng tùy chọn kiểm tra để chúng được tin cậy.
  • tham khảo ý kiến ​​dba của bạn nếu các hoạt động kéo dài hơn 4 giờ

Tháng 7 năm 2020 chỉnh sửa

Tim Mitchell có một loạt bài viết hay về Tự động dọn dẹp danh mục SSIS Một cách tốt hơn để làm sạch Cơ sở dữ liệu danh mục SSIS và cuốn sách mới lạ mắt của anh ấy Danh mục SSIS:Cài đặt, Quản lý , Bảo mật và Giám sát Cơ sở hạ tầng ETL Doanh nghiệp của bạn

@Yong Jun Kim ghi chú trong các bình luận

Đây chắc chắn là trường hợp nếu bạn đang sử dụng SSIS IR trong Azure Data Factory. Bạn sẽ thấy các bảng "bình thường" vẫn hiển thị nhưng trống, với *_scaleout phiên bản chứa tất cả dữ liệu.

Tài liệu tham khảo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đánh chặn và ghi lại các truy vấn trong SQL Server 2005

  2. thay thế chỉ khớp với phần đầu của chuỗi

  3. Bản ghi gần đây nhất trong một lần tham gia bên trái

  4. Có bất kỳ chức năng hồi quy tuyến tính nào trong SQL Server không?

  5. cách nhập ip trong máy chủ liên kết truy vấn