用户的数据库一张高频表,使用select count(*) from t1 竟然一直在转圈,显示开始,而没有end。

找尽原因不得果。把数据库备份后在恢复,可以使用几小时,之后又是老毛病抽风。

用户生产用系统,从而用户几乎停工一天。这个问题就要命了。(原因怀疑其他数据库系统导致CPU100%引起的)。

初步怀疑是记录有重复的原因,但是检查没有任何问题。

晚上,网上查找原因,注意到是阻塞死锁引起的。

文章https://www.cnblogs.com/luna-hehe/p/8658900.html现象完全一致。

执行

declare @spid int,@bl int
DECLARE s_cur CURSOR FOR select 0 ,blocked from (select * from sys.sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b where a.blocked=spid)
union
select spid,blocked from sys.sysprocesses where blocked>0 OPEN s_cur FETCH NEXT FROM s_cur INTO @spid,@bl WHILE @@FETCH_STATUS = 0
begin if @spid =0
select ' 引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + ' 进程号, 其执行的SQL 语法如下' else
select ' 进程号SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 进程号SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其当前进程执行的SQL 语法如下'
DBCC INPUTBUFFER (@bl ) FETCH NEXT FROM s_cur INTO @spid,@bl end CLOSE s_cur
DEALLOCATE s_cur

出现一大推记录。真的被堵得死死的。

use master
go
--检索死锁进程
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)

用kill spid(进程号)杀了几个后再查,没有了。在执行sql语句,流畅的很。

用语句检查

    DBCC showcontig(表名) 查看表的碎片, 主要查看扫描密度 ,如果主要的大表扫描密度 < 40%, 意味着你有严重的碎片可以用
DBCC indexDefrag (数据库名,表名)整理碎片或者用
DBCC DBREINDEX(表名) 重建 index.

结果碎片一地。通过DBCC indexDefrag (数据库名,表名)整理碎片,再查98%。问题至此解决。

和数据库打交道,我们只是简单使用。如何高并发大数据,问题就来了。因此好好研究学习数据库的原理方法维护等显得异常重要了。

==========================

sqlserver2008 死锁解决方法及性能优化方法

原文: http://blog.csdn.net/kuui_chiu/article/details/48621939

十步优化SQL Server中的数据访问

http://tech.it168.com/a2009/1125/814/000000814758_2.shtml

============================

sp_who active  --看看哪个引起的死锁, blk里面即阻塞的spid;
dbcc inputbuffer(@blk) -- 可以查看是那个sql语句造成的死锁;
sp_lock --看看锁住了那个资源,objid即被锁住的资源id;
select object_name(objid) --可得到受影响的表名;

写一个自动查找死锁的存储过程,如下:

查找死锁.sql

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE Find_Lock
AS
BEGIN
SET NOCOUNT ON;
declare @spid int,@blk int
DECLARE cur CURSOR FOR
select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
OPEN cur
FETCH NEXT FROM cur INTO @spid,@blk
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
select '引起死锁的进程号是 : '+ CAST(@blk AS VARCHAR(10)) + ', 其执行的 SQL 语法如下 '
else
select '进程号 SPID :'+ CAST(@spid AS VARCHAR(10))+ '被进程号 SPID : '+ CAST(@blk AS VARCHAR(10)) +'阻塞 , 其当前进程执行的 SQL 语法如下'
DBCC INPUTBUFFER (@blk )
FETCH NEXT FROM cur INTO @spid,@blk
end
CLOSE cur
DEALLOCATE cur
END
GO
--sqlserver性能优化
go
exec sp_configure ”awe enabled”,”1″–内存可以支持64g
exec sp_configure ”lightweight pooling”,”0″–不使用nt纤程
exec sp_configure ”priority boost”,”1″–增加sqlserver优先级
exec sp_configure ”network packet size (b)”,”8192″–增加sqlserver网络包的大小
reconfigure with override
–优化数据库设置
declare @currentdatabase sysname
select @currentdatabase = db_name((select dbid from master.dbo.sysprocesses wherespid = @@spid))
exec sp_dboption @currentdatabase, ‘select into/bulkcopy’, ‘true’ –对大容量数据操作不记录日志
exec sp_dboption @currentdatabase, ‘trunc. log on chkpt.’, ‘true’ –自动截断日志
exec sp_dboption @currentdatabase, ‘auto create statistics’, ‘true’–自动创建统计
exec sp_dboption @currentdatabase, ‘auto update statistics’, ‘true’–自动更新统
go

如果你不做日常维护,请立即开始。

经常用

DBCC showcontig(表名) 查看表的碎片, 主要查看扫描密度 ,如果主要的大表扫描密度 < 40%, 意味着你有严重的碎片可以用
DBCC indexDefrag (数据库名,表名)整理碎片或者用
DBCC DBREINDEX(表名) 重建 index.

https://www.cnblogs.com/guo2001china/p/6415871.html

=========================================

http://bbs.51cto.com/thread-1024392-1.html

执行下面的SQL语句就知道了需要碎片整理的表(下面的语句可以在SQL Server 2005及后续版本中运行,用你的数据库名替换掉这里的AdventureWorks):

    USE master
go
SELECT
object_name(dt.OBJECT_ID,db_id('AdventureWorks')) Tablename,
si.name
IndexName,dt.avg_fragmentation_in_percent AS ExternalFragmentation,
dt.avg_page_space_used_in_percent AS InternalFragmentation
FROM
(
SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (db_id('AdventureWorks'),null,null,null,'DETAILED')
WHERE index_id <> 0
) AS dt INNER JOIN AdventureWorks.sys.indexes si ON si.object_id=dt.object_id
AND si.index_id=dt.index_id
AND dt.avg_fragmentation_in_percent>10
AND dt.avg_page_space_used_in_percent<75
ORDER BY avg_fragmentation_in_percent DESC

=======================================

杀死锁的程序,检查死锁超过2分钟的:

BEGIN
SET NOCOUNT ON;
  declare @kill_ID int   declare cursor_LockID CURSOR FOR
    select blocked from sys.sysprocesses
      where
        (
          (spid in
            ( select blocked from sys.sysprocesses where blocked <> 0 ) or (blocked <>0)
          )
          and (blocked<>0) and DATEDIFF(minute,last_batch,getdate())>=2
        )   OPEN cursor_LockID 
  FETCH NEXT FROM cursor_LockID INTO @kill_ID
    BEGIN
      IF @kill_ID<>0 EXEC('KILL '+ @kill_ID)
    END   CLOSE cursor_LockID
  DEALLOCATE cursor_LockID
END

sql server2008r2其中一张表不能任何操作的更多相关文章

  1. Oracle两张表关联批量更新其中一张表的数据

    Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...

  2. hive sql 查询一张表的数据不在另一张表中

    有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...

  3. SQL查询——同一张表的横向与纵向同时比较

    表名:student 表结构及数据: +----+--------+---------+------+------------+--------------+---------+ | id | nam ...

  4. 一条sql解决.一张表的数据复制到另外一张表

    如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...

  5. 【随记】SQL备份一张表的数据

    SQL Server: SELECT  *  INTO  table_bak   FROM   table Oracle.MySQL.SQLite: CREATE TABLE table_bak AS ...

  6. sql 查出一张表中重复的所有记录数据

    1.在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下: select * from xi a where (a.username) in ...

  7. sql 对一张表进行按照不同条件进行多次统计

    最近一直在做数据统计,在此过程中,遇到过好多种情况都是对一张表按照不同的条件进行多次统计,以前的做法是统计几次按照不同的条件left join 几次,虽然也能得到想要的结果,但是效率太低,反映在页面就 ...

  8. 夺命雷公狗---DEDECMS----31dedecms数据库创建一张表完成curl操作

    首先我们创建一张测试表,格式如下所示: 然后我们还是在plus目录下创建一个test3.php进行测试,首先写一个添加的: <?php header("Content-Type:tex ...

  9. 记录一则FGA审计“A用户对B用户某张表的更新操作”需求

    环境:Oracle 11.2.0.4 我这里测试A用户为JINGYU,要审计的表为B用户SCOTT下的EMP表.通过FGA来实现. 1.添加审计策略 2.测试审计效果 3.控制审计策略 1.添加审计策 ...

  10. goldengate 过滤对某张表的复制操作

    在复制进程中配置下面的参数可以实现对一个用户下的某些表进行过滤,在复制的时候 不做任何操作. MAPEXCLUDE: Valid for Replicat Use the MAPEXCLUDE par ...

随机推荐

  1. 深入理解ReentrantLock的实现原理

    文章目录ReentrantLock简介AQS回顾ReentrantLock原理ReentrantLock结构非公平锁的实现原理lock方法获取锁tryRelease锁的释放公平锁的实现原理lock方法 ...

  2. 彻底讲透Spring Bean生命周期,源码深度剖析!

    前言本篇文章主要是要介绍如何在Spring IoC 容器中 如何管理Spring Bean生命周期. 在应用开发中,常常需要执行一些特定的初始化工作,这些工作都是相对比较固定的,比如建立数据库连接,打 ...

  3. Mongodb使用手册-文档存储

    简介 MongoDB 是一个基于分布式文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自由 ...

  4. 搭建个人AI知识库:RAG与本地模型实践指南

    引言 你是否想过拥有一个私人订制的AI助手,能够随时为你提供最个性化的信息?本文将带你一步步搭建一个基于本地模型和RAG技术的个人知识库. 搭建本地模型 环境 os: archlinux 内存: 32 ...

  5. linux安装wps

     1. http://wps-community.org/downloads 下载            wps-office_10.1.0.5672~a21_i386.deb            ...

  6. 一分钟搞定!CentOS 7.9上用Ansible自动化部署SQL Server 2019

    一分钟搞定!CentOS 7.9上用Ansible自动化部署SQL Server 2019 不熟悉整个流程的朋友可以先看之前的部署文章,手动部署一遍 一步步教你在CentOS 7.9上安装SQL Se ...

  7. 《Indie Tools • 半月刊》第001期

    引言:独立开发者工具分享 <INDIE TOOLS>专注于分享独立开发出海精选.最新.最实用的工具. 欢迎订阅半月刊:<INDIE TOOLS • 半月刊> 如果本文能给你提供 ...

  8. SQLServer日期格式转换

    原文链接:https://blog.csdn.net/Diliges/article/details/84836884 常用: Select CONVERT(varchar(100), GETDATE ...

  9. 类的public, private, protected有什么区别?

    如何区别C# private和protected? 一.通过使用来区分 1.private:编程语句在模块级别中使用,用于声明私有变量及分配存储空间. 2.protected:编程语句在模块级别中使用 ...

  10. 全面详解C语言使用cJSON解析JSON字符[转载]

    cJSON对象的实现采用了树形结构,每个对象是树的一个节点,每个节点由cJSON这个结构体组成,对象中的元素也由cJSON这个结构体组成.同一层的对象和元素是双向链表结构,由next和prev指针链接 ...