Home Menu Search

Saqwel

IT and other things blog

Переход с SQL Server 7 на SQL Server 2000

Share

При создании этой статьи были использованы ресурсы:

Для перехода 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 нет возможности добавлять серверы вручную, однако, можно использовать описанный метод.
  • Теперь можно выполнить задание и пакеты будут перенесены.

Leave a Reply