Cách phát hiện bất kỳ thay đổi nào đối với cơ sở dữ liệu (DDL và DML)


13

Có rất nhiều cơ sở dữ liệu trên máy chủ SQL của khách hàng của tôi. Các cơ sở dữ liệu này đang được phát triển, vì vậy các nhà phát triển có thể thiết kế, tái cấu trúc, thực hiện sửa đổi dữ liệu, v.v. Có một số cơ sở dữ liệu hiếm khi thay đổi. Khách hàng của tôi phải giữ tất cả chúng an toàn (được sao lưu) và dành thời gian quản lý môi trường. (Không có vị trí quản trị viên DB tại công ty.) Sau khi thảo luận kéo dài, khách hàng đã quyết định sử dụng chiến lược sao lưu toàn bộ hàng ngày, do dễ khôi phục.

Vì vậy, đây là tóm tắt của tình huống:

  • Số lượng cơ sở dữ liệu có thể thay đổi mỗi ngày.
  • Cơ sở dữ liệu đã được thay đổi (có nghĩa là dữ liệu và / hoặc cấu trúc đã được thay đổi) sẽ được sao lưu.
  • Cơ sở dữ liệu không được thay đổi sẽ KHÔNG được sao lưu.
  • Giải pháp sẽ không ảnh hưởng đến cấu trúc cơ sở dữ liệu (yêu cầu không bị hạn chế)
  • "Công cụ sao lưu" này sẽ hoạt động tự động.

Vấn đề chính: làm thế nào để phát hiện ra rằng một cơ sở dữ liệu đã được thay đổi. Phần đầu tiên của vấn đề (thay đổi DDL) có thể được giải quyết bằng cách sử dụng trình kích hoạt DDL . Nhưng những thay đổi dữ liệu (thay đổi DML) là một vấn đề. Không thể áp dụng các kích hoạt DML cho tất cả các bảng của tất cả các cơ sở dữ liệu để theo dõi các thay đổi (hiệu suất, quản lý các đối tượng mở rộng ...). Công cụ sao lưu phải theo dõi tất cả các thay đổi để đánh dấu từng cơ sở dữ liệu là sẵn sàng để sao lưu.

  • Change Data Capture là một giải pháp nhưng có vẻ quá nặng (nó cũng yêu cầu SQL Server Enterprise Edition).

  • Một cách khác là theo dõi các thay đổi tệp cơ sở dữ liệu (kích thước hoặc thời gian thay đổi cuối cùng), nhưng nó không hoạt động chính xác: Cơ sở dữ liệu có thể thay đổi kích thước của nó khi vượt quá tất cả không gian trống dành riêng và sp_spaceuse không phải là một giải pháp.

  • Truy tìm là một giải pháp nhưng nó gây ra các vấn đề về hiệu suất và yêu cầu quản lý bổ sung.

Có giải pháp nào để tính kích thước sử dụng cơ sở dữ liệu thực tế mà không ảnh hưởng đến các đối tượng quản lý cơ sở dữ liệu khác (như thống kê ..) không? Được cho rằng một thay đổi đối với dữ liệu của bảng không thay đổi kích thước của bảng sẽ không kích hoạt (tôi nghĩ), nhưng tốt hơn là không có gì. Thực sự tôi đang tìm kiếm một giải pháp trực tiếp hoặc gián tiếp cho SQL Server 2008.

Cảm ơn bạn cho bất kỳ ý kiến, giải pháp và suy nghĩ.

THÊM:

Đây là giải pháp (nhờ có Marian ):

Select
    NextLSN = MAX(fn.[Current LSN])
    ,Databasename = DB_NAME()
 from fn_dblog(NULL,    NULL) fn
     LEFT JOIN sys.allocation_units au
         ON fn.AllocUnitId = au.allocation_unit_id
     LEFT  JOIN sys.partitions p
         ON p.partition_id = au.container_id
     LEFT  JOIN sys.objects so
         ON so.object_id = p.object_id  
    WHERE 
    (
        (Operation IN 
       ('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
            'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT') 
            AND so.is_ms_shipped = 0)
        OR 
        ([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
    )

Vì vậy, bạn đã thực hiện điều này như là một phần của công việc hay ??? Tôi rất thích có một phương pháp xuất hàng ngày (giả sử lúc 2 giờ sáng) tất cả các thay đổi từ 24 giờ trước sang một thư mục để tôi có thể có một chút thay đổi cho chính mình.
jcolebrand

@jcolebrand vâng, tôi đã làm. Tôi là trường hợp của tôi, tôi phải kiểm tra bất kỳ hoạt động cơ sở dữ liệu nào và sau đó thực hiện sao lưu (đầy đủ hoặc khác biệt). Tôi đang kiểm tra LSN (khóa chính của bản ghi nhật ký), hàm đó fn_dblog trả về. Đó là tất cả. Tôi không nghĩ rằng nó sẽ hoạt động trong trường hợp của bạn. Tôi chưa điều tra tất cả các tính năng của dữ liệu có thể được trả về bởi fn_dblog, nhưng tôi nghĩ rằng nó không trả về tất cả thông tin để làm với. Như bạn có thể thấy có nhiều bảng hệ thống khác được nối với nó. Nếu dễ thì chúng ta sẽ có rất nhiều công cụ bình thường, rẻ tiền :)
garik

Câu trả lời:


7

Một ý tưởng sẽ là tạo ảnh chụp nhanh mỗi ngày và theo dõi kích thước tệp ảnh chụp nhanh trên đĩa bằng trình giám sát tệp. Ảnh chụp nhanh chỉ tăng kích thước của nó khi dữ liệu được thêm vào đó, vì vậy sẽ là một ý tưởng hợp lệ nếu bạn tìm một công cụ để theo dõi kích thước thực (kích thước được báo cáo).

Bây giờ .. Tôi đã không sử dụng điều này, vì vậy không thể cung cấp cho bạn thông tin chi tiết kỹ thuật :-).

Một ý tưởng khác là xác minh nhật ký giao dịch của từng db (tất nhiên nếu bạn đang sử dụng chế độ khôi phục hoàn toàn trên chúng) với một số chức năng tôi đã thấy trên các diễn đàn (db_fnlog .. hoặc một cái gì đó) đọc các hoạt động từ nhật ký và xem nếu bạn có bất kỳ xóa / chèn / cập nhật.

Đó không phải là những điều dễ dàng để làm .. nhưng tôi hy vọng bạn sẽ thấy chúng hữu ích.

PS: tìm thấy bài viết có chức năng đọc nhật ký (đó là fndblog, nhân tiện :-): Đọc nhật ký giao dịch của Jens K. Suessmeyer .


1
Tôi không nói về kích thước tệp db, nhưng về tệp cục bộ chụp nhanh, được tạo bằng: tạo cơ sở dữ liệu xxxdb dưới dạng ảnh chụp nhanh của yyydb. Xem chi tiết về ảnh chụp nhanh tại đây: msdn.microsoft.com/en-us/l Library / ms175158.aspx .
Mary

1
  • Đối với các thay đổi DDL, bạn có thể đọc Dấu vết mặc định .
  • Đối với các sửa đổi DML vì bạn thấy CDC hơi nặng, bạn có thể chạy theo dõi phía máy chủ hạng nhẹ của riêng mình, chỉ theo dõi các sự kiện có liên quan

1

Đối với DDL thay đổi bạn Kích hoạt DDL, nhưng Thay đổi DML bạn có thể thử sử dụng 3 tùy chọn khác nhau

1) Theo dõi thay đổi 2) CDC (Thay đổi dữ liệu Chụp) 3) Tính năng kiểm toán

Để theo dõi Thay đổi .. bạn có thể xem liên kết bên dưới http://www.mssqltips.com/sqlservertip/1819/USE-change-tracking-in-sql-server-2008/

theo dõi thay đổi này sẽ chỉ được sử dụng khi bảng có thay đổi hay không ... nhưng rất khó tìm dữ liệu nào đã thay đổi .. nếu bạn muốn tìm dữ liệu nào đã thay đổi thì bạn có thể vào Chnage data Capture.

Đối với Aduit trong sqlserver .. bạn có thể kiểm tra liên kết bên dưới http://bloss.msdn.com/b/manisblog/archive/2008/07/21/sql-server-2008-auditing.aspx


1
+1, nhưng CDC được phân phối với Phiên bản doanh nghiệp
garik

1

Đối với các thay đổi DML, bạn có thể sử dụng bất kỳ tính năng kiểm toán SQL Server gốc nào sau đây:

  • Theo dõi thay đổi máy chủ SQL
  • Máy chủ SQL thay đổi dữ liệu
  • Kiểm toán máy chủ SQL

Mỗi cái đều có ưu điểm và nhược điểm, nhưng Kiểm toán là phần mới nhất được Microsoft giới thiệu, do đó, sẽ là một ý tưởng tốt để xây dựng các giải pháp hiện tại và tương lai của bạn.

Lưu ý rằng chỉ có tính năng Kiểm toán cung cấp thông tin về Ai / Khi / Làm thế nào


0

Bạn có thể phát hiện bất kỳ thay đổi ddl bằng cách sử dụng tệp theo dõi. dưới đây là kịch bản để có được những thay đổi.

SELECT 
    te.name AS eventtype
    ,t.loginname
    ,t.spid
    ,t.starttime
    ,t.objectname
    ,t.databasename
    ,t.hostname
    ,t.ntusername
    ,t.ntdomainname
    ,t.clientprocessid
    ,t.applicationname  
FROM sys.fn_trace_gettable
(
    CONVERT
    (VARCHAR(150)
    ,(
        SELECT TOP 1 
            value
        FROM sys.fn_trace_getinfo(NULL)  
        WHERE property = 2
    )),DEFAULT
) T 
INNER JOIN sys.trace_events as te 
    ON t.eventclass = te.trace_event_id 
WHERE eventclass=164

Bạn có thể phát hiện bất kỳ sửa đổi nào trên bảng và quy trình được lưu trữ bằng cách sử dụng tập lệnh này:

SELECT 
    SO.Name
    ,SS.name 
    ,SO.type_desc 
    ,SO.create_date
    ,SO.modify_date 
 FROM sys.objects AS SO
INNER JOIN sys.schemas AS SS 
    ON SS.schema_id = SO.schema_id 
WHERE DATEDIFF(D,modify_date, GETDATE()) < 50
AND TYPE IN ('P','U')
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.