Truy vấn xóa lớn dường như đã bị đóng băng


10

Chúng tôi đã chạy một truy vấn xóa trên cơ sở dữ liệu với các hàng 1,8 tỷ. Việc xóa này sẽ xóa các hàng 1,2 tỷ.

Nhìn chung, chúng tôi đã chia nhỏ truy vấn này thành 100m một lần nhưng chúng tôi đang ở vị trí mà nó đã chạy trong 24 giờ và tệp nhật ký ở mức 2Tb có vẻ là kích thước tối đa được phép cho tệp nhật ký.

Cơ sở dữ liệu ở chế độ khôi phục SIMPLE.

Có bất kỳ lưu truy vấn này? Hay chúng ta chỉ cần khởi động lại SQL Server và xem điều gì sẽ xảy ra? Cơ sở dữ liệu sẽ không sử dụng được? Có bất cứ điều gì chúng ta có thể làm để tiêu diệt điều này càng sạch càng tốt không?


Bạn đã chạy nó từ SSMS? Chỉ cần hủy bỏ nó. Sẽ mất một lúc để hủy bỏ. Giống như về miễn là nó đã được chạy. Bạn cần kiên nhẫn.
paparazzo

1
@Graeme Từ kinh nghiệm của chúng tôi với cơ sở dữ liệu hàng tỷ bản ghi (chúng tôi đang chạy một vài trong số chúng) đôi khi nhanh hơn để lưu các bản ghi còn lại từ bảng nạn nhân, cắt bớt nó, xóa nó, đổi tên các bản ghi đã lưu trở lại tên ban đầu và sau đó khôi phục chỉ mục nếu có .
Anton Krouglov

1
Khi bạn đã xóa được spid này, tôi muốn giới thiệu các lô nhỏ hơn 100m, tôi thường làm 100k đến 1m. Ngoài ra, sử dụng khóa chính làm mệnh đề WHERE của bạn để chọn các bản ghi để xóa, nếu có thể.
BradC

Truncate là bạn của bạn khi xóa một lượng lớn dữ liệu và cố gắng tránh các vấn đề về nhật ký.
Jeff.Clark

Câu trả lời:


14

Trước hết, hãy kiểm tra lỗi SQL để xem nó có thực sự đạt kích thước tối đa cho nhật ký không. Nếu có, thì truy vấn không có hy vọng hoàn thành, có lẽ nó đã ở trạng thái khôi phục.

Ngay cả nếu có, tôi luôn thích giết spid bằng tay (sử dụng sp_who2hoặc sp_WhoIsActivetìm spid, sau đó làm kill 59bất cứ điều gì). Bạn cũng không thể kiểm tra trạng thái rollback trừ khi bạn thực hiện KILL rõ ràng, xem chủ đề liên quan này .

Vì đây là xóa và không phải là cập nhật hoặc chèn, bạn có thể rất may mắn và thấy rằng nó sẽ quay trở lại ngay lập tức. Nếu không, có thể mất nhiều thời gian (hoặc lâu hơn) để quay trở lại như đã làm để đi đến điểm này.

Để xem trạng thái rollback, sử dụng

kill 59 with statusonly

Thật không may, tôi đã thấy điều này thường xuyên không hiển thị bất cứ điều gì hữu ích, chỉ là "hoàn thành 0%". Trong trường hợp đó, bạn sẽ phải sử dụng sp_who2và xem IO và CPU để xem liệu nó có còn hoạt động không.

Liên quan đến việc khởi động lại, đây là một rủi ro nghiêm trọng. Nếu spid đang tích cực quay trở lại (CPU và IO đang thay đổi), thì việc khởi động lại SQL sẽ chỉ đưa cơ sở dữ liệu ngoại tuyến hoàn toàn cho đến khi quá trình khôi phục hoàn tất (giờ và giờ). Nhưng , nếu CPU và IO không di chuyển, thì thực tế nó có thể xóa nó ngay lập tức. Dù bằng cách nào, đó là một rủi ro.

Một tùy chọn cuối cùng, nếu mọi thứ đặc biệt tồi tệ: Nếu bạn có bản sao lưu ngay trước khi xóa bắt đầu (và chưa có bản cập nhật khác cho db) , thì cách nhanh nhất để khôi phục có thể là bỏ DB, khởi động lại SQL và khôi phục từ bản sao lưu.

Nếu bạn không thể loại bỏ DB (hoặc nếu bạn đã khởi động lại cá thể và báo lỗi sql dự đoán thời gian phục hồi 24 giờ), thì hãy tắt các dịch vụ SQL, xóa các tệp MDF và LDF khỏi đĩa, khởi động SQL, thả SQL cơ sở dữ liệu (ma) và khôi phục từ bản sao lưu.

Rõ ràng là bạn chỉ cố gắng nếu đây là cơ sở dữ liệu xử lý back-end mà người dùng không tương tác.


3
Lời khuyên tốt, về các tùy chọn khôi phục. Đáng sợ như địa ngục, nhưng vẫn là lời khuyên tốt.
Max Vernon

2
Đúng, chúng tôi đã có một DBA khởi động lại một thể hiện trong điều kiện này, điều này buộc chúng tôi phải quyết định giữa hai tùy chọn rất tệ: xuống trong 18-24 giờ hoặc mất dữ liệu bằng cách quay lại trước khi truy vấn bắt đầu. Các doanh nghiệp đã chọn để quay trở lại.
BradC

1
Chúng tôi có một bản sao lưu đầy đủ từ ngày 4 tháng 3 mà chúng tôi sẽ khôi phục như là phương sách cuối cùng nếu quá trình khởi động lại không hoạt động. May mắn thay, đó là một DB đủ tĩnh mà chúng tôi chỉ muốn cắt giảm. Cảm ơn phản hồi, rất hữu ích
Graeme

4
@Graeme - FYI - thay vì cố gắng xóa 1,2 tỷ hàng, hãy tạo một bản sao của cấu trúc bảng, sao chép các hàng bạn muốn giữ vào bảng mới, sau đó thả bảng cũ. Nếu bạn thêm một câu hỏi mới hỏi cách thực hiện, tôi có thể chỉ cho bạn một cách rất khéo léo, nhanh hơn nhiều so với xóa 1,2 tỷ hàng.
Max Vernon

Câu trả lời của tôi giả sử db đang ở chế độ khôi phục SIMPLE. Nếu nó ở chế độ ĐẦY ĐỦ, bạn cũng sẽ phải quản lý các bản sao lưu nhật ký tran lớn.
BradC

8

KHÔNG RESTART MÁY CHỦ SQL. Điều này sẽ chỉ kéo dài sự đau đớn của bạn vì quá trình phục hồi sẽ diễn ra, điều này sẽ phục hồi hoặc làm lại bất kỳ giao dịch nào chưa hoàn thành, bao gồm cả việc xóa của bạn.

Giết phiên đang chạy xóa sẽ dẫn đến việc khôi phục lại, điều này cũng sẽ mất nhiều thời gian để hoàn thành.

Bạn muốn xem truy vấn sau để xem trạng thái của thao tác:

SELECT des.session_id 
    , des.host_name
    , des.login_name
    , der.command
    , der.estimated_completion_time
    , der.blocking_session_id
    , der.last_wait_type
    , der.percent_complete
    , der.start_time
    , der.status
    , der.wait_resource
    , der.wait_type
    , der.wait_time
FROM sys.dm_exec_sessions des
    INNER JOIN sys.dm_exec_requests der ON des.session_id = der.session_id
WHERE des.session_id <> @@SPID
    AND des.is_user_process = 1
ORDER BY des.session_id;

Các percent_completecột, và những người mà dựa vào nó, chẳng hạn như estimated_completion_time, chỉ được dân cư cho các hoạt động sau đây:

ALTER INDEX REORGANIZE
AUTO_SHRINK option with ALTER DATABASE
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

Vì vậy, bạn sẽ chỉ thấy cột đó có ý nghĩa nếu bạn đã hủy câu lệnh xóa và nó sẽ quay trở lại hoặc nếu bạn đã khởi động lại SQL Server và nó đang được khôi phục.

Nếu blocking_session_idcột chứa một số, điều đó cho biết rằng phiên khác đang chặn hoạt động xóa. Nếu phiên đó đã chặn hoạt động xóa kể từ khi bắt đầu, bạn có thể hủy thao tác mà không cần phải quay lại.


Các truy vấn tốt, nhưng có vẻ như không chắc rằng nhật ký sẽ tăng lên rất lớn nếu việc xóa bị chặn.
BradC

4
Đúng. Tôi chỉ cố gắng để giải thích đầu ra một chút. Độc giả tương lai cũng có thể thấy điều này. Trên thực tế, tôi nghi ngờ nếu chúng ta sẽ nghe từ OP trong thời gian tới. Anh ấy có khả năng khá bận rộn.
Max Vernon
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.