Không thể phản chiếu cơ sở dữ liệu SQL Server 2012


11

Khi cố gắng phản chiếu cơ sở dữ liệu bằng lệnh sau

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Tôi nhận được lỗi sau đây

Msg 1475, Cấp 16, Trạng thái 105,
Cơ sở dữ liệu Dòng 1 "test0916aj8CJ" có thể chứa các thay đổi được ghi lại hàng loạt chưa được sao lưu. Hãy sao lưu nhật ký trên cơ sở dữ liệu chính hoặc cơ sở dữ liệu chính. Sau đó khôi phục bản sao lưu này trên cơ sở dữ liệu nhân bản để cho phép nhân bản cơ sở dữ liệu hoặc trên mọi cơ sở dữ liệu thứ cấp để cho phép bạn tham gia vào nhóm khả dụng.

Điều này có thể được thực hiện mà không cần sao lưu cơ sở dữ liệu? Hoặc tôi nên sao lưu và sau đó loại bỏ sao lưu. Nó dành cho một db mới được tạo, vì vậy dù sao tôi cũng không cần sao lưu.

Tôi đã thử như sau ...

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

nhưng phương pháp trên cũng không hoạt động.

Cảm ơn


Vài điều ... Bạn không thực sự phản chiếu với lệnh đó mà thêm cơ sở dữ liệu vào một nhóm khả dụng. Điều đó sau đó khiến tôi hỏi về cách thiết lập AG của bạn, cơ sở dữ liệu của bạn đang ở chế độ khôi phục nào và tại sao, để khắc phục sự cố nhật ký, bạn đang thực hiện sao lưu COPY_ONLY để lại nhật ký không phải là lỗi mà bạn đang làm ? Dường như với tôi bạn đang thiếu một vài bước hoặc rất bối rối về những gì bạn đang cố gắng làm.
Steve Mangiameli

Câu trả lời:


15

Thật dễ dàng để sửa lỗi mà bạn gặp phải

  • Tạo cơ sở dữ liệu trong chế độ phục hồi đầy đủ trên Chính.
  • Tạo cơ sở dữ liệu trong chế độ phục hồi đầy đủ trong Trung học.
  • Khởi chạy GUI và cố gắng định cấu hình phản chiếu giữa Chính và Phụ.

Dưới đây là lỗi bạn sẽ nhận được:

Cơ sở dữ liệu "test_mirroring_kin" có thể chứa các thay đổi được ghi lại hàng loạt chưa được sao lưu. Hãy sao lưu nhật ký trên cơ sở dữ liệu chính hoặc cơ sở dữ liệu chính. Sau đó khôi phục bản sao lưu này trên cơ sở dữ liệu nhân bản để cho phép nhân bản cơ sở dữ liệu hoặc trên mọi cơ sở dữ liệu thứ cấp để cho phép bạn tham gia vào nhóm khả dụng. (Máy chủ Microsoft SQL, Lỗi: 1475)

nhập mô tả hình ảnh ở đây

Hãy hiểu lỗi đó là gì:

Bạn đã cấu hình cơ sở dữ liệu của mình ở chế độ phục hồi FULL và nghĩ rằng cơ sở dữ liệu thực sự ở chế độ phục hồi FULL.

Những điều trên là không đúng sự thật. Sau khi tạo cơ sở dữ liệu, nếu bạn không thực hiện sao lưu ĐẦY ĐỦ, mặc dù cơ sở dữ liệu ở chế độ khôi phục ĐẦY ĐỦ, nó sẽ ở chế độ khôi phục giả SIMPLE

Bạn có thể dễ dàng xác minh bằng cách sử dụng dbcc dbinfo-> dbi_dbbackupLSNcó giá trị 0:0:0(0x00000000:00000000:0000)hoặc sử dụng tập lệnh của Paul Randal

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

nhập mô tả hình ảnh ở đây

Chỉnh sửa: Ngay cả khi thực hiện sao lưu toàn bộ đầu tiên với COPY_ONLYtùy chọn cũng không thiết lập chuỗi sao lưu

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

dbcc dbinfo-> dbi_dbbackupLSNvẫn có giá trị 0:0:0(0x00000000:00000000:0000). Điều này có nghĩa là cơ sở dữ liệu vẫn ở chế độ phục hồi giả đơn giản.

Bạn cần làm gì để giải quyết lỗi trên?

Bạn cần phải sao lưu toàn bộ + một bản sao lưu nhật ký giao dịch trên chính và sau đó khôi phục nó trên cơ sở dữ liệu thứ cấp with norecoveryvà sau đó tham gia cơ sở dữ liệu trong nhóm AG hoặc Mirroring.

Như một lưu ý phụ và để hoàn thiện, để biết kịch bản của bạn backup to NUL, hãy đọc bài đăng trên blog này của Gail Shaw.


5

Tại sao TO DISK = N’NUL’?

Tôi không hiểu tại sao bạn đang sử dụng TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Nếu bạn làm điều đó, bản sao lưu được lưu vào NUL, (tức là = đến hư không / không có gì) và không thể được sử dụng vì tệp của nó không tồn tại.

Mặc dù NULcũng có thể được sử dụng làm đích cho Sao lưu LOG, nhưng nó cũng không nên được sử dụng, đặc biệt là trên các máy chủ Prod vì LOG sẽ bị mất và chuỗi Sao lưu sẽ bị phá vỡ. (~ tương tự như a SHRINKFILE)

Đăng nhập sao lưu

Trước khi thêm DB vào nhóm, bạn phải chuẩn bị nó. Khi bạn muốn chuẩn bị một DB thứ cấp, ít nhất 1 bản sao lưu Nhật ký giao dịch phải được thực hiện và khôi phục. Chiếc gương sử dụng nó để tìm ra những giao dịch nào đã được đồng bộ hóa trên DB thứ cấp và những giao dịch nào chưa được đồng bộ hóa với DB chính.

Do đó, bạn phải Sao lưu Nhật ký giao dịch trên DB chính:

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

Các COPY_ONLYtùy chọn phải được sử dụng. Nó đảm bảo rằng các Nhật ký không bị cắt ở cuối bản sao lưu LOG.

Chuỗi dự phòng DB chính

Tuy nhiên, bạn không thể khôi phục bản sao lưu nhật ký một mình, nghĩa là không có chuỗi sao lưu (xem câu trả lời Kin quá). Điều này có nghĩa là sao lưu Nhật ký giao dịch phải được thực hiện sau khi Sao lưu cơ sở dữ liệu ĐẦY ĐỦ (+ một vi sai tùy chọn nếu cần) đã được thực hiện.

COPY_ONLYtùy chọn không phá vỡ chuỗi sao lưu, nên nó cũng không tạo ra chuỗi dự phòng. Các COPY_ONLYtùy chọn không thể được sử dụng để sao lưu cơ sở dữ liệu.

Sao lưu theo thứ tự:

  • Sao lưu cơ sở dữ liệu FULL mà không có COPY_ONLYtùy chọn
  • Sao lưu vi sai tùy chọn
  • Sao lưu 1 LOG với COPY_ONLYtùy chọn
  • khác (hoặc nhiều hơn) sao lưu LOG ​​nếu cần ...

Khôi phục DB thứ cấp

Sau đó, sao lưu cơ sở dữ liệu phải được khôi phục (+ vi sai) trên thứ cấp.

Nó phải được khôi phục với NORECOVERY tùy chọn vì bạn cũng muốn khôi phục (các) bản sao lưu LOG ​​sau khi FULL Backup được khôi phục.

Cuối cùng, bạn sẽ khôi phục lại Sao lưu LOG. Bạn vẫn cần sử dụng NORECOVERYtùy chọn vì gương sẽ tiếp tục khôi phục giao dịch một lần tại chỗ.

  • Khôi phục bản sao lưu FULL với NORECOVERYtùy chọn
  • Khôi phục bản sao lưu DIFF với NORECOVERYtùy chọn
  • Khôi phục tất cả các bản sao lưu LOG ​​theo thứ tự với NORECOVERYtùy chọn

Cho phép kết hợp tất cả lại với nhau (thích ứng với env của bạn)

  • Trên máy chủ chính chạy:

    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
  • Trên máy chủ thứ cấp chạy:

    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
  • Sau đó, bạn có thể tiến hành thêm DB thứ cấp mới vào nhóm khả dụng ...

Hành động tùy chọn

  • Tốt hơn là đặt tùy chọn DISK thành thư mục dùng chung có sẵn từ cả máy chủ Chính và Máy chủ phụ.
  • Cũng tốt hơn để lưu trữ các tệp DB trên đĩa và vị trí tương tự trên cả máy chủ Chính và Thứ cấp.
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.