Tệp nhật ký giao dịch SQL Server từ chối phát triển


7

Vấn đề: Tôi có cơ sở dữ liệu SQL Server trên ổ đĩa 1 TB. Nhật ký sẽ không tăng quá 5 MB ngay cả khi MAXSIZEđược đặt lớn hơn 5 MB.

Lỗi nhận được:

Nhật ký giao dịch cho cơ sở dữ liệu 'Temp' đã đầy. Để tìm hiểu lý do tại sao không gian trong nhật ký không thể được sử dụng lại, hãy xem cột log_Vuse_wait_desc trong sys.database

Câu hỏi:

  1. Làm thế nào để tôi sửa lỗi này?
  2. Tại sao chuyện này đang xảy ra?

Mã số:

CREATE DATABASE Temp ON PRIMARY(
       NAME = Temp
       , FILENAME = 'C:\\Temp.mdf'
       , SIZE = 2MB
       , FILEGROWTH = 10%) 
LOG ON (
       NAME = Temp_Log
       , FILENAME = 'C:\\Temp.ldf'
       , SIZE = 1MB, MAXSIZE = 70MB
       , FILEGROWTH = 10%)

Kết quả của select name, log_reuse_wait_desc from sys.databases where name = 'temp';:

tên, log_Vuse_wait_desc
Temp, KHÔNG

Thông tin thêm:

  1. Người quản lý máy chủ Sql nói maxsize = 5mbrestricted growth
  2. Chế độ phục hồi Simple
  3. Cơ sở dữ liệu đang xử lý hàng trăm Báo cáo SQL riêng lẻ vì nó là một công cụ tích hợp dữ liệu

Thông tin bổ sung được cập nhật:

Khi câu lệnh SQL được chạy trực tiếp trong trình quản lý máy chủ SQL, nó sẽ tạo thành công và không gây ra lỗi khi triển khai ... Mặt khác, nếu câu lệnh tạo cơ sở dữ liệu được chạy progmatically bằng System.Data.SqlClient và chính xác cú pháp mà nó tạo ra Cơ sở dữ liệu với tất cả các mặc định. Tôi phải cung cấp thêm các báo cáo cơ sở dữ liệu thay đổi để đạt được hành vi thích hợp.

Mã để chạy Truy vấn:

public void AcuConvert()
        {
            using (DestD)
            {
                SqlCommand command = new SqlCommand();
                DestD.Open();
                command.Connection = DestD;
                foreach (var item in Entity.SqlDestinationQueries.ToList())
                {
                    command.CommandText = item.Query;
                    command.ExecuteNonQuery();
                }
                foreach (var item in Entity.SystemQueries.ToList())
                {
                    command.CommandText = item.Query.Replace("@Sys", SysD.Database);
                    command.ExecuteNonQuery();
                }
                foreach (var item in Entity.InsertQueries.ToList())
                {
                    command.CommandText = item.Query.Replace("@Source", SourceD.Database); ;
                    command.ExecuteNonQuery();
                }

            }
        }

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


3

Để khắc phục sự cố trong thời gian ngắn, hãy tự tạo tệp nhật ký vì đó là cách tốt nhất.

Nếu tệp nhật ký sẽ kết thúc là nhiều GB, hãy tăng theo 1 - 4 GB để đạt được điều đó.

Nếu bạn không biết nó sẽ lớn đến mức nào, tôi sẽ khuyên bạn nên sử dụng ít nhất 1 GB. Đây là một hoạt động chặn vì vậy nó nên được thực hiện trong thời gian sử dụng thấp nếu có thể.

Để khám phá lý do tại sao sự cố của bạn xảy ra, hãy kiểm tra lỗi trong nhật ký lỗi SQL, không chỉ thông báo lỗi từ câu lệnh thất bại. Có thể có một lỗi nêu rõ tại sao nó không thể phát triển.

Bạn cũng có thể nhìn vào màn hình hoạt động để xem các phiên đang gặp vấn đề gì đang chờ đợi. Nhấp chuột phải vào ví dụ trong SQL Server Management Studio (SSMS) và nhấp vào "Trình giám sát hoạt động". Khi bạn mở nó, hãy nhìn vào chuỗi chặn (Blocked By và Head Blocker) và Loại chờ để xem điều gì gây ra sự cố.

Để xác định lý do tại sao DB được tạo với MAXSIZE của 70 chạy Profiler để bắt câu lệnh CREATE DATABASE. Điều đó sẽ cho bạn biết truy vấn nào đang được chạy để bạn biết liệu SQL có nhận được truy vấn chính xác hay không.

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.