SQL Server常见问题总结

2022-08-11 00:00:00 数据库 节点 镜像 可用 日志

写在前面

  在QQ群,微信群,论坛中经常帮助使用SQL Server数据库的朋友解决问题,但是有一些常见基本的问题,每天都有人问,回答多了也不想再解答了,索性把这些问题整理一下,再有人问到直接发链接。

   一时想法而写这篇文章,问题可能不全面,后续会一直更新。

基础问题收集

资源下载

  描述:XX版本数据库操作系统在哪里下载?

  答:http://www.itellyou.cn/  里面很多东西,有兴趣的自己看吧

连接问题

  描述:数据库连接不上

  


  答:请确认SQL服务是否启动,用户密码是否正确,连接的实例名称,端口是否正确

  


  

日志问题

  描述:系统日志LDF满了 或 日志文件非常大 如何收缩?

  答:简单恢复模式下SQL Server会自动截断日志文件,完整模式下需要日志备份

  恢复模式查看

  


  日志备份的方式

  


  收缩日志

  


 

  注:很多人使用简单模式习惯了,或者根本不知道自己用的什么模式,但是如果做的镜像,AlwaysOn这类方案日志必定是完整模式。

  日志不能收缩有较多的原因,常见的是没有备份和Replication 也就是使用镜像、AlwaysOn、cdc这些技术的时候日志同步中除了问题或这没有同步完成。

  一般正规军解决方式: 

  • 查看 sys.databases 里面 log_reuse_wait_desc字段 如果是nothing才能收缩 
  • log_reuse_wait_desc 为 backup 需要备份日志
  • Replication 则需要查看镜像、AlwaysOn、cdc这些技术状态是否正常,如果不正常,必须拆除或者调整为正常
  • 依次处理直到nothing才能收缩

  

 

查询很久慢

  描述:查询很久都查不出数据,很慢!

  答:这样的情况出现一般是查询语句被其他语句阻塞。在查询中添加 select * from table with (nolock)如果能查出来说明阻塞

  具体的阻塞情况 可以使用sp_who2 或者 sys.dm_exec_requests 视图查询

  具体脚本(查看语句运行情况)

WITH sess AS
(
SELECT
es.session_id,
database_name = DB_NAME(er.database_id),
er.cpu_time,
er.reads,
er.writes,
er.logical_reads,
login_name,
er.status,
blocking_session_id,
wait_type,
wait_resource,
wait_time,
individual_query = SUBSTRING (qt.text, (er.statement_start_offset/2)+1, ((CASE WHEN er.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE er.statement_end_offset END - er.statement_start_offset)/2)+1),
parent_query = qt.text,
program_name,
host_name,
nt_domain,
start_time,
DATEDIFF(MS,er.start_time,GETDATE()) as duration,
(SELECT query_plan FROM sys.dm_exec_query_plan(er.plan_handle)) AS query_plan
FROM
sys.dm_exec_requests er
INNER JOIN sys.dm_exec_sessions es ON er.session_id = es.session_id
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE
es.session_id > 50
AND es.session_Id NOT IN (@@SPID)
)
SELECT
*
FROM
sess
UNION ALL SELECT
es.session_id,
database_name = '',
0,
0,
0,
0,
login_name,
es.status,
0,
'',
'',
'',
qt.text,
parent_query = qt.text,
program_name,
host_name,
nt_domain,
es.last_request_start_time,
DATEDIFF(MS,es.last_request_start_time,GETDATE()) as duration,
NULL AS query_plan
FROM
sys.dm_exec_sessions es
INNER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle)as qt
WHERE
ec.most_recent_session_id IN
(
SELECT blocking_session_id FROM sess WHERE blocking_session_id NOT IN(SELECT DISTINCT session_id FROM sess)
)
ORDER BY
1, 2

相关文章