Tidak dapat mem-mirror database SQL Server 2012

11

Saat mencoba mirror database menggunakan perintah berikut

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Saya mendapatkan kesalahan berikut

Msg 1475, Level 16,
Status 105, Baris 1 Basis Data "test0916aj8CJ" mungkin berisi perubahan log massal yang belum dicadangkan. Ambil cadangan log pada basis data utama atau basis data primer. Kemudian kembalikan cadangan ini baik pada database cermin untuk mengaktifkan mirroring basis data atau pada setiap database sekunder agar Anda dapat bergabung dengan grup ketersediaan.

Bisakah ini dilakukan tanpa mendukung database? Atau haruskah saya mencadangkan dan membuang cadangannya. Ini untuk db yang baru dibuat, jadi saya tidak perlu cadangan lagi pada saat ini.

Saya sudah mencoba yang berikut ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

tetapi metode di atas tidak berhasil juga.

Terima kasih

Tagihan
sumber
Beberapa hal ... Anda sebenarnya tidak mirroring dengan perintah itu tetapi menambahkan database ke grup ketersediaan. Yang kemudian membuat saya bertanya tentang bagaimana AG Anda setup, apa mode pemulihan database Anda, dan mengapa, untuk memperbaiki masalah log, Anda sedang melakukan backup COPY_ONLY yang membuat log tetap utuh dan bukan kesalahan yang menentukan apa yang Anda lakukan. ? Sepertinya saya Anda kehilangan beberapa langkah atau sangat bingung dengan apa yang Anda coba lakukan.
Steve Mangiameli

Jawaban:

15

Mudah untuk mengulang kesalahan yang Anda dapatkan

  • Buat database dalam mode pemulihan penuh pada Utama.
  • Buat database dalam mode pemulihan penuh di Sekunder.
  • Luncurkan GUI dan coba konfigurasikan mirroring antara Primary dan Secondary.

Di bawah ini adalah kesalahan yang akan Anda dapatkan:

Database "test_mirroring_kin" mungkin berisi perubahan dalam jumlah besar yang belum dicadangkan. Ambil cadangan log pada basis data utama atau basis data primer. Kemudian kembalikan cadangan ini baik pada basis data mirror untuk mengaktifkan mirroring basis data atau pada setiap basis data sekunder agar Anda dapat bergabung dengan grup ketersediaan. (Microsoft SQL Server, Kesalahan: 1475)

masukkan deskripsi gambar di sini

Mari kita mengerti apa kesalahan itu:

Anda mengkonfigurasi database Anda dalam mode pemulihan LENGKAP dan berpikir bahwa database memang dalam mode pemulihan LENGKAP.

Di atas tidak benar. Setelah membuat database, jika Anda tidak melakukan backup FULL, meskipun database berada dalam mode pemulihan FULL, itu dalam pemulihan semu-SIMPLE

Anda dapat dengan mudah memverifikasi menggunakan dbcc dbinfo-> dbi_dbbackupLSNmemiliki nilai 0:0:0(0x00000000:00000000:0000)atau menggunakan skrip Paul Randal

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

masukkan deskripsi gambar di sini

Sunting: Bahkan mengambil cadangan penuh pertama dengan COPY_ONLYopsi tidak membuat rantai cadangan juga

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNmasih memiliki nilai 0:0:0(0x00000000:00000000:0000). Ini berarti basis data masih dalam mode pemulihan semu-sederhana.

Apa yang perlu Anda lakukan untuk mengatasi kesalahan di atas?

Anda perlu mengambil cadangan penuh + satu cadangan log transaksi pada primer dan kemudian mengembalikannya pada basis data sekunder with norecoverydan kemudian bergabung dengan basis data dalam grup AG atau Mirroring.

Sebagai catatan tambahan dan untuk kelengkapan, untuk penulisan skrip Anda backup to NUL, baca posting blog ini oleh Gail Shaw.

Kin Shah
sumber
5

Mengapa TO DISK = N’NUL’?

Saya tidak mengerti mengapa Anda menggunakan TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Jika Anda melakukannya, cadangan disimpan ke NUL, (mis. = Ke mana-mana / tidak ada) dan tidak dapat digunakan karena file-nya tidak ada.

Meskipun NULjuga dapat digunakan sebagai tujuan untuk LOG Backups, itu juga tidak boleh digunakan, terutama pada server Prod karena LOGs akan hilang dan rantai Backup akan rusak. (~ mirip dengan a SHRINKFILE)

Cadangan LOG

Sebelum menambahkan DB ke grup, Anda harus menyiapkannya. Saat Anda ingin menyiapkan DB sekunder, setidaknya 1 Log Transaksi cadangan harus diambil dan dipulihkan. Mirror menggunakannya untuk mengetahui transaksi mana yang sudah disinkronkan pada DB sekunder dan transaksi mana yang belum disinkronkan dengan DB primer.

Karenanya Anda harus Mencadangkan Log Transaksi pada DB utama:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

The COPY_ONLYpilihan harus digunakan. Itu memastikan bahwa Log tidak terpotong pada akhir cadangan LOG.

Rantai cadangan DB primer

Namun, Anda tidak dapat memulihkan cadangan log saja, artinya tanpa rantai cadangan (lihat juga jawaban Kin). Ini berarti bahwa cadangan Log Transaksi harus diambil setelah Cadangan Database LENGKAP (+ Diferensial opsional jika diperlukan) telah diambil.

Karena COPY_ONLYopsi tidak memutus rantai cadangan, itu juga tidak membuat rantai cadangan. The COPY_ONLYpilihan tidak dapat digunakan untuk Database Backup.

Cadangkan secara berurutan:

  • Cadangan Database LENGKAP tanpa COPY_ONLYopsi
  • Cadangan diferensial opsional
  • 1 LOG Backup dengan COPY_ONLYopsi
  • cadangan LOG lain (atau lebih) jika perlu ...

Kembalikan DB sekunder

Maka Backup Database harus dikembalikan (+ Diferensial) pada yang sekunder.

Itu harus dipulihkan dengan NORECOVERYopsi karena Anda juga ingin mengembalikan cadangan LOG begitu Cadangan LENGKAP telah dipulihkan.

Akhirnya Anda akan mengembalikan LOG Backup. Anda masih perlu menggunakan NORECOVERYopsi ini karena mirror akan terus memulihkan transaksi sekali di tempat.

  • Kembalikan cadangan LENGKAP dengan NORECOVERYopsi
  • Kembalikan cadangan DIFF dengan NORECOVERYopsi
  • Pulihkan semua cadangan LOG untuk NORECOVERYopsi ini

Mari kita menggabungkan semuanya (menyesuaikannya dengan env Anda)

  • Di server Utama jalankan:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • Pada menjalankan server Sekunder:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • Anda kemudian dapat melanjutkan dengan menambahkan DB sekunder baru ke grup ketersediaan ...

Tindakan opsional

  • Lebih baik mengatur opsi DISK ke folder bersama yang tersedia dari server Utama dan Sekunder.
  • Lebih baik menyimpan file DB pada disk dan lokasi yang sama pada server Utama dan Sekunder.
Julien Vavasseur
sumber