SQLServer常见问题总结
写在前⾯
  在QQ,,论坛中经常帮助使⽤SQL Server数据库的朋友解决问题,但是有⼀些最常见最基本的问题,每天都有⼈问,回答多了也不想再解答了,索性把这些问题整理⼀下,再有⼈问到直接发链接。
  ⼀时想法⽽写这篇⽂章,问题可能不全⾯,后续会⼀直更新。
基础问题收集
资源下载
  描述:XX版本数据库操作系统在哪⾥下载?
连接问题
  描述:数据库连接不上
  答:请确认SQL服务是否启动,⽤户密码是否正确,连接的实例名称,端⼝是否正确
⽇志问题
  描述:系统⽇志LDF满了或⽇志⽂件⾮常⼤如何收缩?
  答:简单恢复模式下SQL Server会⾃动截断⽇志⽂件,完整模式下需要⽇志备份
  恢复模式查看
  ⽇志备份的⽅式
  收缩⽇志
查询很久慢
  描述:查询很久都查不出数据,很慢!
  答:这样的情况出现⼀般是查询语句被其他语句阻塞。在查询中添加 select * from table with (nolock)如果能查出来说明阻塞  具体的阻塞情况可以使⽤sp_who2 或者 sys.dm_exec_requests 视图查询
  具体脚本(查看语句运⾏情况)
1WITH sess AS
2 (
3SELECT
4        es.session_id,
5        database_name =DB_NAME(er.database_id),
6        er.cpu_time,
7        er.reads,
8        er.writes,
9        er.logical_reads,
10        login_name,
11        er.status,
12        blocking_session_id,
13        wait_type,
sqlserver备份表语句14        wait_resource,
15        wait_time,
16        individual_query =SUBSTRING (qt.text, (er.statement_start_offset/2)+1, ((CASE WHEN er.statement_end_offset =-1THEN
LEN(CONVERT(NVARCHAR(MAX), qt.text)) *2ELSE er.statement_end_offset END- er.statement_start_offset)/2)+1),
17        parent_query = qt.text,
18        program_name,
19host_name,
20        nt_domain,
21        start_time,
22DATEDIFF(MS,er.start_time,GETDATE()) as duration,
23        (SELECT query_plan FROM sys.dm_exec_query_plan(er.plan_handle)) AS query_plan
24FROM
25        sys.dm_exec_requests er
25        sys.dm_exec_requests er
26INNER JOIN sys.dm_exec_sessions es ON er.session_id = es.session_id
27CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
28WHERE
29        es.session_id >50
30AND es.session_Id NOT IN (@@SPID)
31 )
32SELECT
33*
34FROM
35    sess
36UNION ALL SELECT
37    es.session_id,
38    database_name ='',
390,
400,
410,
420,
43    login_name,
44    es.status,
450,
46'',
47'',
48'',
49    qt.text,
50    parent_query = qt.text,
51    program_name,
52host_name,
53    nt_domain,
54    es.last_request_start_time,
55DATEDIFF(MS,es.last_request_start_time,GETDATE()) as duration,
56NULL AS query_plan
57FROM
58    sys.dm_exec_sessions es
59INNER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
60CROSS APPLY sys.dm_exec_sql_st_recent_sql_handle)as qt
61WHERE
62    ec.most_recent_session_id IN
63    (
64SELECT blocking_session_id FROM sess WHERE blocking_session_id NOT IN(SELECT DISTINCT session_id FROM sess)
65    )
66ORDER BY
671, 2
分区表问题
  描述:数据量千万级别了使⽤分区表提升性能
  答:分区表的使⽤场景主要是管理数据,⽽提升性能主要是靠IO并⾏,需要合理规划多块物理磁盘,⼤多数的场景下⼏千万数据单⼀的模式查询只需要添加正确的索引即可。
⾼可⽤的选择
  答:SQL⾃带的⾼可⽤或读写分离技术主要有:故障转移集、发布订阅、镜像、⽇志传送、AlwaysON可⽤组(具体可以在进阶问题的资料中详细查看)
  ⼀般选⽤读写分离需要根据不同的场景和要求,⽐如同步的实时性,读写分离功能的需要情况
  主要列出⼏个优缺点:
  故障转移集:主备模式,单活(辅助机不可读),硬件资源浪费,主要场景是数据库的⾼可⽤。
  发布订阅:读写分离常⽤⽅式,配置灵活,副本节点可以多个,可以发布订阅部分数据(即可以对数据筛选),并提供多种发布订阅模式,缺点:维护⽐较⿇烦,⼀般不能⽤作⾼可⽤。
  镜像:主备模式,单活(辅助机不可读),硬件资源浪费,主要场景是数据库的⾼可⽤。相对于故障转移集镜像是数据库级别的⾼可⽤。在镜像中可以使⽤快照的⽅式实现读写分离。
  ⽇志传送:主要⽤于灾备,在备⽤机上可读,但缺点是⽇志还原时不能读,读时不能还原。
  AlwaysON可⽤组:综合性⽅案,满⾜⾼可⽤、读写分离等需要,要求:SQL Server2012 以上版本
  第三⽅产品:moebius负载均衡集,实现双活,读负载均衡、读写分离等。缺点实时同步不适合类似采集系统的⼤规模写⼊系统。
服务⽆法启动
  答:服务⽆法启动有很多原因,需要具体问题具体定位,如果遇到此类问题要⾸先查看⽇志定位问题,⽇志主要两部分,SQL启动⽇志和windows⽇志,下⾯给出两篇经典解析SQL启动的⽂章:
数据库设计,表设计的问题
  ⼤多数这样的问题,在QQ⾥问是根本得不到答案的,很多业务场景不是⼏句话可以描述清楚的。
SQL语句问题
  描述:SQL语句增加或者减少⼀个条件就变得很慢
  答:SQL语句的运⾏变化很微妙,需要理解执⾏计划,⼏句话或者贴个图⽆法解决,⼀些语句的习惯是需要养成的,请参见:
AlwaysOn配置问题
  AlwaysOn配置问题请参见桦仔的⼏篇⾮常细致的⽂章:
  2016的AlwaysOn 搭建:
AlwaysOn新建⽤户
  ⾸先要明⽩AlwaysOn可⽤组中:
  1.只有主节点是可以写⼊的,辅助节点只读
  2.权限分成两部分,实例级别“登录名”和数据库级别“⽤户”
  3.在主节点创建登录名称并选择数据库权限后,因为数据同步,所以从库上已经有了新创建⽤户的数据库权限,但是没有登录名。
  4.不能在辅助节点同样的⽅式创建登录名,这样就是“⽤户孤⽴”问题
  解决⽅法: 
  1.在主节点上直接添加的是“登录名”,⽐如创建⼀个登录名 KK

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。