Sql清理日志文件
场景:
我们导入MR数据时发现磁盘空间不够用了,导致的结果就是我们的程序很可能会抛出异常了,我们需要导入数据的时候进行日志瘦身。
问1:导入数据的时候,瘦身是否会造成数据库的异常?
DBA提供解决方案:
回答问1:
没有问题。不会产生冲突。不过要给日子预留空间,防止被填满。
1. 确认M_Develop 的恢复模式是否为简单simple。
查看脚本如下。
select recovery_model_desc,name
from sys.databases
where name='M_Develop'
2. 如果不是simple。请改为simple
修改脚本如下:
USE [master]
GO
ALTER DATABASE [M_Develop] SET RECOVERY SIMPLE WITH NO_WAIT
GO。
3.恢复模式为simple之后。确认日志大小,和占用百分比:脚本如下:
dbcc sqlperf(logspace)
4.如果数据库是simple之后,log space used(%) 日志占比应该比较小。
5.收缩日志文件大小
use M_Develop
go
--找到库的日志文件名称
select name
from sys.database_files
where type_desc='log'
--缩小日志,假设上述查询结果日志名为M_Develop_log,收缩至10G,那么脚本如下
dbcc shrinkfile (M_Develop_log,10240)
--再次检查日志量大小
dbcc sqlperf(logspace)
(备注:其中将数据库模式改为simple是为了性能考虑。如果不更改,那么需要备份日志,backup log。不推荐)
解决多线程改写问题
当我们改为多线程之后,之前DBA给提出使用单独的表来站位对应的MR表的OID,防止多线程在执行BulkCopy相关存储过程中出现抢占同一个OID,导致出现异常:
存储过程 |
操作源数据 |
使用的站位表 |
BulkCopyTempM1ToM1_0 |
ImportTemp_M1_01 M1及其相关子表 M1_M2及其相关子表 |
Global_MaxM1OID Global_MaxM1_M2OID |
BulkCopyTempM2ToM2_0 |
ImportTemp_M2_01 M1及其相关子表 M1_M2及其相关子表 |
Global_MaxM2OID Global_MaxM1_M2OID |
BulkCopyTempM3ToM3_0 |
ImportTemp_M3_01 M3_RIP及M3_RIP_PDF |
Global_MaxM3OID |
之前避免出现占用同一个OID的方案为:
以M1为例:
Begin Transaction
- 查询出当前当前Global_MaxM1OID中MaxOID的值,存储为@MaxOID;
- Set @MaxOID=@MaxOID+@TempCount;
- 修改Global_MaxM1OID中的MaxOID值
Commit
但这里是出现问题的:
- 查询出当前当前Global_MaxM1OID中MaxOID的值,存储为@MaxOID;
该语句出现在Begin Transaction的第一行就不能保证会锁定表Global_MaxOID;
修改方案:
添加新列:Flag int到表Global_MaxM1OID中,
事务语句块改写为:
Set XACT_ABORT ON;
Begin Transaction
----- 确保一进入事务语句块就锁表(TN.Global_MaxM1OID,TN.Global_MaxM1_M2OID),防止其他存储过程实例再次操作这些表,直到该语句块结束为止
Update TN.Global_MaxM1OID Set Flag=1 Where OID=1;
Update TN.Global_MaxM1_M2OID Set Flag=1 Where OID=1;
Select @MAXM1OID =MaxOID From TN.Global_MaxM1OID Where oid=1;
Select @MAXM1_M2OID =MaxOID From TN.Global_MaxM1_M2OID Where oid=1;
Update TN.Global_MaxM1OID SET MaxOID=(@MaxM1OID+@TempCount), Flag=0 where oid=1;
Update TN.Global_MaxM1_M2OID SET MaxOID=(@MaxM1_M2OID+@TempCount), Flag=0 where oid=1;
Commit Transaction;
数据不一致调试跟踪方案:
当我们导入数据时发现数据导入的数据量很小很显然是导入的数据很多没有入库,DBA采用日志表TN.Logger跟踪的方案;
- TN.Logger表中字段的意义:
Logger字段 |
字段值意义 |
OID |
编号,自增列,非主键 |
ENodeBID |
当前操作的基站编号ENODEBID |
ProcedureName |
当前记录写在哪一个存储过程中 |
EntryM3OID |
该存储过程占位之前Global_MaxM3OID值 |
ExportM3OID |
该存储过程占位之后Global_MaxM3OID值 |
EntryM1OID |
该存储过程占位之前Global_MaxM1OID值 |
ExportM1OID |
该存储过程占位之后Global_MaxM1OID值 |
EntryM2OID |
该存储过程占位之前Global_MaxM2OID值 |
ExportM2OID |
该存储过程占位之后Global_MaxM2OID值 |
EntryM1_M2OID |
该存储过程占位之前Global_MaxM1_M2OID值 |
ExportM1_M2OID |
该存储过程占位之后Global_MaxM1_M2OID值 |
ReportTime |
该基站MR上报时间 |
CurrentRowCount |
当前临时表操作数据记录数量 |
OperateDateTime |
当前日志记录时间 |
- 在web.config中添加了配置
<AppSettings>
<!—当配置项为true:时,开启日志;false时,关闭日志 -à
<add Key=”IsLogger” Value=”true|false”>
</AppSettings>
- 在BulkCopy中添加以下语句块:
把解析入库的TempM1,TempM2,TempM3不从临时表中删除,以便我们能监控到我们解析了多少数据,我们写入到M1,M2,M3分别有多少记录,从而达到跟踪的效果;
同时还记录了每次线程进入占用的MaxOID值,从而也可以调试到每个线程占用MaxOID的情况.
Sql清理日志文件的更多相关文章
- SQL Server日志文件过大 大日志文件清理方法 不分离数据库
SQL Server日志文件过大 大日志文件清理方法 ,网上提供了很多分离数据库——〉删除日志文件-〉附加数据库 的方法,此方法风险太大,过程也比较久,有时候也会出现分离不成功的现象.下面的方式 ...
- 记录SQL Server2008日志文件损坏的恢复过程
记录SQL Server2008日志文件损坏的恢复过程: 环境: 系 统:Windows Server2003 数据库:SQL Server2008 故障原因: 通过mstsc链接同一服务器时,用户界 ...
- 收缩SQL数据库日志文件
收缩SQL数据库日志文件 介绍具体的操作方法前,先说下我操作的实际环境和当时的状况.我的服务器是windows server 2008 R2 64位英文版,数据库是SQL server 2008英文版 ...
- SQL Server日志文件庞大收缩方法(实测好用)
原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...
- oracle导入命令,记录一下 数据库日志太大,清理日志文件
oracle导入命令,记录一下 工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\wo ...
- 误删SQL Server日志文件后怎样附加数据库
SQL Server日志文件因为误操作被删除,当附加数据库的时候提示:附加数据库失败. 解决办法如下: 1.新建一个同名数据库. 2.停止数据库服务,覆盖新建的数据库主文件(小技巧:最好放在同一个磁盘 ...
- ros清理日志文件
检查日志文件: rosclean check 清理日志文件: rosclean purge
- 【转】SQL Server日志文件过大 大日志文件清理方法 不分离数据库
https://blog.csdn.net/slimboy123/article/details/54575592 还未测试 USE[master] GO ALTER DATABASE 要清理的数据库 ...
- 网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的
最近发现公司上线的八爪鱼招标网有部分功能出现问题,主要表现为无法向数据库插入数据:远程登陆到数据库服务器时,发现原本的40G空间都被数据库吃完了,于是打开MS SQL Server 2008对数据库进 ...
随机推荐
- mysql读写分离(PHP类)
mysql读写分离(PHP类) 博客分类: php mysql 自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...
- 如何开发ecshop支付插件
如何开发ecshop支付插件 ecshop模板网 / 2014-06-03 目标一:搞懂ecshop的支付流程 选完商品,进入购物车页面,点击“结算中心”,页面跳转到flow.php?step=che ...
- Rails--export csv
--controller def export_agent_impressions export_start_time = Time.parse(params[:es_time]) + 7.hours ...
- PHP 中获取当前时间[Datetime Now]
在 PHP 中可以通过date()获取当前时间,在>5.2的版本中最好还是用 datetime 类型 date() <?php echo date('Y-m-d H:i:s'); ?> ...
- Euler's totient function
https://en.wikipedia.org/wiki/Euler's_totient_function counts the positive integers up to a given in ...
- php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;
Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...
- PDO知识
PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz;host=localhost&quo ...
- Hue协作框架
http://archive.cloudera.com/cdh5/cdh/5/hue-3.7.0-cdh5.3.6/manual.html 一:框架 1.支持的框架 ->job ->yar ...
- 【Java 基础篇】【第二课】基本数组类型
就像第一章所说一样,这次学习为了快,因此说明性的文字就不想写太多了,直接帖代码吧,代码当中尽量加一些注释: package a.b; public class test { static void B ...
- Protocol and Delegate
为什么使用委托? 答:比如,我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户 (1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所 ...