--------------------------------------------
-- full & transaction log backup and norecovery mode
--------------------------------------------
-- principal server
backup database mirrortest to disk = 'd:\mssql\share\mirrortest.full'
backup log mirrortest to disk = 'd:\mssql\share\mirrortest.log'
-- mirror server
restore database mirrortest from disk = '\\ip\share\mirrortest.full' with norecovery
restore log mirrortest from disk = '\\ip\share\mirrortest.log' with norecovery
--------------------------------------------
-- mirror mirroring endpoint add
--------------------------------------------
CREATE ENDPOINT [Mirroring] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE, ENCRYPTION = DISABLED)
--------------------------------------------
-- principal mirroring endpoint add
--------------------------------------------
CREATE ENDPOINT [Mirroring] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE, ENCRYPTION = DISABLED)
--------------------------------------------
-- mirroring patner setting (mirror server) partner ip
--------------------------------------------
alter database mirrortest set partner = 'tcp://ip:5022'
--------------------------------------------
-- mirroring patner setting (principal server) partner ip
--------------------------------------------
alter database mirrortest set partner = 'tcp://ip:5022'
--------------------------------------------
-- mirroring start (principal server)
--------------------------------------------
alter database mirrortest set safety full
--------------------------------------------
-- ** mirroring off
--------------------------------------------
alter database mirrortest set partner off
--------------------------------------------
-- ** mirroring failover
--------------------------------------------
alter database mirrortest set partner failover
--------------------------------------------
-- ** mirroring suspend
--------------------------------------------
alter database mirrortest set partner suspend
--------------------------------------------
-- ** mirroring suspend
--------------------------------------------
alter database mirrortest set partner resume
--------------------------------------------
-- ** mirroring endpoint
--------------------------------------------
SELECT name, port FROM sys.tcp_endpoints;
--------------------------------------------
-- ** mirroring status
--------------------------------------------
select
db.name,
db.state_desc,
dm.mirroring_role_desc, --**
dm.mirroring_state_desc, --**
dm.mirroring_safety_level_desc, --**
dm.mirroring_partner_name,
dm.mirroring_partner_instance
from sys.databases db
inner join sys.database_mirroring dm
on db.database_id = dm.database_id
where dm.mirroring_role_desc is not null
order by db.name
--------------------------------------------
-- ** go home~
--------------------------------------------
ALTER DATABASE [databaseName] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS'보미아빠, 석이'에 해당되는 글 532건
- 2024.02.02 미러링
- 2023.11.17 암호화
- 2023.11.17 TLS 1.0 , 1.1 disable
- 2023.11.17 sweet32 취약점 제거
- 2023.11.17 sql server 2016 fallback 인증서 알고리즘 변경
- 2023.09.26 deadlock waitresource = object
- 2023.09.18 윈도우 콘솔 언어 바꾸어 표시하기
- 2023.09.13 AD SQL서버가 윈도우 인증으로 로그인이 안되면
- 2023.08.22 원격제어, 원격데스크톱 chrome
- 2023.08.11 delayed durability
아래 github 소스는 어플리케이션과 SQL 어디에서든 암호화 복호화가 가능한 방법입니다.
sql(암호화) -> sql(복호화)
c#(암호화) -> c#(복호화)
sql(암호화) -> c#(복호화)
c#(암호화) -> sql(복호화)
https://github.com/krcs/SQLServerCrypto
-- sql sample
EncryptByPassPhrase 와 DecryptByPassPhrase 를 이용한 암호화 방법
IF OBJECT_ID ('PasswordKey') IS NOT NULL
DROP FUNCTION dbo.PasswordKey
GO
CREATE FUNCTION PasswordKey()
RETURNS varchar(100)
WITH ENCRYPTION
AS
BEGIN
RETURN 'P@ssw0rd'
END
go
SELECT EncryptByPassPhrase(dbo.passwordkey(), 'target message')
GO
-- 결과
-- 0x0100000093B09F6A22BD125C758C41C0B7C1EF5EA5433F5B31FD71E3D3CFF8C073C2ECEB
SELECT CAST(DecryptByPassPhrase(dbo.passwordkey(), 0x01000000068564F4F8218FE14236AD6EA97FD0EA6A9146C91C2F7ABDC69FE7E96AB7CDB8) as varchar(8000))
-- 결과
-- target message
TLS 1.0 , 1.1 disable
# TLS 1.0, 1.1 을 서버에서 disable 하는게 문제가 아니라 client 가 TLS 1.0, 1.1 을 써 통신하는게 있다면, 서버에서 막으면 장애난다.
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v DisabledByDefault /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client" /v DisabledByDefault /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v DisabledByDefault /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v DisabledByDefault /t REG_DWORD /d 1 /f
sweet32 취약점 제거
# sweet32 취약점 해결을 위해 아래 regedit 에서 function 에서 3가지를 삭제하고 물리 서버를 재시작 한다.
KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002 이 값 편집
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA * 제거
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_RC4_128_SHA * 제거
TLS_RSA_WITH_RC4_128_MD5 * 제거
TLS_RSA_WITH_NULL_SHA256
TLS_RSA_WITH_NULL_SHA
TLS_PSK_WITH_AES_256_GCM_SHA384
TLS_PSK_WITH_AES_128_GCM_SHA256
TLS_PSK_WITH_AES_256_CBC_SHA384
TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_PSK_WITH_NULL_SHA384
TLS_PSK_WITH_NULL_SHA256
# 아래 처럼 만들기
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_NULL_SHA256
TLS_RSA_WITH_NULL_SHA
TLS_PSK_WITH_AES_256_GCM_SHA384
TLS_PSK_WITH_AES_128_GCM_SHA256
TLS_PSK_WITH_AES_256_CBC_SHA384
TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_PSK_WITH_NULL_SHA384
TLS_PSK_WITH_NULL_SHA256
sql server 2016 fallback 인증서 알고리즘 변경
# sql 2016 는 SP3 업그레이드 필요 (CSAP), 아래내용 적용
# sql 2017 19는 할 필요 없음
# New-SelfSignedCertificate 생성
New-SelfSignedCertificate -Type SSLServerAuthentication -Subject "CN=$env:COMPUTERNAME" `
-DnsName ("{0}" -f [Systehttp://m.Net.Dns]::GetHostByName($env:computerName).HostName),'localhost' `
-KeyAlgorithm "RSA" -KeyLength 2048 -HashAlgorithm "SHA256" -TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.1" `
-NotAfter (Get-Date).AddMonths(36) -KeySpec KeyExchange -Provider "Microsoft RSA SChannel Cryptographic Provider" `
-CertStoreLocation "cert:\LocalMachine\My"
# 결과
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
aaa5E3ddd742dd7AE1D4A8C648FC556F5B9D90003 CN=HOSTNAME.....
# 서버의 인증서 조회
dir cert:\LocalMachine\My
mmc 에서 인증서 항목을 추가하고 local computer 의 인증서를 조회해 export 가능
인증서에 해당 사용자 권한을 추가해 줘야 함
# SQL Server 2016 의 경우 아래의 방법으로 등록 (SqlServerConfigurationManager 에서 로딩이 안되더라)
$regPath = 'HKLM:\Software\Microsoft\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQLServer\SuperSocketNetLib'
$thumbprint = 'aaa5E3ddd742dd7AE1D4A8C648FC556F5B9D90003'
Set-ItemProperty $regPath -Name 'Certificate' -Value $thumbprint
# 이건 강제하고 싶을때만 하면 된다.
#Set-ItemProperty $regPath -Name 'ForceEncryption' -Value 1 -Type Dword
# sql 2019 이상에서는 네트워크 설정에서 인증서 로딩 (로딩 전 이전 서버의 인증서 복구 해두어야 한다.)
# 아래 링크 2개 잘 읽어봐~
https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/manage-certificates?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-sql-server-encryption?view=sql-server-ver15#step-2-configure-encryption-settings-in-sql-server
# SqlServerConfigurationManager 에서 restart
deadlock waitresource = object
데드락 발생시 extended events 로 캡처 후 내용을 xdl로 저장하면 아래와 같은 그래프로 볼 수 있다.
잠금 리소스가 "개체 잠금"이라는 특이한 현상 발생

waitresource = OBJECT: 5:1829893886:8 이거라고 한다. (databaseid, objectid, lockPartition)
clustered type primary key만 있는 테이블이며, 형 변환 없이 정확히 쿼리하는데 deadlock 이 발생함
윈인은 테이블 생성시 allow_row_locks 와 allow_page_locks 를 disable 해두었음.
해결 방법
ALTER INDEX PK_XX ON XX
REBUILD WITH (ONLINE = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON )
Deadlock XDL
<deadlock>
<victim-list>
<victimProcess id="process19727d3bc28" />
</victim-list>
<process-list>
<process id="process19727d3bc28" taskpriority="0" logused="0" waitresource="OBJECT: 5:1829893886:8 " waittime="616" ownerId="132371886315" transactionname="DELETE" lasttranstarted="2023-09-25T09:34:29.420" XDES="0x27c1e900460" lockMode="X" schedulerid="20" kpid="1476" status="suspended" spid="9848" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2023-09-25T09:34:29.420" lastbatchcompleted="2023-09-25T09:34:29.420" lastattention="1900-01-01T00:00:00.420" clientapp="Microsoft JDBC Driver for SQL Server" hostname="avdataapi031.cafe" hostpid="0" loginname="xx" isolationlevel="read uncommitted (1)" xactid="132371886315" currentdb="5" currentdbname="xxBBS5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="132" stmtend="550" sqlhandle="0x02000000dfb0370dbca820a19a4c8bdee0c0272fe194f8980000000000000000000000000000000000000000">
unknown </frame>
<frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@P0 int,@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))DELETE FROM dbo.XX
WHERE xxid = @P0
AND startDate = CAST(@P1 AS CHAR(8))
AND endDate = CAST(@P2 AS CHAR(8))
AND memberId = CAST(@P3 AS VARCHAR(20)) </inputbuf>
</process>
<process id="process1972770f848" taskpriority="0" logused="0" waitresource="OBJECT: 5:1829893886:0 " waittime="616" ownerId="132371886316" transactionname="DELETE" lasttranstarted="2023-09-25T09:34:29.420" XDES="0x1938d11c460" lockMode="X" schedulerid="9" kpid="10696" status="suspended" spid="10300" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2023-09-25T09:34:29.420" lastbatchcompleted="2023-09-25T09:34:29.420" lastattention="1900-01-01T00:00:00.420" clientapp="Microsoft JDBC Driver for SQL Server" hostname="avdataapi019.cafe" hostpid="0" loginname="xx" isolationlevel="read uncommitted (1)" xactid="132371886316" currentdb="5" currentdbname="xxBBS5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="132" stmtend="550" sqlhandle="0x02000000dfb0370dbca820a19a4c8bdee0c0272fe194f8980000000000000000000000000000000000000000">
unknown </frame>
<frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@P0 int,@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))DELETE FROM dbo.XX
WHERE xxid = @P0
AND startDate = CAST(@P1 AS CHAR(8))
AND endDate = CAST(@P2 AS CHAR(8))
AND memberId = CAST(@P3 AS VARCHAR(20)) </inputbuf>
</process>
</process-list>
<resource-list>
<objectlock lockPartition="8" objid="1829893886" subresource="FULL" dbid="5" objectname="xxBBS5.dbo.XX" id="lock1905d4c0680" mode="IX" associatedObjectId="1829893886">
<owner-list>
<owner id="process1972770f848" mode="IX" />
</owner-list>
<waiter-list>
<waiter id="process19727d3bc28" mode="X" requestType="wait" />
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="1829893886" subresource="FULL" dbid="5" objectname="xxBBS5.dbo.XX" id="lock1054afcec00" mode="X" associatedObjectId="1829893886">
<owner-list>
<owner id="process19727d3bc28" mode="X" />
</owner-list>
<waiter-list>
<waiter id="process1972770f848" mode="X" requestType="wait" />
</waiter-list>
</objectlock>
</resource-list>
</deadlock>
확인용 쿼리
SELECT name, allow_row_locks, allow_page_locks
FROM sys.indexes
AND allow_row_locks = 0
AND allow_page_locks = 0
RID 잠금이 유지되거나 요청되는 테이블 내의 단일 행을 식별합니다. RID는 RID: db_id:file_id:page_no:row_no 표시됩니다. 예들 들어 RID: 6:1:20789:0입니다.
OBJECT 잠금이 유지되거나 요청되는 테이블을 식별합니다. OBJECT은 OBJECT: db_id:object_id(으)로 표시됩니다. 예들 들어 TAB: 6:2009058193입니다.
KEY 잠금이 유지되거나 요청되는 인덱스 내의 키 범위를 식별합니다. KEY는 KEY: db_id:hobt_id(index key hash value) 표시됩니다. 예들 들어 KEY: 6:72057594057457664 (350007a4d329)입니다. %%lockres%% 로 쿼리 가능
PAG 잠금이 보유 또는 요청된 페이지 리소스를 식별합니다. PAG는 PAG: db_id:file_id:page_no 표시됩니다. 예들 들어 PAG: 6:1:20789입니다.
EXT 익스텐트 구조를 식별합니다. EXT는 EXT: db_id:file_id:extent_no 표시됩니다. 예들 들어 EXT: 6:1:9입니다.
DB 데이터베이스 잠금을 식별합니다. DB는 다음 방법 중 하나로 표시됩니다.
DB: db_id
DB: db_id[BULK-OP-DB]백업 데이터베이스에서 수행한 데이터베이스 잠금을 식별합니다.
DB: db_id[BULK-OP-LOG]특정 데이터베이스에 대한 백업 로그가 취한 데이터베이스 잠금을 식별합니다.
APP 애플리케이션 리소스에서 수행한 잠금을 식별합니다. APP은 APP: lock_resource 표시됩니다. 예들 들어 APP: Formf370f478입니다.
METADATA 교착 상태에 관련된 메타데이터 리소스를 나타냅니다. METADATA에는 많은 하위 리소스가 있으므로 반환되는 값은 교착 상태가 있는 하위 리소스에 따라 달라집니다. 예를 들어 METADATA.USER_TYPE는 user_type_id = *integer_value*를 반환합니다. METADATA 리소스 및 하위 리소스에 대한 자세한 내용은 sys.dm_tran_locks를 참조하세요.
HOBT 교착 상태와 관련된 힙 또는 B-트리를 나타냅니다.
WITH cteDeadLocks ([Deadlock_XML])
AS (SELECT CAST (target_data AS XML) AS [Deadlock_XML]
FROM sys.dm_xe_sessions AS xs
INNER JOIN sys.dm_xe_session_targets AS xst
ON xs.[address] = xst.event_session_address
WHERE xs.[name] = 'system_health'
AND xst.target_name = 'ring_buffer')
SELECT x.Graph.query('(event/data/value/deadlock)[1]') AS Deadlock_XML,
x.Graph.value('(event/data/value/deadlock/process-list/process/@lastbatchstarted)[1]', 'datetime2(3)') AS when_occurred,
DB_Name(x.Graph.value('(event/data/value/deadlock/process-list/process/@currentdb)[1]', 'int')) AS DB --Current database of the first listed process
FROM (SELECT Graph.query('.') AS Graph
FROM cteDeadLocks AS c
CROSS APPLY c.[Deadlock_XML].nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS Deadlock_Report(Graph)) AS x
ORDER BY when_occurred DESC;윈도우 콘솔 언어 바꾸어 표시하기
-- 언어 변경
cmd /c chcp 437
-- 상태 모니터링
netsh int tcp show global
netsh int tcp show chimneystats
netstat -nt | findstr /i offloaded
-- 변경
netsh int tcp set global chimney=enabled
netsh int tcp set global chimney=disabled
TCP Chimney offload is deprecated technology: Windows Server 2022, Windows Server 2019, Windows Server 2016
AD SQL서버가 윈도우 인증으로 로그인이 안되면
https://github.com/microsoft/CSS_SQL_Networking_Tools/wiki/SQLCHECK
SQLCHECK
Tools used by the SQL Networking Customer Support Team - microsoft/CSS_SQL_Networking_Tools
github.com
위 프로그램을 사용해 리포트를 수집한다.
SQL Server start Account 가 올바르게 SPN 등록되었는지 확인한다.
Account SPN Has Duplicates
------------ ------------------------------------------------------ --------------
computername$ MSSQLSvc/computername.test.domain.local:1433 False
위는 start 계정이 아니라 컴퓨터로 등록된 경우이다. 이걸 삭제하고 올바르게 등록한다.
서비스 시작 계정을 변경하기위해
계정을 변경하고, sql 을 원하는 시간에 재시작 하려면 아래의 과정을 테스트 해보고 적용한다.
1) spn 을 새로운 계정으로 등록
2) services.msc 에서 아이디와 암호를 변경해둔다.
3) 서비스 점검 시간에 해당 서버를 재시작
0. SPN 확인
* 컴퓨터 네임으로 spn이 등록되어 있으면 AD 계정으로 로그인이 안되는 현상이 일어난다.
* 원인은 services.msc 에서 변경하면 이런 현상이 일어난다. 이런 현상을 발생하지 않게 하려면 계정을 sqlserver configureation manager 에서 변경해야 한다. (당황스럽네..)
일단 컴퓨터 이름으로 spn이 등록된것이 있는지 쿼리한다. SPN 이 hostname으로 등록되어 있으면 안된다.
setspn -T adDomain -q */hostname
위 프로그램을 사용하기 싫으면 sql 스타트 계정이 올바르게 등록 되어 있는지 확인 한다.
example)
setspn -L sqlServiceAccount > c:\spn.txt
notepad c:\spn.txt
1. SPN 삭제
명령 프트를 관리자 권한으로 실행한 후, 다음 명령을 사용하여 SPN을 삭제합니다.
setspn -D <문제되는 SPN> <문제되는 SPN이 등록된 계정 이름>
example) $ 가 있는지 없는지는 위 쿼리에서 나오는 결과를 보고 판단한다.
setspn -D MSSQLSvc/computername.test.domain.local:1433 computername$
setspn -D MSSQLSvc/computername.test.domain.local:1433 computername
2. 수동 등록
SQL Server 서비스 시작 계정(도메인 계정)을 사용하여 SPN을 등록합니다.
setspn -A <SPN> <SPN을 등록할 계정 이름>
example)
setspn -A MSSQLSvc/omputername.test.domain.local sqlServiceAccount
setspn -A MSSQLSvc/omputername.test.domain.local:1433 sqlServiceAccount
AD 에 합류된 서버를 재설치 할때는 AD 에서 제외시켜주고 다시 설치하고 Join 해주도록 하자
아래는 참고
Setspn
Table of contents Setspn Article 08/31/2016 In this article --> Applies To: Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows 8 Reads, modifies, and deletes the Service Principal Names (SPN) directory property for an Active Directo
learn.microsoft.com
원격제어, 원격데스크톱 chrome
chrome 웹 브라우저로 mac windows 구분없이 원격지원 하기
1. https://remotedesktop.google.com/support 에 들어가서 플러그인을 설치 한다.
2. 화면 공유 메뉴에서 코드 생성을 클릭한다.

3. 지원해줄 사람에게 코드를 전달한다.
4. 지원해줄 사람은 다른 컴퓨터 연결 메뉴에 공유된 코드를 입력한다.

5. 지원 오른쪽 화면에서 > 메뉴를 클릭하고 마우스 제어를 클릭하면 상대방 컴퓨터 제어가 가능하다.
* 같은 아이디로 chrome 에 로그인 하면, 원격 데스크톱 기능도 사용 가능하다.
* back space 를 누르자마자 원격지원이 끊어지면 back space go back 이라는 플러그인을 제거한다.
delayed durability
ALTER DATABASE ... SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
