SQL Server'da Kurtarma Bekleniyor veya Şüpheli durumundaki Always On kullanılabilirlik veritabanlarıyla ilgili sorunları giderme

Bu makalede, Microsoft SQL Server veya durumundaki bir kullanılabilirlik veritabanının hataları ve sınırlamaları ve veritabanının bir Recovery PendingSuspect kullanılabilirlik grubundaki tam işlevselliğe nasıl geri yükleneceği açıklanmaktadır.

Orijinal ürün sürümü: SQL Server 2012
Özgün KB numarası: 2857849

Özet

Always On kullanılabilirlik grubunda tanımlanan bir kullanılabilirlik veritabanının SQL Server'da veya Recovery PendingSuspect durumuna geçtiğini varsayalım. Bu durum kullanılabilirlik grubunun birincil çoğaltması üzerinde oluşursa veritabanı kullanılabilirliği etkilenir. Bu durumda, istemci uygulamaları aracılığıyla veritabanına erişemezsiniz. Ayrıca, veritabanını kullanılabilirlik grubundan bırakamaz veya kaldıramazsınız.

Örneğin, SQL Server çalıştığını ve bir kullanılabilirlik veritabanının Recovery Pending veya Suspect durumuna ayarlandığını varsayalım. Aşağıdaki SQL betiğini kullanarak birincil çoğaltmadaki dinamik yönetim görünümlerini (DMV) sorguladığınızda, veritabanı bir ve RECOVERY_PENDING durumunda veya aşağıdaki gibi bir SUSPECT durumda bildirilebilirNOT_HEALTHY:

SELECT
    dc.database_name,
    d.synchronization_health_desc,
    d.synchronization_state_desc,
    d.database_state_desc
FROM
    sys.dm_hadr_database_replica_states d
    JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
    AND d.is_local = 1
database_name          synchronization_health_desc     synchronization_state_desc   database_state_desc
-------------------- ------------------------------ ------------------------------ ---------------------
<DatabaseName>                         NOT_HEALTHY              NOT SYNCHRONIZING      RECOVERY_PENDING
(1 row(s) affected)

Veritabanı durumunu ve eşitleme durumunu denetlemek için betik yürütme sonucunun ekran görüntüsü.

Ayrıca, bu veritabanı SQL Server Management Studio'da Eşitlenmiyor / Kurtarma Bekleniyor veya Şüpheli durumunda olarak bildirilebilir.

Eşitlenmiyor / Kurtarma Bekleniyor durumundaki veritabanının ekran görüntüsü.

Veritabanı bir kullanılabilirlik grubunda tanımlandığında, veritabanı bırakılamaz veya geri yüklenemez. Bu nedenle, veritabanını kurtarmak ve üretim kullanımına döndürmek için belirli adımları gerçekleştirmeniz gerekir.

Daha fazla bilgi

Aşağıdaki içerik, çeşitli durumlarda Kurtarma Bekleniyor durumunda olan bir kullanılabilirlik veritabanının hatalarını ve sınırlamalarını açıklar.

  • Veritabanı durumu veritabanının geri yüklenmesini engelliyor

    parametresine sahip veritabanını geri yüklemek için aşağıdaki SQL betiğini çalıştırmayı RECOVERY deneyin:

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    Bu betiği çalıştırdığınızda, veritabanı bir kullanılabilirlik grubunda tanımlandığından aşağıdaki hata iletisini alırsınız:

    Msg 3104, Düzey 16, Durum 1, Satır 1
    DATABASEName veritabanı <yansıtması için yapılandırıldığından veya bir kullanılabilirlik grubuna katıldığından, RESTORE databaseName> üzerinde çalışamıyor. Veritabanını geri yüklemeyi planlıyorsanız yansıtmayı kaldırmak veya veritabanını kullanılabilirlik grubundan kaldırmak için ALTER DATABASE kullanın.

    Msg 3013, Düzey 16, Durum 1, Satır 1
    RESTORE DATABASE anormal şekilde sonlandırılıyor.

  • Veritabanı durumu veritabanının bırakılmasını engelliyor

    Veritabanını bırakmak için aşağıdaki SQL betiğini çalıştırmayı deneyin:

    DROP DATABASE <DatabaseName>
    

    Bu betiği çalıştırdığınızda, veritabanı bir kullanılabilirlik grubunda tanımlandığından aşağıdaki hata iletisini alırsınız:

    Msg 3752, Düzey 16, Durum 1, Satır 1
    DatabaseName> veritabanı <şu anda bir kullanılabilirlik grubuna katılmış durumda. Veritabanını bırakmadan önce kullanılabilirlik grubundan kaldırmanız gerekir.

  • Veritabanı durumu, veritabanının kullanılabilirlik grubundan kaldırılmasını engeller

    Veritabanını kullanılabilirlik grubundan kaldırmak için aşağıdaki SQL betiğini çalıştırmayı deneyin:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Bu betiği çalıştırmayı denediğinizde, kullanılabilirlik veritabanı birincil çoğaltmaya ait olduğundan aşağıdaki hata iletisini alırsınız:

    Msg 35240, Düzey 16, Durum 14, Satır 1
    DatabaseName DatabaseName<, AvailabilityGroupName>> kullanılabilirlik grubuna katılamaz veya bu gruba <katılamaz. Bu işlem, kullanılabilirlik grubunun birincil çoğaltması üzerinde desteklenmez.

    Bu hata iletisi nedeniyle, veritabanının yükünü devretmek zorunda olabilirsiniz. Veritabanı yük devredildikten sonra kurtarma bekleyen veritabanının sahibi olan çoğaltma ikincil rolde yer alır. Bu durumda, veritabanını ikincil çoğaltmadaki kullanılabilirlik grubundan kaldırmak için aşağıdaki SQL betiğini yeniden yürütmeyi denersiniz:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Ancak, veritabanını kullanılabilirlik grubundan kaldıramazsınız ve veritabanı hala Kurtarma Bekleniyor durumunda olduğundan aşağıdaki hata iletisini alırsınız:

    Msg 921, Düzey 16, Durum 112, Satır 1
    DatabaseName <> henüz kurtarılmadı. Bekleyin ve yeniden deneyin.

Veritabanı ikincil rolde olduğunda çözüm

Bu sorunu çözmek için aşağıdaki genel eylemleri gerçekleştirin:

  • Veritabanı ikincil rolde olduğunda bozuk veritabanını barındıran çoğaltmayı kullanılabilirlik grubundan kaldırın.
  • Sistemi etkileyen ve veritabanı hatasına katkıda bulunan sorunları çözün.
  • Çoğaltmayı kullanılabilirlik grubuna geri yükleyin.

Bu eylemleri yapmak için yeni birincil çoğaltmaya bağlanın ve başarısız kullanılabilirlik veritabanını barındıran çoğaltmayı kaldırmak için SQL betiğini çalıştırın ALTER AVAILABILITY GROUP . Bunu yapmak için şu adımları uygulayın.

Bu adımlarda birincil çoğaltmanın önce hasarlı veritabanını barındırdığını varsayar. Bu nedenle, zarar görmüş veritabanını barındıran çoğaltmayı ikincil bir role aktarmak için önce bir yük devretme gerçekleşmelidir.

  1. SQL Server çalıştıran ve ikincil çoğaltmayı barındıran sunucuya bağlanın.

  2. Aşağıdaki SQL betiğini çalıştırın:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. Bozuk veritabanını barındıran çoğaltmayı kullanılabilirlik grubundan kaldırmak için aşağıdaki SQL betiğini çalıştırın:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. Sunucuda SQL Server çalıştıran ve veritabanı hatasına katkıda bulunabilecek sorunları çözün.

  5. Çoğaltmayı kullanılabilirlik grubuna yeniden ekleyin.

Birincil çoğaltma kullanılabilirlik grubundaki tek çoğaltma olduğunda çözüm

Birincil çoğaltma bozuk veritabanını barındırıyorsa ve kullanılabilirlik grubundaki tek çalışan çoğaltmaysa, kullanılabilirlik grubu bırakılmalıdır. Kullanılabilirlik grubu bırakıldıktan sonra veritabanınız bir yedekten kurtarılabilir veya veritabanlarını geri yüklemek ve üretimi sürdürmek için diğer acil durum kurtarma çalışmaları uygulanabilir.

Kullanılabilirlik grubunu bırakmak için aşağıdaki SQL betiğini kullanın:

DROP AVAILABILITY GROUP <AvailabilityGroupName>

Bu noktada, sorunlu veritabanını kurtarmayı deneyebilirsiniz. Veya veritabanını bilinen son iyi yedekleme kopyasından geri yükleyebilirsiniz.

Kullanılabilirlik grubunu bıraktığınızda çözüm

Bir kullanılabilirlik grubunu bıraktığınızda dinleyici kaynağı da bırakılır ve kullanılabilirlik veritabanlarıyla uygulama bağlantısını keser.

Uygulama kapalı kalma süresini en aza indirmek için aşağıdaki yöntemlerden birini kullanarak dinleyici aracılığıyla uygulama bağlantısını sürdürün ve kullanılabilirlik grubunu bırakın:

Yöntem 1: Yük Devretme Kümesi Yöneticisi'nde dinleyiciyi yeni bir kullanılabilirlik grubuyla (rol) ilişkilendirme

Bu yöntem, kullanılabilirlik grubunu bırakırken ve yeniden oluştururken dinleyiciyi korumanıza olanak tanır.

  1. Mevcut kullanılabilirlik grubu dinleyicisinin bağlantıları yönlendirdiği SQL Server örneğinde yeni, boş bir kullanılabilirlik grubu oluşturun. Bu işlemi basitleştirmek için Transact-SQL komutunu kullanarak ikincil çoğaltması veya veritabanı olmayan bir kullanılabilirlik grubu oluşturun:

    USE master
    GO
    CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
        ENDPOINT_URL = 'tcp://sqlnode1:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        FAILOVER_MODE = MANUAL
    )
    
  2. Yük Devretme Kümesi Yöneticisi'ni başlatın ve sol bölmede Roller'i seçin. Rolleri listeleyen bölmede özgün kullanılabilirlik grubunu seçin.

  3. Orta alt bölmedeki Kaynaklar sekmesinin altında kullanılabilirlik grubu kaynağına sağ tıklayın ve özellikler'i seçin. Bağımlılıklar sekmesini seçin, dinleyiciye bağımlılığı silin ve ardından Tamam'ı seçin.

    Kullanılabilirlik grubu özellikleri Bağımlılıklar sekmesinin ekran görüntüsü.

  4. Kaynakların altında dinleyiciye sağ tıklayın, Diğer Eylemler'i ve ardından Başka Bir Role Ata'yı seçin.

  5. Kaynağı Role Ata iletişim kutusunda yeni kullanılabilirlik grubunu ve ardından Tamam'ı seçin.

    Eklenen yeni kullanılabilirlik grubunu gösteren Role Kaynak Ata iletişim kutusunun ekran görüntüsü.

  6. Roller bölmesinde yeni kullanılabilirlik grubunu seçin. Orta alt bölmedeki Kaynaklar sekmesinin altında artık yeni kullanılabilirlik grubunu ve dinleyici kaynağını görmeniz gerekir. Yeni kullanılabilirlik grubu kaynağına sağ tıklayın ve özellikler'i seçin.

  7. Bağımlılıklar sekmesine tıklayın, açılan kutudan dinleyici kaynağını seçin ve ardından Tamam'ı seçin.

    Yeni kullanılabilirlik grubu özellikleri Bağımlılıklar sekmesinin ekran görüntüsü.

  8. SQL Server Management Studio'da, yeni kullanılabilirlik grubunun birincil çoğaltmasını barındıran SQL Server örneğine bağlanmak için Nesne Gezgini kullanın. Her Zaman Açık Yüksek Kullanılabilirlik'i seçin, yeni kullanılabilirlik grubuna tıklayın ve ardından Kullanılabilirlik Grubu Dinleyicileri'ni seçin. Dinleyiciyi bulmalısın.

  9. Dinleyiciye sağ tıklayın, Özellikler'i seçin, dinleyici için uygun bağlantı noktası numarasını yazın ve tamam'ı seçin.

    Dinleyici yapılandırmasını gösteren kullanılabilirlik grubu dinleyicisi özelliklerinin ekran görüntüsü.

Bu, dinleyiciyi kullanan uygulamaların üretim veritabanlarını kesintisiz olarak barındıran SQL Server örneğine bağlanmak için bunu kullanmaya devam etmelerini sağlar. Özgün kullanılabilirlik grubu artık tamamen kaldırılabilir ve yeniden oluşturulabilir. Ya da veritabanları ve çoğaltmalar yeni kullanılabilirlik grubuna eklenebilir.

Özgün kullanılabilirlik grubunu yeniden oluşturursanız, dinleyiciyi yeniden kullanılabilirlik grubu rolüne atamalı, yeni kullanılabilirlik grubu kaynağıyla dinleyici arasındaki bağımlılığı ayarlamalı ve ardından bağlantı noktasını dinleyiciye yeniden atamalısınız. Bunu yapmak için şu adımları uygulayın:

  1. Yük Devretme Kümesi Yöneticisi'ni başlatın ve sol bölmede Roller'i seçin. Rolleri listeleyen bölmede, dinleyiciyi barındıran yeni kullanılabilirlik grubuna tıklayın.
  2. Ortadaki alt bölmede , Kaynaklar sekmesinin altında dinleyiciye sağ tıklayın, Diğer Eylemler'i ve ardından Başka Bir Role Ata'yı seçin. İletişim kutusunda, yeniden oluşturulan kullanılabilirlik grubunu seçin ve ardından Tamam'ı seçin.
  3. Roller bölmesinde, yeniden oluşturulan kullanılabilirlik grubuna tıklayın. Orta bölmenin alt kısmındaki Kaynaklar sekmesinin altında artık yeniden oluşturulan kullanılabilirlik grubunu ve dinleyici kaynağını görmeniz gerekir. Yeniden oluşturulan kullanılabilirlik grubu kaynağına sağ tıklayın ve özellikler'i seçin.
  4. Bağımlılıklar sekmesini seçin, açılan kutudan dinleyici kaynağını seçin ve ardından Tamam'ı seçin.
  5. SQL Server Management Studio'da, yeniden oluşturulan kullanılabilirlik grubunun birincil çoğaltmasını barındıran SQL Server örneğine bağlanmak için Nesne Gezgini kullanın. Her Zaman Açık Yüksek Kullanılabilirlik'i seçin, yeni kullanılabilirlik grubuna tıklayın ve ardından Kullanılabilirlik Grubu Dinleyicileri'ni seçin. Dinleyiciyi bulmalısın.
  6. Dinleyiciye sağ tıklayın, Özellikler'i seçin, dinleyici için uygun bağlantı noktası numarasını yazın ve tamam'ı seçin.

Yöntem 2: Dinleyiciyi mevcut bir SQL Server Yük Devretme Kümelenmiş Örneği (SQLFCI) ile ilişkilendirme

Kullanılabilirlik grubunuzu SQL Server Yük Devretme Kümelenmiş Örneğinde (SQLFCI) barındırıyorsanız, dinleyici kümelenmiş kaynağını SQLFCI kümelenmiş kaynak grubuyla ilişkilendirebilir ve ardından kullanılabilirlik grubunu yeniden oluşturabilirsiniz.

  1. Yük Devretme Kümesi Yöneticisi'ni başlatın ve sol bölmede Roller'i seçin.

  2. Rolleri listeleyen bölmede özgün kullanılabilirlik grubunu seçin.

  3. Ortadaki alt bölmede , Kaynaklar sekmesinin altında kullanılabilirlik grubu kaynağına sağ tıklayın ve özellikler'i seçin.

  4. Bağımlılıklar sekmesini seçin, dinleyiciye bağımlılığı silin ve ardından Tamam'ı seçin.

  5. Ortadaki alt bölmede , Kaynaklar sekmesinin altında dinleyiciye sağ tıklayın, Diğer Eylemler'i ve ardından Başka Bir Role Ata'yı seçin.

  6. Role Kaynak Ata iletişim kutusunda SQL Server FCI örneğine tıklayın ve ardından Tamam'ı seçin.

    Role Kaynak Ata iletişim kutusunun ekran görüntüsü.

  7. Roller bölmesinde SQLFCI grubunu seçin. Alt orta bölmedeki Kaynaklar sekmesinin altında artık yeni dinleyici kaynağını görmeniz gerekir.

Bu, dinleyiciyi kullanan uygulamaların üretim veritabanlarını kesintisiz olarak barındıran SQL Server örneğine bağlanmak için bunu kullanmaya devam etmelerini sağlar. Özgün kullanılabilirlik grubu artık kaldırılabilir ve yeniden oluşturulabilir. Ya da veritabanları ve çoğaltmalar yeni kullanılabilirlik grubuna eklenebilir.

Kullanılabilirlik grubu yeniden oluşturulduktan sonra dinleyiciyi kullanılabilirlik grubu rolüne yeniden atayın. Ardından yeni kullanılabilirlik grubu kaynağı ile dinleyici arasındaki bağımlılığı ayarlayın ve bağlantı noktasını dinleyiciye yeniden atayın:

  1. Yük Devretme Kümesi Yöneticisi'ni başlatın ve sol bölmede Roller'i seçin.
  2. Rolleri listeleyen bölmede özgün SQLFCI rolüne tıklayın.
  3. Alt orta bölmedeki Kaynaklar sekmesinin altında dinleyiciye sağ tıklayın, Diğer Eylemler'i ve ardından Başka Bir Role Ata'yı seçin.
  4. İletişim kutusunda, yeniden oluşturulan kullanılabilirlik grubuna tıklayın ve ardından Tamam'ı seçin.
  5. Roller bölmesinde yeni kullanılabilirlik grubunu seçin.
  6. Kaynaklar sekmesinin altında yeni kullanılabilirlik grubunu ve dinleyici kaynağını görmeniz gerekir. Yeni kullanılabilirlik grubu kaynağına sağ tıklayın ve özellikler'i seçin.
  7. Bağımlılıklar sekmesini seçin, açılan kutudan dinleyici kaynağını seçin ve ardından Tamam'ı seçin.
  8. SQL Server Management Studio'da, yeni kullanılabilirlik grubunun birincil çoğaltmasını barındıran SQL Server örneğine bağlanmak için Nesne Gezgini kullanın.
  9. Her Zaman Açık Yüksek Kullanılabilirlik'i seçin, yeni kullanılabilirlik grubuna tıklayın ve ardından Kullanılabilirlik Grubu Dinleyicileri'ni seçin. Dinleyiciyi bulmalısın.
  10. Dinleyiciye sağ tıklayın, Özellikler'i seçin, dinleyici için uygun bağlantı noktası numarasını yazın ve tamam'ı seçin.

Yöntem 3: Kullanılabilirlik grubunu bırakın ve ardından aynı dinleyici adıyla kullanılabilirlik grubunu ve dinleyiciyi yeniden oluşturun

Kullanılabilirlik grubu ve dinleyici bırakılıp yeniden oluşturulduğundan, bu yöntem şu anda bağlı olan uygulamalar için küçük bir kesintiye neden olur:

  1. Kullanılabilirlik grubunu bırakın.

    Not

    Bu, dinleyiciyi de bırakır.

  2. Hemen üretim veritabanlarını barındıran sunucuda dinleyici tanımını içeren yeni, boş bir kullanılabilirlik grubu oluşturun.

    Örneğin, kullanılabilirlik grubu dinleyicinizin dikkatsiz olduğunu varsayalım. Aşağıdaki Transact-SQL deyimi, birincil veya ikincil veritabanı olmayan bir kullanılabilirlik grubu oluşturur, ancak aglisten adlı bir dinleyici de oluşturur. Uygulamalar bağlanmak için bu dinleyiciyi kullanabilir.

    USE master
    GO
        CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
            ENDPOINT_URL = 'tcp://sqlnode1:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL
        ) LISTENER 'aglisten' (
            WITH IP ((N'11.0.0.25', N'255.0.0.0')),
            PORT = 1433
        )
    GO
    
  3. Hasarlı veritabanını kurtarın. Ardından bunu ve ikincil çoğaltmayı kullanılabilirlik grubuna geri ekleyin.