Có cách nào để xác định ai đã đánh rơi một cái bàn không?


8

Một bảng trong cơ sở dữ liệu sản xuất đã "biến mất một cách bí ẩn".

Có ai biết cách nào để chẩn đoán cái quái gì đã xảy ra với nó không? Và ai đã làm điều đó?

Chỉnh sửa 1: Đây là một ứng dụng nội bộ, có bảo mật yếu. Tất cả các ứng dụng (trừ mỏ của khóa học ;-) dễ bị SQL Injection, nhưng người dùng của chúng tôi là rất không phức tạp và tên bảng không phải là một mà có thể ngay lập tức rõ ràng, vì vậy tôi không nghĩ đó là một SQL Injection (không rằng nó quan trọng ... loại vượt quá phạm vi của câu hỏi).

Chỉnh sửa 2: Ngoài ra, chỉ là một FYI; bảng này đã có từ lâu, vì vậy nó không 'hoàn tác' với việc khôi phục.


Bạn có nghĩa là con ma "Không phải tôi" có bạn quá?
Nick DeVore

Bạn có tài khoản cơ sở dữ liệu riêng cho mọi người hay mọi người đăng nhập với tư cách là 'dba' hoặc một cái gì đó tương đương?

@ Zerofiz - Chúng tôi đang sử dụng Windows Integration Security, vì vậy, mọi người dùng đều có thể được xác định.
John MacIntyre

Tôi đã xem qua blog này giải thích quy trình từng bước để xác định ai đã bỏ bảng dbarepublic.com/2015/01/who-dropping-table.html .

Câu trả lời:


14

Bạn có thể lấy thông tin ra khỏi nhật ký bằng cách sử dụng hàm :: fn_dblog không có bản quyền để giải thích các bản ghi nhật ký. Tôi đang ở giữa giảng dạy một lớp khắc phục thảm họa ngay bây giờ, nhưng nếu bạn có thể đợi 2-3 giờ tôi sẽ đăng cách làm điều đó cho bạn - nên cũng có thể lấy tên người dùng mà không phải mua bất kỳ công cụ nào ( Tôi đã từng chơi trò chơi quanh bản ghi một tấn vào năm 2000 khi tôi viết một loạt mã phân tích nhật ký nội bộ mà DBCC CHECKDB sử dụng vào năm 2000).

[Đã chỉnh sửa để bao gồm hướng dẫn] Ok - dạy xong và tôi đã gõ một bài đăng trên blog để chỉ cho bạn cách phân tích nhật ký vào năm 2000, 2005, 2008 để tìm hiểu khi nào bảng bị bỏ và ai đã làm nó. Kiểm tra bài đăng trên blog của tôi tại Tìm hiểu ai đã đánh rơi bảng bằng nhật ký giao dịch . [/biên tập]

Bạn vẫn có nhật ký giao dịch xung quanh? Những mô hình phục hồi là cơ sở dữ liệu trong? Nếu đó là ĐƠN GIẢN, đừng làm bất cứ điều gì có thể gây ra điểm kiểm tra. Nếu đó là FULL hoặc BULK_LOGGED, đừng thực hiện sao lưu nhật ký. Một trong hai điều này sẽ khiến nhật ký bị cắt ngắn và sau đó bạn có thể mất khả năng nhìn lại nhật ký, mặc dù tôi đã bao gồm một cờ theo dõi trong bài đăng trên blog cũng có thể giúp bạn điều đó.

Cảm ơn

PS Một cách để ngăn chặn bảng giảm vào năm 2000 mà không cần thêm bảo mật là tạo chế độ xem lược đồ đơn giản trên nó - DROP TABLE sẽ thất bại nếu chế độ xem tồn tại.


Cảm ơn Paul, đó là lời khuyên tuyệt vời. Tôi có thể chờ. Tôi sẽ rời đi ngay bây giờ và sẽ đến một khách hàng khác vào ngày mai, vì vậy tôi sẽ cố gắng tìm hiểu chuyện gì đã xảy ra vào thứ năm. Tôi sẽ nói với quản trị viên về bản sao lưu nhật ký.
John MacIntyre

8

Có lẽ đó là Little Bobby Bàn ...


1
Đẹp :) Sẽ +1 nó vì sự hài hước nhưng điều đó thật ngớ ngẩn vì câu trả lời duy nhất khác cũng có 1 phiếu bầu.

2
Không, đó là đủ buồn cười cho một upvote.
Electrons_Ahoy

2

Bạn có thể khôi phục thông tin này từ nhật ký SQL.


Tôi biết thông tin này có trong nhật ký SQLServer, nhưng tôi nghĩ bạn không thể đọc bất cứ điều gì từ họ. Tôi muốn tìm hiểu bạn có thể. Có ai biết không?
John MacIntyre

Tôi chỉ quen thuộc với Sybase SQL ở mọi nơi, nhưng họ có một tiện ích để dịch các tệp nhật ký thành các câu lệnh SQL ...

1
Công cụ này có thể giúp bạn đọc nhật ký. red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg

+1 cho liên kết công cụ đăng nhập. Tại sao bạn không đặt nó vào câu trả lời?
John MacIntyre

2

Nếu nhật ký theo dõi mặc định đang chạy, tất cả thông tin được lưu trữ trong thư mục nhật ký. Bạn sẽ có thể thấy khi nào đối tượng (bảng) bị hủy và kết nối nào đã thực hiện. Nhưng kiểu này cho phép nên chỉ trao cho DBA s nào


2

Tôi đang cố gắng sửa một MSDB bị hỏng. Xin lỗi tôi không thể giải thích.

Chạy những thứ này và nó sẽ đưa ra một ý tưởng chung về nơi cần tìm, giả sử dấu vết mặc định của bạn được bật.

CHỌN * TỪ :: fn_trace_getinfo (mặc định)

CHỌN t.EventID, t.ColumnID, e.name dưới dạng Event_Des mô tả, c.name dưới dạng Cột = c.trace_column_id


Cảm ơn, tôi nghĩ rằng các bảng. * Là năm 2005 mặc dù không phải vậy? Có tương đương 2000 không?
John MacIntyre

2

Cách duy nhất để tìm hiểu thông tin này là bằng cách đọc nhật ký giao dịch (giả sử nó ở chế độ khôi phục hoàn toàn).

Hai cách để làm điều này:

  • Các công cụ của bên thứ ba như ApexSQL Log hoặc SQL Log Rescue (chỉ miễn phí nhưng chỉ có sql 2000)
  • Sử dụng các lệnh như DBCC LOG hoặc fn_dblog - không có lệnh nào trong số đó là tài liệu tốt

2

Trong SSMS, bạn có thể thử nhấp chuột phải vào dB và điều hướng qua Báo cáo -> Báo cáo chuẩn -> Lịch sử thay đổi lược đồ.

Nhấp chuột phải vào báo cáo và 'SaveAs' Excel và tìm namne đối tượng của bạn.

Bạn sẽ không thể nhận được bất cứ điều gì nếu máy chủ đã được khởi động lại hơn năm lần sau khi đối tượng đã bị hủy.


Nhìn vào nhật ký thất bại cho tôi. Hầu hết đã bị tràn ngập do số lượng giao dịch cao trong hệ thống của chúng tôi. Phương pháp của bạn đã làm việc hoàn hảo. Cám ơn vì đã chia sẻ!
tylerjgarland
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.