在QQ群,微信群,论坛中经常帮助使用SQL Server数据库的朋友解决问题,但是有一些最常见最基本的问题,每天都有人问,回答多了也不想再解答了,索性把这些问题整理一下,再有人问到直接发链接。
一时想法而写这篇文章,问题可能不全面,后续会一直更新。
基础问题收集 资源下载描述:XX版本数据库操作系统在哪里下载?
答: 里面很多东西,有兴趣的自己看吧
连接问题描述:数据库连接不上
答:请确认SQL服务是否启动,用户密码是否正确,连接的实例名称,端口是否正确
日志问题
描述:系统日志LDF满了 或 日志文件非常大 如何收缩?
答:简单恢复模式下SQL Server会自动截断日志文件,完整模式下需要日志备份
恢复模式查看
日志备份的方式
收缩日志
查询很久慢
描述:查询很久都查不出数据,很慢!
答:这样的情况出现一般是查询语句被其他语句阻塞。在查询中添加 select * from table with (nolock)如果能查出来说明阻塞
具体的阻塞情况 可以使用sp_who2 或者 sys.dm_exec_requests 视图查询
具体脚本(查看语句运行情况)
( 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, 14 wait_resource, 15 wait_time, )er.statement_end_offset (er.statement_end_offset )+1), 17 parent_query = qt.text, 18 program_name, 19 host_name, 20 nt_domain, 21 start_time, 22 DATEDIFF(MS,er.start_time,GETDATE()) as duration, 23 (SELECT query_plan FROM sys.dm_exec_query_plan(er.plan_handle)) AS query_plan sys.dm_exec_requests er sys.dm_exec_sessions es ON er.session_id = es.session_id 27 CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt es.session_id es.session_Id NOT IN (@@SPID) 31 ) sess es.session_id, 38 database_name = '', 39 0, 40 0, 41 0, 42 0, 43 login_name, 44 es.status, 45 0, 46 '', 47 '', 48 '', 49 qt.text, 50 parent_query = qt.text, 51 program_name, 52 host_name, 53 nt_domain, 54 es.last_request_start_time, 55 DATEDIFF(MS,es.last_request_start_time,GETDATE()) as duration, query_plan sys.dm_exec_sessions es sys.dm_exec_connections ec ON es.session_id = ec.session_id 60 CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle)as qt ec.most_recent_session_id IN 63 ( (SELECT DISTINCT session_id FROM sess) 65 ) , 2
分区表问题
描述:数据量千万级别了使用分区表提升性能
答:分区表的使用场景主要是管理数据,而提升性能主要是靠IO并行,需要合理规划多块物理磁盘,大多数的场景下几千万数据单一的模式查询只需要添加正确的索引即可。
高可用的选择
答:SQL自带的高可用或读写分离技术主要有:故障转移群集、发布订阅、镜像、日志传送、AlwaysON可用组(具体可以在进阶问题的资料中详细查看)
一般选用读写分离需要根据不同的场景和要求,比如同步的实时性,读写分离功能的需要情况
主要列出几个优缺点:
故障转移群集:主备模式,单活(辅助机不可读),硬件资源浪费,主要场景是数据库的高可用。
发布订阅:读写分离常用方式,配置灵活,副本节点可以多个,可以发布订阅部分数据(即可以对数据筛选),并提供多种发布订阅模式,缺点:维护比较麻烦,一般不能用作高可用。
镜像:主备模式,单活(辅助机不可读),硬件资源浪费,主要场景是数据库的高可用。相对于故障转移群集镜像是数据库级别的高可用。在镜像中可以使用快照的方式实现读写分离。
日志传送:主要用于灾备,在备用机上可读,但缺点是日志还原时不能读,读时不能还原。
AlwaysON可用组:综合性方案,满足高可用、读写分离等需要,要求:SQL Server2012 以上版本
第三方产品:moebius负载均衡集群,实现双活,读负载均衡、读写分离等。缺点实时同步不适合类似采集系统的大规模写入系统。
服务无法启动
答:服务无法启动有很多原因,需要具体问题具体定位,如果遇到此类问题要首先查看日志定位问题,日志主要两部分,SQL启动日志和windows日志,下面给出两篇经典解析SQL启动的文章:
你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
数据库设计,表设计的问题
大多数这样的问题,在QQ群里问是根本得不到答案的,很多业务场景不是几句话可以描述清楚的。
SQL语句问题
描述:SQL语句增加或者减少一个条件就变得很慢
答:SQL语句的运行变化很微妙,需要理解执行计划,几句话或者贴个图无法解决,一些语句的习惯是需要养成的,请参见:
SQL SERVER全面优化-------写出好语句是习惯
SQL SERVER全面优化-------索引有多重要?
AlwaysOn配置问题
AlwaysOn配置问题请参见桦仔的几篇非常细致的文章:
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
2016的AlwaysOn 搭建:SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
进阶问题
进阶问题中需要对数据库知识有一定的积累,无法几句话概括,所以下面给出一些经典文章的链接:
数据库优化问题整体思路:SQL SERVER全面优化-------Expert for SQL Server 诊断系列
具体细节:SQL Server性能调优系列
数据库巡检及指标
巡检系列:轻松精通数据库管理之道——运维巡检系列