Миграция на SQL Server 2008:Чего можно ожидать и как с этим боротьсяДмитрий АртемовСтарший консультантdimaa@microsoft.com
О чем будем говоритьИнструменты
Методика
На что можно напороться
Как с этим боротьсяПредисловиеЯ постараюсь рассказать о:Вариантах перехода, методике, инструментах и планированииС фокусом на реляционную часть SQL ServerТехнических и не очень аспектах переходаЧасто встречающихся проблемах, ошибках и мифахЯ не планирую рассказывать о:Полном перечне всех возможных проблем миграцииПолном перечне нововведений в SQL Server 2008– пожалуйста спрашивайте, тем не менее Для лучшего усвоения желательно:Иметь некоторую практику работы с SQL Server 2000/2005Иметь базовые знания о SQL Server 2008
Определитесь в окруженииАнализ оборудования и инфраструктурыМощность сервера – CPU, RAM, network, storageВозможности дисковой подсистемы – размер, IOs, пропускная способностьИнфраструктура – требования к новому оборудованиюПриложение и БДКуплено или собственная разработкаКто сопровождаетФункционал и редакцииПлатформа определяет возможности 32/64Редакция определяет функционал
Общий обзор подходаАнализ окруженияТребования к миграцииВыбор редакцииТребования к оборудованиюИспользовать Upgrade AdvisorИсправить найденные несоответствияВыполнить тестирование на совместимостьПо возможности 100% тестирование кодаПеред миграциейПодробная документация на существующую системуРазработка тестов проверки, стресс тестов и снятие базовой линии производительностиСформулировать и проверить план откатаОпределитьсяс подходом в миграцииIn-place или side-by-sideСобственно миграцияПредмиграционные работыПосле миграцииВот тут-то начинается самое интересное
Что поддается миграцииКомпонентыРеляционный движокВключая суб компоненты такие как SQL Agent, Tools, и.т.д.Full-text SearchReporting ServicesAnalysis ServicesData Transformation Services / SSISРедакцииExpress, Developer, Workgroup, Standard, EnterpriseПлатформы32-bit & 64-bit (IA64 иx64)Языки и сортировкиSQL Server 2008 имеет новые сортировки (для соответствия Windows)
Варианты миграции:In-Place (замещение)Обновление существующей инсталляции при сохранении пользовательских данныхИмя экземпляра после миграции остается прежнимСтарый экземпляр перекрывается новым (исчезает)Практически 100% автоматический процесс
Миграция:Side-by-side (Параллельная установка)Ставится новый экземпляр SQL ServerОбъекты БД переносятся между экземплярами вручнуюCopy Database WizardНе копирует extended procs, alerts, DTS packages, linked servers.Detach -> Copy -> AttachBackup -> RestoreT-SQL Scripts, BCP , Break SAN mirror -> attach Новый и старый миры сосуществуют бок о бокЭто может быть жизнь на том же сервере (именованный экземпляр) или на другом сервереПроцесс в основном ручной
Как выбратьзамещение или параллельная установкаКритичность приложения и его сложностьКритичные приложения не обязательно сложны, но имеют жесткие ограничения по тестированию, размерам админ. окна,…Сложные приложения не обязательно критичны, но требуют интенсивного тестирования и можно столкнуться со сложным откатомПрактические соображенияРазмер БД и число объектовЛокальные задания по сопровождениюДлительность допустимого простояАппаратные возможности/возраст серверовЗависимость от системы и других приложенийВремя, необходимое на откат и усилия на это потребныеВозможные требования к параллельному исполнению
Перед миграциейСовместимостьЧасть функционала отмерла:Ее просто нет в составе SQL Server 2008Например: ряд недокументированных системных процедур, виртуальные кубы, DUMP database, backup with TRUNCATE ONLY, sp_addgroup, SAC,…Часть функционала приговорена:Не будт поддерживаться в следующей версии за SQL Server 2008 (напр. Notification Services) или будущих версияхЧасть функционала работает иначеНапример: если мы не можем использовать plan guides работаем без него (SQL 2005 выдавал ошибку), REPLACE сохраняет завершающие пробелыСм. документацию о возможных измененияхВыполните функциональное тестирование, чтобы поймать пропущенное Upgrade AdvisorНе все приложения нуждаются в полноценной проверке. Реальные по требности зависят от критичности/сложности приложенияКритичность != сложности и наоборот
Перед миграциейОно вам нужно?Как проверить, что будет «потом»?Как подготовиться к неожиданностям?11Только тестирование способно дать ответ на эти вопросыСбор данных по производительностиСравнениеПринятие обоснованного решения
Каксобрать данные по производительностиНужно снять реальную нагрузкуПрямо с промышленной системыОтносительно просто
Не факт, что поймаем нужный период
Существенная дополнительная нагрузка на сервер/дискиСредствами нагрузочных инструментовМожно имитировать любой периодбизнес активности
Если последовательно идти этим путем, в долговременной перспективе сплошные +++++
Сложность подготовки (разработка и параметризация скриптов нагрузки)
Дороговизна инструментов (но можно использовать Visual Studio tests)Если переходим с SQL 2005Берем планы прямо из кеша илиЗаписываем TRCЕсли переходим с SQL 2000TRC – единственная возможность
ReadTraceПредназначена для разбора TRC файловМного лучше, чем читать TRC средствами fn_trace_gettableРазбирает TRC в таблицыСтроит связи между пакетами команд и индивидуальными командамиСчитает агрегаты по производительностиНОРМАЛИЗУЕТ ТЕКСТ ЗАПРОСА (что позволяет сравнивать запросы по их тексту)Очень быстро работает
Нормализация текста запросаselect    round(sum(-CS.Amount*CS.Price/(case when @currid =2 then R.RateTPK else R.RateETC end)*CH.Direction),0) as Result   from     Rates R (nolock)      inner join (Sections S (nolock)      inner join (CheckHeaders CH (nolock)     inner loop join  CheckSpec CS (nolock) --WITH (nolock,index (IX_CheckSpec_ObjectID))      on (CH.ObjectID=CS.ObjectID and CH.CheckID = CS.CheckID) and CS.StoreTypeID is not null)           on  (CH.ObjectID=S.ObjectID and  CS.SectionID=S.SectionID) and S.Fictive=0)      /* Отдельно обрабывается доллар */      on (R.CurrID=(case when @currid =2 then 1 else @currid end)        and (R.RateDate >= @DateFrom and R.RateDate < @DateTo))        and  datediff(d,0,CH.CheckDate) = datediff(d,0,R.RateDate)      WHERE       CH.ObjectID=@template_ObjectID and      (CH.CheckDate<@DateTo     and  CH.CheckDate>=@DateFrom)     and CH.Deleted = 0     and CH.OpID not in (4,8)      and CH.ReserveID Is Null    option (force order, keepfixed plan)   ====================== Превращается в ===========================SELECT ROUND(SUM(-CS.AMOUNT*CS.PRICE/(CASE WHEN @CURRID ={##} THEN R.RATETPK ELSE R.RATEETC END)*CH.DIRECTION),{##}) AS RESULT FROM RATES R (NOLOCK) INNER JOIN (SECTIONS S (NOLOCK) INNER JOIN (CHECKHEADERS CH (NOLOCK) INNER LOOP JOIN CHECKSPEC CS (NOLOCK) ON (CH.OBJECTID=CS.OBJECTID AND CH.CHECKID = CS.CHECKID) AND CS.STORETYPEID IS NOT NULL) ON (CH.OBJECTID=S.OBJECTID AND CS.SECTIONID=S.SECTIONID) AND S.FICTIVE={##}) ON (R.CURRID=(CASE WHEN @CURRID ={##} THEN {##} ELSE @CURRID END) AND (R.RATEDATE >= @DATEFROM AND R.RATEDATE < @DATETO)) AND DATEDIFF(D,{##},CH.CHECKDATE) = DATEDIFF(D,{##},R.RATEDATE) WHERE CH.OBJECTID=@TEMPLATE_OBJECTID AND (CH.CHECKDATE<@DATETO AND CH.CHECKDATE>=@DATEFROM) AND CH.DELETED = {##} AND CH.OPID NOT IN(LIST) AND CH.RESERVEID IS NULL OPTION (FORCE ORDER, KEEPFIXED PLAN)
ReadTraceБерем результаты обработки старой и новой БДДелаем выборку по производительности запросовНа основании сравнения текстов командПомещаем результаты в ExcelСортируем и смотрим где «просели»
ReadTraceINSERT INTO TEMPDB..MINS25SELECT   MIN(DURATION / 1000)        'Минимальное',MAX(DURATION / 1000)        'Максимальное',AVG(DURATION / 1000)        'Среднее',MIN(READS)                  'Минимальное',MAX(READS)                  'Максимальное',AVG(CAST(READS AS BIGINT))  'Среднее',MIN(WRITES)                 'Минимальное',MAX(WRITES)                 'Максимальное',AVG(WRITES)                 'Среднее',MIN(CPU)                    'Минимальное',MAX(CPU)                    'Максимальное',AVG(CPU)                    'Среднее',MAX(ROWS)                    MAXROWS,         SUBSTRING(NORMTEXT,1,250)    AS NORMTEXT,         COUNT(* )                    EXECCOUNTFROM     DBO.TBLUNIQUESTATEMENTS TSU         JOIN DBO.TBLSTATEMENTS TS           ON TSU.HASHID = TS.HASHIDWHERE    (NORMTEXT LIKE 'Update%'           OR NORMTEXT LIKE 'Insert%'           OR NORMTEXT LIKE 'Select%'           OR NORMTEXT LIKE 'Delete%')         AND (NORMTEXT NOT LIKE 'SELECT STATMAN%')GROUP BY SUBSTRING(NORMTEXT,1,250)Следует учесть число вызовов, число выданных записейДля SQL 2005/2008 не забудьте поделить Duration на 1000 (если сравнивать с SQL 2000)
ReadTraceСравнивать можноDurationCPUReadWriteНаиболее правильным будет сравнение по чтениямИменно они характеризуют «покосившийся» планDuration в многопользовательской системе практически не имеет смыслаWrite – обычно малый процент от числа чтенийCPU – полезно для ограниченного числа случаев и, как правило, хорошо коррелирует с чтениями
Результаты сравненияПо  моему опыту результаты сравнения обычно выглядят так (для OLTP систем)Отрицательные значения на графике относятся к тем командам, которые при работе в среде SQL Server 2008 выполнили меньше чтений.
Сравнили, нашли. Что дальше?Надо исправлятьсяОпределяем команды, которые стали больше читатьСмотрим sys.dm_db_missing_index _*Query processor все равно не отстанет Анализируем часто используемые командыНезначительное ухудшение для команды, вызываемой 1000 раз потенциально опаснее чем существенное ухудшение для команды,вызванной 5 разБерем для проблемных команд план из кеша (мы уже на SQL 2008!)Строим на основе плана тестПрогоняем через Database Tuning AdvisorПроверяем на граничных условиях параметровМного думаем 
Что можно сказать заранееSQL 2005/2008 Обожают include индексы (в разумных пределах это хорошо)Стараются всеми силами избегать дисковых операций (с современными быстрыми стойками это не всегда оправдано)Понять ситуацию теперь куда прощеDMV открывают перед разработчиками и администраторами истинное лицо оптимизатора
СовместимостьПосмотрите в документацииBehavior Changes to Database Engine Features in SQL Server 2008Deprecated Database Engine Features in SQL Server 2008Discontinued Database Engine Functionality in SQL Server 2008Breaking Changes to Database Engine Features in SQL Server 2008Что-то Upgrade Advisor мог пропустить, что-то может быть запланировано к разработке и нуждается в корректировке
СовместимостьSQL 2008 ставит (большой) набор счетчиков, отслеживающих устаревшие конструкции языкаНо как понять, в какой процедуре используются эти конструкции?select * from sys.sysperfinfo where object_name like '%Deprecated Features%‘(228 row(s) affected)
СовместимостьДля перехвата конкретного кода устаревших команд можно использоватьProfilerDeprecation Announcement event classDeprecation Final Support event classЛегко настроить
Относительно непросто выйти на объект (через SQL Handle)
Требует большого объема профилирования, если ловить код сразуExtended eventsDEPRECATION_ANNOUNCEMENTeventDEPRECATION_FINAL_SUPPORT eventПозволяют еще глубже чем раньше заглянуть внутрь
Срабатывают  только на событие
Требуется кодировать (но освоить расширенные события только на пользу)Решено, мигрируем.Что дальше?
До начала миграцииПодготовка средыОбеспечиваем «чистую» средуDatabase consistency checksМожно даже сжать (shrink) БДОдин из редких случаев, когда это имеет смыслМеньше файл – быстрее копирование (для параллельной установки)Не прибить ли индексыВозможно будет быстрее перестроить их на новом месте (опять же сокращение размера файлов)Сделать резервные копииПосмотреть вокругНе пересекаемся ли мы с кем-тоНе запланированы ли работы/ которые могут нам помешатьКуда обращаться при возникновении проблемMCSПремьер-поддержка
До начала миграцииЗависимостиПредполагается, что работыс Upgrade Advisor и тестированию совместимости законченыСамо приложение“COM Components”, Extended Stored Procedures, sp_OA%, CLR assembliesLinked servers (вопросы разграничения доступа и провайдеры)Зависимости между БД (Cross-database dependencies)DTS пакетыЗависимость от решений третьих фирмПО– backup, management agents, clusters, MPIO, SAN mirroringКомпоненты – шифрование, почта,…Антивирусное ПООбычно его стоит остановить на период миграции,но это не всегда позволительноРазличия между функциональностью редакцийНичто не заменит знание самого приложения!
До начала миграцииБазовая линияСоздайте документацию на решениеsp_configure, SQLDIAG, sp_dboptionКонфигурация сети, хранилища, системы безопасностиСнимите базовую линию производительностиНа уровне системы (perfmon, waitstats,…)На уровне приложения (время отклика запросов, число пользователей,…)Разработайте критерии проверки и тесты для их верификацииНе обязательно (но рекомендуется): снимите планы для сложных и/или критичных запросов
МиграцияТщательно и подробно документируйте каждый шагСледите за сообщениями от сервера, стойки, сетиУбедитесь, что специалисты поддержки доступныПроверьте что в телефоне не села батарейка Создайте резервные копии БД старого образца иП-Р-О-В-Е-Р-Ь-Т-Е  И-ХОтключите startup процедурыВерните max worker thread обратно в (0)Выполните миграцию/обновлениеСледите за процессомСледите за временем, сравните с тестовыми даннымиВыполните первоочередные задачи пост миграции
Мигрировали? Славно, теперь все только начинаетсяПриложение вышло под промышленную нагрузкуТеперь его нужно мониторить и править возникающие проблемы
После миграцииВ первую очередьПроверьте все журналыЕще раз посмотрите рекомендации Upgrade AdvisorОбновите статистикуFull если возможноSample для больших таблицFiltered для секционированныхПроверьте настройки Агента, задания и задачи по сопровождениюПроверьте настройки безопасностиОсобенно в части меж серверного и меж доменного взаимодействия/прав доступаПроверьте целостность БД
После миграцииВ первую очередьConfiguration ManagerОсобенно важен для параллельной установки для настройки среды исполнения, протоколов…При замещении, процесс установки старается сохранить максимально существующую среду: принцип «минимального удивления»Убедитесь, что tempdb имеет правильный размер (кто ее только не использует теперь )DBCC CHECKDB, CTEs, Cursors, MARS, Row Versioning, Service Broker, TriggersПроверьте настройки MODELПроверьте, что все что записно в MASTER верноЗаново наполните Full-Text Search каталогиВыполните запланированные проверки
Все плохо!Все хорошо!НУИ?
Хочу назад!!Уже после миграции что-то пошло сильно не так, нужно откатыватьсяВероятность такого варианта прямо зависит от глубины предварительного тестированияЧто можно сделать и откуда могут расти ногиНе паниковатьОпределить причину проблемы (если мигрируете с 2000, заранее поучитесь пользоваться новыми средствами диагностики)Может быть все не так и плохо В зависимости от… откат может быть простым и сложнымЕсли процедура прописана и протестирована, будет прощеМониторинг системы для раннего оповещенияИнструменты синхронизацииОсобо много не скажешь, мы пользовались tablediff. Работает быстро и проста в использовании33
После миграцииЧто можно сделать в первую очередьТипы данныхПроверьте точность представления и размеры храненияМожет быть использовать Sparse columnЭто может потребовать дополнительных ресурсов (посмотрите когда начинаются преимущества – “Estimated Space Savings by Data Type” в BOL)Persisted columnsИндексирование вычисляемых полейОбновите статистику (особенно, если переходили с SQL 2000)Настройки БДDB_CHAINING, EXECUTE ASPAGE_VERIFY CHECKSUMAUTO_UPDATE_STATISTICS_ASYNCPARAMETERIZATIONАнализ критичных запросовПосмотрите на ранее сохраненные планы и сделайте сравнение с базовой линией производительности
После миграцииЧто можно сделать в первую очередь (2)Секционированные таблицыEnterprise EditionСекционированные представления -> Секционированные таблицыСоответствующие настройки уровня блокировокТестируйте, при новом уровне блокировки могут возникать DeadlockПосмотрите на выделение ресурсовsp_configure ‘affinity mask’, sp_configure ‘affinity I/O mask’Новые возможности по управлениюData Collector, reports, DMVs (новые и измененные)Backup CompressionDatabase Tuning Advisor!Воспользуйтесь ранее собранными трассировками
После миграцииИспользование нового функционалаПосмотрите на качество индексирования и возможность использования индексированных представленийОцените качество управления статистикойSampling выборки, ручное,автоматическое управлениеАлгоритм автоматического срабатывания не изменился (20%)Оцените необходимость использовнаия хинтовПосмотрите SQL Server Magazine InstantDoc #26406 (флаги отключения хинтов)Уберите хинт или опишите его полезность в документацииПодумайте об использовании plan guide вместо хинтов (теперь можно строить plan guide по данным из кеша)Оцените полезность онлайновых операций (в основном для Enterprise Edition)Как себя чувствует TEMPDB (особенно при переходе с SQL 2000)Управление на основе политикНе следует ли применить ее для внедрения существующих стандартовResource GovernorНачните с минимального числа групп, пулов и правил (в классифицирущей функции)
После миграцииНа более дальнюю перспективуНовые типы данныхБолее удобные типы– date, timeЕсли есть написанные CLR типы которые можно перевести на встроенные  (geometry, geography, hierarchyid)Переписать«COM компоненты»наCLRXPs на C#  или VB вCLRРазграничение доступаСхемы (для миграции с SQL 2000), новые возможности шифрования(TDE), новые возможности аудитаУстаревший функционал нужно переписать/удалитьAS COM assemblies, DTS, ActiveX Script task, SQL Mail, sp_repladdcolumn, updateable subscriptions, sp_dbcmptlevel, ……Если мигрировали с SQL Server 2000, то еще много чего – см. документацию
Часто встречающиеся проблемыПосле перехода на SQL Server 2008 запросы исполняются дольше
В чем может быть проблема

More Related Content

PDF
Лекция 10. Apache Mahout
PPTX
High Load 2009 Dimaa Rus Ready
PDF
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
PDF
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
PDF
CSSO – история ускорения
PPT
Низкоуровневая Оптимизация (Андрей Аксенов)
PPT
PPTX
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Лекция 10. Apache Mahout
High Load 2009 Dimaa Rus Ready
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
CSSO – история ускорения
Низкоуровневая Оптимизация (Андрей Аксенов)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)

Viewers also liked (10)

PPS
Chia khoa niem_vui
PPT
Eremkin Cboss Smsc Hl2009
PPT
Hl++2009 Ayakovlev Pochta
PPT
Kosmodemiansky
PPT
архитектура новой почты рамблера
PPT
Serviço Social : Surgimento e Institucionalização no Brasil
PPT
PPTX
POTX
Scalaxy
ODP
Krizhanovsky Vm
Chia khoa niem_vui
Eremkin Cboss Smsc Hl2009
Hl++2009 Ayakovlev Pochta
Kosmodemiansky
архитектура новой почты рамблера
Serviço Social : Surgimento e Institucionalização no Brasil
Scalaxy
Krizhanovsky Vm
Ad

Similar to High Load 2009 Dimaa Rus Ready 16 9 (20)

PPTX
SQL Server Denali
PPTX
SQL________________________________.pptx
PDF
SSAS: multidemention vs tabular mode
PPTX
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
PPT
Database Tuning Method & Technics
PDF
DBArtisan 2016 это не просто face lifting!
PPTX
СУБД осень 2012 Лекция 2
PPT
рит2007 оптимизация бд бесков доронин
PDF
SSAS Multidimension и Tabular: что выбрать?
PPTX
MS Swit 2012 - SQL Server 2012
PPTX
20151112 Что нового в DB PowerStudio 2016
PPTX
физическая структура хранения артемов Ready
PPT
14 расширенные возможности корпоративных субд
PPT
средства оценки производительности
PPT
Производительность конфигураций 1С на примере "УПП для Украины"
PPT
поиск узких мест в производительности My sql ботанический определитель. г. ру...
PDF
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
PDF
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
PPTX
СУБД осень 2012 лекция 5
PDF
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
SQL Server Denali
SQL________________________________.pptx
SSAS: multidemention vs tabular mode
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
Database Tuning Method & Technics
DBArtisan 2016 это не просто face lifting!
СУБД осень 2012 Лекция 2
рит2007 оптимизация бд бесков доронин
SSAS Multidimension и Tabular: что выбрать?
MS Swit 2012 - SQL Server 2012
20151112 Что нового в DB PowerStudio 2016
физическая структура хранения артемов Ready
14 расширенные возможности корпоративных субд
средства оценки производительности
Производительность конфигураций 1С на примере "УПП для Украины"
поиск узких мест в производительности My sql ботанический определитель. г. ру...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
СУБД осень 2012 лекция 5
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ad

More from HighLoad2009 (20)

PDF
Quick Wins
ODP
PPT
Hl2009 1c Bitrix
PDF
Php Daemon
PPTX
Dz Java Hi Load 0.4
PDF
Highload Perf Tuning
PPT
Hl2009 Pr V2
PPTX
Highload2009
PPTX
особенности использования Times Ten In Memory Database в высоконагруженной среде
PPT
бегун
PPT
Hl Nekoval
PPTX
Pl High Load V1.1
KEY
Nyt Prof 200910
PPTX
температура мира
PPT
м.токовинин компромиссная производительность
PPT
бегун
PDF
Smirnov Twisted Python
PPT
Silverspoon Cluster
PDF
Silverspoon2
PPTX
Quick Wins
Hl2009 1c Bitrix
Php Daemon
Dz Java Hi Load 0.4
Highload Perf Tuning
Hl2009 Pr V2
Highload2009
особенности использования Times Ten In Memory Database в высоконагруженной среде
бегун
Hl Nekoval
Pl High Load V1.1
Nyt Prof 200910
температура мира
м.токовинин компромиссная производительность
бегун
Smirnov Twisted Python
Silverspoon Cluster
Silverspoon2

High Load 2009 Dimaa Rus Ready 16 9

  • 1. Миграция на SQL Server 2008:Чего можно ожидать и как с этим боротьсяДмитрий АртемовСтарший консультант[email protected]
  • 2. О чем будем говоритьИнструменты
  • 4. На что можно напороться
  • 5. Как с этим боротьсяПредисловиеЯ постараюсь рассказать о:Вариантах перехода, методике, инструментах и планированииС фокусом на реляционную часть SQL ServerТехнических и не очень аспектах переходаЧасто встречающихся проблемах, ошибках и мифахЯ не планирую рассказывать о:Полном перечне всех возможных проблем миграцииПолном перечне нововведений в SQL Server 2008– пожалуйста спрашивайте, тем не менее Для лучшего усвоения желательно:Иметь некоторую практику работы с SQL Server 2000/2005Иметь базовые знания о SQL Server 2008
  • 6. Определитесь в окруженииАнализ оборудования и инфраструктурыМощность сервера – CPU, RAM, network, storageВозможности дисковой подсистемы – размер, IOs, пропускная способностьИнфраструктура – требования к новому оборудованиюПриложение и БДКуплено или собственная разработкаКто сопровождаетФункционал и редакцииПлатформа определяет возможности 32/64Редакция определяет функционал
  • 7. Общий обзор подходаАнализ окруженияТребования к миграцииВыбор редакцииТребования к оборудованиюИспользовать Upgrade AdvisorИсправить найденные несоответствияВыполнить тестирование на совместимостьПо возможности 100% тестирование кодаПеред миграциейПодробная документация на существующую системуРазработка тестов проверки, стресс тестов и снятие базовой линии производительностиСформулировать и проверить план откатаОпределитьсяс подходом в миграцииIn-place или side-by-sideСобственно миграцияПредмиграционные работыПосле миграцииВот тут-то начинается самое интересное
  • 8. Что поддается миграцииКомпонентыРеляционный движокВключая суб компоненты такие как SQL Agent, Tools, и.т.д.Full-text SearchReporting ServicesAnalysis ServicesData Transformation Services / SSISРедакцииExpress, Developer, Workgroup, Standard, EnterpriseПлатформы32-bit & 64-bit (IA64 иx64)Языки и сортировкиSQL Server 2008 имеет новые сортировки (для соответствия Windows)
  • 9. Варианты миграции:In-Place (замещение)Обновление существующей инсталляции при сохранении пользовательских данныхИмя экземпляра после миграции остается прежнимСтарый экземпляр перекрывается новым (исчезает)Практически 100% автоматический процесс
  • 10. Миграция:Side-by-side (Параллельная установка)Ставится новый экземпляр SQL ServerОбъекты БД переносятся между экземплярами вручнуюCopy Database WizardНе копирует extended procs, alerts, DTS packages, linked servers.Detach -> Copy -> AttachBackup -> RestoreT-SQL Scripts, BCP , Break SAN mirror -> attach Новый и старый миры сосуществуют бок о бокЭто может быть жизнь на том же сервере (именованный экземпляр) или на другом сервереПроцесс в основном ручной
  • 11. Как выбратьзамещение или параллельная установкаКритичность приложения и его сложностьКритичные приложения не обязательно сложны, но имеют жесткие ограничения по тестированию, размерам админ. окна,…Сложные приложения не обязательно критичны, но требуют интенсивного тестирования и можно столкнуться со сложным откатомПрактические соображенияРазмер БД и число объектовЛокальные задания по сопровождениюДлительность допустимого простояАппаратные возможности/возраст серверовЗависимость от системы и других приложенийВремя, необходимое на откат и усилия на это потребныеВозможные требования к параллельному исполнению
  • 12. Перед миграциейСовместимостьЧасть функционала отмерла:Ее просто нет в составе SQL Server 2008Например: ряд недокументированных системных процедур, виртуальные кубы, DUMP database, backup with TRUNCATE ONLY, sp_addgroup, SAC,…Часть функционала приговорена:Не будт поддерживаться в следующей версии за SQL Server 2008 (напр. Notification Services) или будущих версияхЧасть функционала работает иначеНапример: если мы не можем использовать plan guides работаем без него (SQL 2005 выдавал ошибку), REPLACE сохраняет завершающие пробелыСм. документацию о возможных измененияхВыполните функциональное тестирование, чтобы поймать пропущенное Upgrade AdvisorНе все приложения нуждаются в полноценной проверке. Реальные по требности зависят от критичности/сложности приложенияКритичность != сложности и наоборот
  • 13. Перед миграциейОно вам нужно?Как проверить, что будет «потом»?Как подготовиться к неожиданностям?11Только тестирование способно дать ответ на эти вопросыСбор данных по производительностиСравнениеПринятие обоснованного решения
  • 14. Каксобрать данные по производительностиНужно снять реальную нагрузкуПрямо с промышленной системыОтносительно просто
  • 15. Не факт, что поймаем нужный период
  • 16. Существенная дополнительная нагрузка на сервер/дискиСредствами нагрузочных инструментовМожно имитировать любой периодбизнес активности
  • 17. Если последовательно идти этим путем, в долговременной перспективе сплошные +++++
  • 18. Сложность подготовки (разработка и параметризация скриптов нагрузки)
  • 19. Дороговизна инструментов (но можно использовать Visual Studio tests)Если переходим с SQL 2005Берем планы прямо из кеша илиЗаписываем TRCЕсли переходим с SQL 2000TRC – единственная возможность
  • 20. ReadTraceПредназначена для разбора TRC файловМного лучше, чем читать TRC средствами fn_trace_gettableРазбирает TRC в таблицыСтроит связи между пакетами команд и индивидуальными командамиСчитает агрегаты по производительностиНОРМАЛИЗУЕТ ТЕКСТ ЗАПРОСА (что позволяет сравнивать запросы по их тексту)Очень быстро работает
  • 21. Нормализация текста запросаselect round(sum(-CS.Amount*CS.Price/(case when @currid =2 then R.RateTPK else R.RateETC end)*CH.Direction),0) as Result from Rates R (nolock) inner join (Sections S (nolock) inner join (CheckHeaders CH (nolock) inner loop join CheckSpec CS (nolock) --WITH (nolock,index (IX_CheckSpec_ObjectID)) on (CH.ObjectID=CS.ObjectID and CH.CheckID = CS.CheckID) and CS.StoreTypeID is not null) on (CH.ObjectID=S.ObjectID and CS.SectionID=S.SectionID) and S.Fictive=0) /* Отдельно обрабывается доллар */ on (R.CurrID=(case when @currid =2 then 1 else @currid end) and (R.RateDate >= @DateFrom and R.RateDate < @DateTo)) and datediff(d,0,CH.CheckDate) = datediff(d,0,R.RateDate) WHERE CH.ObjectID=@template_ObjectID and (CH.CheckDate<@DateTo and CH.CheckDate>=@DateFrom) and CH.Deleted = 0 and CH.OpID not in (4,8) and CH.ReserveID Is Null option (force order, keepfixed plan) ====================== Превращается в ===========================SELECT ROUND(SUM(-CS.AMOUNT*CS.PRICE/(CASE WHEN @CURRID ={##} THEN R.RATETPK ELSE R.RATEETC END)*CH.DIRECTION),{##}) AS RESULT FROM RATES R (NOLOCK) INNER JOIN (SECTIONS S (NOLOCK) INNER JOIN (CHECKHEADERS CH (NOLOCK) INNER LOOP JOIN CHECKSPEC CS (NOLOCK) ON (CH.OBJECTID=CS.OBJECTID AND CH.CHECKID = CS.CHECKID) AND CS.STORETYPEID IS NOT NULL) ON (CH.OBJECTID=S.OBJECTID AND CS.SECTIONID=S.SECTIONID) AND S.FICTIVE={##}) ON (R.CURRID=(CASE WHEN @CURRID ={##} THEN {##} ELSE @CURRID END) AND (R.RATEDATE >= @DATEFROM AND R.RATEDATE < @DATETO)) AND DATEDIFF(D,{##},CH.CHECKDATE) = DATEDIFF(D,{##},R.RATEDATE) WHERE CH.OBJECTID=@TEMPLATE_OBJECTID AND (CH.CHECKDATE<@DATETO AND CH.CHECKDATE>=@DATEFROM) AND CH.DELETED = {##} AND CH.OPID NOT IN(LIST) AND CH.RESERVEID IS NULL OPTION (FORCE ORDER, KEEPFIXED PLAN)
  • 22. ReadTraceБерем результаты обработки старой и новой БДДелаем выборку по производительности запросовНа основании сравнения текстов командПомещаем результаты в ExcelСортируем и смотрим где «просели»
  • 23. ReadTraceINSERT INTO TEMPDB..MINS25SELECT MIN(DURATION / 1000) 'Минимальное',MAX(DURATION / 1000) 'Максимальное',AVG(DURATION / 1000) 'Среднее',MIN(READS) 'Минимальное',MAX(READS) 'Максимальное',AVG(CAST(READS AS BIGINT)) 'Среднее',MIN(WRITES) 'Минимальное',MAX(WRITES) 'Максимальное',AVG(WRITES) 'Среднее',MIN(CPU) 'Минимальное',MAX(CPU) 'Максимальное',AVG(CPU) 'Среднее',MAX(ROWS) MAXROWS, SUBSTRING(NORMTEXT,1,250) AS NORMTEXT, COUNT(* ) EXECCOUNTFROM DBO.TBLUNIQUESTATEMENTS TSU JOIN DBO.TBLSTATEMENTS TS ON TSU.HASHID = TS.HASHIDWHERE (NORMTEXT LIKE 'Update%' OR NORMTEXT LIKE 'Insert%' OR NORMTEXT LIKE 'Select%' OR NORMTEXT LIKE 'Delete%') AND (NORMTEXT NOT LIKE 'SELECT STATMAN%')GROUP BY SUBSTRING(NORMTEXT,1,250)Следует учесть число вызовов, число выданных записейДля SQL 2005/2008 не забудьте поделить Duration на 1000 (если сравнивать с SQL 2000)
  • 24. ReadTraceСравнивать можноDurationCPUReadWriteНаиболее правильным будет сравнение по чтениямИменно они характеризуют «покосившийся» планDuration в многопользовательской системе практически не имеет смыслаWrite – обычно малый процент от числа чтенийCPU – полезно для ограниченного числа случаев и, как правило, хорошо коррелирует с чтениями
  • 25. Результаты сравненияПо моему опыту результаты сравнения обычно выглядят так (для OLTP систем)Отрицательные значения на графике относятся к тем командам, которые при работе в среде SQL Server 2008 выполнили меньше чтений.
  • 26. Сравнили, нашли. Что дальше?Надо исправлятьсяОпределяем команды, которые стали больше читатьСмотрим sys.dm_db_missing_index _*Query processor все равно не отстанет Анализируем часто используемые командыНезначительное ухудшение для команды, вызываемой 1000 раз потенциально опаснее чем существенное ухудшение для команды,вызванной 5 разБерем для проблемных команд план из кеша (мы уже на SQL 2008!)Строим на основе плана тестПрогоняем через Database Tuning AdvisorПроверяем на граничных условиях параметровМного думаем 
  • 27. Что можно сказать заранееSQL 2005/2008 Обожают include индексы (в разумных пределах это хорошо)Стараются всеми силами избегать дисковых операций (с современными быстрыми стойками это не всегда оправдано)Понять ситуацию теперь куда прощеDMV открывают перед разработчиками и администраторами истинное лицо оптимизатора
  • 28. СовместимостьПосмотрите в документацииBehavior Changes to Database Engine Features in SQL Server 2008Deprecated Database Engine Features in SQL Server 2008Discontinued Database Engine Functionality in SQL Server 2008Breaking Changes to Database Engine Features in SQL Server 2008Что-то Upgrade Advisor мог пропустить, что-то может быть запланировано к разработке и нуждается в корректировке
  • 29. СовместимостьSQL 2008 ставит (большой) набор счетчиков, отслеживающих устаревшие конструкции языкаНо как понять, в какой процедуре используются эти конструкции?select * from sys.sysperfinfo where object_name like '%Deprecated Features%‘(228 row(s) affected)
  • 30. СовместимостьДля перехвата конкретного кода устаревших команд можно использоватьProfilerDeprecation Announcement event classDeprecation Final Support event classЛегко настроить
  • 31. Относительно непросто выйти на объект (через SQL Handle)
  • 32. Требует большого объема профилирования, если ловить код сразуExtended eventsDEPRECATION_ANNOUNCEMENTeventDEPRECATION_FINAL_SUPPORT eventПозволяют еще глубже чем раньше заглянуть внутрь
  • 34. Требуется кодировать (но освоить расширенные события только на пользу)Решено, мигрируем.Что дальше?
  • 35. До начала миграцииПодготовка средыОбеспечиваем «чистую» средуDatabase consistency checksМожно даже сжать (shrink) БДОдин из редких случаев, когда это имеет смыслМеньше файл – быстрее копирование (для параллельной установки)Не прибить ли индексыВозможно будет быстрее перестроить их на новом месте (опять же сокращение размера файлов)Сделать резервные копииПосмотреть вокругНе пересекаемся ли мы с кем-тоНе запланированы ли работы/ которые могут нам помешатьКуда обращаться при возникновении проблемMCSПремьер-поддержка
  • 36. До начала миграцииЗависимостиПредполагается, что работыс Upgrade Advisor и тестированию совместимости законченыСамо приложение“COM Components”, Extended Stored Procedures, sp_OA%, CLR assembliesLinked servers (вопросы разграничения доступа и провайдеры)Зависимости между БД (Cross-database dependencies)DTS пакетыЗависимость от решений третьих фирмПО– backup, management agents, clusters, MPIO, SAN mirroringКомпоненты – шифрование, почта,…Антивирусное ПООбычно его стоит остановить на период миграции,но это не всегда позволительноРазличия между функциональностью редакцийНичто не заменит знание самого приложения!
  • 37. До начала миграцииБазовая линияСоздайте документацию на решениеsp_configure, SQLDIAG, sp_dboptionКонфигурация сети, хранилища, системы безопасностиСнимите базовую линию производительностиНа уровне системы (perfmon, waitstats,…)На уровне приложения (время отклика запросов, число пользователей,…)Разработайте критерии проверки и тесты для их верификацииНе обязательно (но рекомендуется): снимите планы для сложных и/или критичных запросов
  • 38. МиграцияТщательно и подробно документируйте каждый шагСледите за сообщениями от сервера, стойки, сетиУбедитесь, что специалисты поддержки доступныПроверьте что в телефоне не села батарейка Создайте резервные копии БД старого образца иП-Р-О-В-Е-Р-Ь-Т-Е И-ХОтключите startup процедурыВерните max worker thread обратно в (0)Выполните миграцию/обновлениеСледите за процессомСледите за временем, сравните с тестовыми даннымиВыполните первоочередные задачи пост миграции
  • 39. Мигрировали? Славно, теперь все только начинаетсяПриложение вышло под промышленную нагрузкуТеперь его нужно мониторить и править возникающие проблемы
  • 40. После миграцииВ первую очередьПроверьте все журналыЕще раз посмотрите рекомендации Upgrade AdvisorОбновите статистикуFull если возможноSample для больших таблицFiltered для секционированныхПроверьте настройки Агента, задания и задачи по сопровождениюПроверьте настройки безопасностиОсобенно в части меж серверного и меж доменного взаимодействия/прав доступаПроверьте целостность БД
  • 41. После миграцииВ первую очередьConfiguration ManagerОсобенно важен для параллельной установки для настройки среды исполнения, протоколов…При замещении, процесс установки старается сохранить максимально существующую среду: принцип «минимального удивления»Убедитесь, что tempdb имеет правильный размер (кто ее только не использует теперь )DBCC CHECKDB, CTEs, Cursors, MARS, Row Versioning, Service Broker, TriggersПроверьте настройки MODELПроверьте, что все что записно в MASTER верноЗаново наполните Full-Text Search каталогиВыполните запланированные проверки
  • 43. Хочу назад!!Уже после миграции что-то пошло сильно не так, нужно откатыватьсяВероятность такого варианта прямо зависит от глубины предварительного тестированияЧто можно сделать и откуда могут расти ногиНе паниковатьОпределить причину проблемы (если мигрируете с 2000, заранее поучитесь пользоваться новыми средствами диагностики)Может быть все не так и плохо В зависимости от… откат может быть простым и сложнымЕсли процедура прописана и протестирована, будет прощеМониторинг системы для раннего оповещенияИнструменты синхронизацииОсобо много не скажешь, мы пользовались tablediff. Работает быстро и проста в использовании33
  • 44. После миграцииЧто можно сделать в первую очередьТипы данныхПроверьте точность представления и размеры храненияМожет быть использовать Sparse columnЭто может потребовать дополнительных ресурсов (посмотрите когда начинаются преимущества – “Estimated Space Savings by Data Type” в BOL)Persisted columnsИндексирование вычисляемых полейОбновите статистику (особенно, если переходили с SQL 2000)Настройки БДDB_CHAINING, EXECUTE ASPAGE_VERIFY CHECKSUMAUTO_UPDATE_STATISTICS_ASYNCPARAMETERIZATIONАнализ критичных запросовПосмотрите на ранее сохраненные планы и сделайте сравнение с базовой линией производительности
  • 45. После миграцииЧто можно сделать в первую очередь (2)Секционированные таблицыEnterprise EditionСекционированные представления -> Секционированные таблицыСоответствующие настройки уровня блокировокТестируйте, при новом уровне блокировки могут возникать DeadlockПосмотрите на выделение ресурсовsp_configure ‘affinity mask’, sp_configure ‘affinity I/O mask’Новые возможности по управлениюData Collector, reports, DMVs (новые и измененные)Backup CompressionDatabase Tuning Advisor!Воспользуйтесь ранее собранными трассировками
  • 46. После миграцииИспользование нового функционалаПосмотрите на качество индексирования и возможность использования индексированных представленийОцените качество управления статистикойSampling выборки, ручное,автоматическое управлениеАлгоритм автоматического срабатывания не изменился (20%)Оцените необходимость использовнаия хинтовПосмотрите SQL Server Magazine InstantDoc #26406 (флаги отключения хинтов)Уберите хинт или опишите его полезность в документацииПодумайте об использовании plan guide вместо хинтов (теперь можно строить plan guide по данным из кеша)Оцените полезность онлайновых операций (в основном для Enterprise Edition)Как себя чувствует TEMPDB (особенно при переходе с SQL 2000)Управление на основе политикНе следует ли применить ее для внедрения существующих стандартовResource GovernorНачните с минимального числа групп, пулов и правил (в классифицирущей функции)
  • 47. После миграцииНа более дальнюю перспективуНовые типы данныхБолее удобные типы– date, timeЕсли есть написанные CLR типы которые можно перевести на встроенные (geometry, geography, hierarchyid)Переписать«COM компоненты»наCLRXPs на C# или VB вCLRРазграничение доступаСхемы (для миграции с SQL 2000), новые возможности шифрования(TDE), новые возможности аудитаУстаревший функционал нужно переписать/удалитьAS COM assemblies, DTS, ActiveX Script task, SQL Mail, sp_repladdcolumn, updateable subscriptions, sp_dbcmptlevel, ……Если мигрировали с SQL Server 2000, то еще много чего – см. документацию
  • 48. Часто встречающиеся проблемыПосле перехода на SQL Server 2008 запросы исполняются дольше
  • 49. В чем может быть проблема
  • 50. Посмотрите на запросы, нужны ли хинты (или просто попробуйте удалить их)
  • 51. Сделайте полное обновление статистики (для больших таблиц увеличьте % выборки)
  • 55. Иметь его перед миграцией критичного приложенияПосмотрите на http://support.microsoft.com/, http://forums.microsoft.com/, msdn, technetиBooks Online нет ли обновлений.
  • 56. Новый функционал и производительность
  • 57. Чудо? Нет, это не к намКак таковая, миграция не гарантирует резкого роста производительностиРожденный ползать…Если приложение откровенно «тормозит», простой миграции обычно мало
  • 58. Ну, не совсемВ некоторых областях прорыв возможенFull-text SearchЗапрос, охватывающий несколько секцийЗапрос по star joinИндексированные представления, которые теперь можно использовать нормально на секционированных таблицахСжатие данныхФильтрованные индексы и статистика
  • 61. Star JoinSQL Server 2008Способен перемещать фильтрыHash joinDimension 2Hash joinBitmap filter 1Множественные битовые индексыРеорг фильтровBitmap filter 2Dimension 1Fact table scanhttp://en.wikipedia.org/wiki/Bitmap_index
  • 62. DECLARE с присвоениемМожет удивитьset statistics profile onGOdeclare @state varchar(2) = 'CA' select * from authors where state = @state select * from authors where state = 'CA' Rows Executes StmtText EstimateRows------ --------- ------------------------------------------- ------------13 1 select * from authors where state = @state 2.875 13 1 |--Clustered Index Scan(OBJECT:([pubs]2.875 Rows Executes StmtText EstimateRows------ --------- ------------------------------------------- ------------13 1 SELECT * FROM [authors] WHERE [state]=@1 15 13 1 |--Clustered Index Scan(OBJECT:([pubs]15 На этапе компиляции по-прежнему присваивается NULLOPTION (RECOMPILE) для запроса с переменной выравнивает поведение
  • 63. Row creatorИмеет ограниченияUSE Tempdbgocreate table foo (fld1 char(10))goinsert foo (fld1) Values('1'),('2'),('3'),...('1410'),('1411')-- Msg 10738, Level 15, State 1, Line 1001-- The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.46Это сделано сознательно, во избежание очень долгой компиляции1000 элементов: меньше секунды 10 000 элементов: 75 секунд, 100% CPU
  • 64. Resource GovernorКлассифицирующая функция исполняется на каждом подключенииЕсли она слишком сложная/тормозная, всем будет очень плохоЕсли это случилось используйте DAC для исправления (вместо остановки сервера)47
  • 65. ЗаключениеКонцептуально обновление – ничего хитрого, НО следите за человеческим фактором!Жестких правил нет, аккуратность и подробное документирование, тест, тест, тестСовместимость – тест, тест, тестСредства тестирования могут быть разнымиПлан отката – написать и проверить в работе!!Не делайте поспешных выводовРесурсы доступныSQL Server 2008 Upgrade Technical Reference Guide, (почти 500 страниц)Пишите о проблемах на http://connect.microsoft.com/