Журнал транзакций заполнен (из-за НИЧЕГО) ... но эта база данных находится в простом режиме восстановления - PullRequest
0 голосов
/ 22 июня 2019

Я поддерживаю антеделювианское веб-приложение (которое скоро будет удалено), которое все еще использует "aspnetdb" для своей системы аутентификации.Я работал над подготовкой к его удалению из моей тестовой среды, когда обнаружил, что мой тестовый сервер жалуется на следующую ошибку:

Журнал транзакций для базы данных «aspnetdb» заполнен из-за «НИЧЕГО»'.

Теперь, как правило, я предполагаю, что проблема возникла из журнала транзакций базы данных ... но эта база данных недавно была переведена в простой режим восстановления (наш администратор устал от нас, жалующихся на то, что тест-SQL-серверу не хватило места, и она переключила его на простое восстановление).

Я попытался провести несколько экспериментов, но безуспешно, и немного погуглил.Кто-нибудь видел эту ошибку раньше?Полный журнал транзакций в базе данных в простом режиме восстановления?

Он на SQL Server 2016, работает в режиме совместимости с 2008, потому что aspnetdb устарел.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Понял, помощь получена от stackexchange.

https://dba.stackexchange.com/questions/241172/transaction-log-is-full-due-to-nothing-but-this-database-is-in-simple-recov?noredirect=1#comment475763_241172

Autogrowth был установлен на 0. К сожалению, нет способа см. это в SSMS, потому что оно скрывает такие настройки для простых в режиме восстановления БД.

Запрос, чтобы увидеть реальную ценность Autogrowth, благодаря @HandyD:

SELECT 
    db.name AS [Database],
    mf.name AS [File],
    CASE mf.[type_desc]
        WHEN 'ROWS' THEN 'Data File'
        WHEN 'LOG' THEN 'Log File'
    END AS [FileType],
    CAST(mf.[size] AS BIGINT)*8/1024 AS [SizeMB],
    CASE
        WHEN mf.[max_size] = -1 THEN 'Unlimited'
        WHEN mf.[max_size] = 268435456 THEN 'Unlimited'
        ELSE CAST(mf.[max_size]*8/1024 AS NVARCHAR(25)) + ' MB'
    END AS [MaxSize],
    CASE [is_percent_growth]
        WHEN 0 THEN CONVERT(VARCHAR(6), CAST(mf.growth*8/1024 AS BIGINT)) + ' MB'
        WHEN 1 THEN CONVERT(VARCHAR(6), CAST(mf.growth AS BIGINT)) + '%'
    END AS [GrowthIncrement]
FROM sys.databases db
LEFT JOIN sys.master_files mf ON mf.database_id = db.database_id
where mf.name like 'aspnetdb%'

Другая проблема заключается в том, что в этом состоянии вы не можете изменить автостраст . Но вы можете изменить размер. Таким образом, увеличив размер и , а затем , добавив авторост, вы можете решить эту проблему.

ALTER DATABASE aspnetdb MODIFY FILE (
    NAME = aspnetdb_log
    , SIZE = 1GB
) --this fixes the problem
GO
ALTER DATABASE aspnetdb MODIFY FILE (
    NAME = aspnetdb_log
    , SIZE = 1025MB
    , MAXSIZE = UNLIMITED
    , FILEGROWTH = 10MB
) -- now we have autogrowth
GO
USE aspnetdb
DBCC SHRINKFILE(aspnetdb_log,1) --now we can shrink the DB back to a sane minimum since autogrowth is in place
GO
2 голосов
/ 22 июня 2019

Даже в простом режиме восстановления вы все равно можете получить полный журнал транзакций. Простой режим восстановления просто означает, что журнал транзакций усекается после каждой завершенной транзакции.

В журнале транзакций по-прежнему требуется место для размещения всех активных транзакций и всех транзакций, для которых выполняется откат.

Так что одной из вероятных причин является то, что у вас все еще есть открытая транзакция в вашей базе данных. Если это произойдет, журнал транзакций не будет усечен.

Другой угол - это фактическая доступность пространства. Если вы настроили в файле журнала максимальный размер файла или когда у вас заканчивается свободное место на диске, вы можете столкнуться с этим.

...