Являются ли обновления SQL Server обновленными на месте, как плохо, как раньше?

Я работаю с SQL-сервером вкл и выкл с SQL Server 6.5, старый совет, который все еще звучит в моей голове, никогда не должен был обновлять на месте.

В настоящее время я модернизирую свои системы DEV и TEST 2008 R2 на SQL Server 2012 и должен использовать одно и то же оборудование. Мысль о том, что мне не нужно восстанавливать мою конфигурацию служб Reporting Services, очень привлекательна, и я действительно против времен стены. Не задействованы никакие услуги анализа или что-то необычное или нестандартное - установлены только механизмы базы данных и службы отчетов.

У кого-нибудь возникли серьезные проблемы с обновлением на месте? Или я должен переоценить свою позицию относительно обновлений на месте?

75 голосов | спросил DamagedGoods 27 22012vEurope/Moscow11bEurope/MoscowTue, 27 Nov 2012 05:10:45 +0400 2012, 05:10:45

5 ответов


89

Действительно короткий ответ . На месте все в порядке. После этого вы можете просмотреть свою конфигурацию и внедрить лучшие практики для SQL Server 2012.

Более длинный ответ на обновление /миграцию SQL Server

Итак, это мнение, и не обязательно неправильный или правильный ответ, но я предпочитаю модернизацию стилей миграции по множеству причин. Тем не менее, некоторые из моих клиентов по разным причинам не имели никакого выбора, кроме как сделать это на месте, а с тех пор, как SQL Server 2005, обновления на месте были не такими плохими, как раньше.

Почему я предпочитаю переход к обновлению на месте

  • Легкий откат . Если что-то пойдет не так, вы можете откатиться, просто сказав: «Мы прервали обновление. Пожалуйста, измените строки подключения на старый сервер, пока мы это разрешим». С помощью места, которое вы исправляете, или у вас нет.
  • Обновить оборудование . Аппаратное обеспечение быстро меняется. Вы можете легко застрять на оборудовании, которое было правильным для вашей компании 4 года назад, но не на сегодня и в ближайшие четыре года с обновлением на месте. В любом случае вам, скорее всего, придется выполнить миграцию для нового оборудования.
  • Чувствуйте себя лучше - Конечно ... Этот субъективен, но он чувствует себя хорошо, зная, что вы начинаете с новой установки ОС, новой установки SQL без паутины от человека на работе перед вами (или вы, прежде чем знаете, что знаете сегодня), что может привести к головным болям в будущем.
  • Новая ОС . Миграция дает вам возможность начать с новой версии ОС, если вы не являетесь последним и самым лучшим сегодня.
  • Вы можете протестировать его . Когда-либо хотите получить набор базовых линий на новом компьютере перед установкой SQL и опустить его с помощью баз данных и использования? Вы можете сделать это сейчас.
  • Иногда проще перебирать лучшие практики . Возможно, учетная запись службы SQL Server была локальным администратором. Возможно, встроенные администраторы находятся в роли сервера SA. Возможно, вещи были взломаны вместе, чтобы заставить его работать раньше. Вы можете исправить все и начать новый.
  • Свободная тестовая среда и дополнительный сон . Это отличная выгода для того, чтобы иметь среду, в которой вы можете работать в преддверии фактического дня перехода, когда вы живете в этой новой среде. Выполнение перехода на новую среду означает, что вы можете построить ее в рабочее время, намного опередив ваш фактический день перехода и проверите его во многих отношениях заблаговременно. Вы можете запускать полное регрессионное тестирование во всех приложениях и системах в течение нескольких дней и иметь отличное спокойствие, прежде чем выполнять окончательный набор восстановлений /атташе, а также разрезать все приложения и доступ к новой среде.
  • Вам не нужно делать все сразу . Очень распространенная ситуация, с которой я сталкиваюсь, - это среда, которая пытается консолидироваться только в нескольких экземплярах. Возможно, один вариант, возможно, один за «уровень» и версию. Многие из этих проектов имеют разные временные рамки для различных приложений и баз данных на основе тестирования, планов проектов и своевременности сертификации поставщиков. Выполнение миграции означает, что вы можете переместить те базы данных, которые готовы, когда они готовы и все еще обрабатывают запросы для тех баз данных, которые не могут двигаться по той или иной причине.

Не обращайте внимания на . Я не говорю, что вы имеете для этого в качестве переноса. In-Place работает, и он работает хорошо, если вы не планируете покупать новое оборудование в своем бюджете и не можете сделать это для этого обновления. Поддержка в процессе обновления намного лучше, чем в течение 6,5 дней, поэтому вы не ставите себя в плохую позицию, делая это.

Если вы планируете делать на месте для dev /test, но хотите выполнить миграцию для производства, вы можете рассмотреть возможность выполнения хотя бы одной миграции до производства. Таким образом, вы можете заранее подготовить свой контрольный список и решить любые потенциальные проблемы, о которых вы не думали.

Подключить /отделить от резервного копирования /восстановления для миграции

Если вы решите пойти с подходом к миграции, есть еще одно решение, решение которого вы все еще можете обсудить, и именно так вы перемещаете свою базу данных в новую среду. Вы можете отделить вашу базу данных от старого сервера и прикрепить ее к новой или создать резервную копию и восстановить там.

Я предпочитаю резервное копирование /восстановление. Самое большое преимущество, которое я слышу о отсоединении /подключении, заключается в том, что он экономит некоторое время. Для меня резервное копирование /восстановление выигрывает по нескольким причинам:

  • Сохранить старый доступный . Это позволяет вам иметь доступную базу данных на исходном сервере. detach /attach должен делать то же самое, но это потребует нескольких шагов, и есть место для человеческой ошибки с отсоединением /прикреплением, которое могло бы усложнить это.
  • Вы гарантируете, что у вас есть резервная копия . Вместо того, чтобы просто брать базу данных из отсоединения и, возможно, забывать о шаге резервного копирования, вы убедились, что приняли эторезервное копирование.
  • Ошибка пользователя . Если вы удалите неправильный файл, забудьте о том, где вы что-то отправляете или каким-либо иным образом испортите свои действия, вы рискуете многого, перемещая данные и файлы журналов для своей базы данных. Теперь вы можете уменьшить это, скопировав вместо того, чтобы вырезать (и если вы отделитесь, вы должны выйти из привычки вырезать и вставить), но вы можете испортить. SQL Server больше не блокирует эти файлы, и мне просто легко удалить файл случайно, чтобы я рискнул.
  • На самом деле это не , что медленнее . - Резервное копирование и копирование - это немного больше времени, но это не так, что я готов заплатить дополнительный риск для этого. Фактически - используя полную модель восстановления и резервные копии журналов, вы можете сократить время простоя вниз для сокращений, как описано ниже в разделе «Как облегчить миграционный подход»

Если вы решите сделать резервную копию /восстановление - это значит, что ваша старая исходная база данных будет оставаться в сети. Мне нравится приносить эту базу данных в автономный режим после выполнения резервного копирования. Я иногда делаю шаг дальше и удаляю весь экземпляр SQL в автономном режиме после того, как я выполнил сценарий безопасности, заданий, связанного сервера, сертификатов, настроек почтовой базы данных и другой информации об объеме экземпляра. Это позволяет избежать проблемы во время тестирования, когда кто-то говорит: «Все выглядит великолепно!» только чтобы реализовать через день или два, что они говорили со старой базой данных на старом сервере. Включение этих баз данных в автономном режиме или отключить весь экземпляр в автономном режиме позволяет предотвратить эти ложные срабатывания и беспорядок, который они создают.

Как облегчить миграционный подход

Вы можете свести к минимуму время простоя, необходимое для перехода от старой к новой среде, для занятой производственной среды с небольшим временем простоя, используя полную модель восстановления. В основном - этап среды, к которой вы переносите, путем восстановления последней полной резервной копии, любых дифференциальных резервных копий и любых уже сделанных резервных копий журналов с указанием NORECOVERY - тогда все, что вам нужно сделать для окончательного завершения, - это восстановить резервные копии журналов, которые еще не были восстановлены, и окончательную резервную копию журнала, которую вы хотите восстановить, указав WITH RECOVERY. Таким образом, для большой базы данных фактическое сокращение времени простоя может быть значительно уменьшено за счет оплаты полного, дифференциального и большинства журналов, которые восстанавливаются перед временем простоя. Благодаря Tao , указав это в комментариях!

Как сделать обновление на месте более безопасным

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

  • Резервное копирование . Заблаговременно сделайте соответствующие резервные копии всех пользовательских и системных баз данных своей среды и убедитесь, что они хороши (я параноик. Я действительно восстановил бы их где-нибудь сначала, чтобы действительно знать, что они хороши. Может быть тратить ваше время. Но вы можете поблагодарить себя в случае катастрофы). Сценарий из любой информации о конфигурации установки SQL и ОС в этой среде.
  • Проверяйте все до начала . Убедитесь, что у вас хорошая среда и хорошие базы данных. Вы должны делать такие вещи, как просмотр журналов ошибок и запуск DBCC CHECKDB на регулярной основе, но прежде чем делать обновление на месте - отличное время для запуска. Исправить любые проблемы раньше времени.
  • Обеспечить работоспособность ОС . Не просто убедитесь, что SQL работоспособен, убедитесь, что ваш сервер здоров. Какие-либо грубые ошибки в журналах событий ошибок системы или приложений? Как ваше свободное пространство?
  • Подготовьтесь к худшему . Несколько недель назад у меня была серия сообщений в блоге, в которой говорилось, что если вы не готовитесь к сбою - вы действительно готовите к . Я все еще верю в это. Поэтому подумайте о проблемах, которые у вас есть, и поразмышляйте с ними заранее. Получите себя в «провальном» мышлении, и вы подумаете о том, чего не было бы в противном случае.

Важность контрольных списков обновления или миграции

Если вы решите сделать обновление (независимо от того, на месте или на переходе), вам следует серьезно подумать о создании контрольного списка и использовании этого контрольного списка в каждой среде. Вы должны включить в этот контрольный список кучу вещей, не в последнюю очередь:

  1. На старте . Сделайте некоторые вещи, например, выполните тестовое обновление, проверьте свои приложения на последнем уровне совместимости баз данных и подумайте над запуском такого инструмента, как Советник по обновлению SQL Server заблаговременно, чтобы узнать, какие задачи необходимо выполнить перед выполнением обновления или миграции SQL Server.
  2. Предварительные шаги - очистка, задачи ОС, исправление заблаговременно, подготовка приложений для обновления (чистаявыключение, работа строки подключения), резервные копии и т. д.
  3. Шаги обновления /миграции . Все, что вам нужно сделать для обновления или переноса, чтобы преуспеть и в правильном порядке. Установка, изменение (или изменение в зависимости от вашего тестирования и подхода) режима совместимости меняются в базах данных и т. Д.
  4. Этапы миграции /обновления . Различные тесты, новые версии или новые параметры конфигурации сервера, передовая практика, изменения безопасности и т. д.
  5. Шаги отката . На всем протяжении времени вы должны иметь шаги отката и этапы. Если вы доберетесь так далеко, и это произойдет, что вы будете делать? Что такое критерии «сделать полный откат»? И как вы выполняете этот откат (изменение строки обратного соединения, изменение настроек назад, возврат к старой версии, переустановка, если на месте, возврат к старому серверу, если выполняется миграция и т. Д.).

И тогда у человека, который будет производить модернизацию производства, следовать контрольный список в какой-то среде, кроме производства, - особенно тот, который закрывается, по возможности похож на производство («К югу от prod», как я говорю ...), и обратите внимание на любое проблемы или моменты, когда им пришлось отвлекаться от контрольного перечня или импровизировать из-за отсутствия контрольного списка. Затем добавьте изменения, и получайте удовольствие при изменении вашей продукции.

Я не могу чрезмерно подчеркнуть важность тщательного тестирования после переноса или обновления и превышения вашей миграции. Решение отката в процессе обновления должно быть легким - особенно во время миграции. Если есть что-то неудобное, откат и выяснить его, если вы не можете устранить его эффективно и надежно в разгар миграции. После того, как вы живете в этой новой среде, и пользователи подключаются - откат становится сложной задачей. Вы не можете восстановить базу данных SQL Server до более ранней версии. Это означает ручную работу и миграцию данных. Я всегда жду пару недель, чтобы убить старую среду, но вы должны сделать все возможное, чтобы избежать необходимости в этой старой среде, найдя все ваши проблемы, прежде чем ваши живые пользователи когда-либо касаются новой среды. Желательно, прежде чем вы начнете обновление /миграцию.

Быстрая заметка о миграции /обновлении служб Reporting Services SQL Server Миграция установки SSRS не является довольно сложной задачей, о которой многие думают. Эта техническая /учебная онлайн-статья на самом деле довольно удобна . Одним из наиболее важных предупреждений в этой статье является «Резервное копирование ключей шифрования» , особенно если у вас есть много сохраненной конфиденциальной информации, такой как адреса электронной почты получателей электронной почты запланированного отчета, информация о соединении для множество подключений и т. д. Вы можете несколько раз спросить одного из моих клиентов о том, насколько это важно. Они знают, потому что я перепутал этот шаг и потратил немало времени на изменение расписаний отчетов и разрешений на строку подключения.

ответил Mike Walsh 27 22012vEurope/Moscow11bEurope/MoscowTue, 27 Nov 2012 05:19:43 +0400 2012, 05:19:43
14

По моему опыту, тот же процесс принятия решений должен быть сделан по-прежнему. AFAIK не было никаких «сменщиков мира» с установкой SQL Server в продукте MS SQL Server сама по себе и потенциальными проблемами, возникающими при развертывании программного обеспечения с миллионами строк кода. Что-то плохое может произойти, и теперь вы застряли без опции «ROLLBACK».

Однако у вас есть другие альтернативы. Вы можете рассмотреть возможность создания снимка системы, восстановления в другом месте, выполнить обновление и посмотреть, что произойдет. Этот тест должен дать вам большой комфорт, но он не гарантирует, что никаких проблем не возникнет на коробке с продуктом. Однако это вариант, который не был доступен в SQL 6.5 дней.

Я бы назвал худший сценарий. Вы делаете обновление, и он терпит неудачу. Затем вам нужно будет оправиться от этого в RTO и RCO. Знает ли бизнес риски и у вас есть планы по его смягчению?

Если дело не в порядке с этим, тогда не делайте этого, это мой совет.

ответил Ali Razeghi 27 22012vEurope/Moscow11bEurope/MoscowTue, 27 Nov 2012 05:17:07 +0400 2012, 05:17:07
2

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

ответил Troy 29 SunEurope/Moscow2013-12-29T20:29:15+04:00Europe/Moscow12bEurope/MoscowSun, 29 Dec 2013 20:29:15 +0400 2013, 20:29:15
1

Из-за больших инвестиций в оборудование мы должны были обновить только ОС, сохранив текущую версию SQL Server (2012, 3 сервера, 22 экземпляра, ~ 300 баз данных). Нет сложных настроек, таких как зеркалирование и т. Д.

Этот пример не соответствует вопросу, так как SQL Server не обновляется. Я думаю, что это по-прежнему хороший ответ, потому что показанные шаги на самом деле будут проще, чем настоящая миграция.

Обзор: внешний накопитель был прикреплен для полного резервного копирования в основном в качестве меры предосторожности. Только модель и msdb будут фактически восстановлены с внешнего накопителя. Ldf /mdf остались на месте для отсоединения /прикрепления. Некоторые локальные учетные записи были указаны в БД. После того, как они были повторно созданы в ОС, ссылки в БД были воссозданы (поскольку SID могут измениться).

Затем мы выполнили следующие шаги:

1) Обратите внимание на настройки уровня сервера, которые будут восстановлены на шагах 12 (Роли сервера) и с 18 по 23.

2) Исправьте SQL Server 2012 до SP3 (требуется согласованность, если мы хотим восстановить любую dbs системы).

3) Проверьте соответствие версий для каждого экземпляра. «Выбрать @@ version»

4) Сгенерируйте эти 6 скриптов, запустив этот скрипт. Redgate SQL Multiscript - это огромное время, если есть много экземпляров (отрегулируйте параметры Tools -> Options => Line Length до max (8192), а затем используйте текстовый вывод).

  • Резервное копирование
  • Восстановление
  • Detach
  • Attach
  • Восстановить логины
  • Переназначение пользователей для входа в систему

    - (1) BACKUP /(2) ВОССТАНОВЛЕНИЕ
    -
    - *** УСТАНОВИТЕ ЭТИ на внешнем диске
    - *** и создать целевые каталоги
    объявлять
        @backupInstanceDir varchar (300) = 'F: \ ExternalDriveBackups \' + replace (@@ servername, '\', '_'),
        @dateSuffix varchar (100) = '2015-12-14';
    
    if (object_id ('tempdb..DatabaseStatus') не равно null)
    drop table #DAtabseSTatus;
    
    Выбрать
        d.name DbName,
        d.state_desc DbState,
        d.user_access_desc UserMode,
        convert (бит, (d.is_read_only * -1 + 1)) как IsWritable,
        d.is_trustworthy_on как IsTrustWorthy,
        d.is_in_standby IsInStandby,
        d.recovery_model_desc RecoveryModel,
        suser_sname (d.owner_sid) как владелец,
        конвертировать (бит,
            случай, когда d.database_id <= 4 или d.is_distributor = 1
                затем 1
                еще 0
            end) как IsSystemDb,
        mf.type_desc как FileType,
        mf.name Имя_файла,
        mf.state FileState,
        mf.state_desc FileStatDesc,
        mf.physical_name Физическое имя,
        mf.type как FileTypeId
    в #DatabaseStatus
    из
        sys.master_files AS mf
    join sys.databases AS d
    ON mf.database_id = d.database_id
    где
        1 = 1
    Сортировать по
        d.name,
        mf.physical_name;
    
    если object_id ('tempdb .. # sqlOut') не является нулевым
        drop table #sqlOutBU
    
    если object_id ('tempdb .. # sqlOut') не является нулевым
        drop table #sqlOutRE
    
    создать таблицу #sqlOutBU
    (
        Команда nvarchar (max) не имеет значения null,
        Идентификатор строки (1,1), а не нулевой первичный ключ
    );
    
    создать таблицу #sqlOutRE
    (
        Команда nvarchar (max) не имеет значения null,
        Идентификатор строки (1,1), а не нулевой первичный ключ
    );
    
    вставить в #sqlOutBU выбрать char (10) + '- BACKUP SCRIPT' + char (10);
    вставить в #sqlOutRE select char (10) + '- RESTORE SCRIPT' + char (10);
    
    
    вставить в #sqlOutBU выбрать char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    вставить в #sqlOutRE select char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    PRINT '--Script для резервного копирования всех БД в экземпляре SQL Server в определенное место'
    
    SET nocount ON
    
    вставить в #sqlOutBU выбрать char (10) +
    '-' + char (10) + '- BACKUP' + @@ servername + '-' + char (10) +
    'использовать [Мастер]; установить deadlock_priority high; + char (10);
    
    вставить в #sqlOutRE select '
    -- ВОССТАНОВИТЬ
    -
    - УБЕДИТЕСЬ, ЧТОБЫ ЗАДАТЬ СИСТЕМУ DBS К АЛЬТЕРНАТИВНОМУ МЕСТОПОЛОЖЕНИЮ ТОЛЬКО ДО ВОССТАНОВЛЕНИЯ!
    -
    использовать [Мастер]; установить deadlock_priority high; + char (10);
    
    DECLARE @dbname nvarchar (128)
    объявить dblist_cursor cursor fast_forward для
    выберите [имя] из master.sys.databases, где [name]! = 'tempdb'
    order by iif (database_id <= 4, '0', '1') + [name]
    
    открыть dblist_cursor
    выберите следующий из dblist_cursor в @dbname
    
    в то время как @@ fetch_status = 0
    начать
    
        declare @bak nvarchar (300) = @backupInstanceDir + '\' + @dbname + '_' + @dateSuffix + '.bak';
    
        вставить в #sqlOutBU выбрать char (10) + 'резервную базу данных [' + @dbname + '] на диск =' '' + @bak + '' 'WITH COPY_ONLY, NOFORMAT, NOINIT,' + char (10) +
            'NAME = N' '' [email protected] + '-Full', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 25; ';
    
        вставить в #sqlOutRE выбрать 'восстановить базу данных [' + @dbName + '] с диска =' '' + @bak + '' 'WITH FILE = 1,' + char (10) +
        (
            выберите 'move' '' + FileName + '' 'to' '' + PhysicalName + '' '' From #DatabaseStatus
            где FileType = 'Rows' и DbName = @dbName
        ) + ',' + char (10) +
        (
            выберите 'move' '' + FileName + '' 'to' '' + PhysicalName + '' '' From #DatabaseStatus
            где FileType = 'Log' и DbName = @dbName
        ) + ',' + char (10) +
        «NOUNLOAD, REPLACE, STATS = 25;» + char (10);
    
        выберите следующий из dblist_cursor в @dbname
    конец
    
    закрыть dblist_cursor
    deallocate dblist_cursor
    
    вставить в #sqlOutBU выбрать char (10) + 'go' + char (10);
    вставить в #sqlOutRE select char (10) + 'go' + char (10);
    
    выберите команду из порядка #sqlOutBU по строке; - ОБРАТНАЯ СВЯЗЬ
    выберите команду из команды #sqlOutRE по строке; - RESTORE SCRIPT
    
    идти
    
    
    
    -
    - (3) DETACH - Org Автор: Артемакис Артемиу
    -
    
    если object_id ('tempdb .. # sqlOutDT') не является нулевым
        drop table #sqlOutDT
    
    создать таблицу #sqlOutDT
    (
        Команда nvarchar (max) не имеет значения null,
        Идентификатор строки (1,1), а не нулевой первичный ключ
    );
    
    insert в #sqlOutDT выберите char (10) + '- DETACH все БД из экземпляра SQL Server + char (10);
    
    вставить в #sqlOutDT выбрать char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    SET nocount ON
    
    Вставить в #sqlOutDT выбрать char (10) + '-' + char (10) + '- DETACH' + @@ servername + char (10) + '-' + char (10) + '
    использовать MAster; установить deadlock_priority high; + char (10) + char (10);
    
    DECLARE @dbname nvarchar (128)
    DECLARE dblist_cursor КУРСОР fast_forward FOR
    SELECT [имя]
    FROM master.sys.databases
    WHERE database_id> 4
    
    OPEN dblist_cursor
    FETCH next FROM dblist_cursor INTO @dbname
    
    WHILE @@ FETCH_STATUS = 0
    НАЧАТЬ
        вставить в #sqlOutDT select
        'alter database' + @dbname + 'set single_user с немедленным откатом;' + char (10) +
        'EXEC sp_detach_db' '' + @dbname + '' ',' 'true' ';' + char (10);
        FETCH next FROM dblist_cursor INTO @dbname
    КОНЕЦ
    
    ЗАКРЫТЬ dblist_cursor
    DEALLOCATE dblist_cursor
    
    вставить в #sqlOutDT выбрать char (10) + 'go' + char (10);
    выберите команду из #sqlOutDT по Row;
    
    идти
    
    
    
    -
    - (4) ATTACH - Org Автор: Артемакис Артемиу
    -
    
    если object_id ('tempdb .. # sqlOut') не является нулевым
        drop table #sqlOutAT
    
    создать таблицу #sqlOutAT
    (
        Команда nvarchar (max) не имеет значения null,
        Идентификатор строки (1,1), а не нулевой первичный ключ
    );
    
    вставить в #sqlOutAT select char (10) + '- ATTACH ALL DBs к экземпляру SQL Server + char (10);
    
    вставить в #sqlOutAT select char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    SET NOCOUNT ON
    
    вставить в #sqlOutAT select char (10) + '-' + char (10) + '- ATTACH' + @@ servername + char (10) + '-' + char (10) +
    'использовать MAster;' + char (10) + char (10);
    
    DECLARE @dbname nvarchar (128);
    
    DECLARE DBList_cursor CURSOR fast_forward FOR
    выберите [имя] из master.sys.databases, где database_id> 4
    заказ по названию;
    
    OPEN DBList_cursor
    
    FETCH NEXT FROM DBList_cursor
    INTO @dbname
    
    WHILE @@ FETCH_STATUS = 0
    НАЧАТЬ
    
    declare @attach_TSQL_script varchar (max)
    set @ attach_TSQL_script = ''
    set @ attach_TSQL_script = @ attach_TSQL_script + 'CREATE DATABASE' + @dbname + 'ON'
    
    объявить @tsql varchar (max), @ filename varchar (max)
    set @ tsql = 'DECLARE DBFiles_cursor CURSOR Для выбора [имя_файла] из' + @dbname + '.sys.sysfiles'
    
    выполнить (@tsql)
    
    PRINT '-' + @ dbname
    
    OPEN DBFiles_cursor
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    
    WHILE @@ FETCH_STATUS = 0
    НАЧАТЬ
    set @ attach_TSQL_script = @ attach_TSQL_script + char (10) + '(FILENAME =' '' + @filename + '' '),'
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    КОНЕЦ
    
    set @ attach_TSQL_script = SUBSTRING (@ attach_TSQL_script, 0, len (@attach_TSQL_script))
    set @ attach_TSQL_script = @ attach_TSQL_script + char (10) + 'FOR ATTACH;';
    
    вставить в #sqlOutAT select @attach_TSQL_script + char (10);
    
    PRINT @attach_TSQL_script
    РАСПЕЧАТАТЬ ''
    
    CLOSE DBFiles_cursor
    DEALLOCATE DBFiles_cursor
    
    FETCH NEXT FROM DBList_cursor
    INTO @dbname
    
    КОНЕЦ
    
    ЗАКРЫТЬ DBList_cursor
    DEALLOCATE DBList_cursor
    
    вставить в #sqlOutAT select char (10) + 'go' + char (10);
    выберите команду из #sqlOutAT order by Row;
    идти
    
    
    
    -
    - (5) ОБРАТИТЕСЬ СЦЕНАРИЙ «RE-CREATE LOGISS»
    -
    - Этот скрипт был изменен из версии, предназначенной для копирования с одного сервера на другой:
    -http://stackoverflow.com/a/5983773/538763
    -
    
    
    ИСПОЛЬЗОВАТЬ [мастер]
    
    если object_id ('tempdb .. # sqlOut') не является нулевым
    drop table #sqlOut;
    
    создать таблицу #sqlOut
    (
    Команда nvarchar (max) не имеет значения null,
    Идентификатор строки (1,1), а не нулевой первичный ключ
    );
    
    insert в #sqlOut select char (10) + '- RECREATE LOGINS' + char (10);
    
    
    вставить в #sqlOut select char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    вставить в #sqlOut выбрать 'use Master;' + char (10);
    идти
    SET ANSI_NULLS ON
    ИДТИ
    SET QUOTED_IDENTIFIER ON
    ИДТИ
    объявить бит @Debug = 0;
    объявить @PartnerServer varchar (100) = @@ SERVICENAME; - использовать текущий сервер до его выключения (отключено ниже)
    
    объявлять
        @MaxID int,
        @CurrID int,
        @SQL nvarchar (max),
        @LoginName sysname,
        @IsDisabled int,
        @Type char (1),
        @SID varbinary (85),
        @SIDString nvarchar (100),
        @PasswordHash varbinary (256),
        @PasswordHashString nvarchar (300),
        @RoleName sysname,
        @Machine sysname,
        @PermState nvarchar (60),
        @PermName sysname,
        @Class tinyint,
        @MajorID int,
        @ErrNumber int,
        @ErrSeverity int,
        @ErrState int,
        @ErrProcedure sysname,
        @ErrLine int,
        @ErrMsg nvarchar (2048);
    
    declare @Logins Table (идентификатор входа IDID (1, 1)), но не первичный ключ,
                        [Имя] sysname не равно null,
                        [SID] varbinary (85) не null,
                        IsDisabled int не null,
                        [Тип] char (1) не null,
                        PasswordHash varbinary (256) null)
    объявить таблицу @Roles (идентификатор идентификатора RoleID int (1, 1), а не нулевой первичный ключ,
                    RoleName sysname не равно null,
                    LoginName sysname не равно null)
    объявить таблицу @Perms (идентификатор PermID int (1, 1) не нулевой первичный ключ,
                    LoginName sysname не равно null,
                    PermState nvarchar (60) не null,
                    Имя_сервера PermName не равно null,
                    Класс tinyint не равен нулю,
                    ClassDesc nvarchar (60) не имеет значения null,
                    MajorID int не null,
                    SubLoginName sysname null,
                    SubEndPointName sysname null)
    
    Установите NoCount On;
    
    Если CharIndex ('\', @PartnerServer)> 0
    Начать
    Set @Machine = LEFT (@PartnerServer, CharIndex ('\', @PartnerServer) - 1);
    Конец
    еще
    Начать
    Set @Machine = @PartnerServer;
    Конец
    
    - Получить все логины Windows с основного сервера
    Set @SQL = 'Выберите P.name, P.sid, P.is_disabled, P.type, L.password_hash' + CHAR (10) +
        'From' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_principals P '+ CHAR (10) +
        'Left Join' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.sql_logins L На L.principal_id = P.principal_id '+ CHAR (10) +
        'Где P.type In (' 'U' ',' 'G' ',' 'S' ')' + CHAR (10) +
        '& P.name <> '' sa '' '+ CHAR (10) +
        'И P.name не нравится' '##%' '' + CHAR (10) +
        'и P.Name Не нравится' 'NT SERVICE%' '' + CHAR (10) +
        'И CharIndex (' '' + @Machine + '\' ', P.name) = 0;';
    
    Вставить Into @Logins (имя, SID, IsDisabled, Type, PasswordHash)
    Exec sp_executesql @SQL;
    
    - Получить все роли с основного сервера
    Set @SQL = 'Выберите RoleP.name, LoginP.name' + CHAR (10) +
        'From' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_role_members RM '+ CHAR (10) +
        'Inner Join' /* + QUOTENAME (@PartnerServer) +. * /+ 'Master.sys.server_principals RoleP' +
        CHAR (10) + char (9) + 'На RoleP.principal_id = RM.role_principal_id' + CHAR (10) +
        'Inner Join' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_principals LoginP '+
        CHAR (10) + char (9) + 'На LoginP.principal_id = RM.member_principal_id' + CHAR (10) +
        'Where LoginP.type In (' 'U' ',' 'G' ',' 'S' ')' + CHAR (10) +
        'And LoginP.name <gt; '' sa '' '+ CHAR (10) +
        'And LoginP.name Не нравится' '##%' '' + CHAR (10) +
        'And LoginP.name не нравится' 'NT SERVICE%' '' + CHAR (10) +
        'И RoleP.type =' 'R' '' + CHAR (10) +
        'И CharIndex (' '' + @Machine + '\' ', LoginP.name) = 0;';
    
    Вставить Into @Roles (RoleName, LoginName)
    Exec sp_executesql @SQL;
    
    - Получить все явно предоставленные разрешения
    Set @SQL = 'Выберите P.name Collate database_default,' + CHAR (10) +
        'SP.state_desc, SP.permission_name, SP.class, SP.class_desc, SP.major_id,' + CHAR (10) +
        'SubP.name Collate database_default,' + CHAR (10) +
        'SubEP.name Collate database_default' + CHAR (10) +
        'From' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_principals P '+ CHAR (10) +
        'Inner Join' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_permissions SP '+ CHAR (10) +
        CHAR (9) + 'В SP.grantee_principal_id = P.principal_id' + CHAR (10) +
        'Left Join' /* + QUOTENAME (@PartnerServer) + '. * /+' Master.sys.server_principals SubP '+ CHAR (10) +
        CHAR (9) + 'На SubP.principal_id = SP.major_id И SP.class = 101' + CHAR (10) +
        «Левый член'/* + QUOTENAME (@PartnerServer) +'. * /+ 'Master.sys.endpoints SubEP' + CHAR (10) +
        CHAR (9) + 'On SubEP.endpoint_id = SP.major_id И SP.class = 105' + CHAR (10) +
        'Где P.type In (' 'U' ',' 'G' ',' 'S' ')' + CHAR (10) +
        '& P.name <> '' sa '' '+ CHAR (10) +
        'И P.name не нравится' '##%' '' + CHAR (10) +
        'И P.name не нравится' 'NT SERVICE%' '' + CHAR (10) +
        'И CharIndex (' '' + @Machine + '\' ', P.name) = 0;'
    
    Вставить Into @Perms (LoginName, PermState, PermName, Class, ClassDesc, MajorID, SubLoginName, SubEndPointName)
    Exec sp_executesql @SQL;
    
    - выберите * из @Logins;
    - выберите * из @Roles;
    - выберите * из @perms;
    
    
    Выберите @MaxID = Макс (LoginID), @CurrID = 1
    Из @Logins;
    
    Хотя @CurrID <= @MaxID
    Начать
    Выберите @LoginName = Name,
        @IsDisabled = IsDisabled,
        @Type = [Тип],
        @SID = [SID],
        @PasswordHash = PasswordHash
    Из @Logins
    Где LoginID = @CurrID;
    
    - Если не существует (выберите 1 из sys.server_principals
    - Где name = @LoginName)
    Начать
    
        set @sql = char (10);
        set @sql + = 'Если не существует (выберите 1 из sys.server_principals Где name =' '' + @LoginName + '' ')' + char (10);
        set @sql + = 'begin' + char (10) + '';
    
        Установите @SQL + = 'Создать вход' + quotename (@LoginName)
        Если @Type In ('U', 'G')
        Начать
            Установите @SQL = @SQL + 'из Windows;'
        Конец
        еще
        Начать
            Установить @PasswordHashString = '0x' +
                Cast ('' Как XML) .value ('xs: hexBinary (sql: variable ("@ PasswordHash"))', 'nvarchar (300)');
    
            Установите @SQL = @SQL + 'С паролем =' + @PasswordHashString + 'HASHED; -, ';
    
            Установите @SIDString = '0x' +
                Cast ('' Как XML) .value ('xs: hexBinary (sql: variable ("@ SID"))', 'nvarchar (100)');
            Установите @SQL = @SQL + 'SID =' + @SIDString + ';' + char (10);
        Конец
    
        set @sql + = char (10) +
            'print' 'Created Login' + @loginName + '' ';' + char (10) +
            'end' + char (10) +
            'else' + char (10) +
            convert (nvarchar (max), 'print' 'Login' + @loginName + 'уже существует.' ';') + char (10);
    
        Если @Debug = 0
        вставить в #sqlOut select @SQL;
        еще
        Печать @SQL;
    
        Если @IsDisabled = 1
        Начать
            Установите @SQL = 'Alter Login' + quotename (@LoginName) + 'Disable;'
            Если @Debug = 0
                вставить в #sqlOut select @SQL;
            еще
                Печать @SQL;
        Конец
        Конец
    Установите @CurrID = @CurrID + 1;
    Конец
    
    
    вставить в #sqlOut select char (10) + 'use Master;' + char (10);
    
    Выберите @MaxID = Max (RoleID), @CurrID = 1
    От @Roles;
    
    Хотя @CurrID <= @MaxID
    Начать
    Выберите @LoginName = LoginName,
        @RoleName = RoleName
    От @ Roles
    Где RoleID = @CurrID;
    
    /* Если не существует (выберите 1 из sys.server_role_members RM
                Внутреннее соединение sys.server_principals RoleP
                    На RoleP.principal_id = RM.role_principal_id
                Inner Join sys.server_principals LoginP
                    В LoginP.principal_id = RM.member_principal_id
                Где LoginP.type In ('U', 'G', 'S')
                И RoleP.type = 'R'
                И RoleP.name = @RoleName
                И LoginP.name = @LoginName) * /
    Начать
        Если @Debug = 0
        Начать
            вставить в #sqlOut выбрать 'Exec sp_addsrvrolemember @rolename =' '' + @RoleName + '' ', @loginame =' '' + @LoginName + '' ';';
        Конец
        еще
        Начать
            Печать 'Exec sp_addsrvrolemember @rolename =' '' + @RoleName + '' ',';
            Печать '@loginame =' '' + @LoginName + '' ';';
        Конец
    Конец
    
    Установите @CurrID = @CurrID + 1;
    Конец
    
    
    вставить в #sqlOut select char (10) + 'use Master;' + char (10);
    
    
    Выберите @MaxID = Макс (PermID), @CurrID = 1
    Из @Perms;
    
    Хотя @CurrID <= @MaxID
    Начать
    Выберите @PermState = PermState,
        @PermName = PermName,
        @Class = класс,
        @LoginName = LoginName,
        @MajorID = MajorID,
        @SQL = PermState + space (1) + PermName + SPACE (1) +
            Case Class When 101 Then 'On Login ::' + QUOTENAME (SubLoginName)
                    Когда 105 Then 'On' + ClassDesc + '::' + QUOTENAME (SubEndPointName)
                    Else '' End +
            'To' + QUOTENAME (LoginName) + ';'
    От @Perms
    Где PermID = @CurrID;
    
    /* Если не существует (выберите 1 из sys.server_principals P
                Внутреннее соединение sys.server_permissions SP В SP.grantee_principal_id = P.principal_id
                Где SP.state_desc = @PermState
                И SP.permission_name = @PermName
                И SP.class = @Class
                И имя P.name = @LoginName
                И SP.major_id = @MajorID) * /
    Начать
        Если @Debug = 0
                вставить в #sqlOut select @sql;
        еще
            Печать @SQL;
    Конец
    
    Установите @CurrID = @CurrID + 1;
    Конец
    
    
    выберите команду из #sqlOut как SqlOut order by Row;
    идти
    
    
    -
    - (6) Сгенерировать сценарий для повторной привязки всех пользователей к входам на основе текущего состояния (до выключения)
    -
    
    использовать Мастер;
    
    если object_id ('tempdb .. # sqlOut') не является нулевым
    drop table #sqlOut;
    
    создать таблицу #sqlOut
    (
        Команда nvarchar (max) не имеет значения null,
        Строка intidentity (1,1) не null первичный ключ
    );
    
    вставить в #sqlOut выбрать char (10) + '- RELINK USERS TO LOGINS' + char (10);
    
    вставить в #sqlOut select char (10) + char (10) + '/* -------------------------------- -------------------------------------------------- ----------- '+ char (10) +
    'ServerName:' + @@ servername + char (10) + 'ServiceName:' + @@ servicename + char (10) + 'Версия:' + @@ version +
    «------------------------------------------------- -------------------------------------------- * /';
    
    declare @dbCmd varchar (8000) = '
    использовать?;
    
    вставить в #sqlOut выбрать char (10) + '' use?; '' + char (10);
    
    с ссылками как
    (
    выберите u.name как UserName,
        l.loginname как LoginName
        от sysusers u
        присоединиться к master..syslogins l
        на u.sid = l.sid
    где u.name! = '' dbo ''
        и u.isSqlUser = 1 или l.isNtName = 1 или l.isNtGroup = 1
    )
    вставить в #sqlOut
    выберите '' alter user ['' + UserName + ''] с именем = ['' + UserName + ''], login = ['' + LoginName + ''] ''
    из ссылок
    «;
    
    exec sp_MSforeachdb @dbCmd;
    
    выберите команду из #sqlOut order by Row;
    
    идти
    

5) Запустите сценарий для резервного копирования всех БД, включая систему (master, msdb, model) на внешний диск.

6) Запустите сценарий для отсоединения всех БД

7) C Привод будет переформатирован. Сохраните LDF /MDF, если они не были на C.

8) Windows Server 2012 установлен на C

9) Переместите LDF /MDF для исходных системных файлов с пути, если они не были на диске C. Драйвер.

10) SQL Server 2012 будет повторно установлен и исправлен до SP3         а. Повторное создание системных учетных записей пользователей /групп

11) Резервные копии системных БД в новое местоположение или имя файла (осторожно, чтобы не перезаписывать оригиналы!).

12) Запустите воссоздание ролей. Что-то вроде:

USE [master]
CREATE SERVER ROLE [SomeServerRole]
--ALTER SERVER ROLE [dbcreator] ДОБАВИТЬ ЧЛЕН [SomeServerRole]
--ALTER SERVER ROLE [bulkadmin] ДОБАВИТЬ ЧЛЕН [SomeServerRole]
- ALTER SERVER ROLE [SomeServerRole] ДОБАВИТЬ ЧЛЕН [SomeMemberOrRole]

13) Запустите воссозданный сценарий входа (ничего не делает, если логины были восстановлены)

14) Остановите SQL AGENT.

(Могло восстановить Учителя здесь, мы выпалили).

15) Приложите mdf /ldf, используя скрипт сверху.         а. Если вы выполните восстановление вручную из bak с помощью скрипта сверху.

16) Попытка восстановления модели

17) Убедитесь, что агент SQL остановлен. Восстановить MSDB (ссылка)         а. Если это не удается, необходимо заново создать задания + план обслуживания + конфигурацию почты + операторы

18) Откройте скрипт пользователя для входа в систему ...

a. Если есть главные пользователи (редко?), То сначала создайте пользователей для мастера, так как он не был восстановлен:
        использовать мастер;
        СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ [ABC] ДЛЯ ВХОДА [машина \ ABC]

    б. Запустите остальные скрипты

19) Включите сервис-брокер, чтобы он соответствовал исходному значению         SELECT name, is_broker_enabled FROM sys.databases;

изменить базу данных MSDB установить single_user с немедленным откатом;
    ALTER DATABASE [MSDB] SET ENABLE_BROKER;
    изменить базу данных MSDB set multi_user;

20) Запустите агент SQL

21) Установите порог параллелизма в исходное значение

22) Откорректируйте любые настройки базы данных до их исходных значений:

объявить @dbCmd varchar (8000) = '
      использовать?;
      если db_name () не в ('' master '', '' model '', 'tempdb' ',' 'msdb' ')
      начать
             print '' Настройка [?] ... '';
            alter database [?] установить single_user с немедленным откатом;
             aLTER AUTHORIZATION ON DATABASE :: [?] to [sa];
            - изменить базу данных [?] установить надежный;
            ALTER DATABASE [?] SET AUTO_CLOSE OFF WITH NO_WAIT;
            alter database [?] set multi_user;
      конец
      еще
             print '' Пропуск [?] ... '';
    «;

    exec sp_MSforeachdb @dbCmd;

23) Проверьте право собственности на работу:

выберите s.name как JobName, l.name как login, SUSER_SNAME (s.owner_sid) AS login2
из msdb..sysjobs s
left join master.sys.syslogins l на s.owner_sid = l.sid

Если версия SQL Server также была обновлена, я не верю, что базы данных модели и msdb могли быть восстановлены, так что задания были бы потеряны из-за https://support.microsoft.com/en-us/kb/264474

Что не хватает:

  • Пользователь Orignal в основной базе данных (редко?)
  • Роли сервера
ответил crokusek 18 FriEurope/Moscow2015-12-18T07:25:49+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2015 07:25:49 +0300 2015, 07:25:49
0

В обоих подходах нет ничего плохого - я сделал оба, и оба результата обычно хороши.

Если проблема связана с миграционным подходом, это не является техническим: это лень. Слишком часто я нахожу, что причина, по которой компания еще не дошла до версии xxxx, заключается в том, что они выбрали миграцию swing и никогда не собирались делать тяжелую работу, чтобы полностью двигаться. Теперь у них есть два или несколько наборов серверов вместо одного.

ответил RowlandG 3 J0000006Europe/Moscow 2014, 00:26:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132