• 场景:

我们导入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

  1. 查询出当前当前Global_MaxM1OID中MaxOID的值,存储为@MaxOID;
  2. Set @MaxOID=@MaxOID+@TempCount;
  3. 修改Global_MaxM1OID中的MaxOID值

Commit

但这里是出现问题的:

  1. 查询出当前当前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跟踪的方案;

  1. 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

当前日志记录时间

  1. 在web.config中添加了配置

<AppSettings>

<!—当配置项为true:时,开启日志;false时,关闭日志 -à

<add Key=”IsLogger” Value=”true|false”>

</AppSettings>

  1. 在BulkCopy中添加以下语句块:

把解析入库的TempM1,TempM2,TempM3不从临时表中删除,以便我们能监控到我们解析了多少数据,我们写入到M1,M2,M3分别有多少记录,从而达到跟踪的效果;

同时还记录了每次线程进入占用的MaxOID值,从而也可以调试到每个线程占用MaxOID的情况.

Sql清理日志文件的更多相关文章

  1. SQL Server日志文件过大 大日志文件清理方法 不分离数据库

    SQL Server日志文件过大    大日志文件清理方法 ,网上提供了很多分离数据库——〉删除日志文件-〉附加数据库 的方法,此方法风险太大,过程也比较久,有时候也会出现分离不成功的现象.下面的方式 ...

  2. 记录SQL Server2008日志文件损坏的恢复过程

    记录SQL Server2008日志文件损坏的恢复过程: 环境: 系 统:Windows Server2003 数据库:SQL Server2008 故障原因: 通过mstsc链接同一服务器时,用户界 ...

  3. 收缩SQL数据库日志文件

    收缩SQL数据库日志文件 介绍具体的操作方法前,先说下我操作的实际环境和当时的状况.我的服务器是windows server 2008 R2 64位英文版,数据库是SQL server 2008英文版 ...

  4. SQL Server日志文件庞大收缩方法(实测好用)

    原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...

  5. oracle导入命令,记录一下 数据库日志太大,清理日志文件

    oracle导入命令,记录一下 工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\wo ...

  6. 误删SQL Server日志文件后怎样附加数据库

    SQL Server日志文件因为误操作被删除,当附加数据库的时候提示:附加数据库失败. 解决办法如下: 1.新建一个同名数据库. 2.停止数据库服务,覆盖新建的数据库主文件(小技巧:最好放在同一个磁盘 ...

  7. ros清理日志文件

    检查日志文件: rosclean  check 清理日志文件: rosclean purge

  8. 【转】SQL Server日志文件过大 大日志文件清理方法 不分离数据库

    https://blog.csdn.net/slimboy123/article/details/54575592 还未测试 USE[master] GO ALTER DATABASE 要清理的数据库 ...

  9. 网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的

    最近发现公司上线的八爪鱼招标网有部分功能出现问题,主要表现为无法向数据库插入数据:远程登陆到数据库服务器时,发现原本的40G空间都被数据库吃完了,于是打开MS SQL Server 2008对数据库进 ...

随机推荐

  1. 常用的API接口,返回JSON格式的服务API接口

    物流接口 快递接口: http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号 ps:快递公司编码:申通="shentong&qu ...

  2. FileResult,JavaScriptResult,JsonResult

    FileResult:可以响应任意文档的属性,包括二进制格式的数据,eg:图档,pdf,excel,zip,可以传入byte[],文档路径,Stream等不同的属性,让mvc将属性回传给客户端,除此之 ...

  3. JQuery..bind命名空间

    先看手册,由于bind方法有三个参数(type,[data],fn),所以手册上这么介绍: .bind() 方法是用于往文档上附加行为的主要方式.所有JavaScript事件对象, 比如focus, ...

  4. 更强大的trim功能,过滤汉字等

    第一种方法:通过php自带的函数 <?php /* trim 去除一个字符串两端空格, rtrim 是去除一个字符串右部空格, ltrim 是去除一个字符串左部空格. */ ?> < ...

  5. 【转】用树莓派搭建web服务器

    本文将详细介绍如何在树莓派上配置服务器,和<教你在Xubuntu上搭建LAMP服务器>有些类似,多了一些介绍在树莓派上的不同步骤的地方. 这种服务器的配置被称为LAMP,是最流行的服务器配 ...

  6. ASP.NET MVC 4下 Code First 数据库迁移

     一.命令开启 1.打开控制台:视图->其他窗口->程序包管理器控制台: 2.启动数据库迁移,执行命令:enable-migrations 创建成功后会新增migrations目录等. 若 ...

  7. NSURLConnection同步与异步请求 问题

    NSURLConnection目前有两个异步请求方法,异步请求中其中一个是代理.一个同步方法.有前辈已经详细介绍,见:http://blog.csdn.net/xyz_lmn/article/deta ...

  8. 图解SSL/TLS协议

    本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...

  9. 怎么清除file控件的文件路径

    还记得上次做一个文件上传,后来测试告诉我说,如果我要是不选择文件了呢?该怎么办?我说:简单啊,做一个取消按钮不就完事了吗!然后我就想一个file空间做一个取消是多么简单的事,用js处理可是想怎么样就怎 ...

  10. ios UIPickerView 技巧集锦(包括循环滚动)

    摘自: http://blog.csdn.net/ipromiseu/article/details/7436521 http://www.cnblogs.com/dabaopku/archive/2 ...