Jos*_*sen 8 sql-server transaction-log
问题:我在 1 TB 驱动器上有一个 SQL Server 数据库。即使MAXSIZE
设置的比 5 MB 大得多,日志也不会超过 5 MB。
收到错误:
数据库 'Temp' 的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列
问题:
代码:
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%)
Run Code Online (Sandbox Code Playgroud)
结果select name, log_reuse_wait_desc from sys.databases where name = 'temp';
:
名称,log_reuse_wait_desc
温度,什么都没有
附加信息:
maxsize = 5mb
和restricted growth
Simple
更新的附加信息:
当 SQL 语句直接在 SQL 服务器管理器中运行时,它会成功创建并且不会导致实现错误......另一方面,如果创建数据库语句使用 System.Data.SqlClient 和它创建的完全相同的语法以编程方式运行具有所有默认值的数据库。我必须另外提供 alter database 语句以实现正确的行为。
运行查询的代码:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
要在短期内解决该问题,请手动增加日志文件,因为无论如何这是最佳实践。
如果日志文件最终会达到多个 GB,请以 1 - 4 GB 的增量增长以达到该目标。
如果您不知道它将有多大,我建议至少使用 1 GB 增量。这是一个阻塞操作,因此如果可能的话,应该在低使用时间内完成。
要了解问题发生的原因,请检查 SQL 错误日志中的错误,而不仅仅是失败语句中的错误消息。可能有错误说明其无法增长的原因。
您还可以查看活动监视器以查看有问题的会话正在等待什么。右键单击 SQL Server Management Studio (SSMS) 中的实例,然后单击“活动监视器”。打开后,查看阻塞链(阻塞者和头阻塞者)和等待类型,以了解导致问题的原因。
要确定为什么使用 MAXSIZE 70 创建数据库,请运行 Profiler 以捕获 CREATE DATABASE 语句。这将告诉您正在运行什么查询,以便您知道 SQL 是否获得了正确的查询。
归档时间: |
|
查看次数: |
3021 次 |
最近记录: |