Ошибка связанного сервера при использовании MSDTC - PullRequest
1 голос
/ 10 января 2009

Я показываю пример хранимой процедуры для транзакции данных с использованием «Связанного сервера» между двумя системами через Интернет

Alter Proc [dbo].[usp_Select_TransferingDatasFromServerCheckingforExample]

@RserverName varchar(100), ----- Server Name  
@RUserid Varchar(100),           ----- server user id
@RPass Varchar(100),              ----- Server Password 
@DbName varchar(100)           ----- Server database    

As
Set nocount on
Set Xact_abort on
Declare @user varchar(100)
Declare @userID varchar(100)
Declare @Db Varchar(100)
Declare @Lserver varchar(100)
Select @Lserver = @@servername
Select @userID = suser_name()
select @User=user
Exec('if exists(Select 1 From [Master].[' + @user + '].[sysservers] where srvname = ''' + @RserverName + ''') begin Exec sp_droplinkedsrvlogin ''' +  @RserverName + ''',''' + @userID + ''' exec sp_dropserver ''' + @RserverName + ''' end ')


set @RserverName='['+@RserverName+']'
declare @ColumnList varchar(max)
set @ColumnList = null
select  @ColumnList = case when @ColumnList is not null then @ColumnList + ',' + quotename(name) else quotename(name) end  from syscolumns where id = object_id('bditm') order by colid
set identity_insert Bditm on
exec ('Insert Into Bditm ('+ @ColumnList +') Select * From '+ @RserverName + '.'+ @DbName + '.'+ @user + '.Bditm')
set identity_insert Bditm off

set @RserverName=replace(replace(@RserverName,'[',''),']','')

Exec sp_droplinkedsrvlogin  @RserverName,@userID
Exec sp_dropserver @RserverName

Когда я запускаю хранимую процедуру, я получаю разные ошибки в разное время выполнения

Некоторое время показывает эту ошибку

"The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ServerName" was unable to begin a distributed transaction."

В другой раз показывает этот тип ошибки

OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Protocol error in TDS stream".
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 10054, Level 16, State 1, Line 0
TCP Provider: An existing connection was forcibly closed by the remote host.

Я использую Windows Xp и SQL Server 2005 на стороне клиента, а также Windows Server 2003 и Sql server 2005 в сетевом сервере

Я устанавливаю MSDTC в обеих системах

Как я могу решить эту проблему (а также дать правильную информацию для установки MSDTC в Windows XP и Windows Server 2003)

Ответы [ 5 ]

1 голос
/ 17 декабря 2010

Вы также должны проверить разрешение имен DNS в конфигурации IP-сети.

Например, у вас есть сервер с именем server-a.mydomain.com и еще один с именем server-b.otherdomain.com , войдите на сервер server- a и выполните ping server-b (без домена).

Если он отвечает « Пинг-запрос не может найти хост-сервер-b. Пожалуйста, проверьте имя и повторите попытку. », в этом проблема.

Перейдите в Панель управления> Сетевые подключения> Щелкните правой кнопкой мыши сетевую карту> свойства> Интернет-протокол> Свойства> Дополнительно> DNS> Добавьте этот DNS-суффикс по порядку. А здесь добавьте локальный домен: mydomain.com , а затем добавьте удаленный домен: otherdomain.com . Нажимайте OK, пока не выйдете

Теперь, если вы выполните ping-сервер * b , он должен ответить примерно так:

Pinging server-b.otherdomain.com [192.168.1.2] с 32 байтами данных: Ответ от 192.168.1.2: bytes = 32 time = 12ms TTL = 64 Ответ от 192.168.1.2: bytes = 32 time = 9ms TTL = 64

Теперь попробуйте снова выполнить распределенную транзакцию.

1 голос
/ 22 декабря 2009

Я могу подтвердить, что это проблема с сетевым подключением. Я видел это раньше.

Агенты MSDTC должны иметь возможность подключаться ко всем экземплярам базы данных, которые они координируют.

Был какой-то MS-сертифицированный процесс для тестирования этого ... Google для MSDTC пинг.

1 голос
/ 12 января 2009

Я согласен с приведенным выше сообщением, что это может быть проблема с протоколом, но может потребоваться использование именованных каналов в качестве интерфейса.

Или может быть, что учетная запись пользователя, под которой работает служба DTC, имеет только локальные права и не имеет прав в сети. Используйте учетную запись домена с достаточными правами на обеих машинах для запуска DTC в.

Или же может потребоваться запустить распределенную транзакцию с BEGIN DISTRIBUTED TRANSACTION на внешнем интерфейсе вашего процесса.

1 голос
/ 13 января 2009
0 голосов
/ 12 января 2009

Долго, но я столкнулся с похожей проблемой некоторое время назад, на MSSQL Server 7. Оказалось, что обе системы должны были связываться друг с другом по именам NetBios, и поскольку они не были частью домена ( но общались по глобальной сети, как в вашем случае).

Простое решение, по крайней мере, чтобы проверить, так ли это, состоит в том, чтобы отредактировать файл lmhosts, чтобы сопоставить имя компьютера каждого из них с его IP-адресом (как на клиенте, так и на сервере).

См. Несколько запутанный пост, который я сделал тогда: http://groups.google.com/group/microsoft.public.sqlserver.server/browse_thread/thread/2c246bd2afc7c4d9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...