Tôi có thể thu nhỏ tệp nhật ký giao dịch trên cơ sở dữ liệu nhân bản không?


9

Đây là câu hỏi tiếp theo cho câu hỏi trước đó về lý do tại sao tôi không thể thu nhỏ tệp nhật ký trên cơ sở dữ liệu chính.

Để làm cho một câu chuyện dài ngắn, tôi thiết lập phản chiếu cơ sở dữ liệu nhưng quên đảm bảo rằng công việc sao lưu nhật ký giao dịch đang chạy lại và nhật ký giao dịch đã tăng lên gần 60GB.

Kể từ khi nhân bản được thiết lập, việc tăng kích thước này được sao chép trên máy chủ được nhân đôi và cuối cùng chiếm hết dung lượng đĩa và làm cho cơ sở dữ liệu nhân bản không thể sử dụng được.

Mỗi câu hỏi này về bảo trì nhật ký giao dịch trên một cơ sở dữ liệu gương, bạn không thể sao lưu các bản ghi trên gương, nhưng khi được hỏi cụ thể trong bình luận về làm thế nào để thu nhỏ một tập tin log mọc trên một cơ sở dữ liệu gương, một bình luận còn lại mà

Một cách để làm điều này là chuyển sang cơ sở dữ liệu được nhân đôi và thu nhỏ ở đó. Kiểm tra kỹ lưỡng điều này trong một môi trường phi sản xuất để đảm bảo nó có hành vi bạn muốn / mong đợi.

Điều này dường như gợi ý rằng có thể có các cách khác để thu nhỏ tệp nhật ký trên máy nhân bản và phương pháp này có thể không nhất thiết phải an toàn để thực hiện trên máy chủ sản xuất.

Có cách nào để thu nhỏ an toàn tệp nhật ký giao dịch trên máy nhân bản cơ sở dữ liệu không?


2
Cách duy nhất được hỗ trợ là thu nhỏ tệp trên hiệu trưởng cũng sẽ thu nhỏ tệp trên gương. Nếu gương của bạn không còn giống với hiệu trưởng, bạn thực sự không muốn chuyển sang gương. Phá vỡ phản chiếu và tái tạo nó, như bạn đã nói trong câu hỏi trước của bạn.
Max Vernon

Câu trả lời:


6

Các DBCC SHRINKFILElệnh sẽ được nhân đôi từ hiệu trưởng đến cơ sở dữ liệu được nhân đôi. Đây là một số bằng chứng.

Tạo một cơ sở dữ liệu mẫu trên hiệu trưởng:

create database MirroredDb;
go

Tạo cùng một cơ sở dữ liệu từ bản sao lưu với NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Thiết lập phiên phản chiếu của bạn theo cách bạn chọn.

Trên cơ sở dữ liệu chính, hãy xem kích thước tệp cơ sở dữ liệu:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Tập kết quả của tôi trông như sau:

name            size
MirroredDb      392
MirroredDb_log  104

Trên cơ sở dữ liệu nhân bản , tạo ảnh chụp nhanh và xem cùng một thông tin:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Tập kết quả của tôi trông như sau:

name            size
MirroredDb      392
MirroredDb_log  104

Bây giờ hãy phát triển tệp nhật ký giao dịch trên cơ sở dữ liệu chính (tôi đã mang nó lên 1 GB):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Nhìn vào kích thước nhật ký giao dịch của cơ sở dữ liệu chính , bây giờ chúng ta thấy kích thước được điều chỉnh:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Tập kết quả của tôi trông như sau:

name            size
MirroredDb      392
MirroredDb_log  131072

Tạo một ảnh chụp nhanh khác trên cơ sở dữ liệu được nhân đôi và xem kích thước tệp nhật ký giao dịch ở đó:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Tập kết quả của tôi trông như sau:

name            size
MirroredDb      392
MirroredDb_log  131072

Bây giờ làm DBCC SHRINKFILEtrên hiệu trưởng :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Tập kết quả của tôi là như sau:

name            size
MirroredDb      392
MirroredDb_log  104

Tạo ảnh chụp nhanh thứ ba và cuối cùng trên cơ sở dữ liệu được nhân đôi và xem kích thước:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

Và tôi nhận được tập kết quả sau:

name            size
MirroredDb      392
MirroredDb_log  104

Vì vậy, như bạn có thể thấy ở đây, DBCC SHRINKFILElệnh trên thực tế được nhân đôi vào cơ sở dữ liệu nhân bản.


Cảm ơn bạn Tôi đã không nhận ra kích thước của tệp nhật ký cũng được sao chép từ máy chủ chính. Nhưng trong trường hợp gương không hoạt động do kích thước nhật ký giao dịch, giải pháp duy nhất để xóa và tạo lại gương? Không có cách nào để thu nhỏ nhật ký gương một cách an toàn khi quá trình phản chiếu không hoạt động?
Rachel

Bạn không thể kết nối với cơ sở dữ liệu được nhân đôi, do đó bạn không thể chạy DBCC SHRINKFILEtrên cơ sở dữ liệu đó . Đối với việc bạn có thể sửa phiên phản chiếu của mình mà không xóa phản chiếu trên cơ sở dữ liệu đó hay không, sẽ có thêm một cuộc điều tra sẽ diễn ra ở đó. Có vẻ như nó đã bị đình chỉ vì kích thước tập tin. Bạn đã thử nối lại đối tác?
Thomas Stringer

Có, nhưng nó ngay lập tức trở lại bị đình chỉ. Tôi cho rằng đó là vì đã mất quá nhiều thời gian kể từ khi quá trình phản chiếu dừng lại, vì vậy rất nhiều dữ liệu vẫn cần được chuyển trước khi đến phần "tệp nhật ký thu nhỏ". Tôi đã hy vọng có một số cách khác mà tôi không biết, chẳng hạn như thứ gì đó tôi có thể chạy từ cơ sở dữ liệu nhân bản để thu nhỏ tệp hoặc một số thao tác hệ thống tệp, nhưng dường như không phải vậy. Câu trả lời của bạn vẫn rất hữu ích, vì vậy cảm ơn bạn :)
Rachel

Hy vọng không còn nữa. Khi cơ sở dữ liệu bị treo / ngắt kết nối và một bản sao lưu nhật ký được thực thi trên chính, bạn sẽ gặp khá nhiều khó khăn khi lấy lại bản sao đồng bộ mà không cần khởi tạo lại.
Jason Cumberland
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.