原文:分享工作中遇到的问题积累经验 事务日志太大导致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
GODECLARE @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 = 0BEGINSET @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_mbFROM    dbo.sysfiles as sysfiles INNER JOIN sys.database_files as database_files ON sysfiles.[fileid]=database_files.[file_id] WHERE sysfiles.[groupid]  =0AND database_files.[type] = 1;'EXEC (@SQL)FETCH NEXT FROM @itemCur INTO @DBNAMEEND CLOSE @itemCur
DEALLOCATE @itemCurSELECT  *  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
FORSELECT  '[' + [name] + ']'FROM    sys.tablesWHERE   type = 'U';  OPEN Info_cursor
FETCH NEXT FROM Info_cursor INTO @tablename  WHILE @@FETCH_STATUS = 0BEGIN INSERT  INTO #tablespaceinfoEXEC 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 RowsInfoWHEN 0 THEN 0ELSE 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    #tablespaceinfoORDER 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 

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

  1. Java各种锁在工作中使用场景和细节经验总结

    1.synchronized1.1.共享资源初始化2.CountDownLatch2.1.场景2.2.实现3.总结 1.synchronized synchronized 是可重入的排它锁,和 Ree ...

  2. 收缩solarwinds平台中使用SQL Server的数据库事务日志

    近来针对solarwinds平台的数据库Sqlserver做了调整,由原来的Sqlserver故障转移集群,调整为Sqlserver always on 集群. 调整的主要原因就是,Sqlserver ...

  3. 工作中如何做好技术积累

    引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...

  4. 工作中如何做好技术积累『转载-保持学习的空杯心态』

    引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...

  5. 如何在繁忙的工作中,做好技术积累?

    引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...

  6. 分享工作中让你有强烈情绪波动的事情

    近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注.有时候我们遇到的最大的敌人,不是运气也不是能力,而是失控的情绪和口无遮拦的自己.如何在工作中保持稳定的情绪?谈谈你的看法. 方向一: 工作不易 ...

  7. python在日常工作处理中的应用-近期工作中应用Python的一些经验总结

    本文由Markdown语法编辑器编辑完成. 1. Python 在来新公司前,也间断地接触过Python编程,比如医学影像处理的图像库VTK就已经有Python的实现:Paraview也可以开启Pyt ...

  8. 网易云信亮相LiveVideoStackCon2020,分享RTC中AI音频算法产品化经验

    10月31日-11月1日,LiveVideoStackCon2020音视频技术大会在北京隆重举办.本次大会以"多媒体开启新视界"为主题,聚焦在音频.视频.图像等技术的最新探索与应用 ...

  9. 分享工作中常用的 8 款工具 (工作效率嗷嗷提升)

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 责编:架构君 | 来源:量子位 上一篇好文:SSH 只能用于远程 Linux 主机?那说 ...

  10. 成长的思考:如何在工作中保持高速的自我成长

    之前在跟一位正在读博士的同学交流之后,我意识到了自己成长的危机.那么如果我选择了不去读博士,那么我又该如何保持快速的自我成长呢?如何保持与博士同学们的思维层次和眼界在同一个水平上呢?如何在相同的时间内 ...

最新文章

  1. ==和equals的简单比较
  2. Fatal error: Call to undefined function gmp_strval() XAMPP 1.7.4 缺少php_gmp.dll
  3. python cv.imread_Python的OpenCV cv2.imread总是返回None而cvFeatDetector崩溃了python
  4. Hadoop学习笔记(七)
  5. 智伴机器人三级分销模式_企业选择微信三级分销定制开发原因?
  6. 初学网站建设,要学习些什么?
  7. 饭卡问题(0-1背包的变形)
  8. Spring-beans-FactoryBean
  9. Windows说明Linux分区和挂载点
  10. Oracle笔记(九) 表的创建及管理
  11. 毕业10年,阻碍你职业发展的最大“拦路虎”到底是什么?
  12. Apache配置访问控制、禁用php解析、rewrite伪静态、限定user_agent
  13. java开发ps插件_ps样式如何导入?Photoshop插件导入教程
  14. TIF转PDF--itextpdf
  15. 电脑“应用程序无法启动,因为应用程序的并行配置不正确......“问题的解决方法
  16. 点割集和边割集的理解
  17. 净重新分类指数NRI的计算
  18. 开发也可以如此简单!华为云发布两款开发工具
  19. 成就系统和任务系统的设计
  20. 2021年Java者未来的出路在哪里

热门文章

  1. 基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测 -附代码
  2. Python3.6下安装爬虫scrapy框架的安装步骤以及遇到的诸多问题
  3. 【Tensorflow2】语义分割实战1---斑马线识别
  4. LeetCode路径问题
  5. 李宏毅机器学习HW1_pm2.5prediction(adagrad/gradient descent/SGD)
  6. 利用IDLE对 dem进行批量拼接处理
  7. 用python爬取图片和搞笑段子
  8. kafka partition分配_【kafka】消费者对应的分配partition分区策略
  9. spark sql python_Spark 3.0开发近两年终于发布,流、Python、SQL重大更新详解
  10. neovim--ubuntu安装