'서버를 사용할 수 없습니다' 서버의 MSDTC
SQL Server에서 이 이상한 오류가 발생합니다.그리고 이전 게시물에서는 해결책을 찾을 수 없습니다.
다음 절차가 있습니다.
create proc _upJM_SyncAll_test
as
begin
DECLARE @SQLString nvarchar(max)
set @SQLString = N'
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setitemprices'') where acSubject not in (select acSubject from _uvJM_SetSubj)
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setsubj'') where acSubject not in (select acSubject from _uvJM_SetSubj)
update a
set acName2 = b.acName2,
acName3 = b.acName3,
acAddress = b.acAddress,
acPost = b.acPost,
acPostName = b.acPostName,
acCountry = b.acCountry,
acVATCodePrefix = b.acVATCodePrefix,
acCode = b.acCode,
anDaysForPayment = b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where 1=1
and ( isnull(a.acName2,'''') <> isnull(b.acName2,'''') OR
isnull(a.acName3,'''') <> isnull(b.acName3,'''') OR
isnull(a.acAddress,'''') <> isnull(b.acAddress,'''') OR
isnull(a.acPost,'''') <> isnull(b.acPost,'''') OR
isnull(a.acPostName,'''') <> isnull(b.acPostName,'''') OR
isnull(a.acCountry,'''') <> isnull(b.acCountry,'''') OR
isnull(a.acVATCodePrefix,'''') <> isnull(b.acVATCodePrefix,'''') OR
isnull(a.acCode,'''') <> isnull(b.acCode,'''') OR
isnull(a.anDaysForPayment,'''') <> isnull(b.anDaysForPayment,'''')
)
insert into OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') (acSubject, acName2, acName3, acAddress, acPost, acPostName, acCountry, acVATCodePrefix, acCode, anDaysForPayment)
select b.acSubject, b.acName2, b.acName3, b.acAddress, b.acPost, b.acPostName, b.acCountry, b.acVATCodePrefix, b.acCode, b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a right join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where a.acSubject is null '
EXECUTE sp_executesql @SQLString;
end
관리 스튜디오에서 다음과 같은 절차를 실행할 경우:
exec dbo._upJM_SyncAll_test
모든 것이 괜찮습니다.오류가 없습니다. 동기화는 정상적으로 작동합니다.
하지만 이렇게 실행을 트리거에 넣으면,
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
exec dbo._upJM_SyncAll_test
end
다음 오류가 발생했습니다.
16, 3, 프로시저 8501, § 16, § 3, 상태 _upJM_SyncAll_test, § 54
할 수 없습니다 'server' 서버의 MSDTC입니다.
프로시저 _upJM_SyncAll_test에 39줄만 있습니다...
저의 경우 서비스가 중지되었습니다. 해결 방법: MSDTC 서비스를 켜야 합니다.
- 서비스로 이동합니다. (시작 > 설정 > 제어판 > 관리도구 > 서비스)
- '분산거래 코디네이터'라는 서비스를 찾아 오른쪽 클릭(그 위에서 선택) > 시작
- 이 서비스를 자동으로 실행하여 이 문제를 영구적으로 해결합니다.
트리거는 문 삽입, 업데이트 및 삭제에 필요한 암시적 트랜잭션에 포함됩니다.사용자가 트랜잭션 내의 연결된 서버에 연결되어 있으므로 SQL Server는 해당 서버를 분산 트랜잭션으로 승격합니다.
MSDTC를 구성해야 합니다. MMC를 열고 MSDTC 플러그인을 로드하거나 다음 스크립트를 사용하여 인바운드 및 아웃바운드 트랜잭션을 열 수 있습니다.
https://technet.microsoft.com/en-us/library/cc731495.aspx
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccess
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessTransactions
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessInbound
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessOutbound
PAUSE
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccess /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessTransactions /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessInbound /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessOutbound /t REG_DWORD /d 1
PAUSE
net stop MSDTC
net start MSDTC
PAUSE
같은 오류가 발생했지만 분산 트랜잭션 코디네이터 서비스가 실행되지 않는 것만큼 간단하지 않았습니다.윈도우를 통해 자동으로 드라이버 업데이트를 받았는데, 이로 인해 COM+에 문제가 발생하고 MSDTC 서비스가 실행 중임에도 불구하고 MSDTC가 제대로 통신하지 못하게 되었습니다.저의 경우 HP 단축키 드라이버에 문제가 있었지만, 조사를 해보니 다른 제조업체의 오디오 드라이버에 문제가 있다는 다른 보고서도 발견되었습니다.
유사한 문제가 있는지 확인하려면 Component Services(dcomcnfg.exe)를 시작한 다음 Component Services > Components > Computers > My Computer를 확장합니다.여기서 'COM+ 응용 프로그램'을 클릭하여 "COM+가 Microsoft Distributed Transaction Coordinator와 대화할 수 없습니다"라는 오류가 팝업되는지 또는 탐색의 내 컴퓨터 아이콘 위에 빨간색 오류가 표시되는지 확인합니다.
저를 위한 해결책은 'HP 핫키 서비스'와 '핫키 서비스'를 비활성화하는 것이었습니다.UWP" 서비스.이러한 기능이 비활성화되면 MSDTC가 즉시 작동하기 시작합니다.
충돌하는 서비스/드라이버를 비활성화하여 문제가 해결되었습니다.HP 서비스(HP App Helper, HP CASL, HP System Info)를 모두 비활성화하고 이제 정상적으로 작동합니다.
'분산 트랜잭션 코디네이터' 서비스가 실행되지 않아 서비스를 시작하고 서비스 유형도 자동으로 변경되었습니다.
원격 서버에 Microsoft SQL Server의 명명된 인스턴스가 있었는데 애플리케이션의 오류 출력은 다음과 같습니다.
System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'SERVER\INST_NAME' is unavailable.
SERVER 교체와 같은 SQL 연결 문자열 실험\INST_NAME with SERVER,TCP_PORT_NUMBER가 도움이 되지 않았습니다.동일한 오류가 계속 발생하여 SQL Server 이름이 SERVER로만 변경되도록 기본 인스턴스(MSSQLSERVER)를 설치하기로 결정했습니다.RPC 및 MSDTC가 이름 해결을 시작하면서 문제가 해결되었습니다.
파워셸 솔루션:
Get-Service -Name MSDTC | Set-Service -StartupType Automatic
최근에 이것이 제 작업 기계에 문제로 나타났습니다(Win 10, MSSQL 2016 SP2 Express).연결된 서버가 없습니다.이것은 아무것도 아닌 것에서 나타났습니다.MSDTC 서비스가 실행 중입니다. MSSQL은 관리 스튜디오를 사용하여 정상적으로 작동합니다.그런데 저는.NET 4.7.1 유닛 테스트 앱이 "서버의 MSDTC '...'를 사용할 수 없습니다" 오류와 함께 데이터베이스와의 연결을 거부합니다.
제가 발견한 일시적 해결 방법은 연결 문자열 끝에 "Enlist=False;"를 추가하여 연결에 MSDTC를 전혀 사용하지 않도록 하는 것입니다.
이 솔루션의 출처는 다음 주제에 대한 의견입니다. https://learn.microsoft.com/en-us/archive/blogs/distributedservices/intermittent-error-msdtc-on-server-servername-is-unavailable
저는 Azure SQL을 제외하고는 같은 문제를 겪고 있었습니다. (누군가 Azure SQL과 같은 문제를 겪고 있을 경우를 대비하여 이 글을 여기에 올립니다.)읽기 전용 옵션(응용프로그램)으로 응용프로그램 의도를 설정했기 때문입니다.Azure에서 Read Scale Out 옵션을 사용하여 Azure SQL DB에 연결할 때 Intent=ReadOnly).
빠른 수정을 위해 애플리케이션을 제거했습니다.응용 프로그램의 Intent=ReadOnly 구성입니다.
적절한 솔루션과 함께 이에 대한 더 나은 아이디어를 얻으려면 아래 링크를 따르십시오.
언급URL : https://stackoverflow.com/questions/29414250/msdtc-on-server-server-is-unavailable
'programing' 카테고리의 다른 글
| 외부 항아리에서 만든 봄콩을 @자동 배선하려면 어떻게 해야 합니까? (0) | 2023.08.06 |
|---|---|
| 검색 엔진 - Lucene 또는 Solr (0) | 2023.08.06 |
| 테이블에 값 삽입 Oracle SQL (0) | 2023.08.06 |
| 각도:HttpClient에서 파일을 다운로드하는 방법은 무엇입니까? (0) | 2023.08.06 |
| 저장 프로시저 SQLWARN 종료 처리기가 호출되지 않았습니다. (0) | 2023.08.06 |