Büyük silme sorgusu donmuş gibi görünüyor


10

1.8bn satır içeren bir veritabanında silme sorgusu çalıştırdık. Bu silme 1.2 milyar satır silecektir.

Gezimizde, bu sorguyu bir seferde 100 metreye bölerdik, ancak 24 saat boyunca çalıştığı bir konumdayız ve günlük dosyası, bir günlük dosyası için izin verilen maksimum boyut gibi görünen 2 TB'tadır.

Veritabanı BASİT kurtarma modunda.

Bu sorguyu kaydeden var mı? Yoksa sadece SQL Server'ı yeniden başlatmalı ve ne olacağını görmeli miyiz? Veritabanı kullanılamaz mı? Bunu olabildiğince temiz bir şekilde öldürmek için yapabileceğimiz bir şey var mı?


SSMS'den çalıştırdınız mı? Sadece iptal et. İptal etmek biraz zaman alacaktır. Sanki koşuyormuş gibi. Sabırlı olmalısın.
paparazzo

1
@Graeme Milyar kayıt veritabanlarıyla ilgili deneyimlerimizden (bunlardan birkaçını çalıştırıyoruz) bazen kurban tablosundan kalan kayıtları kaydetmek , kısaltmak, silmek, kayıtlı kayıtları yeniden orijinal adla yeniden adlandırmak ve varsa dizinleri geri yüklemek daha hızlıdır .
Anton Krouglov

1
Bu sifonu temizledikten sonra, 100m'den çok daha küçük gruplar öneriyorum, genellikle 100k ila 1m arası yaparım. Ayrıca, mümkünse silinecek kayıtları seçmek için birincil anahtarınızı WHERE yan tümcesi olarak kullanın.
BradC

Büyük miktarda veri silerken ve günlük sorunlarından kaçınmaya çalışırken kesilir.
Jeff.Clark

Yanıtlar:


14

Her şeyden önce, SQL hata günlüğünü gerçekten günlük için bir maksimum boyutu isabet olmadığını görmek için kontrol edin. Eğer öyleyse, sorgunun tamamlanma umudu yoktur, muhtemelen zaten geri alma durumundadır.

Öyle olsa bile, ben her zaman örümceği elle öldürmeyi tercih ederim ( örümceği bulmak için sp_who2veya tuşunu kullanın sp_WhoIsActive, sonra bir kill 59ya da her neyse). Açık bir KILL yapmazsanız geri alma durumunu da kontrol edemezsiniz, ilgili konuya bakın .

Bu bir güncelleme veya ekleme değil, bir silme olduğundan, çok şanslı olabilirsiniz ve hemen geri döndüğünü görebilirsiniz. Değilse, bu noktaya gelmek için geri alınması uzun (veya daha uzun) sürebilir.

Geri alma durumunu görmek için şunu kullanın:

kill 59 with statusonly

Ne yazık ki, bu sık sık yararlı bir şey göstermiyor, sadece bir "% 0 tamamlandı" bulduk. Bu durumda, sp_who2hala bir şey yapıp yapmadığını görmek için IO ve CPU'yu kullanmanız ve izlemeniz gerekir.

Yeniden başlatma ile ilgili olarak, bu büyük bir risktir. Örümcek etkin bir şekilde geri dönüyorsa (CPU ve GÇ değişiyorsa), SQL'in yeniden başlatılması veritabanını yalnızca geri alma işlemi tamamlanıncaya (saat ve saat) tamamen çevrimdışı duruma getirecektir. Ancak , CPU ve IO hareket etmiyorsa , aslında hemen temizleyebilir. Her iki durumda da, bu bir risktir.

Son bir seçenek, işler özellikle korkunçsa: Silme başlamadan hemen önce bir yedeğiniz varsa (ve db'de başka güncellemeler yoksa) , kurtarmanın en hızlı yolu DB'yi bırakmak, yeniden başlatmak olabilir SQL ve yedeklemeden geri yükleme.

DB'yi bırakamıyorsanız (veya örneği zaten yeniden başlattıysanız ve sql hata günlüğü 24 saatlik bir kurtarma süresi öngörüyorsa), SQL hizmetlerini kapatın, MDF ve LDF dosyalarını diskten silin, SQL'i başlatın, bırakın (hayalet) veritabanını seçin ve yedekten geri yükleyin.

Açıkçası, yalnızca bu, kullanıcıların etkileşimde bulunmadığı bir arka uç işleme veritabanı olsaydı.


3
Geri yükleme seçeneği hakkında iyi tavsiyeler. Cehennem kadar korkutucu, ama yine de iyi bir tavsiye.
Max Vernon

2
Evet, bu durumda iki çok kötü seçenek arasında karar vermemizi gerektiren bir DBA örneğini yeniden başlattık: 18-24 saat inin veya sorgu başlamadan önce geri dönerek verileri kaybedin. İş geri dönmeyi seçti.
BradC

1
Yeniden başlatma işe yaramazsa son çare olarak geri yükleyeceğimiz 4 Mart'tan itibaren tam bir yedeklememiz var. Neyse ki, biz sadece kırpmak isteyen statik yeterince DB. Geri bildiriminiz için teşekkür ederiz, çok yardımcı
Graeme

4
@Graeme - FYI - 1,2 milyar satırı silmeye çalışmak yerine, tablo yapısının bir kopyasını oluşturun, saklamak istediğiniz satırları yeni tabloya kopyalayın, ardından eski tabloyu bırakın. Nasıl yapılacağını soran yeni bir soru eklerseniz, size 1,2 milyar satırı silmekten çok daha hızlı olan çok şık bir yol gösterebilirim.
Max Vernon

Cevabım db'nin BASİT kurtarma modunda olduğunu varsayar. TAM modundaysa, büyük tran günlük yedeklemelerini de yönetmeniz gerekir.
BradC

8

SQL SUNUCUSU YENİDEN BAŞLATMAYIN. Bu sadece acıyı uzatacaktır, çünkü silme de dahil olmak üzere tamamlanmayan tüm işlemleri geri alacak veya yineleyecek olan kurtarma gerçekleşecektir.

Silme işlemini çalıştıran oturumu öldürmek geri alma işlemiyle sonuçlanır ve bu da tamamlanması uzun zaman alır.

İşlemin durumunu görmek için aşağıdaki sorguya bakmak istiyorsunuz:

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;

percent_completeKolon, ve bu şekilde ona bağlı olanlar estimated_completion_time, yalnızca aşağıdaki işlemleri için doldurulur:

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

Bu nedenle, yalnızca silme ifadesini zaten iptal ettiyseniz ve geri dönüyorsa veya SQL Server'ı yeniden başlattıysanız ve kurtarma aşamasındaysa, bu sütunun anlamlı olduğunu görürsünüz.

blocking_session_idSütunda bir sayı varsa, diğer oturumun silme işlemini engellediğini gösterir. Bu oturum, başlatıldığından beri silme işlemini engelliyorsa, herhangi bir geri alma işlemine gerek kalmadan işlemi iptal edebilirsiniz.


İyi sorgular, ancak silme engelleniyorsa günlüğün çok büyük olması muhtemel görünmüyor.
BradC

4
Evet. Ben sadece çıktıyı biraz açıklamaya çalışıyorum. Gelecek okuyucular da bunu görebilir. Aslýnda, gelecek sene OP'den haber alacađýmýzdan ţüpheleniyorum. Muhtemelen oldukça meşgul.
Max Vernon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.