搜索

SQLServer运维

Jun 07, 2016 pm 03:51 PM
sqlserver日期运维

日期:2012年11月30日 浏览量:1,507次 1 条评论 分类:MSSQL,数据库 作者:飞扬过海 数据是一个企业的命根子,尤其是在当今绝大部分的行业都实现了信息化的管理的时代,企业所有运营的数据、财务信息等都会存放到数据库中,在用户量和数据量不断变大的情况

日期:2012年11月30日浏览量:1,507次 1 条评论 分类:MSSQL, 数据库作者:飞扬过海

数据是一个企业的命根子,尤其是在当今绝大部分的行业都实现了信息化的管理的时代,企业所有运营的数据、财务信息等都会存放到数据库中,在用户量和数据量不断变大的情况下,如何保障这些信息的安全、保证随时随地的能被用户访问,同时还需要在用户不间断访问的情况下调整、修改这些数据和结构,用以满足业务的需求和变更,这本身一门很艺术的事了。

 

这篇文章主要总结了SQLServer数据库运维时,在保证数据安全和DBA操作数据库时保证不影响用户访问方面的一些技巧,之所以将之形容为“虎口夺食”,是因为DBA是个风险相当高的行业,在高并发、大数据量的系统中,很多小的失误或者操作不当,都将造成严重的后果,不仅影响系统的正常运行,甚至牵连到整个数据的安全,给企业造成不可估量的损失;我们粗算一笔账,以一个日交易量2000万的网站来说(中型规模),如果因你的操作造成网站当机一个小时,我们按一天20小时交易时间来算(另外4小时可能没多少交易量),一个小时就是100万的损失,这个只是显性成本,还有因网站故障导致用户流量的隐性损失,如果企业要与员工来算这边账的话,那技术吊丝一辈子估计都得卖给这个企业了;当然,一般企业不会这么去跟员工算计(否则没人敢干活了),但是一次这种失误发生的话,个人KPI年终奖、部门奖金等就别指望了,而且因为你的错误,你的顶头上司还会受到牵连,如果你犯错“频繁”(注意DBA一年范两次这样的错就算频繁了),公司不辞你,估计也没脸在公司待下去;我就见过一些犯过类似错误的DBA,在往后进行某些数据库操作时,口中会念念有词,手还会止不住的发抖(正所谓一朝被蛇咬,十年怕井绳)。

 

下面将分四个部分,共十个方面来说明我整理的在SQLServer数据库运维的一些技巧:

 

保障数据访问

 

这个部分也可以叫在线容灾恢复,就是数据库发生问题后,在不中断用户访问(或者中断时间很短)的前提下,恢复数据库系统。

 

1.       Mirror+Replication 自动切换

这种情况是在为核心数据库做了镜像,同时又做了复制的情况下,在主服务器发生问题时,系统能自动的将数据库切换到镜像机器,复制也同步切换过去(如果单纯只是做镜像切换的场景比较简单),也就是说核心服务器当机时,数据和同步链都不受影响,如果前端访问时是配置两个IP的(一个核心服务器IP,另一个是Mirror机器IP),那前端的访问就不会中断,在服务器出现问题时实现了对前端透明的切换过程;这种情况的详细过程请参考:SQLServer 数据库镜像+复制切换方案。

SQLServer运维

 

2.       群集在线添加节点

如果您的数据库服务器做了群集(假设是双A群集),现在群集中的某台机器出现了问题,那另外一台将承受双业务的压力,此种情况下,为防止我们单台服务器压力过大,或者再出现问题,我们应该尽快的替换掉出现问题的那台服务器,最好的方法是在线添加一个新的节点,步骤如下:

  1. 新弄一台服务器,做好必要的配置(加域、加心跳线、配置HBA卡等);
  2. 将新服务器添加到目前的Windows群集中;
  3. 将新服务器添加到SQLServer群集中;
  4. 将原本在出现问题机器上的业务切换到新添加的服务器中;
  5. 将出现问题的节点从群集中删除。

 

这个过程因为要在添加完节点后,将业务切换过来,所以会有短暂的业务暂停(相当于重启了一次SQLServer服务),但一般是可以接受的,这样我们就将损坏的机器做了在线的替换,基本不影响业务的正常进行。

SQLServer运维

 

提高数据库访问能力

 

3.       在线扩充数据库读能力

能在线扩充读能力的,一般都是需要做了数据库复制的环境,很多互联网企业在做企业的促销活动时,经常采取这种方案(尤其是电商);在线扩充读能力一般分两种情况,第一种是提前准备好了读的服务器,数据也同步了,只需要在读出现瓶颈时,将准备好的服务器添加到负载均衡的缓冲池即可;另外一种是没有提前准备好读的服务器,而是临时添加,我们就来说下这个过程:

  1. 准备好需要添加的服务器;
  2. 将其他读的机器上的数据库备份,还原到新的机器;
  3. 从分发机器上创建到这台机器的同步链并暂时禁用(可以参考其他读机器同步链);
  4. 同步链通过数据库比较工具(BCP、TableDiff等)修复缺失的数据,
  5. 启用同步链,跳过数据已经存在的冲突错误;
  6. 没有问题后,与其他只读机器比较数据量的情况,如果没问题即添加完成;
  7. 将新机器添加的负载均衡缓冲池,提供前端访问。

 

从整个过程来看,临时扩充系统读能力还是比较麻烦的,需要操作的DBA技能比较熟练,而且数据修复部分可能需要的时间比较长,一般应是提前准备的好,防止临时添加时时间过紧而犯错。

SQLServer运维

 

4.       SSB + Replication

SSB是SQLServer数据库的异步通信功能,如果企业对数据实时性要求不是那么高的话,是完全可以采用这项技术的,它的最大好处就是缓解瞬时的高峰压力,将部分操作异步处理,保证前端用户其他操作的顺畅;举个例子,我们在线预订酒店就可以用SSB技术,当你在网页上面提交订单后,系统不会马上告诉你订单是否成功,这时我们就用SSB技术传递一个消息给后端去处理,处理完成后再向用户手机发送一条信息,提示他是否预订成功,这样就缓解了网上大量用户在同一时刻下单时,造成网站阻塞的情况;如果能在结合复制技术,在读的机器上完成下单操作,然后通过SSB技术再到主服务器上去完成事务的处理,效果会更加(因为读的机器比较多,下单压力会分散到多台机器),这个技术大家可以参考

数据库架构  这篇文章。

 

5.       架构设计扩充系统读能力

架构设计中,加快系统读能力的方案比较多(因为读比较频繁,容易出现瓶颈),比较普遍的是以空间换时间方案,按不同的维度将数据存放多份,在用户进行查找时根据查找的条件将查询定位到不同的服务器;例如我们将数据按三个维度来存放:普通维度、用户维度和产品维度,当前端写入数据时,就根据规则算法将数据按不同的维度写入不同的数据库服务器(前端写入的操作会变得复杂),而在用户查找时,就可以按用户选择的条件定位到相应的数据库上面去查找相关的数据了(如果还能结合Lucence等搜索引擎,效果会更好)。

SQLServer运维

 

 

在线数据库操作

 

 

6.       在线系统添加非空字段(带默认值)

 

为在线系统的某个表添加一个非空的字段,这个操作是经常会遇到的,在数据量小,用户访问量不那么频繁时不存在什么问题,一旦表的数据量达到千万级别,而且用户对这个表访问频繁时,这个看似简单的操作就变得不是那么容易了;如果直接操作往往消耗时间很长,而且其他用户的操作被大量阻塞,甚至出现数据库假死现象;这种情况下处理这些操作的方式就必须改变,可能的方案如下:

 

  1. 选择业务低峰时间进行操作(如:晚上);
  2. 加一个带默认值,且可以为NULL的字段,完成后将为NULL的数据改成默认值;
  3. 先加一个为NULL的字段,将数据填充后,改成带默认值的非NULL字段。

 

 

 

从这三种方式来看,第二种方式是比较好的,因为它既能满足后面不断增加数据为非NULL值的需要,也不会造成大面积的阻塞,而且能满足时间上的需求(这种修改一般可能要当场就进行,而不是等上一天);当然在做NULL值数据修复时,需要分批进行(一次性操作又会遇到大量的阻塞和操作时间过长的问题),如按下面的代码形式修改:

 

declare @rowcount int

 

if OBJECT_ID(‘tempdb.dbo.#temp1′) is not null

 

  drop table dbo.#temp1

 

–更新临时表

 

create table dbo.#temp1(id int primary key not null)

 

 

while 1=1

 

 begin

 

   –每次修改条记录

 

   insert into dbo.#temp1(id)

 

   select top 1000 id from dbo.Table1 where IsUpdate is null

 

 

   update    dbo.Table1  set a.IsUpdate=0  where ID in(select ID from #temp1)

 

 

   set @rowcount=@@rowcount

 

 

   if @rowcount=0

 

     break;

 

   else

 

     waitfor delay ’00:00:00.500′ –暂停.5秒

 

 

   truncate table #temp1

 

end

这类型的操作还有:添加索引,删除一个大表的部分数据等,操作的时候都需要使用一定的技巧才顺利完成。

 

7.       数据库收缩

数据库变大,磁盘空间不足时,DBA往往都会采取收缩数据库或者数据文件的操作,但是这个操作在数据库很大时往往是一个相当耗时的过程,我们在对数据库(或者文件)收缩前最好先看一下最多能释放多少空间(下图的最小值)

SQLServer运维


 

然后选择能释放空间比较大的文件进行收缩,而且收缩时一定要分部进行,不要一次性收缩,可以每次选择收缩5G;刚开始收缩时是比较快的,越往后面收缩需要的时间也越长(因为系统需要挪动的数据更多),如果觉得收缩时间过长了,我们可以终止掉,这样就不会有一次性收缩时造成数据库假死的现象;收缩的同时我们还需要查看下阻塞的情况,如果有用户进程被收缩进程阻塞了,而且一定的时间内不能释放,应该马上终止收缩进程,防止影响业务的运行:

 

select * from sys.sysprocesses with(nolock) where blocked0

 

8.    在线CPU调整

在线系统如果CPU变得比较高了,我们在做调整时往往要对症下药,不能盲目处理,否则可能造成更严重的CPU性能问题;CPU 突然走高,70%的可能是因为新进来的一些语句缺乏相关的索引,尤其是一些有GroupBy、 OrderBy 这类型的语句,那我们如何来找到这些语句呢?一个常见的方法是查找DMV,找出当时消耗CPU最多的语句,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

--总耗CPU最多的前个SQL:
SELECT TOP 20
    total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
    qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
    last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)],
    SUBSTRING(qt.text,qs.statement_start_offset/2+1,
        (CASE WHEN qs.statement_end_offset = -1
        THEN DATALENGTH(qt.text)
        ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
    AS [使用CPU的语法], qt.text [完整语法],
    qt.dbid, dbname=db_name(qt.dbid),
    qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
ORDER BY  total_worker_time DESC


--平均耗CPU最多的前个SQL:
SELECT TOP 20
    total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
    qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
    last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)],
    max_worker_time /1000 AS [最大执行时间(ms)],
    SUBSTRING(qt.text,qs.statement_start_offset/2+1,
        (CASE WHEN qs.statement_end_offset = -1
        THEN DATALENGTH(qt.text)
        ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
    AS [使用CPU的语法], qt.text [完整语法],
    qt.dbid, dbname=db_name(qt.dbid),
    qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE  execution_count>1
ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC

不过DMV记录的是一些瞬时或者部分时间内系统收录的语句,往往不够全面,如果我们能每天在服务器上开一个Trace文件,通过Trace文件来分析就会比较全面了,如下:

SQLServer运维


 

如果你平时有对Trace文件进行分析和格式化并生成相关图表的话,那优化起来就更加有针对性了(格式化后,前十位消耗CPU的语句):

SQLServer运维

 

找到了语句,就可以来优化语句了,该加索引的加索引,该做调整的做调整,但是如果我们分析出来的语句该有的索引都有,该改进的地方也都改进了,它因为数据量或者访问频繁等原因暂用CPU的资源依然相当高,那怎么办?我们还有其他的方法处理吗?还是有的,主要的途径有如下几种:

  1. 查找等待信息,如果CPU类型的等待排在前面(主要是CXPACKET和SOS_SCHEDULER_YIELD两类),我们就可以认为是CPU的处理能力不足,此时为不影响其他的用户进程,可以将CPU的并行开销(调大cost threshold for parallelism)和并行度做调整(调小max degree of parallelism);
  2. 限制相关的语句使用CPU的数量(加上Option参数),如限制语句最多使用两颗CPU:select * from Products with(nolock) option(maxdop 2)
  3. 看看数据库使用的内存是否还可以做调整,或者系统内存是不是大部分被数据库使用;
  4. 查看一下索引的碎片是否过大,过大的话需要做索引的重新整理(这个操作需要在业务低峰时进行);
  5. 查看下统计信息是否是最新的,如果不是,更新统计信息(这个操作往往比较有效);
  6. 判断语句是否使用了正确的执行计划,如果不是,删除已有的执行计划,再重新执行;如果是存储过程可以加 WITH RECOMPILE。

相信采取了这些措施后,应该能让服务器的CPU压力有所缓解,如果还是不能解决问题,那就需要更换更好的CPU了(或者是添加更多的内存)。

 

数据安全

 

9.       备份与还原

备份与还原是DBA一个很重要的任务,再怎么强调都不过分,就像国家花大价钱培养军人一样,养兵千日,用兵一时,它是关键时刻最后的救命稻草;备份还原也有一些使用的技巧,如:备份计划和频率的制定,需不需要远程和本地双重备份,备份时我们是否要加“CheckSum”参数,是否需要做压缩备份,是否需要定期做还原测试,还原有问题时加“CONTINUE_AFTER_ERROR”尽量挽救数据,是否只需要做页还原,以及尾日志的备份和还原等等,如果要保证备份的数据绝对的安全可靠的话,做远程和本地双备份,做定期的还原测试这些都是必要的;如果还有人问做了Mirror或者LogShipping之后,还需要做备份吗?那请想下,如果某个重要的表被某个不小心的人删除了,你能通过Mirror或者LogShipping找回吗?

 

10.      核心数据多层保障

核心的数据做多重的保障是必要的(虽然成本会变高),毕竟核心的数据很大程度上对一个企业能否继续运营起着关键作用,在出现问题时,如果一套保护方案出现问题,我们还有其他的方案来恢复数据,这些保护的投入是值得的,下图罗列了常用的保护方案,DBA可以根据企业的实际情况(主要是成本因素),选取其中的某些技术方案,来保障数据的安全。
SQLServer运维


以上十点只是我个人在做DBA的过程中总结的一些技巧,如大家有其他的一些方面的技巧,欢迎留言交流。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
说明InnoDB重做日志和撤消日志的作用。说明InnoDB重做日志和撤消日志的作用。Apr 15, 2025 am 12:16 AM

InnoDB使用redologs和undologs确保数据一致性和可靠性。1.redologs记录数据页修改,确保崩溃恢复和事务持久性。2.undologs记录数据原始值,支持事务回滚和MVCC。

在解释输出(类型,键,行,额外)中要查找的关键指标是什么?在解释输出(类型,键,行,额外)中要查找的关键指标是什么?Apr 15, 2025 am 12:15 AM

EXPLAIN命令的关键指标包括type、key、rows和Extra。1)type反映查询的访问类型,值越高效率越高,如const优于ALL。2)key显示使用的索引,NULL表示无索引。3)rows预估扫描行数,影响查询性能。4)Extra提供额外信息,如Usingfilesort提示需要优化。

在解释中使用临时状态以及如何避免它是什么?在解释中使用临时状态以及如何避免它是什么?Apr 15, 2025 am 12:14 AM

Usingtemporary在MySQL查询中表示需要创建临时表,常见于使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通过优化索引和重写查询避免其出现,提升查询性能。具体来说,Usingtemporary出现在EXPLAIN输出中时,意味着MySQL需要创建临时表来处理查询。这通常发生在以下情况:1)使用DISTINCT或GROUPBY时进行去重或分组;2)ORDERBY包含非索引列时进行排序;3)使用复杂的子查询或联接操作。优化方法包括:1)为ORDERBY和GROUPB

描述不同的SQL交易隔离级别(读取未读取,读取,可重复的读取,可序列化)及其在MySQL/InnoDB中的含义。描述不同的SQL交易隔离级别(读取未读取,读取,可重复的读取,可序列化)及其在MySQL/InnoDB中的含义。Apr 15, 2025 am 12:11 AM

MySQL/InnoDB支持四种事务隔离级别:ReadUncommitted、ReadCommitted、RepeatableRead和Serializable。1.ReadUncommitted允许读取未提交数据,可能导致脏读。2.ReadCommitted避免脏读,但可能发生不可重复读。3.RepeatableRead是默认级别,避免脏读和不可重复读,但可能发生幻读。4.Serializable避免所有并发问题,但降低并发性。选择合适的隔离级别需平衡数据一致性和性能需求。

MySQL与其他数据库:比较选项MySQL与其他数据库:比较选项Apr 15, 2025 am 12:08 AM

MySQL适合Web应用和内容管理系统,因其开源、高性能和易用性而受欢迎。1)与PostgreSQL相比,MySQL在简单查询和高并发读操作上表现更好。2)相较Oracle,MySQL因开源和低成本更受中小企业青睐。3)对比MicrosoftSQLServer,MySQL更适合跨平台应用。4)与MongoDB不同,MySQL更适用于结构化数据和事务处理。

MySQL索引基数如何影响查询性能?MySQL索引基数如何影响查询性能?Apr 14, 2025 am 12:18 AM

MySQL索引基数对查询性能有显着影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL:新用户的资源和教程MySQL:新用户的资源和教程Apr 14, 2025 am 12:16 AM

MySQL学习路径包括基础知识、核心概念、使用示例和优化技巧。1)了解表、行、列、SQL查询等基础概念。2)学习MySQL的定义、工作原理和优势。3)掌握基本CRUD操作和高级用法,如索引和存储过程。4)熟悉常见错误调试和性能优化建议,如合理使用索引和优化查询。通过这些步骤,你将全面掌握MySQL的使用和优化。

现实世界Mysql:示例和用例现实世界Mysql:示例和用例Apr 14, 2025 am 12:15 AM

MySQL在现实世界的应用包括基础数据库设计和复杂查询优化。1)基本用法:用于存储和管理用户数据,如插入、查询、更新和删除用户信息。2)高级用法:处理复杂业务逻辑,如电子商务平台的订单和库存管理。3)性能优化:通过合理使用索引、分区表和查询缓存来提升性能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。