分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

原文:分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

今天开发找我,说数据库insert不进数据,叫我看一下

他发了一个截图给我

然后我登录上服务器,发现了可疑的地方,而且这个数据库之前有一段经历

在月初的时候这个数据库曾经置疑过,启动不起来

Could not redo log record (163041:116859:5), for transaction ID (0:-1175226963), on page (17:20633999), database 'xxrchives' (database ID 7). Page: LSN = (162930:20671:38), type = 2. Log: OpCode = 2, context 3, PrevPageLSN: (163041:116230:18). Restore from a backup of the database, or repair the database.

During redoing of a logged operation in database 'xxxrchives', an error occurred at log record ID (163041:116859:5). Typically, the specific failure is previously logged as an error in the Windows Event Log service. Restore the database from a full backup, or repair the database.

An error occurred during recovery, preventing the database 'xxxrchives' (database ID 7) from restarting. Diagnose the recovery errors and fix them, or restore from a known good backup. If errors are not corrected or expected, contact Technical Support.

Setting database option EMERGENCY to ON for database xxxchives.

The database 'xxxxchives' is marked EMERGENCY_MODE and is in a state that does not allow recovery to be run.

由于一些特殊的原因没有做备份,数据库大小差不多3TB,这里3TB是已经除去可用空间的了,里面只有几张表,其中只有一张大表

修复语句如下

USE MASTER
GO
ALTER DATABASE [xxxrchives] SET EMERGENCY
GO
ALTER DATABASE [xxxxchives] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CHECKDB('xxxxchives','REPAIR_ALLOW_DATA_LOSS') with tablock
GO
ALTER DATABASE [xxxxchives] SET ONLINE
GO
ALTER DATABASE [xxxxchives] SET MULTI_USER
GO

数据相对来说不是非常重要,允许丢失一些数据

结果运行了差不多7天,业务也一度中断了

其实有数据库完整备份的话可以使用页面还原的方法还原有问题的页面,加上日志备份,而不用这么大工程的。。。

 

有经验的SQLSERVER管理员应该知道最后我使用的方法如何抛弃有824错误的页面,只保留正常的数据页面,这个大表是做了表分区的,由于篇幅关系这里不具体说了

消息 824,级别 24,状态 2,第 3 行
SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 6:33780000,但实际为 0:0)。在文件 'E:\DataBase\FG_xxxxive\FG_xxxxhive_Id_04_data.ndf' 中、偏移量为 0x0000406e240000 的位置对数据库 ID 7 中的页 (6:33780000) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

 



问题所在

这个数据库运行在SQL2008上面,一直都是简单模式,那么问题来了,由于当时checkdb的时间很长,积累了大量事务日志

但是,按道理处于简单模式会自动截断日志的,但是当时本人也没有看,心里只想着数据库马上online

 

步骤一:今天开发找我插不进去数据也是因为这个,我运行了下面语句,这个语句是我找问题的时候一般都先用这个语句,因为在徐海蔚老师的书里面也建议先使用这个语句

SELECT * FROM sys.[sysprocesses] 

结果发现

相当多的log等待

 

步骤二:我再运行下面脚本

-- =============================================
-- Author:      <桦仔>
-- Blog:        <http://www.cnblogs.com/lyhabc/>
-- Create date: <2014/4/18>
-- Description: <统计各个数据库的总大小V2 不包含数据文件>
-- =============================================
SET NOCOUNT ON
USE master
GO

DECLARE @DBNAME NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)

--临时表保存数据
CREATE TABLE #DataBaseServerData
(
  ID INT IDENTITY(1, 1) ,
  DBNAME NVARCHAR(MAX) ,
  Log_Total_MB DECIMAL(18, 1) NOT NULL ,
  Log_FREE_SPACE_MB DECIMAL(18, 1) NOT NULL
)

--游标
DECLARE @itemCur CURSOR
SET
@itemCur = CURSOR FOR
SELECT name from   SYS.[sysdatabases] WHERE [name] NOT IN ('MASTER','MODEL','TEMPDB','MSDB','ReportServer','ReportServerTempDB')

OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @DBNAME
WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @SQL=N'USE ['+@DBNAME+'];'+CHAR(10)
    +
    'INSERT  [#DataBaseServerData]
                ( [DBNAME] ,
                  [Log_Total_MB] ,
          [Log_FREE_SPACE_MB ]
                )
                SELECT '''+@DBNAME+''', str(sum(convert(dec(17,2),sysfiles.size)) / 128,10,2) AS Total_MB,
                SUM(( database_files.size - FILEPROPERTY(database_files.name, ''SpaceUsed'') )) / 128.0 AS free_space_mb
                FROM    dbo.sysfiles as sysfiles INNER JOIN sys.database_files as database_files ON sysfiles.[fileid]=database_files.[file_id] WHERE sysfiles.[groupid]  =0
                AND database_files.[type] = 1;'
        EXEC (@SQL)
        FETCH NEXT FROM @itemCur INTO @DBNAME
    END 

CLOSE @itemCur
DEALLOCATE @itemCur

SELECT  *  FROM    [#DataBaseServerData]
DROP TABLE [#DataBaseServerData]

结果发现

上百G的日志文件

 

 

步骤三:我使用数据分析脚本也发现表里面的数据没有增加,按F5刷新了很多次

--数据分析

CREATE TABLE #tablespaceinfo
    (
      nameinfo VARCHAR(50) ,
      rowsinfo BIGINT ,
      reserved VARCHAR(20) ,
      datainfo VARCHAR(20) ,
      index_size VARCHAR(20) ,
      unused VARCHAR(20)
    )  

DECLARE @tablename VARCHAR(255);  

DECLARE Info_cursor CURSOR
FOR
    SELECT  '[' + [name] + ']'
    FROM    sys.tables
    WHERE   type = 'U';  

OPEN Info_cursor
FETCH NEXT FROM Info_cursor INTO @tablename  

WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT  INTO #tablespaceinfo
                EXEC sp_spaceused @tablename
        FETCH NEXT FROM Info_cursor
    INTO @tablename
    END 

CLOSE Info_cursor
DEALLOCATE Info_cursor  

--创建临时表
CREATE TABLE [#tmptb]
    (
      TableName VARCHAR(50) ,
      DataInfo BIGINT ,
      RowsInfo BIGINT ,
      Spaceperrow  AS ( CASE RowsInfo
                         WHEN 0 THEN 0
                         ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))
                       END ) PERSISTED
    )

--插入数据到临时表
INSERT  INTO [#tmptb]
        ( [TableName] ,
          [DataInfo] ,
          [RowsInfo]
        )
        SELECT  [nameinfo] ,
                CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,
                [rowsinfo]
        FROM    #tablespaceinfo
        ORDER BY CAST(REPLACE(reserved, 'KB', '') AS BIGINT) DESC  

--汇总记录
SELECT  [tbspinfo].* ,
        [tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'
FROM    [#tablespaceinfo] AS tbspinfo ,
        [#tmptb] AS tmptb
WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]
ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS BIGINT) DESC  

DROP TABLE [#tablespaceinfo]
DROP TABLE [#tmptb]

View Code

 

 

步骤四:下面检查 VLF

DBCC LOGINFO

View Code

有400多个VLF

 

 

步骤五:检查一下log为什么不能重用的原因

SELECT  DB_NAME([database_id]) AS dbname ,
        [log_reuse_wait] ,
        [log_reuse_wait_desc]
FROM    sys.[databases]

结果发现 数据库做了复制,我接手的时候这个数据库是不需要复制的,可能是以前的同事弄的

 

步骤六:我使用博客园里面i6first大牛的文章把复制干掉《你还可以再诡异点吗——SQL日志文件不断增长

EXEC sp_removedbreplication [xxxchives]

 

步骤七:然后再来收缩日志

USE [xxxxchives]
GO
DBCC SHRINKFILE (N'xxxxxchives_log' , 5000)
GO

 

弄完之后,数据库正常了,没有log等待,数据也在不断增加



总结

简单几个步骤:从发现问题到解决问题,有些人可能半天才能解决,有些人几分钟就可以解决,这就是积累经验的重要性

我自己的做法是多看书,多看博客园,在QQ群里看一下大家的问题,这就是经验了,快速解决问题的经验

 

本人也喜欢将工作中遇到的问题写在博客里面,以供大家参考,大家一起进步o(∩_∩)o 

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

时间: 2024-09-01 00:00:23

分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据的相关文章

新手工作,如何正确的积累经验、如何更快的提升能力、过程是什么样的?

正确的积累经验: 在实际工作中,要学习好的习惯,虽然你现在并不赞同,但是你要学习,并一直保持下去,因为人之所以有文明就是因为不断的学习和积累好的东西. 不要盲目赞同别人,要先思考,要有自己的立场. 不要高看自己,要虚心,要谦虚,要多听别人说,多学习别人的优秀的地方. 更快的提升能力: 不走弯路,就是最好的捷径. 过程: 人的提升不是直线上升的,也不是一直弧线上升的,而是像正弦波一样有高有低,慢慢提升.

分享两个月的建站经验 一切都太顺利了

因特网起源于美国国防部高级研究计划管理局建立的阿帕网.网站(http://www.aliyun.com/zixun/aggregation/8048.html">Website)是指在因特网上,根据一定的规则,使用HTML等工具制作的用于展示特定内容的相关网页的集合.简单地说,网站是一种通讯工具,就像布告栏一样,人们可以通过网站来发布自己想要公开的资讯,或者利用网站来提供相关的网络服务.人们可以通过网页浏览器来访问网站,获取自己需要的资讯或者享受网络服务. 许多公司都拥有自己的网站,他们利

跟老男孩学Linux运维:Shell编程实战2.3 Shell脚本在Linux运维工作中的地位

2.3 Shell脚本在Linux运维工作中的地位 Shell脚本语言很适合用于处理纯文本类型的数据,而Linux系统中几乎所有的配置文件.日志文件(如NFS.Rsync.Httpd.Nginx.LVS.MySQL等),以及绝大多数的启动文件都是纯文本类型的文件.因此,学好Shell脚本语言,就可以利用它在Linux系统中发挥巨大的作用. 图2-2形象地展示了Shell脚本在运维工作中的地位.   图2-2 Shell脚本在运维工作中的地位形象图

阿里员工在工作中仅限使用公司自己的IM等通讯产品

摘要: 在棱镜门事件导致互联网信息安全成为热门话题时,昨日阿里巴巴一封内部邮件也同样引发关注.阿里高管在邮件中称,为保护信息和数据安全,阿里员工在工作中仅限使用公司自己的 在"棱镜门"事件导致互联网信息安全成为热门话题时,昨日阿里巴巴一封内部邮件也同样引发关注.阿里高管在邮件中称,为保护信息和数据安全,阿里员工在工作中仅限使用公司自己的IM等通讯产品. 阿里巴巴集团首席风险官邵晓锋表示:"利用各种软件.终端秘密获取用户各类信息早已不是秘密,而现有的数据分析技术,足够把零碎信息

工作中比较重要的经验分享-2016-bypkm

工作中总有一些经验能让人记忆深刻,能让人终生受用,相比技术而言,经验是宝贵的.无价的.在我的博客中,主要是技术类的博文,那些东西是相对死板的,价值也相对低廉.今天就记录一下我在工作中一次比较重要的经验吧. 事情发生得也比较奇葩,相信有一些人知道向日葵开机棒这个东西,没错,这个东西就是经验发生的最初原因,待我一一道来,可能还要配些图文说明,才能说得清.有一段时间内,公司要求每个人都要做到节能,就是人离关灯.关电脑.关空调,关灯关空调这个都没问题,关电脑不太现实,因为那时候线上环境系统不成熟,随时可

经验分享:做前端每天工作中最基本的法则

文章描述:我做前端一年半. 如果从开始工作那天开始算是入行,到今天也有近一年半了.听到前端这个词,肯定有很多人脑海里浮现出男人,死板的,带着满脸执着的画面.其实不然,我是个活生生例子,嘿嘿. 现在好像越来越多的女孩子做前端了,因为前端并不是外行脑子里跳跃的那些画面,而是活泼的,色彩丰富的,带有艺术气息的,能用键盘为生活敲出欢快节奏的. 一年半的前端之路,对工作最初的懵懂开始渐渐明晰,对前端也有了自己小小的感受,以下就是每天工作中最基本的法则: 做前端,要耐心. 因为那26个字母和各种符号的组合你

分享用户研究工作流程:用户理解方法和经验

文章描述:如何了解我们的用户:无线终端用户理解工作方法分享. 一. 前言 来到腾讯以后,做过iPhone阅读器.iPad阅读器.iPad音乐播放器的用户理解,目前正在做iPhone QZone的用户理解工作.做得次数多了,方法在不断改进,也积累了一些经验,与大家一起分享,希望帮助我们更了解用户. 首先介绍一下目前北分wsd(无线研发部用户体验组)用户研究工作流程:我们的用研需求来自项目组和用研组需求池,为控制节奏和质量,对承接项目组需求的工作流程进行严格把控,我们针对项目组需求,制定了用研工作流

百度百科2级新手在百科中成功加入链接的经验分享

  百度对自己旗下的产品一直另眼相看,所以seo外链工作中,如果能在百度知道或百度百科中留下你的链接,这样的链接无疑是相当优质的链接,尤其是百度百科中的链接.最近一直在做一家医疗网站的seo工作,因为是新站,所以外链的获取大费周折.后来看到有人在百度百科做外链的经验分享,感觉也并没有那么低的成功率,于是就注册了个百科的账号,开始"图谋"百科的外链. 网站上主要想推3种产品,两种准字号的药品,一种健字号的保健品,两个词条是已经存在的,一个词条是需要新建的,很多人说百科四级以下的做这个很有

分享一下个人做图片站中总结的一些优化经验

摘要: 在站长网上我们能够随处可见各位SEOer都是畅谈着网站文章的优化工作,因为大家都知道文字类型的内容是能够很好的被蜘蛛识别和抓取的.但是对于当下的互联网而言,很多的网站还 在站长网上我们能够随处可见各位SEOer都是畅谈着网站文章的优化工作,因为大家都知道文字类型的内容是能够很好的被蜘蛛识别和抓取的.但是对于当下的互联网而言,很多的网站还是以图片为主的网站,例如说素材.图片类的分享网站,对于这些文字类型网站的优化方法就不是很适用了.所以今天小编就来分享一下自己做图片站中总结的一些优化经验.