• 场景:

我们导入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. 彻底删除oracle的方法

    环境:Windows 2000+ORACLE,其他环境类似 假设ORACLE安装路径为:D:\ORACLE ,其他路径操作类似 方法: 1.开始->设置->控制面板->管理工具-&g ...

  2. 网站压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: 引用 wget htt ...

  3. asp.net webform杂记

    context.Response.ContentType = "text/plain";            string encodeFileName = HttpUtilit ...

  4. Java多态与C++中多态的实现

    大牛的文章,值得拜读http://www.ibm.com/developerworks/cn/java/j-lo-polymorph/ 粘贴过来好多图片丢失了 /(ㄒoㄒ)/~~ 众所周知,多态是面向 ...

  5. MVC3下的layout页面

    1.Layout页基础:如果你有使用MasterPage的经验,你将会记得如下的几个东西 A:<%@ Master %> B:<%@ Page %> C:<asp:Con ...

  6. CC254x(cc2540/cc2541)的微信AirSync调试笔记

    一.前言 本尊自诩为IOT小能手,一直没涉足蓝牙实在说不过去.刚好上个月底的时候计划做个BLE设备,这阵子利用业余时间自学了BLE协议栈,了解了GATT,磕磕绊绊完成CC254x(cc2540/cc2 ...

  7. 转: svn合并分支到trunk

    http://sepcot.com/blog/2007/04/svn-merge-branch-trunk SVN: Merging a Branch into Trunk   This is mor ...

  8. Silverlight页面通过继承扩展实现

    在Silverlight中有些项目对UserControl重新做了封装基类,如PageBase,要求项目中每个页面都要从PageBase派生,但是过程比较坎坷,本文针对这个功能点的实现以及实现过程中遇 ...

  9. linux与linux,linux与windows之间用SSH传输文件

    linux与linux,linux与windows之间用SSH传输文件linux与linux之间传送文件:scp file username@hostIP:文件地址    例: scp abc.txt ...

  10. Magento多语言功能

    Magento多语言功能是建立在视图(view)基础之上的,可以通过后台创建店铺视图来创建基于Magento的多语言店铺.本文为大家讲解如何创建多语言的功能.首先,进入“管理店铺”节点,如下所示. S ...