sql server数据库日志满了怎么处理

好吧,我告诉你我当时遇到的风险,这与整个SQL Server日志问题有关。

那是几年前的事了。
2 01 8 年左右,我在上海做一个项目。
当时服务器就报警了,日志快满了。
我急得满头大汗。

首先,我尝试使用 DBCCSHRINKFILE 命令。
要获取日志文件的名称,请键入行 DBCCSHRINKFILE(N'LogFileName', 0)。
当时我想把它缩小到最小,节省一些空间。
结果呢?收缩率小了一点,但性能似乎较差。
服务器还是卡住了,客户端也不满意。
这给了我一个教训,我不能一直使用这个,它很容易让我失望。

然后我再次尝试了 BACKUPLOG 命令。
先备份日志,BACKUPLOG MyDatabaseName TO DISK = 'C:\log_backup.bak'。
备份完成后,日志空间立即释放,日志被截断。
这个方法很好,效果也很好。
但请记住,这取决于恢复模式。
简单恢复模式是自动的,而复杂模式则需要手动备份。

后来客户端数据量太大,就想到增大日志文件的大小。
只需使用 ALTER DATABASE MyDatabaseName MODIFY FILE (NAME = 'LogFileName', size = 5 00MB)。
将 5 00MB 更改为更大的值,例如 1 GB。
这样,短期内就不会害怕吃饱了。

另一种方法是启用自动增长。
我将它们设置为 ALTER DATABASE MyDatabaseName MODIFY FILE (NAME = 'LogFileName', FILEGROWTH = 1 0%)。
这样,注册表满时会自动扩展1 0%,无需一直手动更改。
但要注意,成长速度不能提高太多,否则会一下子爆炸。

更干燥的是简单地更换更大的硬盘来存储日志。
在命令行中键入 ALTER DATABASE MyDatabaseName MODIFY FILE (NAME = 'LogFileName', FILENAME = 'D:\NewPath\LogFileName.ldf')。
必须提前设置新路径,并且 SQL Server 服务帐户必须具有该路径的写入权限。
我的一位朋友没有注意权限。
结果日志文件移到那里之后就无法写入了,这让我很担心。

从长远来看,应该定期备份日志。
在这个项目中,我设置了一个计划任务,每天备份一次日志。
备份日志 MyDatabaseName TO DISK = 'C:\log_backup.trn'。
这样,即使历史记录已满,也可以从备份中恢复。
但是,这取决于恢复模式。
完毕简单模式自动截断,复杂模式需要备份。

有时候,你必须从根本上解决问题。
例如,如果数据库活动非常密集,我会要求开发人员暂时不要大批量插入数据,而是要慢慢来。
或者优化事务,不要搞这么复杂的事务,减少日志生成。

最后,我还监视日志大小。
每天看一下 SELECT name, size/1 2 8 .0 AS [Size_MB], FILEPROPERTY(name, 'SpaceUsed')/1 2 8 .0 AS [Used_MB] FROM sys.database_files WHERE type = 1 这样就可以提前知道记录快满了,快速处理。

总之,处理完整的SQL Server日志问题应该根据实际情况而定。
不要总是使用 DBCCSHRINKFILE,因为这可能会导致问题。
它必须与自动增长和定期备份相结合,并且必须进行监控以尽早发现问题。
所有这些技巧都是我从陷阱中学到的。
我希望他们能帮助你。

如何用Django ORM实现多文件SQL日志记录?

上周我研究了这个 Django 多文件 SQL 日志问题。
列出了三个选项。

选项 1 :自定义 CursorWrapper 类 原理是控制django.db.backends.utils.CursorWrapper的实现。
实施步骤: 1 .创建继承CursorWrapper的自定义游标类 2 .根据判决书中的申请名称读取伤害过程 3 .替换出厂默认游标(配置DATABASE_OPTIONS)
示例代码: 蟒蛇 类 AppAwareCursorWrapper(CursorWrapper); def 执行(self, sql, params=None); 应用程序名称 = get_current_app_name() logger =logging.getLogger(f'sql.{app_name}') logger.debug(f"SQL:{sql},Params:{params}")
选项2 : 原理是在执行前将模式的视图或方法进行包装并绑定刀具。
实施步骤: 1 .通过应用名称参数定义接收的主机 2 .设置logger对应的打包函数 3 .使用关于装饰器的语句或方法
示例代码: 蟒蛇 def log_sql_to_file(应用程序名称): def 装饰器(view_func); @functools.wraps(view_func) defwrapp_view(args, kwargs); logger =logging.getLogger(f'sql.{app_name}') sql_to_log = get_sql_from_orm_operation() logger.debug(sql_to_log) 返回 view_func (args, kwargs) 将返回wrapped_view 返回装饰器
选项 3 :自定义日志处理 日志记录的原理是拥有.Handler并控制发出的方法。
实施步骤: 1 . 编写自定义处理程序以根据应用程序名称分发所有内容 2 .使用settings.py中的自定义流程配置日志系统 3 .确保SQL日志包含应用程序名称数据示例代码: 蟒蛇 类 AppFilterHandler(logging.Handler); def __init__(自我); 超级().__init__() self.handlers = { 'app1 ':logging.FileHandler('app1 _sql.log'); 'app2 ':logging.FileHandler('app2 _sql.log'); } 对于 self.handlers.values() 中的处理程序: handler.setLevel(logging.DEBUG)
建议选择:
在小项目中使用日志处理非常简单
用于结束控制的CursorWrapper
仅在句子的一部分使用修饰
注释:
作为 I/O 附件执行
配置旋转伤害
确保可以获取应用程序的名称
我的朋友忘记将工厂光标替换为选项1 ,最终使用了默认...算了,你可以看到它。

如何向数据库中添加数据或日志文件

说白了,在添加或删除文件时,必须尊重BACKUP过程的限制。
其实很简单。
首先,数据库最多支持 3 2 ,7 6 7 个文件和 3 2 ,7 6 7 个文件组。
关于安全权限,您必须具有 ALTER 权限才能工作。

我一开始以为文件和文件组是随机重合的,但后来我发现这是错误的。
数据文件必须放置在文件组中,事务日志除外。
我们去年做的项目数据量在3 000左右,所以我们在数据库属性对话框的文件页面添加了数据文件。

还有一个细节非常重要,那就是指定文件的大小和增长方式。
根据你数据库的最大数据量,尽量使数据文件尽可能大。
对于自动增长,您可以选择按 MB 或按文件大小的百分比来增长文件。
请记住设置最大文件大小限制,以防止文件无限增长。

等等,还有一件事:如果您不希望文件增长,请取消选中“启用自动增长”复选框。
但是,文件大小不会超过“初始大小 (MB)”列中指定的值。
我认为值得一试。
最后,合理规划文件大小和增长方式对于数据库性能非常重要。