一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - SQL Server常見問題及解決方法分享

SQL Server常見問題及解決方法分享

2020-05-15 15:15Double_K Sql Server

這篇文章主要為大家詳細介紹了SQL Server常見問題及解決方法,包括SQL Server連接問題,SQL Server日志問題,SQL Server查詢很久等問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下

寫在前面

  在QQ群,微信群,論壇中經常幫助使用SQL Server數據庫的朋友解決問題,但是有一些最常見最基本的問題,每天都有人問,回答多了也不想再解答了,索性把這些問題整理一下,再有人問到直接發鏈接。

  一時想法而寫這篇文章,問題可能不全面,后續會一直更新。

基礎問題收集資源下載

  描述:XX版本數據庫操作系統在哪里下載?

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

連接問題

  描述:數據庫連接不上

SQL Server常見問題及解決方法分享

  答:請確認SQL服務是否啟動,用戶密碼是否正確,連接的實例名稱,端口是否正確

SQL Server常見問題及解決方法分享

日志問題

  描述:系統日志LDF滿了 或 日志文件非常大 如何收縮?

  答:簡單恢復模式下SQL Server會自動截斷日志文件,完整模式下需要日志備份

恢復模式查看

SQL Server常見問題及解決方法分享

日志備份的方式

SQL Server常見問題及解決方法分享

收縮日志

SQL Server常見問題及解決方法分享

查詢很久\很慢

  描述:查詢很久都查不出數據,很慢!

  答:這樣的情況出現一般是查詢語句被其他語句阻塞。在查詢中添加 select * from table with (nolock)如果能查出來說明阻塞

  具體的阻塞情況 可以使用sp_who2 或者 sys.dm_exec_requests 視圖查詢

  具體腳本(查看語句運行情況)

?
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

分區表問題

  描述:數據量千萬級別了使用分區表提升性能

  答:分區表的使用場景主要是管理數據,而提升性能主要是靠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 無域集群+負載均衡搭建與簡測

AlwaysOn新建用戶

  首先要明白AlwaysOn可用組中:

  1.只有主節點是可以寫入的,輔助節點只讀

  2.權限分成兩部分,實例級別“登錄名”和數據庫級別“用戶”

  3.在主節點創建登錄名稱并選擇數據庫權限后,因為數據同步,所以從庫上已經有了新創建用戶的數據庫權限,但是沒有登錄名。

  4.不能在輔助節點同樣的方式創建登錄名,這樣就是“用戶孤立”問題

  解決方法:  

  1.在主節點上直接添加的是“登錄名”,比如創建一個登錄名 KK

SQL Server常見問題及解決方法分享

  2.選擇數據庫權限及用戶映射

SQL Server常見問題及解決方法分享

  3.查詢剛才創建“登錄名”的腳本(此腳本也可以用于升級或遷移數據庫還原后,登錄名同步的問題)  

?
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
CREATE PROCEDURE #sp_hexadecimal
 @binvalue varbinary(256),
 @hexvalue varchar (514) OUTPUT
AS
 DECLARE @charvalue varchar (514)
 DECLARE @i int
 DECLARE @length int
 DECLARE @hexstring char(16)
 
 SELECT @charvalue = '0x'
 SELECT @i = 1
 SELECT @length = DATALENGTH (@binvalue)
 SELECT @hexstring = '0123456789ABCDEF'
 WHILE (@i <= @length)
 BEGIN
 DECLARE @tempint int
 DECLARE @firstint int
 DECLARE @secondint int
 SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
 SELECT @firstint = FLOOR(@tempint/16)
 SELECT @secondint = @tempint - (@firstint*16)
 SELECT @charvalue = @charvalue + SUBSTRING(@hexstring, @firstint+1, 1) + SUBSTRING(@hexstring, @secondint+1, 1)
 SELECT @i = @i + 1
 END
 SELECT @hexvalue = @charvalue
GO
 
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @Principal_id int
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
DECLARE @language sysname
DECLARE @rolename sysname
DECLARE login_curs CURSOR FOR SELECT
 p.principal_id,
 p.sid,
 p.name,
 p.type,
 p.is_disabled,
 p.default_database_name,
 p.default_language_name,
 l.hasaccess,
 l.denylogin
FROM
 sys.server_principals p
LEFT JOIN
 sys.syslogins l ON ( l.name = p.name )
WHERE
 p.type IN ( 'S', 'G', 'U' ) AND
 p.name <> 'sa'
 
OPEN login_curs
 
FETCH NEXT FROM login_curs INTO @Principal_id, @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @language, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
 PRINT 'No login(s) found.'
 CLOSE login_curs
 DEALLOCATE login_curs
 RETURN
END
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
 IF (@@fetch_status <> -2)
 BEGIN
 PRINT ''
 SET @tmpstr = '-- Login: ' + @name
 PRINT @tmpstr
 IF (@type IN ( 'G', 'U'))
 BEGIN -- NT authenticated account/group
  SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + '], DEFAULT_LANGUAGE = [' + @language + ']'
 END
 ELSE
 BEGIN -- SQL Server authentication
  -- obtain password and sid
  SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
  EXEC #sp_hexadecimal @PWD_varbinary, @PWD_string OUT
  EXEC #sp_hexadecimal @SID_varbinary,@SID_string OUT
 
  -- obtain password policy state
  SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
  SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
 
  SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + '], DEFAULT_LANGUAGE = [' + @language + ']'
 
  IF ( @is_policy_checked IS NOT NULL )
  BEGIN
  SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
  END
  IF ( @is_expiration_checked IS NOT NULL )
  BEGIN
  SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
  END
 END
 IF (@denylogin = 1)
 BEGIN -- login is denied access
  SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
 END
 ELSE IF (@hasaccess = 0)
 BEGIN -- login exists but does not have access
  SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
 END
 IF (@is_disabled = 1)
 BEGIN -- login is disabled
  SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
 END
 PRINT @tmpstr
 PRINT 'GO'
 DECLARE server_role_members_curs CURSOR FOR
  SELECT
  (SELECT [name] FROM sys.server_principals WHERE principal_id = role_principal_id) AS rolename
  FROM
  sys.server_role_members
  WHERE
  member_principal_id = @Principal_id
 OPEN server_role_members_curs
 
 FETCH NEXT FROM server_role_members_curs INTO @rolename
 WHILE (@@fetch_status <> -1)
 BEGIN
  SELECT @tmpstr = 'EXEC master..sp_addsrvrolemember @loginame = N''' + @name + ''', @rolename = N''' + @rolename + ''''
  PRINT @tmpstr
  PRINT 'GO'
  FETCH NEXT FROM server_role_members_curs INTO @rolename
 END
 CLOSE server_role_members_curs
 DEALLOCATE server_role_members_curs
 END
 FETCH NEXT FROM login_curs INTO @Principal_id, @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @language, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
GO
 
DROP PROCEDURE #sp_hexadecimal
GO

 4.找到查詢出的腳本,在輔助節點運行(其中主要的就是SID)

SQL Server常見問題及解決方法分享

進階問題請大家點擊原文閱讀。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/double-K/archive/2017/01/09/6264814.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女人爽到喷水的视频免费 | 2019亚洲男人天堂 | 天堂樱桃bt在线www | 欧美春宫 | 俄罗斯freeoo性另类 | 欧美草逼网站 | 俄罗斯性高清完整版 | 亚洲欧美日韩国产精品影院 | 亚洲一区二区精品推荐 | 俄罗斯freeⅹ性欧美 | 性色生活片在线观看 | 女子监狱第二季在线观看免费完整版 | 久久成人国产精品一区二区 | jj视频免费观看 | ffee性xxⅹ另类老妇hd | 福利视频导航大全 | 国产中文在线视频 | 免费观看日本人成影片 | 黄色a站| 国产a在线 | 日韩精品视频美在线精品视频 | 免费理伦片在线观看全网站 | 婷婷中文| 99re这里只有精品视频 | 久久久精品免费视频 | 亚洲v日韩v欧美在线观看 | 娇妻被健身教练挺进小说阅读 | 亚洲va久久久久综合 | 国产精品日本亚洲777 | 无人区在线观看免费完整版免费 | 亚洲第五页| 欧美成人手机 | a级毛片毛片免费观看永久 a级黄色片免费 | 国内精品91东航翘臀女神在线 | 91香蕉嫩草| 亚洲 欧美 国产 视频二区 | 91亚洲精品第一综合不卡播放 | 激情影院网站 | 日本十大顶级绝伦推理片 | 欧美在线视频 一区二区 | 全彩孕交漫画福利啪啪吧 |