При создании этой статьи были использованы ресурсы:
- Upgrading from SQL Server 7.0 to SQL Server 2000
- How to transfer logins and passwords between instances of SQL Server
- Transfer DTS packages. Эта статья не доступна, я использовал версию из кэша Google
Для перехода SQL Server 7.0 на SQL Server 2000 можно просто установить SQL Server 2000 поверх SQL Server 7.0. А можно установить SQL Server 2000 параллельно с SQL Server 7.0 и переносить данные вручную. Эта статья и описывает процесс полного переноса всего необходимого со старого сервера на новый при параллельной установке.
Перенос баз данных с SQL Server 7.0 на SQL Server 2000, используя Copy Database Wizard.
Порядок действий при переносе или копировании баз данных средствами Copy Database Wizard:
- Развернуть группу серверов, развернуть сервер.
- После правого щелчка по серверу выбрать All Tasks и выбрать Copy Database Wizard.
- Выполнить шаги в соответствии с указаниями мастера.
Используя Copy Database Wizard, можно перемещать и копировать базы данных и связанные с ними метаданные с SQL Server 7.0 на экземпляр SQL Server 2000 без необходимости выключать сервер из работы. Преимущества онлайн переноса баз данных:
Нет необходимости выключать сервер для переноса.
- Есть возможность выбора баз данных, которые необходимо перенести (скопировать). При этом можно оставить базы на SQL Server 7.0.
- При переносе (копировании) баз данных есть возможность переносить и метаданные. Например, логины, задания, специфические пользовательские объекты, связанные с пользовательской базой данных.
- Процесс может быть произведен в любое время.
Database Copy Wizard работает, используя возможность отсоединять и присоединять пользовательскую базу, для перемещения (копирования) с SQL Server 7.0 на SQL Server 2000. Действия по копированию выполняет пакет службы переноса данных (DTS). Возможно создание задания, которое выполнит процесс перемещения (копирования) баз в установленное время.
Copy Database Wizard не может быть использован в следующих случаях:
- Для баз данных с одинаковыми именами на SQL Server 7.0 и на SQL Server 2000. Эти базы данных нельзя будет переместить или копировать.
- Для баз данных участвующих в репликации.
Для предотвращения повреждения баз данных неплохо, если бы они были в режиме только для чтения и не могли быть переименованы по ходу процесса переноса. Любые конфликты между источником и целевым серверами должны быть разрешены вручную до начала процесса переноса (копирования).
Если вы перемещаете или копируете несколько баз данных за раз, то каждая база переносится по отдельности. То есть база отсоединяется, копируются файлы баз данных и присоединяются. DTS сообщает о возникших проблемах или успешном выполнении операции во время процесса переноса (копирования) баз.
Передача логинов и паролей между серверами SQL Server 7.0 и SQL Server 2000 или между SQL Server 2000 серверами
После переноса баз данных с одного сервера на другой некоторые пользователи не смогут залогиниться на новом сервере. При этом получая сообщение Msg 18456, Level 16, State 1 Login failed for user ‘%ls’. Это означает, что необходимо перенести логины и пароли на новый сервер.
Для переноса логинов и паролей с SQL Server 7.0 на экземпляр SQL Server 2000 или между двумя экземплярами SQL Server 2000 можно использовать DTS Package Transfer Logins Task из SQL Server 2000. Для этого необходимо проделать следующее:
- Открыть SQL Server 2000 в SQL Server Enterprise Manager. В разделе Data Transformation Services выбрать Local Packages и создать новый пакет.
- После открытия DTS packages designer кликнуть Transfer Logins Task в меню Task. Заполнить информацию о сервере источнике, целевом сервере и логинах.
Компоненты DTS не доступны в 64-битной версии SQL Server 2000.
Этот метод перенесет пароли, но не оригинальные SID. Если логин создан с неоригинальным SID, то после переноса базы данных пользователь не сможет работать в базе данных из-за несоответствия логина и его SID. Во избежание подобных проблем необходимо использовать приведенный ниже скрипт.
Полное перемещение логинов и паролей между различными версиями SQL Server
Запустить скрипт, который создаст хранимую процедуру sp_help_revlogin. После того как скрипт отработает и будет создана нужная хранимая процедура, на целевом сервере нужно выполнить процедуру sp_help_revlogin, которая создаст логины с оригинальными SID. Скрипт
----- Begin Script, Create sp_help_revlogin procedure ----- USE master GO IF OBJECT_ID ( 'sp_hexadecimal' ) IS NOT NULL DROP PROCEDURE sp_hexadecimal GO CREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar (256) OUTPUT AS DECLARE @charvalue varchar (256) 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 IF OBJECT_ID ( 'sp_help_revlogin' ) IS NOT NULL DROP PROCEDURE sp_help_revlogin GO CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS DECLARE @ name sysname DECLARE @xstatus int DECLARE @binpwd varbinary (256) DECLARE @txtpwd sysname DECLARE @tmpstr varchar (256) DECLARE @SID_varbinary varbinary(85) DECLARE @SID_string varchar (256) IF (@login_name IS NULL ) DECLARE login_curs CURSOR FOR SELECT sid, name , xstatus, password FROM master..sysxlogins WHERE srvid IS NULL AND name <> 'sa' ELSE DECLARE login_curs CURSOR FOR SELECT sid, name , xstatus, password FROM master..sysxlogins WHERE srvid IS NULL AND name = @login_name OPEN login_curs FETCH NEXT FROM login_curs INTO @SID_varbinary, @ name , @xstatus, @binpwd IF (@@fetch_status = -1) BEGIN PRINT 'No login(s) found.' CLOSE login_curs DEALLOCATE login_curs RETURN -1 END SET @tmpstr = '/* sp_help_revlogin script ' PRINT @tmpstr SET @tmpstr = '** Generated ' + CONVERT ( varchar , GETDATE()) + ' on ' + @@ServerNAME + ' */' PRINT @tmpstr PRINT '' PRINT 'DECLARE @pwd sysname' WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN PRINT '' SET @tmpstr = '-- Login: ' + @ name PRINT @tmpstr IF (@xstatus & 4) = 4 BEGIN -- NT authenticated account/group IF (@xstatus & 1) = 1 BEGIN -- NT login is denied access SET @tmpstr = 'EXEC master..sp_denylogin ' '' + @ name + '' '' PRINT @tmpstr END ELSE BEGIN -- NT login has access SET @tmpstr = 'EXEC master..sp_grantlogin ' '' + @ name + '' '' PRINT @tmpstr END END ELSE BEGIN -- SQL Server authentication IF (@binpwd IS NOT NULL ) BEGIN -- Non-null password EXEC sp_hexadecimal @binpwd, @txtpwd OUT IF (@xstatus & 2048) = 2048 SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')' ELSE SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')' PRINT @tmpstr EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT SET @tmpstr = 'EXEC master..sp_addlogin ' '' + @ name + '' ', @pwd, @sid = ' + @SID_string + ', @encryptopt = ' END ELSE BEGIN -- Null password EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT SET @tmpstr = 'EXEC master..sp_addlogin ' '' + @ name + '' ', NULL, @sid = ' + @SID_string + ', @encryptopt = ' END IF (@xstatus & 2048) = 2048 -- login upgraded from 6.5 SET @tmpstr = @tmpstr + '' 'skip_encryption_old' '' ELSE SET @tmpstr = @tmpstr + '' 'skip_encryption' '' PRINT @tmpstr END END FETCH NEXT FROM login_curs INTO @SID_varbinary, @ name , @xstatus, @binpwd END CLOSE login_curs DEALLOCATE login_curs RETURN 0 GO ----- End Script ----- |
Пример запуска хранимой процедуры sp_help_revlogin:
EXEC master..sp_help_revlogin |
Перенос пакетов DTS
Наиболее эффективный способ переноса пакетов DTS с одного сервера на другой это создание нового пакета DTS, который и выполнит перенос других пакетов.
Для перемещения пакетов DTS:
- Создать новый пакет DTS и добавить в него два соединения одно для сервера-источника, второе для целевого сервера.
- Выделить оба соединения и создать DataPump (transform data) task.
- Для SQL Server 7.0:
- Открыть страницу свойств DataPump task. В раскрывающемся меню “table/view” будут недоступны системные таблицы, поэтому их надо вписывать вручную: [msdb].[dbo].[sysdtspackages]. Сделать тоже для целевого сервера и позволить трансформации автоматически сгенерироваться.
- Для SQL Server 2000:
- Пока не открывать свойства DataPump task. Сначала открыть пункт Disconnected Edit в контекстном меню пакета. В разделе Task выделить DataPumpTask и поменять свойства SourceObjectName и DestinationObjectName на [msdb].[dbo].[sysdtspackages]. После изменения этих свойств перейти в свойства DataPump task , на вкладку Transformations, чтобы позволить трансформации автоматически сгенерироваться. В SQL Server 2000 нет возможности добавлять серверы вручную, однако, можно использовать описанный метод.
- Теперь можно выполнить задание и пакеты будут перенесены.