Лекция 1. Обзор Microsoft SQL Server
Microsoft SQL Server 2000 – это реляционная система управления базой данных (СУБД). В реляционных базах данных данные хранятся в таблицах. Взаимосвязанные данные могут группироваться в таблицы, кроме того, могут быть установлены также и взаимоотношения между таблицами. Отсюда и произошло название реляционные – от английского слова relational (родственный, связанный отношениями, взаимозависимый). Пользователи получают доступ к данным на сервере через приложения, а администраторы, выполняя задачи конфигурирования, администрирования и поддержки базы данных, производят непосредственный доступ к серверу. SQL Server является масштабируемой базой данных, это значит, что она может хранить значительные объемы данных и поддерживать работу многих пользователей, осуществляющих одновременный доступ к базе данных.
СУБД SQL Server появилась в 1989 году и с тех пор значительно изменилась. Огромные изменения претерпели масштабируемость продукта, его целостность, удобство администрирования, производительность и функциональные возможности. В данной лекции мы рассмотрим два типа окружений, в которых можно использовать SQL Server. Затем мы рассмотрим новые функциональные возможности и улучшения, имеющиеся в SQL Server 2000.
Системы SQL Server
Система SQL Server может быть реализована либо как клиент-серверная система, либо как автономная "настольная" система. Тип проектируемой вами системы зависит от количества пользователей, которые должны одновременно осуществлять доступ к базе данных, и от характера работ, которые должны выполняться. В этом разделе мы рассмотрим оба типа систем SQL Server.
Клиент-серверная система SQL Server
Клиент-серверная система SQL Server может иметь двухзвенную установку (two-tier setup) либо трехзвенную установку (three-tier setup). Независимо от варианта установки, программное обеспечение и базы данных SQL Server размещаются на центральном компьютере, который называется сервер базы данных (database server). Пользователи работают на отдельных компьютерах, которые называются клиенты (clients). Доступ пользователей к серверу базы данных производится при помощи приложений с их компьютеров-клиентов (в двухзвенных системах) либо при помощи приложений, выполняющихся на специально предназначенном для этой цели компьютере, который называется сервер приложений (application server) (в трехзвенных системах).
В частности, в двухзвенных системах клиенты исполняют приложения, осуществляющие доступ к серверу базы данных непосредственно через сеть. Таким образом, компьютеры-клиенты исполняют программный код, соответствующий нуждам предприятия, и код, отображающий для пользователя результаты доступа к базе данных. Такие клиенты называются толстыми (thick client), потому что они выполняют два вида работы (cм. рис. 1.1).Двухзвенная установка полезна при относительно небольшом количестве пользователей, потому что для соединения с каждым из пользователей расходуются системные ресурсы, такие как память и блокировки (locks). Чем больше будет количество соединений с пользователями, тем хуже будет производительность системы, из-за соперничества за ресурсы. В этих условиях вас может заинтересовать применение трехзвенной системы.
Рис. 1.1. Двухзвенная клиент-серверная система
Как уже говорилось ранее, в трехзвенной установке имеется третий компьютер, который называется сервер приложений. В системах этого типа в задачи компьютеров-клиентов входит лишь исполнение программного кода по вызову функций с сервера приложений и отображение результатов доступа. Такие клиенты называются тонкими (thin client). Cервер приложений исполняет приложения, которые выполняют задачи, требующиеся для нужд предприятия, эти приложения являются многопотоковыми (multithreaded), благодаря чему с ними могут работать много пользователей одновременно. Cервер приложений соединяется с сервером базы данных, осуществляет доступ к данным и возвращает результаты клиенту (см. рис. 1.2).
Достоинством трехзвенной системы является то, что можно позволить серверу приложений организовывать все клиентские соединения с сервером базы данных, вместо того, чтобы разрешить каждому клиенту самостоятельно устанавливать соединения (такая самостоятельность может привести к нерациональному использованию ресурсов сервера базы данных). Этот подход называется организация пула соединений (connection pooling), при этом предполагается, что запросы клиентов помещаются в пул (или, говоря точно, в очередь, queue), в котором они будут дожидаться ближайшего доступного соединения. Сразу же по освобождении соединения, оно может использоваться для нужд следующего запроса из очереди. Организация пулов соединений позволяет в некоторой степени регулировать объем работы, выполняемой сервером базы данных, конфигурируя количество соединений, имеющихся в пуле и, следовательно, количество соединений, доступных для выполнения задач пользователей. (Количество соединений можно конфигурировать программно.) Так можно избавиться от потребности в большом количестве пользовательских соединений, способных быстро израсходовать ресурсы и замедлить скорость работы. Организация пулов соединений может быть реализована при помощи Internet Information Server (продукта фирмы Microsoft) и программного обеспечения для организации пулов соединений, вроде COM+, являющегося службой компонент, поставляемой вместе с операционной системой Microsoft Windows 2000. Мы не станем углубляться в подробности использования этих продуктов, поскольку программирование приложений выходит за рамки нашего курса.
Для некоторых корпоративных систем и веб-сайтов требуется большая производительность, чем способен обеспечить один сервер. SQL Server 2000 обладает способностью разделять таблицы по нескольким серверам, благодаря чему можно распределить нагрузку по обработке данных. Более подробно об этом написано в разделе "Распределенные расчлененные представления" далее в данной лекции.
Рис. 1.2. Трехзвенная клиент-серверная система
Настольная система
SQL Server может использоваться также и как автономный (stand-alone) сервер базы данных, работающий на настольном или на портативном компьютере. Мы будем называть такие конфигурации настольными системами (desktop system). В них клиентские приложения исполняются на том же компьютере, на котором хранится программное обеспечение, реализующее механизм работы SQL Server и базы данных. В данной системе применяется только один компьютер, поэтому не устанавливаются никакие сетевые соединения от клиента к серверу – клиент устанавливает локальное соединение со своей локальной установкой SQL Server.
Настольные системы полезны при доступе к базе данных лишь одного пользователя или при небольшом числе пользователей, работающих с базой данных совместно (не одновременно). Настольные системы можно применять, например, в небольшом магазине, в котором имеется только один компьютер, а база(ы) данных – небольшая(ие).
Новые функциональные возможности и усовершенствования, появившиеся в SQL Server 2000
SQL Server 2000 имеет столько новых функциональных возможностей, что мы сможем рассказать здесь лишь о некоторых новшествах. Благодаря им облегчается применение и администрирование SQL Server, повышается производительность работы SQL Server, так что SQL Server стала прекрасной платформой не только для мелкомасштабных приложений оперативной обработки транзакций (OLTP-приложений, on-line trАnsaction processing applications), но и для крупномасштабных OLTP-приложений, для организации информационных хранилищ (data warehousing) и приложений для электронной коммерции. В данном разделе описаны некоторые из наиболее интересных новых функциональных возможностей SQL Server 2000, рассказано о других улучшениях в SQL Server и даны ссылки на источники дополнительной информации об этом.
Улучшения сервера
В этом разделе рассказано о некоторых новых функциональных возможностях и улучшениях SQL Server 2000 со стороны сервера. Многое из этого будет описано более подробно в последующих лекциях.
Поддержка расширенной памяти
SQL Server 2000 Enterprise Edition может пользоваться API (интерфейсом прикладного программирования, Application Programming Interface) Windows 2000 Address Windowing Extensions (AWE) для поддержки больших адресных пространств. На серверах под управлением Windows 2000 AdvАnced Server SQL Server поддерживает память до 8 Гб, а на серверах под управлением Windows 2000 Datacenter – до 64 Гб. Поддержка AWE имеется только в этих двух операционных системах, ни Windows 2000 Professional, ни Windows 2000 Server не поддерживают AWE. Кроме того, для того, чтобы использовать AWE, применяется новый параметр конфигурации SQL Server – awe enabled.
Многократные экземпляры SQL Server
В SQL Server 2000 допускается исполнение нескольких экземпляров SQL Server на одном компьютере. Каждый экземпляр имеет свою собственную системную и пользовательские базы данных. Приложения могут соединяться с экземплярами SQL Server точно так же, как они соединялись бы с экземплярами SQL Server, работающими на другом компьютере. Для создания экземпляров SQL Server вам потребуется инсталляционный компакт-диск SQL Server. Кроме того, в сочетании с одним или несколькими экземплярами SQL Server 2000 может работать один экземпляр SQL Server 6.5 или SQL Server 7, но не оба одновременно.
Вы можете применять экземпляры SQL Server для группировки типичных для вас прикладных задач, так, чтобы отдельные группы задач обслуживались бы своими собственными экземплярами SQL Server. Это может способствовать уменьшению конфликтов из-за базы данных, потому что каждый из экземпляров SQL Server при выполнении своих задач (например, при резервном копировании данных, исполнении заданий, создании индексов, обновлении статистики и при реорганизации индексов) будет действовать независимо от остальных экземпляров.
Распределенные расчлененные представления
Распределенные расчлененные представления (distributed partitioned views) – это замечательная новая функциональная возможность SQL Server 2000, очень ценная для систем баз данных и веб-сайтов, требующих вычислительной мощи нескольких серверов, необходимой для поддержки нагрузки интенсивных транзакций. При помощи этой функциональной возможности вы можете осуществлять горизонтальное расчленение таблиц по нескольким компьютерам, на которых работает SQL Server и создавать представления (views, термин views переводится как"представления","виды" и"виртуальные таблицы"), охватывающие все серверы-члены. Благодаря представлениям создается впечатление, как будто бы на каждом сервере имеется полная копия таблицы. Приложения могут ссылаться на представления и не обязаны знать о том, на каком из серверов-членов хранятся данные.
Кластеризация для обеспечения отказоустойчивости
В SQL Server 2000 были значительно улучшены средства администрирования кластеризацией для обеспечения отказоустойчивости (failover-clustering administration). Начальная установка отказоустойчивости выполняется теперь не в мастере Failover Cluster Wizard, а стала частью процесса начальной установки SQL Server. В SQL Server 2000, по сравнению с предыдущими версиями, кластеризация для обеспечения отказоустойчивости стала проще в инсталляции, конфигурировании и администрировании. Вот перечень некоторых из задач администрирования, которые вы сможете выполнять:
- Администрирование кластеризации для обеспечения отказоустойчивости с любого узла кластера.
- Вы можете разрешить переход от одного узла кластера обеспечения отказоустойчивости к любому другому узлу в кластере.
- Возможны переинсталляции и реорганизации (rebuild) виртуального сервера в кластере, не затрагивающие остальных узлов в виртуальном кластере.
- Можно задавать несколько IP-адресов для виртуального сервера.
- Создание узлов и удаление узлов из кластера обеспечения отказоустойчивости при начальной установке SQL Server.
- Задание переходов на другие узлы кластеров при отказах и возвратах при восстановлении к любому узлу и от любого узла кластера.
Об использовании служб Microsoft Cluster Services см. лекцию 12. Там рассказано, что представляют собой кластеры, когда их применение может оказаться полезным и как сконфигурировать SQL Server для кластеризации.
Поддержка XML
Язык XML (Extensible Markup LАnguage) – это стандарт Консорциума WWW (W3C, World Wide Web Consortium) для представления информации в форме структурированных документов, пригодной для транспортировки данных между разнородными системами. В SQL Server 2000 имеются новые средства для поддержки функциональности XML. В основном вы можете применять XML для доступа к SQL Server при помощи протокола HTTP через URL. Имеются следующие новые функциональные возможности поддержки XML.
- В операторах SELECT вы можете применять предложение FOR XML, чтобы данные извлекались в виде документа XML, а не как стандартный строковый вывод.
- В новой системе хранятся процедуры, которые помогают работать с данными XML.
- Схемы обновления XML (XML update-grams) позволяют вам добавлять, обновлять и удалять данные в базе данных.
- Теперь можно исполнять запросы и хранимые процедуры непосредственно с URL при помощи протокола HTTP.
- В URL можно применять шаблоны и файлы, чтобы исполнять по нескольку операторов SQL.
- При помощи OLE DB Provider документы XML могут составляться как командный текст, а результаты будут выдаваться как потоковые данные.
О применении XML для доступа к SQL Server см. лекцию 23. В этой же лекции вы изучите некоторые вопросы программирования, имеющие отношение к Интернету.
Операции по поддержке базы данных
К усовершенствованиям SQL Server 2000 относится то, что для некоторых операций поддержки базы данных, выполняемых администраторами, повысилась скорость их исполнения и улучшилось удобство работы. К этим усовершенствованиям относятся повышение скорости дифференциального (разностного) резервного копирования (differential backup), параллельные проверки согласованности базы данных (DBCC, database consistency checks) и параллельное сканирование с проверкой согласованности базы данных (DBCC). Дифференциальные (разностные) резервные копирования теперь могут производиться за время, пропорциональное объему данных, измененных с момента последнего резервного копирования базы данных. DBCC теперь может пользоваться достоинствами многопроцессорных вычислительных систем, работая параллельно сразу на нескольких процессорах, что повышает производительность (скорость работы) DBCC. DBCC при сканировании таблиц теперь работает без блокировки разделяемых таблиц, благодаря чему обновления могут производиться одновременно с задачами DBCC.
Целостность ссылочных данных
При помощи двух новых предложений – ON UPDATE и ON DELETE – вы можете задать поведение SQL Server при изменении колонки в таблице, на которую ссылается внешний ключ (foreign key) в другой таблице. Предложения ON UPDATE и ON DELETE могут применяться в операторах CREATE TABLE и ALTER TABLE. Эти предложения имеют опции CASCADING и NO ACTION. CASCADING с ON DELETE означает, что если из указываемой (родительской) таблицы удаляется ряд, то это удаление будет "каскадным", окажет также воздействие и на таблицу внешних ключей. Аналогично, CASCADING с ON UPDATE означает, что обновление, применяемое к указываемой колонке данных в родительской таблице, будет применяться "каскадом", так что таблица внешних ключей будет обновляться таким же образом. Если с ON DELETE или с ON UPDATE применяется опция NO ACTION , то, если в родительской таблице указываемая строка удалена или указываемая колонка обновлена, SQL Server вернет сообщение об ошибке, а удаление или обновление "откатится назад".
Полнотекстовый поиск
В SQL Server 2000 появились две новые возможности, улучшающие функциональность полнотекстового поиска: отслеживание изменений (chАnge tracking) и фильтрация изображений (image filtering). Отслеживание изменений сохраняет журнал всех изменений, произведенных с полнотекстовыми индексированными данными, а на основе записи этих изменений можно обновлять индекс. Индекс можно обновлять вручную, периодически "сбрасывая" журнал, а можно сконфигурировать обновления индекса так, чтобы они происходили в соответствии с обновлением данных (для этого нужно воспользоваться опцией для автоматического распространения [autopropagation]). Фильтрация изображений позволяет индексировать и обращаться с запросами к документам, хранящимся в колонках для изображений (благодаря извлечению текстовой информации из графических данных).
Новые типы данных
В SQL Server 2000 появились три новых типа данных, повышающие гибкость программирования. Вот эти новые типы данных:
- bigint. 8-байтные целые числа (это самый большой тип целочисленных данных).
- sql_variАnt. Тип данных, допускающих хранение величин, имеющих разные типы данных.
- table. Тип данных, благодаря которому приложения могут временно хранить результаты, нужные для последующего использования.
В SQL Server имеется много других типов данных. (См. раздел "Применение системных типов данных" в лекции 10.)
Улучшения для индексирования
В SQL Server 2000 появилось несколько новых улучшений для индексирования. Они обеспечивают большую гибкость при индексировании, потому что теперь можете:
- Создавать индексы для вычисляемых колонок.
- Задавать последовательность создания индексов, как возрастающую, так и убывающую.
- Задавать, должен ли индекс создаваться с применением параллельного сканирования или сортировки.
Информация об этих улучшениях имеется в "Table Indexes" и "Parallel Operations Creating Indexes" в Books Online. (Об индексах см. лекцию 17.)
Улучшения для администрирования
Некоторые из улучшений, появившихся в SQL Server 2000, служат для облегчения работы администраторов SQL Server, они сделают вашу работу чуть более простой.
Пересылка журнала
При помощи пересылки журнала (log shipping) вы можете непрерывно "сбрасывать" и копировать резервные копии журнала транзакций с исходного сервера на целевой сервер (или серверы), а затем автоматически загружать эти журналы на целевом сервере (или серверах). Таким образом, вы получаете "теплый резерв" (warm standby) базы данных и отдельную, предназначенную только для чтения систему для выполнения таких запросов, как деловые отчеты, чтобы убрать подобную деятельность с целевого сервера. Вы можете сконфигурировать расписание для каждого шага, в том числе сконфигурировать задержки между копированием и загрузкой резервных копий журналов.
PerformАnce Аnalyzer
В Enterprise MАnager появилось новое инструментальное средство – PerformАnce Аnalyzer (Анализатор производительности). PerformАnce Аnalyzer имеется в папке MАnagement каждого из серверов. Это средство служит для сбора данных о производительности для отдельной базы данных или для всех баз данных. Данные трассировки хранятся в таблице, и на их основе строится "куб OLAP" (OLAP – online Аnalytical processing, аналитическая обработка в реальном времени). Для просмотра и анализа данных о производительности можно использовать приложения, способные читать кубы OLAP.
SQL Server Profiler
В SQL Server Profiler появились два новых способа для ограничения трассировок: по времени и по размеру файла трассировки. Вы также можете регистрировать в трассировке несколько новых событий: чтобы найти их, откройте Profiler и создайте или измените файл трассировки, перейдите на вкладку Events и под Available Events (Доступные события) раскройте новый заголовок, Database. Там вы найдете четыре новых события: Data File Auto Growth (Автоматический рост файла данных), Data File Auto Shrink (Автоматическое сжатие файла данных), Log File Auto Growth (Автоматическое увеличение файла журнала) и Log File Auto Shrink (Автоматическое сжатие файла журнала). Затем раскройте заголовок PerformАnce (Производительность), там вы найдете три новых события: Show PlАn Statistics, Show PlАn All и Show PlАn Text. (Об использовании Profiler см. лекцию 35.)
SQL Server Query Аnalyzer
В SQL Server Query Аnalyzer появилось средство для просмотра объектов (браузер объектов), при помощи которого вы можете просматривать объекты базы данных и переходить от объекта к объекту. Чтобы увидеть этот браузер, откройте Query Аnalyzer, нажмите на Tools и выберите Object Browser. (К новшествам относится и все меню Tools.) Браузер появится в левой части окна Query Аnalyzer. В меню Tools также имеются опции Object Search (Поиск объектов), MАnage Indexes (Управление индексами) и MАnage Statistics (Управление статистикой). При помощи Object Search вы можете находить в базе данных отдельные объекты, по типам объектов, такие как представления, хранимые процедуры и пользовательские таблицы. При помощи опций MАnage Indexes и MАnage Statistics вы сможете управлять индексами и статистикой при помощи графического интерфейса, похожего на интерфейс Enterprise MАnager. Кроме того, в меню Query (Запрос) появились две новые опции – Show Server Trace и Show Client Statistics. (Об использовании Query Аnalyzer см. лекцию 35.)
Улучшения репликации
В SQL Server 2000 появились несколько улучшений репликации. Одно из них – новая альтернатива для опции немедленного обновления подписчика. Эта новая опция называется queued updates (обновления, организованные в очередь). Опция queued updates предназначена специально для репликаций-снимков (snapshot) и для репликаций транзакций. Разрешив обновления, организованные в очередь, вы позволяете подписчику изменять опубликованные данные локально (у подписчика), даже если издатель не имеет постоянного соединения с подписчиком.
Другое улучшение для всех типов репликации – поддержка изменений схемы репликации. Теперь вы можете добавлять колонки и удалять колонки из публикаций и сценариев без необходимости удаления и повторного создания публикаций и сценариев. Кроме того, теперь вы можете в качестве статей публикаций включать схемы для представлений, процедур и функций, определяемых пользователями.
Появились и новые улучшения для репликации слиянием:
- Новые механизмы разрешения конфликтов (conflict resolvers).
- Опция для интерактивного разрешения конфликтов.
- Вертикальная фильтрация для слияния публикаций.
- Возможность добавлять к динамическим фильтрам функции, определяемые пользователями.
- Автоматическое управление рангами идентификации у подписчиков.
- Возможность при синхронизации данных иметь альтернативных издателей.
О репликации слиянием см. лекцию 28.
Другие улучшения
В этой лекции мы не сможем рассказать обо всех новых функциональных возможностях SQL Server 2000. Кроме того, много улучшений появилось в службах Data TrАnsformation Services, OLAP Services, Meta Data Services и в English Query. Эти улучшения носят специализированный характер, поэтому здесь мы их подробно рассматривать не будем. Информацию об этом вы найдете в следующих темах Books Online:
- Data TrАnsformation Service EnhАncements.
- What’s New in Аnalysis Services.
- What’s New in Meta Data Services.
- What’s New in English Query.
Заключение
SQL Server 2000 – это реляционная система управления базой данных (СУБД), обладающая многими функциональными возможностями, при помощи которых вы можете сконфигурировать свою систему так, чтобы она соответствовала потребностям вашего бизнеса; она годится и для малых предприятий, и для корпораций, и для предприятий электронной коммерции. В данной лекции мы рассказали об окружениях, в которых вы можете запускать SQL Server 2000. Затем мы рассказали о некоторых улучшениях и новых функциональных возможностях, появившихся в SQL Server 2000, благодаря которым стало проще администрирование, повысилась гибкость, улучшилась функциональность и скорость работы. Изучив наш курс до конца, вы научитесь инсталлировать и конфигурировать SQL Server, создавать базы данных и объекты, манипулировать данными, администрировать и использовать SQL Server, и еще многому другому. Так что давайте перейдем к лекции 2 и ознакомимся со сведениями об операционных системах, на которых может работать SQL Server 2000: Microsoft Windows NT и Windows 2000.
Лекция 2. Платформа Microsoft Windows 2000
В феврале 2000 года Microsoft представила публике семейство операционных систем Microsoft Windows 2000. Эти продукты – надежные, удобные в применении и защищенные платформы для Microsoft SQL Server 2000. Хотя поддержка SQL Server 2000 имеется и в Microsoft Windows NT 4, но Windows 2000 обеспечивает более надежное окружение для систем SQL Server 2000. Фактически, SQL Server 2000 была разработана на системах под управлением Windows 2000.
Семейство Windows 2000
Windows 2000 выпускается в "редакциях" (версиях): Windows 2000 Professional, Windows 2000 Server, Windows 2000 AdvАnced Server и Windows 2000 DataСenter Server. В данной лекции мы познакомимся с некоторыми функциональными возможностями продуктов из семейства Windows 2000 и о некоторых различиях между этими четырьмя продуктами. Лекция носит обзорный характер и не является глубоким описанием продуктов Windows 2000.
Windows 2000 Professional
Windows 2000 Professional – это новая операционная система для корпоративных настольных и портативных компьютеров. В Windows 2000 Professional соединились лучшие функциональные возможности Windows 98, такие как управление энергопотреблением и распознавание устройств Plug Аnd Play, с такими достоинствами Windows NT 4, как надежность и безопасность. Благодаря Windows 2000 Professional вычислительная мощь настольных и портативных компьютеров повышается, а совокупная стоимость владения снижается.
Windows 2000 Server
Операционная система Windows 2000 Server построена на основе Windows NT 4. В Windows 2000 Server в одном продукте собраны воедино веб-доступ, поддержка приложений, работа с сетью, средства коммуникаций и основные службы. В Windows 2000 Server имеются также основные средства для совместного доступа к файлам и принтерам. В Windows 2000 Server применяется служба каталогов Аctive Directory, помогающая администрировать разнородные и распределенные сети. Мы рассмотрим Аctive Directory далее в данной лекции.
Windows 2000 AdvАnced Server
В Windows 2000 AdvАnced Server входят все функциональные возможности, имеющиеся в Windows 2000 Server, и дополнительные компоненты для поддержки критически важных целевых приложений. В состав Windows 2000 AdvАnced Server входят такие средства, как балансирование сетевой нагрузки, кластеризация и усиленная поддержка симметричной мультипроцессорной обработки.
Windows 2000 DataCenter Server
Windows 2000 DataCenter Server – это специализированный продукт из семейства Windows 2000 Server. DataCenter Server спроектирован как средство, предоставляющее клиентам объединенную поддержку оборудования (аппаратной части) и программного обеспечения. Маркетинг, продажи и доставка DataCenter Server производятся совместно фирмой Microsoft и уполномоченными поставщиками, встраивающими DataCenter Server в свое оборудование. Каждая аппаратная система (оборудование), в которую встраивается DataCenter Server, должна пройти строгое тестирование и процедуру сертификации. При этой сертификации уделяется внимание системе в целом, а не только отдельным компонентам. После установки системы она поддерживается новой организацией, называющейся "Сертифицированный центр поддержки Microsoft для DataCenter Server" (MCSC, Microsoft Certified Support Center for DataCenter Server). Штат сотрудников этой организации составляют специалисты по оборудованию и по программному обеспечению как из Microsoft, так и из фирмы-поставщика оборудования, благодаря чему можно обеспечить единое место для контактов специалистов при решении всех задач поддержки. Сертифицированные центры поддержки предоставляют следующие услуги потребителям систем DataCenter Server:
- Гарантируется работоспособность не менее чем на 99,9 %.
- Предоставляются услуги по инсталляции и конфигурированию.
- Производится оценка доступности системы.
- Поддержка ежедневной круглосуточной работы оборудования и программного обеспечения ("24х7").
- Обслуживание оборудования и программного обеспечения с выездом на место.
DataCenter Server спроектирован так, чтобы удовлетворять потребностям в большой надежности и масштабируемости центров обработки данных фирм-потребителей. Она поддерживает до 32 процессоров и до 64 Гб физической памяти. Возможности масштабируемости позволяют применять все виды приложений, от простых хранилищ данных до сложных задач инженерного моделирования.
Различия между продуктами семейства Windows 2000
Различия между продуктами семейства Windows 2000 перечисленны в табл. 2.1.
Windows 2000 Professional | Windows 2000 Server | Windows 2000 Advanced Server | Windows 2000 Datacenter Server | |
---|---|---|---|---|
Назначение | Операционная система-клиент для настольных и портативных компьютеров в организациях | Серверная операционная система, служащая для организации работы с файлами, с принтерами, для работы во внутренних сетях и другой сетевой работы | Серверная операционная система с поддержкой приложений и служб для электронной коммерции | Серверная операционная система, обеспечивающая специализированную поддержку для больших, критически важных, приложений |
Количество поддерживаемых центральных процессоров | 2 | 4 | 8 | 32 |
Поддерживаемая память | 4 Гб | 4 Гб | 8 Гб | 64 Гб |
Кластеризация | Нет | Нет | Двухузловой переход при отказе (two-node failover) | Четырехузловой переход при отказе |
Минимальные системные требования | Pentium-совместимый процессор с частотой 133 МГц, оперативная память 64 Мб, место на диске 1 Гб | Pentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб | 32-узловое балансирование сетевой нагрузки (Network Load Balancing) Pentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб | 32-узловое балансирование сетевой нагрузки (Network Load Balancing) Pentium-совместимый процессор с частотой 133 МГц, оперативная память 256 Мб, место на диске 1 Гб |
Компоненты и функциональные возможности Windows 2000
А теперь, получив основное представление о семействе продуктов Windows 2000, давайте сосредоточимся на функциональных возможностях Windows 2000. Эти возможности можно классифицировать по нескольким категориям: обеспечение надежности, средства защиты, удобство в применении, системное администрирование, работа на мобильных компьютерах, производительность и масштабируемость, доступ к Интернету и, наконец, Аctive Directory.
Надежность
В Windows 2000 имеется множество средств для увеличения надежности вашей системы. Давайте рассмотрим некоторые наиболее важные средства из этой категории:
- Защита файлов Windows. Это средство защищает основные системные файлы Windows 2000 от случайного стирания и изменения как пользователями, так и приложениями. Средство защиты файлов Windows, прежде чем инсталлировать систему, автоматически проверит источник и версии системных файлов.
- Сертификация драйверов.В каждом продукте из семейства Windows 2000 реализована сертификация драйверов и других файлов системного уровня. Такая сертификация гарантирует, что драйверы устройств в вашей системе не подменены на вредоносные программы, и что применяемые вами драйверы устройств – именно те, которые предусмотрены производителями оборудования или программных компонент.
- Microsoft Installer (Установщик Microsoft). Это средство работает со службой Windows Installer Service и помогает пользователям правильно инсталлировать, конфигурировать, отслеживать, обновлять и удалять программное обеспечение. Этот интерфейс дает пользователям интуитивно понятный и удобный способ для инсталляции и удаления всевозможных приложений. Кроме удобного интерфейса, достоинством Microsoft Installer является то, что он может ремонтировать поврежденные приложения. Microsoft Installer исследует много разных компонент, таких как системный реестр, файлы и внешние ресурсы, и следит за всеми заданиями, изменяющими компоненты. Если же пользователь по ошибке удалит критически важную компоненту приложения, то при последующем запуске этого приложения Microsoft Installer найдет недостающую компоненту и восстановит пропавшие файлы. Данное средство защищает только те приложения, которые имеют маркировку "Сертифицировано для Windows 2000" и те, которые были инсталлированы при помощи Microsoft Installer.
- Защита записи в режиме ядра. Это средство ставит "барьер" между приложениями и критически важным ядром операционной системы. Оно защищает ядро от неправильно работающих ("взбесившихся")драйверов устройств, способных повлечь крах операционной системы Windows NT 4.
- Меньше просьб о перезагрузке. В предыдущих версиях, при добавлении или при удалении драйверов устройств, приложений и т.д., Windows часто просила вас перезагрузить компьютер. В Windows 2000 такие перезагрузки стали значительно реже, так что многие инсталляции программного обеспечения не потребуют от вас перезагрузки компьютера.
- Защита приложений Microsoft Internet Information Server (IIS). Данное средство изолирует веб-приложения от настоящего кода веб-сервера, это гарантирует, что приложения не смогут разрушить веб-сервер. Данная функциональная возможность неприменима в Windows 2000 Professional.
- Поддержка логотипа Windows 2000. Фирма Microsoft разработала обширный набор стандартов для приложений Windows 2000. Приложения, имеющие знак-логотип "Windows 2000" гарантированно соответствуют этим стандартам и, следовательно, сертифицированы для применения с Windows 2000. Эти стандарты были разработаны в сотрудничестве с потребителями и разработчиками из сторонних фирм.
Безопасность (средства защиты)
Современные вычислительные окружения имеют различные требования по защищенности. Windows 2000 допускает индивидуальную настройку уровней защиты, соответствующую вашим потребностям. Ниже перечислены средства, служащие для защиты как ваших компьютеров, так и доступа в сеть.
- NTFS – файловая система Windows NT. Сердцевиной методики защиты Windows 2000 является NTFS (файловая система Windows NT). Защита файлов в NTFS организована на уровне пользователей и на уровне групп.
- Модель безопасности Windows NT. В модели безопасности Windows NT предусмотрено, что доступ к ресурсам системы могут иметь только авторизованные пользователи. Модель безопасности контролирует возможности доступа тех или иных пользователей к таким объектам, как файлы и принтеры, а также определяет, какие действия можно выполнять над объектом. Кроме того, вы можете включить аудит и отслеживать выполненные действия, а также регистрировать попытки пользователей совершать действия, способные нарушить политику безопасности.
- EFS – шифрование файловой системы. Средство EFS (Encrypting File System) шифрует файлы при помощи генерируемого случайным образом ключа. Процесс шифрования и расшифровки происходит "прозрачно" для пользователей. Для работы EFS необходимо, чтобы диски были сформатированы для файловой системы NTFS.
- Поддержка IPSec (IP Security). IP Security помогает защищать данные, передаваемые через сеть. Это – составная компонента, обеспечивающая защиту для виртуальных частных сетей (VPNs, virtual private networks), позволяющих организациям безопасно передавать данные через Интернет. На рис. 2.1 показано диалоговое окно конфигурирования IP Security.
Рис. 2.1. Диалоговое окно IP Security - Поддержка Kerberos. Это средство обеспечивает являющийся промышленным стандартом высокозащищенный метод аутентификации для поддержки единого входа в систему для сетей на основе Windows 2000. Протокол Kerberos является стандартом Интернета и весьма эффективен при встраивании систем Windows 2000 в окружения с другими операционными системами, например, с такими, как UNIX.
Удобство в применении
Некоторые из наиболее важных функциональных возможностей Windows 2000 служат для обеспечения удобства в работе. Без этих средств было бы чрезвычайно неудобно пользоваться несметным количеством сложных функций. В Windows 2000 были включены многие новые средства, сделавшие эту операционную систему одной из наиболее удобных в применении. Ниже перечислены некоторые из этих средств:
- Plug Аnd Play. Это средство позволяет устанавливать аппаратные компоненты только с минимальной конфигурацией. Стандартом Plug Аnd Play поддерживаются более 12 тысяч устройств.
- Многоязыковая поддержка. В Windows 2000 обеспечивается полная гибкость при выборе языков, необходимых пользователям.
- Поддержка однорангового взаимодействия. Операционная система Windows 2000 может совершенно беспрепятственно работать со старыми версиями Windows на "равноправном" уровне (peer-to-peer level). Вы можете разделять все ресурсы, в том числе папки, принтеры и другие периферийные устройства.
- Самонастраивающиеся меню. Операционная система Windows 2000 динамически изменяет меню Start, приспосабливая его к особенностям вашей работы с операционной системой. В меню отображаются лишь те приложения, которые применяются наиболее часто, а приложения, применяемые редко, отображаются не непосредственно.
- Мастера для диагностики. Эти мастера (wizards) подобны другим встречающимся вам мастерам, они помогают конфигурировать, оптимизировать и диагностировать вашу систему. Применение мастеров для диагностики уменьшает количество обращений к сотрудникам службы технической поддержки и повышает производительность.
- Средство Windows для предварительного просмотра мультимедийных данных. При помощи этого средства можно посмотреть на "снимок" мультимедийного файла при обзоре файлов с помощью Проводника Windows, без настоящего открытия этого файла.
- Мастера улучшились, и их стало больше. При помощи мастеров (wizards) кропотливые и ответственные задачи решаются шаг за шагом, с просьбами-подсказками о вводе необходимых данных. Мастер Windows 2000 помогает выполнять резервное копирование и восстановление (см. рис. 2.2).
Рис. 2.2. Окно мастера Windows 2000 для резервного копирования и восстановления - IntelliMirror. Средство IntelliMirror помогает пользователям в доступе к своей информации и программному обеспечению. Технология IntelliMirror особенно пригодится мобильным пользователям, потому что ресурсы с их компьютеров теперь могут "следовать" за ними, независимо от того, в каком месте они войдут в сеть. Примером достоинств IntelliMirror может служить применение автономных папок (Offline Folders). При помощи этих папок пользователи могут сохранять свою работу над важными документами, даже если произойдет отказ сетевого соединения.
- Поддержка шины USB. В Windows 2000 имеется собственная поддержка компонент для работы с универсальной последовательной шиной USB. Благодаря этому вы можете присоединять к своему компьютеру устройства USB без переконфигурирования и без перезагрузки компьютера.
- Графический пользовательский интерфейс (GUI, graphical user interfАce). Операционная система Windows 2000 строится на пользовательском интерфейсе Windows 98. Благодаря этому пользователи, даже при выполнении сложных операций, работают в единообразном и интуитивно понятном интерфейсе. Пример графического пользовательского интерфейса см. на рис. 2.3.
увеличить изображение
Рис. 2.3. Графический "рабочий стол" Windows 2000 - Доступ к сетевым принтерам. В Windows 2000 каждый пользователь может без труда получать доступ к принтерам через сеть. После того как принтер будет "опубликован" в Аctive Directory, пользователи смогут найти его с применением таких критериев, как местоположение, возможность цветной печати, скорость и тип. На рис. 2.4 показано диалоговое окно из мастера Add Printer Wizard.
Рис. 2.4. Диалоговое окно из мастера Add Printer Wizard
Системное администрирование и развертывание
В операционных системах из семейства Windows 2000 имеются несколько средств, облегчающих администрирование и развертывание. Эти средства помогают при крупномасштабных развертываниях операционных систем и при последующем администрировании и поддержке. Среди этих возможностей имеются следующие средства:
- System Preparation. При помощи этого средства системные администраторы могут легко клонировать конфигурации компьютеров, систем и приложений. Благодаря SysPrep развертывание систем Windows 2000 происходит проще, быстрее и дешевле.
- Setup MАnager. Это средство – мастер с графическим интерфейсом, помогающий системным администраторам создавать и тестировать инсталляционные сценарии для развертывания систем.
- Дистанционная инсталляция операционных систем. При помощи этого средства системные администраторы могут стандартизировать окружения "рабочего стола" и быстро развертывать их через сеть.
- MMC-консоль (Microsoft MАnagement Console). Это средство обеспечивает единообразный интерфейс всех средств для администрирования и управления от фирмы Microsoft, а также от сторонних производителей. Пример интерфейса MMC-консоли показан на рис. 2.5.
- Windows MАnagement Instrumentation (WMI). Это средство обеспечивает стандартную инфраструктуру для мониторинга и управления всеми системными ресурсами. Благодаря ему сторонние производители могут разрабатывать единообразные приложения для мониторинга и управления системой.
увеличить изображение
Рис. 2.5. Интерфейс MMC-консоли (Microsoft MАnagement Console) - Редактор групповой политики (Group Policy Editor). При помощи этого средства системные администраторы могут задавать правила почти для всех аспектов пользовательского окружения компьютера. Групповая политика охватывает такие области, как безопасность, права пользователей, настройки "рабочего стола" и приложения. Окно редактора групповой политики показано на рис. 2.6.
увеличить изображение
Рис. 2.6. Окно редактора Group Policy - IEAK (Internet Explorer Administration Kit). При помощи IEAK системные администраторы могут быстро развертывать индивидуально настроенные версии Microsoft Internet Explorer 5.01 на многие платформы. Администраторы могут инсталлировать лишь те компоненты и настраиваемые приложения, которые им нужны.
- Распределенная файловая система Dfs (Microsoft distributed file system). При помощи Dfs системные администраторы создают единое иерархическое отображение для многих файловых серверов и их сетевых ресурсов. Благодаря Dfs пользователям становится легче находить службы и ресурсы. Кроме того, Dfs повышает доступность ресурсов, так как обеспечивает многократное копирование файлов через распределенные серверы.
- Квоты дисков. Системные администраторы могут установить квоты (ограничения) на расходование места на дисках для отдельных пользователей и для томов. На рис. 2.7 показана вкладка Quota экрана свойств локального диска.
Рис. 2.7. Вкладка Quota экрана свойств локального диска - Управление иерархическим хранилищем данных. Это средство автоматически переносит не слишком новые данные на менее дорогие носители, что позволяет максимально повысить применение дорогих высокоскоростных устройств теми приложениями и для тех данных, которые используются наиболее часто.
- Администрирование динамических томов. При помощи средства Windows 2000 Storage MАnager администраторы могут создавать новые тома, расширять тома, модифицировать "зеркала" и ремонтировать массивы RAID 5 без отключения сервера и без прекращения обслуживания запросов, без какого-либо ущерба для работы конечных пользователей.
- Автоматический перезапуск. Такие службы, как IIS можно настроить на автоматический перезапуск в случаях отказов, что уменьшает время простоя и необходимость во вмешательстве администратора.
- Дерево уничтожения процессов. Если системный администратор обнаружит "взбесившееся" (rogue) или ошибочное приложение, то он может легко уничтожить ("убить", kill) и сам процесс, и все связанные с ним процессы, без перезагрузки системы.
- Мастер Windows 2000 Configure Your Server Wizard. Этот мастер позволяет выполнить конфигурирование системы сервера в одном месте, "одним махом" (см. рис. 2.8).
увеличить изображение
Рис. 2.8. Мастер Windows 2000 Configure Your Server Wizard - Аctive Directory. При помощи этой компоненты системные администраторы могут управлять клиентами и серверами на основе Windows при помощи единообразного интерфейса. (См. раздел "Служба каталогов Аctive Directory" далее.)
- Делегирование административных полномочий. Системные администраторы могут делегировать отдельным пользователям и группам пользователей наборы административных полномочий, не делая, однако, этих пользователей администраторами системы.
Система, учитывающая особенности мобильной работы
Windows 2000 Professional с самого начала создавалась как система, помогающая пользователям портативных компьютеров (ноутбуков) и способствующая работе на ноутбуках. Хотя на ноутбуках смогут работать и другие операционные системы из семейства Windows 2000, но в них не имеется средств управления энергопотреблением и функциональных возможностей для работы в автономном режиме (offline), имеющихся в Windows 2000 Professional. Применение Windows 2000 Professional может быть желательным, потому что в ней имеются следующие функциональные возможности:
- Режим "спячки" (hibernate mode). Это – настраиваемая функциональная возможность, выключающая компьютер и монитор, через некоторое заранее заданное время. Когда компьютер выключает себя, ваши настройки "рабочего стола" сохраняются на жестком диске. При пробуждении системы функция "спячки" восстанавливает ваши программы и настройки точно в том виде, как вы их оставили.
- Автономные ("оффлайновые") папки и файлы. Вы можете отсоединиться от сети и работать так, как если бы вы были по-прежнему присоединены к сети. Эта функциональная возможность позволяет вам создавать "зеркальный образ" ваших документов, хранящихся в сети.
- Автономный просмотр (offline viewing). Вы можете просматривать автономно целые веб-страницы (включая графику). Вы сможете просматривать эти страницы, когда у вас будет свободное время, не соединяясь с сетью.
- Мастер синхронизации. При помощи этого средства вы можете сравнивать ваши автономные файлы и папки с файлами и папками на сетевом сервере и обновлять их.
- "Разумная батарея" (smart battery). В Windows 2000 Professional можно более точно посмотреть состояние аккумуляторной батареи. Вы можете легко настроить опции так, чтобы максимально продлить срок службы батареи без ущерба для производительности. На рис. 2.9 показано окно свойств настроек управления энергопотреблением.
Рис. 2.9. Окно свойств настроек управления энергопотреблением - "Горячая стыковка" (hot docking). При помощи этого средства вы можете состыковывать или расстыковывать свой компьютер-ноутбук с док-станцией, не меняя конфигурацию аппаратуры и без перезагрузки системы.
- Поддержка протокола IrDA (Infrared Data Association). Благодаря этой функциональной возможности вы можете разделять данные при помощи стандартного защищенного протокола для беспроводной передачи данных через инфракрасные порты между двумя компьютерами под управлением Windows 2000.
- Поддержка цифровых устройств.Операционная система Windows 2000 Professional имеет поддержку съемных устройств хранения данных, таких как DVD-диски (digital video disk) и периферийные устройства Device Bay.
Производительность
Windows 2000. И операционная система, и SQL Server подвергались обширному тестированию производительности. В Windows 2000 имеются такие функциональные возможности, относящиеся к производительности:
- Общее увеличение производительности. Производительность почти всех систем при использовании Windows 2000 повышается. Благодаря более экономной и эффективной работе с памятью Windows 2000 по сравнению с Windows NT 4 работает быстрее (выигрыш в производительности может достигать 250%).
- Ускорение многозадачности. В основе Windows 2000 лежит полностью 32-разрядная архитектура. Благодаря этой архитектуре вы лучше задействуете ресурсы компьютера и лучше управляете ими, поэтому вы сможете исполнять большее количество программ и исполнять больше задач одновременно.
- Масштабируемость памяти и процессоров. Операционные системы из семейства Windows 2000 поддерживают оперативную память до 64 Гб и до 32 процессоров.
- Службы кластеризации (Cluster Services) – доступны в Windows 2000 AdvАnced Server и в Windows 2000 DataCenter Server. Благодаря службам Cluster Services можно соединять воедино по нескольку систем, повышая тем самым доступность и производительность. В своей самой простейшей форме службы Cluster Services позволяют создать кластер из двух серверов, благодаря чему автоматически создается резервная копия на случай отказа одной из систем. Службы Cluster Services также могут быть сконфигурированы в режиме "scale-out", когда для получения большой процессорной мощности можно объединить до 32 серверов под управлением Windows 2000 Server.
- NLB (Network Load BalАncing, балансирование сетевой нагрузки). Операционные системы Windows 2000 AdvАnced Server и Windows 2000 DataCenter Server поддерживают балансирование сетевой нагрузки NLB (Network Load BalАncing). При помощи NLB операционная система может динамически и равномерно распределять входные запросы по кластеру серверов под управлением Windows 2000 Server. Когда большой объем рабочей нагрузки требует этого, администраторы могут повышать производительность своих систем, просто лишь добавляя серверы, сконфигурированные для работы с NLB. Конфигурация системы с NLB показана на рис. 2.10. В примере на рисунке четыре сервера под управлением Windows 2000 AdvАnced Server сконфигурированы как группа виртуальных серверов, на которой исполняются Internet Information Server 5 и NLB. Когда приходят запросы из Интернета, они распределяются по этим четырем серверам так, чтобы максимизировать производительность и оптимизировать загруженность оборудования.
Рис. 2.10. Пример конфигурации с балансированием сетевой нагрузки NLB - Повышение производительности ASP (Аctive Server Pages). В составе IIS 5 (имеется в Windows 2000 Server, в Windows 2000 AdvАnced Server и в Windows 2000 DataCenter Server) имеются многие усовершенствования для обработки ASP ("активных серверных страниц", Аctive Server Pages). Движение ASP-веб-страницы через систему будет происходить лучше, а к страницам, не требующим исполнения каких-либо сценариев, добавляется "Fast Past".
- Ограничение в IIS на пользование центральным процессором. В конфигурациях, совмещающих веб-приложения и другие приложения, системные администраторы могут пожелать ограничить объем времени доступа веб-приложений к процессору. Благодаря этому все остальные приложения, работающие одновременно с веб-приложениями, всегда смогут получить доступ к процессору.
Доступ к Интернету
Еще одной ключевой особенностью операционных систем из семейства Windows 2000 является поддержка работы с Интернетом. Технологии для работы с Интернетом были разработаны как центральные компоненты операционных систем, это обеспечивает высокий уровень интеграции с Интернет и большую производительность. Ниже перечислены некоторые из функциональных возможностей Windows 2000 для работы с Интернетом:
- Операционные системы соединены воедино с Internet Explorer 5.01. Во все операционные системы из семейства Windows 2000 встроена последняя "инкарнация" браузера Internet Explorer.
- Internet Information Services 5. IIS 5 входит в состав Windows 2000 Server, Windows 2000 AdvАnced Server и Windows 2000 DataCenter Server. Благодаря этой компоненте, встроенной в операционные системы, пользователи могут с большим удобством размещать свои веб-сайты и управлять ими. Среди средств IIS 5 имеется Internet Information Services MАnager ("менеджер IIS") (см. рис. 2.11) – графический интерфейс для конфигурирования и управления одним или несколькими веб-сайтами.
увеличить изображение
Рис. 2.11. Средство Internet Information Services MАnager, входящее в состав Internet Information Services 5 - Мощные инструментальные средства для разработчиков. Internet Explorer поддерживает широкий спектр языков программирования для Интернета, в том числе Dynamic HTML, ASP, Java и XML.
- Автоматическая работа с прокси-сервером. Internet Explorer 5.01 будет автоматически находить ваш прокси-сервер и конфигурировать себя для соединения с Интернетом.
- Самозаполнение имен сайтов. Браузер вспоминает имена ранее посещенных сайтов и предлагает автоматически завершить ввод URL, после того, как вы введете несколько первых букв.
- Веб-папки. Эта функциональная возможность называется также WebDAV (Web Document Authoring Аnd Versioning, работа авторов с веб-документами и контроль версий). Благодаря этой технологии авторы содержимого Интернета могут опубликовывать веб-страницы в IIS 5, пользуясь только лишь навыками drug-Аnd-drop (перетаскивания информационных материалов мышкой).
- Поддержка печати в Интернете. В операционных системах семейства Windows 2000 системные администраторы могут организовать разделение ресурсов-принтеров через Интернет, так что пользователи могут печатать на принтерах через URL.
Служба каталогов Аctive Directory
Служба каталогов Аctive Directory является новой функциональной возможностью Windows 2000 Server, это – центральная компонента для управления данными и ресурсами в сетях Windows 2000. В этом разделе дан обзор технологии Аctive Directory.
Архитектура Аctive Directory
Аctive Directory представляет собой хранилище информации обо всех сущностях, участвующих в сети, таких как приложения, файлы, принтеры и люди. Аctive Directory дает согласованную методику для описания любых сущностей в сети, независимо от их разнообразной природы. Аctive Directory можно представить себе как "главный коммутатор",она является главной "властью", управляющей всеми взаимоотношениями между распределенными ресурсами в сети. Аctive Directory имеет как средства управления, так и средства защиты, благодаря которым обеспечивается полная целостность и приватность сети.
Аctive Directory является одновременно и административным, и пользовательским инструментальным средством. Аctive Directory обеспечивает единообразное взаимодействие пользователей с разнообразными и широко рассеянными по сети ресурсами и доступ к ним. Пользователям больше не надо заботиться об определении местоположения сетевых ресурсов и об их именах. При помощи Аctive Directory ресурсы "рекламируются" ("advertised") для пользователей, имеющих право на доступ к ним. Такая "реклама" ресурсов производится при помощи мастера Add/Remove Programs Wizard или мастера Add/Remove Printers Wizard.
Аctive Directory предоставляет системным администраторам набор согласованно работающих компонент и средств для управления сетевыми ресурсами. Аctive Directory упрощает управление большими разнородными сетями, усиливает общую защищенность системы, а также расширяет функциональную совместимость сетей.
Аctive Directory является "единой точкой" для управления всеми пользовательскими учетными записями Windows, компьютерами-клиентами, компьютерами-серверами и приложениями. Аctive Directory также помогает организовывать и интегрировать системы под управлением не Windows. При помощи Аctive Directory организации могут распространять свои системы в Интернет, причем с обеспечением защиты на высоком уровне.
Аctive Directory основывается на иерархической структуре (см. рис. 2.12). Объекты применяются для обозначения пользователей, групп пользователей, систем, устройств, приложений и других сущностей в сети. Объекты хранятся в контейнерах, которые применяются для обозначения организаций, например, "юридический отдел", или совокупностей взаимосвязанных объектов, например, принтеров.
Рис. 2.12. Иерархия Аctive Directory
Аctive Directory также управляет взаимоотношениями между различными объектами и контейнерами. Благодаря этому системные администраторы могут видеть всю сеть скорее как согласованные сущности, а не как ресурсы в одном месте и взаимоотношения между ресурсами – в другом месте.
Каждый объект в структуре Аctive Directory содержит атрибуты, которые могут описывать широкий диапазон характеристик. Эти атрибуты защищены, так что потенциально секретная информация может быть защищена от всех, кроме пользователей и администраторов, которые могут обращаться к ней. Каждый атрибут, соединенный с объектом может иметь назначенные ему права доступа. Кроме того, для объекта могут быть установлены настройки глобального доступа.
Чтобы отвечать требованиям высокой производительности, доступности и гибкости, Аctive Directory применяет репликацию с множественными контроллерами-хозяевами (multimaster replication). Администраторы могут создать многие копии каталога Аctive Directory, называющиеся "реплики каталога" и разместить их по разным местам из сети. Когда изменение применяется к любой какой-нибудь реплике каталога где-нибудь в сети, то это изменение автоматически реплицируется (копируется) по всей сети.
Польза от применения Аctive Directory
Мы уже сказали, что Аctive Directory упрощает управление, повышает защищенность сети и улучшает функциональную совместимость сетей. Давайте более подробно рассмотрим эти улучшения.
Аctive Directory упрощает управление
Современные сети зачастую охватывают большие географические зоны. Управление этими неоднородными и обширными сетями стало требовать больших затрат времени. Кроме того, поскольку сети сейчас распространяются на значительные расстояния (в географическом смысле), то административные функции часто дублируются в нескольких местах, что приводит к избыточности и несогласованности. А вот Аctive Directory становится "единой точкой" для управления разнообразными ресурсами сети.
Аctive Directory также помогает развертывать приложения и другое программное обеспечение на компьютеры пользователей. Раньше техникам приходилось подходить к каждой рабочей станции, нуждавшейся в добавлении программного обеспечения. Этот процесс был дорогостоящим и занимал много времени. Затем были разработаны средства, позволявшие развертывать приложения с центрального сервера. Хотя эта методика и была шагом вперед, но ей не хватало интегрированности, встроенности в общий процесс управления сетью. А при помощи Аctive Directory системные администраторы могут развертывать программное обеспечение, не выходя из существующих рамок организации безопасности и практики управления, что снимает хлопоты по применению "одиночных" инструментальных средств для развертывания и управления.
При помощи Аctive Directory администраторы, когда это бывает нужным, могут делегировать некоторые административные функции пользователям или подразделениям. Благодаря такому процессу "безопасного делегирования" можно позволить таким "продвинутым пользователям" проявлять свою компьютерную квалификацию в рамках своего отдела, освобождая профессионалов-компьютерщиков для других дел.
Аctive Directory повышает защищенность
Критически важными компонентами Аctive Directory являются ее службы безопасности. В Аctive Directory собраны данные для аутентификации пользователей и данные для администрирования. Аctive Directory реализует ролевую модель безопасности: пользователи и организации получают предварительно заданные роли (roles), которые, однако, можно редактировать, аспекты безопасности (security aspects) и правила (rules). Администраторы могут пожелать включить для некоторых пользователей или ресурсов строгие правила безопасности или же ослабить защиту, когда это имеет смысл. Модель безопасности, применяемая в Аctive Directory, поддерживает такие протоколы защиты, как Kerberos, сертификаты X.509 и технологию работы со смарт-картами. Эта модель безопасности также обеспечивает согласованную единообразную защиту как для локально подключенных к сети пользователей, так и для соединившихся через удаленное коммутируемое соединение.
Аctive Directory расширяет функциональную совместимость сетей
По мере того как происходило развитие сетей, вместе с ними развивались и сетевые технологии. Чтобы максимизировать отдачу от вложений в разработку и развертывание этих технологий, они должны работать совместно. Сейчас в окружениях большинства сетей имеются собрания разнородных несогласованных каталогов для электронной почты, приложений, сетевых устройств, брандмауэров для Интернета и внутренних сетей и приложения для электронной коммерции. Аctive Directory поможет навести порядок в этом разнообразии, задавая набор стандартных интерфейсов для интегрирования приложений и набор открытых механизмов синхронизации, гарантирующих возможность активной функциональной совместимости компонент операционной системы Windows с большим количеством устройств и приложений для других операционных систем (не Windows).
Заключение
В данной лекции мы кратко рассмотрели операционные системы семейства Windows 2000. Каждая операционная система из этого семейства (Windows 2000 Professional, Windows 2000 Server, Windows 2000 AdvАnced Server и Windows 2000 DataCenter Server) имеет специализированные функциональные возможности, призванные соответствовать множеству потребностей пользователей. Благодаря Windows 2000 вы можете иметь одинаковые окружения на ноутбуках и на высокопроизводительных 32-процессорных информационных центрах корпораций. Прочитав эту лекцию, вы без труда сможете выбрать подходящую платформу Windows 2000 для своей установки SQL Server 2000. В следующей лекции мы вернемся к SQL Server 2000 и познакомим вас с некоторыми обязанностями администратора базы данных.
Лекция 3. Что делают и за что отвечают администраторы баз данных Microsoft SQL Server
У администраторов баз данных Microsoft SQL Server 2000 нет стандартного круга обязанностей. В каждой фирме имеются свои собственные штатные расписания для сотрудников, отвечающих за базу данных и различные требования к их квалификации. В некоторых фирмах имеется только один администратор баз данных, отвечающий за всю систему, от разработки до технической поддержки. В других фирмах служат сотни администраторов баз данных, и каждый из них отвечает лишь за небольшую часть работы системы. Нельзя сказать, что тот или иной способ лучше другого – каждая фирма должна находить решение, лучше всего соответствующее ее потребностям.
В наши дни администрирование баз данных является одним из наиболее востребованных и элитарных видов деятельности в области высоких технологий. Хорошие администраторы баз данных всегда нужны и, похоже, всегда будут в дефиците. Если вы будете стараться делать свою работу как можно лучше и не прекращать свое обучение, то будете становиться все более и более ценным работником.
В этой лекции вы узнаете некоторые хитрости, которые помогут вам стать самым лучшим администратором баз данных (в пределах ваших возможностей). Вы также познакомитесь с основными и с дополнительными обязанностями администратора баз данных SQL Server. Этот перечень обязанностей ни в коей мере не является исчерпывающим: вас могут привлечь и к выполнению многих других обязанностей. В любом случае, администратор баз данных должен обладать разносторонними навыками и самообладанием. Сейчас мы расскажем об обязанностях администратора баз данных и о том, как их выполнять наилучшим способом.
Основные и дополнительные обязанности администратора баз данных SQL Server 2000
Администраторы баз данных могут иметь разные обязанности, в каждой фирме круг его обязанностей определяется по-своему. Есть, однако, некий набор основных обязанностей, выполняемых в большинстве случаев. Если эти обязанности не совпадают с вашими обязанностями по работе, не беспокойтесь, т.к. у каждого администратора баз данных могут быть свои собственные нестандартные задачи. В данной лекции вы познакомитесь с обязанностями, о которых вы могли не знать достаточно хорошо, вам откроется окно в мир администрирования баз данных. Обязанности и работы администратора баз данных SQL Server сгруппированы по категориям. Эти категории не упорядочены по важности или по объему затрачиваемого на них труда.
Инсталляция и конфигурирование
Администратора баз данных часто зовут, когда надо инсталлировать на компьютер новое программное обеспечение или чтобы сконфигурировать аппаратную часть либо программное обеспечение, или хотя бы для того, чтобы он принял участие в проекте. Иногда администратора баз данных приглашают только для создания спецификаций на инсталляцию и на конфигурацию. В любом случае, администратор баз данных должен участвовать в этом процессе, чтобы гарантировать правильность конфигурирования системы и базы данных. Часть работы администратора баз данных – убедиться в том, что система сконфигурирована оптимально для работы с SQL Server.
Инсталляция программного обеспечения
Администраторы баз данных должны участвовать не только в инсталляциях SQL Server, но и в инсталляциях Microsoft Windows 2000 и другого программного обеспечения. Вы должны проверять, чтобы опции были установлены правильно, а ненужные компоненты не были инсталлированы и сконфигурированы. Во время инсталляции Windows 2000 можно ненароком наустанавливать множество нежелательных компонент. Такие компоненты, как Internet Information Server (IIS), сервер протокола DHCP (Dynamic Host Configuration Protocol), Message Queuing и службы для доступа к файлам и принтерам являются слишком большой нагрузкой для системы, и особенно надо учитывать, что они могут никогда не понадобиться.
Неплохо было бы составить документ, описывающий инсталляцию Windows 2000, в котором был бы список компонент, которые вы хотите инсталлировать на компьютер. Этот документ пригодится еще не один раз при последующих инсталляциях Windows 2000, что очень способствует воспроизводимости и единообразию ваших инсталляций Windows 2000.
Кроме инсталляции Windows 2000 (или помощи при инсталляции Windows 2000), администраторы баз данных отвечают за правильную инсталляцию SQL Server 2000. Важно инсталлировать SQL Server 2000 правильно, потому что некоторые настройки, задаваемые в процессе инсталляции, можно поменять только лишь при полной переинсталляции программного обеспечения. К таким настройкам относится выбор местоположения двоичных файлов и файлов данных SQL Server. Если вы впервые инсталлируете SQL Server 2000, то будет неплохо для начала инсталлировать ее на тестовом компьютере, а затем уже выполнить инсталляцию на рабочем компьютере. Так вы сможете попробовать применять разные опции и приобрести навыки в процессе инсталляции. Как и в случае с инсталляцией Windows 2000, будет неплохо документировать процесс инсталляции SQL Server 2000.
Конфигурирование аппаратуры и программного обеспечения
Обычно администратору баз данных не приходится часто конфигурировать аппаратуру сервера, но в некоторых случаях вам придется заниматься этим. Как и в случае с инсталляцией, если вы не производите конфигурацию аппаратуры и программного обеспечения своими руками, вы должны принимать участие в этом процессе, чтобы гарантировать, что эти работы будут выполнены в соответствии с вашими спецификациями. Как администратор баз данных SQL Server, вы должны уметь указать количество дисков и контроллеров, а также задать спецификации всех RAID-контроллеров. Вы несете окончательную ответственность за производительность и стабильность системы, поэтому вы должны применить свой опыт и знания, чтобы оптимально сконфигурировать систему SQL Server, чтобы она была мощной, производительной, масштабируемой и способной к росту.
Важно документировать принятую вами конфигурацию, это относится и к случаю с инсталляцией программного обеспечения. Иногда полезно документировать и причины, по которым были приняты ваши решения. Возможность вспомнить, почему были приняты те или иные решения о конфигурации компонент, поможет при будущих изменениях и обновлениях. Не забудьте задокументировать все подробности, вроде какие были использованы шины PCI и как были сконфигурированы RAID-контроллеры. Чтобы узнать некоторые подробности о конфигурации (найти значения некоторых параметров), понадобится перезагрузка в диагностический режим, поэтому их документирование на этапе начальной установки программного обеспечения может избавить вас от напрасных усилий и потерь времени в будущем.
Помните, что ответственность за конфигурирование системы лежит, в конечном счете, на вас, так как вы отвечаете за производительность и стабильность базы данных SQL Server. Поэтому вы должны убедиться в том, что система была правильно сконфигурирована для работы SQL Server. Задокументировав причины выбора тех или иных настроек конфигурации, вы поможете другим людям понять и оценить правильность ваших решений.
Безопасность
Администратор баз данных также отвечает за безопасность (защиту) системы, он должен следить за этим и докладывать обо всех проблемах. Часто имеется эксперт по безопасности из вашей компании или из сторонней фирмы, которому, при необходимости, можно позвонить. Объем доступа к вашей системе определяет тип и степень защиты, требуемой для вашей базы данных. Система, доступ к которой имеют лишь немногие надежные сотрудники и не подключенная к Интернету, очевидно, нуждается в меньшей защите, чем база данных с доступом из Интернета.
Безопасность системы важна, потому что если кто-нибудь вторгнется в систему и разрушит или украдет данные, то ваша фирма понесет серьезный урон. Безопасность системы начинается с управления пользователями, о котором мы расскажем в следующем разделе. Кроме управления пользователями вы можете быть участниками разработки и реализации плана защиты вашей сети. Эта задача обычно поручается сотрудникам, имеющим богатый опыт в защите сетей. Если вы – такой сотрудник, то вы можете быть не только администратором баз данных, но и администратором защиты сети.
Защита сети
К задачам защиты сети относится приобретение, конфигурирование и развертывание сетевых прокси-серверов и защитных шлюзов. Подобные средства аппаратной/программной защиты поставляются многими фирмами. Человек, ответственный за безопасность сети компании, отвечает за изучение и выбор правильного решения. Защита сетей сама по себе может быть темой еще одной книги, поэтому мы не будем более вдаваться в этот предмет. А в рамках SQL Server основными задачами обеспечения защиты, в которых вы будете участвовать, являются аудит и управление пользователями.
Аудит системы
Аудит системы включает в себя мониторинг (отслеживание) как ошибок в журнале ошибок SQL Server и в журнале событий Windows 2000, так и применение SQL Server Profiler для мониторинга деятельности внутри SQL Server. Журнал SQL Server и журнал событий содержат важную информацию о SQL Server, о Windows 2000 и о безопасности. Вы должны тщательно проверять эти журналы, следить, нет ли там каких-либо признаков, указывающих на проблемы.
Как уже говорилось, вы можете организовать аудит своей системы при помощи SQL Server Profiler. Можно создать профили, регистрирующие, например, такие события, как неуспешные попытки входа в систему. Кроме того, вы можете регистрировать такие события, как операторы языка описания данных ( DDL, data definition language ) и операторы INSERT, UPDATE и DELETE. Пользуясь SQL Server Profiler, вы сможете отслеживать определенные события, а также следить за временем входов в систему, за именами пользователей и за деятельностью.
Обычная работа
Больше всего времени у администратора баз данных уходит на обычную ежедневную работу. Эта неблагодарная работа может иногда надоедать вам, но не забывайте, что именно эти задачи могут оказаться наиболее важными и необходимыми. Администратор баз данных отвечает за обеспечение работоспособности системы, а чтобы система обладала работоспособностью, чрезвычайно важно выполнять такие задачи, как резервное копирование и восстановление.
Резервное копирование и восстановление
Многие считают, что наиболее ответственными обязанностями администратора баз данных являются резервное копирование и восстановление. Эти работы гарантируют сохранение базы данных при серьезных отказах оборудования. При таких отказах надежда оживить базу данных зависит только от резервной копии. Операции резервного копирования являются единообразными и понятными, но вы должны выполнять их достаточно часто. Чтобы гарантировать хорошее качество этих резервных копий вы также должны регулярно их тестировать и убеждаться в их пригодности. Уделяя надлежащее внимание этим работам, вы избежите ошибок и сможете гарантировать безопасность своей системы.
Управление пользователями
Еще одной повседневной задачей является управление пользователями. Оно заключается в администрировании входов в SQL Server и ролей базы данных. К важной обязанности администратора баз данных относится обеспечение авторизованными правами доступа всех желающих работать с базой данных. Такие права доступа предоставляются администратором баз данных обычно после одобрения отделом кадров. Обратите внимание, чтобы такое одобрение отдела кадров было получено до того, как вы предоставите доступ к любым из объектов базы данных, и предоставляйте лишь такие полномочия, которые понадобятся данному пользователю. Не поддавайтесь искушению предоставлять общий доступ к базе данных; чтобы предоставлять права доступа, соответствующие потребностям различных подразделений вашей фирмы, удобно пользоваться ролями базы данных.
Прочая обычная работа
К другим обычным работам можно отнести наблюдение за использованием места для хранения базы данных, реорганизация индексов, проверка достоверности объектов базы данных и мониторинг общего "состояния здоровья" системы. Важен мониторинг изменений в системе. Любое изменение, даже самое незначительное, может быть признаком надвигающихся проблем. Многие рутинные работы являются достаточно важными, чтобы вы внимательно следили за ними. Вы можете автоматизировать такие задачи, как реорганизация индексов или запуск проверок на непротиворечивость, но все же время от времени вы должны уделять им внимание.
Уровень качества обслуживания
Нужно следить, чтобы система обеспечивала определенный уровень качества обслуживания для важных задач. Этот уровень качества обслуживания, который должна обеспечивать ваша система, может определяться соглашением об уровне обслуживания (SLA, service level agreement). Даже если нет никакого контракта, все равно администратор баз данных должен обеспечивать наилучший уровень обслуживания. Этого можно добиться, стремясь к максимально большему времени работоспособности системы и к максимальной производительности, настраивая производительность и планируя мощность.
Мониторинг и настройки производительности
Вы должны постоянно следить за производительностью системы и делать заметки обо всех изменениях. Если время отклика системы вдруг становится больше, повышается объем использования центрального процессора, становится больше контекстных переключателей и т.д., то все это может быть признаками надвигающихся проблем. Вы должны следить отдельно за каждой системой, а также по-разному интерпретировать результаты этого мониторинга. Вы должны оценивать работу систем, хорошо ли они работают или нет. Если появились признаки проблем с производительностью, то надо диагностировать эти проблемы и найти их решения.
Вы должны периодически следить за использованием системных ресурсов и за производительностью. Если вы следите за состоянием системы, вы можете расширить систему до того, как произойдет снижение производительности. При достижении предела мощности системы ее расширение обойдется дороже (как в денежном выражении, так и по длительности простоя). SQL Server предлагает несколько инструментальных средств для мониторинга системы, перечисленных ниже вместе с другими средствами для мониторинга:
- System Monitor. Применяется для мониторинга использования ресурсов SQL Server и Windows 2000. System Monitor является средством Windows 2000, доступным из меню Start.
- SQL Server Enterprise MАnager. Предоставляет как информацию об использовании ресурсов, так и некоторую ограниченную информацию о производительности.
- Программы мониторинга систем управления реляционными базами данных от сторонних производителей. Эти средства имеют возможности для мониторинга систем управления реляционными базами данных (RDBMS, relational database mАnagement system) и для выдачи оповещений.
- Сетевые мониторы. Применяются при необходимости слежения за сетью. Это – SMS (Systems MАnagement Server) от фирмы Microsoft и утилиты от сторонних производителей.
- Общение с пользователями. Позволяют получить информацию о том, как пользователи оценивают производительность системы. Очень важно иметь контакт с коллективом пользователей и понимать, довольны ли они работой системы. Очень часто проблема заключается только в отсутствии взаимодействия между администратором баз данных и пользователями.
- Средства для мониторинга использования места на диске.Это – Проводник(Microsoft Windows Explorer) и средства для мониторинга от сторонних производителей. Некоторые средства могут следить и за Windows 2000, и за SQL Server.
Что же касается настройки системы, то эта работа может понадобиться при повышении рабочей нагрузки.
Состав системы и планирование мощности
Кроме настройки и мониторинга системы вы будете отвечать за оценку того, будет ли система работать с предполагаемой нагрузкой. Регулярно выполняя задачи состава системы и планирования мощности, вы сможете хорошо планировать увеличения мощности еще до возникновения вероятных проблем. Состав системы и планирование мощности являются сложнымирБ¤ZQV рБ¤ZQV АИџZQV 0:ўZQV XВ¤ZQV В¤ZQV @ В¤ZQV не знаете, как решить эту задачу, то вам следует обратиться к специалистам из сторонней организации.
Обеспечение периодов работоспособности системы
Как мы уже говорили, администратор баз данных отвечает и за обеспечение периодов работоспособности (uptime) системы. Если система не будет функционировать оптимально, то будут страдать потребители вашей работы (коллектив пользователей). Любой период неработоспособности (downtime) системы дорого обходится как вашей фирме, так и пользователям. Поэтому поддержание максимальной длительности работоспособного состояния системы является одной из ваших главных обязанностей.
Планирование периодов неработоспособности
Периоды неработоспособности можно сократить, если тщательно планировать их расписание. Если расписание периодов неработоспособности распланировать заранее, то это будет приемлемым предупреждением для коллектива пользователей и других сотрудников, так что они смогут к этому подготовиться. Планирование периодов неработоспособности должно производиться таким образом, чтобы хватило времени на выполнение всех необходимых работ. Кроме того, надо позаботиться, чтобы люди, которых это касается, были надлежащим образом извещены о предстоящем отключении. И конечно, если ваша база данных обслуживает Интернет, то могут понадобиться и еще некоторые приготовления.
Вы можете посчитать удобным устраивать периоды неработоспособности по определенному расписанию, например, в первое воскресенье каждого месяца. Тогда пользователи всегда будут знать о предстоящем отключении и смогут к нему подготовиться. Обычно такие отключения планируются на нерабочие часы, чтобы неудобства затронули как можно меньшее число людей.
Восстановление после аварий
Периоды неработоспособности можно также уменьшить благодаря подготовке к возможным авариям. Вы должны быть готовы восстанавливать систему даже при длительных выходах системы из строя. Аварии могут принимать разные формы. Система может "рухнуть" из-за отказа оборудования. Эти проблемы обычно решаются заменой отказавших компонент и перезагрузкой компьютера. Если же проблема связана с отказом диска, то безотказная работа может быть организована при помощи RAID-массивов. При отказе всего RAID-массива может потребоваться восстановление базы данных из резервной копии. В любом случае, данный тип отказов обычно исправляется в течение нескольких часов.
Если причиной отказа является программное обеспечение, то эти проблемы иногда могут быть исправлены перезагрузкой, а иногда может понадобиться восстановление базы данных, если произошло повреждение базы данных. Программное обеспечение редко отказывает именно таким образом, однако повреждение базы данных часто может оказаться разрушительным.
Более серьезной проблемой может стать разрушение вашего вычислительного центра. Это может случиться из-за природной катастрофы, например, землетрясения, наводнения или урагана. Это может привести к отказу работы компьютеров (и, возможно, отсутствию электропитания) на несколько дней или даже на несколько недель. Некоторые из таких проблем могут быть решены созданием резервного вычислительного центра. Если катастрофа выведет из строя ваш основной вычислительный центр, то благодаря резервному вычислительному центру ваша фирма сможет быстро вернуться в бизнес. Возможно, на резервном вычислительном центре не удастся восстановить все транзакции, поступившие на основной вычислительный центр в момент аварии, но вы, вероятно, все же сможете сохранить работоспособность вашего бизнеса в промежуток времени от аварии до восстановления основной базы данных. Администратор баз данных должен участвовать в планировании и реализации резервного вычислительного центра.
Документирование
Администратор баз данных отвечает за документирование всех аспектов системы базы данных, в том числе за документирование конфигурации аппаратуры и программного обеспечения, процедур инсталляции, задач технической поддержки, обновления программного обеспечения, и документирование всех изменений в приложениях. Эти заметки могут пригодиться при восстановлении системы.
Документирование системы – дело неинтересное и требует большой дисциплинированности, но такие записи сведений о системе и составление планов в долгосрочной перспективе стоят потраченных усилий. Очень важно, чтобы все, кто участвует в разработке, развертывании и администрировании рабочей системы, документировали бы свою работу сразу же после ее выполнения. Благодаря такому порядку другие люди смогут понять, какова текущая конфигурация системы, а также какие изменения были выполнены в прошлом. Вы сможете пользоваться документацией при клонировании систем или при выполнении состава систем и планировании мощности. Вы также сможете пользоваться документацией как справочными материалами в случае, если понадобится воссоздать систему. Участие администратора баз данных может помочь в создании многих типов документации, о которых мы расскажем в этом разделе.
Документация может храниться как в бумажной, так и в электронной форме, и за решение вопроса об этом отвечает именно администратор баз данных. Вы можете воспользоваться такой методикой работы:
- Отдельный документ нужно завести для фирмы в целом. Этот документ должен содержать разделы про каждый из компьютеров, имеющихся в фирме. Системные администраторы, администраторы баз данных и системные операторы должны иметь доступ к этому документу и возможность его изменения.
- Для каждого компьютера фирмы нужно тоже завести по отдельному документу. И опять, каждый человек, имеющий отношение к этому компьютеру, должен иметь возможность записывать в этот документ свои заметки, так что будет вестись как бы журнал.
- Для системных администраторов, администраторов баз данных и системных операторов можно завести по отдельному файлу. Сотрудники из каждой категории администраторов должны иметь возможность изменять свой тип файла-журнала, но все они должны иметь возможность просматривать любые типы журналов.
Если произойдет сбой системы или потеря данных, то полная история системы поможет диагностировать, где произошел первоначальный сбой, а также поможет восстановить систему. И наконец, отслеживание сбоев нужно для предотвращения будущих сбоев. Но чтобы документирование было эффективным, оно должно быть полным. Никогда не уничтожайте документацию, а только накапливайте и добавляйте ее.
Приведенные ниже примерные перечни документации помогут вам эффективно организовать документирование. Основная масса документов относится к одной из двух категорий – либо документация о конфигурации, либо системные журналы.
Документация о конфигурации
В документации о конфигурации должна содержаться вся информация, необходимая для восстановления системы после серьезного разрушения. Эта информация должна содержать следующие сведения:
- Конфигурация аппаратуры. Подробные записи о том, какая аппаратура у вас имеется, как она сконфигурирована, и информация обо всей добавленной аппаратуре (например, о добавленных жестких дисках или о памяти).
- Программные компоненты. Подробные записи о том, какие программные компоненты были добавлены в систему и как была сконфигурирована каждая из этих компонент. Жизненно важны сведения о том, какие были установлены подкомпоненты и какие настройки (опции) были заданы.
- Конфигурация базы данных. Эта информация должна содержать компоновку и схему базы данных (database layout Аnd schema), имена и местоположения всех файлов данных, сведения о том, к каким группам относятся те или иные файлы, и сведения о том, как были созданы группы файлов. Эта информация позволит вам выяснить, какие именно группы файлов были потеряны при отказе массива дисков.
- Сведения о настройке программного обеспечения. Эта информация должна содержать сведения обо всех параметрах конфигурации системы и базы данных. При каждом изменении настроек здесь нужно регистрировать все новые настройки.
Системный журнал
Системный журнал чрезвычайно важен при сбоях системы или при падении производительности. Ниже перечислена информация, которая поможет вам определить последовательность событий, приводящих к отказу, и помогающая восстановить систему:
- Результаты наблюдений. Важная часть работы администратора баз данных состоит в выявлении изменений системы и предугадывании проблем. При наблюдении необычной деятельности нужно сделать заметки об этом. Даже такой комментарий, вроде "Система ведет себя как будто вяло", может оказаться ключом к разгадке причины последующего отказа системы.
- Изменения системы. Администратор баз данных должен записывать все изменения, произошедшие с аппаратурой, с операционной системой и с системой базы данных. Записи должны следовать в хронологическом порядке и должны быть полными (но не содержать несущественных подробностей).
- Отказы системы. Каждый отказ диска или других компонент должен регистрироваться в системном журнале. Эта информация может быть ценной для понимания закономерностей отказов компонент.
- Операции резервного копирования и восстановления.Нет необходимости регистрировать каждое резервное копирование, но просьбы о восстановлении данных должны регистрироваться, чтобы понять тенденции в работе пользователей и слабые места в организации работы приложений и базы данных.
- Данные о регулярных работах. При выполнении работ на регулярной основе администратор баз данных должен составлять заметки о том, что было сделано в системе. Эта информация может быть отправной точкой при исследовании сбоя системы, произошедшего вскоре после планового обслуживания.
Сохранив данные о критически важных событиях и информацию о конфигурации, вы сможете найти причину возникновения проблемы и понять, каким образом можно вернуть систему к нужному состоянию.
Документация о структуре системы
В зависимости от того, как в вашей фирме организован отдел информационных технологий, вы, возможно, участвуете в проектировании первоначальной конструкции системы. В любом случае, вам следует хорошо знать проектную документацию системы, потому что она – справочник обо всех "что, где и когда" в вашей системе.
Планы обычного технического обслуживания
Обычные процедуры технического обслуживания (поддержки) должные быть тщательно документированы, чтобы у других администраторов баз данных или системных операторов не возникало трудностей при их выполнении. Во многих фирмах администраторы баз данных выполняют ежедневные процедуры по обслуживанию, такие как резервное копирование, восстановление и поддержка пользовательских учетных записей. В других фирмах эту работу выполняют системные операторы. В инструкциях должен понятно объясняться каждый шаг, чтобы они были совершенно понятны даже для новичков. Операции резервного копирования выполняются обычно в нерабочие часы. Вы, администратор баз данных, наверное, не хотели бы быть разбуженным посреди ночи и отвечать на вопросы о резервном копировании, поэтому написать максимально подробные инструкции – в ваших интересах.
Планы восстановления после аварий
Планы восстановления после аварий (чрезвычайные планы) представляют собой пособия, помогающие восстановить деятельность при потере основного рабочего сервера. Этот документ чрезвычайно важен для быстрого восстановления отказавшей системы. При любом отказе системы администратор баз данных отвечает за ее скорейший ввод в строй. Основная рабочая система может отказать в любой день в любое время. Если она откажет в выходные дни или вечером, когда вас не будет на рабочем месте, то план восстановления после аварий поможет другим администраторам баз данных или операторам восстановить систему как можно быстрее.
Чтобы написать план восстановления после аварий, вы должны проанализировать технические требования для периода работы системы и риск для системы. Для малых систем, для которых не требуется почти постоянная круглосуточная работа, там, где в случае серьезных отказов допустим некоторый нерабочий период, можно обойтись обычным резервным копированием и все восстановление будет основываться лишь на комплекте магнитных лент для восстановления. Те же системы, для которых требуется более надежное обеспечение непрерывной работы, нуждаются в решениях с большей отказоустойчивостью (например, можно запустить службы MSCS – Microsoft Cluster Services ). Для систем, простой которых стоит миллионы долларов в день, вы должны реализовать более объемлющие решения. Эти решения обычно подразумевают создание резервного (failover) сайта в другом географическом регионе страны, благодаря чему работа не прекратится даже в случае природной катастрофы. Резервные сайты могут обеспечивать работоспособность даже при выходе из строя основного центра обработки данных на дни и недели. Такие типы чрезвычайных планов документироваться должны тщательно, чтобы каждый техник смог осуществить перенос работы на резервный сервер.
Проектирование и разработка
В некоторых фирмах администраторы баз данных занимаются не только своими традиционными обязанностями, но занимаются также и разработкой системы. Администраторы баз данных хорошо знакомы с потребностями и особенностями работы своей системы и поэтому обладают хорошей интуицией в вопросах проектирования новой системы. Эти обязанности по проектированию и разработке системы могут включать в себя задачи, описанные в нескольких следующих подразделах:
Создание модели данных и анализ
Важной частью проектирования является создание модели данных. В состав этой работы входит проектирование логической структуры базы данных, в том числе и создание спецификаций на взаимоотношения данных и ограничений целостности ссылочных данных. Эту сложную работу проще выполнять, пользуясь графическими изображениями структурной схемы базы данных, – тогда вы сможете наглядно увидеть все взаимосвязи между отдельными компонентами. Модель данных показывает логическую структуру базы данных, которую можно затем воплотить в физическом проектировании базы данных. Создание хорошей модели базы данных (т.е. создание эффективной базы данных на логическом и физическом уровне) может значительно повысить производительность (скорость работы).
Проектирование базы данных
Проектирование баз данных выполняется обычно проектировщиками баз данных, но проектировщики обычно работают с учетом мнения администратора баз данных. Иногда администратор баз данных сам выполняет обязанности проектировщика баз данных. Ежедневная работа с базами данных дает администратору баз данных уникальный опыт, который помогает ему улучшать новые проекты баз данных.
Разработка хранимых процедур
Иногда администратору баз данных приходится проектировать и даже реализовывать хранимые процедуры (stored procedures). Поскольку администратор баз данных обладает хорошими знаниями базы данных и данных, то он отлично подходит для этой работы. В зависимости от применяемых приложений и потребностей вашей фирмы, хранимые процедуры должны быть как простыми, так и требующими значительного труда для их создания.
Разработка приложений
В некоторых фирмах администраторы баз данных участвуют в разработке приложений, осуществляющих доступ к базе данных фирмы. Эти приложения, как и хранимые процедуры, только улучшатся от вашего участия, так как вы хорошо знакомы с базой данных. Помогая создавать приложения для вашей фирмы, вы улучшите их качество и упростите доступ к данным.
Информационная помощь другим сотрудникам
Администратора баз данных могут просить консультировать разработчиков, проектировщиков и конечных пользователей. Эти консультации могут производиться по следующим вопросам:
- Индивидуальная помощь конечным пользователям при решении конкретных проблем, создание программ обучения и даже обучение пользователей в соответствии с этими программами. Во многих случаях применяется специально подобранный для этой цели SQL и пакетные запросы для систем поддержки принятия решений ( DSS, decision support systems ).
- Администраторы баз данных дают разработчикам информацию о том, как система использовалась в прошлом и какие улучшения работы пользователей могут появиться в результате новой разработки. Такое обсуждение может предшествовать информированию пользователей о новых доступных для них таблицах и индексах и обо всех других новых функциональных возможностях, которые могут оказаться полезными для пользователей.
- Администраторы баз данных могут рассказать проектировщикам о том, какие новые функциональные возможности могли бы быть полезны пользователям. В приложениях, созданных проектировщиками, может недоставать некоторых функциональных возможностей, нужных пользователям. Рассказав об этом проектировщикам, вы поможете им в будущих разработках. Если у пользователей возникнут вопросы о том, как применять те или иные функциональные возможности, они, скорее всего, обращаются именно к вам, поэтому для разработчиков вы – хороший источник "обратной связи".
- Вы анализируете, какие данные имеются в базе данных и как осуществляется доступ к этим данным. Данная информация может помочь вам при планировании мощности и настройке системы. Она также может помочь вам улучшить схему базы данных.
Прочие обязанности администратора баз данных
Иногда администратор баз данных должен выполнять еще некоторые другие обязанности, описанные в нескольких следующих подразделах:
Администрирование кластера
Если у вас вместе с SQL Server работают и службы MSCS, то вам, вероятно, приходится выполнять поддержку кластера и выполнять задачи администрирования кластера. Работа кластера обычно вас не беспокоит, но иногда могут возникнуть задачи его администрирования, например, при изменениях кластера из-за добавления аппаратуры. В настоящее время кластеризация применяется для перехода на другой сервер при отказах серверов, но в будущих версиях Microsoft Windows и SQL Server станет возможна масштабируемая кластеризация. Эти возможности приведут к усложнению как начальной настройки, так и администрирования кластера. Но пока этого нет, администрирование кластера остается весьма простым и понятным.
Работа в службе технических консультаций для пользователей
Кроме вышеупомянутых обязанностей, администратор баз данных иногда обязан принимать участие в работе службы технических консультаций для пользователей. Обычно в службе технических консультаций работают специалисты по технической поддержке, но иногда вас могут попросить помочь. Администратор баз данных должен при необходимости уметь работать в службе технических консультаций, а может случиться так, что вас попросят подготовить специалистов для службы технических консультаций, которые будут обучать работе с новыми приложениями и с функциями базы данных.
Оценка закупаемого оборудования и программного обеспечения
Часто администраторы баз данных участвуют в оценке оборудования и программного обеспечения. При этом вам придется оценивать технические характеристики или создавать контрольные показатели. Часто вас будут просить достать копию программного обеспечения, установить его на тестовой системе и оценить этот продукт с учетом пользы для той или иной группы пользователей. В других случаях вас могут попросить посмотреть документы с техническими характеристиками оборудования или программного обеспечения и оценить продукты, основываясь лишь на этих технических характеристиках.
Слежение за мощностью системы
Администратор баз данных должен регулярно следить за системой и планировать ее рост. В некоторых случаях вы можете пригласить специалистов по увеличению мощности систем и провести учебные занятия по планированию увеличения мощности систем. Но обычно администратор баз данных сам должен решать, когда нужно увеличивать мощность системы (исчерпалась ли имеющаяся мощность), произошло ли падение производительности, произошло ли истощение ресурсов. Затем администратор баз данных дает рекомендации, какие дополнительные ресурсы необходимы для достижения желаемой производительности.
Если вы не спланируете все тщательно, то система может исчерпать ресурсы памяти или места на диске, и даже превысить возможности процессора. В любой из этих ситуаций будет страдать производительность. При полном исчерпании мощности системы обработка транзакций может прекратиться. Этих проблем можно избежать, если администратор баз данных будет прилежно следить за состоянием системы.
Администрирование веб-сайта
В небольших фирмах администратор баз данных зачастую обязан также обеспечивать работу веб-сайта фирмы. В больших фирмах часто работает много людей, занимающихся лишь поддержкой и развитием веб-сайта. Эта работа может быть далека от ваших обязанностей администратора баз данных или тесно взаимосвязана с ними, в зависимости от того, требуется ли доступ к базе данных через веб-сайт. SQL Server идеально подходит для обеспечения доступа к данным через веб-сайт, и для распространения информации таким способом в SQL Server и Windows 2000 имеется множество инструментальных средств и API (Application Programming InterfАce интерфейсов прикладного программирования).
Методы работы и полезные советы администратору баз данных
Читая данную лекцию, вы, наверное, уже заметили, что у администратора баз данных имеется множество разных обязанностей. От того, насколько хорошо вы будете выполнять их, зависит мнение пользователей вашей фирмы об администраторах баз данных вашей фирмы и вообще об отделе информационных технологий. В этом разделе мы дадим советы, как показать себя перед пользователями и как следует вести себя в деликатных ситуациях. Описанные здесь методы работы и полезные советы могут не совпасть с ситуациями из вашей практики, поэтому вам следует применять их в соответствии со своим разумением.
Работа с коллективом пользователей
Так как вы выполняете свои специфические обязанности, вам, возможно, не придется непосредственно общаться с коллективом пользователей. Но, скорее всего, вам иногда все же придется общаться с пользователями. В нескольких следующих подразделах описаны некоторые методики, позволяющие сделать общение с конечными пользователями более "гладким".
Потребитель всегда прав
Будьте дипломатичны. Даже если потребитель (пользователь) сообщает вам неверную информацию, не ведите с ними жарких споров. Конечный пользователь может не полностью понимать суть проблемы, либо ему трудно описать ситуацию правильно. В любом случае, не спорьте с пользователями, а относитесь к ним дружелюбно и, по возможности, научите их всему, что относится к данной проблеме. И наконец, наилучшим признаком появления проблем может оказаться реакция людей, ежедневно работающих с системой.
Умейте слушать
Прислушивайтесь к мнению коллектива пользователей. Познакомьтесь с пользователями, знайте, кто есть кто среди них и чем они занимаются. Хотя бы при случае зайдите к ним и спросите, каково их мнение о производительности системы. Часто бывает так, что пользователи первыми замечают падение производительности системы.
Следуйте Золотому Правилу
Как вы знаете, Золотое Правило гласит: "Относитесь к другим людям так, как хотите, чтобы относились к вам". Не унижайте никого и не спорьте с людьми на публике. В долгосрочной перспективе эти люди могут стать вашими союзниками, а не затаят на вас обиду. Такая политика поможет вам стать администратором баз данных, которого все уважают.
Настройка системы
Важной обязанностью администратора баз данных является настройка системы (system tuning). Мы дадим здесь пару советов, которые помогут вам более эффективно настраивать и поддерживать систему. Запомните один совет: при настройке системы меняйте за один раз лишь что-нибудь одно. Тогда вам будет просто понять, какие изменения приводят к увеличению производительности системы, а какие могут привести к ее снижению. Для удобства настройки системы будет полезным вести хорошие заметки.
Когда падение производительности достигло угрожающих масштабов, первую из этих рекомендаций довольно трудно выполнить. В этих случаях часто приходится решать проблему "одним махом", когда изменяются одновременно сразу много компонент. Изменив несколько компонент одновременно, вы увеличиваете шансы добиться повышения производительности, но при этом вы не выясните причину возникновения проблемы. При таком подходе может случиться, что два или несколько изменений окажут противоположные воздействия на систему, из-за чего производительность и вовсе не увеличится.
Работа в кризисных ситуациях
Каждый администратор баз данных иногда попадает в кризисную ситуацию. Ниже даны некоторые советы о том, как следует себя при этом вести.
Не паникуйте
Проблемы, которые сперва кажутся катастрофами, при некотором исследовании не кажутся такими уж экстренными. Однако проблемы с производительностью часто становятся критически важными. Сохраняйте хладнокровие, тогда вы сможете избежать дорогостоящих ошибок. Иногда лучше отвлечься от проблемы на несколько часов и успокоиться, чем сделать ошибку, усугубляющую проблему. Не бойтесь попросить о помощи, если вы нуждаетесь в этом. Взявшись решать проблему, будучи неподготовленным, вы можете создать новые проблемы. Не волнуйтесь и не паникуйте.
Не делайте поспешных выводов
Лично убедитесь в наличии проблемы. Не делайте выводов лишь на основании слов других людей. Иногда бывает, что пока информация дойдет до вас, люди преувеличивают проблему или неправильно понимают ее суть. Не верить слепо всему, что вы прочтете в докладных записках, а проверить факты лично – в ваших интересах.
Пользуйтесь мерами предосторожности
Многие ошибки возникают из-за чрезмерного рвения людей, пытающихся решить проблему. Иногда неправильный ремонт даже хуже, чем первоначальная проблема. Не суетитесь. Вы можете усугубить проблему, если будете работать слишком быстро и недостаточно осторожно. Ваша главная задача – не усугубить проблему.
Отдыхайте
Не работайте без сна или с хроническим недосыпанием. Так можно и заболеть. Решать проблему лучше, будучи внимательным и с ясной головой. Перенапрягаясь на работе, можно создать проблему, более сложную, чем та, которую вы хотите решить. Заботьтесь о себе. Не доводите себя до изнеможения.
Обращайтесь за помощью
Если проблема оказалась слишком сложной и вы не можете ее решить, не бойтесь обратиться за помощью к другим людям. Имеется множество специалистов, которые обладают опытом помощи в кризисных ситуациях. Нет ничего стыдного в том, что вы обращаетесь за помощью. На самом деле, обращение к нужному эксперту, может даже улучшить вашу репутацию.
Заключение
В данной лекции вы познакомились с кругом обязанностей администратора баз данных SQL Server. Конечно, в нашей книге вы не найдете точный перечень своих обязанностей. В некоторых фирмах имеются сотни администраторов баз данных, а в некоторых – лишь один или два. Так и их обязанности бывают разными в разных фирмах.
Некоторые администраторы баз данных, помимо каждодневных работ с базой данных, отвечают и за проектирование системы, и за разработку приложений. Обязанности администратора баз данных зависят как от потребностей фирмы, так и от его квалификации. Чем больше у вас будет знаний и опыта работы, тем более ценным работником вы станете для своей фирмы.
Лекция 4. Проектирование системы Microsoft SQL Server
Прежде чем начать устанавливать операционную систему и Microsoft SQL Server, вам нужно как следует продумать конструкцию своей системы SQL Server. Тщательное проектирование системы SQL Server позволит вам избежать дорогостоящих простоев, вызванных как реорганизацией системы, так и переинсталляцией SQL Server с другими настройками. Прочитав эту лекцию, вы узнаете, как производится проектирование системы SQL Server. В нашей книге термин система SQL Server обозначает аппаратуру и программное обеспечение, образующие компьютер, фактически осуществляющий работу с базой данных SQL Server. А под общим термином система мы будем иметь в виду аппаратуру и программное обеспечение, образующие все компьютеры, при помощи которых пользователи осуществляют доступ к данным, находящимся в одной или нескольких базах данных.
В этой лекции будет дана краткая вводная информация о версиях Microsoft Windows 2000 и SQL Server, которые вы можете выбрать для инсталляции. И наконец, вы получите сведения о типах внешних, интерфейсных (front-end) приложений для доступа к SQL Server, которые ваша фирма может приобрести или создать, а также о том, как архитектура приложений может влиять на перспективы масштабирования и производительности вашей системы.
Системные требования
Чтобы понять требования, предъявляемые ко всей системе, нужно выяснить функции системы. Когда вы имеете представление о назначении системы, то можно начать с поиска решения, как можно было бы добиться реализации системных требований при помощи одного или нескольких компьютеров. Вы можете решить, что одного компьютера будет достаточно, а можете посчитать, что для достижения ваших целей понадобится много компьютеров. В данной лекции мы дадим общий обзор этих вопросов. В лекциях 5 и 6 будут даны более подробные рекомендации по проектированию и конфигурированию аппаратуры.
А в данной лекции мы расскажем о функциональности системы и о том, какие решения о конфигурации можно принять на основе этой функциональности. Прежде чем рассматривать вопрос, как можно определить требования к уровню обслуживания, мы расскажем о типах приложений, которые могут работать в системе.
Системное приложение
Что хорошего в базе данных SQL Server без приложения? Если не рассматривать случай, когда каждый работник в вашей фирме является специалистом в SQL и наслаждается составлением сложных запросов и просмотром данных в табличной форме, то пользы от нее немного. Приложение облегчает применение SQL Server. Некоторые приложения явно показывают, что вы работаете с базой данных, а некоторые – полностью скрывают это. В любом случае, важно спроектировать приложение так, чтобы пользователи могли получать необходимое им обслуживание с комфортом и своевременно. Во многих случаях пользователи бывают рБ¤ZQV рБ¤ZQV АИџZQV 0:ўZQV XВ¤ZQV В¤ZQV @ В¤ZQV рять требованиям потребителей, они могут найти себе другую фирму, обеспечивающую более качественное обслуживание.
Приложения могут быть весьма разнообразными по выполняемым функциям. Можно обобщенно считать, что имеются три основные функции приложений: системы оперативной обработки транзакций ( OLTP, on-line transaction processing ), системы поддержки принятия решений ( DSS, decision support system ) и системы пакетной обработки данных ( batch processing ). Эти функции имеют различные требования и могут применять совершенно разные типы приложений.
OLTP (системы оперативной обработки транзакций)
Особенностью систем оперативной обработки транзакций (OLTP) является одновременный оперативный доступ многих пользователей к данным. И что более важно, эти пользователи ждут отклика от системы. Системы OLTP могут иметь множество форм, среди которых следующие:
- Онлайновые продажи. Этот вид систем OLTP получил широкое распространение из-за быстрого роста Интернет-коммерции. Покупая товары через Интернет, пользователям часто приходится терпеть задержки при передаче, доставке и обработке данных. Минимизируя длительность доступа к базе данных, вы уменьшаете общую длительность транзакций.
- Продажи в обычных магазинах. Когда кассир в магазине пробивает вашу кредитную карточку, происходит доступ к базе данных. Прежде чем запрос достигнет базы данных, транзакция пройдет через множество компьютеров.
- Системы для бизнеса. У каждой фирмы имеется какое-нибудь приложение для доступа к базам данных. Это может быть ваша платежная система, система для закупок, база данных кадровой службы, система для учета имущества или еще какая-нибудь другая система. Такие приложения могут быть созданы как приложения для внутренней сети, реализованы на языках программирования вроде C++ или Microsoft Visual Basic, или при помощи инструментального средства – языка четвертого поколения (4GL). В любом случае, в конечном итоге, данные поступают из базы данных.
Все системы OLTP обладают одной общей особенностью – пользователь должен ждать от них ответа. Ваша задача – спроектировать систему, которая будет адекватно обслуживать запросы пользователей за предусмотренное время ответа.
DSS (системы поддержки принятия решений)
Системы поддержки принятия решений (DSS) помогают пользователям принимать важные решения, касающиеся их бизнеса, они выдают специфические результаты, относящиеся к бизнесу. Вот некоторые примеры вопросов про бизнес, на которые могут отвечать системы поддержки принятия решений:
- Кто является основными продавцами в том или ином районе? Какие товары они преимущественно продают?
- В какое время года лучше всего продаются те или иные товары?
- Как влияло понижение цены на продажи того или иного товара?
- Каковы средние размеры комиссионных для продавцов в том или ином районе?
Системы поддержки принятия решений отличаются от систем оперативной обработки транзакций (OLTP) тем, что пользователи систем поддержки принятия решений ожидают ответа на сложные запросы, для которых требуется значительное время ответа. Время ответа на запросы к системам поддержки принятия решений может составить от нескольких секунд до минут и даже часов. Это не значит, что в системах поддержки принятия решений время ответа не играет роли, но здесь можно пойти на компромисс между пропускной способностью (производительностью для всех пользователей) и временем ответа (производительностью для отдельных пользователей).
Системы пакетной обработки данных
Системы пакетной обработки данных обрабатывают неоперативные (offline) задания обработки данных, не имеющие никаких компонент для работы с конечными пользователями. Вот типичные примеры таких систем:
- Ежедневное обновление данных. Для некоторых систем поддержки принятия решений требуется еженочная загрузка новых данных, и эта работа часто выполняется автоматически при помощи заданий пакетной обработки данных.
- Преобразование данных. Эта задача похожа на обновление данных, но сопровождается преобразованием данных.
- Очистка данных. При выполнении этой задачи происходит, например, удаление из базы данных дублирующихся записей.
- Автономное выписывание счетов. Эта задача может заключаться в еженочном выписывании счетов потребителям.
Системы для пакетной обработки обычно не имеют пользователей, ожидающих завершения заданий, но, как правило, они ограничены временными рамками, в пределах которых задачи должны быть завершены. Например, ночная загрузка данных не может захватывать время утренних входов в систему.
Требования
Как вы видите, прежде чем проектировать сервер базы данных, важно понять, какие типы приложений должны будут поддерживаться системой. Не зная требований к системе, вы не сможете эффективно проектировать систему. Из дальнейшего материала данной лекции и всей книги вы поймете, что каждая система имеет свои собственные требования, свои особенности. Эти требования могут подсказать те или иные проектировочные решения, например, вы можете решать, сколько компьютеров нужно использовать и нужна ли вам распределенная обработка транзакций.
Требования к уровню обслуживания
К наиболее важным факторам, влияющим на проектирование вашей системы, относятся требования к уровню обслуживания. Эти требования к уровню обслуживания обычно формулируются в соглашении об уровне обслуживания (SLA, service level agreement). Соглашения об уровне обслуживания заключаются между поставщиками обслуживания (CIO, chief information officer, руководителями, отвечающими за информационные технологии) и потребителями (пользователями). Будет ли заключено формальное соглашение об уровне обслуживания или нет, зависит от того, кто является потребителем и каким образом осуществляется обслуживание.
Например, если вы заключили с другой фирмой контракт о предоставлении услуг доступа к базам данных, то, скорее всего, у вас будет иметься соглашение об уровне обслуживания. Фактически, чаще всего такие соглашения об уровне обслуживания являются контрактами, исполнение которых обязательно по закону. В любом случае, в соглашении об уровне обслуживания будет дано описание уровня обслуживания, гарантируемого потребителям. Там также могут быть определены санкции за несоответствие требованиям к уровню обслуживания. Более подробно про соглашения об уровне обслуживания будет рассказано в лекции 6.
Если имеются гарантии на уровень обслуживания, то вы должны спроектировать систему таким образом, чтобы обеспечивать этот уровень производительности. Мы обсудим здесь некоторые моменты, влияющие на проектирование системы: производительность, мощность и обеспечение работоспособности в течение суток.
Производительность
Одним из наиболее важных условий, включаемых в соглашения об уровне обслуживания, является спецификация минимально допустимой производительности системы. Типичное соглашение об уровне обслуживания содержит схему различных транзакций, поддерживаемых приложением, значение допустимого наихудшего времени обслуживания для 100 процентов транзакций и, необязательно, более строгие требования к допустимому наихудшему времени обслуживания для 95 или 90 процентов транзакций. Например, в соглашении об уровне обслуживания может быть сказано, что 90 процентов транзакций "добавить нового потребителя" должно завершаться за время не более двух секунд, и что любые такие транзакции должны завершаться не более чем за три секунды.
Поставщик обслуживания должен поддерживать данный уровень обслуживания, а иначе к нему могут быть применены санкции. Как администратор баз данных вы отвечаете за такое администрирование системы, при котором будут соблюдаться данные уровни обслуживания. Кроме того, вы должны предвидеть проблемы, которые могут начать появляться и, при необходимости, увеличивать мощность системы. Чтобы соответствовать этой ответственности, вы должны постоянно следить за системой и периодически проводить работы по повышению мощности системы.
Мощность
Кроме требований к производительности, соглашения об уровне обслуживания, могут содержать также требования к мощности. Мощность системы классифицируется по различным категориям, таким как мощность места на дисках, мощность пользователей, мощность сетевых соединений и т.д. К числу ваших обязанностей относится и поддержание системы в таком состоянии, чтобы она не выходила за установленные рамки требований к мощности.
Чтобы поддерживать мощность системы, вы должны непрерывно следить за ней и предпринимать действия, когда есть признаки, что мощность подходит к своему пределу. Как вы увидите в лекции 6, некоторый объем места на дисках должен оставаться всегда, чтобы обеспечить пиковые нагрузки при работе. Если этот резервный буфер начинает использоваться часто, то нужно добавить в систему дополнительные ресурсы. Это верно и в отношении использования центрального процессора.
Обеспечение работоспособности
Кроме спецификаций с требованиями к производительности и к мощности, в соглашения об уровне обслуживания обычно включаются также и спецификации с требованиями к обеспечению работоспособности системы. В спецификациях на обеспечение работоспособности системы утверждается, что система должна быть доступна для пользователей в некоторые заранее определенные периоды времени. В соглашении об уровне обслуживания может быть указано, что система должна быть работоспособной в течение 99,9% времени семь дней в неделю, 52 недели в году, либо может быть сказано, что система должна быть работоспособной восемь часов в день, пять дней в неделю, это зависит от потребностей вашей фирмы. Вы отвечаете за разработку плана регулярного резервного копирования и восстановления, а также за планы восстановления после аварий (чрезвычайные планы), чтобы обеспечить работоспособность системы во время, заданное спецификацией об уровне обслуживания.
Системные компоненты и настройки
Теперь, когда вы имеете краткое представление о типах доступных приложений и требований к уровню обслуживания, вы можете принять решение о том, какое программное обеспечение следует установить на вашей системе. Вы можете выбрать одну из четырех версий Windows 2000 и одну из трех версий SQL Server 2000. В данном разделе мы рассмотрим различия между этими версиями и причины, по которым вы можете предпочесть одни версии другим.
Версии Windows 2000
Для того чтобы вы могли выбрать программное обеспечение, соответствующее требующимся для вас приложениям, имеются четыре версии Windows 2000. Возможности операционных систем Windows 2000 растут при переходе от Windows 2000 Professional к Windows 2000 Server, затем к Windows 2000 Advanced Server и, наконец, к Windows 2000 Datacenter. Ниже будут даны описания возможностей каждой из версий Windows 2000. Следует выбирать ту версию Windows 2000, которая обеспечивает возможности, соответствующие вашим потребностям, а не просто покупать самую дорогую версию с наибольшими возможностями.
Windows 2000 Professional
Windows 2000 Professional является, по существу, версией Windows 2000 для настольных компьютеров. Как правило, компьютер под управлением Windows 2000 Professional сможет воспользоваться возможностями лишь клиентских компонент SQL Server 2000. Однако если вам понадобится запустить на этом компьютере SQL Server, то вы сможете инсталлировать SQL Server 2000 Personal Edition. Версия Personal Edition позволяет только локальный доступ к базе данных. Доступ с других компьютеров не разрешается.
Windows 2000 Server
Windows 2000 Server спроектирована как серверная операционная система. Это значит, что инсталлировав на компьютер Windows 2000 Server, вы позволите другим компьютерам осуществлять доступ к ресурсам этого компьютера. Windows 2000 Server поддерживает SQL Server 2000 Standard Edition. Windows 2000 Server не поддерживает компьютеры с более чем четырьмя центральными процессорами и более чем с 4 Гб оперативной памяти. SQL Server 2000 также позволяет удаленным клиентам осуществлять доступ к базе данных.
Windows 2000 Advanced Server
Windows 2000 Advanced Server также является серверной операционной системой. Как и для компьютеров под управлением Windows 2000 Server, компьютеры под управлением Windows 2000 Advanced Server позволяют другим компьютерам осуществлять доступ к их системным ресурсам, а также к SQL Server. В дополнение к возможностям Windows 2000 Server, Windows 2000 Advanced Server поддерживает до восьми центральных процессоров и до 8 Гб оперативной памяти. Если вы хотите пользоваться службами MSCS (Microsoft Cluster Services) для поддержки перехода к другому узлу кластера при отказах, то вам следует применять Windows 2000 Advanced Server. Кроме поддержки MSCS, Windows 2000 Advanced Server вместе с SQL Server 2000 поддерживает новую технологию кластеризации SQL Server – "обновляемые распределенные представления" (updatable distributed views).
Windows 2000 Datacenter
Windows 2000 Datacenter – это "флагман" семейства операционных систем Windows 2000. Данная версия Windows 2000 поддерживает все компоненты, что и другие версии, а также может поддерживать до 64 центральных процессоров и до 64 Гб памяти. Поставки Windows 2000 Datacenter осуществляются только через поставщиков оборудования. Поставщики оборудования не только встраивают (интегрируют) Windows 2000 Datacenter в свое оборудование, но и обеспечивают наивысший уровень поддержки, доступный для операционных систем Windows 2000. Благодаря такой интеграции программного обеспечения и аппаратуры вы можете обращаться с вопросами технической поддержки аппаратуры и Windows 2000 в единую службу.
Версии SQL Server
Вы можете выбирать не только среди версий Windows 2000, но и среди нескольких версий (редакций, editions) SQL Server. Выбор версии SQL Server очень прост и зависит от необходимого для вас объема оперативной памяти и количества центральных процессоров. Ниже даны описания версий SQL Server.
Клиентское программное обеспечение
Клиентские компоненты SQL Server 2000 состоят из сетевых библиотек и утилит, необходимых для доступа к удаленной или локальной системе SQL Server. Эти компоненты необходимы любой системе для доступа к SQL Server, и они одинаковые (не зависят от того, какая версия SQL Server инсталлирована).
Версия Personal Edition
Версия Personal Edition спроектирована для реализации небольших баз данных, доступных локально на компьютере-клиенте. SQL Server 2000 Personal Edition вполне может использоваться в качестве сервера для небольшой рабочей группы и допускает ограниченное (до 5) число клиентских подключений по сети.
Версия Standard Edition
Standard Edition является одной из двух серверных версий ("редакций") SQL Server 2000. Standard Edition обладает такими же функциональными возможностями, как и SQL Server Enterprise Edition, но не может работать более чем с четырьмя центральными процессорами и более чем с 4 Гб оперативной памяти.
Версия Enterprise Edition
Версия Enterprise Edition поддерживает все средства и функциональные возможности всех версий Windows 2000. Для работы SQL Server 2000 Enterprise Edition требуется Windows 2000 Advanced Server или Windows 2000 Datacenter. Кроме прочего, SQL Server 2000 Enterprise Edition поддерживает двухузловую кластеризацию с переходом к другому узлу кластера при отказах и обновляемые распределенные представления (updatable distributed views).
Сравнительная таблица версий
Возможности различных версий Windows 2000 и SQL Server 2000 перечислены в табл. 4.1.
SQL Server 2000 Personal Edition | SQL Server 2000 Standard Edition | SQL Server 2000 Enterprise Edition | |
---|---|---|---|
Windows 2000 Professional | Ограниченные возможности | Невозможное сочетание версий | Невозможное сочетание версий |
Windows 2000 Server | Ограниченные возможности | Возможности сервера. Поддержка до 4 центральных процессоров и до 2 Гб памяти | Возможности сервера. Поддержка до 4 центральных процессоров и до 4 Гб памяти |
Windows 2000 Advanced Server | Ограниченные возможности | Возможности сервера. Поддержка до 4 центральных процессоров и до 2 Гб памяти | Возможности сервера. Кластеризация MSCS. Поддержка до 8 центральных процессоров и до 8 Гб памяти |
Windows 2000 Datacenter | Ограниченные возможности | Возможности сервера. Поддержка до 4 центральных процессоров и до 2 Гб памяти | Возможности сервера. Кластеризация MSCS. Поддержка до 64 центральных процессоров и до 64 Гб памяти |
Как видите, у вас есть из чего выбрать. Следует тщательно обдумать выбор приобретаемых продуктов. Если вы поменяете свое решение уже после того, как инсталлируете систему, то вам придется начинать всю работу с самого начала.
Системные настройки
Кроме выбора версий SQL Server 2000 и Windows 2000 вы также можете воспользоваться еще некоторыми другими настройками. Эти настройки (опции) описаны ниже, они определяют применение кластеризации MSCS, репликацию SQL Server 2000 и обновляемые распределенные представления (эта новая возможность, появившаяся в SQL Server 2000 Enterprise Edition). Каждая из этих настроек имеет свои собственные возможности и требования и, следовательно, могут оказаться в вашей конфигурации полезными либо бесполезными. Мы расскажем об этом в нескольких абзацах ниже.
MSCS
Сокращение MSCS расшифровывается как Microsoft Cluster Services – "службы кластеризации Microsoft". Службы MSCS являются настройкой Windows 2000, работающей в сочетании с SQL Server. Благодаря MSCS компьютер может работать как резервный сервер (standby, failover server) для другого компьютера (сервер для перехода при отказе). Благодаря этому можно начинать процесс восстановления почти сразу же после случившегося аппаратного или даже программного отказа. Для MSCS требуется разделяемая дисковая подсистема, подключенная к обоим компьютерам кластера. Журнал транзакций SQL Server и файлы данных, а также исполняемые файлы должны размещаться на этой разделяемой дисковой подсистеме. В случае отказа, определяемого по отсутствию "сигнала пульса", резервный компьютер берет на себя функции SQL Server. Так как резервный компьютер захватывает себе IP-адрес и имя системы, то для внешнего мира он воспринимается просто как перезагрузившийся основной сервер базы данных.
Репликация SQL Server
Репликация SQL Server позволяет копировать данные из одной базы данных SQL Server на другие системы баз данных. Имеются разные схемы репликации –моментальная (snapshot replication), транзакционная (transactional replication) и репликация слиянием (merge replication), они будут описаны в нескольких абзацах ниже. Какая из схем репликации лучше всего подойдет вам – зависит от ваших предпочтений и от ваших потребностей. Репликация SQL Server работает по модели "опубликовать-подписаться" (publish-and-subscribe model), в которой издатель (publisher) публикует данные, а один или несколько подписчиков (subscribers) получают копии этих данных.
Моментальная репликация
При моментальной репликации периодически создается "картинка", "снимок" (snapshot) данных и предоставление этих данных в пользование другим системам. Моментальная репликации выполняется только во время создания и применения "снимков", поэтому при обычной работе она не затруднит вас дополнительными заботами. Недостатком моментальной репликации является то, что "свежесть" данных определяется последним "снимком", а он может быть довольно старым.
Транзакционная репликация
Транзакционная репликация начинается с моментальной репликации, но после этого производится непрерывное считывание журнала транзакций компьютера-издателя, и транзакции, применявшиеся к издателю, будут применены и к подписчику (подписчикам). Благодаря этому информация на подписчиках будет поддерживаться до некоторой степени "свежей". Конечно, все равно будет некоторая задержка между временем, когда транзакции поступают на компьютер-издатель и временем, когда транзакции применяются к подписчикам.
Репликация слиянием
Репликация слиянием отличается от транзакционной репликации и моментальной репликации тем, что обновления происходят и на компьютере-издателе, и на компьютерах-подписчиках. SQL Server применяет триггеры и метки времени (timestamps) для координации изменений между разными компьютерами, участвующими в репликации. Репликация слиянием полезна, когда требуется многонаправленная репликация, но по сравнению с транзакционной или моментальной репликацией она вызывает гораздо большую нагрузку.
Обновляемые распределенные представления
В SQL Server появились обновляемые распределенные представления (updatable distributed views). Благодаря этой возможности системы SQL Server могут разделять (использовать совместно) логическую базу данных, что повышает масштабируемость. Логическая база данных может стать большой, и вы можете разместить ее на многих компьютерах, это позволяет повысить ее мощность. (Об обновляемых распределенных представлениях см. лекцию 18.)
Размещение базы данных
Важной частью проектирования системы SQL Server является проектирование размещения базы данных (database layout). Под этим надо понимать физическое размещение журналов транзакций, файлов данных и т.д. Эта задача – одна из самых важных при проектировании системы, потому что изменить принятые ранее решения, относящиеся к размещению, будет очень сложно. В лекциях 5 и 6 будут даны советы о физическом размещении журнала транзакций и файлов данных.
Журнал транзакций
Журнал транзакций критически важен для работы, для стабильности и производительности сервера базы данных. У каждой базы данных имеется свой собственный журнал транзакций, поэтому каждый журнал транзакций должен быть правильно размещен. Журнал транзакций используется для записи изменений в базу данных, что позволяет восстановить систему в случае отказа. Так как восстановление опирается на журнал транзакций, важно, чтобы эта компонента базы данных была защищена от возможных сбоев при помощи RAID-устройств. Журнал транзакций должен оставаться доступным даже при выходе диска из строя.
В дополнение к защите журнала транзакций от отказов дисков вам следует обеспечить размещение журнала транзакций на высокоскоростном устройстве. Если журнал транзакций будет размещен на слишком медленном устройстве, то транзакциям придется ждать, что сильно повлияет на производительность системы. Журнал транзакций должен быть также сконфигурирован так, чтобы обеспечивалась отказоустойчивость. Требования к размещению журнала транзакций рассмотрены подробно в следующей лекции.
И наконец, нужно обеспечить достаточно места в журнале транзакций, чтобы система длительное время могла работать безостановочно. Когда журнал транзакций заполнится, обработка транзакций приостановится до тех пор, пока в журнале транзакций не появится свободное место. Место в журнале транзакций освобождается при резервном копировании журнала транзакций. Однако резервное копирование журнала транзакций может негативно повлиять на производительность. Некоторые администраторы баз данных предпочитают создавать достаточно большие журналы транзакций, чтобы было достаточно лишь одного резервного копирования в час или в день. Следует увеличивать размер журнала транзакций до такой степени, чтобы он мог применяться без резервного копирования не менее восьми часов.
Файлы данных
Проектирование размещения файлов данных полностью отличается от проектирования размещения журнала транзакций. В зависимости от способа доступа к данным, вы должны разместить их на как можно большем количестве дисков, распределяя нагрузку ввода-вывода по всем этим дискам. Этот процесс описан более подробно в следующей лекции.
Вам следует увеличить размеры файлов данных так, чтобы было достаточно места, чтобы предусмотреть рост системы. Даже удивительно, насколько быстрым бывает иногда рост баз данных. При росте данных растут и индексы. Вам придется периодически проверять систему и выполнять работы по увеличению ее состава и планированию мощности.
Поэтому, чтобы вы смогли правильно спланировать размещение файлов данных, нужно оценить объем требуемого для них места и необходимую производительность и затем создать нужное количество дисков, применяя RAID-подсистему. В зависимости от ваших конкретных потребностей, можно применять либо не применять средства для отказоустойчивости. После того как решение о подсистеме ввода-вывода будет принято, следует равномерно разместить файлы данных по контроллерам и дискам.
Приложение
Приложение является главной частью вашей системы, оно должно быть спроектировано так, чтобы работать хорошо не только в данный момент, но и в будущем. В этом разделе мы расскажем, как нужно проектировать приложение с учетом производительности, масштабируемости и возможностей для роста.
Архитектура
Основная архитектура приложения может принимать различные формы. Основные различия между архитектурами приложений состоят в количестве систем, участвующих в работе приложения. Эта классификация производится по количеству звеньев (tiers). Реклама многих наиболее популярных приложений основывается на количестве звеньев, которые могут в них содержаться.
Сравнение архитектур
Каждое приложение базы данных состоит из трех отдельных компонент:
- Службы базы данных (database services). Это – конечный сервер базы данных и данные, которые размещены в этой базе данных.
- Службы приложения (application services). Это – механизмы манипулирования данными, извлекаемыми из базы данных. Логика их работы определяется приложением или потребностями бизнеса.
- Службы представления (presentation services). Это – пользовательский интерфейс. Службы представления должны быть способными манипулировать данными таким образом, чтобы это было понятно пользователям.
Различие между однозвенной, двухзвенной и трехзвенной архитектурами зависит от того, каким образом разделяются на части эти компоненты. В однозвенной архитектуре они все являются частями одной программы. В двухзвенной архитектуре эти компоненты разделены на две отдельные части. В трехзвенной архитектуре компоненты разделены на три отдельные части (см. рис. 4.1). В последующих разделах даны более подробные объяснения.
Рис. 4.1. Различия между однозвенной, двухзвенной и трехзвенной архитектурами
Однозвенная архитектура
Однозвенная (one-tier, single-tier) архитектура – это система, в которой все службы базы данных, приложения и представления (пользовательский интерфейс) размещены на одной системе. Системы такого типа не производят обработку вне тех компьютеров, на которых они исполняются. Примером однозвенной архитектуры может служить база данных Microsoft Аccess с локальными службами представления.
В наше время трудно встретить действительно однозвенную архитектуру, особенно на платформе Windows 2000. Тем не менее многие небольшие однопользовательские приложения являются однозвенными. Примером этому могут служить Microsoft Money, Quicken и TurboTax. Такие приложения обычно размещаются на том же компьютере, на котором они и исполняются. Пример однозвенной архитектуры с SQL Server найти гораздо труднее. Фактически, даже если вы можете исполнять Enterprise Manager на той же системе, где размещена и база данных, но на самом деле такое приложение не является однозвенным, потому что данное приложение пользуется сетевыми компонентами SQL Server. Тот факт, что вы вот взяли и запустили его на той же системе, является несущественным.
Двухзвенная архитектура
В двухзвенных приложениях службы представления и база данных размещаются на разных системах (компьютерах). Уровень служб представления (пользовательский интерфейс) обычно включает в себя логику работы приложения. Хорошим примером двухуровневого приложения является приложение, использующее SQL Server Enterprise Manager. У таких приложений пользовательский интерфейс и логика работы приложения размещаются в Enterprise Manager, но все данные, необходимые для функционирования приложения, находятся в базе данных SQL Server на другом компьютере.
Двухзвенные приложения встречаются чаще всего. Вы, наверное, уже работали со многими такими приложениями. Эти приложения обычно написаны на языках, поддерживающих API (интерфейсы прикладного программирования) для Windows, таких, как Microsoft Visual C++ или Visual Basic. При помощи двухзвенных приложений каждый пользователь может иметь одно или несколько соединений с базой данных SQL Server. Данная архитектура может стать неэффективной из-за того, что большинство этих соединений будут простаивать большую часть времени.
Трехзвенная архитектура
В трехзвенных приложениях уровень базы данных, уровень приложения и уровень служб представления выделены в три разные компоненты. В типичных трехзвенных приложениях используется промежуточный уровень для обслуживания многочисленных соединений от уровня служб представления, благодаря чему уменьшается количество соединений с SQL Server. Кроме того, этот промежуточный уровень может выполнять значительный объем работы, связанной с реализацией специфики целевых задач (логики предметной области), освобождая базу данных для решения тех задач, которые она выполняет лучше всего, – для доставки требуемых данных.
На вопрос, к какой категории – с двухзвенной или с трехзвенной архитектурой – можно отнести веб-приложение, ответить сразу бывает трудно. Можно воспользоваться простой проверкой: если данные, отображаемые уровнем служб представления, могут с той же легкостью применять и терминал или веб-браузер, то данное приложение, скорее всего, является двухзвенным.
Как вы могли убедиться, благодаря разделению компонент вы можете применять много компьютеров. Фактически, обычно системы начинаются с одного сервера базы данных, соединенного с несколькими серверами приложений, которые, в свою очередь, обслуживают много компьютеров-клиентов. Решения, принимаемые при проектировании системы, зависят от количества ее пользователей и выбранного вами приложения.
Производительность и масштабируемость
Когда вы разрабатываете приложение и схему базы данных, вам следует помнить о производительности и масштабируемости. На стадии проектирования приложения вы делаете выбор среди многих настроек, что может впоследствии повлиять на производительность и масштабируемость. Среди этих настроек имеются следующие:
- Использование временных рабочих таблиц. Для небольших баз данных временные рабочие таблицы оказываются эффективными, но с увеличением размера базы данных они перестают работать правильно.
- Использование агрегатных функций.Использование агрегатных функций (aggregate functions), таких как MIN( ), MAX( ) и AVG( ), сопоставимо с объемом используемых данных. Поэтому обратите внимание, чтобы ваш набор данных не стал со временем слишком громоздким.
- Использование индексов. По мере роста объема данных, использование индексов становится более важным (см. лекцию 17).
- Использование транзакций. Использование явных транзакций очень полезно, чтобы гарантировать атомарность операций. Однако, по мере роста числа одновременно работающих пользователей, важно ограничивать блокировки, насколько это окажется возможным.
Теперь вам понятно, что для проектирования системы, которая будет работать хорошо в условиях роста нагрузки, следует помнить о нескольких факторах. Применив методы оптимизации производительности еще на стадии проектирования, вы сможете создать масштабируемую систему.
Заключение
Как вы поняли из данной лекции, при проектировании системы SQL Server следует помнить о многих вещах. К сожалению, невозможно просто взять и рассказать о том, как следует проектировать системы баз данных. Даже если вы проектируете системы для многих фирм, результаты обычно получаются разными, потому что у каждой фирмы имеются свои нужды и требования.
В данной лекции мы показали несколько ключевых моментов. Вы должны узнать требования вашей фирмы относительно расписания периодов работоспособности системы. Может быть, ваша система будет состоять из многих вычислительных центров, будет применять кластеризацию, подсистемы ввода-вывода с RAID-массивами или репликацию. Кроме того, на всю конструкцию системы окажут влияние требования, относящиеся к масштабируемости и производительности. Как вы поняли из данной лекции, здесь имеется множество вариантов настроек. Наконец, вы должны проектировать приложение, постоянно помня о производительности. Если вы сможете предвидеть вопросы, касающиеся производительности, то система не затормозится при росте объема данных и увеличении числа пользователей.
В следующей лекции будут развиты многие темы, поднятые в данной главе. В лекции 5 вы также узнаете, как работает подсистема ввода-вывода, какие моменты, связанные с производительностью и отказоустойчивостью вы должны учитывать, и как оптимально спланировать и сконфигурировать подсистему ввода-вывода.
Лекция 5. Конфигурирование и планирование подсистемы ввода-вывода
Конфигурируя свою систему, вы должны специально позаботиться о том, чтобы правильно спроектировать и сконфигурировать подсистему ввода-вывода. Конфигурирование подсистемы ввода-вывода может как улучшить, так и ухудшить производительность вашей системы. Поняв ограничения, относящиеся к подсистеме ввода-вывода, и сконфигурировав свой сервер на оптимальную работу с учетом этих ограничений, вы сможете достичь требуемого уровня производительности.
В данной лекции мы изучим подсистему ввода-вывода. Мы начнем с описания работы устройств жестких дисков и расскажем, почему диски имеют фундаментальные ограничения производительности. Затем мы расскажем о разнообразных решениях при помощи доступных вам систем RAID и о характеристиках их производительности. Кроме того, вы научитесь идентифицировать и решать проблемы с производительностью ввода-вывода. В данной лекции также будет дано множество полезных советов и рекомендаций, относящихся к подсистеме ввода-вывода. И наконец, вы научитесь правильно конфигурировать Microsoft SQL Server 2000 так, чтобы вы смогли задействовать потенциал производительности вашей подсистемы ввода-вывода.
Характеристики производительности дисков
Дисковые накопители, называемые также "жесткие диски", являются одними из основных компонент компьютеров. Но, как ни удивительно, механическое устройство дисковых накопителей за последние 20 лет не поменялось радикально. По сравнению с первыми моделями, жесткие диски стали гораздо надежней и быстрей, но их основа осталась такой же. С точки зрения производительности, жесткие диски являются одними из наиболее важных аппаратных компонент, требующих настройки. Строго говоря, на самом деле вы не можете настраивать жесткие диски, но, зная характеристики их производительности и ограничения, вы можете конфигурировать свою систему с учетом данных ограничений, осуществляя, фактически, настройку подсистемы ввода-вывода.
Конструкция накопителя на жестких дисках
В качестве компонент для хранения данных в накопителях на жестких дисках применяются одна или нескольких пластин (disk platters). Эти пластины покрыты веществом, способным хранить данные благодаря своим магнитным свойствам. Данные хранятся на дорожках (tracks), похожих на дорожки грампластинки (или компакт-диска – для тех, кто забыл, как выглядят грампластинки). Каждая дорожка, в свою очередь, состоит из нескольких секторов. Чем дальше от центра диска, тем больше секторов будет на каждой из дорожек. Типичная пластина жесткого диска показана на рис. 5.1.
Накопители на жестких дисках часто состоят не из одной, а из многих пластин, расположенных одна над другой (рис. 5.2). Данные считываются при помощи магнитных головок. Магнитные головки используются как для чтения, так и для записи данных на диск. Так как пластин несколько, то и головок должно быть несколько. Эти головки крепятся на коромыслах (armature), двигающихся внутрь пакета пластин и обратно из него, подобно тонарму с иглой у граммофона. Все головки и коромысла жестко соединены друг с другом, поэтому все головки в каждый из моментов времени находятся в одинаковых местах каждой из пластин. Из-за такой конструкции диска становится целесообразным одновременное чтение или запись сразу всеми его головками. Таким образом, данные записываются и считываются с диска одновременно всеми головками. Поскольку набор дорожек, охватываемых головками в любой из моментов времени, похож на цилиндр, мы говорим, что данные хранятся в цилиндрах (рис. 5.2).
Рис. 5.1. Пластина жесткого диска
Рис. 5.2. Цилиндры жесткого диска
Накопители на жестких дисках могут иметь только одну пластину, а могут – и более шести пластин. Плотность хранения данных на пластинах и количество пластин определяют максимальную емкость (вместимость) накопителя. Некоторые модели накопителей не отличаются почти ничем, кроме количества пластин. Распространенная модель накопителей имеет емкость 9 Гб и три пластины, а накопители модели, не отличающейся ничем, кроме емкости 18 Гб, имеют шесть пластин.
Показатели производительности накопителей на жестких дисках
Теперь, когда у вас имеется представление о конструкции накопителя на жестких дисках, давайте ознакомимся с тем, как он работает. Сначала мы расскажем о характеристиках вращения жестких дисков, а затем вы узнаете, как зависит время поиска дорожки жестких дисков от производительности накопителя.
Задержка вращения
Многие высокопроизводительные жесткие диски вращаются со скоростью 10000 об/мин. Если для доступа к запрошенным данным потребуется полный оборот диска, то этот оборот диска займет приблизительно 6 мс, т.е. 0,006 секунд. Скорость вращения 10000 об/мин соответствует 166,7 оборотам в секунду, поэтому на один оборот требуется 1/166,7 секунды, т.е. около 6 мс.
Чтобы головки накопителя могли прочитать сектор данных, этот сектор должен находиться под головками. Поскольку диск всегда вращается, головка просто должна подождать, пока сектор не подойдет в позицию под нее. Время, необходимое для поворота диска в нужную позицию, когда нужный сектор подойдет под головку, называется задержкой вращения (rotational latency). Задержка вращения может достигать 6 мс (если необходим полный оборот диска), но в среднем она составляет 3 мс.
Задержка вращения добавляется к времени отклика доступа к диску. Поэтому, когда вы выбираете дисковые накопители для своей системы, с точки зрения производительности, длительность задержки вращения чрезвычайно важна. Как вы только что видели, для дисков со скоростью вращения 10000 об/мин, задержка вращения составляет около 3 мс. Диски предыдущего поколения вращались со скоростью 7200 об/мин, у них оборот совершался за 8,3 мс, а средняя задержка вращения составляет около 4,15 мс. Это увеличение средней задержки вращения кажется небольшим, но оно на 38% больше, чем у диска со скоростью вращения 10000 об/мин. Как вы узнаете далее в данной лекции, длительность времени отклика может значительно увеличить время доступа для ввода-вывода.
Время поиска дорожки диска
При доступе к данным, диск должен не только повернуться в такое положение, чтобы головки могли бы прочесть данные, но и головки должны передвинуться на дорожку, на которой находятся данные. Коромысла двигаются к центру диска и наружу, перемещая головки на цилиндр, содержащий нужные данные. Время, необходимое для перемещения головок к местоположению нужных данных, называется временем поиска дорожки или просто временем поиска (seek time), или временем подвода головки к требуемой дорожке диска (см.рис. 5.3).
Рис. 5.3. Задержка вращения и время поиска
Время, необходимое для поиска нужной дорожки, зависит, главным образом, от расстояния, которое должны пройти головки диска. Если накопитель осуществляет доступ к данным, хранящимся в последовательном порядке, головки должны перемещаться лишь на небольшое расстояние, и такое перемещение производится быстро. Если доступ производится к данным, располагающимся по всему диску, длительности поиска дорожек могут оказаться более продолжительными. В любом случае, добиваясь минимального времени поиска, вы улучшаете производительность вашей системы.
Время поиска и задержка вращения добавляются ко времени, необходимому для выполнения операции ввода-вывода и, следовательно, снижают производительность дискового накопителя. Для накопителей со скоростью вращения 10000 об/мин, задержка вращения составляет около 3 мс. Время поиска нужной дорожки зависит от размера и скорости дискового накопителя и варианта осуществляемого поиска.
Время перехода головки на соседнюю дорожку (track-to-track seek time) определяет время перехода на другую дорожку при осуществлении операций последовательного ввода-вывода. У типичных 9 Гб дисков со скоростью вращения 10000 об/мин время перехода головки с дорожки на дорожку составляет около 0,8 мс. Как видите, для дисков со временем перехода головок на соседнюю дорожку 0,8 мс, задержка вращения составляет около 3 мс и является более существенным фактором, оказывающим влияние на производительность дискового накопителя. Если операции ввода-вывода применяются к дисковому накопителю достаточно быстро, то накопитель сможет прочитывать за один раз соседние дорожки или даже прочитывать или записывать дорожку целиком за один раз. Однако так бывает не всегда. В некоторых ситуациях операции ввода-вывода запрашиваются недостаточно быстро, и на каждый запрос из серии последовательных запросов приходится по обороту диска. То, что будет происходить на самом деле, зависит от конструкции и от скорости контроллера дискового накопителя.
Среднее время поиска дорожки диска (average seek time) – это усредненное время, необходимое для перехода головок между двумя произвольно выбранными (random) дорожками диска. Исходя из таблиц с техническими характеристиками типичных дисков со скоростью вращения 10000 об/мин, их время поиска составляет около 6 мс. Поскольку почти все операции ввода-вывода, генерируемые SQL Server, будут относиться к произвольным участкам диска, то ваши дисковые накопители будут выполнять множество операций произвольного ввода-вывода.
Максимальное время поиска для дисков данного типа может достигать 13 мс. Поиск дорожки имеет максимальную длительность при переходе от самой внутренней дорожки пластины к самой внешней дорожке или наоборот. Такая ситуация называется поиск по всему диску (full-disk seek). Но при обычной работе поиск нужной дорожки не будет поиском по всему диску, особенно когда диск не заполнен до конца.
Технические характеристики накопителей на жестких дисках
В данном разделе вы узнаете, насколько быстро дисковые накопители могут выполнять различные виды операций ввода-вывода. Чтобы оценить скорость выполнения операций ввода-вывода, необходимо знать некоторые сведения о дисковом накопителе. Большинство этих сведений можно найти в технических описаниях дисков, сообщаемых их производителями. В данной лекции в качестве примера будут взяты технические характеристики накопителя с емкостью 9,1 Гб и скоростью вращения 10000 об/мин. Другие технические характеристики этого типичного дискового накопителя перечислены в табл. 5.1.
Техническая характеристика | Значение | Описание |
---|---|---|
Емкость диска | 9.1 Гб | Емкость неформатированного диска |
Скорость вращения | 10000 об/мин | Скорость, с которой вращается диск |
Скорость передачи данных | 40 Мб/с | Скорость шины SCSI |
Среднее время поиска | 5,2 мс (для чтения), 6 мс (для записи) | Средняя продолжительность времени, необходимого для поиска нужной дорожки (при операциях произвольного ввода-вывода) |
Время перехода головки на соседнюю дорожку | 0,6 мс (для чтения), 0,9 мс (для записи) | Продолжительность времени, необходимого для перехода на соседнюю дорожку (при операциях последовательного ввода-вывода) |
Время поиска по всему диску | 12 мс (для чтения), 13 мс (для записи) | Продолжительность времени, необходимого для перехода от самого внутреннего сектора диска к самому внешнему сектору, или наоборот |
Средняя задержка | 2,99 мс | Средняя задержка вращения |
Средняя длительность работы до отказа | 1 000 000 часов | Средний срок службы дискового накопителя |
А теперь мы расскажем, как при помощи подобных технических характеристик вы сможете оценить производительность накопителя на жестких дисках.
Производительность накопителя на жестких дисках
Продолжительность времени, необходимого для выполнения операции ввода-вывода, зависит от следующих факторов:
- времени, необходимого для поиска нужной дорожки (чтобы головки переместились к дорожке, на которой хранятся данные);
- задержки вращения (времени, необходимого для поворота диска, чтобы данные подошли к головкам);
- времени, необходимого электронным схемам для передачи данных с дискового накопителя на его контроллер.
Поэтому время, необходимое для выполнения операции ввода-вывода представляет собой сумму длительностей исполнения описанных здесь этапов плюс время для обработки дополнительных нагрузок в драйвере устройства и в операционной системе. Помните, что итоговая длительность операций ввода-вывода зависит главным образом от того, как производятся операции ввода-вывода: последовательно или произвольно. Производительность последовательных операций ввода-вывода зависит от длительности перехода на соседнюю дорожку. Производительность операций произвольного ввода-вывода зависит от среднего времени поиска.
Последовательный ввод-вывод
При последовательном вводе-выводе происходит доступ к данным, расположенным на диске рядом с предыдущими данными. Так как переход головок к соседней дорожке выполняется гораздо быстрее, чем переход к произвольной дорожке, то при выполнении последовательного ввода-вывода можно достичь гораздо большей производительности. Чтобы вы представили себе возможную скорость выполнения последовательного ввода-вывода, рассмотрим пример.
Как мы уже упоминали, типичному дисковому накопителю для выполнения перехода головок к соседней дорожке потребуется около 0,9 мс. Прибавив это время к величине задержки вращения (2,99 мс), вы можете сделать вывод, что каждая операция ввода-вывода займет приблизительно 3,89 мс. Такая длительность теоретически позволяет выполнять 264 операции последовательного ввода-вывода в секунду, т.к. одна секунда содержит 264 интервала времени по 3,89 мс. Но на производительность последовательного ввода-вывода влияют и другие факторы, такие как ограничение пропускной способности интерфейса SCSI 40 Мб/с и компоненты операционной системы: файловая система и драйвер устройства. Эта дополнительная нагрузка определяет максимальную производительность последовательного ввода-вывода, допустимую для данного дискового накопителя, составляющую около 250 операций в секунду (это число зависит от размера передаваемых данных). Как вы узнаете в лекции 6, если ваш диск передает данные со скоростью, превышающей 85% от его производительности, то будут образовываться очереди, поэтому максимальная рекомендуемая производительность ввода-вывода составит 225 операций в секунду.
Произвольный ввод-вывод
При произвольном вводе-выводе головки дискового накопителя должны считывать данные с произвольных участков диска. Из-за этих произвольных перемещений головок происходит снижение производительности. Давайте снова вернемся к нашему примеру дискового накопителя. Пусть теперь головки затрачивают не по 0,8 мс, переходя на соседние дорожки, а перемещаются произвольным образом по всему диску. Для поиска произвольной дорожки потребуется в среднем около 6 мс, что в 7,5 раза длительней перехода к соседней дорожке. Для типичной операции произвольного ввода-вывода понадобится примерно 6 мс (в среднем) на перемещение головок к дорожке с данными и еще 2,99 мс на задержку вращения, что составит в сумме 8,99 мс, т.е. теоретически максимально может производиться 111 операций ввода-вывода в секунду (т.к. в одной секунде содержится 111 интервалов времени по 8,99 мс). Далее, мы уже говорили, что если возможности ввода-вывода для диска задействуются более чем на 85%, то образуются очереди. Поэтому максимальная рекомендуемая производительность ввода-вывода составит 94 операции в секунду. А если согласиться с эмпирическим правилом для учета нагрузки на контроллер, то следует ограничить ввод-вывод для данного дискового накопителя 85 операциями ввода-вывода в секунду.
Когда дисковый накопитель выполняет произвольный ввод-вывод, нормальная задержка (время, необходимое для выполнения одной операции ввода-вывода) составит 8,99 мс. Если обращения к диску станут производиться чаще, чем он сможет их обрабатывать, то начнут образовываться очереди и задержка вырастет (см. рис. 5.4). Как видите, чем ближе количество операций в секунду к рекомендованной максимальной производительности накопителя, тем длительней будет задержка.
Рис. 5.4. Количество операций ввода-вывода в секунду как функция задержки
На самом деле, если вы достигните 100-процентного задействования возможностей диска, то очереди возникнут обязательно, а общая производительность резко снизится. Как вы прочтете в нашей книге позднее, SQL Server, как и любая другая система управления реляционными базами данных, очень сильно зависит от задержек ввода-вывода. Если для выполнения операций ввода-вывода требуется чрезмерно много времени, то производительность SQL Server сильно снизится (деградирует) и могут возникнуть такие проблемы, как блокировка (blocking) и зависание (deadlock). Когда поток ждет исполнения операции ввода-вывода, он может удерживать блокировки. До тех пор, пока операция ввода-вывода не будет исполнена, блокировка будет сохраняться, что и является причиной данных проблем.
Способы преодоления ограниченных возможностей дисков
Как же можно преодолеть ограничения, связанные с производительностью дисковых накопителей? На самом деле, здесь нет ничего хитрого. Следуйте советам, приведенным ниже, и вы сможете создать подсистему ввода-вывода с оптимальной производительностью:
- Выделяйте отдельно операции последовательного ввода-вывода. Выделяйте отдельные дисковые накопители для тех компонент, которые по своей природе производят последовательный ввод-вывод, и тогда вы сможете воспользоваться этой их особенностью. Примером файла, доступ к которому осуществляется в последовательном порядке, является журнал транзакций. Если вы поместите на одном диске более одного файла, доступ к которому осуществляется в последовательном порядке, то операции ввода-вывода станут не последовательными (с переходом головок на соседнюю дорожку), а произвольными, т.к. дисковый накопитель будет производить поиск среди разнообразных фрагментов последовательных записей.
- Распределяйте операции произвольного ввода-вывода. Так как по своей сути операции ввода-вывода носят произвольный характер, то вы можете снизить нагрузку на подсистему ввода-вывода, добавляя дополнительные дисковые накопители. Если вы создадите систему с достаточно большим количеством дисковых накопителей для обслуживания операций произвольного ввода-вывода, то проблемы с производительностью не возникнут. В лекции 6 мы расскажем, как определить потребное количество дисков и как их следует конфигурировать.
Массивы RAID
Как вы понимаете, если просто добавлять в систему новые и новые дисковые накопители, то с нею будет очень сложно работать. Поэтому, вместо того, чтобы добавлять десятки или сотни отдельных дисковых накопителей, многие пользователи предпочитают применять массивы RAID (Redundant Array of Independent Disks, массивы независимых дисковых накопителей с избыточностью). Массивы RAID могут быть реализованы с использованием программных средств и имеющихся у вас устройств ввода-вывода, либо могут быть приобретены как аппаратные устройства RAID. В этом разделе мы познакомим вас с массивами RAID и расскажем о том, как они работают.
Как ясно из самого их названия, массивы RAID содержат в себе два или несколько дисковых накопителей, образуя тем самым массив дисковых накопителей. Операционная система воспринимает весь этот массив как один логический диск. Этот логический диск называют также дисковый том, потому что он является набором дисков, кажущихся одним диском. Для пользователей, для приложения и даже (если применяется аппаратный массив RAID) для Microsoft Windows 2000 массив RAID воспринимается как один диск. Во многих случаях, однако, этот один диск будет иметь гораздо больший объем, чем любой из дисков, имеющихся в продаже. Но благодаря массивам RAID можно создавать не только большие логические диски, но также, во многих из конфигураций RAID (уровнях RAID), обеспечивать также и отказоустойчивость логического диска. Эта отказоустойчивость позволяет диску RAID сохранять работоспособность даже при отказе одного или нескольких из отдельных дисковых накопителей, составляющих массив RAID. В следующих разделах мы покажем, как достигаются такие возможности, и расскажем о характеристиках различных уровней RAID.
Мы уже сказали, что массивы RAID могут быть реализованы программно; фактически, Windows 2000 поставляется вместе с программным обеспечением для RAID. Но в данной лекции мы в основном будем рассказывать об аппаратных реализациях RAID, потому что они обладают дополнительными функциональными возможностями. Мы расскажем об этих возможностях в следующих двух разделах и познакомим вас с функциональными возможностями и характеристиками различных уровней RAID.
Понятия, относящиеся к подсистеме ввода-вывода
Аппаратные контроллеры RAID обеспечивают не только основные функциональные возможности RAID, но и некоторые дополнительные средства. Среди этих дополнительных возможностей аппаратных реализаций RAID чаще всего встречается кэш контроллера. В этом разделе вы узнаете о кэше контроллера, кэшах дисковых накопителей и о разнице между внутренними и внешними массивами RAID. Кроме того, вы узнаете о новой технологии ввода-вывода – сетях хранения данных SAN (Storage Area Network). В данном разделе мы также рассмотрим некоторые разнообразные вопросы, имеющие отношение к контроллерам RAID, к дисковым накопителям и к пропускной способности устройств ввода-вывода.
Способы преодоления ограниченных возможностей дисков
Чтобы улучшить производительность ввода-вывода, многие производители поставляют контроллеры, имеющие кэши. Кэш контроллера – это оперативная память, установленная в контроллере дисковых накопителей. Этот кэш применяется для выполнения двух задач:
- Кэширование записи. Поскольку контроллер имеет свою собственную память, то контроллер может сообщать операционной системе (а следовательно, и SQL Server), что операция ввода-вывода завершилась, как только данные будут записаны в кэш, что значительно повышает производительность записи.
- Кэширование упреждающего чтения. Другой способ применения контроллера кэша – это чтение данных в дополнение к запрошенным данным. Это делается в предположении, что вскоре может поступить запрос на эти дополнительные данные. Если это случится, то время отклика резко сократится.
Как вы узнаете позднее в данной лекции, производительность записи может оказаться критически важной, особенно, когда вы применяете массивы RAID уровня 5. В большинстве случаев контроллер кэша является большим достоинством. Но есть два момента, о которых мы должны вас предостеречь:
- Не пользуйтесь кэшированием записи, если вы не имеете батарейную поддержку бесперебойного электропитания. Большинство контроллеров с кэшированием имеет батарею или предусматривает возможность применения батареи. Благодаря этой батарее данные в кэше не пропадут при отказе электропитания. Без батареи данные из кэша пропадут, что может повлечь повреждение базы данных.
- В редких случаях, когда массив RAID работает на грани своей мощности, кэширование записи может привести к ухудшению производительности чтения. Это происходит из-за того, что приоритет отдается контроллеру записи, для того, чтобы освободить кэш.
Кэши дисковых накопителей
Большинство дисковых накопителей тоже содержит кэш с оперативной памятью. Этот кэш имеет меньший объем, чем кэш контроллера. Он может хранить одновременно немного запросов, благодаря чему дисковый накопитель может самостоятельно выполнить лифтовую сортировку (elevator sorting). Но так как этот кэш совсем маленький (обычно – только несколько килобайт), то он не может применяться для значительного упреждающего чтения или для кэширования значительных объемов данных. Многие поставщики контроллеров RAID и контроллеров SCSI не разрешают изменять состояние этого кэша, но, однако, некоторые производители массивов RAID все же разрешают пользователям включать либо выключать этот кэш.
Внутренние и внешние массивы RAID
Имеется два основных типа систем RAID: внутренние и внешние. Эти термины описывают, где находятся алгоритмы работы массивов RAID. В большинстве систем алгоритмы работы RAID находятся на контроллере, который установлен в стойке корпуса компьютера. Такие системы RAID называются внутренними. А у внешней RAID-системы алгоритмы работы находятся в запоминающем устройстве или в запоминающих устройствах, в которых размещены дисковые накопители. Это различие показано на рис. 5-5. Каждый тип систем имеет свои особенности и характеристики. Однако различия между внутренними и внешними системами RAID не будут играть значительную роль в материале данной лекции. Мы рассказали об этих двух разновидностях контроллеров RAID только для полноты изложения. В следующем разделе вы узнаете о различных уровнях RAID. Эти уровни значительно важнее в классификации контроллеров RAID.
Рис. 5.5. Внутренние и внешние системы RAID
Сети хранения данных (SAN)
Одной из новейших технологий, появившихся на рынке, является SAN (storage area network, сеть хранения данных). Основой SAN является большая внешняя система RAID, которой могут пользоваться совместно несколько компьютеров. Из-за этого в названии технологии появилось слово network – сеть. Благодаря SAN вы можете консолидировать (собрать воедино) все запоминающие устройства и снизить расходы, осуществляя работу с системой и поддержку системы в одном месте.
Технология SAN имеет довольно простую концепцию. Внешняя система RAID соединяет адаптер главной шины (HBA, host bus adapter) непосредственно с подсистемой RAID (см. рис. 5.6). В сети SAN происходит соединение нескольких адаптеров главной шины через коммутатор, по крайней мере, с одной внешней системой RAID. В такой конфигурации все компьютеры, входящие в сеть SAN, могут осуществлять доступ к подсистеме RAID.
Рис. 5.6. Система SAN
Когда мы писали нашу книгу, несколько компьютеров не могли пользоваться совместно одним логическим диском в составе SAN. Программное обеспечение SAN производит сегментацию дисковой памяти, сопоставляя каждому из компьютеров свой логический диск. Однако у SAN имеются следующие достоинства:
- Кластеризация. Кластеризация в SAN очень проста, так как SAN уже является внешним RAID-контроллером.
- Консолидация запоминающих устройств. Благодаря наличию централизованного хранилища данных обслуживание запоминающих устройств становится проще.
- Более рациональное использование дисковой памяти. Вместо того чтобы резервировать дополнительные дисковые накопители на каждом из компьютеров, вы можете продуктивно пользоваться этой дисковой памятью со многих компьютеров.
- Отказоустойчивость. Все компьютеры, имеющие доступ к SAN, могут пользоваться подключенными к сети резервными дисковыми накопителями, которые немедленно вступают в строй вместо отказавших.
Пропускная способность контроллера и шины
Вы должны оценить не только ограничения, связанные с дисковым накопителем, но и ограничения пропускной способности шины ввода-вывода (обычно это SCSI или Fibre Channel). Так как шины работают с заданной тактовой частотой и имеют определенное количество разрядов данных (32 бита, 64 бита и т.д.), то максимальная пропускная способность ограничена некоторым фиксированным значением. Ваши потребности могут достичь до пропускных способностей контроллера, шины PCI или шины ввода-вывода контроллера или превысить их. Вы можете избежать этого, распределив контроллеры по нескольким шинам PCI вашего компьютера. Большинство компьютеров сейчас выпускается с тремя и более шинами PCI.
Подсистемы ввода-вывода высшего класса
Компании, которым необходимо обеспечивать доступность в течение 99,99% времени и более в сочетании с максимальной производительностью, часто обращаются к поставщикам вроде фирмы EMC. Такие поставщики предлагают сложные подсистемы ввода-вывода, содержащие кэши объемами в несколько Гб и множественные каналы для передачи данных от компьютеров к дисковым накопителям. Множественные каналы обеспечивают избыточность. Если какая-либо компонента системы откажет (например, откажет канал ввода-вывода, контроллер или кэш), то подсистема ввода-вывода не прекратит свое функционирование. При тщательном планировании состава таких подсистем ввода-вывода, они могут обеспечить высочайший уровень производительности и надежности.
Лифтовая сортировка
Лифтовая сортировка (elevator sorting) – это метод для обеспечения большей эффективности операций произвольного ввода-вывода. Когда диск получает произвольные запросы ввода-вывода, головки должны перемещаться произвольным образом по дорожкам диска, внутрь и наружу. Из-за этих операций произвольного ввода-вывода возникают задержки, мы уже рассказывали вам об этом. Многие из RAID-контроллеров поддерживают лифтовую сортировку, благодаря которой поиск произвольных дорожек становится более эффективным. Когда на контроллере, поддерживающем лифтовую сортировку, собрались в очереди несколько запросов ввода-вывода, то операции ввода-вывода могут быть отсортированы таким образом, чтобы избавиться от лишних перемещений головок. Движения головок, оптимизированные при помощи лифтовой сортировки, напоминают движения лифта, забирающего попутных пассажиров при перемещении между этажами в нужном направлении.
Представьте, что было бы, если бы лифт обслуживал пассажиров строго в том порядке, в котором они нажимали бы на кнопки. Тогда лифт проезжал бы мимо нужных этажей, вместо того, чтобы остановиться и дать людям войти или выйти. Настоящий лифт работает более эффективно, потому что он делает остановки на нужных этажах. Алгоритмы лифтовой сортировки работают примерно так же. Если в очереди имеется более одной операции ввода-вывода, то контроллер найдет наиболее эффективный путь движения головок, который очистит очередь (рис. 5.7).
Рис. 5.7. Лифтовая сортировка
Как видите, благодаря лифтовой сортировке накопитель может более эффективно производить переход головок к нужным дорожкам. Общее время поиска дорожек сокращается (хотя время поиска дорожки для отдельных операций иногда может и увеличиться). Однако для работы лифтовой сортировки вы должны иметь на том контроллере или на дисковом накопителе, для которых она будет производиться, несколько или даже много операций ввода-вывода, ожидающих своего исполнения. Такая ситуация часто возникает при чрезмерной нагрузке на подсистему ввода-вывода. Диск, работающий оптимальным образом, во многих случаях имеет лишь одну или две операции ввода-вывода, ожидающие своего исполнения, что делает сомнительной полезность лифтовой сортировки.
Надежность дисков
Дисковые накопители являются одними из немногих компонент компьютера, имеющими подвижные детали. Диск вращается с большой скоростью и работает нагретым до высокой температуры. Среди деталей накопителя имеются несколько двигателей и подшипников, которые рано или поздно, но обязательно износятся. Среди технических характеристик дискового накопителя имеется средняя продолжительность наработки на отказ (MTBF, mean time between failures). Данная техническая характеристика показывает, сколько в среднем прослужит этот накопитель. Однако это число показывает лишь среднее время. При одинаковой средней продолжительности наработки на отказ срок службы у разных дисков будет неодинаковым. Типичные современные диски могут иметь среднюю продолжительности наработки на отказ равную миллиону часов, т.е. 114 годам. Это долгий срок, но некоторые диски с таким показателем MTBF прослужат гораздо дольше, а некоторые – сломаются очень быстро. Дело в том, что диски содержат подвижные детали, и поэтому они подвержены износу и могут ломаться.
Обзор типовых уровней RAID
Главной особенностью массивов RAID является то, что логический диск формируется из двух или нескольких физических дисковых накопителей и воспринимается Windows 2000 (и Performance Monitor) как один физический дисковый накопитель. Логический дисковый накопитель может содержать многие сотни Гб данных, хотя изготовлять дисковые накопители емкостью в 100 Гб не удается (пока что!).
Большинство уровней RAID, о которых мы вам расскажем, применяют расслоение данных (data striping), при помощи которого данные с двух или нескольких дисков объединяются в один большой логический RAID-диск. Это делается так: первый фрагмент данных берется с первого диска, второй кусок данных – со второго диска, и так далее. Эти фрагменты данных называются слои (stripes) или куски (chunks). Размер слоев данных задается контроллером. Некоторые контроллеры разрешают вам конфигурировать размеры слоев, а некоторые применяют слои фиксированного размера.
Название "слой" ("кусок") применяется как к фрагментам данных на каждом из отдельных дисков, так и к набору слоев (кусков) для всей совокупности дисков (рис. 5.8).
Таким образом, термин слой может применяться, когда речь идет о данных на каком-либо одном из дисковых накопителей (в этом случае говорят слой диска). Так говорят и о наборе связанных данных с разных дисков (а в этом случае говорят слой RAID ). Помните об этом, когда будете читать данную лекцию и другие места, где рассказывается о массивах RAID.
Рис. 5.8. Слои RAID
Уровень RAID – это обозначение типа конфигурации массива RAID, поэтому он определяет характеристики массива RAID, не описываемые алгоритмами, содержащимися во внутренних или внешних логических компонентах. Одной из наиболее важных характеристик, определяемых уровнем RAID, является отказоустойчивость. Отказоустойчивость – это способность системы RAID продолжать работать даже после отказов дисковых накопителей, входящих в ее состав. Отказоустойчивость является основной целью, ради которой создаются контроллеры RAID. Так как ваши данные представляют ценность, то вам следует защищать их от возможных отказов дисков. В данном разделе мы изучим наиболее широко применяемые уровни RAID: как они работают, какая у них отказоустойчивость и насколько быстро происходит ввод-вывод данных. Помимо этих уровней RAID, есть и другие, но они применяются редко и мы не будем их рассматривать. Мы расскажем лишь о наиболее широко применяемых уровнях RAID.
RAID 0
RAID 0 являются самым "фундаментальным" из уровней RAID, он обеспечивает только расслоение дисков. Куски данных создаются на каждом из дисковых накопителей, а размер кусков задается контроллером. Для составления большого логического диска применяется метод кругового распределения кусков данных по отдельным дискам массива RAID 0 (рис. 5.9).
Рис. 5.8. RAID 0
Хотя RAID 0 и причисляется к массивам RAID, однако данный уровень RAID не обеспечивает избыточности (redundancy, вспомните расшифровку аббревиатуры RAID: Redundant Array of Independent Disks ). Раз избыточности нет, то и отказоустойчивость тоже отсутствует. Если в массиве RAID 0 откажет хотя бы один диск, то все данные будут потеряны. Отказ одного из дисков будет сравним с уничтожением каждого четвертого слова в книге. Если произойдет такая потеря данных, то массив RAID станет бесполезным.
Рекомендации по применению RAID 0
Как правило, нельзя рекомендовать применять RAID 0 для хранения файлов данных SQL Server. Так как данные в базе данных очень важны для вашего бизнеса, то их потеря может погубить вашу фирму. Массивы RAID 0 не защищают от отказов дисков, поэтому вам не следует применять их ни для каких критически важных компонент, таких как операционная система, журнал транзакций или файлы базы данных.
RAID 1
RAID 1 являются "фундаментальным" уровнем RAID, обеспечивающим отказоустойчивость. В алгоритме RAID 1, называющемся также "зеркальное отражение", предусмотрено изготовление дублирующей копии вашего диска с данными. Дублирующая копия содержит ту же самую информацию, что имеется и на первоначальном диске (рис. 5.10). При отказе диска в строй вступит диск-дубль, и вы не потеряете данные. Так как на каждом диске (и на первоначальном, и на зеркале) хранятся все данные, то расслоение данных отсутствует. В RAID 1 второй диск применяется для дублирования первого, поэтому общий объем логического тома RAID 1 совпадает с объемом одного дискового накопителя. RAID 1 является дорогостоящим решением: при удвоении количества применяемых дисков вы взамен не получаете никакого увеличения объема дисковой памяти, но зато он обеспечивает высокий уровень отказоустойчивости.
Рис. 5.10. RAID 1
Для томов RAID 1 операция ввода-вывода не считается завершенной, пока контроллер не запишет данные на оба дисковых накопителя. Пока этого не произойдет, нет и безопасности для данных при отказе одного из дисков. После того, как данные будут записаны на оба дисковых накопителя, восстановление данных станет возможным при отказе любого из дисков. Поэтому, если запись данных на один из дисков займет времени больше, чем запись этих же данных на другой диск, то общая задержка будет равна максимальной из двух задержек для разных дисков.
Запись данных на оба диска также снижает производительность логического дискового накопителя. При подсчете количества операций ввода-вывода, производимых на всех дисках массива, нужно умножать количество записей на 2. Чтение данных производится только с одного из дисков. Скорости работы дисков могут отличаться, потому что головки одного из дисков могут оказаться в другом положении, чем головки другого диска, и из-за этого время поиска нужной дорожки может оказаться более длительным. Положение головок может быть разным из-за функции уровня RAID 1, называющейся параллельный поиск (split seek).
Благодаря параллельному поиску, диски, входящие в состав массива RAID 1, могут производить чтение дисков независимо друг от друга. Параллельный поиск возможен потому, что чтение может производиться каждый раз лишь только на одном из дисков. Большинство из производителей контроллеров поддерживают параллельный поиск. Применение параллельного поиска повышает производительность, потому что обработка ввода-вывода распределяется по двум дискам, вместо одного диска. Но, из-за того, что головки движутся независимо, а запись должна быть выполнена обеими головками, общая задержка записи равна большей из двух задержек для каждого из отдельных дисков.
Рекомендации по применению RAID 1
RAID 1 обеспечивает высокую степень отказоустойчивости и высокую производительность. RAID 1 является прекрасным решением для случаев, когда все данные способны уместиться на одном диске. Ниже даны некоторые рекомендации по применению RAID 1:
- Применяйте RAID 1 для диска, на котором содержится ваша операционная система, потому что ее воссоздание занимает очень много времени. RAID 1 хорошо подходит для этой задачи еще и потому, что операционная система обычно может уместиться на одном диске.
- Применяйте RAID 1 для журнала транзакций. Обычно журнал транзакций SQL Server может уместиться на одном диске. Кроме того, для журнала транзакций применяется в основном последовательная запись. Чтение из журнала транзакций производиться только из-за операций отката. Поэтому, если вы выделите для журнала транзакций отдельный том RAID 1, то вы достигните высокой производительности.
- Для томов RAID 1 следует применять кэширование записи. Так как запись для RAID 1 не завершена до тех пор, пока не будет выполнена запись на обоих дисках, то производительность записи может быть повышена при помощи кэша записи. Но если вы применяете кэш записи, обязательно защищайте данные в нем при помощи бесперебойного электропитания.
Из дальнейшего материала в данной лекции вы узнаете, что в случаях, когда для хранения данных требуется более одного диска, можно применять и другие решения, обеспечивающие отказоустойчивость. RAID 1 является прекрасным решением для случаев, когда требуется отказоустойчивость и данные способны уместиться на одном диске.
RAID 5
RAID 5 являются отказоустойчивым уровнем RAID, в котором для защиты данных применяется контроль по четности. Каждый слой данных (stripe) RAID создает информацию для контроля по четности, хранимую на одном из дисков в составе слоя. В сочетании с другими дисками в составе слоя RAID, информация для контроля по четности может быть использована для воссоздания данных с любого из дисков слоя. Поэтому массивы RAID 5 устойчивы к отказу одного из дисковых накопителей, входящего в состав массива. Информация для контроля по четности распределяется поочередно по всем дискам массива RAID (рис. 5.11).
Рис. 5.11. RAID 5
Достоинством RAID 5 является то, что дисковая память, доступная при применении этого уровня RAID, составляет (n-1)*(объем одного диска) где n равно количеству дисков в массиве. Так, массив RAID 5, составленный из 10 дисков, будет иметь объем, как у 9 дисков, что делает его экономичным и в то же время отказоустойчивым решением.
К сожалению, массивы RAID 5 имеют недостатки, связанные с производительностью. Обработка информации для контроля по четности приводит к дополнительной нагрузке на компьютер. При записи данных в массив RAID 5 требуется чтение как слоя данных с целевого диска, так и слоя с информацией для контроля по четности, затем потребуется перерасчет информации контроля по четности, а затем должна быть произведена запись обоих слоев данных. Таким образом, как видите, запись в массив RAID 5 производит фактически четыре физических операции ввода-вывода.
Контроль по четности в массивах RAID 5
В массивах RAID 5 для данных каждого из слоев на каждом из дисковых накопителей создается бит контроля по четности. Бит контроля по четности является дополнительным элементом данных, благодаря которому, имея биты из набора данных, по которому он был создан, можно узнать другие биты из набора данных. Бит контроля по четности создается так: все остальные биты суммируются, а затем определяется, какое значение он должен иметь, чтобы получилось четное (или нечетное число). Бит контроля по четности, в сочетании с остальными битами, может применяться, чтобы восстановить значение потерянного бита.
Давайте разберем работу контроля по четности на примере. В нашем примере мы будем считать, что система RAID 5 содержит пять дисковых накопителей.
Каждый дисковый накопитель, по существу, составлен из некоторого количества битов, от начала до конца слоя диска. Бит четности создается в зависимости от значений битов с каждого из дисковых накопителей.
В нашем примере будем считать, что контроль по четности должен обеспечить четность суммы битов, т.е. сумма всех битов должна давать результат 0 (имеется в виду сложение по модулю 2, т.е. результат сложения битов должен быть четным. – Прим. пер.). Если первый бит первого диска равен 0, первый бит второго диска равен 1, первый бит третьего диска равен 1, первый бит четвертого диска равен 1, то бит контроля по четности для этих битов должен быть равен 1, чтобы дополнить эти биты до четного числа (см. табл. 5.2).
диск 1: бит 1 | диск 2: бит 1 | диск 3: бит 1 | диск 4: бит 1 | диск 5: бит контроля по четности | Сумма битов |
---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 4(четная) |
Контроль по четности следует понимать как действия, применяемые к отдельным битам. Хотя слой диска содержит много битов, контроль по четности для отдельных битов позволит восстановить все данные. Биты контроля по четности, перечисленные в табл. 5.2, создаются на самом деле по отдельным битам, составляющим слои данных. Несмотря на то, что дисковые накопители разбиваются на куски данных (слои), с возможными размерами по 64 Кб и более, но контроль по четности, как мы вам показали, может быть произведен на уровне отдельных битов. На самом деле контроль по четности вычисляется при помощи алгоритмов более сложных, чем тот, который мы сейчас описали.
Давайте теперь предположим, что диск 3 сломался. В этом случае бит контроля по четности вместе с битами других дисков может быть использован для восстановления отсутствующего бита диска 3, потому что их сумма должна дополнять неизвестный бит диска 3 до четного числа.
Создание данных для контроля по четности
Как мы уже объяснили в данном разделе, данные контроля по четности, применяемые в массивах RAID 5, составляются из битов, дополняющих до четного числа сумму одинаково отстоящих от начала битов всех дисковых накопителей. Но вам, конечно,понятно, что было бы непрактичным, чтобы контроллер массива считывал бы все данные со всех дисковых накопителей при каждой операции ввода-вывода. Это было бы неэффективно и медленно.
При создании массива RAID 5 происходит первоначальное обнуление данных и создание битов контроля по четности. В результате создается набор дисковых накопителей без данных, но с полным набором битов контроля по четности.
С этого момента, всякий раз при записи данных на дисковый накопитель, должно производиться чтение данных с диска данных и с диска контроля по четности. Новые данные должны сравниваться со старыми данными, и если какой-либо бит данных поменялся, то данные контроля по четности для этого бита тоже должны быть изменены. Эта проверка производится при помощи логической операции "исключающее ИЛИ" ( XOR, exclusive OR ).Поэтому требуется чтение данных только с диска данных и диска контроля по четности, а не со всех дисков массива. Как только описанная операция вычисления изменений данных контроля по четности будет завершена, запись должна быть произведена на оба диска, т.к. операция с данными контроля по четности затрагивает весь слой данных. Таким образом, для выполнения каждой записи в том RAID 5 производятся четыре физических операции ввода-вывода: два чтения (одно – чтение с диска данных, другое – чтение с диска контроля по четности) и две записи (сами данные и данные контроля по четности). Но в массивах RAID 5 данные контроля по четности равномерно распределены по всем дисковым накопителям, поэтому и нагрузка на накопители будет распределена равномерно.
Рекомендации по применению RAID 5
Так как запись в массив RAID 5 требует дополнительных операций ввода-вывода, то этот уровень RAID можно рекомендовать для дисковых томов, используемых преимущественно для чтения. Поскольку данные контроля по четности равномерно распределены по многим дискам массива, то для операций чтения используются все диски. С учетом этих особенностей можно дать следующие рекомендации:
- Применяйте RAID 5 для томов, предназначенных только для чтения. Любой том дисков, операции записи на котором превышают 10% от объема ввода-вывода, не следует реализовывать как RAID 5.
- Применяйте кэширование записи для томов RAID 5. Так как запись для RAID 5 не завершена до тех пор, пока не будут выполнены два чтения и две записи, то при использовании кэша записи время отклика для записи может быть сокращено. (Используя кэш записи, обязательно применяйте батарею для бесперебойного электропитания.) Но надо отметить, что если поток записываемых данных превысит производительность записи дисков, то кэширование записи вам не поможет. В любом случае, вы не должны превышать пропускную способность дисков.
Как видите, RAID 5 является экономичным решением, но вы расплачиваетесь за это производительностью. А насколько велика может быть эта цена, вы узнаете из дальнейшего материала данной лекции.
RAID 10
RAID 10 является комбинацией RAID 0 и RAID 1. В RAID 10 применяется зеркальное дублирование слоев данных дисков. Для каждого диска создается дубль, но каждый диск содержит только часть всех данных (рис. 5.12). Этот уровень RAID обеспечивает отказоустойчивость, как у RAID 1, а удобства и производительность, как у RAID 0.
Рис. 5.12. RAID 10
Как и у RAID 1, каждая операция записи RAID 10 потребует двух физических операций ввода-вывода – по одной операции записи на каждый диск зеркальной пары. Поэтому, при подсчете количества операций ввода-вывода в расчете на один диск, нужно умножать количество записей на 2. Как и для массивов RAID 1, для RAID 10 операции записи не считаются завершенными, пока не будут выполнены обе записи, это может увеличить длительность задержки записи. Но так же, как и для RAID 1, большинство контроллеров поддерживает параллельный поиск для RAID 10.
RAID 10 обеспечивает высокую степень отказоустойчивости. На самом деле, массив может остаться работоспособным даже при отказе более чем одного диска. Конечно, отказ дисков, входящих в зеркальную пару, приведет к потере данных. Если диски, входящие в разные зеркальные пары смонтированы по разным стойкам для оборудования, то отказ даже всей стойки не приведет к потере данных.
Рекомендации по применению RAID 10
RAID 10 обеспечивает высокую производительность и высокую степень отказоустойчивости. Уровень RAID 10 следует применять, когда нужна работа с большими томами, для которых операции записи составляют более 10% от общего объема операций ввода-вывода. Можно дать следующие рекомендации по применению RAID 10:
- Применяйте RAID 10 всякий раз, когда операции записи составляют более 10% от общего объема операций ввода-вывода для массива RAID.
- Применяйте RAID 10, когда производительность является критически важной. Так как в RAID 10 применяется расслоение данных, то вы будете иметь превосходную производительность.
- Для томов RAID 10 следует применять кэширование записи. Так как запись для RAID 10 не завершена до тех пор, пока не будут выполнены обе операции записи, то благодаря применению кэша время записи может быть сокращено. Кэширование записи безопасно только когда вы применяете батарею для бесперебойного электропитания для защиты кэша.
Уровень RAID 10 является наилучшим отказоустойчивым решением, он обеспечивает хорошую защиту данных и высокую производительность, однако затраты на него тоже большие. Вам придется приобрести диски в двойном количестве, по сравнению с RAID 0. Если же ваш том служит главным образом для чтения данных, то можно применять RAID 5.
Сравнение производительности уровней RAID
Для правильного конфигурирования и настройки вашей системы RAID, вам нужно понимать различия в производительности различных уровней RAID, о которых мы рассказали в предыдущем разделе. Если вы будете понимать, как работает система RAID и какие действия она осуществляет в различных ситуациях, вы лучше сможете настраивать свою подсистему ввода-вывода. В данном разделе мы внимательно сравним различные показатели производительности, с которыми вы познакомились в предыдущем разделе. В наших примерах мы будем считать, что отдельный дисковый накопитель может выполнять 85 операций произвольного ввода-вывода в секунду.
Производительность чтения
Производительность чтения не сильно зависит от выбранного вами уровня RAID. Когда операция чтения применяется к массиву RAID, то каждый диск вносит свой вклад в производительность по чтению. Так как для высокой производительности основным препятствием являются операции произвольного ввода-вывода, то мы сейчас рассмотрим эту тему. Вы можете максимально повысить производительность последовательного ввода-вывода, выделив их на отдельный том. Давайте посмотрим, как происходит произвольный ввод-вывод для различных уровней RAID:
- В томах RAID 0 данные распределены равномерно по всем дискам массива. Поэтому и операции произвольного ввода-вывода должны быть равномерно распределены по всем дискам системы. Тогда, с учетом нашего предположения, что отдельный дисковый накопитель может выполнять 85 операций произвольного ввода-вывода в секунду, массив RAID 0 из десяти дисков сможет выполнять 850 операций в секунду.
- Тома RAID 1 поддерживают параллельный поиск, при котором операции чтения производятся обоими дисковыми накопителями. Поэтому RAID 1 может выполнять в два раза больше операций чтения, чем одиночный диск, т.е. 170 операций ввода-вывода в секунду. Если же операции чтения будут производиться чаще, то производительность снизится.
- В системах RAID 5 данные распределяются равномерно по всем дисковым накопителям, входящим в состав массива. Даже несмотря на то, что один дисковый накопитель в каждом слое данных служит для хранения данных контроля по четности, из-за произвольных по своей природе операций ввода-вывода, используются обычно все дисковые накопители. Поэтому, как и для массива RAID 0, темп (производительность) чтения массива RAID 5 составит n*85 операций в секунду, где n – количество дисковых накопителей в массиве. Если операции чтения будут производиться в большем темпе, то производительность SQL Server снизится.
- Массивы RAID 0, как и массивы RAID 1, поддерживают параллельный поиск. Поэтому для них максимальная производительность чтения составит n*85 операций в секунду, где n – количество дисковых накопителей. Вы могли бы инициировать запуск операций ввода-вывода с более высоким темпом, но в этом темпе исполняться они не смогут.
Как видите, подсчитать производительность чтения массивов RAID совсем просто. Добавляя достаточное количество дисковых накопителей, так чтобы ваши потребности в производительности ввода-вывода соответствовали этим ограничениям, вы сможете оптимизировать производительность вашей системы.
Производительность записи
Производительность записи очень сильно зависит от выбранного вами уровня RAID. И снова, поскольку основные трудности возникают из-за операций произвольного ввода-вывода, то мы их сейчас и рассмотрим. Вы можете максимально повысить производительность последовательного ввода-вывода, выделив их на отдельный том или тома. Давайте посмотрим, как происходит запись произвольных данных для различных уровней RAID:
- Уровень RAID 0 лучше всего подходит для обработки операций записи без ущерба для производительности, но вы расплачиваетесь за это отказоустойчивостью. Так как в RAID 0 не применяется зеркальное дублирование или контроль по четности, то производительность RAID 0 равна просто сумме производительностей отдельных дисковых накопителей. Поэтому массив RAID 0, состоящий из десяти дисков, сможет выполнять 850 операций в секунду (с учетом нашего предположения о производительности отдельного накопителя).
- Тома RAID 1 должны выполнять зеркальное дублирование всех данных, записываемых в массив, из-за чего одна запись в массив RAID 1 порождает две операции ввода-вывода на дисковые накопители. Поэтому массив RAID 1 имеет темп записи такой же, как и у одиночного дискового накопителя, т.е. 85 операций ввода-вывода в секунду.
- Операции записи в массивы RAID 5 происходят еще медленней. Запись в RAID 5 порождает четыре физических операции ввода-вывода на диски. Поэтому производительность записи в массив RAID 5 в четыре раза меньше производительности записи отдельных дисковых накопителей в составе массива.
- Массивы RAID 10 имеют такие же показатели производительности записи, как и массивы RAID 1. Каждая запись в массив RAID 10 порождает две физических операции записи. Поэтому производительность записи в массив RAID 10 в два раза меньше производительности записи отдельных дисковых накопителей в составе массива.
Как видите, вычислить производительность записи массивов RAID довольно сложно. Добавляя достаточное количество дисковых накопителей, так чтобы ваши потребности в производительности ввода-вывода соответствовали этим ограничениям, вы сможете оптимизировать производительность вашей системы. В следующем разделе вы узнаете, как можно подсчитать количество операций ввода-вывода на один диск в различных обстоятельствах.
Подсчет количества операций ввода-вывода для дисков
Чтобы определить объем нагрузки, приходящейся на отдельные дисковые накопители системы, вам придется выполнить некоторые расчеты. Если вы пользуетесь аппаратным контроллером RAID, то количество операций ввода-вывода в секунду, показываемое монитором производительности Performance Monitor означает количество операций ввода-вывода, выполняемых массивом как единым целым. Вы не увидите сведений о дополнительных операциях ввода-вывода, генерируемых контроллером и служащих для обеспечения отказоустойчивости. Фактически, Windows 2000 не замечает их выполнения, но вы должны знать о них, чтобы правильно определить количество дисковых накопителей, необходимое для обеспечения оптимальной производительности.
RAID 0
В массивах RAID 0 темп операций ввода-вывода на один диск вычисляется как сумма всех операций чтения и записи для массива, деленная на количество дисков в массиве. Для RAID 0 нужна лишь одна простая и понятная формула:
количество операций на диск = (чтения + записи) / количество дисков
RAID 1
Для массивов RAID 1 вычисления будут несколько более сложными. Так как количество записей удваивается, то число операций ввода-вывода на один диск в секунду равно сумме количества операций чтения и удвоенного количества операций записи для массива, деленной на количество дисков в массиве (для RAID 0 – два). Нужно применять такую формулу:
количество операций на диск = (чтения + (2 * записи)) / 2
Запись в массивы RAID 1 происходит медленней, но они обеспечивают лучшую отказоустойчивость.
RAID 5
Массивы RAID 5 обеспечивают отказоустойчивость, но при записи у них получается очень большая нагрузка на диски. Операции чтения в массивах RAID 5 распределены по многим дисковым накопителям массива, но для записи приходится выполнять четыре физических операции ввода-вывода. Чтобы подсчитать количество операций ввода-вывода, приходящихся на один дисковый накопитель, надо сложить количество операций чтения и учетверенное количество операций записи, а затем разделить на количество дисков в массиве. Поэтому формула для RAID 5 будет такой:
количество операций на диск = (чтения + (4 * записи)) / количество дисков
RAID 10
Скорость записи в массивы RAID 10 такая же, как в RAID 1, но зато RAID 10 обеспечивает высокую степень отказоустойчивости. Расчет для RAID 10 аналогичен расчету для RAID 1. Поскольку количество записей удваивается, то число операций ввода-вывода на один диск равно сумме количества операций чтения и удвоенного количества операций записи для массива, деленной на количество дисков в массиве. Формула для RAID 10 будет такой:
количество операций на диск = (чтения + (2 * записи)) / количество дисков
Сравнение различных уровней RAID
Давайте сравним разные уровни RAID. Тогда вам станет легче понять, какой уровень RAID лучше подходит для вашей системы. Когда вы сравниваете производительность работы разных уровней RAID, одним из наиболее важных факторов, оказывающих влияние на нее, является соотношение чтения и записи. При выполнении операций чтения производительность различных уровней RAID отличается не сильно, различия относятся в основном к производительности операций записи. Также нужно учитывать, нужна ли вашей системе отказоустойчивость. И наконец, вам следует оценить соотношение стоимости системы и ее емкости. Характеристики для различных уровней RAID перечисленны в табл. 5.3.
Уровень RAID | Производительность | Отказоустойчивость | Оценка стоимости |
---|---|---|---|
RAID 0 | Наилучшая | Без отказоустойчивости | Экономичный |
RAID 1 | Хорошая | Хорошая | Дорогой |
RAID 5 | Быстрая для чтения, медленная для записи | Нормальная | Самый экономичный из уровней, обеспечивающих отказоустойчивость |
RAID 10 | Хорошая | Хорошая | Дорогой |
Как видите, наилучший вариант зависит от ваших потребностей. Чтобы понять различие между производительностью RAID 5 и RAID 10 при разных соотношениях чтения и записи, посмотрите табл. 5.4, в которой показаны данные для массивов RAID 5 и RAID 10, выполняющих 500 операций ввода-вывода в секунду на 10 дисковых накопителях при разных соотношениях чтения и записи.
Соотношение Чтения/Записи | Операции ввода-вывода RAID 5 (Чтения + (4 * Записи)) / Кол-во дисков | Операции ввода-вывода RAID 10 (Чтения + (2 * Записи)) / Кол-во дисков |
---|---|---|
100% чтений 0% записей | (500+0)/10 50 операций ввода-вывода на диск | (500+0)/10 50 операций ввода-вывода на диск |
90% чтений 10% записей | (450+200)/10 65 операций ввода-вывода на диск | (450+100)/10 55 операций ввода-вывода на диск |
75% чтений 25% записей | (375+500)/10 87.5 операций ввода-вывода на диск | (375+250)/10 62.5 операций ввода-вывода на диск |
50% чтений 50% записей | (250+1000)/10 125 операций ввода-вывода на диск | (250+500)/10 75 операций ввода-вывода на диск |
0% чтений 100% записей | (0+2000)/10 200 операций ввода-вывода на диск | (0+1000)/10 100 операций ввода-вывода на диск |
Как видите, когда соотношение чтения к записи составляет 90%:10%, нагрузка на диски для RAID 5 и RAID 10 почти не отличается. Но когда запись составляет более высокий процент в операциях ввода-вывода, нагрузка на диски массивов RAID 5 становится гораздо больше.
Задержки ввода-вывода и SQL Server
SQL Server очень чувствительна к задержкам ввода-вывода, потому что транзакции обрабатываются алгоритмом SQL Server одновременно. При обычной работе база данных SQL Server взаимодействует с десятками и сотнями приложений. Чтобы поддерживать эту одновременную работу, SQL Server имеет сложную систему блокировок (замков) строк, страниц, экстентов и таблиц, с которой вы познакомитесь в нашей книге. При блокировке каких-либо данных или ресурсов SQL Server, другие процессы должны ждать, пока эти данные или ресурсы не будут разблокированы.
Если длительность выполнения операций ввода-вывода слишком велика, то эти ресурсы будут блокированы недопустимо долго, еще сильнее замедляя работу системы. Кроме того, это повышает вероятность тупиковых ситуаций (взаимоблокировок). Чем дольше выполняются операции ввода-вывода, тем дольше длятся и блокировки и тем серьезнее становятся эти проблемы. И в результате отдельные задержки могут сложиться, вызвать "эффект снежного кома" и испортить работу системы.
Кроме того, обработка запросов станет очень медленной. Например, если на вашей системе выполняется сканирование больших таблиц, то для выполнения таких задач часто требуется чтение сотен, тысяч и даже миллионов строк в базах данных. Для миллиона операций ввода-вывода даже небольшие изменения производительности становятся очень важными. Выполнение одного миллиона операций по 10 мс займет около 2,8 часа. А если ваша подсистема ввода-вывода оказалась перегружена и каждая операция ввода-вывода требует 40 мс, то выполнение такого же запроса займет уже более 11 часов.
Как видите, производительность SQL Server может очень сильно пострадать из-за плохого начального проектирования или плохого конфигурирования подсистемы ввода-вывода. Если вы спроектируете свою подсистему ввода-вывода так, что она будет вписываться в возможности отдельных компонент, то производительность вашей системы будет оптимальной.
Планирование размещения дисков SQL Server
Из материала данной лекции ясно, что вы должны правильно спланировать свою систему ввода-вывода, чтобы не допускать ее перегрузки. Перегрузка подсистемы ввода-вывода повлечет увеличение задержек ввода-вывода и падение производительности SQL Server. В данном разделе вы изучите, как построить систему SQL Server, способную работать в рамках ограничений вашей подсистемы. Сначала вы научитесь определять требования вашей системы к вводу-выводу. Затем вы изучите планирование системы, а последним этапом будет само создание вашей системы.
Определяем требования к вводу-выводу
Определение требований к вводу-выводу системы, существующей еще только в виде концепции, может оказаться хоть и сложным, но вполне возможным делом. Однако если у вас нет конкретных данных, на основе которых можно определить требования к вводу-выводу, то вы должны смочь собрать достаточно данных, чтобы можно было сделать обоснованное предположение. В любой ситуации, создание подсистемы ввода-вывода, неспособной к росту, будет ошибкой. Всегда предусматривайте резервы для необходимого роста мощности и производительности, рано или поздно они вам понадобятся. Вы должны спроектировать систему так, чтобы она удовлетворяла бы минимальным требованиям к объему дисковой памяти, необходимой для хранения данных, и к необходимому для вас уровню производительности. В следующем разделе вы узнаете, как определить какое количество дисков потребуется для удовлетворения этим условиям.
Объем дисковой памяти
Определить, сколько места на дисках потребуется для ваших данных, достаточно просто. Объем необходимого места равен сумме следующих величин:
- Дисковой памяти, необходимой для данных.
- Дисковой памяти, необходимой для индексов.
- Дисковой памяти, необходимой для временных данных.
- Дисковой памяти, необходимой для журнала транзакций.
Дисковая память, отводимая для данных, должна иметь достаточно места для хранения данных, которые будут добавлены в вашу базу данных. Рост базы данных в значительной степени определяется вашим бизнесом и вашими клиентами. Чтобы оценить рост вашей системы, можно проводить регулярные проверки существующей базы данных и подсчитывать, как изменился объем дисковой памяти, занимаемой базой данных. Темп роста базы данных должен измеряться несколько месяцев, чтобы можно было определить его закономерности. Рост базы данных может оказаться таким, что удивит вас.
Для новой системы, не имеющей истории, при оценке роста, среди прочих критериев, вы можете воспользоваться количеством заказов на продукцию, умноженным на размер строки. Взяв эти показатели для нескольких периодов времени (например, месяцев или лет), вы получите грубую оценку о скорости роста файлов с данными. Это не даст вам информации о росте индексов. Объем дисковой памяти, необходимой для индексов в расчете на одну строку данных, зависит от конструкции индексов и от объема данных. Для сложного индекса требуется больше места в расчете на одну строку данных, чем для простого индекса. И решение о том, сколько времени система должна существовать в условиях роста – два года, пять лет или дольше, – принимаете вы. Вот так производится оценка, с каким объемом дисковой памяти должна быть сконфигурирована ваша подсистема ввода-вывода.
Определившись с объемом данных, объемом индексов, объемом временной базы данных и с темпом роста, вы можете определить, сколько места на дисках вам потребуется. Затем вы должны учесть место, необходимое для обеспечения отказоустойчивости в массивах RAID. Помните, что в массивах RAID 1 и RAID 10 (с зеркальным дублированием данных) для обеспечения отказоустойчивости тратится половина физического места на дисках. В массивах RAID 5 для обеспечения отказоустойчивости тратится один дисковый накопитель, входящий в состав массива. Также помните, что объем дисков, указываемый изготовителями, обозначает емкость неотформатированного диска. Неотформатированный дисковый накопитель, маркированный, как имеющий емкость 9,1 Гб, после форматирования будет вмещать на самом деле 8,6 Гб.
И когда вы подсчитаете объем дисковой памяти, необходимой в данный момент, и объем дисковой памяти, необходимой для будущего роста, тогда вы сможете перейти к следующему этапу: оценке производительности. Для правильного конфигурирования подсистемы ввода-вывода нужно оценивать и объем необходимой дисковой памяти, и требования к производительности.
Производительность
Недостаточно просто сконфигурировать систему так, чтобы она отвечала требованиям к объему необходимой дисковой памяти. Как вы уже знаете из материала данной лекции, конфигурация подсистемы ввода-вывода может серьезно ухудшить или значительно улучшить производительность вашей системы. Однако оценка требований к производительности совсем не так проста, как оценка требований к объему дисковой памяти.
Наилучшим способом оценки производительности является изучение аналогичных приложений или систем. Эти данные могут стать отправной точкой для оценки будущих требований. Дополнительную информацию об этом вы получите в лекции 6. Предположим, что вы нашли похожую систему. Тогда для определения необходимого количества дисков вы можете воспользоваться данными, собранными при исследовании этой системы, и информацией, которую вы знаете из данной лекции. Не забудьте учесть влияние уровня RAID, применяемого в той подсистеме ввода-вывода. Следующим этапом станет планирование размещения дисков SQL Server, а после этого можно будет осуществить реализацию вашего решения.
Планирование размещения дисков
При планировании размещения дисков принимаются решения о том, как данные должны быть размещены на дисках, а затем пишутся сценарии SQL, которые создадут базу данных. Достоинством создания базы данных при помощи сценариев SQL, а не при помощи SQL Server Enterprise Manager является то, что вы можете пользоваться ими многократно и вносить в них изменения.
В сценариях должно быть отражено количество логических томов, которое имеет ваша система, а также количество физических дисков в этих томах. Важно сбалансировать базу данных так, чтобы все дисковые накопители обрабатывали приблизительно равные количества операций ввода-вывода в секунду. Производительность несбалансированной системы будет ограничена возможностями самого медленного из томов. Вы должны позаботиться, чтобы журнал транзакций и файлы данных были распределены по дисковым накопителям так, чтобы обеспечивалась оптимальная производительность.
Планирование размещения журнала транзакций
Планирование размещения журнала транзакций очень простое. Часто наилучшим решением является использование для журнала транзакций только одного файла данных. Если вам придется добавлять к своей базе данных дополнительные файлы журналов транзакций, не забудьте, что их следует размещать на томах RAID 1 или RAID 10. Также не забудьте, что файлы журналов транзакций должны храниться отдельно от данных и от других журналов транзакций.
Планирование размещения файлов данных
Самый простой способ сконфигурировать вашу подсистему ввода-вывода для файлов данных – это сконфигурировать каждый том как состоящий из одинакового числа дисковых накопителей одинакового размера. Во многих случаях вам не потребуется разбивать подсистему ввода-вывода на несколько томов. На самом деле, вы можете быть абсолютно довольны, имея один логический том с одним контроллером. Однако для охвата нескольких контроллеров не следует применять средства расслоения Windows 2000, потому что это вызывает очень большую нагрузку.
Если вы применяете несколько контроллеров, то нужно упростить конфигурацию, применяя одинаковое расслоение и одинаковое количество дисков на каждом из контроллеров. Если вы не можете использовать одинаковое количество дисков на каждом из контроллеров, то для правильного заполнения базы данных вы можете воспользоваться пропорциональным заполнением.
Например, если у вас имеется два тома, один – из 20 дисковых накопителей, а другой – из 10 накопителей, то нужно создать группу файлов из двух файлов данных. (О применении файлов и групп файлов см. лекцию 9.) Первый файл данных нужно поместить на 20-дисковый том, и он должен быть в два раза больше файла данных, размещаемого на 10-дисковый томе. При загрузке данных, SQL Server будет загружать в первый файл в два раза больше данных, чем во второй файл. Благодаря этому интенсивность ввода-вывода будет примерно одинаковой для всех дисков.
Реализация конфигурации
Как только вы напишите сценарии SQL, создающие базу данных, останется только запустить их и посмотреть на результат. Если вы допустите ошибку и создастся не такая база данных, какую вы хотели, то исправлять это нужно именно сейчас, а не когда будут загружены данные, а пользователи получат доступ к системе. При использовании сценариев SQL вы можете изменять их и запускать по мере необходимости снова и снова. Ниже приведен пример сценария, использующего много файлов в составе группы файлов для распространения базы данных по нескольким контроллерам:
-- -- Сценарий SQL для создания базы данных, состоящей из нескольких файлов -- d:, e: и f: - для данных, e: и f: имеют в два раза больше дисковых накопителей, -- чем имеется у d:, поэтому размер базы данных, распределенной для них в -- два раза больше, чем для d:. l: используется для журнала. -- CREATE DATABASE demo ON PRIMARY ( NAME = demo1, FILENAME = 'd:\data\demo_dat1.mdf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = demo2, FILENAME = 'e:\data\demo_dat2.ndf', SIZE = 200MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = demo3, FILENAME = 'f:\data\demo_dat3.ndf', SIZE = 200MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON ( NAME = demolog1, FILENAME = 'l:\data\demo_log1.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) GO
Информация в данной лекции, особенно в данном разделе, поможет вам создать оптимальную подсистему ввода-вывода для вашей системы SQL Server. В следующем разделе даны несколько советов и рекомендаций, которые помогут вам создавать и исправлять подсистемы ввода-вывода.
Советы и рекомендации для подсистемы ввода-вывода
В данном разделе даны советы и рекомендации о том, как лучше всего организовать применение контроллеров RAID в вашей системе. Некоторые из этих советов и рекомендаций вы уже встретили при чтении данной лекции, а некоторые – новые. Будет замечательно, если некоторые из них помогут вам лучше конфигурировать и использовать свой массив RAID. Следуя этим советам и тщательно следя за состоянием системы, вы сможете избежать проблем с производительностью.
- Размещайте журнал транзакций SQL Server на отдельном томе RAID 0 или RAID 1. Операции ввода-вывода для журнала транзакций почти на 100% являются последовательными (с переходом головок на соседнюю дорожку диска), и почти 100% из них являются операциями записи. Операции произвольного ввода-вывода для журнала транзакций бывают лишь при выполнении отката. Информация из журнала транзакций должна считываться, только когда данные для отката недоступны из кэша.
- Сконфигурируйте достаточное количество дисковых накопителей, чтобы на каждый диск приходилось менее 85 операций ввода-вывода. Вы можете просто добавлять в массив дополнительные дисковые накопители, пока их не будет достаточно. Если операции ввода-вывода носят произвольный характер, как это обычно и бывает, то их следует распределять по всем дисковым накопителям массива.
- Конфигурируйте тома данных как массивы RAID 5, если операции записи составляют менее 10% от общего объема ввода-вывода, и как массивы RAID 10, если более 10%.
- Регулярно измеряйте количество операций ввода-вывода, приходящихся на один диск в секунду. Если этот показатель приближается к пределу возможностей диска, то добавляйте дополнительные дисковые накопители.
- Распределяйте контроллеры по доступным слотам PCI вашего компьютера. Если нет особой необходимости, не ставьте несколько контроллеров на одну шину PCI.
- Применяйте Windows 2000 RAID только на компьютерах, на которых имеется избыток ресурсов центрального процессора. Программная реализация RAID вызывает очень большую нагрузку, что может замедлить работу компьютера с недостаточно мощным центральным процессором.
Заключение
Как вы узнали из данной лекции, подсистема ввода-вывода является чрезвычайно важной компонентой вашей системы управления базы данных. Теперь вы знаете, как работают дисковые накопители и каковы их ограничения. Зная пределы возможностей дисковых накопителей, вы сможете сконфигурировать свою систему так, чтобы она функционировала в рамках этих ограничений. Зная характеристики уровней RAID, вы сможете сконфигурировать систему так, чтобы воспользоваться достоинствами того или иного уровня RAID. При проектировании своей системы вы должны тщательно спланировать состав и настройку подсистемы ввода-вывода. Настройка ввода-вывода связана с мощностью. Если ваши компоненты будут работать в пределах своих возможностей, то система сможет достичь оптимальной производительности.
Лекция 6. Планирование мощности системы
Планирование мощности (capacity planning) включает в себя расчет ресурсов, необходимых для вашей системы, и принятие решений о том, как можно максимально повысить производительность этих ресурсов. К планированию мощности также относятся задачи планирования роста вашей сети, благодаря которому будущие добавления аппаратуры или программного обеспечения доставят вам меньше потерь и расходов.
Виды планирования мощности
Планирование мощности имеет две формы: предварительное планирование мощности (pre-capacity planning) и последующее планирование мощности (post-capacity planning). В задачи предварительного планирования мощности, известного также под названием планирование состава системы (sizing), входит прогнозирование требований к аппаратуре, при соблюдении которых система сможет исполнять необходимую работу в заданные сроки (в соответствии с соглашением об уровне обслуживания (SLA, service level agreement)). Соглашения об уровне обслуживания гарантируют заданные длительности времени отклика для тех или иных функций системы, т.е. длительность исполнения каких-либо действий или транзакций.
Кроме того, нужно предусмотреть некоторые резервы мощности (резервы вычислительной мощности центральных процессоров, резервы свободного места на дисках и резервы оперативной памяти), чтобы время отклика находилось в заданных пределах, как при установившемся режиме работы, так и при пиковых нагрузках. При решении задачи предварительного планирования у вас еще нет реальных данных о производительности, т.к. система еще не функционирует. Вам придется пользоваться какой-либо другой, доступной вам информацией. Результаты будут зависеть от точности этой информации. Например, информацию о размещении и первоначальном размере базы данных могут предоставить сотрудники отдела базы данных, которые разрабатывают систему. Сотрудники отдела приложения, которые разрабатывают приложение и различные запросы, связанные с приложением, могут дать информацию о том, как эти запросы будут использовать ресурсы системы. Сотрудники отдела управления дадут информацию о количестве пользователей, работающих одновременно и о количестве запросов, которые они будут передавать в систему. Вся эта информация содержит сведения о вычислительной нагрузке (и вы сможете определить потребное количество центральных процессоров), о размере базы данных (вы сможете определить, сколько вам нужно дисковых накопителей) и т. д.
Последующее планирование мощности, известное также под названием упреждающий анализ (predictive analysis) – это комплексные и регулярные исследования загруженности аппаратных и программных ресурсов уже установленной и работающей системы. Благодаря последующему планированию мощности обеспечивается адекватная подготовка к росту рабочей нагрузки в соответствии с ресурсами системы. Эти исследования должны давать информацию, в первую очередь, для администратора базы данных. Администратор базы данных использует эту информацию, чтобы определить, какие изменения требуется внести в систему, чтобы система соответствовала уровню производительности, заданному в соглашении об уровне обслуживания. В данной лекции мы рассмотрим оба этих вида планирования мощности – предварительное и последующее, изучим их общие черты и различия.
При типичном сценарии последующего планирования мощности вы выполняете анализ по старым данным производительности, сохраненным в базе данных. Благодаря этому анализу вы можете экстраполировать тенденции нормального роста загруженности центрального процессора (процента времени в течение периода наблюдений, когда центральный процессор был занят), использования дисков, оперативной памяти и сети. Вы также сможете спрогнозировать неожиданные увеличения нагрузки на центральный процессор, диски и оперативную память, вызванные добавлением в систему новых пользователей. Эти исследования могут быть очень тщательными и могут включать в себя составление профилей деятельности отдельных пользователей, благодаря чему вы сможете экстраполировать рост нагрузки на ресурсы системы при появлении новых пользователей.
Исследования, выполняемые при последующем планировании мощности, помимо упреждающего анализа дают чрезвычайно ценную информацию – они отвечают на вопросы "что, если...", касающиеся нагрузки на компьютер. Получив знания о том, как разные категории пользователей расходуют ресурсы системы, вы можете точно предсказывать нагрузку на ресурсы системы, зная категорию добавляемых пользователей (например, как повлияет появление новых сотрудников в отделе кредиторских задолженностей). Благодаря такому упреждающему анализу системный администратор получает достаточно времени, чтобы приобрести нужное оборудование, еще до того, как в системе появятся новые пользователи, избегая тем самым снижения производительности или удлинения времени отклика системы.
Благодаря исследованиям при последующем планировании мощности можно также получить информацию, нужную для настройки системы. Информация для настройки системы, например, о вводе-выводе обработки запросов, поступающих на массивы дисковых накопителей, получается на основе анализа исторических данных о производительности и может применяться для принятия решений об изменениях конфигурации системы, необходимых для повышения производительности. Пользуясь этой информацией, вы можете выявить "узкие места", влияющие на производительность, например, слишком большую активность на одном из массивов дисковых накопителей (по сравнению с другими массивами). Так, добавление новых пользователей вызывает увеличение объема доступа к таблицам базы данных. Количество таблиц, к которым обращаются пользователи, и частота этих обращений могут отслеживаться и регистрироваться. Эта информация будет полезна при решении вопроса, может ли перемещение этих таблиц в другое место предотвратить появление "узкого места" в дисковой подсистеме.
Исторический обзор планирования мощности
Во времена многопользовательских ЭВМ концепции планирования мощности и производительности не были осознаны и не получили развития. В начале 1970-х годов предварительное планирование мощности заключалось лишь в поиске потребителей, применявших приложения, которые "работали бы так же", как и нужное приложение. Находить таких потребителей было трудно, а сравнивать фирмы и организации и как у них работают приложения – еще труднее.
В середине 1970-х годов потребители и поставщики приложений разработали методики для анализа, предусматривавшие запуск тестовых задач, при помощи которых можно было оценить оптимальный первоначальный состав аппаратных компонент ЭВМ. Они создавали приложения, похожие на применяемые потребителями и запускали их на похожем оборудовании, собирая статистические данные о его работе. Затем эти статистические данные использовались для подбора состава ЭВМ, наиболее хорошо удовлетворяющего потребностям потребителей. Этот процесс тоже позволял ответить на вопросы "что, если...", при помощи запуска сценариев с тестовыми задачами, позволяющими определить, какой состав системы необходим при увеличении в системе числа пользователей, процессов приложений или при увеличении объема данных. Недостатком этого процесса была его дороговизна. Первые тестовые задачи, разработанные первоначально для моделирования типовой работы потребителей, стали применяться в основном поставщиками компьютерного оборудования в качестве маркетинговых средств при продажах ЭВМ и для сравнения производительности конкурирующего оборудования.
Во время этого периода аналитики создавали методики для предсказания использования ресурсов существующих систем. Внешне этот процесс казался менее интересным, но он оказался таким же сложным, так как не существовало ни методик тестирования, ни инструментальных средств для сбора нужных данных. Ученые-компьютерщики (такие как д-р Джеффри Бузен [Jeffrey Buzen] – родоначальник теории планирования мощности) еще только разрабатывали теории об использовании ресурсов компьютеров и исследовали вопрос, как можно выполнять эти вычисления.
С 1980-х годов первоначальные тестовые модели развились в тесты стандартных нагрузок, такие как тесты ST1, TP1 и Debit/Credit, но усилия в то время были направлены на выявление аппаратуры с наивысшей производительностью для рекламных целей, а не на разработку стандартных моделей нагрузки от приложений, которые можно было бы использовать при предварительном планировании и поддержке систем. Потребители еще не могли пользоваться этими тестами для сравнения аппаратуры систем, потому что они работали в различных ситуациях. В ответ на эти нужды потребителей возник консорциум представителей компьютерной промышленности, "Совет по производительности обработки транзакций" (Transactional Processing Performance Council). Этот Совет задал стандарты обработки транзакций для более чем 45 производителей оборудования и программного обеспечения. Эти тесты часто могут показать относительные возможности оборудования и программного обеспечения для баз данных; к сожалению, они не могут помочь при предварительном планировании нагрузки от работы приложений.
В это самое время подоспела архитектура "клиент/сервер" и технология реляционных баз данных, и потребность в предварительной оценке размера системы и в планировании мощности возросла. Большинство из современных приложений сейчас пишутся на основе архитектуры "клиент/сервер". Серверы обычно используют устройства для централизованного хранения данных, а пользовательский интерфейс обычно исполняется локально на настольных компьютерах пользователей или на удаленном веб-сайте. Эта экономная стратегия использования дорогих мощностей для обработки данных на сервере имеет еще одно достоинство: пользователи работают в уже привычных для них графических интерфейсах. Так как серверы, на которых работают приложения доступа к базам данных, используются очень интенсивно, то именно им уделяется основное внимание в большинстве проектов предварительного планирования мощности и исследований последующего планирования мощности.
В настоящее время для предварительного планирования мощности серверов по-прежнему чаще всего применяется метод моделирования работы приложений при помощи тестов, а наиболее точным методом прогноза производительности системы в будущем является сбор исторических данных о производительности и применение методов планирования мощности. Хотя этот процесс дорогой и отнимает много времени, но при моделировании реальной работы сервера потребители могут добиться весьма высокой точности. Однако, поскольку большие проекты могут потребовать многомиллионных инвестиций со стороны потребителя или со стороны поставщика, то доступ к системам для проведения таких исследований могут позволить себе, как правило, только самые крупные потребители. Понятно, что нужен метод глубокого, точного предварительного и последующего планирования мощности для мелких и средних систем. Для них, чтобы с 90-процентной точностью выполнить предварительное и последующее планирование мощности, пригодятся некоторые простые расчеты и общие знания об использовании системы.
Обработка транзакций
В данном разделе мы изучим, как выполнять анализ тенденций использования сервером базы данных ресурсов процессоров, памяти и дисков. Это нужно, чтобы правильно выбирать систему для нужного приложения. Сервер базы данных выполняет только функции работы с базой данных: при своей работе этот сервер выполняет только транзакции. При исполнении оператора SELECT или UPDATE сервер базы данных интерпретирует данные операторы как последовательности операторов чтения и записи. На самом деле, любая транзакция может быть разбита на чтения и записи в базу данных. На этом атомарном уровне сервер базы данных обрабатывает операции ввода-вывода. Нужно выбрать систему, способную обращаться с транзакциями различных видов и объемов, и с порождаемыми ими операциями ввода-вывода. Основными типами транзакций являются системы оперативной обработки транзакций (OLTP, on-line transaction processing) и системы поддержки принятия решений (DSS, decision support system).
Транзакции систем оперативной обработки транзакций
Транзакции систем оперативной обработки транзакций (OLTP) являются компонентами рабочей нагрузки, исполнение которых ожидается за короткие промежутки времени, так как они взаимодействуют с базой данных в режиме реального времени или в режиме "он-лайн". Другими словами, эти транзакции будут непрерывно обновлять базу данных, основываясь на наиболее свежей доступной информации, чтобы следующий пользователь мог бы быть уверен в том, что эта информация является наиболее свежей. Например, в системе ввода заказов вся информация, относящаяся к складскому учету, хранится в таблицах, распределенных по дисковой системе, и база данных может работать в режиме "он-лайн". Доступ к информации в базе данных получает каждый пользователь. Таблицы базы данных, такие как Таблица_изделий или Таблица_складских_запасов, содержат наиболее свежую информацию о разновидностях и об имеющемся количестве продаваемых товаров. Таким образом, когда поступает заказ на некоторое количество какого-либо товара, вы можете произвести доступ к таблицам базы данных, чтобы выяснить, имеется ли этот товар и сколько его осталось на складе, чтобы не продать отсутствующий товар.
Типичный сценарий предварительного планирования мощности для подобных систем обработки транзакций для сбора специальной информации предусматривает опрос людей. Вы должны провести беседы с проектировщиком базы данных, с разработчиком приложения и с представителем управленческого персонала. Эти люди могут дать начальные и корректирующие сведения о предполагаемом объеме обрабатываемых транзакций и о времени суток, когда предполагается обработка этих транзакций (например, 25 тысяч транзакций должны быть обработаны в течение 8-часового рабочего дня), сведения о количестве одновременно работающих пользователей, о времени пиковой нагрузки (времени суток, когда нагрузка на систему максимальна). Возможно, эти опросы окажутся самой важной частью процесса предварительного планирования мощности.
Банкоматы
Давайте в качестве примера рассмотрим систему с банкоматами. Допустим, национальный банк нанял вас спроектировать систему банкоматов для своего чикагского отделения. В результате опросов вы могли узнать, что пиковая нагрузка на сеть банкоматов приходится на время с 11 часов утра до 2 часов дня – в то самое время, когда большинство людей идут обедать. Зная эту информацию, вы сможете спроектировать свою систему так, чтобы она могла выдержать период пиковой нагрузки.
Транзакции систем поддержки принятия решений
Другим типом систем обработки транзакций являются системы поддержки принятия решений (DSS). Транзакции систем поддержки принятия решений возвращают большие объемы информации и требуют для своей обработки гораздо больше времени, чем транзакции OLTP. Для обработки транзакции DSS могут понадобиться часы или даже дни. В качестве примера системы поддержки принятия решений можно привести архив складских запасов, запись в который производится редко, только при его обновлениях. Такие системы обычно снабжают информацией сотрудников-управленцев, чтобы они могли принимать важные решения, например, о развитии бизнеса или о необходимом уровне складских запасов. В качестве другого примера можно привести используемую военно-воздушными силами США систему поддержки принятия решений, информирующую руководящий состав ВВС о текущем состоянии, расположении и вооружении реактивных истребителей, бомбардировщиков и людей.
Как мы уже говорили, транзакции DSS обычно не завершаются за то же время, что и транзакции OLTP. Транзакции DSS обрабатываются гораздо дольше, потому что они извлекают гораздо больший объем данных. Так как транзакции OLTP извлекают необходимые данные по уникальному ключу (например, по номеру потребителя), то они начинают и завершают запрос с информацией, относящейся только к этому ключу. У транзакций DSS запрос не начинается с уникального ключа, наоборот, он начинает работу от начала таблицы базы данных и продолжает работать, пока не просмотрит все данные в базе данных. Транзакции DSS также включают в себя соединения таблиц, связываясь для получения дополнительной информации с другими таблицами.
Как знают системные аналитики, в системах этого типа обычно достигается 100-процентное использование центрального процессора и других системных ресурсов, поэтому вопрос состоит не в загрузке системы работой, а в сроках обработки запросов системой. Есть такое практическое правило при проектировании систем DSS: распределяйте, насколько это возможно, систему по имеющемуся оборудованию. Другими словами, вы должны не просто иметь количество дисков, достаточное для того, чтобы база данных помещалась бы на них, а спланировать размещение базы данных по многим томам, чтобы рассеять по ним активность ввода-вывода. Насчет оперативной памяти в этом отношении никакие подобные меры не понадобятся, потому что кэширование к ней почти не применяется. (Для обработки транзакций DSS потребуются полные сканирования таблиц, т.е. просмотр таблиц будет начинаться от их начал и продолжаться пока они не будут полностью обработаны.)
Квартальные продажи
Предположим, что вы составляете квартальный отчет фирмы о продажах. Вам необходимо собрать информацию о продажах товаров в течение этого квартала во всех регионах, в которых осуществлялись продажи. Для получения этих данных нужно сперва соединиться с началом таблицы Регион чтобы получить доступ к первой таблице Покупатель После извлечения имени первого покупателя, будет установлена связь (link) на таблицу Заказы покупателей, чтобы узнать, какие товары были заказаны за нужный период времени. Этот поиск продолжается для второго имени покупателя, затем для третьего, и так далее. После того как все данные для покупателей из этого региона будут просмотрены, надо будет осуществить доступ к таблице Покупатель следующего региона и продолжить этот процесс. Для выполнения этой обработки обычно требуется много времени.
Принципы планирования мощности
Если вы не можете определить, когда у системы происходит период пиковой нагрузки, предварительное планирование мощности основывается на оценке активности транзакций для установившегося режима работы.
Если вы знаете максимальное количество транзакций, которые будут выполняться в течение рабочего дня и знаете длительность рабочего дня, то вы сможете подсчитать среднее количество транзакций за единицу времени. Однако, так как вы не знаете истинного темпа, в котором будут поступать транзакции, то предварительное планирование мощности системы надо выполнять с "встроенным" резервом мощности. Та часть мощностей системы, которая оставлена как резерв на периоды повышенной рабочей нагрузки, называется резервная мощность.
Последующее планирование мощности для системы ввода заказов должно включать в себя непрерывное слежение за главными счетчиками производительности, чтобы регистрировать, что система делала в прошлом и что она делает в настоящее время. Эта информация обычно хранится в базе данных и применяется для общих отчетов о производительности, об использовании мощностей и об имеющейся резервной мощности. Прогнозирование использования ресурсов компьютера можно выполнить исходя из наглядных графиков, электронных таблиц и отчетов об активности транзакций, создаваемых приложением, способным работать с базами данных, таким как, например, Microsoft Excel.
Использование мощности центрального процессора
Еще одна причина, по которой надо создавать и поддерживать резерв мощности компьютера, связана с теорией "загиба кривой" (knee of the curve theory). Если объяснять просто, эта теория предсказывает, что загруженность системы работой непосредственно влияет на образование очередей, а так как длина очередей непосредственно связана со временем отклика (фактически, длина очередей является частью формулы для расчета времени отклика), то загруженность системы оказывает непосредственное влияние на время отклика. Загибом кривой называется точка, начиная от которой такие показатели, как время отклика или длительность очередей, переходят от линейного роста к экспоненциальному или асимптотическому (с уходом в бесконечность при приближении нагрузки к некоторому конечному значению) росту.
Использование мощности и время отклика на примере супермаркета
Предположим, вы пришли в супермаркет в 3 часа утра, набрали нужные вам товары и везете их к кассе. В это раннее время очереди в кассу нет никакой вообще, поэтому использование мощности кассира составляет 0% и длина очереди (количество людей перед вами) тоже нулевая. Ваше время отклика будет равно времени обслуживания. Это значит, что время обслуживания (в данном случае – время, необходимое на выполнение транзакций продажи выбранных вами товаров и оплату чека) и составит все время, необходимое для выполнения данной задачи.
Предположим ту же ситуацию, но в 5 часов вечера, время наибольшей нагрузки на супермаркет. Теперь, когда вы подойдете к кассе, перед вами будут стоять в очереди восемь человек (т.е. длина очереди равна 8). Теперь ваше время отклика будет равно сумме времен отклика каждого из восьми людей перед вами (которые могут варьировать в зависимости от количества покупок, от оплаты банковским чеком или наличными и т.д.) плюс ваше собственное время обслуживания. Использование мощности кассира в 5 часов вечера тоже гораздо больше, чем в 3 часа утра, непосредственным следствием чего и является рост очереди и, следовательно, общее время вашего ожидания (время отклика).
Сравнение линейного и экспоненциального роста
Обычно мы стремимся добиться, чтобы система работала в линейном режиме, т.е., чтобы рост очередей был бы линейным. Из рисунка 6-1 видно, что линейный рост является равномерным ростом очередей в зависимости от роста загруженности системы. Согласно одному практическому правилу, рост очередей остается линейным, пока центральный процессор используется не более чем на 75%.
Впрочем, иногда при установившемся режиме центральный процессор может быть загружен и более чем на 75%. У такой работы имеются некоторые недостатки – в частности, из-за такой высокой загруженности рост длины очередей может стать экспоненциальным. Экспоненциальный рост – это рост в геометрической прогрессии (см. рис. 6.2).
Рис. 6.1. Линейная зависимость от загруженности центрального процессора
Рис. 6.2. Экспоненциальный рост в зависимости от загруженности центрального процессора
Обратите внимание, что при загруженности центрального процессора, превышающей 75%, кривая зависимости длины очередей переходит от линейного роста к экспоненциальному (т.е. кривая превращается почти в вертикальную линию).
Время отклика
График на рис. 6.3 показывает, как использование мощностей центрального процессора влияет на время отклика. Обратите внимание на то, как похожи графики времени отклика и длины очереди. Наличие на обоих графиках точек загиба, после которых происходит резкое увеличение времени отклика, показывает, что никогда не следует применять установившийся режим с загруженностью центрального процессора более 75%. Это не значит, что процессор никогда не будет работать с загруженностью более 75%, но чем дольше это будет происходить, тем больше негативных последствий вызовет (в отношении длины очередей и длительности отклика).
Рис. 6.3. Зависимость времени отклика от загруженности центрального процессора
Недопущение выхода за точку загиба кривой (в нашем примере – 75% мощности процессора) является одним из наиболее важных принципов предварительного планирования мощности, и его нужно соблюдать при определении количества центральных процессоров, нужных для вашей системы. Например, допустим, при предварительном планировании мощности системы, вы оценили, что потребность в ресурсе процессора составит 180% от мощности процессора. Вы можете мучиться из-за очень плохой производительности, а можете запустить два процессора с 90% загруженностью их мощности (на 15% выше точки загиба кривой). Но еще лучше было бы запустить три процессора, загрузив их на 60% мощности, тогда их загруженность будет на 15% ниже точки загиба кривой.
Этот же принцип применяется и к другим элементам системы, например, к дискам. У графиков для дисков точка загиба расположена не так, как у графиков для процессоров, она находится где-то при 85% загруженности их мощности. Эта пороговая величина (85%) относится и к вместимости, и к производительности ввода-вывода дисковых накопителей. Например, 9 Гб диски не должны содержать более 7,65 Гб данных, хранящихся на нем одновременно. Это ограничение на объем хранимых данных может послужить как резерв для роста, но оно более важно для сокращения времени отклика, потому что время поиска для дисков, заполненных полностью, становится больше, увеличивая тем самым суммарное время отклика. В соответствии с этим же правилом, если дисковый накопитель имеет производительность обмена данными 70 операций ввода-вывода в секунду, то его не следует применять в условиях, когда темп ввода-вывода постоянно превышает 60 операций ввода-вывода в секунду (при установившемся режиме работы). Следуя этим правилам, вы сможете минимизировать суммарное время отклика и получить наибольшую производительность своей системы, так как ваши процессоры и диски используются не с полной загруженностью. Кроме того, ваша система сохранит резервы мощности, которые пригодятся при работе в периоды пиковых нагрузок.
Обращения к отсутствующим страницам виртуальной памяти
Для процессора и дисков надо не допускать превышения их загруженности выше точки загиба, это важный принцип предварительного планирования мощности. А что можно сказать о памяти? Для предварительного планирования памяти нужно рассмотреть обращения к отсутствующим страницам виртуальной памяти (page faulting). Обращения к отсутствующим страницам – это нормальное явление при обычном функционировании системы, оно применяется для доступа к данным на диске. Если системе потребуется что-нибудь из памяти (страница с кодом программы или с данными) и будет иметься нужная страница памяти, то произойдет логическое событие ввода-вывода, означающее, что код или данные считываются из памяти, и транзакция, которой понадобился этот программный код или данные, будет обработана.
А что произойдет, если нужного кода или страницы с данными не окажется в памяти? В этом случае придется выполнить физический ввод-вывод и прочитать нужную страницу с диска. Эта задача выполняется при помощи обращения к отсутствующей странице. Система, если в ее рабочем наборе оперативной памяти не найдется нужная страница с кодом программы или с данными, выдаст прерывание обращения к отсутствующей странице (page fault interrupt). Обработка обращения к отсутствующей странице прикажет другой части системы доставить программный код или данные с физического диска. Другими словами, если нужная вашей системе страница с кодом или данными отсутствует в памяти, то система выполнит обращение к отсутствующей странице, которое прикажет другой части системы выполнить физическую операцию ввода-вывода и доставить нужную страницу с диска. Обращение к отсутствующей странице не повлечет доставку нужной страницы с диска, если эта страница находится в списке резерва (standby list) и, следовательно, уже находится в оперативной памяти, или если она находится в пользовании у другого процесса, с которым она может совместно использоваться (разделяться).
Существует два типа ввода-вывода: пользовательский и системный. Пользовательский физический ввод-вывод происходит, когда пользовательская транзакция просит прочитать данные, которые нашлись в памяти. Происходит простая передача данных с диска в память. Такая передача данных обычно выполняется какой-либо программой для управления потоком данных (data flow manager), дополненной функциональными возможностями контроллера дисков. Системный физический ввод-вывод происходит, когда система запрашивает страницу с программным кодом, нужным для выполняемого ею процесса, а этой страницы нет в памяти. Тогда система выдает прерывание обращения к отсутствующей странице, препятствующее продолжению работы до тех пор, пока с диска не будет доставлена нужная страница. После доставки этой страницы обработка будет продолжена. Обе эти разновидности физического ввода-вывода удлиняют время отклика, потому что время, необходимое на доставку данных из оперативной памяти, занимает микросекунды (миллионные доли секунды), а физический ввод-вывод занимает миллисекунды (тысячные доли секунды). Так как обращения к отсутствующим страницам вызывают физический ввод-вывод, который увеличивает длительность времени отклика, то при минимизации обращений к отсутствующим страницам будет достигаться лучшая производительность системы.
В вашей системе могут возникать три типа обращений к отсутствующим страницам:
Обращения операционной системы к отсутствующим страницам. Если система исполняет программный код операционной системы и следующий адрес из этого кода отсутствует в памяти, то система выдаст прерывание обращения операционной системы к отсутствующей странице, чтобы доставить с диска программный код для адреса. При обращении к отсутствующему адресу, программный код доставляется с диска в память, для чего потребуется выполнить одну физическую операцию ввода-вывода.
Обращения приложений к отсутствующим страницам. Если система исполняет любой другой программный код и следующая страница с этим кодом отсутствует в памяти, то система выдаст прерывание обращения операционной системы к отсутствующей странице, чтобы доставить с диска следующую страницу с программным кодом. При таких обращениях к отсутствующим страницам, происходит передача данных с диска в память, для чего потребуется выполнить одну физическую операцию ввода-вывода.
Страничный обмен. При внесении изменений в страницу данных (в результате чего она становится "недействительной" (dirty page, "черновой" страницей)), производится двухэтапный обмен страниц (page fault swap), при котором система не только доставляет новые данные с диска, но и записывает измененные данные из памяти на диск. Для выполнения этого двухэтапного обращения к отсутствующей странице потребуется две физических операции ввода-вывода, но это гарантирует сохранение всех измененных данных. Если обмен страниц будет происходить слишком часто, то он может стать единственным наиболее значительным фактором, ухудшающим длительность времени отклика. Помните, что при обмене страниц происходит передача данных целиком всей страницы, даже если на самом деле нужно передать лишь несколько байтов. Обмены страниц, вызванные обращениями к отсутствующим страницам, требуют больше времени, чем просто обращения к отсутствующим страницам, потому что для них требуется по два физических ввода-вывода. Поэтому вы в своей системе должны стараться минимизировать количество обменов из-за обращений к отсутствующим страницам.
Когда вы для новой системы оцениваете ее минимальную потребность в оперативной памяти, всегда пытайтесь предугадать общий объем памяти, необходимой для обработки рабочей нагрузки, для чего следует обратиться к спецификациям с требованиями к памяти всех процессов, которые будут работать на вашей системе (включая операционную систему и программы управления базой данных). И не забывайте про обращения к отсутствующим страницам. Для работы с памятью системы нужно собирать информацию о происходящих обращениях к отсутствующим страницам и хранить эту информацию в качестве составной части базы данных о производительности. Чтобы определить, когда понадобится добавить в систему дополнительную память, следует применить упреждающий анализ. На случай пиковых нагрузок следует сохранять достаточно большой объем резервной памяти. При планировании системы постарайтесь предусмотреть резерв памяти, составляющий от 5 до 10 процентов от памяти, необходимой для работы процессов.
Планирование мощности памяти
При планировании мощности памяти вам потребуется некоторая информация: количество пользователей, одновременно работающих в системе, тип рабочей нагрузки для транзакций и, конечно, тип операционной системы. При предварительном планировании работа обычно начинается с проведения опросов. В данном случае мы производим предварительное планирование сервера базы данных, поэтому информация, относящаяся к загруженности памяти и клиентского приложения, не влияет на планирование мощностей сервера базы данных. Но если вы решите отказаться от беседы с проектировщиком приложения, это будет вашей ошибкой.
Сервер базы данных обрабатывает запросы от пользователей и доставляет информацию, необходимую для выполнения транзакций. Чтобы спланировать оперативную память сервера базы данных, вы должны знать число пользователей, одновременно соединяющихся с системой, и количество транзакций ввода-вывода, возникающих из-за этих пользователей. Этот ввод-вывод имеет форму операций чтения и записи. Беседа с проектировщиком приложения нужна, чтобы получить информацию о различных транзакциях и о генерируемых ими операциях ввода-вывода.
Рассчитывая объем памяти, нужной для вашей системы, вы также должны учесть такие характеристики, как желательную частоту удачных обращений к кэшу и обращений к отсутствующим страницам. Рассмотрим типичный сценарий: вы участвуете в проектировании системы для сервера базы данных, которая будет применяться для заказов в режиме реального времени, и вам надо знать количество одновременно работающих пользователей, из-за которых возникает рабочая нагрузка. Эта информация поможет вам определиться с необходимым вам объемом оперативной памяти. Например, вы знаете, что в каждый момент времени с системой будут одновременно работать 50 пользователей. Для такой системы вам потребуется 25 Мб памяти только для пользователей.
Затем вам надо знать, какую операционную систему вы будете применять. В нашем случае эта операционная система – Microsoft Windows 2000, для которой нужно 20 Мб памяти. Поэтому теперь вам понадобится уже 45 Мб памяти. Вам также надо будет узнать размер программы базы данных, которая будет у вас работать, в нашем случае – Microsoft SQL Server, для которого нужно 5,5 Мб памяти. Итого теперь требуется 50,5 Мб памяти.
И последняя информация, которая вам понадобится, – размер области памяти для обработки базы данных. Эта область состоит из двух элементов: области журнала и кэша базы данных. Область журнала содержит информацию о выполняющихся действиях записи. Эта область очень важна, потому что в случае сбоя системы во время исполнения транзакции в ней сохранится информация для восстановления образа данных перед транзакцией, т.е. образа базы данных, бывшего до того, как произошел сбой. Область журнала имеет также названия "аудиторский след", "контрольный журнал" (audit trail).
Кэш базы данных представляет собой специальную область вашей системы. Через нее передаются все данные, обрабатываемые вашей системой. Чем кэш крупнее, тем больше будет процент успешных обращений к нему (попаданий в кэш). Процент успешных обращений к кэшу – это вероятность, с которой ваша система находит нужные данные в оперативной памяти; очевидно, что вы хотели бы иметь максимально большой процент попаданий в кэш. Обращения к данным, отсутствующим в кэше, похожи на обращения к отсутствующим страницам памяти тем, что нужная информация должна быть доставлена системой и помещена в память кэша. Поэтому, если область кэша окажется слишком маленькой, то будет происходить физический ввод-вывод, потому что системе придется обращаться к диску и доставлять данные, отсутствующие в кэше. Этот физический ввод-вывод, несомненно, увеличит время отклика для транзакций.
Для расчета размера кэша воспользуйтесь следующей формулой:
размер кэша = (размер блока кэша) х (количество блоков в кэше)
Размер блока кэша – это объем данных, передаваемых при одной операции ввода-вывода. Помните, что в SQL Server уже задан стандартный размер блока кэша, равный 8 КБ. Количество блоков в кэше – это просто выбираемый вами размер кэша (в блоках). Для систем оперативной обработки транзакций (OLTP) размер блока следует выбирать поменьше, потому что объем передаваемых данных – небольшой, а чем меньше объем передаваемых данных, тем меньше будет и время, необходимое для исполнения транзакции. В системах поддержки принятия решений (DSS) размер блока должен быть гораздо больше, потому что объем передаваемых данных будет гораздо больше, из-за чего уменьшится количество операций ввода-вывода.
Теперь, пользуясь собранной информацией, мы можем вычислить минимальный необходимый объем памяти. Для расчета минимального объема памяти, необходимого для вашей системы, обычно пользуются следующей формулой:
минимальная память = (системная память) + (пользовательская память) + +(память процесса базы данных)
Здесь системная память – это объем памяти, необходимой для операционной системы и SQL Server, пользовательская память – это по 500 Кб памяти, выделяемых каждому из одновременно работающих пользователей, а память процесса базы данных – это память, необходимая для журнала и кэша.
Эта простая формула может применяться для расчета минимального необходимого объема памяти, нужного для нормальной работы как приложений оперативной обработки транзакций (OLTP), так и для систем поддержки принятия решений (DSS). Для систем DSS нужно выбирать более крупные размеры блоков кэша, потому что приложения DSS выполняют полное сканирование таблиц в режиме последовательного чтения. Увеличив размер блока, можно увеличить количество записей, считываемых за одну физическую операцию ввода-вывода. Для систем DSS кэш не используется, потому что все операции ввода-вывода будут физическими.
Для приложений оперативной обработки транзакций (OLTP) после инсталляции системы вы должны следить за процентом удачных обращений к кэшу. Высокий процент удачных обращений к кэшу поможет вам добиться наилучшего времени отклика и производительности для своей системы.
Сбор данных об использовании памяти
После того как система, для которой производилось предварительное планирование, будет сконфигурирована и настроена, вам надо будет методично собирать данные об использовании ее памяти. Эти данные можно использовать для проверки соответствия созданной вами системы требованиям соглашения об уровне обслуживания, таким как время отклика или загруженность памяти и центрального процессора. Данные можно собрать при помощи просто Microsoft Performance Monitor (Монитора производительности) для среды Microsoft Windows NT.
Помните, что данное исследование является анализом для планирования производительности и поэтому должно производиться достаточно долго. Измерения будут длиться часами (в большинстве случаев – 24 часа), и интервал измерений тоже должен быть установлен равным 24 часам. Для задач планирования производительности нужно заносить в базы данных о производительности по одной записи в сутки. Критерии производительности, называющиеся счетчики (counters), выбираемые вами для мониторинга, будут усредняться по интервалам измерений. Счетчики для планирования мощности памяти, находятся в объекте Memory (в "мониторе производительности" объектом называется набор счетчиков).
Среди счетчиков монитора производительности имеются следующие:
- Page Faults/sec. В этом счетчике содержится среднее количество обращений к отсутствующим страницам за одну секунду. Помните, что обращения к отсутствующим страницам происходят, когда вы запрашиваете страницу с программным кодом или с данными, отсутствующую в рабочей или в резервной (standby) памяти.
- Cache Faults/sec. В этом счетчике содержится среднее количество неуспешных обращений к кэшу, происходящих в системе за одну секунду. Помните, что неуспешные обращения к кэшу происходят всякий раз, когда Cache Manager не находит страницу файла непосредственно в кэше.
- Pages/sec. В этом счетчике содержится среднее количество страниц, прочитанных с диска или записанных на диск системой за одну секунду. Этот счетчик является суммой двух других счетчиков – Pages Input/sec и Pages Output/sec. В нем содержится информация о трафике обращений к страницам, выполняемым в интересах доступа кэша системы к данным файлов для приложений и чтения/записи страниц в/из файлов памяти, не имеющимся в кэше. Пользуйтесь этим счетчиком, если вас беспокоит чрезмерная нагрузка на память (это явление называется пробуксовка, thrashing), что может привести к чрезмерной подкачке страниц.
- Available Memory. Этот счетчик содержит информацию об объеме неиспользуемой памяти, оставшейся в системе. Эта память может использоваться как дополнительная память для базы данных или для системных нужд. Available Memory является наиболее важным счетчиком, применяемым для планирования памяти.
Вам следует хотя бы включить в общий процесс сбора данных для планирования мощности, наблюдение за счетчиками Available Memory и Page Faults/sec.
Анализ данных о памяти
После сбора данных их можно отобразить в графической форме, чтобы предсказать, какими они станут в будущем. График на рисунке 6-4 показывает пример упреждающего анализа. В этом примере показаны данные о свободной памяти, собранные с 22 октября 1999 года по 14 января 2000 года. При помощи Microsoft Excel эти данные были нанесены на график и построена линия тренда. Зубчатая линия обозначает историю фактического использования памяти, а прямая линия обозначает линейный тренд использования памяти. Как видите, этот анализ предсказывает, что 18 февраля 2000 года у системы останется менее 6% свободной памяти.
График на рис. 6.5 показывает увеличение обращений к отсутствующим страницам виртуальной памяти за тот же период, а также демонстрирует, что по мере уменьшения объема свободной памяти число обращений к отсутствующим страницам увеличивается.
Рис. 6.4. Объем свободной памяти (линейная закономерность)
Рис. 6.5. Обращения к отсутствующим страницам (линейная закономерность)
Обратите внимание на то, что данные о количестве обращений к отсутствующим страницам виртуальной памяти за секунду собирались за тот же период времени, что и данные о свободной памяти. Снова воспользуемся Microsoft Excel, чтобы записать эти данные и отобразить их на графике. Зубчатая линия снова обозначает историю фактического изменения показателя, а прямая линия обозначает линейный тренд этого показателя. В нашем случае график предсказывает, что 18 февраля 2000 года у системы будет происходить более шести обращений к отсутствующим страницам в секунду. Значит, и после этой даты число обращений будет увеличиваться и это может привести к нарушению соглашения об уровне обслуживания. Рассмотренный метод упреждающего анализа является простым и эффективным способом слежения за ресурсами памяти.
Планирование мощности процессора
Теперь, когда мы выполнили предварительное планирование и анализ для памяти, пора выполнить такие же работы и для процессора. К настоящему моменту мы можем принять следующие предположения о работе нашей системы:
- Проектирование приложения и схемы базы данных завершены.
- При целевом установившемся режиме мощность центрального процессора будет использоваться не более чем на 75%.
- Ожидаемый процент удачных обращений к кэшу должен составлять не менее 90%.
- Ни один из дисковых накопителей не используется более чем на 85% как по объему занятого места, так и по производительности ввода-вывода.
- Сервер обслуживает только базу данных.
- Операции ввода-вывода распределены по всем дисковым накопителям.
Мы воспользовались этими допущениями и пороговыми величинами при предварительном планировании памяти, но для упреждающего анализа использования мощности центрального процессора нам нужна дополнительная информация, которую надо получить у проектировщика базы данных и у проектировщика приложения.
Упреждающий анализ использования мощности центрального процессора вовсе не так сложен, как вы могли бы предположить. Помните, что сервер базы данных занимается только лишь обработкой транзакций. Приложение работает на компьютере-клиенте, поэтому данные для предварительного планирования его мощности не входят в формулу для расчета мощности процессора. Сервер будет обрабатывать запросы от пользователей в форме операций ввода/вывода. Проектировщик приложений может предоставить нужную информацию о природе транзакций. Проектировщик баз данных может дать информацию о таблицах и индексах, подвергающихся воздействию транзакций. Поэтому первой задачей должно стать определение количества операций ввода-вывода, генерируемых транзакциями и длительности времени, за которое они должны быть завершены. Нам надо знать, какое количество транзакций должно быть обработано системой и знать границы рабочего дня (часы работы системы) или границы периода пиковых нагрузок.
Как вы уже поняли, всегда предпочтительным является предварительное планирование для периода пиковых нагрузок, потому что оно соответствует наихудшему сценарию развития событий, а мы могли бы создать такую систему, которая выдержала бы это. К сожалению, в большинстве случаев, необходимая для этого информация недоступна, поэтому остается довольствоваться информацией, полученной для установившегося режима. Чтобы получить более глубокое понимание обрабатываемых транзакций, мы должны разобраться во внутреннем устройстве ("анатомии") транзакций, в их "профиле", что поможет нам подсчитать количества генерируемых чтений и записей, благодаря чему мы сможем спрогнозировать ожидаемую нагрузку на центральный процессор. Эту информацию можно получить из бесед с проектировщиками базы данных и проектировщиками приложений. Сначала надо узнать, сколько транзакций каждого типа будут проходить через систему, а затем надо определить количество генерируемых операций чтения и записи. Так будет рассчитана оценка нагрузки на центральный процессор.
Для уже работающих систем пользователи могут определить профили транзакций, запуская транзакции по одной за раз и следя за ними через Performance Monitor (чтобы определить количество генерируемых операций чтения и записи). Эта "натурная" информация может применяться для подбора скорости, типа и количества используемых центральных процессоров.
Итак, вопрос о планировании мощностей процессоров в отношении обработки операций ввода-вывода, генерируемых пользовательскими транзакциями, мы обсудили. Но операции ввода-вывода могут генерироваться также и устройствами для обеспечения отказоустойчивости. Эти дополнительные операции ввода-вывода тоже должны учитываться при планировании мощностей процессоров.
Отказоустойчивость
Сейчас большинство компьютерных фирм добиваются отказоустойчивости при помощи поддержки технологии RAID (Redundant Array of Independent Disks, "массивы независимых дисковых накопителей с избыточностью"). (О технологии RAID см. лекцию 5.) Запомните, что чаще всего применяются следующие уровни RAID:
- RAID 0. Дисковые накопители без дублирования.
- RAID 1. Зеркальное дублирование дискового накопителя.
- RAID 5. Несколько дисковых накопителей с расслоением данных.
Так как в RAID 0 не применяется дублирование данных, то для них достаточно одиночного повреждения – при отказе дискового накопителя вы потеряете данные на нем и, следовательно, во всей базе данных. Схема массива RAID 0 показана на рис. 5.9. В RAID 1 обеспечивается зеркальное дублирование диска базы данных. При отказе какого-либо дискового накопителя остается резервный накопитель, весь заполненный данными, такими же, какие были и на отказавшем дисковом накопителе. Если вы решите применять массивы RAID 1, то можно воспользоваться достоинствами параллельного поиска (split seek, см. лекцию 5), благодаря которому система может выполнять поиск данных одновременно сразу на двух дисковых накопителях, что значительно повышает скорость поиска и, следовательно, уменьшает время отклика для транзакций. Схема массива RAID 1 показана на рис. 5.10.
Выбор уровня RAID непосредственно влияет на количество операций дискового ввода-вывода, т.к. разные уровни RAID отличаются количеством записей на диски. Например, для RAID 1 по сравнению с RAID 0 требуется в два раза больше записей на диск. Если пользователь задаст транзакцию, требующую 50 чтений и 10 записей, то при использовании RAID 1 количество записей вырастет до 20.
Если конфигурация RAID 0 имеет два дисковых накопителя, то равноценная конфигурация RAID 5 должна иметь три дисковых накопителя. В конфигурациях RAID 5 применяется слой данных (stripe), содержащий информацию о данных на двух других накопителях, который может быть использован для восстановления данных с отказавшего диска. Схема массива RAID 5 показана на рис. 5.11. Эта схема защиты базы данных хороша и по показателям производительности и по цене. Каждая запись в RAID 5 удваивает количество чтений и количество записей для каждой обрабатываемой транзакции, потому что каждая транзакция должна быть записана на два диска – должен быть прочитан слой контроля по четности, изменен в соответствии с новыми данными, а затем снова записан. Эта избыточность несколько увеличивает длительность времени отклика.
Чтобы рассчитать количество операций ввода-вывода для различных уровней RAID, можно воспользоваться следующими формулами:
Для RAID 0:
количество операций ввода-вывода = (количество чтений на одну транзакцию) + +(количество записей на одну транзакцию)
Если транзакция содержит 50 чтений и 10 записей, то общее количество операций ввода-вывода для уровня RAID 0 будет равно 60.
Для RAID 1:
количество операций ввода-вывода = (количество чтений на одну транзакцию) + (2 х [количество записей на одну транзакцию])
Если транзакция содержит 50 чтений и 10 записей, то общее количество операций ввода-вывода для уровня RAID 1 будет равно 70.
Для RAID 5:
количество операций ввода-вывода = 3 х (количество операций ввода-вывода на одну транзакцию)
Если транзакция содержит 50 чтений и 10 записей, то общее количество чтений будет равно 150, а общее количество записей будет равно 30. Общее количество операций ввода-вывода для уровней RAID 5 будет равно 180.
Увеличение количества операций ввода-вывода зависит от контроллера диска и "прозрачно" для пользователей, которым не нужно настраивать приложение. Помните, что выбор массива RAID оказывает непосредственное влияние на количество обрабатываемых операций ввода-вывода. Нужно принимать во внимание это увеличение количества операций ввода-вывода, так как оно влияет на загруженность центральных процессоров и на количество дисков, выбранное при предварительном планировании.
Рассчитав общее количество чтений и записей, соответствующих пользовательским транзакциям и добавив операции ввода-вывода, необходимые для работы выбранного вами уровня RAID, вы получите всю информацию, необходимую для расчета нагрузки на центральный процессор. Для определения загруженности центрального процессора применяется следующая формула:
загруженность центрального процессора = (темп ввода-вывода) х (время обслуживания) х 100
В этой формуле темп обозначает количество операций ввода-вывода, которые должны быть обработаны за одну секунду, а время обслуживания обозначает длительность времени, необходимого для обработки типичной транзакции ввода-вывода. Эта формула просто утверждает, что загруженность равна общему количеству операций ввода-вывода, выполняемых системой за одну секунду, умноженному на время, необходимое для выполнения каждой задачи, и умноженному на 100 (чтобы загруженность выражалась в процентах).
Для определения количества центральных процессоров, требующихся системе, нужно выполнить следующие расчеты для каждой транзакции, обрабатываемой в качестве рабочей нагрузки:
- Рассчитайте общее количество операций чтения, которые будут выполняться в системе, при помощи следующей формулы:
общее количество чтений = (количество чтений на одну транзакцию) х (общее количество транзакций)
- Определите, сколько из этих операций чтения будут физическими операциями ввода-вывода, а сколько – логическими операциями ввода-вывода, пользуясь следующими формулами:
общее количество логических чтений = (общее количество чтений) х (процент успешных обращений к кэшу) общее количество физических чтений = (общее количество чтений) – -(общее количество логических чтений)
- Преобразуйте общие количества каждой из разновидностей операций чтения в количество чтений в секунду при помощи следующих формул:Здесь рабочий период обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа.
количество логических чтений в секунду = (общее количество логических чтений) / (рабочий период) количество физических чтений в секунду = (общее количество физических чтений) / (рабочий период)
- Рассчитайте объем времени работы центрального процессора, истраченный на каждую из разновидностей операций чтения при помощи следующих формул:Здесь длительность операции логического чтения обозначает время, необходимое для обработки одного логического чтения, а длительность операции физического чтения – время, необходимое для обработки одного физического чтения. Эти длительности операций чтения можно узнать при помощи Performance Monitor (см. врезку "Как узнать длительность операций чтения" после данного перечня инструкций по расчету.)
время для выполнения логических чтений = (количество логических чтений в секунду) х (длительность операции логического чтения) время для выполнения физических чтений = (количество физических чтений в секунду) х (длительность операции физического чтения)
Примечание.Длительность операций чтения обычно составляет 0.002 секунды для физического чтения и 0.001 секунды для логического чтения. - Рассчитайте загруженность центральных процессоров для различных видов операций чтения при помощи следующей формулы:Можно рассмотреть отдельно загруженность логическими или физическими операциями чтения, применив следующие формулы:
загруженность = (темп чтения) х (время обслуживания) х 100
Эта информация полезна, когда надо определить, а не слишком ли много нагрузки вызвано операциями физического чтения. Если это так, то можно настроить размер кэша, чтобы сдвинуть равновесие в сторону операций логического чтения.загруженность операциями логического чтения = (количество логических чтений в секунду) х (длительность операции логического чтения) загруженность операциями физического чтения = (количество физических чтений в секунду) х (длительность операции физического чтения)
- Рассчитайте общее количество операций записи, которые будут выполняться в системе, при помощи следующей формулы:Здесь множитель RAID обозначает общее количество операций записи, выполняемых рабочей нагрузкой за период обработки.
общее количество записей = (количество записей на одну транзакцию) х (общее количество транзакций) х (множитель RAID)
- Определите, сколько операций записи в секунду будут проходить через систему, пользуясь следующей формулой:Здесь рабочий период по-прежнему обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа.
количество записей в секунду = (общее количество записей) / (рабочий период)
- Рассчитайте суммарное время работы центрального процессора, истраченное на обработку операций записи, пользуясь следующей формулой:
время центральных процессоров для выполнения записей = (количество записей в секунду) х (длительность обработки центральным процессором одной операции записи)
- Рассчитайте загруженность операциями записи, пользуясь следующей формулой:
загруженность операциями записи = (количество записей в секунду) х (длительность обработки центральным процессором одной операции записи) х 100
- Рассчитайте суммарную загруженность центральных процессоров для каждого из типов транзакций, пользуясь следующей формулой:Этот расчет должен быть выполнен для каждого типа транзакций, допустимых в вашей системе. Например, если ваша система – банковская, то в ней должны иметься транзакции для снятия денег со счетов, для помещения денег на счета и справки о состоянии баланса. Для точного предварительного планирования мощности центральных процессоров в вашей системе вычисления о нагрузке должны быть выполнены раздельно для каждого из этих трех типов транзакций.
загруженность центральных процессоров = ((загруженность операциями логического чтения) + (загруженность операциями физического чтения) + (загруженность операциями записи)) х 100
- И наконец, рассчитайте суммарную загруженность центральных процессоров, пользуясь следующей формулой:Если суммарная загруженность центральных процессоров превысит 75-процентный порог, то вам следует установить в свою систему дополнительные центральные процессоры, которые уменьшат суммарную загруженность на один процессор в соответствии со следующей формулой:
суммарная загруженность центральных процессоров = сумма загруженностей для всех отдельных видов транзакций
Добавьте столько центральных процессоров, чтобы суммарная загруженность на один процессор снизилась ниже 75%. Например, если суммарная загруженность центральных процессоров окажется равной 180%, то нужно применять три центральных процессора. В результате для трехпроцессорной системы суммарная загруженность на один процессор будет равна 60%.суммарная загруженность на один процессор = (суммарная загруженность центральных процессоров) / (количество центральных процессоров)
Как узнать длительность операций чтения
Длительность операций чтения в вашей системе можно определить при помощи утилиты Performance Monitor. Включите Diskperf при помощи следующей команды, вводимой в окне MS-DOS:
diskperf -y
Затем запустите Performance Monitor и наблюдайте в объекте Physical Disk за счетчиками Avg. Disk sec/Read и Avg. Disk sec/Write. Обратите внимание, что эти счетчики дают вам среднее время для операций физического чтения. Для определения длительности логического чтения операций эти счетчики неприменимы.
Сбор данных о загруженности одного центрального процессора
После того как ваша система будет реализована, потребуется тщательно следить за загруженностью центрального процессора, так же, как и за памятью. В Performance Monitor имеется множество счетчиков, связанных с измерением загруженности отдельных центральных процессоров. Эти счетчики находятся в объекте Processor. Для задач предварительного планирования мощности наиболее полезны следующие счетчики:
- % Processor Time. Процент истекшего времени, в течение которого процессор был занят, исполняя команды. Команда (instruction) – это минимальная единица работы, исполняемой компьютером, поток (thread) – это объект, который выполняет команды, а процесс (process) – это объект, создаваемый при запуске программы. Счечик % Processor Time можно рассматривать как долю времени, расходуемого на выполнение полезной работы.
- % Privileged Time. Процент времени, в течение которого процессор работал в привилегированном режиме (Privileged mode). В привилегированном режиме исполняются уровень обслуживания Windows NT (service layer), программы Executive и ядро Windows NT. Драйверы большинства устройств (кроме графических адаптеров и принтеров) также исполняются в привилегированном режиме.
- % User Time. Процент времени, в течение которого процессор работал в пользовательском режиме (User mode). В пользовательском режиме также исполняются графические алгоритмы, драйверы графических устройств, драйверы принтеров и Window Manager. Программы, исполняемые в пользовательском режиме, не могут повредить целостность Windows NT Executive, ядра и драйверов устройств.
- % Interrupt Time. Процент времени, затраченного процессором на обработку аппаратных прерываний. Прерывания выполняются в привилегированном режиме, поэтому время, затраченное на их обработку, входит в состав показателя % Privileged Time. Этот счетчик помогает выяснить причину чрезмерно большого времени работы в привилегированном режиме.
- Interrupts/sec. Этот счетчик содержит среднее количество прерываний устройств, поступающих к процессору за одну секунду. Устройства прерывают работу процессора в случаях, когда они завершили выполнение задачи или когда требуются вмешательство процессора по какой-либо другой причине. Прерывания могут генерировать такие устройства, как системный таймер, мышь, канал обмена данными, сетевая интерфейсная плата, а также другие периферийные устройства. Во время прерываний нормальное исполнение потока приостанавливается, и в результате прерывания процессор может переключиться на исполнение другого потока, с более высоким приоритетом. Прерывания от таймера происходят часто и периодически и образуют фон активности прерываний.
Для предварительного планирования мощности могут понадобиться не все эти показатели; выбор применяемых показателей зависит от глубины проводимого вами исследования. По крайней мере, следует использовать счетчик % Processor Time.
Сбор данных о загруженности нескольких центральных процессоров
При помощи Performance Monitor вы можете также получить усредненные данные для нескольких центральных процессоров. Для этого воспользуйтесь объектом System, содержащим, среди прочих, следующие счетчики:
- % Total Processor Time. Сумма показателей % Processor Time всех процессоров, деленная на количество процессоров в системе.
- % Total Privileged Time. Сумма показателей % Privileged Time всех процессоров, деленная на количество процессоров в системе.
- % Total User Time. Сумма показателей % User Time всех процессоров, деленная на количество процессоров в системе.
- % Total Interrupt Time. Сумма показателей % Interrupt Time всех процессоров, деленная на количество процессоров в системе.
- Total Interrupts/sec. Среднее количество прерываний устройств, поступающих к процессорам за одну секунду. Этот счетчик служит признаком загруженности системных устройств в масштабах всего компьютера.
Анализ данных о загруженности центральных процессоров
Информация, собранная при помощи счетчиков Performance Monitor, может применяться для прогнозирования увеличения нагрузки на отдельные центральные процессоры, следствием которого станет увеличение времени отклика для этого процессора. На рис. 6.6 показан график загруженности центрального процессора (значения загруженности для разных дат). Обратите внимание, что тренд загруженности центрального процессора растет и достигнет 75% порога 18 февраля 2000 года.
Рис. 6.6. Линейный прогноз загруженности центрального процессора
Планирование мощности дисковой подсистемы
Теперь, когда мы выполнили предварительное планирование памяти и мощности процессора, надо выполнить предварительное планирование дисковой подсистемы. Предварительное планирование этой части системы не составит труда, потому что большинство необходимых нам данных уже рассчитано. Нам нужно, во-первых, общее количество операций ввода-вывода, которые будут обрабатываться системой. Эта информация уже известна нам, мы рассчитали ее при предварительном планировании мощности процессора. Во-вторых, нам нужно знать размер базы данных. Эту информацию можно получить у проектировщика базы данных. При предварительном планировании дисковой подсистемы важно понимать, что вы производите планирование как размера базы данных, так и количества выполняемых операций ввода-вывода в секунду, что может выразиться в значительном увеличении количества дисковых накопителей.
Многие люди бывают удивлены количеством дисковых накопителей, необходимых для их баз данных. Но дополнительные накопители дают дополнительные точки доступа к данным. Если вы имеете только одну точку доступа к данным, то вы создаете узкое место ("бутылочное горлышко"). Так как через это узкое место придется проходить всем транзакциям, то длительность откликов будет увеличиваться. Есть такое практическое правило – имейте как можно больше точек доступа к данным. Чем больше точек доступа к данным будет у вас, тем меньше станет вероятность возникновения узкого места из-за недостаточного количества дисковых накопителей. Кроме того, вы сможете генерировать больше операций ввода-вывода в секунду – чтобы система могла выдерживать большой поток операций ввода-вывода, необходимый для больших баз данных.
Предположим, ваша система управляет базой данных объемом 10 Гб и в ней генерируется 140 операций ввода-вывода в секунду. Из правила 85% об объеме дисковой памяти следует, что вам понадобится дисковый накопитель объемом примерно в 12 Гб, чтобы его хватило для хранения базы данных. Теперь взглянем на требования к дисковым накопителям с точки зрения производительности ввода-вывода. Если дисковые накопители имеют производительность ввода-вывода 70 операций в секунду, то с учетом правила 85% для производительности каждого из накопителей вам потребуются три накопителя. Поэтому, так как анализ производительности ввода-вывода требует применения трех накопителей (максимально), мы должны применять три дисковых накопителя, суммарный объем которых составит 12 Гб, а производительность каждого будет 70 операций ввода-вывода в секунду.
Обратите внимание, что эта конфигурация – минимальная, если хотите, то можете применить большее количество дисковых накопителей с более высокой производительностью. Также обратите внимание, что этот метод анализа не учитывает эффекты от применения конфигураций RAID.
А теперь давайте более подробно изучим, как правильно определить количество дисковых накопителей, нужных для вашей системы, с учетом применения конфигураций RAID. Вам понадобится хранить три основных категории данных:
- Windows 2000 и SQL Server;
- файлы журналов;
- саму база данных.
Надо будет рассчитать количество дисковых накопителей для каждой из этих категорий данных. Суммировав эти числа, вы получите количество дисковых накопителей, необходимых для вашей системы.
Дисковые накопители для Windows 2000 и SQL Server
Сначала надо рассчитать количество дисковых накопителей, необходимых для хранения первой категории данных – операционной системы Windows 2000 Server и СУБД SQL Server. Обычно для этого применяют отдельный набор томов RAID 1 (дисковые накопители с зеркальным дублированием), чтобы обеспечивать наиболее быстрое восстановление после отказов. Количество дисковых накопителей может быть разным в зависимости от объема хранимой на них информации, но операционная система Windows 2000 и СУБД SQL Server обычно умещаются на одном диске. Наш простой метод расчета можно выразить следующей формулой:
диски для операционной системы и SQL = (диски для Windows 2000 Server и SQL) х (множитель RAID)
В данном случае, для дисковых накопителей с зеркальным дублированием, результатом формулы будет 2 диска (Windows NT и SQL Server уместятся на одном диске, а другой будет служить дублирующим диском массива RAID 1). Конфигурация тома для операционной системы как RAID 5 или как RAID 0 не рекомендуется. Применять RAID 5 имеет смысл, только когда для собственно хранения данных требуется более одного диска, и вам следует стремиться к как можно более быстрому восстановлению операционной системы и программы СУБД.
Дисковые накопители для файлов журналов
Затем вам потребуется рассчитать количество дисковых накопителей, необходимых для поддержки системных файлов журналов. Это количество сильно зависит от общего количества операций записи за одну секунду, вызываемых вашими транзакциями. Помните, что ценность информации, содержащаяся на этих дисках, очень велика. Она представляет собой "аудиторский след" (контрольный журнал) или "образ до сбоя", который понадобится, если что-нибудь случится с базой данных. При помощи аудиторского следа вы сможете отменить транзакции, незавершенные из-за отказа диска. Расчет количества операций записи уже был выполнен при предварительном планировании мощностей процессоров. Пусть, например (эти числа взяты произвольно), транзакции вызывают 1 500 000 операций записи при использовании тома RAID 0. Если мы решим, что для дисковых накопителей, хранящих журнал, надо применять RAID 1, то получится, что за 8-часовой рабочий день должно быть выполнено 3 000 000 операций записи, или 104,16 операций записи за одну секунду. (Помните, что по сравнению с RAID 0, массивы RAID 1 удваивают количество операций записи на одну транзакцию.) Для расчета необходимого количества дисковых накопителей примените следующую формулу:,
диски для журналов = (количество записей в секунду) / (производительность ввода-вывода диска)
Помните, что производительность ввода-вывода диска в данной формуле должна составлять 85% от его паспортной максимальной производительности. Также не забудьте округлить результат деления (количество записей в секунду) / (производительность ввода-вывода диска) до ближайшего целого числа в сторону увеличения. И наконец, не забудьте скорректировать величину количество записей в секунду в соответствии с увеличением количества операций записи, вызванным из-за применения того или иного уровня RAID. Если мы применим 85-процентный потолок к дисковым накопителям, имеющим максимальную производительность ввода-вывода 70 операций ввода-вывода за одну секунду, то получится, что нам надо иметь 1,7 накопителя. Округлив этот результат, мы получим, что нам надо иметь два накопителя.
Дисковые накопители для базы данных
И наконец, надо будет рассчитать количество дисковых накопителей, необходимых для базы данных. Помните, что вы должны учитывать не только необходимый объем дисковой памяти, но и количество операций ввода-вывода, которые должны выполняться одну секунду, а затем взять тот из результатов расчета, который окажется больше.
Расчет для объема дисковой памяти
Чтобы определить количество дисковых накопителей, необходимых для того, чтобы база данных могла на них уместиться, примените следующую формулу:
диски для базы данных = (объем данных) / (размер диска) + (прибавка RAID)
Помните, что размер диска в данной формуле должен составлять 85% от его паспортной максимальной емкости. Также не забудьте, что для объема данных и размера диска надо применять одинаковые единицы измерения (например, килобайты или мегабайты). Прибавка RAID – это количество дополнительных дисковых накопителей, необходимых для обеспечения отказоустойчивости. Для RAID 1 это число равно количеству дисковых накопителей, необходимых для хранения самой базы данных. Для RAID 5 требуется один дополнительный накопитель. Для нашей 10-гигабайтной базы данных, использующей RAID 5, потребуется два 12 Гб накопителя.
Расчет для производительности ввода-вывода при доступе к базе данных
Количество дисков, необходимых, чтобы система могла выдержать необходимый темп ввода-вывода, может вырасти очень значительно, как вы уже видели из простого примера, приведенного ранее. Чтобы рассчитать это количество, надо выполнить ряд действий:
- Рассчитайте общее количество операций чтения, которые будут проходить через систему, применив следующую формулу:Предположим, на одну транзакцию у нас производится 500 чтений, а всего будет 50 000 транзакций, тогда всего у нас будет 25 000 000 чтений.
общее количество чтений = (количество чтений на одну транзакцию) х (общее количество транзакций)
- Определите, сколько из этих операций чтения будут физическими операциями ввода-вывода, а сколько – логическими операциями ввода-вывода, пользуясь следующими формулами:Предположим, процент успешных обращений к кэшу равен 90%, тогда общее количество логических операций чтения у нас будет равно 22 500 000, а общее количество физических операций чтения будет равно 2 500 000.
общее количество логических чтений = (общее количество чтений) х (процент успешных обращений к кэшу) общее количество физических чтений = (общее количество чтений) - (общее количество логических чтений)
- Преобразуйте общее количество физических операций чтения в количество чтений в секунду при помощи следующей формулы:Здесь рабочий период обозначает длительность времени (в секундах), в течение которого должна быть выполнена работа. Эта величина нужна также для расчета загруженности центрального процессора. Если взять для нашего примера 8-часовой рабочий период, то мы получим 86,8 физических операций чтения в секунду.
количество физических чтений в секунду = (общее количество физических чтений) / (рабочий период)
- Затем рассчитайте общее количество операций записи, которые будут выполняться в системе, при помощи следующей формулы:Пусть мы имеем 10 операций записи на одну транзакцию и применяем массив RAID 5, тогда общее количество записей будет равно 10 х 50 000 х 3, т.е. 1 500 000 операций записи.
общее количество записей = (количество записей на одну транзакцию) х (количество транзакций) х (множитель RAID)
- Преобразуйте общее количество физических операций записи в количество операций записи в секунду при помощи следующей формулы:В нашем примере мы имеем 1 500 000 физических операций записи за 8-часовой рабочий период (28 800 секунд), что дает 52,1 физических операций записи в секунду.
количество физических записей в секунду = (общее количество физических записей) / (рабочий период)
- Рассчитайте общее количество физических операций ввода-вывода в секунду при помощи следующей формулы:В нашем примере мы имеем 86,8 физических операций чтения в секунду и 52,1 физических операций записи в секунду, что дает в сумме 138,9 физических операции ввода-вывода в секунду.
количество физических операций ввода-вывода в секунду = (общее количество физических чтений в секунду) + (количество физических записей в секунду)
- Вычислите общее необходимое количество дисковых накопителей по следующей формуле:
количество дисков для базы данных = ((количество физических операций ввода-вывода в секунду) / (производительность ввода-вывода одного диска)) + (прибавка RAID)
Помните, что значение производительности ввода-вывода одного диска вы должны брать с учетом правила "85%". Прибавка RAID – это количество дополнительных дисковых накопителей, необходимых для обеспечения отказоустойчивости. Если мы имеем всего 138,9 физических операции ввода-вывода в секунду, а производительность диска составляет 70 операций ввода-вывода в секунду и применяется массив RAID 5, то всего понадобится четыре дисковых накопителя – три для поддержки суммарного ввода-вывода и еще один для обеспечения отказоустойчивости массива RAID 5.
Итак, вы видите, что для размещения базы данных размером 10 Гб было бы достаточно иметь всего лишь один диск, но с учетом выполняемого ввода-вывода потребуется три диска – больший из двух результатов расчета.
Общее количество дисковых накопителей, нужных в системе
Чтобы определить суммарное количество дисковых накопителей, нужных для системы, надо суммировать все количества накопителей, нужных для всех ее компонент. В соответствии с условиями нашего примера нам понадобятся два накопителя для Windows 2000 Server и SQL Server, два накопителя для файлов журнала и четыре накопителя для базы данных, из чего следует, что для всей системы потребуется восемь дисковых накопителей.
Оставляйте себе резервы
Большинство проектировщиков пользуются пороговыми величинами (75% для загруженности центральных процессоров, 85% для использования дисков и т.д.) как максимальными значениями нагрузок. В большинстве случаев желательно применять меньшие величины. Конечно, часто решения в этих вопросах принимают не проектировщики. На решение проектных вопросов могут оказывать влияние такие внешние факторы, как бюджет расходов на покупку вычислительной техники. В качестве хорошего целевого показателя можно принять максимальную загруженность центральных процессоров, равную 65% и использование дисков на 70%. Однако вы можете применять и любые другие значения этих процентов, которые сочтете оптимальными для проектируемого вами типа систем.
Сбор данных об использовании дисков
После того как система будет установлена и запущена в работу, вам надо будет собирать данные об использовании ее дисков, чтобы знать обо всех изменениях, которые могут потребоваться. При расширении системы может увеличиться количество пользователей (а следовательно, и количество транзакций), могут измениться требования к базе данных (в результате чего может увеличиться размер базы данных) и т.д.
При выполнении исследований последующего планирования загруженности дисков понадобится следить за следующими счетчиками утилиты Performance Monitor, которые вы найдете в объекте PhysicalDisk:
- % Disk Time. Процент истекшего времени, в течение которого выбранный дисковый накопитель был занят обслуживанием запросов чтения или записи.
- % Disk Read Time.Процент истекшего времени, в течение которого выбранный дисковый накопитель был занят обслуживанием запросов чтения.
- % Disk Write Time.Процент истекшего времени, в течение которого выбранный дисковый накопитель был занят обслуживанием запросов записи.
- Avg. Disk Read Queue Length. Среднее количество запросов чтения, стоящих в очереди на выбранном дисковом накопителе за время интервала измерения.
- Avg. Disk Write Queue Length. Среднее количество запросов записи, стоящих в очереди на выбранном дисковом накопителе за время интервала измерения.
- Avg. Disk Queue Length.Среднее количество запросов (любых – и чтения, и записи), стоящих в очереди на выбранном дисковом накопителе за время интервала измерения. Этот показатель является суммой двух предыдущих показателей.
- Disk I/O Count Per Second.Активность ввода-вывода массива дисков за одну секунду, усредненная за интервал измерения. Этот счетчик недоступен непосредственно из утилиты Performance Monitor, чтобы получить эту величину, надо просто сложить значения двух других счетчиков, которые доступны – Disk Reads/sec и Disk Writes/sec*.
- Disk Space Used.Объем места на диске, которое в данный момент используется базой данных или операционной системой. Этот счетчик недоступен из Performance Monitor, для получения этой информации нужно применять Disk Administrator.
- Disk Space Available.Объем места на диске, которое в данный момент свободно**.
Для запуска Disk Administrator нажмите на экранную кнопку Start, затем выберите Programs, Administrative Tools (Common) и, наконец, Disk Administrator. Для получения дополнительной информации об использовании утилиты Disk Administrator, производительности, нажмите на кнопку Help в окне Disk Administrator.
Анализ данных об использовании дисков
Анализ информации об использовании дисков несложен. Например, если бы мы анализировали работу системы, то для определения объема свободного места мы собирали бы информацию о свободном месте на дисках. На рис. 6.7 показаны нагрузка на базу данных в отношении наличия свободного места.
Как можно видеть, в начале наблюдений у нас было 2,05 Мб свободного места из общего объема в 6,15 Мб, т.е. диск был заполнен примерно на 67%. 14 января 2000 года объем свободного места на диске уменьшился примерно до 1,5 Мб, т.е. диск заполнился примерно на 75%. Проведя при помощи Microsoft Excel линию тренда, можно спрогнозировать, что 18 февраля 2000 года на диске останется свободно только около 1,3 Мб, т.е. диск заполнился примерно на 83%. Администратор баз данных может принять решение приобрести в этот момент дополнительный диск.
Рис. 6.7. Прогноз (упреждающий анализ) для свободного места на диске
Планирование мощности сети
Планирование мощности сети мы оставили под конец, потому что изнутри системы вы не сможете получить много информации. Из утилиты Performance Monitor нельзя получить никакие счетчики производительности работы сети, поэтому предварительное планирование сети может оказаться достаточно трудным делом. Сеть обычно является самым слабым звеном в системе, поэтому будьте реалистичны при ее оценке.
Чтобы выполнить предварительное планирование сети, вам понадобится определить, сколько пользователей будут одновременно работать в системе, сколько сообщений (messages) будет проходить за одну секунду и сколько в среднем байт будет содержаться в этих сообщениях. Опираясь на эту информацию, вы можете произвести некоторые оценки минимально необходимой пропускной способности сети. Пусть, например, в нашей системе будут передаваться такие объемы данных: будет 10 пользователей, каждый из которых будет передавать 25 сообщений в минуту. Каждое сообщение будет иметь длину 259 байтов. Можно оценить, что за одну минуту все эти 250 сообщений будут генерировать 64 750 байтов в минуту, т.е. 518 000 битов в минуту, т.е. 8633,33 бита в секунду. Для такой нагрузки подойдет небольшая сеть. Для оценки мощности сети можно применять следующую формулу:
мощность сети = (количество сообщений секунду) х (длина сообщений) х (количество битов в одном байте)
При помощи этого расчета вы можете приблизительно оценить мощность (бит/сек), которую должна будет иметь линия передачи данных.
Почти все смогут выполнить такую оценку сети, даже без мониторинга ее использования. Кроме того, в большинстве случаев приходится пользоваться той сетью, т.е. вы не можете выбрать другую сеть, чем та, что уже поддерживается вашей системой.
Сбор данных об использовании сети
При выполнении исследований последующего планирования загруженности сети вам понадобится следить за счетчиком производительности Bytes/Sec Through Network Interface утилиты Network Monitor (Сетевой монитор). Этот счетчик обозначает процент времени, когда линия передачи данных занята.
Анализ данных об использовании сети
Для анализа сетевых данных надо сначала рассчитать пропускную способность линии передачи данных (мощность сети), как было показано выше, а затем посмотреть значение счетчика Bytes/Sec Through Network Interface. Зная два этих значения, можно вычислить общую загруженность сети при помощи следующей формулы:
загруженность сети = ((количество байт, проходящих через сеть за одну секунду) / (мощность сети)) х 100
На рис. 6.8 показан пример линейного роста процента загруженности сети в зависимости от даты.
Рис. 6.8. Прогноз (упреждающий анализ) для загруженности сети
График показывает, что 2 сентября 2000 года загруженность данного сегмента сети станет максимально возможной. Опять напомним, что чем больше точек с данными вы нанесете на график, тем точнее будет ваш прогноз.
Как выбирать оценочные данные
Нельзя однозначно назвать набор счетчиков, за которыми нужно следить при последующем планировании. Набор используемых счетчиков зависит от анализируемых вами данных и от необходимой вам степени детализации. Кроме счетчиков, уже описанных ранее, Performance Monitor имеет много других счетчиков для измерения производительности, которые могут оказаться полезными в некоторых ситуациях. Одну такую ситуацию – сбор информации о процессах – мы сейчас и рассмотрим.
Сбор данных о процессах
Информация о процессах может оказаться очень ценной при создании профилей рабочей нагрузки. Создание профилей рабочей нагрузки – это выяснение, какую именно работу выполняет каждый из пользователей. Performance Monitor имеет много разнообразных счетчиков для выполнения этой задачи. Эти счетчики подобны счетчикам из объекта Processor, но в данном случае они применяются для сбора данных о процессе. Они находятся в объекте Process и перечислены ниже:
- % Processor Time. Процент истекшего времени, в течение которого все потоки процесса использовали процессор для исполнения команд. Для данного процесса может быть учтен программный код, обрабатывающий некоторые аппаратные прерывания или условия-ловушки (trap conditions).
- % User Time.Процент времени, в течение которого потоки процесса выполняли программный код, исполняемый в пользовательском режиме (User mode).
- % Privileged Time.Процент времени, в течение которого потоки процесса выполняли программный код, исполняемый в привилегированном режиме (Privileged mode).
- Page Faults/sec.Частота обращений к отсутствующим страницам в данном процессе.
- Elapsed Time.Общее время, затраченное на работу данного процесса.
Анализ данных о процессах
Анализ этой информации вовсе не так сложен, как вы могли бы подумать. Например, если бы потребовалось провести анализ работ, выполняемых процессами системы, то нам надо было бы собрать данные процессов при помощи, например, счетчика % Processor Time. Этот счетчик позволяет оценить, насколько много внимания система уделяет данной функции. На рис. 6.9 показан рост пользовательского процесса в запросе CalProc, применяемом отделом кредиторских задолженностей.
Эта информация полезна тем, что мы можем спрогнозировать результат от увеличения числа пользователей в отделе кредиторских задолженностей. Линия тренда на данном графике показывает, что процент использования возрастает и достигнет 18 февраля 2000 года 30%. Допустим, в отделе кредиторских задолженностей имеется 10 пользователей, тогда можно оценить в 3% вклад каждого из пользователей в загруженность в феврале. Мы можем сделать вывод, что если в феврале добавить еще трех пользователей, то загруженность для запроса CalProc составит приблизительно 39%.
Принимая решение об объекте измерения, важно решить, что же именно вы будете анализировать, так как это влияет на всю применяемую вами конфигурацию измерений. Во время исследований последующего планирования помните, что вы не должны принимать участие в возникновении проблем с производительностью – т.е., если вы захотите измерять все и установите небольшой интервал замеров, тогда вы усугубите проблемы с производительностью, которые, возможно, уже имеются. Чем мельче будет ваш интервал замеров, тем чаще ваши записи будут записываться на диск и, если вы измеряете много счетчиков, эти записи будут очень большими. Многочисленные записи следует применять, только когда для вашего анализа производительности нужны небольшие интервалы замеров, чтобы диагностировать проблемы с производительностью. Но для исследований мощности будет достаточно одной записи в сутки.
Рис. 6.9. Прогноз (упреждающий анализ) пользовательского процесса
В табл. 6.1 дан список счетчиков, которые послужат хорошей основой для исследований планирования мощности.
Объект | Показатели |
---|---|
Processor | % Processor Time (статистика для отдельных центральных процессоров) |
System | % Total Processor Time (усредненные данные для всех центральных процессоров) |
Лекция 7. Инсталляция Microsoft SQL Server
Теперь, когда вы закончили работы по подготовке к инсталляции, описанные в лекциях 4 и 5, и правильно выполнили предварительное планирование своей системы (в соответствии с объяснениями в лекции 6), можно приступить к инсталляции Microsoft SQL Server 2000. В данной лекции содержатся объяснения о ходе инсталляции и обзор процедуры обновления Microsoft SQL Server от старых версий. А затем, поскольку вы можете применять SQL Server в клиент-серверных окружениях, мы подробно расскажем об инсталляции клиентских утилит на компьютерах-клиентах.
Инсталляция на сервере
Имеется три способа инсталляции SQL Server. Можно выполнить локальную, дистанционную либо автоматическую инсталляцию. При локальной инсталляции SQL Server устанавливается на компьютер, которым вы пользуетесь в текущий момент. При дистанционной инсталляции вы можете установить SQL Server на другой компьютер, входящий в вашу сеть. Автоматическая инсталляция дает возможность инсталлировать SQL Server без необходимости человеческих ответов на вопросы системы (вы заблаговременно сохраняете в файле все ответы на вопросы системы, а программа инсталляции автоматически считывает их оттуда по мере надобности). В данной лекции будут описаны все эти три способа инсталляции. Если вы впервые инсталлируете SQL Server 2000, то, прежде чем пробовать другие способы, пользуйтесь локальной инсталляцией. Тогда вы хорошо освоитесь с обычной процедурой инсталляции.
Локальная инсталляция
Если вы подготовились к инсталляции в соответствии с тем, как это было описано в лекциях 4, 5 и 6, то процесс инсталляции пройдет гораздо более гладко. Для локальной инсталляции выполните следующие действия, в результате чего SQL Server установится и начнет работать на сервере:
- Вставьте компакт-диск SQL Server в привод для компакт-дисков вашего сервера. Если у вашей операционной системы включена настройка для автоматического запуска компакт-дисков, тогда появится диалоговое окно начальной установки Microsoft SQL Server 2000 (рис. 7.1). Если настройка для автоматического запуска компакт-дисков не включена, тогда нужно вручную запустить программу Autorun.exe, находящуюся в корневой директории компакт-диска.
- Если у вас не установлены необходимые дополнительные пакеты операционной системы (service packs, "сервис-пэки") или требуемая версия Microsoft Internet Explorer, или если вы просто хотите посмотреть перечень программных компонент, необходимых для инсталляции, то нажмите на SQL Server 2000 Prerequisites, и тогда откроется диалоговое окно SQL Server 2000 Prerequisites (Предварительные условия для SQL Server 2000). Нажмите на обозначение нужной операционной системы, появится список необходимых программных компонент для нее. Затем нажмите на обозначение программной компоненты, которую вы хотите инсталлировать. Если все необходимое программное обеспечение у вас уже установлено, то переходите к шагу 3.
Рис. 7.1. Диалоговое окно начальной установки SQL ServerПримечание.Если вам потребуется инсталлировать Microsoft Internet Explorer или дополнительные пакеты (service packs, сервис-пэки), необходимые для Microsoft Windows 2000 или Microsoft Windows NT 4, то, прежде чем вы сможете продолжить инсталляцию SQL Server, может потребоваться перезагрузка компьютера и повторный запуск Autorun.exe.Инсталлировав необходимые программные компоненты, вернитесь в основное диалоговое окно инсталляции SQL Server, нажав на Back (Назад). - Чтобы начать инсталляцию SQL Server, нажмите на SQL Server 2000 Components (Компоненты SQL Server 2000).
- Появится диалоговое окно Install Components (рис. 7.2). Чтобы начать инсталляцию основных компонент SQL Server, нажмите на Install Database Server.
Рис. 7.2. Диалоговое окно Install Components - Появится стартовое окно мастера SQL Server 2000 Installation Wizard. Если у вас работают какие-либо другие программы, то их нужно закрыть. Чтобы продолжить процесс инсталляции, нажмите на Next.
- Появится диалоговое окно Computer Name (Имя компьютера). Нажмите сначала на Local Computer, а затем на Next.
- Появится диалоговое окно SQL Server 2000 Installation Selection (Выбор инсталляции SQL Server 2000). Для продолжения инсталляции нажмите сначала на Create A New Instance Of SQL Server (Создать новый экземпляр SQL Server), а затем нажмите на Next.
- Появится диалоговое окно User Information (Информация о пользователе). Проверьте правильность вашего имени и названия вашей фирмы. Для продолжения нажмите на Next.
- Появится диалоговое окно Software License Agreement (Лицензионное соглашение об использовании программного обеспечения). Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
- Появится диалоговое окно CD Key (Ключ компакт-диска). Введите 25-символьный ключ компакт-диска, напечатанный на желтой наклейке на футляре компакт-диска, а затем нажмите на Next.
- Появится диалоговое окно Installation Definition (Задание инсталляции). Нажмите на Server And Client Tools (Серверные и клиентские инструментальные средства), а затем нажмите на Next.
- Появится диалоговое окно Instance Name (Имя экземпляра). Если вы хотите, чтобы имя этого экземпляра SQL Server отличалось от принятого по умолчанию, то снимите флажок Default и введите с клавиатуры нужное имя. Для продолжения процесса инсталляции нажмите на Next.
- Появится диалоговое окно Setup Type (Тип установки)(рис. 7.3), в котором вы можете выбрать тип инсталляции – "типичную" (Typical), "минимальную" (Minimal) или "выборочную" (Custom). В типичную инсталляцию включены все опции (возможности), кроме средств разработки (Development Tools) и полнотекстного поиска (Full-Text Search). При помощи выборочной инсталляции вы можете добавить эти опции, а также отказаться от любых ненужных вам опций. При минимальной инсталляции устанавливаются те же опции, что и при типичной, кроме Upgrade Tools (Средства обновления), Books Online (Справочная документация в электронной форме) и Management Tools (Средства управления).
В большинстве случаев надо выполнять типичную инсталляцию, поэтому в наших примерах предполагается, что была нажата экранная кнопка Typical. Также вы можете указать местоположение устанавливаемых файлов программ и данных SQL Server, для чего нажимайте на экранные кнопки Browse в группе экранных форм Destination Folder (Целевая папка). Для продолжения нажмите на Next.
- Появится диалоговое окно Services Accounts (Учетные записи служб) (рис. 7.4). Вы можете применять как учетную запись Windows NT или Windows 2000, так и администраторскую учетную запись (Administrator account). В любом случае, учетная запись должна иметь права доступа Log on as a service. Если вы не знаете, как создавать такие учетные записи, посоветуйтесь со своим системным администратором или почитайте документацию по Windows NT или Windows 2000. В соответствующие поля окна введите с клавиатуры имя и пароль созданной вами учетной записи службы SQL Server. Если вы инсталлируете SQL Server на одиночный компьютер – рабочую станцию, то нажмите мышкой на Use the Local System account (Использовать учетную запись локальной системы). Для продолжения нажмите на Next.
Рис. 7.3. Диалоговое окно Setup Type (Тип установки)
Рис. 7.4. Диалоговое окно Services Accounts (Учетные записи служб) - Затем появится диалоговое окно Authentication Mode (Режим аутентификации), (рис. 7.5). Это диалоговое окно определяет уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать Windows Authentication Mode (Режим аутентификации Windows) либо Mixed Mode (Смешанный режим). При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из настроек Windows User Security. При выборе Mixed Mode вы должны задать пароль для учетной записи sa (системного администратора SQL Server). Вы можете и не задавать этот пароль (оставить его пустым), но такой поступок серьезно ухудшит безопасность вашей инсталляции SQL Server. После того как вы выберете режим аутентификации, чтобы продолжить работу, нажмите на Next.
Рис. 7.5. Диалоговое окно Authentication Mode (Режим аутентификации) - Появится диалоговое окно Start Copying Files (Запустить копирование файлов). Для продолжения нажмите на Next.
- Появится диалоговое окно Licensing Mode (Лицензионный режим). Вы можете выбрать один из двух вариантов лицензии для клиентов SQL Server – на количество посадочных мест (per seat) или на количество процессоров.
При выборе лицензии на количество посадочных мест потребуется лицензия на клиентский доступ (Client Access License) для каждого компьютера-клиента, который будет осуществлять доступ к серверу. После того как для такого компьютера будет получена лицензия, он сможет осуществлять доступ к любому компьютеру в сети, на котором исполняется SQL Server 2000 без какой-либо дополнительной оплаты. Лицензия на количество процессоров требует получения лицензии на каждый из процессоров, который будет исполнять SQL Server. Например, если ваш SQL Server работает на четырехпроцессорном компьютере, то для использования всех четырех процессоров вам надо будет приобрести четыре процессорных лицензии. Если хотите, вы можете ограничить работу SQL Server лишь двумя процессорами из четырех. В этом случае вам потребуется приобрести только две процессорных лицензии. После того как вы приобретете нужное количество процессорных лицензий, вы сможете соединяться с неограниченным числом клиентов.
Чтобы начать инсталляцию приложений и файлов данных SQL Server, нажмите на Continue. SQL Server установит на ваш компьютер нужные файлы и сконфигурирует необходимые компоненты. Инсталляция может выполниться всего лишь за несколько минут либо дольше (в зависимости от быстродействия вашего компьютера).
- По завершении инсталляции появится диалоговое окно Setup Complete (Установка завершена). Для завершения процесса инсталляции нажмите на Finish.
Поздравляем! Вы инсталлировали SQL Server на свой сервер.
Дистанционная инсталляция
Если вы хотите инсталлировать SQL Server на сервер со своего компьютера через сеть, то вам надо будет выполнить дистанционную инсталляцию. Дистанционная инсталляция несколько отличается от локальной инсталляции и выполняется при помощи следующей последовательности шагов:
- Выполните пункты 1-5 из последовательности действий для локальной инсталляции.
- В диалоговом окне Computer Name нажмите на Remote Computer и введите с клавиатуры имя удаленного компьютера. Для продолжения нажмите на Next.
- Появится диалоговое окно SQL Server 2000 Installation Selection. Нажмите на Create A New Instance Of SQL Server (Создать новый экземпляр SQL Server), а затем, чтобы продолжить инсталляцию, нажмите на Next.
- Появится диалоговое окно User Information. Проверьте правильность вашего имени и названия вашей фирмы. Для продолжения нажмите на Next.
- Появится диалоговое окно Software License Agreement. Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
- Появится диалоговое окно CD Key. Введите 25-символьный ключ компакт-диска, напечатанный на желтой наклейке на футляре компакт-диска, а затем нажмите на Next.
- Появится диалоговое окно Remote Setup Information (Информация о дистанционной установке) (рис. 7.6). Введите в нем с клавиатуры имя учетной записи, пароль и домен для компьютера, на который вы хотите инсталлировать SQL Server. Не забудьте, что учетная запись, которой вы пользуетесь, должна иметь полномочия инсталлировать программное обеспечение на этом компьютере. Вы также должны ввести с клавиатуры путь инсталляции в файловой системе на удаленном компьютере в текстовое поле Target Path (Целевой путь). Путь инсталляции должен быть путем в формате UNC (Universal Naming Convention), например, \\remoteserver\c$\Program Files\ Microsoft SQL Server. Для продолжения нажмите на Next.
Рис. 7.6. Диалоговое окно Remote Setup Information (Информация о дистанционной установке) - Появится диалоговое окно Installation Definition. Нажмите на Server And Client Tools, а затем нажмите на Next.
- Появится диалоговое окно Instance Name. Если вы хотите, чтобы имя этого экземпляра SQL Server отличалось бы от принятого по умолчанию, то снимите флажок Default и введите с клавиатуры нужное имя. Для продолжения процесса инсталляции нажмите на Next.
- Появится диалоговое окно Setup Type. При дистанционной инсталляции, так же, как и при локальной, вы можете выбрать типичную, минимальную или выборочную инсталляцию. В типичную инсталляцию включены все опции, кроме Development Tools и Full-Text Search. При помощи выборочной инсталляции вы можете добавить эти опции, а также отказаться от любых ненужных вам опций. При минимальной инсталляции устанавливаются те же опции, что и при типичной, кроме Upgrade Tools, Books Online и Management Tools.В большинстве случаев надо выполнять типичную инсталляцию, поэтому в наших примерах предполагается, что была нажата экранная кнопка Typical. Вы также можете указать местоположение устанавливаемых файлов программ и данных SQL Server, для чего нажимайте на экранные кнопки Browse в группе экранных форм Destination Folder. Для продолжения нажмите на Next.
Появится диалоговое окно Services Accounts (рис. 7.4). В соответствующие текстовые поля этого окна введите с клавиатуры имя и пароль созданной вами учетной записи службы SQL Server. (Если вы не создали отдельную учетную запись, то можете воспользоваться учетной записью и паролем администратора Windows NT или Windows 2000.) Для продолжения нажмите на Next.
- Появится диалоговое окно Authentication Mode. Это диалоговое окно определяет уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать Windows Authentication Mode либо Mixed Mode. При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из Windows User Security. При выборе аутентификации Mixed Mode вы должны задать пароль для учетной записи системного администратора SQL Server (в этом диалоговом окне – "sa"). Вы можете и оставить этот пароль пустым, но такой поступок серьезно ослабит безопасность вашей инсталляции SQL Server. После того как вы выберете режим аутентификации, для продолжения работы нажмите на Next.
- Появится диалоговое окно Licensing Mode. При дистанционной инсталляции, как и при локальной, вы можете выбрать один из двух вариантов лицензии для клиентов SQL Server – на количество клиентов для работы на серверах или на посадочных мест (на количество процессоров). Различия между этими двумя видами лицензий описаны в пункте 16 последовательности действий для выполнения локальной инсталляции.
В ходе процесса дистанционной инсталляции SQL Server создаст файл с именем Sqlstp.log. Этот файл находится в папке %Systemroot% вашей операционной системы Windows NT или Windows 2000. Обычно папка %Systemroot% – это C:\Winnt. В файле Sqlstp.log хранится информация обо всех выполненных действиях процесса инсталляции, а также об ошибках или предупреждениях, возникших при инсталляции. Если вдруг дистанционная инсталляция завершится неудачно, этот файл поможет при диагностике.
Автоматическая инсталляция
В SQL Server имеются средства, при помощи которых можно автоматизировать процесс инсталляции. С их помощью вы сможете выполнять инсталляцию без личного присутствия, что особенно полезно при установке SQL Server на большое число серверов. Ниже перечислены действия для создания автоматической инсталляции:
- Из командной строки перейдите в директорию на компакт-диске.
- Выполните один из пакетных (.bat) файлов для автоматической инсталляции:
- Sqlins.bat служит для выполнения типичной инсталляции SQL Server на Windows 95/98, Windows NT или на Windows 2000. Этот пакетный файл использует файл инициализации Sqlins.iss.
- Sqlcst.bat служит для выполнения выборочной инсталляции SQL Server на Windows 95/98, Windows NT или на Windows 2000. Этот пакетный файл использует файл инициализации Sqlcst.iss.
- Sqlcli.bat служит для инсталляции клиентских утилит. Эти утилиты инсталлируются с использованием файла инициализации Sqlcli.iss. Клиентские утилиты инсталлируются в папку C:\Program Files\Microsoft SQL Server\80\.
- Sqlrem.bat служит для удаления с компьютера всех компонент SQL Server. В качестве параметра вы должны указать установочную папку SQL Server.
Прежде чем запускать какой-либо из этих пакетных файлов, вы можете настраивать для конкретных компьютеров файлы .iss, соответствующие этим .bat -файлам. Например, вы можете пожелать изменить режим лицензирования со стандартного ("на сервер") на "на количество посадочных мест". Для этого потребуется изменить раздел [License] соответствующего .iss -файла с LicenseMode=PERSERVER на LicenseMode=PERSEAT.
Обновление от ранних версий
Если на ваших компьютерах уже размещены данные Microsoft SQL Server 6.5 или Microsoft SQL Server 7, то вы можете без хлопот обновить эти данные для использования с SQL Server 2000. Для обновления инсталляций Microsoft SQL Server 6.5 понадобится использовать мастер Version Upgrade Wizard. Инсталляции SQL Server 7 обновляются автоматически в процессе установки SQL Server 2000.
Обновление к SQL Server 2000 от SQL Server 7
Процесс приведения данных SQL Server 7 к формату SQL Server 2000 является составной частью инсталляции SQL Server 2000. Завершив процесс инсталляции, SQL Server 2000 запустит набор сценариев для обновления данных SQL Server 7. Этот процесс может занять некоторое время, зависящее от количества обновляемых баз данных и таблиц. По ходу выполнения этого процесса вы будете видеть сообщения о состоянии его исполнения (рис. 7.7).
Рис. 7.7. Сообщение о состоянии процесса обновления SQL Server 7
Обновление к SQL Server 2000 от SQL Server 6.5
Прежде чем запустить мастер SQL Server Upgrade Wizard, который обновляет данные SQL Server 6.5 к форматам SQL Server 2000, вам понадобится проверить все пункты приведенного ниже списка (применительно к вашей инсталляции SQL Server 6.5):
- Проверьте, чтобы параметр user connections в sp_configure имел бы рабочее значение не менее 25. Для новых сетевых библиотек для выполнения обновления может потребоваться более 15 подключений (15 – значение, применяемое по умолчанию).
- Проверьте, что все ваши файлы базы данных SQL Server 6.5, включая главную базу данных, сохранены при помощи резервного копирования.
- Запустите все проверки целостности баз данных SQL Server 6.5 (при помощи DBCC), чтобы убедиться в том, что их целостность не нарушена.
- Установите значение tempdb не менее 10 Мб. Рекомендуется размер 25 Мб, но 10 Мб будет достаточным.
- Отключите все включенные стартовые хранимые процедуры.
- Остановите все службы репликации и убедитесь в том, что журнал репликации пуст.
- Если у вас не установлен пакет обновления SQL Server 6.5 Service Pack 3 или более свежий, то надо установить его.
Чтобы обновить данные SQL Server 6.5 к форматам SQL Server 2000 (после того как вы инсталлировали SQL Server 2000), надо выполнить следующие действия:
- Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Microsoft SQL Server-Switch, а затем нажмите на SQL Server Upgrade Wizard, чтобы появился стартовый экран мастера SQL Server Upgrade Wizard (рис. 7.8). Для продолжения процесса обновления нажмите на Next.
- Появится экран Data and Object Transfer (Перенос данных и объектов) мастера SQL Server Upgrade Wizard (рис. 7.9). По умолчанию, мастер SQL Server Upgrade Wizard выполнит конвертацию (преобразование) всех объектов и данных базы данных SQL Server 6.5 в формат SQL Server 2000. Чтобы убедиться в успешности этой конвертации, установите флажок Validate Successful Object Data Transfer (Проверить успешность переноса объектов данных). Эта проверка может занять много времени, но лучше ее все-таки выполнить.
Рис. 7.8. Стартовый экран мастера SQL Server Upgrade Wizard
Рис. 7.9. Экран Data and Object Transfer (Перенос данных и объектов)Если вы беспокоитесь о целостности конвертированных данных, то установите флажок Exhaustive Data Integrity Verification (Исчерпывающая верификация целостности данных). Из-за этой опции процесс конвертации данных еще более замедлится, но зато будет обеспечен наивысший уровень целостности. Если вы уже давно не запускали SQL Server 6.x DBCC (модуль для проверки непротиворечивости базы данных), то нужно выбрать применение этой опции, чтобы избежать влияния повреждения базы данных на процесс конвертации. Если на вашем компьютере имеется ленточный накопитель, то будет иметься также опция для использования в качестве метода передачи данных не именованных каналов, а ленточного накопителя. Для продолжения нажмите на Next.
- Появится экран Logon мастера SQL Server Upgrade Wizard (рис. 7.10). Вы должны выбрать имя сервера из выпадающего списка и ввести с клавиатуры пароль системного администратора для конвертируемой базы данных SQL Server 6.5. Вы также должны ввести пароль системного администратора для целевой базы данных SQL Server 2000. Если вы хотите, чтобы любой из SQL Server работал с какими-либо аргументами запуска (startup arguments), то введите с клавиатуры эти аргументы в соответствующее текстовое поле Optional Startup Arguments (Необязательные аргументы запуска). Здесь можно задать флаги трассировки. Если вы не пожелаете применять аргументы запуска, то оставьте эти текстовые поля пустыми. (Для дополнительной информации обратитесь к Books Online и посмотрите в разделе "stаrtup options"). Для продолжения нажмите на Next.
- Экран мастера SQL Server Upgrade Wizard выдаст предупредительное сообщение о том, что мастер SQL Server Upgrade Wizard должен остановить и перезапустить ваши базы данных SQL Server 6.5 и SQL Server 2000 и что никто из пользователей не должен входить ни на какой из серверов баз данных, пока не будет завершена конвертация базы данных. Для продолжения нажмите на Yes.
Рис. 7.10. Экран Logon мастера SQL Server Upgrade WizardПримечание. C этого момента система будет переключаться между SQL Server 6.5 и SQL Server 2000.
- Появится экран Code Page Selection (Выбор кодовой страницы), при помощи которого вы сможете задать кодовую страницу сценариев (scripting code page), используемую при конвертации, определяющую набор символов. Всегда выбирайте стандартную настройку, за исключением случаев, когда вы хотите применять другой набор символов, отличающийся от того, который уже был у вас установлен. Для продолжения нажмите на Next.
- Мастер SQL Server Upgrade Wizard, во взаимодействии с базой данных SQL Server 6.5, определит, какие базы данных можно конвертировать в новый формат, а затем покажет список этих баз данных в экране Upgrade Databases to SQL Server 2000 (Обновлять базы данных к SQL Server 2000) (рис. 7.11).
Те базы данных, которые будут конвертироваться в новый формат, будут показаны в списке в правом поле. Чтобы исключить базу данных из процесса конвертации в новый формат, выберите ее имя в списке в поле Include these databases и нажмите на экранную кнопку Exclude. Эта исключенная база данных появится в списке в левом поле. Не нужно исключать базы данных из процесса конвертации, единственной причиной такого решения может быть лишь случай, когда вы больше не собираетесь пользоваться этой базой данных. Для продолжения нажмите на Next.
- Появится экран Database Creation (Создание баз данных) (рис. 7.12). При помощи этого экрана вы можете указать, как будут создаваться базы данных. Обычно выбирают конфигурацию, предлагаемую по умолчанию. Если вы хотите указать другое местоположение файлов данных, то измените конфигурацию. Для продолжения нажмите на Next.
Рис. 7.11. Экран Upgrade Databases to SQL Server 2000 (Обновлять базы данных к SQL Server 2000)
Рис. 7.12. Экран Database Creation (Создание баз данных)Примечание.В стандартной конфигурации SQL Server 6.5 создает файлы, достаточно большие, чтобы в них могли бы храниться конвертируемые данные и объекты (в том виде, как они хранятся в базах данных SQL Server 6.5). Однако свободное место для этих файлов не выделяется. Для каждой конвертируемой базы данных также создается файл журнала. При помощи экранной кнопки Edit вы можете изменить: имена и местоположения файлов журналов, начальный размер файла и величину приращения размера файла.Вторая опция для создания баз данных – это Use databases already created in SQL Server 2000 (Применять базы данных, уже созданные в SQL Server 2000). С ее помощью вы можете создать в SQL Server 2000 файлы данных и журналов еще до того, как запустите мастер обновления, и SQL Server будет применять эти базы данных для хранения конвертированных данных.
Третья опция – использовать сценарий SQL для создания файлов баз данных. Этот сценарий должен содержать оператор CREATE DATABASE, необходимый для создания файлов баз данных и журналов, используемых при конвертации. Чтобы найти и указать нужный сценарий, нажмите на экранную кнопку Browse.
Мы не рекомендуем пользоваться второй и третьей опциями, потому что вы должны использовать в SQL Server 2000 такие же имена баз данных, что были и в SQL Server 6.5, а файлы SQL Server 2000 могут занимать на диске больше места, чем исходные файлы SQL Server 6.5. Если вы воспользуетесь опцией, применяемой по умолчанию, то SQL Server произведет для вас оценку увеличения места на диске, занимаемого данными.
- Появится экран System Configuration (Конфигурация системы)( рис. 7.13). При помощи этого экрана вы можете задать, какие системные объекты и настройки должны передаваться в новую базу данных. Если установить флажок Server Configuration (Конфигурация сервера), то будут конвертированы все регистрационные данные для обычных и дистанционных входов в систему. Если установить флажок SQL Executive Settings (Настройки исполнения SQL), то будут конвертированы все запланированные задания (scheduled tasks). Если установить флажок Replication Settings (Настройки репликации), то будет конвертироваться и поддержка репликации. В нашем примере флажок Replication Settings отключен, потому что для наших баз данных SQL Server 6.5 репликация не применялась, поэтому и конвертировать нечего. (О репликации баз данных см. лекцию 26.)
Рис. 7.13. Экран System Configuration (Конфигурация системы)При помощи группы селективных кнопок Advanced settings (Дополнительные настройки) вы можете задать настройки ANSI Nulls (Нули ANSI) и Quoted Identifiers (Идентификаторы в кавычках). Настройка ANSI Nulls влияет на работу операций сравнения, использующих нулевые значения. Если установить эту настройку на On (Включить), то операции сравнения ( = и <> ) будут всегда возвращать результат NULL, если один из аргументов операции сравнения будет NULL. Если установить эту настройку на Off (Выключить), то операции сравнения будут возвращать TRUE, если оба аргумента будут NULL, и возвращать FALSE, если один аргумент будет NULL, а другой – не NULL.
Настройка Quoted Identifiers задает, каким образом SQL Server 2000 будет обрабатывать символы двойных кавычек. Если установить эту настройку на On, то символы двойных кавычек будут обозначать идентификаторы, например имена колонок. Если установить эту настройку на Off, то символы двойных кавычек будут обозначать символьные строки, как и символы одинарных кавычек. Если нажать на Mixed (Смесь), то SQL Server 2000 конвертирует объекты с применением той настройки Quoted Identifiers, какая была и в SQL Server 6.5. Если вы не знаете точно, как следует установить эту настройку, то лучше нажать на Mixed. Для продолжения нажмите на Next.
Рис. 7.14. Экран Completing the SQL Server Upgrade Wizard (Завершение мастера обновления SQL Server) - После некоторой задержки появится экран Completing the SQL Server Upgrade Wizard (Завершение мастера обновления SQL Server) (рис. 7.14). При помощи этого экрана вы можете посмотреть все выбранные вами настройки конвертации. Если вы захотите внести в них какие либо изменения, то нажмите на Back и поменяйте настройки. Если ничего менять не надо, то нажмите на Finish, чтобы продолжить процесс конвертации.
- Появится диалоговое окно SQL Server Upgrade Script Interpreter (Интерпретатор сценария обновления SQL Server) (рис. 7.15). В этом диалоговом окне отображается исполняющийся список обновляемых объектов, благодаря чему администратор может в какой-то степени участвовать в ходе процесса обновления.
Рис. 7.15. Диалоговое окно SQL Server Upgrade Script Interpreter (Интерпретатор сценария обновления SQL Server)Примечание. Процесс конвертации может занять несколько часов, в зависимости от объема конвертируемых баз данных и от применяемых вами настроек проверок конвертируемых баз данных.
После завершения процесса обновления появится диалоговое окно Upgrade Complete (Обновление завершено). Нажмите на OK, чтобы убрать его с экрана, а затем нажмите на Close, чтобы закрыть диалоговое окно интерпретатора сценария обновления SQL Server.
Поздравляем! Вы только что обновили свои базы данных SQL Server 6.5 к формату SQL Server 2000.
Инсталляция клиентских компонент
Инсталляция клиентских файлов SQL Server так же проста, как и инсталляция самого SQL Server. Для установки клиентских файлов SQL Server на компьютере-клиенте нужно выполнить следующие действия:
- Выполните пункты 1-9 из последовательности действий для локальной инсталляции.
- Когда появится диалоговое окно Installation Definition, нажмите на Client Tools Only (Только клиентские инструментальные средства), а затем, чтобы продолжить работу, нажмите на Next.
- В появившемся окне Select Components (Выбор компонент) нажмите на нужные опции, а затем нажмите на Next. Вы можете выбрать Management Tools, Client Connectivity, Books Online, Development Tools, Code Samples либо любое сочетание этих опций. По умолчанию выбраны опции Management Tools, Client Connectivity, Books Online и Development Tools.
- Когда появится диалоговое окно Start Copying Files, нажмите на Next, чтобы продолжить работу.
Заключение
Теперь вам, наверно, понятно, что небольшие усилия по планированию окупятся благодаря "гладкой" инсталляции SQL Server 2000. Конвертация из старой версии SQL Server также пройдет быстро и беспроблемно, если вы воспользуетесь инструментальными средствами, имеющимися в SQL Server 2000. Теперь, когда СУБД SQL Server 2000 установлена, вам нужно научиться создавать базы данных и управлять ими. Для начала следует освоить SQL Server Enterprise Manager. В лекции 8 вы узнаете, как конфигурировать и администрировать службу SQL Server и процессы сервера, а также как запускать, останавливать и приостанавливать службу SQL Server.
Лекция 8. Работа со службами Microsoft SQL Server Services
Установив Microsoft SQL Server 2000, вы можете начать им пользоваться. Но до того, как вы сможете входить в систему и начнете строить свою базу данных, нужно научиться запускать службу SQL Server и ее компоненты – SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search. Эти компоненты, описанные в данной лекции, исполняются как отдельные службы, дополняющие службу SQL Server. В данной лекции мы также расскажем, как запускать, останавливать и управлять этими службами при помощи трех инструментальных средств – SQL Server Service Manager, SQL Server Enterprise Manager и Windows 2000 Service Control Manager.
Важно, чтобы вы научились управлять службой SQL Server 2000 при помощи Enterprise Manager. Обратите внимание, что данная лекция дает лишь краткое знакомство с Enterprise Manager. Многие задачи, решаемые с помощью Enterprise Manager, будут рассмотрены в следующих лекциях. Это, например, такие задачи, как создание баз данных и объектов, конфигурирование настроек сервера, конфигурирование репликации и управление репликацией, управление резервным копированием. А в другой лекции основное внимание будет уделено применению Enterprise Manager для управления службой SQL Server и другими службами.
Службы SQL Server
Служба – это программа или процесс, выполняющие специфические функции поддержки других программ. Когда вы запускаете SQL Server, в операционной системе Windows NT или Windows 2000 запускается служба SQL Server. Эта служба управляет файлами баз данных, исполняет операторы Transact-SQL (T-SQL), распределяет ресурсы среди пользовательских соединений, исполняющихся одновременно, проверяет непротиворечивость данных и выполняет еще много других задач. Если вы инсталлируете один или несколько экземпляров SQL Server, то службы для отдельных экземпляров SQL Server будут иметь имена MSSQL$ИмяЭкземпляра, где ИмяЭкземпляра – имя экземпляра, назначенное вами при инсталляции. Соответственно, службы SQL Server Agent для экземпляров SQL Server будут иметь имена SQLAGENT$ИмяЭкземпляра. Однако для всех экземпляров SQL Server будет только по одной инсталляции Microsoft Distributed Transaction Coordinator и Microsoft Search.
Программные компоненты этих трех служб вы получаете в рамках лицензии на копию SQL Server. Инсталляция SQL Server Agent производится по умолчанию при инсталляции SQL Server. Если у вас не инсталлированы Microsoft Distributed Transaction Coordinator и Microsoft Search, то вы можете снова запустить инсталляционную программу SQL Server, чтобы установить эти компоненты, которые имеют там названия DTC Client Support и Full-Text Search, соответственно. А сейчас мы расскажем, что делает каждая из этих трех служб.
SQL Server Agent осуществляет планирование и исполнение заданий, оповещений, извещений и планов обслуживания базы данных. Без этой службы работа администратора баз данных станет гораздо более трудной, а может, вообще невозможной. Благодаря SQL Server Agent можно автоматизировать рутинные процедуры по обслуживанию базы данных. Например, вы можете создать задание, которое будет автоматически выполнять резервное копирование базы данных ежесуточно в 1 час пополуночи, и другое задание, которое будет автоматически выполнять резервное копирование журнала транзакций каждые полчаса. Чтобы следить за производительностью вашей системы, можно создать оповещение о состоянии производительности, которое будет информировать вас, если загруженность центрального процессора сервера превысит 90%. Для решения подобных задач нужно запускать службу SQL Server Agent, которую можно сконфигурировать на автоматический запуск при запуске SQL Server, а можно запускать и вручную. Вам следует сконфигурировать ее на автоматич еский запуск, что будет гарантировать исполнение ваших запланированных заданий, оповещений и извещений. В лекции 30 будет рассказано, как создать план обслуживания базы данных, а в лекции 31 – как при помощи SQL Server Agent назначать задания, оповещения и извещения.
Microsoft Distributed Transaction Coordinator – это администратор транзакций (transaction manager), при помощи которого в транзакции ваших приложений можно включать данные из различных источников, в том числе данные из баз данных с удаленных компьютеров. Это значит, что при помощи одной транзакции можно обновлять данные на многих серверах, доступных через сеть. Администратор транзакций гарантирует, что все обновления станут постоянными для всех источников данных (если транзакция зафиксирована) или, в случае ошибки, что для всех источников данных будет произведен откат всех изменений. (Об администраторе транзакций Microsoft Distributed Transaction Coordinator см. лекцию 25.)
Запускайте службу Microsoft Search, когда вам нужна поддержка полнотекстного индексирования и поиска. Благодаря полнотекстному индексированию возможно выполнение более сложного поиска среди данных, содержащих текстовые строки. Например, вы можете искать слова, близкие к заданному слову, или можете искать определенную фразу.
Как мы уже говорили, имеется несколько инструментальных средств для остановки и запуска служб SQL Server: SQL Server Service Manager, SQL Server Enterprise Manager и Windows 2000 Service Control Manager. Давайте сначала рассмотрим SQL Server Service Manager, при помощи которого можно управлять службами SQL Server, SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search.
Применение SQL Server Service Manager
Для запуска или остановки служб SQL Server при помощи SQL Server Service Manager, выполните следующие действия (а ещё, как вы увидите, службу SQL Server можно и приостанавливать).
- Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Microsoft SQL Server, а затем выберите Service Manager, чтобы открылось приложение Service Manager (рис. 8.1).
- В выпадающих списках Server и Services будут показаны локальное имя сервера и название службы SQL Server. В ниспадающем списке Server нужно выбрать имя сервера, службами которого вы хотите управлять. (Обратите внимание, что вы можете применять Service Manager для управления серверами через сеть.) В ниспадающем списке Services выберите службу, которой вы хотите управлять: SQL Server (MSSQLSERVER), Microsoft Distributed Transaction Coordinator (Distributed Transaction Coordinator), Microsoft Search (Microsoft Search) или SQL Server Agent (SQLSERVERAGENT).
Рис. 8.1. SQL Server Service Manager - Теперь, нажимая на соответствующие экранные кнопки, вы можете запустить или остановить выбранную службу. А если вы выбрали службу SQL Server, то вы сможете еще и приостанавливать ее (pause). Символ в кружочке, несколько левее и ниже центра диалогового окна, показывает текущее состояние выбранной службы. Если служба SQL Server находится в приостановленном состоянии, то для её возобновления нажмите на кнопку Start/Continue (Запустить/Продолжить). Приостановка (pausing) SQL Server запрещает пользователям входить в систему, и вы можете попросить пользователей завершить свои работы и выйти из системы в течение некоторого времени, пока вы не остановите SQL Server. Если остановить SQL Server без приостановки, то все процессы SQL Server будут завершены немедленно. Остановка (stopping) запрещает новые соединения и отсоединяет пользователей, которые соединены в данный момент.
- Когда Service Manager запущен, его окно обновляется через каждые 5 секунд. Чтобы изменить интервал обновления, нажмите на маленький значок-иконку в левом верхнем углу диалогового окна, тогда появится меню System, в котором нужно выбрать Options, в результате чего появится диалоговое окно SQL Server Service Manager Options (рис. 8.2).
Рис. 8.2. Диалоговое окно SQL Server Service Manager OptionsВ поле Polling interval (Интервал опроса) можно задать другой интервал опроса для служб (в секундах). Если вы установите флажок Verify service control action (Подтверждать действия по управлению службой), то Service Manager будет проверять все ваши действия по запуску, остановке и приостановке служб, запрашивая в диалоговом окне ваше подтверждение на выполнение действия. Настройки интервала опроса и подтверждения действий задаются одинаковыми для всех четырех служб.
Примечание. Если службы SQL Server и SQL Server Agent не сконфигурированы на автоматический запуск, то вы должны запускать их вручную.
Применение Windows 2000 Service Control Manager
Службы SQL Server можно запускать и останавливать также при помощи Windows 2000 Service Control Manager, как локально, так и через сеть. Вы можете даже сконфигурировать службы SQL Server на автоматический запуск при каждом запуске вашего компьютера. Чтобы службы SQL Server запускались автоматически из Windows 2000 Service Control Manager, выполните следующие действия.
- Нажмите на экранную кнопку Start, наведите курсор на Programs, затем наведите курсор на Administrative Tools, а затем выберите Services, чтобы запустить Service Control Manager (рис. 8.3).
Рис. 8.3. Windows 2000 Service Control Manager - Прокрутите список служб и найдите в нем Distributed Transaction Coordinator, Microsoft Search, MSSQLSERVER и SQLSERVERAGENT. Нажмите правой кнопкой мыши на ту службу, настройки запуска которой вы хотите конфигурировать, а затем выберите Properties в контекстном меню, в результате чего появится окно Properties (Свойства) (рис. 8.4).
- В ниспадающем списке Startup type (Тип запуска) выберите Automatic, Manual (Вручную) или Disabled (Выключена). Если выбрать Automatic, то служба будет запускаться автоматически всякий раз при включении компьютера. При выборе Manual потребуется запускать эту службу вручную всякий раз, когда вы хотите ее использовать. Выбор Disabled служить для предотвращения запуска службы (как автоматического, так и ручного). Для сохранения выбранной конфигурации нажмите на OK.
Рис. 8.4. Окно свойств SQL Server Agent - В окне Properties имеются еще три вкладки. Вкладка Log On позволяет задать учетную запись, под которой данная служба будет входить в систему. Вкладка Recovery позволяет задать настройки на случай отказа выбранной службы. При помощи вкладки Dependencies (Зависимости) можно посмотреть, от каких служб зависит выбранная служба и какие службы зависят от нее (если таковые имеются). Например, служба SQL Server Agent зависит от службы SQL Server. Служба SQL Server Agent не может быть запущена, если служба SQL Server остановлена.
Применение SQL Server Enterprise Manager
Enterprise Manager – это часть Microsoft Management Console (MMC), "Консоли Управления Microsoft". MMC является основным приложением, служащим для управления всеми аспектами работы компьютера под управлением Windows 2000 Server. В Windows 2000 и в последующих версиях Windows, MMC будет иметь гораздо более важную роль при управлении приложениями Microsoft BackOffice, такими как Microsoft Exchange Server, Microsoft Proxy Server, Microsoft Site Server, Microsoft Systems Management Server и Microsoft SNA Server.
Управление SQL Server
Для конфигурирования и управления инсталляцией SQL Server чаще всего применяется Enterprise Manager. В то время как Service Manager позволяет только запускать, приостанавливать и останавливать службы, Enterprise Manager может останавливать и запускать сервер, а также выполнять следующие действия.
- Регистрировать сервер.
- Конфигурировать локальные и удаленные серверы.
- Конфигурировать многосерверные инсталляции и управлять ими.
- Выполнять настройку входа в систему и добавлять новых пользователей, системных администраторов и операторов.
- Назначать пароль системного администратора (sa).
- Создавать и планировать задания.
- Создавать оповещения и конфигурировать SQL Server для общения с системными администраторами через электронную почту.
- Устанавливать базы данных, таблицы, индексы, представления, хранимые процедуры, правила, триггеры, настройки по умолчанию, устройства для резервного копирования, журналы ошибок и управлять ими.
- Управлять другими службами SQL Server.
Enterprise Manager (рис. 8.5) является как бы "универсальным средством" для решения всех этих и других задач. В оставшейся части данной лекции мы поможем вам начать пользоваться средством Enterprise Manager. А в других лекциях мы расскажем, как применять Enterprise Manager для решения более сложных задач по управлению SQL Server.
Рис. 8.5. SQL Server Enterprise Manager
Ниже перечислены четыре задачи, которые можно выполнять при помощи Enterprise Manager. Эти задачи нужно выполнить, когда вы впервые начинаете пользоваться некоторой инсталляцией SQL Server. Затем, в последующих разделах, мы более подробно расскажем о каждой из этих задач.
- Создание группы серверов. Создав группу серверов, вы сможете ограничить доступ так, что информация будет доступна только для этой группы. Администрирование учетных записей становится проще, когда учетные записи с одинаковыми потребностями доступа к ресурсам объединяются в группы.
- Регистрация вашего сервера. Прежде чем начать управлять сервером, вы должны зарегистрировать его c MMC.
- Доступ к свойствам вашего сервера. Как только вы зарегистрируете свой сервер, можно будет просматривать и конфигурировать множество свойств. Если вы работаете в многосерверном окружении, то вы можете применять Enterprise Manager для управления всеми серверами и конфигурирования всех серверов из одного места.
- Изменение стандартного пароля администратора. При инсталляции SQL Server он конфигурируется как не имеющий пароля для учетной записи системного администратора, применяемой по умолчанию. Прежде чем начать пользоваться SQL Server, вам следует задать этот пароль.
Создание групп сервера
При помощи Enterprise Manager вы можете создавать группы серверов, которые окажутся полезными для решения ваших административных задач. Группы серверов позволяют организовать наборы взаимосвязанных серверов для удобного доступа, подобно тому, как папки позволяют организовывать наборы взаимосвязанных файлов. После этого вы сможете одной командой выполнять действия, которые будут оказывать влияние на все серверы группы, а не повторять одну и ту же команду для каждого сервера*. По умолчанию, при инсталляции SQL Server, создается группа с названием SQL Server Group. Чтобы создать группу серверов, выполните следующие действия.
- Нажмите на экранную кнопку Start, наведите курсор на Programs, наведите курсор на Microsoft SQL Server 2000, а затем выберите Enterprise Manager, чтобы запустить приложение Enterprise Manager.
- В левой части окна Enterprise Manager будут показаны папки групп серверов (как подпапки Microsoft SQL Server), а в правой части окна будут показаны значки-иконки групп серверов. Чтобы создать группу серверов SQL Server, нажмите правой кнопкой мыши на папку Microsoft SQL Server, а затем выберите New SQL Server Group в появившемся контекстном меню.
- Появится диалоговое окно Server Groups, введите в него с клавиатуры имя новой группы серверов (рис. 8.6). Если вы нажмете на селективную экранную кнопку Sub-group of (Подгруппа в ...), то сможете выбрать группу, для которой новая группа серверов будет подгруппой. Если вы нажмете на Top level group (Группа высшего уровня), то ваша новая группа серверов будет группой SQL Server самого высшего уровня, того же уровня, что и группа SQL Server Group. Чтобы сохранить свою новую группу, нажмите на OK.
Регистрация сервера
После того как вы создадите группу SQL Server, вам надо будет зарегистрировать свои локальные или удаленные серверы в качестве членов этой группы. Чтобы зарегистрировать сервер, выполните следующие действия.
Рис. 8.6. Диалоговое окно Server Groups
- Нажмите правой кнопкой мыши на значок-иконку группы серверов в правой панели окна Enterprise Manager. (Если заголовок Microsoft SQL Server раскрыт, то вы можете также нажать правой кнопкой мыши на имя папки группы в левой панели окна.) В появившемся контекстном меню выберите New SQL Server Registration.
- Появится стартовый экран мастера Register SQL Server Wizard (Мастер регистрации SQL Server). Этот мастер поможет вам в прохождении процесса выполнения многих рутинных административных задач, решаемых с помощью Enterprise Manager. Для продолжения регистрации сервера нажмите на Next.
- Появится экран Select а SQL Server (Выберите SQL Server) (рис. 8.7). В списковом поле Available Servers (Доступные серверы) будут показаны инсталляции SQL Server, доступные через сеть. Выберите серверы, которые вы хотите зарегистрировать (или наберите с клавиатуры имя сервера в текстовом поле), а затем нажмите на Add, чтобы переместить имя сервера в списковое поле Added Servers (Добавленные серверы). Завершив действия по выбору, нажмите на Next.
Рис. 8.7. Экран Select а SQL Server (Выберите SQL Server) - Появится экран Select An Authentication Mode (Выберите режим аутентификации). Выберите тип защиты, которую вы хотите применять при соединении с вашей инсталляцией SQL Server. (О защите SQL Server см. лекцию 34.) (Если вы выполнили "типичную" инсталляцию, то SQL Server уже сконфигурирован на применение режима аутентификации Windows NT.) Для продолжения нажмите на Next.
- Появится экран Select SQL Server Group (Выберите группу SQL Server) (рис. 8.8). Вы можете выбрать уже существующую группу, в которую добавите свой сервер, а можете создать для своего сервера группу высшего уровня. Если вы хотите добавить свой сервер в существующую группу, то нажмите на первую селективную кнопку экрана, а затем выберите имя группы в выпадающем списке. А если вы хотите создать группу, то нажмите на вторую, а затем введите с клавиатуры имя группы в текстовое поле. Для продолжения нажмите на Next.
Рис. 8.8. Экран Select SQL Server Group (Выберите группу SQL Server) - Появится экран Completing The Register SQL Server Wizard (Завершение мастера регистрации SQL Server). Серверы, показанные в списке, будут зарегистрированы. Если вы хотите внести какие-либо изменения, то нажмите на Back, а если изменения не нужны, то нажмите на Finish, и тогда запустится процесс регистрации.
- Появится диалоговое окно Register SQL Server Messages (Сообщения регистрации SQL Server) (рис. 8.9), являющееся подтверждением успешности вашей регистрации. Чтобы закрыть это окно, нажмите на Close.
Рис. 8.9. Диалоговое окно Register SQL Server Messages (Сообщения регистрации SQL Server)
Доступ к свойствам сервера
После успешной регистрации вашего сервера с помощью Enterprise Manager вы получаете доступ ко всем его свойствам, базам данных и объектам. Чтобы посмотреть свойства и объекты только что зарегистрированного сервера, сначала раскройте имя группы сервера в левой панели окна Enterprise Manager. Появится список всех серверов из этой группы. Затем раскройте имя сервера, чтобы стали видны его свойства (рис. 8.10). (В последующих лекциях будет подробно объяснено, как управлять этими свойствами и как их конфигурировать.)
Рис. 8.10. Свойства и объекты сервера
Изменение стандартного пароля
Все инсталляции SQL Server имеют встроенную административную учетную запись, "sa" ("sa" расшифровывается как system administrator, системный администратор). У новых инсталляций SQL Server, пользовательской учетной записи не назначается никакого пароля. Чтобы обеспечить наивысший уровень защищенности ваших инсталляций SQL Server, учетной записи sa надо назначить пароль. Для этого выполните следующие действия.
- Получите доступ к свойствам сервера, у которого вы хотите изменить свойства учетной записи sa (в соответствии с описанием в предыдущем разделе).
- Раскройте папку Security, а затем нажмите на Logins, чтобы в правой панели появились бы установленные пользовательские учетные записи SQL Server (рис. 8.11).
- Нажмите правой кнопкой мыши на учетную запись sa, а затем выберите Properties в появившемся контекстном меню. Откроется окно SQL Server Login Properties (Свойства входа в систему SQL Server) (рис. 8.12).В окне SQL Server Login Properties можно задать и некоторые другие настройки (см. лекцию 34).
- Введите с клавиатуры новый пароль в текстовое поле Password, а затем нажмите на OK. Откроется диалоговое окно Confirm Password для проверки введенного пароля на отсутствие опечаток.
Рис. 8.11. Установленные пользовательские учетные записи SQL Server
Рис. 8.12. Окно SQL Server Login Properties (Свойства входа в систему SQL Server) - Повторите ввод пароля и затем нажмите на OK. Вы только что выполнили действие, критически важное для обеспечения защиты вашей инсталляции SQL Server.Предупреждение.Вы должны надежно запомнить выбранный пароль. Если вы его забудете, то придется переинсталлировать SQL Server*.
Управление другими службами
Enterprise Manager можно также применять для управления другими службами-компонентами SQL Server: SQL Server Agent, Microsoft Distributed Transaction Coordinator и Microsoft Search. Как мы уже говорили раньше, он является единственным инструментальным средством, при помощи которого можно управлять этими службами, так как при помощи Service Control Manager и SQL Server Service Manager службы-компоненты можно только запускать и останавливать.
SQL Server Agent
Enterprise Manager имеет удобный пользовательский интерфейс для управления службой SQL Server Agent. Для доступа к свойствам службы SQL Server Agent выполните следующие действия.
- Находясь внутри Enterprise Manager, раскройте обозначение сервера, доступ к которому вы осуществляете, а затем раскройте папку Management (рис. 8.13).
Рис. 8.13. Папка Management в Enterprise Manager - Нажмите правой кнопкой мыши на SQL Server Agent в левой панели или на значок-иконку SQL Server Agent в правой панели, в результате чего появится контекстное меню. При помощи этого меню вы можете: останавливать или запускать службу SQL Server Agent; просматривать журнал ошибок; запускать мастеры, чтобы данный сервер был основным (master) либо целевым (target) для выполнения заданий; создавать задания, оповещения и операторы; просматривать окно свойств (см. лекцию 31).
- В этом контекстном меню выберите Properties (Свойства). Появится окно свойств SQL Server Agent, показанное на рис. 8.14.
- В этом окне вы можете сконфигурировать различные настройки для службы SQL Server Agent, имеющиеся на многочисленных вкладках – General (Общие), Advanced (Дополнительно), Alert System (Система оповещений), Job System (Система заданий) и Connection (Соединение). В нижней части окна имеется кнопка Help, с помощью которой можно получить подробные объяснения обо всех настройках, имеющихся на открытой вкладке.
Рис. 8.14. Окно свойств для SQL Server Agent
Microsoft Distributed Transaction Coordinator
Что касается службы Microsoft Distributed Transaction Coordinator, то Enterprise Manager может только запускать ее и останавливать. Для этого раскройте обозначение нужного сервера, а затем раскройте папку Support Services (Поддержка служб) (рис. 8.15).
Нажмите правой кнопкой мыши на Distributed Transaction Coordinator в левой или в правой панели. Для запуска или остановки службы выберите Start либо Stop в контекстном меню.
Рис. 8.15. Папка Support Services (Поддержка служб)
Microsoft Search
Чтобы получить доступ к меню с настройками для службы Microsoft Search, раскройте папку Support Services, как было рассказано в предыдущем разделе, а затем нажмите правой кнопкой мыши на Full-Text Search (Полнотекстный поиск) в левой или в правой панели. Из этого меню вы можете запускать и останавливать службу Microsoft Search, очищать каталоги полнотекстного поиска, а также просматривать свойства службы.
Заключение
В качестве основных средств управления все администраторы применяют SQL Server Service Manager и Enterprise Manager. В данной лекции мы дали обзор основных действий, необходимых для управления и конфигурирования вашей инсталляции SQL Server и служб SQL Server. (Более сложные вопросы администрирования будут рассмотрены в нашем курсе далее.) Теперь вы уже сможете начать создавать свои собственные базы данных и таблицы. Как вы увидите в следующих двух лекциях, SQL Server Enterprise Manager является важной компонентой, нужной для создания баз данных и таблиц и управления ими.
Лекция 9. Создание баз данных
После того как вы инсталлировали Microsoft SQL Server 2000, а затем спроектировали размещение баз данных и дисков, можно приступить к созданию баз данных. SQL Server 2000 применяет усовершенствованные методы хранения данных и управления дисковой памятью, появившиеся в SQL Server 7. В более ранних версиях продукта для размещения данных использовались логические устройства и сегменты фиксированного размера, но SQL Server 2000 использует файлы и группы файлов, которые могут быть сконфигурированы на автоматический рост или уменьшение. В данной лекции будет подробно рассказано о файлах и группах файлов, а также рассказано, как управлять ростом базы данных. Вы также познакомитесь с тремя методиками создания баз данных, узнаете, как просматривать информацию о базах данных и как удалять ненужные базы данных.
Структура базы данных
Каждая база данных SQL Server состоит из набора файлов операционной системы. Эти файлы могут группироваться в группы файлов, что облегчает их администрирование, помогает в размещении данных и повышает производительность. В данном разделе вы познакомитесь с файлами и группами файлов SQL Server и узнаете об их значении для создания баз данных.
Файлы
Как мы уже сказали, база данных SQL Server состоит из набора файлов операционной системы. Файл базы данных может быть либо файлом данных, либо файлом журнала. Файлы данных служат для хранения данных и объектов, таких как таблицы, индексы, представления, триггеры и хранимые процедуры. Имеется два типа файлов данных: первичные и вторичные. Файлы журналов служат только для хранения информации из журналов транзакций. Место на диске, отводимое для файлов журналов всегда должно администрироваться отдельно от места, отводимого для данных, и никогда не должно быть частью файла данных.
Каждая база данных должна создаваться хотя бы с одним файлом данных и с одним файлом журнала; файлы не могут быть использованы более чем в одной базе данных – т.е., базы данных не могут разделять файлы (использовать файлы совместно). В приведенном ниже перечне указаны три типа файлов, которые могут быть использованы в базах данных:
- Первичные файлы данных. Первичные файлы данных содержат всю информацию для запуска базы данных и ее системных таблиц и объектов. Они указывают на другие файлы, созданные в базе данных. Они могут также содержать таблицы и объекты, задаваемые пользователем, хотя это и не обязательно. Каждая база данных может иметь ровно один первичный файл. Для этих файлов рекомендуется применять расширение .mdf.
- Вторичные файлы данных. Вторичные файлы данных не являются обязательными. Они могут хранить данные и объекты, которые отсутствуют в первичном файле. База данных может вообще не иметь ни одного вторичного файла (если все ее данные хранятся в первичном файле). Можно иметь ноль, один или несколько вторичных файлов. Для некоторых баз данных требуется иметь несколько вторичных файлов, чтобы размещать данные по нескольким отдельным дискам. (Это не RAID-массивы дисков, как вы увидите из следующего раздела). Для этих файлов рекомендуется применять расширение .ndf.
- Файлы журналов транзакций. Файлы журналов транзакций хранят всю информацию из журнала транзакций, служащую для восстановления базы данных. Каждая база данных должна иметь хотя бы один файл журнала, а может иметь и несколько файлов журналов. Для этих файлов рекомендуется применять расширение .ldf.
Простая база данных может иметь один первичный файл данных, достаточно большой, чтобы в него могли поместиться все данные и объекты и один файл – журнал транзакций. Более сложная база данных может иметь один первичный файл данных, пять вторичных файлов данных и два файла – журнала транзакций.
Но как же данные смогут размещаться по многим файлам данных? А вот для этого и применяются группы файлов.
Группы файлов
При помощи групп файлов можно группировать файлы, это нужно для администрирования и размещения данных. (Группы файлов похожи на сегменты в Microsoft SQL Server 6.5 и в более ранних версиях.) Применение групп файлов позволяет повысить производительность базы данных, т.к. становится возможным создание базы данных, размещенной на многих дисках, на многих контроллерах и на RAID-массивах. (Про RAID-массивы см. лекцию 5.) При помощи групп файлов можно создавать таблицы и индексы, размещаемые на заданных физических дисках, контроллерах и массивах дисков. В данной лекции мы рассмотрим некоторые примеры такой работы.
Имеются три типа групп файлов со следующими основными свойствами:
- Первичные группы файлов. Содержат первичный файл данных и все остальные файлы, не помещенные в другие группы файлов. К первичной группе файлов базы данных отнесены системные таблицы, задающие пользователей, объекты и полномочия для этой базы данных. SQL Server автоматически создает эти системные таблицы всякий раз, когда вы создаете базу данных.
- Пользовательские группы файлов. Все группы файлов, заданные пользователем в процессе создания (или последующего изменения) базы данных. Создавая таблицу или индекс, вы можете задать, чтобы они помещались в заданную пользовательскую группу файлов.
- Стандартная группа файлов. Содержит все страницы для таблиц и индексов, у которых при создании не была задана конкретная группа файлов. По умолчанию, стандартной группой файлов является первичная группа файлов. Члены роли db_owner могут менять стандартную группу файлов, делая стандартной ту либо иную группу файлов. В каждый момент времени стандартной может быть лишь какая-то одна группа файлов, и, повторим, если стандартная группа файлов не была задана явно, то первичная группа файлов автоматически будет стандартной. Чтобы изменить стандартную группу файлов, воспользуйтесь следующей командой Transact SQL (T-SQL):(Применять T-SQL вы научитесь в последних лекциях данного курса.) Вы можете пожелать изменить стандартную группу файлов так, чтобы ею стала одна из ваших пользовательских групп файлов, тогда все объекты, создаваемые в вашей базе данных, будут автоматически создаваться в указанной вами группе файлов, и вам не придется всякий раз задавать это.
ALTER DATABASE имя_базы_данных MODIFY FILEGROUP имя_группы_файлов DEFAULT
Чтобы повысить производительность, вы можете управлять размещением данных, создавая таблицы и индексы в разных группах файлов. Так, вы можете пожелать поместить таблицу, доступ к которой бывает часто, в группу файлов на большом массиве дисков (например, составленным из 10 дисков), а другую таблицу, доступ к которой бывает реже, поместить в другую группу файлов, расположенную на отдельном, меньшем массиве дисков (например, из 4 дисков). Таким образом, можно размещать таблицы, доступ к которым происходит чаще, по большему количеству дисков, позволяя этим дискам осуществлять параллельный ввод-вывод. Если вы не применяете массивы RAID и у вас имеется несколько дисковых накопителей, то у вас остается возможность применения групп файлов. Например, вы можете создать по отдельному файлу для каждого дискового накопителя, разместив каждый файл в отдельную пользовательскую группу файлов. Тогда вы сможете поместить каждую таблицу или индекс в отдельный файл (и на отдельный диск), назначив группу файлов при создании этой таблицы или индекса. Пример размещения файлов показан на рис. 9.1: один первичный файл данных размещен в первичной группе файлов на диске C, по одному вторичному файлу данных размещено в каждой из пользовательских групп файлов (FG1 и FG2) на дисках E и F и один файл-журнал размещен на диске G. После этого вы можете создавать таблицы и индексы в каждой из пользовательских групп файлов – FG1 или FG2.
Рис. 9.1. Применение групп файлов для управления размещением данных
А может быть, вы будете применять пользовательскую группу файлов для распределения данных по нескольким дискам. На рис. 9.2 показана пользовательская группа файлов FG1, состоящая из двух вторичных файлов данных, один из которых находится на диске E, а другой – на диске F (диске G размещен файл-журнал, а на C – первичный файл). В этом примере мы снова предполагаем, что каждый файл базы данных создан на отдельном физическом дисковом накопителе, и у нас нет аппаратной реализации RAID. Таблицы и индексы, созданные в этой пользовательской группе файлов, будут размещены сразу на двух дисках, потому что SQL Server применяет стратегию пропорционального расходования ресурсов.
Рис. 9.2. Применение одной группы файлов для распределения данных по нескольким дискам
Если вы применяете RAID-систему, то вам может потребоваться распределить данные из большой таблицы по нескольким логическим дискам-массивам, сконфигурированным на двух или на нескольких RAID-контроллерах. Для этого вам надо будет создать пользовательскую группу файлов, с файлами, соответствующими каждому из этих контроллеров. Допустим, вы создали два вторичных файла данных, каждый – на своем массиве дисков, а каждый логический массив состоит из восьми физических дисков и сконфигурирован как RAID 5. Эти два массива обслуживаются двумя отдельными RAID-контроллерами. Чтобы создать таблицу или индекс, располагающуюся на обоих этих контроллерах (т.е. на всех 16 дисковых накопителях), создайте одну пользовательскую группу файлов, в которую поместите оба файла, а затем создайте таблицу или индекс в этой группе файлов. Пользовательская группа файлов FG1 распределена по 16 физическим дискам (двум логическим дискам – RAID-массивам) (см. рис. 9.3). Там также показаны первичный файл данных на другом контроллере (с RAID 1) и файл журнала еще на одном контроллере (с RAID 10).
SQL Server позволяет оптимизировать распределение ваших данных по дисковым накопителям, за счет автоматического пропорционального расслоения (распределения) данных по всем файлам группы файлов. "Расслоение" (striping) – это термин, применяемый для описания распределения данных по нескольким файлам базы данных. Расслоение файлов SQL Server работает независимо от расслоения дисков RAID-массивов и, как вы видели из наших примеров, может применяться как в сочетании с RAID, так и самостоятельно.
Чтобы обеспечить расслоение данных, SQL Server записывает данные в файлы в объемах, пропорциональных свободному месту, остающемуся в файлах (относительно свободному месту в других файлах). Место для таблиц и индексов распределяется в виде экстентов (extents). Экстент – это единица для измерения места на диске, один экстент состоит из 8 страниц, а одна страница состоит из 8 Кб, так что один экстент состоит из 64 Кб. Допустим, нужно распределить 5 экстентов на файл F1, в котором свободно 400 Мб, и на файл F2, в котором свободно 100 Мб; тогда 4 экстента будут распределены на файл F1 и один экстент распределен на файл F2. Оба файла заполнятся до конца примерно одновременно, благодаря чему операции ввода-вывода будут распределяться по дискам более равномерно. Пропорциональное заполнение будет применяться и для пользовательских, и для первичных групп файлов. Если задать все файлы в группе файлов имеющими одинаковый начальный размер, то данные, по мере их загрузки, будут распределяться по файлам равномерно. Этот метод, когда в группах создаются файлы одинакового начального размера, можно порекомендовать для равномерного распределения данных по дисковым накопителям и, одновременно с этим, для равномерного распределения операций ввода-вывода.
Рис. 9.3. Распределение пользовательской группы файлов по нескольким RAID-контроллерам
Другая польза от применения групп файлов состоит в том, что SQL Server может выполнять резервные копирования базы данных файлами или группами файлов. Если ваша база данных слишком велика, чтобы ее можно было скопировать за один раз, то вы можете копировать ее по частям. (О методике такого резервного копирования см. лекцию 32.)
Правила и рекомендации
Прежде чем создавать базу данных, вы должны выработать тщательно продуманную стратегию использования файлов и групп файлов. Для этого вам нужно знать следующие правила SQL Server:
- Файлы и группы файлов не могут использоваться более чем одной базой данных.
- Каждый файл может быть членом только одной группы файлов.
- Данные и информация из журнала транзакций не могут размещаться в одном и том же файле. Работа с дисковой памятью для журнала транзакций и с дисковой памятью для данных производится по-разному.
- Журнал транзакций никогда не является частью группы файлов.
- Если создать файл, который будет являться частью базы данных, то его нельзя будет переместить в другую группу файлов. Если вы хотите переместить файл, то его придется уничтожить и создать снова.
В дополнение к этим правилам имеются методики работы с файлами и группами файлов, про которые известно, что они дают хорошие результаты. Ниже приведены несколько рекомендаций общего характера, которые помогут спроектировать вашу базу данных:
- Большинство из баз данных обладает высокой производительностью, имея лишь первичный файл данных и один файл журнала транзакций. Такая конструкция базы данных рекомендуется для баз данных, не требующих особенно интенсивного ввода-вывода. Если же ваша система требует интенсивного ввода-вывода и ей нужно много дисковых накопителей, то вам, вероятно, понадобится применять пользовательские группы файлов, при помощи которых вы сможете распределить данные по нескольким дискам или массивам дисков, что обеспечит параллельный ввод-вывод.
- Всегда размещайте файлы журналов на отдельных физических дисках, а не на дисках, содержащих файлы данных (см. лекцию 5).
- Если вам нужно применять много файлов с данными, то используйте первичный файл данных только для системных таблиц и объектов, а для пользовательских данных и объектов создайте один или несколько вторичных файлов данных.
- Создавайте файлы и группы файлов так, чтобы они охватывали как можно больше физических дисков – это повысит возможности параллельной работы ввода-вывода для дисков и максимизирует производительность.
- Размещайте некластеризованные индексы интенсивно используемых таблиц в отдельных группах файлов не на тех же самых физических дисках, в которых содержатся сами данные из таблиц. Эта методика тоже позволяет осуществлять параллельный ввод-вывод для дисков. (Про индексы см.лекцию 17.)
- Разные таблицы, которые применяются в общих для них запросах, нужно по возможности размещать на разных физических дисках, тогда станет возможен параллельный ввод-вывод для дисков при работе алгоритма поиска данных.
Последние две рекомендации могут оказаться неверными для систем, применяющих тома RAID с большим количеством дисковых накопителей. Если у вас имеется много дисковых накопителей, то может оказаться, что таким же или лучшим решением станет распределение индексов и таблиц по максимально возможному количеству дисковых накопителей, чтобы обеспечить максимально большую параллельность ввода-вывода, допустимую для всех таблиц и индексов.
Автоматический рост файлов
В SQL Server имеются средства для обеспечения автоматического роста файлов, когда это необходимо. При создании файлов вы можете указать, можно ли разрешить, чтобы SQL Server автоматически увеличивал файлы. Если разрешить автоматический рост файлов, а по умолчанию, при создании базы данных, он разрешен, что и рекомендуется, то это избавляет администратора от забот по ручному отслеживанию роста размера файла.
Файлы создаются имеющими некоторый начальный размер. После того как этот начальный размер заполнится, SQL Server увеличит размер файла на некоторую заданную величину, называющуюся приращение роста (growth increment). Когда это добавленное свободное место заполнится, SQL Server добавит еще одно приращение роста. При необходимости, файл продолжит свой рост с заданным темпом до тех пор, пока не заполнится весь диск или пока его размер не достигнет ограничения на максимальный размер файла (если таковое ограничение задано).
Максимальный размер файла означает именно это – максимальный размер, до которого разрешается расти файлу. Эта величина тоже задается при создании файла, но может быть изменена впоследствии при помощи Enterprise Manager или команды ALTER DATABASE. Если максимальный размер файла не задан, то SQL Server будет увеличивать размер файла до тех пор, пока не заполнится все место на диске. Чтобы не истратить все место на диске (а в этом случае произойдет ошибка в работе SQL Server), задавайте максимальный размер для каждого файла. Если даже файл дорастет до максимального размера, вы сможете увеличить этот максимальный размер при помощи оператора ALTER DATABASE. Вы также можете создать еще один файл на том же (если там имеется свободное место) или на другом диске. Новый файл должен обязательно быть в той же самой группе файлов, что и первоначальный файл. Если позволить файлу расти без ограничений, как это задано по умолчанию, то вам придется создавать файл на другом диске, имеющем свободное место.
Как правило, нужно задавать автоматический рост файлов и максимальные размеры файлов. При создании базы данных максимальные размеры файлов задавайте такими, до которых, по вашему мнению, они окажутся способными вырасти. Несмотря на возможность автоматического роста файлов, все равно нужно регулярно следить за ростом базы данных – ежедневно или еженедельно, возможно лишь для того, чтобы вам самому быть в курсе. Информацию о росте базы данных можно хранить, например, в электронной таблице; вы сможете экстраполировать эту информацию и предсказать, например, сколько места на дисках понадобится через месяц, через год, через пять лет и так далее. Следя за заполнением дисков, вы узнаете, подвергались ли ваши файлы автоматическому росту, и если да, то когда, и сможете понять, когда потребуется добавить в базу данных дополнительные файлы. Такое наблюдение за заполнением дисков поможет вам избежать таких явлений, как достижение максимального размера файла или расходование всего свободного места на диске.
Системные базы данных
При инсталляции SQL Server создаются четыре системных базы данных: master (главная), tempdb (временная), model (модель) и msdb.
- master. Хранит информацию уровня всей системы, информацию инициализации SQL Server и настройки конфигурации SQL Server. Эта база данных также хранит все учетные записи для входа в систему, информацию о наличии всех остальных баз данных и о местоположении первичного файла для всех пользовательских баз данных. Всегда имейте свежую копию базы данных master – главной базы данных.
- tempdb. Хранит временные таблицы и временные хранимые процедуры. Эта базы данных используется также для хранения прочей временной информации, нужной для работы SQL Server, например для сортировки данных. При каждом запуске SQL Server создается новая чистая копия базы данных tempdb. Затем, если нужно, эта база данных растет автоматически. Если для хранения ваших временных данных требуется много места, то можно увеличить стандартный размер этой базы данных, применив команду ALTER DATABASE.
- model.Служит образцом (шаблоном) для всех остальных баз данных, создаваемых на данной системе, в том числе и для tempdb. При создании базы данных ее начало создается как копия содержимого базы данных model, а всё остальное заполняется пустыми страницами. База данных model обязательно должна иметься в системе, потому что она применяется для воссоздания базы данных tempdb при каждом запуске SQL Server. Вы можете изменять базу данных model, добавляя туда пользовательские (определяемые пользователем) типы данных, таблицы и т.д. Если вы измените базу данных model, то каждая созданная вами база данных будет иметь измененные атрибуты.
- msdb. Содержит таблицы, которые SQL Server Agent применяет для планирования заданий и оповещений и для записи операторов (здесь операторы – это люди, которые отвечают за работу заданий и оповещений). Эта база данных также хранит таблицы, применяемые для репликации.
Каждая из этих системных баз данных имеет свои собственные первичный файл данных и файл журнала. Системные базы данных хранятся в папке для хранения системных файлов, назначенной вами при инсталляции SQL Server.
Создание баз данных
SQL Server предлагает три метода для создания баз данных: воспользоваться мастером Create Database Wizard, создать базу данных при помощи SQL Server Enterprise Manager или применить команду CREATE DATABASE, которую можно сохранить в файле и запускать как сценарий. Эти три метода будут описаны ниже, в следующих трех подразделах. Вы должны знать, что мастер Create Database Wizard обладает некоторыми ограничениями. Так, он помещает все созданные им файлы данных на один дисковый накопитель, в одну заданную вами папку. При использовании этого мастера вы не сможете поместить файлы данных в другое физическое местоположение (ни на другие дисковые накопители, ни в другие папки). Вы можете поместить файлы журналов на диск или в папку, отличающуюся от диска или папки для файлов данных, но, опять таки, только в одно физическое местоположение. Нельзя задать пользовательские группы файлов, и все файлы получат одинаковые настройки для роста. Из-за этих ограничений мастер Create Database Wizard является наилучшим решением, когда вам нужно создать в базе данных только один первичный файл данных и один файл для журнала транзакций. (С другой стороны, в дальнейшем вы всегда можете добавить в базу данных файлы и группы файлов, если они вам понадобятся.)
Enterprise Manager и сценарии T-SQL следует применять, если вы хотите создать базу данных со вторичными файлами данных, которые должны быть размещены на другом дисковом накопителе, отличном от накопителя, на котором хранится первичный файл данных, или если вы хотите добавить пользовательские группы файлов, или вам нужно задать разные настройки роста для разных файлов.
Применение мастера Create Database Wizard
Для тех, кто еще не имеет достаточного опыта, применение мастера Create Database Wizard может оказаться наиболее простым способом создания баз данных. Если его ограничения, о которых говорилось выше, не влияют на требования вашей задачи то, конечно, следует пользоваться этим методом создания баз данных. Для создания базы данных при помощи мастера Create Database Wizard, выполните следующие действия.
- Запустите SQL Server Enterprise Manager и выберите сервер, на котором вы хотите создать базу данных. Чтобы выбрать сервер, сначала раскройте папку Microsoft SQL Servers (для этого нажмите на значок "+" слева от имени папки). Раскройте папку SQL Server Group, а затем нажмите на имя нужного вам сервера. В меню Tools выберите Wizards. Раскройте Database (см. рис. 9.4).
Рис. 9.4. Экран Select Wizard (Выбор мастера) - Чтобы запустить мастер Create Database Wizard, дважды щелкните на Create Database Wizard. Откроется стартовый экран мастера (рис. 9.5).
Рис. 9.5. Стартовый экран мастера Create Database Wizard - Нажмите на Next, и вы перейдете к экрану Name the Database and Specify its Location (Дайте имя для базы данных и укажите ее местоположение) (рис. 9.6). Введите с клавиатуры имя создаваемой базы данных и местоположение для файлов данных и файлов журналов. Местоположение должно правильно указывать на диск и папку, которые уже должны иметься в системе (локально). Если нажать на кнопку с многоточием ("..."), то вы сможете поискать и выбрать нужную папку. После того как вы зададите имя базы данных и местоположения пути к файлам данных и журналов, нажмите на Next, чтобы продолжить работу мастера.
Рис. 9.6. Экран Name the Database and Specify its Location (Дайте имя для базы данных и укажите ее местоположение)Примечание. На остальных рисунках этого раздела показано создание базы данных с именем MyDB, имеющей первичный файл данных в C:\mssql2k\MSSQL\data и один файл журнала в F:\mssql2k\MSSQL\data. - Появится экран Name the Database Files (Дайте имена файлам базы данных) (рис. 9.7). В этом экране вы можете ввести с клавиатуры имена и начальные размеры для каждого из файлов вашей базы данных. Первичный файл базы данных создается автоматически и получает в качестве префикса своего имени имя базы данных. Вы можете либо согласиться с этим именем, либо ввести с клавиатуры другое имя. Первичный файл данных имеет расширение .mdf. Если вы имеете какое-либо представление о будущем размере вашей базы данных, то введите сейчас этот размер в поле для задания начального размера (Initial Size). Если вы не знаете будущий размер вашей базы данных, то оставьте размер, указанный по умолчанию; вы сможете изменить его позднее при помощи команды ALTER DATABASE. Любые файлы, которые вы создадите в дополнение к первому файлу (первичному), будут являться вторичными файлами и автоматически получат расширения .ndf. Все созданные здесь файлы будут помещены в первичную группу файлов. Пользуясь мастером Create
Database Wizard, пользовательские группы файлов создавать невозможно.
Рис. 9.7. Экран Name the Database Files (Дайте имена файлам базы данных)В нашем примере мы оставили заданный по умолчанию первичный файл MyDB_Data и добавили вторичный файл, MyDB_Data2. Оба этих файла будут помещены в одно и то же место, которое вы указали на шаге 3. (Если вы не хотите, чтобы все файлы данных размещались на одном диске и в одной и той же папке и группе файлов, не продолжайте работу мастера, а создайте базу данных одним из методов, описанных в следующих разделах.) Для продолжения работы мастера нажмите на Next. - Появится экран Define the Database File Growth (Настройте рост файлов базы данных) (рис. 9.8). Как уже говорилось в данной лекции, SQL Server может по мере необходимости автоматически увеличивать размер вашей базы данных, что снимает с администратора часть работы по обслуживанию. Вообще говоря, рекомендуется включать опцию для автоматического роста файлов (Automatically grow the database files), потому что она совсем немного расходует ресурс производительности системы, а если ее не задать, то вам в случае необходимости придется вручную настраивать размер базы данных. Если вы нажмете на Automatically grow the database files, то можно будет задать способ, которым будет выполняться рост файла базы данных: добавками фиксированного размера (задаваемого в мегабайтах) либо как некоторая доля от текущего размера (задаваемая в процентах). Помните, что файл базы данных будет расти только в случае необходимости. Кроме того, вы должны либо ограничить возможный рост базы данных (задать максимальный размер), либо позволить ей расти без ограничений. Настройки, заданные в этом экране, применяются ко всем файлам базы данных, созданным на шаге 4. Вы не можете применять мастер Create Database Wizard для конфигурирования индивидуальных настроек роста отдельных файлов. Для продолжения работы мастера нажмите на Next.
Рис. 9.8. Экран Define the Database File Growth (Настройте рост файлов базы данных) - Появится экран Name the Transaction Log Files (Дайте имена файлам журнала транзакций). Этот экран выглядит так же, как и экран Name the Database Files, но он относится к файлу журнала. (Помните, что журнал транзакций хранит записи обо всех изменениях базы данных, которые понадобятся при восстановлении базы данных при отказе системы.) Первый файл журнала транзакций создается автоматически и получает в качестве префикса имени имя, заданное для базы данных. Вы можете согласиться с этим именем, а можете ввести с клавиатуры и другое. Данные журнала транзакций хранятся в файле с расширением .ldf. Если надо, вы можете добавить дополнительные файлы журналов. Если вы имеете какое-либо представление о будущем размере журнала транзакций, то введите сейчас этот размер, а если не знаете, то оставьте размер, указанный по умолчанию (вы сможете изменить его позднее при помощи команды ALTER DATABASE ). Для продолжения нажмите на Next.
- Появится экран Define the Transaction Log File Growth (Настройте рост файлов журнал транзакций). Этот экран выглядит так же, как и экран Define the Database File Growth, но в нем задаются настройки роста для файла журнала. Как и в шаге 5, вы можете выбрать автоматический рост файлов и, если хотите, задать настройки роста и максимальный размер файла. Для продолжения нажмите на Next.
- Появится экран Completing the Create Database Wizard (Завершение работы мастера Create Database Wizard) (рис. 9.9). Ознакомьтесь с настройками, заданными для вашей новой базы данных. Если все хорошо, то нажмите на Finish, чтобы завершить создание базы данных, а если нет, то нажмите на Back и внесите необходимые изменения.
Рис. 9.9. Экран Completing the Create Database Wizard (Завершение работы мастера Create Database Wizard) - Как только ваша база данных будет создана, появится информационное окно мастера Create Database Wizard, с сообщением, что база данных была успешно создана. Нажмите на OK, чтобы закрыть это окно.
- Появится еще одно информационное окно с вопросом, не желаете ли вы создать план обслуживания (maintenance plan) для новой базы данных. Рекомендуется создать план обслуживания, потому что благодаря ему обеспечивается хорошая производительность вашей базы данных, регулярное резервное копирование в случае отказа системы и проверки базы данных на непротиворечивость. Но планы обслуживания мы рассмотрим только в лекции 30, поэтому пока что нажмите на No, чтобы завершить создание базы данных.
Применение Enterprise Manager
При помощи SQL Server Enterprise Manager вы можете создавать более сложные базы данных, чем те, которые можно создать с помощью мастера Create Database Wizard. Вы можете задать разные настройки роста для каждого из создаваемых файлов, а не одинаковые для всех файлов. Вы также можете создавать пользовательские группы файлов. Для создания базы данных при помощи Enterprise Manager выполните последовательность шагов, которые будут перечислены ниже. В нашем примере мы создадим базу данных с именем MyDB, имеющую первичный файл данных, три вторичных файла данных (находящихся в той же самой пользовательской группе файлов) и один файл-журнал.
- Откройте Enterprise Manager. В левой панели раскройте группу SQL Server, в которой находится имя сервера, на котором вы хотите создать базу данных, а затем раскройте узел самого этого сервера. Затем нажмите правой кнопкой мыши на папку Databases и выберите New Database.
- Откроется окно свойств базы данных (Database Properties) с открытой вкладкой General (Общие) (рис. 9.10). Введите с клавиатуры имя базы данных в поле Name.
- Откройте вкладку Data Files (см. рис. 9.11). Как видите, Enterprise Manager автоматически создает первичный файл данных, с именем вашей базы данных в качестве префикса и PRIMARY в качестве имени группы файлов. Вы можете изменить имя, местоположение и размер первичного файла, но вы не сможете изменить группу файла для первичного файла данных. Введите с клавиатуры имя файла (логическое имя), местоположение (физическое имя), размер и группу для каждого из создаваемых вами файлов. Для каждого файла данных, кроме первичного файла, вы можете задать имя пользовательской группы файлов, и, в соответствии с вашим желанием, эта группа файлов будет создана. В нашем примере мы создали вторичный файл данных MyDB_Data2 в группе файлов My_FG.
Рис. 9.10. Вкладка General окна свойств базы данных
Рис. 9.11. Вкладка Data Files окна свойств базы данныхПо умолчанию, каждый файл располагается на диске в папке, в которой инсталлирован SQL Server. Вы можете изменить эту настройку, задав другой путь с клавиатуры или при помощи экранной кнопки для его поиска ("..."). - В области File Properties (Свойства файла) в нижней части окна вы можете задать настройки автоматического роста для отдельных файлов. Выделите имя файла, для которого вы хотите задать настройки роста. Чтобы разрешить автоматический рост этого файла, установите флажок Automatically grow file. Затем вы можете задать приращение файла, выраженное в мегабайтах или в процентах от свободного места, оставшегося в файле. Нажав на селективную кнопку Restrict file growth (Ограничить рост файла), вы также можете задать максимальный размер файла, указав предел роста, выраженный в мегабайтах, а можете и не ограничивать рост файла. Эти настройки можно задавать при создании каждого из файлов, а можете оставить настройки, применяемые по умолчанию, и задать их позднее при помощи окна Enterprise Manager Database Properties. Если вам понадобится удалить файл из списка, то выделите имя этого файла и нажмите на экранную кнопку Delete.
- Завершив конфигурацию всех файлов данных, откройте вкладку Transaction Log и сконфигурируйте файлы журнала транзакций. Файлы журнала конфигурируются точно так же, как и файлы данных, за исключением того, что вы не сможете задать для них группу файлов, потому что они не принадлежат ни одной из групп файлов. Задайте с клавиатуры имя файла (логическое имя), местоположение (физическое имя) и начальный размер для одного или нескольких файлов журнала. Кроме того, задайте настройки автоматического роста файлов журнала, так же как это было описано в п.4 для файлов данных.
- После того как вы настроите все файлы так, как вам это нужно, нажмите на OK, и SQL Server создаст базу данных. Вернитесь в Enterprise Manager и нажмите на папку Databases сервера, в который вы только что добавили новую базу данных. Вы увидите в правой панели Enterprise Manager, что SQL Server добавил значок-иконку для этой базы данных.
Применение операторов T-SQL
Возможно, вы пожелаете создавать или изменять свои базы данных при помощи операторов T-SQL, не пользуясь графическим пользовательским интерфейсом (GUI). Вы можете создавать свои собственные сценарии, которые пригодятся при создании баз данных. Допустим, вы создали базу данных, а потом обнаружили, что задали неверное местоположение какого-либо файла. Можно уничтожить эту базу данных и начать все снова. Если для создания базы данных вы применяете сценарий T-SQL, то вы сможете быстро его поправить и запустить снова, а не задавать повторно все данные в графическом пользовательском интерфейсе. Если вам надо создать такую же базу данных на другом компьютере (например, на "горячем" резервном компьютере), то вы можете запустить на нем тот же самый сценарий.
С другой стороны, Enterprise Manager можно применить для генерации сценариев T-SQL, применяемых для создания баз данных (а также сценариев для создания любых объектов баз данных), но только после того, как база данных будет создана. Сценарии, сгенерированные Enterprise Manager, будут содержать все настройки текущей базы данных, что может быть полезно, поэтому вы можете захотеть пользоваться сгенерированным сценарием. Но независимо от того, будете ли вы писать свои сценарии или пользоваться сгенерированными, это окажется полезным для понимания кода T-SQL, применяемого для создания баз данных. В данном разделе мы рассмотрим операторы T-SQL для создания баз данных. Эти команды можно набрать с клавиатуры в файл и создать сценарий. (О создании и запуске сценариев см. лекцию 13.)
Простая база данных
В данном примере мы создадим базу данных с именем MyDB, содержащую: первичный файл данных (MyDB_root); один вторичный файл данных (MyDB_data1), который по умолчанию останется в первичной группе файлов и один файл журнала транзакций (Log_data1). Ниже показаны операторы SQL, которые создадут базу данных MyDB:
CREATE DATABASE MyDB ON (NAME = MyDBroot, --Первичный файл данных FILENAME = 'c:\mssql2k\MSSQL\data\mydbroot.mdf', SIZE = 8MB, MAXSIZE = 9MB, FILEGROWTH = 100KB), (NAME = MyDBdata1, --Вторичный файл данных FILENAME = 'c:\mssql2k\MSSQL\data\mydbdata1.ndf', SIZE = 1000MB, MAXSIZE = 1500MB, FILEGROWTH = 100MB) LOG ON (NAME = Logdata1, --Файл журнала FILENAME = 'e:\log_files\logdata1.ldf', SIZE = 1000MB, MAXSIZE = 1500MB, FILEGROWTH = 100MB)
Обратите внимание, что в приведенном выше примере первичный и вторичный файлы данных оба расположены на диске C, а файл журнала расположен на диске E. Мы уже говорили, что файлы данных и файлы журналов нужно всегда размещать на физически разных устройствах, чтобы повысить производительность ввода-вывода при доступе к дискам. Кроме того, обратите внимание, что были использованы рекомендуемые расширения имен файлов – .mdf, .ndf, и .ldf. Настройки SIZE (Размер), MAXSIZE (Максимальный размер) и FILEGROWTH (Рост файла) могут быть заданы в Кб либо в Мб (по умолчанию применяются Мб).
Этот пример базы данных относится к системе с несколькими дисковыми накопителями или с несколькими массивами дисков в RAID-системе. Мы будем употреблять термин "диск", когда будем говорить и об отдельных дисковых накопителях, и о массивах дисковых накопителей, работающих как том RAID. Будут созданы несколько файлов, каждый на своем отдельном диске. Каждый файл помещается в одну из двух групп файлов. Наша база данных получит имя Sales и будет содержать следующие файлы:
- первичный файл данных, Sales_root.mdf;
- три вторичных файла данных customer_data1.ndf, customer_data2.ndf и customer_data3.ndf, в группе файлов customers_group;
- два вторичных файла данных product_data1.ndf и product_data2.ndf, в группе файлов products_group;
- один файл журнала транзакций, log_data1.ldf.
Ниже показан текст скрипта, который создаст базу данных Sales. Так как будут создаваться пользовательские группы файлов, то в команде CREATE DATABASE будет содержаться ключевое слово FILEGROUP.
CREATE DATABASE Sales ON PRIMARY --Явное задание первичной --группы файлов (не обязательно) (NAME = Sales_root, --Первичный файл данных FILENAME = 'c:\mssql2k\MSSQL\data\salesroot.mdf', SIZE = 8MB, MAXSIZE = 10MB, FILEGROWTH = 1MB), FILEGROUP customers_group --Группа файлов для следующих файлов (NAME = customerdata1, --Вторичный файл данных FILENAME = 'd:\mssql2k\MSSQL\data\customerdata1.ndf', SIZE = 800MB, MAXSIZE = 1000MB, FILEGROWTH = 100MB), (NAME = customerdata2, --Вторичный файл данных FILENAME = 'e:\mssql2k\MSSQL\data\customerdata2.ndf', SIZE = 800MB, MAXSIZE = 1000MB, FILEGROWTH = 100MB), (NAME = customerdata3, --Вторичный файл данных FILENAME = 'f:\mssql2k\MSSQL\data\customerdata3.ndf', SIZE = 800MB, MAXSIZE = 1000MB, FILEGROWTH = 100MB), FILEGROUP products_group --Группа файлов для следующих файлов (NAME = productdata1, --Вторичный файл данных FILENAME = 'g:\mssql2k\MSSQL\data\productdata1.ndf', SIZE = 500MB, MAXSIZE = 700MB, FILEGROWTH = 100MB), (NAME = productdata2, --Вторичный файл данных FILENAME = 'h:\mssql2k\MSSQL\data\productdata2.ndf', SIZE = 500MB, MAXSIZE = 700MB, FILEGROWTH = 100MB) LOG ON (NAME = logdata1, --Файл журнала FILENAME = 'i:\log_files\logdata1.ldf', SIZE = 800MB, MAXSIZE = 1000MB, FILEGROWTH = 200MB)
Из комментариев к этому примеру видно, что перед заданием первичного файла можно в явном виде задать первичную группу файлов. Но явное задание не обязательно, т.к. по умолчанию считается, что происходит задание первичной группы файлов. Две другие группы файлов, customers_group и products_group, задаются непосредственно перед определениями размещаемых в них файлов. Все файлы, перечисленные после определения группы файлов, будут помещаться в эту группу файлов до тех пор, пока не появится определение новой группы файлов или не появится предложение LOG ON.
Обратите внимание на обозначения дисков для файлов. Каждый из файлов создается на своем диске, чтобы при создании таблиц и индексов в группах файлов данные могли бы равномерно распределяться по многим дискам. Например, данные из таблицы, созданной в группе файлов customers_group разместятся на нескольких дисках, на которых будут располагаться файлы customer_data1.ndf, customer_data2.ndf и customer_data3.ndf. Файл журнала тоже располагается на отдельном диске, на котором не располагаются никакие файлы данных, благодаря чему становится возможной запись файла журнала с последовательным вводом-выводом (перемещением записывающих головок дискового накопителя только на соседние дорожки).
Если вы не хотите, чтобы SQL Server производил автоматический рост файла, то задайте FILEGROWTH=0, тогда файлу будет разрешено заполнять только первоначально отведенное для него пространство. Эту настройку можно задать, когда происходит работа со статическими таблицами, т.е. с таблицами, которые не растут. В этом случае в операторе не требуется задавать MAXSIZE, максимальный размер файла будет совпадать с начальной настройкой SIZE.
Просмотр баз данных
После того как вы создали базу данных, вы можете применять Enterprise Manager для поиска и просмотра имеющихся в ней объектов. Вы также можете просматривать информацию о базе данных, исполняя команды SQL из средства OSQL с интерфейсом командной строки. Сейчас мы расскажем вам об обоих этих способах просмотра баз данных.
Применение Enterprise Manager
Для просмотра информации в базе данных при помощи Enterprise Manager, выполните следующие действия:
- Находясь в Enterprise Manager, нажимая на значки-плюсы, раскройте списки для группы SQL Server, имя сервера, на котором находится база данных, и папку Databases (см. рис. 9.12).
увеличить изображение
Рис. 9.12. Enterprise Manager с раскрытой папкой Databases - Нажмите на имя нужной базы данных, и тогда отобразятся находящиеся в ней объекты (см. рис. 9.13).
увеличить изображение
Рис. 9.13. Объекты из базы данных Northwind
Применение команд SQL
Информацию о базах данных можно просматривать, также запуская команды T-SQL, при помощи окна с приглашением командной строки или из Query Analyzer. Чтобы посмотреть информацию о базе данных при помощи команды SQL, выдаваемой из командной строки, откройте окно с приглашением командной строки и осуществите соединение с SQL Server через OSQL, при помощи, например, такой команды:
OSQL -U<имя_пользователя> -P<пароль> -S<имя_сервера>
Когда вы будете набирать эту команду, подставьте в нее вместо слов в угловых скобках свои имя пользователя, пароль и имя сервера (сами угловые скобки вводить не надо).
Для применения Query Analyzer нажмите на экранную кнопку Start, укажите на Programs, укажите на Microsoft SQL Server, а затем выберите Query Analyzer.
Теперь вводите команды T-SQL либо в окне Query Analyzer, либо в командной строке OSQL. Для просмотра информации о базах данных запустите такие команды:
Use MyDB--Задает контекст используемой базы данных GO Sp_helpfile--Показывает информацию для всех файлов базы данных GO--Чтобы посмотреть информацию только для некоторого файла, укажите его имя Sp_helpdb MyDB--То же самое, но выдается также информация о месте на диске, выделенном для базы данных GO Sp_helpfilegroup--Показывает информацию о группах файлов данной базы данных GO--Чтобы посмотреть информацию только о некоторой группе файлов, --укажите ее имя Sp_helpdb--Показывает информацию обо всех базах данных GO
Удаление баз данных
Когда-нибудь вам может понадобиться удалить какую-либо базу данных. Помните, что это – "дорога в одну сторону"; удалив базу данных, вы сможете восстановить ее только из резервной копии. Поэтому безопаснее всего будет перед удалением базы данных выполнить ее резервное копирование, на случай, если эта база данных снова понадобится в будущем. Базы данных можно удалять как при помощи Enterprise Manager, так и командами T-SQL.
Применение Enterprise Manager
Как уже говорилось в лекции 8, при помощи Enterprise Manager можно не только просматривать информацию, но и администрировать базы данных. Чтобы полностью удалить базу данных и все ее файлы, выполните следующие действия.
- Находясь в Enterprise Manager, раскройте группу SQL Server, а затем раскройте имя сервера, на котором установлена база данных.
- Раскройте папку Databases, чтобы стали видны имеющиеся базы данных.
- Нажмите правой кнопкой мыши на имя удаляемой базы данных, а затем выберите Delete в контекстном меню. Появится сообщение Delete Database об удалении базы данных (рис. 9.14). В нем спрашивается также, желаете ли вы вместе с базой данных удалить и историю ее резервных копирований и восстановлений. Если флажок Delete backup and restore history for the database будет установлен, то вся информация о резервных копированиях и восстановлениях, хранящаяся в базе данных msdb, будет удалена. Если вы желаете сохранить эту информацию, то снимите флажок Delete backup and restore history for the database. Для подтверждения своего решения удалить базу данных, нажмите на Yes.
Рис. 9.14. Окно сообщения Delete Database
Применение команд SQL
Администрировать базы данных можно и при помощи команд T-SQL. Как мы уже говорили ранее, команды T-SQL можно запускать из Query Analyzer или из окна с приглашением командной строки. Чтобы удалить базу данных при помощи команды T-SQL, откройте или Query Analyzer (мы уже объясняли, как это сделать), или окно с приглашением командной строки, и осуществите соединение с SQL Server через OSQL, при помощи такой команды:
OSQL -U<имя_пользователя> -P<пароль> -S<имя_сервера>
Помните, что удаление базы данных является неотменяемым действием. Для удаления баз данных применяется T-SQL-команда DROP DATABASE. Ниже показаны команды, которые удалят базу данных MyDB и все ее файлы:
USE master--Для запуска команды DROP DATABASE вы должны GO --применять базу данных master DROP DATABASE MyDB --Единственным параметром этой команды является имя удаляемой базы данных. GO
После удаления базы данных следует обновить резервную копию базы данных master, чтобы в ней содержалась свежая информация о пользовательских базах данных и не содержалась информация о только что удаленной базе данных. Также обратите внимание, что база данных не может быть удалена, когда к ней имеют доступ пользователи. Перед удалением базы данных нужно отсоединить от нее всех пользователей.
Заключение
Прочитав эту лекцию, вы приобрели более широкие знания о файлах данных, файлах журналов и о группах файлов SQL Server 2000, а также об автоматическом росте файлов. Теперь вы знаете, как создать базу данных, применяя мастер Create Database Wizard, SQL Server Enterprise Manager и команды T-SQL. Вы также знаете два способа для просмотра информации о базах данных и о файлах и знаете, как удалять базы данных. Теперь вы можете начать создавать таблицы внутри своих баз данных – этой теме посвящена лекция 10.
Лекция 10. Создание таблиц баз данных
После того как вы создали базу данных (с файлами и группами файлов), следующим шагом должно стать создание таблиц. Таблицы являются объектами, при помощи которых вы организовываете и храните свои данные. В этой лекции мы расскажем о главных решениях, принимаемых при создании таблиц базы данных. Так как возможны многие варианты настроек, то создание таблиц базы данных может оказаться несколько сложным процессом. Сначала мы рассмотрим основные требования к таблицам, а затем изучим некоторые настройки, сопровождая наше изложение примерами.
В данной лекции вы познакомитесь с системными и пользовательскими типами данных, узнаете, как помещать таблицы в группы файлов, узнаете, что такое null -значения и свойство IDENTITY. Вы также научитесь создавать таблицы при помощи Enterprise Manager и команд Transact SQL (T-SQL). Мы также вкратце затронем здесь другие важные вопросы, относящиеся к созданию таблиц, такие как ограничения, значения по умолчанию и индексы, о которых будет рассказано более подробно в последующих лекциях.
Создание основы структуры таблиц
Когда вы приступите к проектированию своих таблиц базы данных, вам потребуется принять некоторые решения, относящиеся к их структуре. К этим решениям относится определение того, какие элементы данных должны храниться в этих таблицах и как таблицы будут связаны друг с другом. Эта работа поможет представить общую картину базы данных, прежде чем вы углубитесь в создание таблиц. Ниже дан перечень этих глобальных решений:
- Какие данные будут храниться в каждой из таблиц?
- Какие колонки будут созданы для хранения данных и какие у них будут имена?
- Какие будут требования к диапазону данных, хранящихся в колонках (какие данные разрешено в них хранить), и какие типы данных Microsoft SQL Server 2000 должны применяться для каждой из колонок?
- Будут ли иметься колонки, которые могут содержать null-значения, или же вместо этого могут применяться значения по умолчанию? (Если разрешить null-значения, то, по сравнению с использованием значений по умолчанию, увеличится нагрузка на процессор.)
- Какие колонки станут первичными ключами, а какие внешними ключами?
- Какие типы ограничений должны использоваться?
- Какие типы индексов (кластеризованные или некластеризованные) должны иметься в таблице и для какой колонки или колонок они должны быть определены?
- Какие пользователи должны иметь доступ к тем или иным таблицам?
Постарайтесь найти ответы на как можно большее количество этих вопросов о проектировании системы и записать их на листок бумаги или в компьютерной программе для рисования схем, чтобы осознать общую конструкцию таблиц вашей базы данных, прежде чем начать создавать их. Нужно также узнать у ваших пользователей, каким образом будут осуществляться доступ к данным. Например, можно узнать, что некоторая таблица будет предназначена только для чтения или же будут производиться вставки, удаления или обновления данных. Узнайте, какие запросы будут выполняться чаще всего и из каких колонок будут извлекаться данные. Определите, какая информация действительно необходима для базы данных, а какую хранить не надо. Ответы на эти вопросы помогут вам принять решения о том, как создавать таблицы и индексы, какие ограничения могут применяться, какие значения по умолчанию могут оказаться полезными и т.д. А теперь давайте научимся создавать таблицы на основе этого "фундамента".
Основные понятия, относящиеся к таблицам
В данном разделе вы познакомитесь с некоторыми простыми, но важными понятиями, относящимися к таблицам. Мы рассмотрим пример базы данных, в котором вы познакомитесь с основными элементами таблиц и узнаете о системных типах данных и о том, как создавать и удалять пользовательские типы данных.
Создание таблицы базы данных
Таблица – это объект базы данных, который хранит данные в виде совокупности строк и колонок. Таблица определяется содержащимися в ней колонками. Данные организованы в форме, похожей на электронные таблицы Excel (см. пример таблицы Product_Info, показанный в табл. 10.1). Таблица Product_Info, используемая в наших примерах, будет создана в базе данных MyDB.
Таблица Product_Info применяется для хранения информации обо всех продуктах, продаваемых в магазине. Когда продукт становится готов к продаже, данные о нем добавляются в новую строку таблицы Product_Info. Эта таблица состоит из пяти колонок: Product_ID (Идентификатор продукта), Product_Name (Название продукта), Description (Описание), Price (Цена) и Brand_ID (Название торговой марки). В табл. 10.1 показаны в качестве примера три строки данных из таблицы Product_Info. Оператор T-SQL, применявшийся для создания этой таблицы (пустой, без данных) показан в разделе "Создание таблицы Product_Info с использованием системных типов данных" далее в этой лекции. (Об использовании оператора INSERT, применяемого для вставки данных в таблицы см. лекцию 20.)
Product_ID | Product_Name | Description | Price | Brand_ID |
---|---|---|---|---|
1 | Пятифутовый тент | Для одного-двух человек | 80.00 | 12 |
2 | Мини-печь | Работает на керосине | 20.00 | 33 |
3 | Рюкзак | Со стальным каркасом | 60.00 | 15 |
Мы вернемся к этому примеру таблицы базы данных в этой лекции, когда будем объяснять более сложные вопросы создания таблиц. Но сначала мы продолжим рассказ об основах, которые вы должны знать, чтобы уметь создавать таблицы.
Чтобы задать таблицу, вы должны решить, сколько колонок она будет иметь и данные каких типов (например, символьные или числовые) смогут храниться в каждой из колонок. Вы должны также задать допустимый диапазон для этих данных, например, вы можете разрешить использовать не более 30 символов или числа, хранимые в 4 байтах. Эти атрибуты задаются благодаря тому, что каждой колонке присваивается некоторый тип данных, являющийся набором атрибутов, определяющих тип и диапазон данных, способных храниться в этой колонке. Вы можете пользоваться многими системными типами данных, имеющимися в SQL Server, а можете создать и свой собственный тип данных, основанный на системных типах данных. (Вы не можете изменять системные типы данных, но можете создавать совершенно новые типы данных.)
Применение системных типов данных
Как мы уже говорили, вы задаете тип данных для каждой колонки таблицы. При задании типа данных у колонки задаются следующие атрибуты:
- Категория данных, которые могут содержаться в колонке (например, символьные данные, целые числа или изображения).
- Размер (длина) данных, хранимых в колонке.
- Точность чисел (этот атрибут применяется только для числовых типов данных), т.е. количество цифр, содержащихся в числах.
- Масштаб чисел (этот атрибут применяется только для числовых типов данных), т.е. количество цифр, способных помещаться справа от десятичной точки.
Типы данных могут также применяться к колонкам для представлений, параметров в хранимых процедурах и в функциях T-SQL, возвращающих одно или несколько значений данных. Встроенные типы данных, имеющиеся в SQL Server, перечислены в табл. 10.2. В SQL Server 2000 появились три новых типа данных: bigint, sql_variant и table. (Кроме нескольких исключений, явно указанных в табл. 10.2, для всех указанных объектов применяются те же самые типы данных.)
Тип данных | Описание | Сколько места занимает |
---|---|---|
tinyint | Целочисленные данные в диапазоне от 0 до 255. | 1 байт |
unique-identifier | Хранит 16-байтное двоичное значение, являющееся глобальным уникальным идентификатором (GUID) | 16 байт |
varbinary | Двоичные данные переменной длины, состоящие из n байтов, где n может принимать значение от 1 до 8000. Применяйте тип varbinary, если предполагаете, что элементы данных, хранимые в колонке, будут сильно отличаться по своим размерам | Фактическая длина введенных данных плюс 4 байта |
varchar[(n)] | Данные переменной длины не в кодировке Unicode, длиной в n символов, где n может принимать значение от 1 до 8000 | Фактическая длина введенных данных |
Как правильно выбрать тип данных
При создании таблиц важно правильно выбрать типы данных для каждой из колонок. Наверное, вы хотели бы, чтобы позволялось хранить нужные данные, но не разрешалось хранить недопустимые данные (например, символьное значение в колонке для числовых данных). Эта забота и решается благодаря типам данных. При выборе типа данных вам полезно ответить на два следующих вопроса:
- Подходит ли этот тип данных для вашей разновидности данных?
- Какой тип данных следует использовать – с фиксированной либо с переменной длиной?
Выбор подходящего типа данных является довольно понятным процессом. Данные, которые будут вводиться в колонку, должны соответствовать типу данных, заданному для этой колонки. Поэтому вам следует выбрать такой тип данных, который лучше всего охватит диапазон значений, которые могли бы храниться в колонке для всего срока эксплуатации вашего приложения, и в то же время стремясь ограничить ненужный расход места на диске. Ненужный расход места на диске – это место на диске, выделенное для элементов данных, хранящихся в колонке, но не используемое. Например, предположим, у вас есть колонка, в которой нужно хранить одно целое число в диапазоне от 1 до 100. Очевидно, что эти значения могут храниться в типе integer, но каждое целое число типа integer занимает 4 байта. Данные с типом tinyint могут хранить значения от 0 до 255 и для них нужен только 1 байт места. В данном случае tinyint будет наилучшим выбором, потому что это экономит место на диске, необходимое для хранения данных из таблиц.
Затем вы должны определить, какой тип данных следует использовать – с фиксированной либо с переменной длиной. Если все значения данных из колонки будут иметь приблизительно одинаковые размеры, то более эффективным станет применение типа данных с фиксированной длиной, так как обработка данных, имеющих типы переменной длины, вызывает повышенную нагрузку. Вообще говоря, типы данных с переменной длиной следует применять, только если вы предполагаете значительные различия в длине данных, хранимых в данной колонке, и когда данные из колонки обновляются редко. К данным с переменной длиной относятся varchar, nvarchar, varbinary, text, ntext и image.Применение типов данных с переменной длиной может привести к значительной экономии места для хранения данных. Например, если вы зададите тип данных с фиксированной длиной, достаточной для хранения значений в колонке с наибольшей возможной длиной, то для всех значений, занимающих меньше места, истратиться столько же места, как и для этого самого объемного значения. Результатом этого станут огромный ненужный расход места на диске, потому что лишь немногие строки будут расходовать все максимально допустимое место для данных. В большинстве строк будет использовано меньше места, а все неиспользуемое место станет потерянным. А если вы зададите, что будет применяться тип данных с переменной длиной, то короткие значения будут расходовать лишь то место, которое им действительно нужно. Но опять-таки, применение типов данных с переменной длиной повышает нагрузку на процессор. Поэтому, если вам не требуется тип данных с переменной длиной, то применяйте тип данных с фиксированной длиной. Если из соображений расходования места для хранения данных нужно применять тип данных с переменной длиной, то, конечно, применяйте его.
Итак, как же выбрать нужные для ваших таблиц типы данных и их длины? Следуйте уже принятым ранее основным решениям и делайте выбор, который наилучшим образом будет соответствовать потребностям вашего приложения. Вообще говоря, определяясь с размерами колонок таблиц, старайтесь не тратить зря место на диске и не забывайте о потребностях в будущем.
Создание таблицы Product_Info с использованием системных типов данных
Прежде чем продолжить наше изложение, давайте рассмотрим T-SQL-оператор CREATE TABLE, которую можно применить для создания таблицы Product_Info, показанной в этой лекции ранее в табл. 10.1. В этом примере мы применим только системные типы данных и колонки с фиксированной длиной. Когда вы создаете таблицу при помощи оператора T-SQL, она создается в базе данных, которой вы пользуетесь в текущий момент. Если вы хотите создать таблицу в какой-либо конкретной базе данных, то надо применить оператор USE имя_базы_данных, как показано в примере кода (в нашем примере база данных имеет имя MyDB). Ключевое слово GO означает, что все предыдущие операторы должны быть теперь выполнены. (Об использовании T-SQL см. лекцию 13.)
USE MyDB GO CREATE TABLE Product_Info ( Product_ID smallint, Product_Name char(20), Description char(30), Price smallmoney, Brand_ID smallint ) GO
Давайте посмотрим, что произойдет при исполнении этого кода. После оператора CREATE TABLE следует спецификация таблицы с именем Product_Info. Между открывающей и закрывающей скобками заданы имена колонок и их типы данных. Длины для двух типов данных заданы равными 20 и 30, потому что большинство названий продуктов уместятся в 20 символов, а большинство описаний продуктов уместятся в 30 символов. Для Product_ID и Brand_ID применяется тип данных smallint, а не tinyint, потому что мы предполагаем, что количество разновидностей как продуктов, так и торговых марок, превысит 255 (максимальное значение для типа tinyint ), хотя и будет меньше, чем 32767 (максимальное значение для типа smallint ). Так как значения больше, чем 32767, нам не понадобятся, то при использовании типа int мы напрасно тратили бы место на диске.
Работа с пользовательскими типами данных
Пользовательские типы данных (типы данных, задаваемые пользователями, user-defined data types) или, как их еще называют, "псевдонимные", "алиасные" типы данных (alias data types)являются индивидуально настроенными системными типами данных. Индивидуальная настройка типов данных (задание типов данных) полезна, когда вы имеете несколько таблиц, в колонках которых должны храниться данные одинаковых типов, а вы хотите гарантировать точное соответствие колонок каждой из таблиц по типу, длине и возможности применения null-значений. Вы можете создать тип данных с осмысленным именем, что упростит программирование и улучшит согласованность таблиц. Затем вы сможете применять этот тип данных при создании многих других таблиц.
Например, предположим, что у нас имеется еще одна таблица, с именем Brands (торговые марки) в той же базе данных, в которой находится таблица Product_Info. Пусть в таблице Brands имеется колонка Brand_ID, соответствующая колонке Brand_ID таблицы Product_Info. Пусть в таблице Brands хранятся названия торговых марок и другая информация, относящаяся к торговым маркам. Чтобы гарантировать, что колонки Brand_ID в обеих таблицах имеют одинаковый тип данных и не допускают null -значений, вы можете создать пользовательский тип данных и присвоить его обеим колонкам. А теперь представьте, что у вас имеется несколько таблиц с колонками, которые должны иметь одинаковые атрибуты. Вы можете не помнить, применяли ли вы в одной таблице тип smallint, или же tinyint, или было ли позволено применять null -значения. Если создать тип данных с понятными именем, то вам не придется беспокоиться о правильности применяемых атрибутов, и вы получите гарантию согласованности данных для всех таблиц.
Создание пользовательских типов данных при помощи Enterprise Manager
Вы можете пожелать создать типы данных для таких данных, как телефонные номера, почтовые индексы, номера социального страхования и для любых других данных, которые вы можете четко определить и которые применяются более чем в одной таблице базы данных. При создании типа данных вы должны задать следующую информацию:
- Имя типа данных.
- Системный тип данных, на основании которого создается новый тип данных.
- Возможность хранения null -значений в данном типе данных, т.е., позволяет ли он хранить null -значения (null values). (См. раздел "Применение null-значений" далее в этой лекции.)
Как только вы определитесь с этим, можно будет создать тип данных. Для создания пользовательского типа данных с помощью Enterprise Manager выполните следующие действия.
- Находясь в Enterprise Manager, нажимая на значок-плюс рядом с папкой, раскройте группу SQL Server, а затем раскройте сервер.
- Раскройте папку Databases, а затем раскройте базу данных. Ваше окно Enterprise Manager будет выглядеть примерно как на рис. 10.1.
увеличить изображение
Рис. 10.1. Определение типа данных при помощи Enterprise Manager - Нажмите правой кнопкой мыши на User Defined Data Types (Пользовательские типы данных) и выберите New User Defined Data Type (Новый пользовательский тип данных) в контекстном меню. Появится окно свойств пользовательского типа данных.
- В поле Name введите имя нового типа данных. Для нашего примера мы задали имя brand_type (рис. 10.2).
- Затем вы должны задать системный тип данных SQL Server и длину поля вашего пользовательского типа данных. В нашем примере мы задали тип данных для колонки Brand_ID, поэтому мы выбрали тип данных smallint, имеющий стандартную длину, равную 5. (Если бы мы создали символьный тип данных, то тогда можно было бы задать его длину.)
Рис. 10.2. Окно свойств пользовательского типа данных - Если ваш тип данных позволяет использовать null -значения, то установите флажок Allow NULLs. (См. раздел "Применение null-значений" далее в этой лекции.)
- Если ваш тип данных должен использовать какие-либо предопределенные правила или значения по умолчанию, то выберите их в соответствующих полях со списками. (О правилах и значениях по умолчанию см. лекцию 16.)
- Чтобы сохранить ваш новый тип данных, нажмите на OK.
Удаление пользовательских типов данных при помощи Enterprise Manager
Если вы создали когда-то пользовательский тип данных, а он больше не будет применяться (или вы ошиблись при его создании и хотите создать его снова), то можно удалить этот тип данных. Для удаления пользовательского типа данных выполните следующие действия:
- Находясь в Enterprise Manager, выберите пользовательский тип данных, который нужно удалить (раскройте группу SQL Server, раскройте сервер, раскройте папку Databases, а затем раскройте базу данных, в которой содержится удаляемый тип данных).
- Нажмите на папку User Defined Data Types. В правой панели станут видны пользовательские типы данных, имеющиеся в базе данных (рис. 10.3).
- Нажмите правой кнопкой мыши на пользовательский тип данных, который вы хотите удалить, и выберите Delete (Удалить) в появившемся контекстном меню. Появится диалоговое окно Drop Objects (Удалить объекты) (рис. 10.4).
- Прежде чем удалить тип данных, нажмите на Show Dependencies (Показать зависимости), в результате чего появится диалоговое окно Dependencies (Зависимости) (рис. 10.5).
В поле-списке в левой части диалогового окна Dependencies показаны объекты базы данных, которые зависят от вашего пользовательского типа данных, а в поле-списке в правой части диалогового окна показаны объекты, от которых зависит ваш пользовательский тип данных. Если этот тип данных используется в каких-либо таблицах или объектах (как тип данных в нашем примере), то вам не будет позволено удалить его – при попытке удаления (если вы перейдете к шагу 5) появится сообщение об ошибке (рис. 10.6).
увеличить изображение
Рис. 10.3. Папка User Defined Data Types (Пользовательские типы данных)
Рис. 10.4. Диалоговое окно Drop Objects (Удалить объекты) - Если у вашего типа данных не возникает проблем с тем, что он где-то используется, то закройте диалоговое окно Dependencies, а затем нажмите на экранную кнопку Drop All (Удалить все) в диалоговом окне Drop Objects, чтобы удалить этот тип данных. Не волнуйтесь, удалены будут только типы данных, показанные в диалоговом окне Drop Objects, а не все ваши пользовательские типы данных.
Рис. 10.5. Диалоговое окно Dependencies (Зависимости)
Рис. 10.6. Сообщение об ошибке, появляющееся при попытке удалить тип данных, находящийся в использовании
Создание и удаление пользовательских типов данных при помощи T-SQL
Системная хранимая процедура sp_addtype является командой T-SQL, применяемой для создания пользовательских типов данных. При помощи запуска этой команды в то время, когда вы работаете с модельной базой данных (базой данных model), можно организовать применение нового типа данных во всех вновь создаваемых пользовательских базах данных, потому что эти базы данных создаются с такими же атрибутами, как и у базы данных model. Запуск этой команды при работе с пользовательской базой данных позволит применять новый тип данных только в этой базе данных. (Помните, что для работы с конкретной базой данных вы должны запускать команду USE имя_базы_данных.) Ниже дан пример команд T-SQL, создающих пользовательский тип данных brand_type в базе данных model:
USE model GO sp_addtype brand_type, 'smallint', 'NOT NULL' GO
Три параметра у sp_addtype – это имя пользовательского типа данных, системный тип данных, на котором основывается новый тип данных и возможность использования null -значений в новом типе данных. Новый тип данных, brand_type, появится во всех вновь создаваемых пользовательских базах данных. Если вы создадите пользовательский тип данных в пользовательской базе данных и захотите посмотреть новый тип данных через Enterprise Manager, то выберите команду Refresh в меню Action Enterprise Manager’а.
Чтобы удалить ненужный пользовательский тип данных, запустите команду sp_droptype в базе данных, в которой этот тип данных был определен. Ниже дан пример команд T-SQL, удаляющих пользовательский тип данных brand_type из базы данных model. (Напомним, что если вы создали этот тип данных в пользовательской базе данных и хотите, чтобы в Enterprise Manager было видно, что этот тип данных был удален, то выберите в Enterprise Manager команду Refresh в меню Action.)
USE model GO sp_droptype brand_type GO
Создание таблиц Product_Info и Brands с применением пользовательских типов данных
Давайте вернемся к нашему примеру базы данных. Мы создадим заново таблицу Product_Info, пользуясь новым пользовательским типом brand_type, а затем создадим таблицу Brands. Эта таблица, как и таблица Product_Info, будет иметь колонку Brand_ID и мы применим для этих колонок одинаковый пользовательский тип данных brand_type. Сначала нам надо будет удалить старую таблицу Product_Info, чтобы мы смогли бы создать ее снова. Ниже показан код, который выполнит все необходимые действия:
USE MyDB GO DROP TABLE Product_Info GO CREATE TABLE Product_Info ( Product_ID smallint, Product_Name char(20), Description char(30), Price smallmoney, Brand_ID brand_type ) GO CREATE TABLE Brands ( Brand_ID brand_type, Brand_Name char(30), Supplier_ID smallint ) GO
Задав одинаковый тип данных brand_type для колонок Brand_ID в обеих таблицах, мы гарантируем одинаковость атрибутов обеих колонок. Нам не надо помнить об особенностях типа данных, на котором основывается тип данных brand_type, мы можем просто применять новый тип данных для всех колонок Brand_ID.
Кто же должен следить за этими пользовательскими типами данных? Администратор баз данных должен знать о применяемых пользовательских типах данных, чтобы следить как за правильностью самих типов данных, так и за правильностью их применения (хотя администратор баз данных, вероятно, и есть тот человек, кто первоначально задает пользовательские типы данных). Кроме того, о том, как определены эти типы данных, должен знать программист приложений, потому что это нужно ему для создания кода приложений. А вот конечным пользователям не нужно знать о пользовательских типах данных, потому что они все равно не поймут разницу между ними.
Создание таблиц в заданной группе файлов
При помощи SQL Server вы можете задать, в какой именно группе файлов будут размещаться те или иные таблицы и данные из этих таблиц (если вы создали одну или несколько пользовательских групп файлов). Если при создании таблицы группа файлов не была задана, то таблицы будут размещаться в первичной группе файлов, если только другая группа файлов не будет задана в качестве применяемой по умолчанию. (Группы файлов применяются для размещения файлов и индексов на заданных дисках или массивах дисков. Более подробно о них и о том, как и зачем таблицы данных размещаются в файлах и в группах файлов, было рассказано в лекции 9.)
Создание таблицы Product_Info в заданной группе файлов
Предположим, что в созданной нами базе данных MyDB имеется группа файлов с именем product_group, содержащая один вторичный файл данных, который размещен на другом диске (E), чем диск, на котором размещена первичная группа файлов (С). Применяя эту методику, вы можете физически отделить свои таблицы данных от системных таблиц SQL Server. Еще мы создадим на отдельном диске (F) файл журнала, чтобы отделить ввод-вывод журнала. (Про создание баз данных и применение групп файлов см.лекцию 9.) Необходимые команды могут выглядеть так:
USE master GO CREATE DATABASE MyDB ON PRIMARY -- Явное задание первичной -- группы файлов (не обязательно) (NAME = MyDBroot, -- Первичный файл данных FILENAME = 'c:\mssql2k\MSSQL\data\mydbroot.mdf', SIZE = 8MB, MAXSIZE = 10MB, FILEGROWTH = 1MB), FILEGROUP product_group -- Группа файлов для следующего файла (NAME = MyDBdata1, -- Вторичный файл данных FILENAME = 'e:\mssql2k\MSSQL\data\mydbdata1.ndf', SIZE = 1000MB, MAXSIZE = 1500MB, FILEGROWTH = 100MB) LOG ON (NAME = Logdata1, -- Файл журнала FILENAME = 'f:\log_files\logdata1.ldf', SIZE = 1000MB, MAXSIZE = 1500MB, FILEGROWTH = 100MB) GO
А теперь мы можем создать таблицу Product_Info в группе файлов product_group, пользуясь командой CREATE TABLE, как показано ниже.
USE MyDB GO CREATE TABLE Product_Info ( Product_ID smallint, Product_Name char(20), Description char(30), Price smallmoney, Brand_ID brand_type ) on product_group GO
Таблица и все данные, которые будут вставлены в таблицу, разместятся на диске E, диске, на котором была задана группа файлов product_group. Поэтому данные из таблицы Product_Info будут иметь свой дисковый накопитель, предназначенный для их ввода-вывода до тех пор, пока в этой же группе файлов не будут созданы другие таблицы.
Применение null-значений
Null-значение (null value) – это неизвестное значение, для которого применяется обозначение NULL. Способность хранить null-значения (nullability) – это свойство, благодаря которому колонка способна либо хранить null -значения, либо отвергать их. Null -значение в колонке обычно означает, что для данной строки этой колонки нет данных, потому что значение неизвестно, либо не имеет смысла, либо не задано или будет задано в будущем. Null -значения – это не пустые значения и не значения числа 0, их настоящие значения неизвестны (unknown), поэтому никакие два null -значения не являются равными.
Колонки, способные хранить null -значения, могут оказаться полезными в случаях, когда необходимая информация пока что недоступна для вас (это может быть, например, инициал для среднего имени покупателей). Что должно храниться в этой колонке для записи о некотором покупателе, который не имеет среднего имени, и поэтому не имеет среднего инициала? Если в этой колонке разрешено применять значения NULL, то null -значение будет правильным выбором и будет иметь смысл – благодаря этому вы поймете, что информация из данной колонки не имеет смысла.
Как правило, не следует применять null -значения. Из-за них запросы и обновления становятся более сложными, кроме того, к колонкам, способным хранить null -значения, нельзя применять некоторые настройки, такие как первичные ключи и свойство IDENTITY.
Прекрасной альтернативой применению null -значений в колонке является задание значения по умолчанию (default value) для этой колонки. Если значение не было задано при вводе строки, то в колонку записывается значение по умолчанию. (Более подробно о применении значений по умолчанию написано в лекции 16.) Если вы определите эту колонку, как способную хранить null -значения, т.е. два случая, когда колонка получит значение NULL:
- Если в таблицу добавляется строка, но не заданы данные для колонки, способной хранить null -значения, то SQL Server присвоит колонке значение NULL (если только для этой колонки не было задано значение по умолчанию).
- Пользователь может ввести слово "NULL" без кавычек (с кавычками будет введена текстовая строка "NULL").
Создание таблицы Product_Info с применением null-значений
Давайте вернемся к нашему примеру с таблицей Product_Info и зададим для каждой колонки возможность хранить null -значения. Если вы хотите, чтобы в колонке разрешалось хранить null -значения, то после типа данных надо добавить слово NULL. Если вы не хотите, чтобы разрешалось хранить null -значения, то после типа данных надо добавить слово NOT NULL. Мы рекомендуем всегда указывать, разрешается ли хранить в колонке null -значения, за исключением лишь случаев, когда применяются пользовательские типы данных (они уже заданы NULL или с NOT NULL ). Это поможет вам выработать привычку обращать внимание на необходимость способности к хранению null -значений в тех или иных колонках.
Пускай в нашем примере с таблицей Product_Info null -значения будет разрешено применять только в колонке для описаний продуктов. Мы не указали способность к хранению null-значений для типа данных brand_type, так как его способность к хранению null -значений уже была задана (как NOT NULL ) при создании этого пользовательского типа данных. Новый оператор CREATE TABLE будет выглядеть так:
USE MyDB GO DROP TABLE Product_Info GO CREATE TABLE Product_Info ( Product_ID smallint NOT NULL, Product_Name char(20) NOT NULL, Description char(30) NULL, Price smallmoney NOT NULL, Brand_ID brand_type ) GO
Теперь, если описание продукта (Description) не будет задано, а значения остальных четырех полей – заданы, то в таблицу будет введена новая строка со значением NULL для элемента данных, находящегося в колонке Description. Вы должны будете ввести значения для четырех остальных колонок, не допускающих ввода значений NULL (колонок Product_ID, Product_Name, Price и Brand_ID ). Если данные для какой-либо из этих колонок не ввести, то попытка ввести новую строку будет неуспешной.
Добавление свойства IDENTITY
Когда вы создаете таблицу, вы можете задать одну из колонок как идентифицирующую колонку (identity column), добавив к определению колонки свойство IDENTITY. Если колонка создается со свойством IDENTITY, то SQL Server автоматически генерирует для этой колонки значение строки, рассчитываемое по начальному значению (seed value) и значению приращения (increment value). Начальное значение (seed) является значением идентификации для первой строки, вставленной в таблицу. Приращение (increment) – это величина, на которую SQL Server увеличивает значение идентификации для последовательно вводимых строк. Каждый раз при вводе строки SQL Server присваивает текущее значение идентификации элементу данных в колонке идентификации, вводимому в новую строку. Следующая введенная строка получит значение идентификации, большее, чем текущее максимальное значение идентификации на величину приращения. Таким образом, каждая вводимая строка получит уникальное значение идентификации. Свойство идентификации полезно для создания колонок, в которых каждая строка должна иметь уникальный идентификатор, например, для колонки Product_ID. Если вы разрешите SQL Server генерировать идентифицирующие значения для вводимых строк, то это окажется проще, чем следить за правильностью ввода последовательных значений. Идентифицирующие колонки обычно применяются в ограничениях первичного ключа в таблицах, благодаря которым возможна уникальная идентификация строк. (Про ограничения первичного ключа см. лекции 16.)
Например, если вы зададите IDENTITY(0, 10), то значение идентифицирующей колонки для первой введенной строки будет равно 0, для второй строки будет равно 10, для третьей строки – 20, и т.д. Если начальное значение или приращение не задать, то для них будут применяться значения по умолчанию, равные 1 и 1. Вы можете задать как оба этих параметра, так и один из них. Идентифицирующие колонки не могут содержать значения по умолчанию и для них не разрешено применение null -значений. В каждой из таблиц может иметься только одна идентифицирующая колонка.
По умолчанию, непосредственный ввод данных в идентифицирующие колонки невозможен и они не могут быть изменены. Если вы хотите повторить ввод удаленной строки и хотите сохранить старое идентифицирующее значение этой строки, то вы можете преодолеть стандартные настройки, применив такой оператор:
SET IDENTITY_INSERT имя_таблицы ON
При помощи этого оператора можно вставить строку и назначить нужное вам значение идентифицирующей колонки. Закончив ввод строки, нужно отменить возможность вставки в идентифицирующую колонку при помощи такого оператора:
SET IDENTITY_INSERT имя_таблицы OFF
После этого, SQL Server, в качестве начального значения, применяемого при добавлении следующих строк, возьмет самое большое значение из данной колонки.
Добавление свойства IDENTITY для таблицы Product_Info
Давайте добавим свойство IDENTITY в таблицу Product_Info. Вместо того, чтобы вводить данные в колонку Product_ID , мы сделаем ее идентифицирующей колонкой, и пусть SQL Server автоматически генерирует ее значения, обеспечивая их уникальность. Ниже показан код T-SQL, который создаст такую таблицу:
USE MyDB GO DROP TABLE Product_Info GO CREATE TABLE Product_Info ( Product_ID smallint IDENTITY(1, 1) NOT NULL, Product_Name char(20) NOT NULL, Description char(30) NULL, Price smallmoney NOT NULL, Brand_ID brand_type ) GO
Колонка Product_ID теперь будет получать значения, начинающиеся с 1 и имеющие приращение 1 для каждой последующей строки, вставляемой в таблицу. Благодаря свойству IDENTITY, гарантируется, что каждому продукту будет назначено уникальное число-идентификатор, без необходимости какого-либо ввода со стороны пользователя. Выбор числа 1 в качестве приращения является произвольным. Какое бы приращение вы не применили, идентифицирующее значение будет уникальным.
Создание таблиц с помощью Enterprise Manager
Теперь, когда вы понимаете основные элементы, относящиеся к созданию таблиц при помощи SQL Server, давайте разберем пример создания таблицы при помощи Enterprise Manager. Однако прежде чем начать этот процесс, вы обязательно должны помнить, что проектирование всех ваших таблиц баз данных и их взаимоотношений должно производиться до того, как вы приступите к их фактическому созданию. Для создания таблицы базы данных с помощью SQL Server Enterprise Manager выполните следующие действия.
- Находясь в Enterprise Manager, раскройте группу SQL Server, а затем раскройте сервер.
- Раскройте папку Databases, чтобы стали видны имеющиеся базы данных.
- Раскройте базу данных, в которой вы хотите работать (в нашем примере – MyDB).
- Нажмите правой кнопкой мыши на папку Tables (Таблицы) и в появившемся контекстном меню выберите New Table (Новая таблица). Появится окно New Table (рис. 10.7).
увеличить изображение
Рис. 10.7. Окно New Table (Новая таблица)Окно New Table содержит таблицу, похожую на электронную таблицу Excel. Каждая строка таблицы в окне New Table обозначает одну колонку таблицы базы данных. Каждая колонка таблицы в окне New Table обозначает какой-либо атрибут колонки таблицы – тип данных, длину или способность хранить null -значения.Примечание. При именовании колонок таблиц базы данных следует придерживаться некоторых стандартов. На самом деле, не важно, какую именно систему для наименований вы выберите, но вы должны придерживаться принятых правил. Всякий раз, когда вы используете такую же колонку в другой таблице, применяйте точно совершенно одинаковые имена. Такое единообразное использование имен поможет вам не запутаться, когда вы будете выполнять запросы. - Задайте каждую из колонок вашей таблицы базы данных, заполняя поочередно строки таблицы окна: введите имена таблиц в колонке Column Name, выберите тип данных в выпадающих меню в колонке Data Type и выберите длину типа данных (если это допустимо, например, можно выбрать длину для символьных типов данных). Для переключения флажков в колонке Allow Nulls (Разрешаются null -значения) пользуйтесь клавишей Shift или нажимайте там мышью. В результате будет разрешаться или запрещаться применение null -значений. Заполнение для таблицы Product_Info показано на рис. 10.8. Обратите внимание, что для колонки Brand_ID мы выбрали пользовательский тип данных brand_type. Также обратите внимание, что по умолчанию флажок Allow Nulls (Разрешаются null -значения) в этой колонке установлен, даже для нашего типа данных brand_type, который был создан без разрешения применять null -значения. Вам следует снять этот флажок, чтобы обеспечить согласованность со способностью этого типа к хранению null -значений.
увеличить изображение
Рис. 10.8. Задание колонок при помощи окна New Table (Новая таблица)Данные в строках таблицы базы данных будут физически храниться в порядке, в котором вы задали колонки. Если вы пожелаете вставить в окно New Table строчку с определением колонки между двух уже имеющихся определений, то нажмите правой кнопкой мыши на строчку окна, под которой вы хотите вставить новую строчку, и в появившемся контекстном меню выберите команду Insert Column (Вставить колонку). Чтобы удалить строчку, нажмите правой кнопкой мыши на эту строчку и выберите Delete Column (Удалить колонку) в контекстном меню. В нашем примере с таблицей Product_Info мы зададим колонку Product_ID как колонку первичного ключа, нажав на ее имя правой кнопкой мыши и выбрав Set Primary Key (Задать первичный ключ) в контекстном меню. Рядом с именем колонки появится изображение ключа (рис. 10.9). (Про первичные ключи и другие ограничения см. лекцию 16.)
увеличить изображение
Рис. 10.9. Обозначение для первичного ключа - В нижней части окна New Table имеется вкладка с названием Columns, при помощи которой можно менять некоторые атрибуты колонки, выбранной в верхней части окна. Например, мы выбрали колонку Brand_ID, а затем во вкладке Columns задали ее назначение и значение по умолчанию, равное 0 (рис. 10.10).
увеличить изображение
Рис. 10.10. Вкладка Columns - Вы можете создавать другие ограничения и индексы для таблицы, нажимая на имена колонок правой кнопкой мыши и выбирая в контекстном меню Indexes/Keys (Индексы/Ключи), Relationships (Взаимоотношения), Constraints (Ограничения) или Properties (Свойства), либо нажав на значок-иконку Table and Index Properties (Свойства таблиц и индексов) рядом со значком-иконкой Save (Сохранить) в панели инструментов. Независимо от выбранного способа, появится окно свойств таблиц и индексов (рис. 10.11). Имя вашей таблицы будет обозначаться как Table1 или Table2 и т.д. Наша таблица получила имя Table2. При сохранении таблицы это имя можно изменить, см. описание следующего шага. Окно Properties имеет четыре вкладки, их подробные описания будут даны далее в материале нашей книги.
Рис. 10.11. Окно свойств таблиц и индексов - Чтобы дать имя этой новой таблице, нажмите на значок-иконку Save. Появится диалоговое окно, в котором вы можете задать имя таблицы. Введите с клавиатуры нужное имя и нажмите на OK, и тогда спроектированная вами таблица будет создана, а заданная информация сохранится. Теперь вы можете закрыть окно New Table, и имя вашей таблицы появится в правой панели Enterprise Manager.
Заключение
В этой лекции вы изучили основы создания таблиц, научились применять и задавать типы данных, размещать таблицы в группах файлов, применять null -значения и добавлять свойство IDENTITY. Желательно привести таблицы в их окончательную форму до того, как вы будете заполнять их данными. В лекции 15 показаны несколько способов для изменения таблиц при помощи T-SQL. В нескольких следующих лекциях вы узнаете об инсталляции и настройке сети и о Microsoft Cluster Server. Эти лекции помогут вам выполнить завершающие стадии настройки SQL Server.
Лекция 11. Конфигурирование Microsoft SQL Server в сети
После того как вы инсталлировали Microsoft SQL Server 2000, нужно сконфигурировать вашу систему для работы в сети. К этому моменту вы или администратор операционной системы Microsoft Windows NT или Microsoft Windows 2000, вероятно, уже сконфигурировали нужный сетевой протокол. Если сетевой протокол до сих пор еще не сконфигурирован, то вы можете без труда сконфигурировать его при помощи панели управления (Control Panel). Выбор протокола обычно определяется решениями на уровне всей вашей фирмы либо другими компьютерами, уже сконфигурированными в вашей сети. Хоть разные протоколы и имеют некоторые различия в производительности и функциональности, но большинство протоколов будут соответствовать вашим потребностям.
В данной лекции вы узнаете, как конфигурировать разнообразные сетевые компоненты для SQL Server, в том числе на уровне сетевого оборудования, на уровне сетевого протокола и на уровне сетевых библиотек SQL Server. В дополнение к этому материалу вы познакомитесь с компонентами для соединения с базами данных – DB-LIB и ODBC (Open Database Connectivity, открытый интерфейс доступа к базам данных), а также со средствами пулинга соединений ODBC. И в заключение вы изучите, как нужно наблюдать за сетью, чтобы выявлять в ней "узкие места", которые могут возникнуть при работе SQL Server (т.е. как осуществлять мониторинг сети).
Обзор сетевых служб
Для коммуникации между клиентами и серверами SQL Server применяются многие уровни работы программного обеспечения и оборудования. Каждый из этих уровней служит для выполнения присущих ему задач. Давайте вкратце рассмотрим все эти уровни; более подробное их описание будет дано далее в данной лекции. Высшим уровнем является интерфейс прикладного программирования для SQL Server (API, application programming interface). В качестве уровня API применяется что-либо из следующего списка:
- DB-LIB (старый API, специально предназначенный для SQL Server).
- ODBC (может соединяться с SQL Server или с другими продуктами-СУБД).
- OLE DB (для программистов ActiveX).
- ODS (Open Data Services).
API функционируют на вершине уровня сетевых библиотек, в котором содержатся одна или несколько сетевых библиотек (net-libraries, net libs). Сетевые библиотеки преобразуют команды и данные SQL Server в системные запросы, которые взаимодействуют с нижележащим уровнем сетевого протокола. Сетевые библиотеки являются компонентами SQL Server, а вот уровень сетевого протокола является компонентой операционной системы. Вы можете выбрать какую-либо из следующих сетевых библиотек:
- Named pipes (Именованные каналы)
- TCP/IP
- Multiprotocol
- NWLink IPX/SPX
- AppleTalk
- Banyan VINES
Точно так же, как уровень сетевых библиотек может содержать более одной сетевой библиотеки, уровень сетевого протокола может содержать более одного протокола, причем каждая сетевая библиотека взаимодействует с одним или с несколькими протоколами. Уровень сетевого протокола является компонентой операционной системы, "разговаривающей" на языке сетевого протокола. Вызовы и данные SQL Server помещаются внутрь сетевых вызовов, которые могут быть переданы на этом уровне через сеть. За исключением "multiprotocol", каждый сетевой протокол поддерживает одну из сетевых библиотек (имеющую имя, такое же, как имя протокола). При выборе "multiprotocol" производится поддержка средства для дистанционного вызова процедур Windows 2000 и Windows NT (RPC, remote procedure call), при этом происходит поддержка сокетов TPC/IP, протокола NWLink IPX/SPX, и именованных каналов (named pipes) одновременно.
Довольно часто в Windows NT или Windows 2000 запускают сразу по несколько сетевых протоколов. Про эти протоколы мы расскажем более подробно в разделе "Сетевые библиотеки" далее в данной лекции.
Самый нижний уровень коммуникации состоит из сетевых оборудования и драйверов устройств. Этот уровень обычно независим от уровня сетевого протокола, хотя некоторые зависимости все же имеются, например, отдельные устройства поддерживают не все сетевые протоколы. Сетевых протоколов существует много, а еще больше находится в процессе разработки. Уровень сетевого оборудования может состоять из нескольких технологий, в том числе следующих:
- Ethernet
- Token ring
- ATM (Asynchronous Transfer Mode)
- стандарт волоконно-оптических соединений Fiber optics
- модем
Уровни коммуникации должны иметься как на стороне клиента, так и на стороне сервера (рис. 11.1). Как можно видеть, при переходе от вызовов ODBC к фактической передаче данных требуется некоторая обработка данных. В данной лекции мы изучим не только соответствие функций различным уровням, но также и вопросы диагностики.
Рис. 11.1. Уровни коммуникации SQL Server
API для SQL Server
Для коммуникации с SQL Server ваши приложения должны уметь "разговаривать" на его языке. Это значит, что при коммуникации должно применяться одно из инструментальных средств, поставляемых вместе с SQL Server, например, командная строка OSQL или ISQLW (анализатор запросов SQL Server). Эти инструментальные средства могут быть полезными для простых запросов, но они не подходят для обработок, ежедневно выполняемых приложениями. Например, люди, работающие с информацией о запасах товаров на складе, со счетами кредиторов и со счетами к получению, трудятся более эффективно, когда пользуются графическим интерфейсом, а не когда набирают с клавиатуры операторы SQL. На самом деле, большинство из пользователей таких приложений вообще не знают SQL. Как правило, для создания приложений, взаимодействующих с SQL Server, разработчики применяют API (Application Programming Interface), интерфейсы прикладного программирования. Благодаря API можно вызывать разнообразные функции для работы с базами данных.
Вместе с SQL Server поставляется множество разных API, в том числе DB-LIB, ODBC и OLE DB. DB-LIB – это первоначальный, "родной" интерфейс API для SQL Server, он доступен и для Microsoft SQL Server и для продуктов Sybase. ODBC – новее и гибче и может применяться для коммуникации с любым количеством реляционных СУБД. Для работы с SQL Server программистам доступны для применения также OLE DB и еще несколько других API. В данном разделе вы найдете описания различных API.
Соединения DB-LIB
Интерфейс DB-LIB был частью SQL Server начиная с первых версий SQL Server, еще с 1988 года. DB-LIB является первоначальным, исконным API для программирования SQL Server. Хотя DB-LIB всегда был составной частью SQL Server, происходит постепенный отказ от него в пользу ODBC, так что ODBC становится основным API. Языки C и C++, а также Microsoft Visual Basic поддерживают DB-LIB. Вызовы DB-LIB производятся из кода приложений, а затем отправляются через сетевую библиотеку, через уровень сетевого протокола и затем на уровень сетевого оборудования.
Соединения ODBC
ODBC – это стандартный API-интерфейс, разработанный фирмой Microsoft для упрощения соединения компьютеров под управлением Windows с различными реляционными СУБД. Благодаря программированию при помощи API-интерфейса ODBC, вы можете применять одно и то же приложение для коммуникации с любым количеством систем. ODBC обладает многофункциональностью, но может оказаться не самым эффективным API для некоторых реляционных СУБД. Как правило, "родные" API поддерживают большую функциональность и оптимизированы для работы со своими реляционными СУБД.
ODBC применяется для поддержки дополнительных возможностей соединения через Интернет с применением "активных серверных страниц" ASP (Active Server Pages). Также там имеется поддержка ActiveX, MFC (Microsoft Foundation Classes) и XML (Extensible Markup Language). За последние несколько лет поддержка ODBC выросла очень значительно, благодаря чему ODBC стал основным API для продуктов, поддерживающих много реляционных СУБД.
API ODBC имеет одинаковую форму независимо от того, с какой реляционной СУБД вы соединяетесь, но это не относится к драйверам ODBC. Вам придется приобретать по драйверу ODBC для каждой используемой реляционной СУБД. Эти драйверы преобразуют ODBC в "родной" сетевой протокол реляционной СУБД. Для оптимальной работы новых версий реляционных СУБД обычно требуются и новые драйверы ODBC, хотя обратная совместимость, как правило, поддерживается. В DB-LIB обычно применяется специфическая сетевая библиотека, а в ODBC – многопротокольная сетевая библиотека. Эта библиотека упрощает соединение приложений ODBC с сервером и избавляет от необходимости выбирать какой-либо определенный протокол.
Пулинг соединений ODBC
Способность к пулингу (объединению ресурсов) при выполнении соединений, вызываемых изнутри приложений, появилась в ODBC версий 2.х. Как правило, каждое приложение создает по одному соединению между уровнем приложений и базой данных всякий раз, когда в это приложение входит еще один пользователь. Этот процесс может оказаться неэффективным, т.к. установление и поддержание соединений с базой данных приводит к довольно-таки большой нагрузке на компьютер.
Благодаря пулингу соединений все новые потоки из одного приложения могут пользоваться существующими соединениями ODBC и для них не потребуется создавать и поддерживать дополнительные соединения. Эта возможность может быть особенно полезна для Интернет-приложений, которые могут соединяться многократно. Приложения, для которых нужен пулинг соединений, должны регистрировать себя при своем запуске.
Когда приложение запрашивает соединение ODBC, ODBC Connection Manager (Диспетчер соединений ODBC) определяет, должно ли инициироваться новое соединение или же надо воспользоваться уже имеющимся соединением. Это решение принимается без возможности приложения влиять на него. Затем потоки приложения работают как обычно.
Когда поток завершает свою работу с соединением ODBC, приложение делает вызов для освобождения этого соединения. И снова ODBC Connection Manager берет на себя управление над соединением. А если какое-либо соединение простаивает в течение некоторого периода времени, то ODBC Connection Manager может закрыть его.
Другие API
Имеется множество других API, при помощи которых ваши приложения могут соединяться с SQL Server. Это, например, OLE DB, ODS, SQL-DMF (SQL-Distributed Management Framework), SQL-DMO (SQL-Distributed Management Objects) и SQL-NS (SQL-Namespace). Как правило, каждый из этих протоколов поддерживает те или иные специфические функции или сегмент рынка, для которого требуется свой собственный интерфейс программирования.
Сетевые библиотеки
Уровень сетевых библиотек SQL Server преобразует вызовы API в вызовы, специфичные для протоколов, а затем передает их ниже, на уровень сетевого протокола. На клиентских компьютерах администрирование уровня сетевого протокола производится при помощи утилиты Client Network Utility, а на сервере – при помощи утилиты Server Network Utility. Благодаря этим утилитам вы можете добавлять или удалять сетевые библиотеки как на сервере, так и на любом из компьютеров-клиентов. Чтобы взаимодействие с SQL Server было возможным, сетевые библиотеки, имеющиеся на компьютерах-клиентах, должны быть доступны и на сервере. В одной сети могут работать одновременно сразу несколько протоколов. Например, некоторые из компьютеров-клиентов могут взаимодействовать с SQL Server при помощи именованных каналов (named pipes), а другие клиенты в той же сети могут взаимодействовать с SQL Server при помощи TCP/IP.
Утилита SQL Server 2000 Server Network Utility
Как правило, на одном компьютере-сервере конфигурируют несколько протоколов. По умолчанию на сервере инсталлируются сетевые библиотеки для именованных каналов и TCP/IP. Чтобы сконфигурировать на сервере дополнительные сетевые библиотеки, выполните следующие действия:
- Запустите Server Network Utility, нажав на экранную кнопку Start, укажите курсором мыши на Programs, затем укажите на Microsoft SQL Server и, наконец, выберите Server Network Utility. Появится диалоговое окно SQL Server Network Utility (рис. 11.2).
Рис. 11.2. Вкладка General диалогового окна SQL Server Network Utility - Диалоговое окно SQL Server Network Utility имеет две вкладки: General (Общие) и Network Libraries (Сетевые библиотеки). Вкладка General служит для включения и отключения сетевых протоколов. Включенные протоколы показаны в правом списке в порядке, в котором SQL Server будет пытаться применять их. При помощи вкладки General можно выполнять следующие операции:
- включать новые протоколы, выбрав сначала один или несколько протоколов из списка отключенных протоколов, а затем нажав на кнопку Enable;
- отключать протоколы, выбрав один или несколько протоколов из списка включенных протоколов, а затем нажав на кнопку Disable;
- изменять свойства включенного протокола, выбрав имя протокола, а затем нажав на кнопку Properties;
- включить шифрование протокола с помощью SSL (Secure Sockets Layer);
- включить поддержку WinSock Proxy.
Рис. 11.3. Вкладка Network Libraries диалогового окна SQL Server Network Utility
Утилита SQL Server 2000 Client Network Utility
На другой стороне сетевого соединения находится компьютер-клиент, который конфигурируется довольно-таки похоже на компьютер-сервер. Чтобы сконфигурировать компьютер-клиент, выполните на нем следующие действия:
- Запустите Client Network Utility, нажав на экранную кнопку Start, указав на Programs, затем указав на Microsoft SQL Server, и, наконец, выбрав Client Network Utility. Появится диалоговое окно SQL Server Client Network Utility (рис. 11.4), которое выполняет некоторые функции, такие же, как у диалогового окна SQL Server Network Utility, а также еще и многие другие функции.
В то время как диалоговое окно SQL Server Network Utility просто показывает список сетевых библиотек и параметров их соединений, при помощи окна SQL Server Client Network Utility можно указывать, какие протоколы на клиентах должны применяться по умолчанию, а также задать алиас сервера (псевдоним). Включенные протоколы показаны на вкладке General в том порядке, в котором они должны применяться. Например, на рис. 11.4 заданы следующие протоколы: сначала именованные каналы (named pipes), а затем TCP/IP. В нашем примере клиент сначала попытается соединиться с сервером через именованные каналы. Если это не получится, то клиент тогда попытается соединиться с сервером при помощи TCP/IP. Если и это не получится, то клиент выдаст сообщение об ошибке соединения.
Рис. 11.4. Вкладка General диалогового окна SQL Server Client Network UtilityАлиас сервера (псевдоним) позволяет отказаться от списка включенных протоколов и дает возможность пользоваться только каким-либо определенным протоколом. Если соединение при помощи этого протокола не получится, то попыток применить другие протоколы не последует. Если у вас имеется несколько серверов, не применяющих общий протокол, то нужно поместить наиболее употребительный протокол на верхнюю строчку списка включенных протоколов. Это минимизирует длительность времени, которое потратилось бы на попытки повторных соединений. Включать и отключать протоколы несложно. Для включения протокола просто выберите нужный протокол в списке отключенных протоколов, а затем нажмите на кнопку Enable. Чтобы отключить протокол, выберите нужный протокол в списке включенных протоколов, а затем нажмите на кнопку Disable.Вы можете изменять свойства включенных протоколов, выбрав протокол в списке Enabled protocols by order, а затем нажмите на кнопку Properties. Но надо заметить, что значения, применяемые по умолчанию, оптимально подходят почти для всех сетей.
Из вкладки General можно также включить шифрование протоколов, что защитит данные при передаче через сеть. Эта возможность доступна только для протокола multiprotocol.
- Чтобы задать алиас сервера, откройте вкладку Alias. В этой вкладке перечислены все существующие алиасы. Чтобы добавить новый алиас, нажмите на Add. Появится диалоговое окно Add Network Library Configuration (Добавить конфигурацию сетевой библиотеки) (рис. 11.5).
- В этом диалоговом окне вы можете добавить алиас, задающий нужный протокол. Этот сетевой протокол должен быть сконфигурирован на компьютере-клиенте и должен быть задан здесь, тогда клиент сможет осуществлять коммуникацию при помощи этого протокола. При попытках соединения с алиасом, клиент SQL Server будет применять сетевую библиотеку и параметры соединения, заданные вами здесь. Если приложение будет пытаться соединиться с сервером не через алиас, то будет применяться протокол, используемый по умолчанию.
Рис. 11.5. Диалоговое окно Add Network Library Configuration - Во вкладке DB-Library Options диалогового окна SQL Server Client Network Utility (рис. 11.6) показана информация о DB-Lib и имеются флажки Automatic ANSI to OEM conversion и Use international settings. При помощи первого флажка можно включить автоматическое преобразование от кодировки символов ANSI к кодировке OEM при коммуникации с SQL Server. При помощи второго флажка можно задать, чтобы форматы дат, времени и денежных единиц применялись бы те, что заданы для текущего компьютера, а не пользоваться жестко заданными настройками этих форматов.
Эти флажки, как правило, снимать не нужно. Установленные флажки вызывают некоторую дополнительную нагрузку на компьютер, но зато и повышают функциональность.
Рис. 11.6. Вкладка DB-Library Options диалогового окна SQL Server Client Network Utility - В диалоговом окне SQL Server Client Network Utility имеется также вкладка Network Libraries (рис. 11.7). Как и одноименная вкладка из утилиты SQL Server Network Utility, эта вкладка просто показывает список доступных сетевых библиотек и информацию о номерах их версий.
Большинство проблем с соединениями возникают из-за того, что на компьютере-клиенте неправильно задан порядок сетевых библиотек. При появлении проблем с соединениями первым делом надо проверить настройки сетевых библиотек.
Рис. 11.7. Вкладка Network Libraries диалогового окна SQL Server Client Network Utility
Сетевые библиотеки и протоколы SQL Server
Как мы уже говорили, SQL Server поддерживает множество сетевых библиотек: именованные каналы (named pipes), TCP/IP, multiprotocol, NWLink IPX/SPX, AppleTalk, Banyan VINES, VIA (Giganet) и VIA (ServerNet II). Каждая сетевая библиотека соответствует своему сетевому протоколу или набору протоколов. В этом разделе мы дадим краткий обзор каждой из сетевых библиотек.
Сетевой протокол, с помощью которого вы запускаете SQL Server, будет определяться, скорее всего, исходя из стандартов, принятых в вашей фирме, или в зависимости от того, что применяется на остальных компьютерах. Все команды и функции SQL Server могут передаваться через все сетевые протоколы, однако некоторые протоколы работают быстрее других. Кроме того, некоторые протоколы поддерживают маршрутизацию и службы имен, а некоторые – не поддерживают.
Named Pipes – именованные каналы
Протокол named pipes (именованные каналы) был разработан фирмой Microsoft несколько лет тому назад. В named pipes поддерживаются два режима: локальный и удаленный (дистанционный). Протокол local named pipes применяется в случаях, когда и клиент, и сервер находятся на одном и том же компьютере, а remote named pipes применяется, когда клиент и сервер находятся на разных компьютерах. Если соединение установлено через named pipes, сетевые утилиты SQL Server распознают, как оно осуществлено – с помощью локальных именованных каналов (local named pipes) или же с помощью удаленных (дистанционных) именованных каналов (remote named pipes).
Именованные каналы – это клиентский протокол, применяемый по умолчанию, и он является протоколом, применяемым по умолчанию в операционных системах Windows NT 4 Server и Windows 2000. В операционных системах Microsoft Windows 95 и Microsoft Windows 98 именованные каналы применяться не могут. В этих системах на стороне сервера применяются протоколы TCP/IP, multiprotocol и shared memory. Хотя протокол "именованные каналы" работает эффективно, он обычно не используется в больших сетях, потому что он не поддерживает маршрутизацию и шлюзы. Также не рекомендуется его применение на медленных сетях, т.к. по сравнению с другими протоколами, например, TCP/IP, для него требуется передача значительно большего объема информации между сервером и клиентом.
TCP/IP
Протокол TCP/IP является одним из наиболее популярных сетевых протоколов, из-за очень большого количества компьютеров, на которых он работает, из-за того, что его применение принято в качестве стандарта, и из-за его высокой скорости. Он также является сетевым протоколом, применяемым в Интернете. Сетевая библиотека TCP/IP является одной из наиболее высокопроизводительных сетевых библиотек SQL Server. Благодаря высокой скорости и богатым возможностям TCP/IP станет хорошим выбором.
Multiprotocol
Сетевая библиотека multiprotocol – это новинка, появившаяся в SQL Server 7 и сохранившаяся в SQL Server 2000. Эта сетевая библиотека на самом деле является совокупностью нескольких сетевых библиотек. Поэтому она не так эффективна, как одиночные сетевые библиотеки, но зато обеспечивает большую гибкость. Сетевая библиотека multiprotocol поддерживает протоколы TCP/IP, NWLink IPX/SPX и именованные каналы (named pipes). При использовании сетевой библиотеки multiprotocol обычно используется первый из протоколов, имеющихся на клиенте и на сервере. Так как клиент может соединяться с разными серверами при помощи разных протоколов, то multiprotocol является идеальным выбором.
NWLink IPX/SPX
Протокол NWLink IPX/SPX идеально подходит для интеграции (встраивания) систем SQL Server 2000 в сети Novell NetWare, потому что интеграция в нем реализована гладко, "без швов". Протокол IPX/SPX известен уже долгое время и обладает высокой производительностью и надежностью.
AppleTalk
AppleTalk – это сетевой протокол, разработанный фирмой Apple Computer и применяемый в компьютерах Apple. Windows NT и Windows 2000 поддерживают AppleTalk, благодаря чему серверы и клиенты Windows NT и Windows 2000 могут гладко, "без швов", интегрироваться в окружение AppleTalk.
Banyan VINES
Сетевая библиотека Banyan VINES служит для поддержки компьютеров, работающих в сети VINES. С помощью этой сетевой библиотеки можно интегрировать клиенты и серверы Windows в окружение VINES.
VIA (Virtual Interface Architecture)
Этот протокол поставляется в двух вариантах – Giganet и ServerNet II. Он хорошо подходит для кластеризованных серверов.
Выбор сетевой библиотеки
Выбор сетевой библиотеки должен осуществляться исходя из того, какие протоколы применяются в вашей сети. Проблемы с соединениями обычно возникают, когда сетевые библиотеки на сервере не синхронизованы с сетевыми библиотекам на клиенте. Если при соединении с сервером возникают трудности, то проверьте, как заданы сетевые библиотеки на обеих сторонах соединения. Также попробуйте соединиться с сервером при помощи другой программы, например, при помощи PING или Проводника Windows (Microsoft Windows Explorer), чтобы понять, относится ли проблема к работе SQL Server или же не работает сама сеть.
Сетевые компоненты и производительность SQL Server
Сеть состоит из двух уровней: уровня программного обеспечения, реализованного сетевыми протоколами, и уровня оборудования (аппаратуры). В рамках нашей книги к уровню оборудования будут отнесены также драйверы сетевого оборудования, необходимые для работы этого оборудования. Данные уровни независимы друг от друга и каждый из них может содержать много компонент. Например, можно запускать одновременно TCP/IP и IPX/SPX "поверх" одной и той же сетевой платы, а можно и применять одновременно много сетевых плат, работающих с одним и тем же протоколом (рис. 11.8).
Рис. 11.8. Уровни сети
Каждый сетевой уровень имеет свои собственные характеристики и показатели производительности. Как уже говорилось, имеются разные причины для выбора тех или иных протоколов и компонент сетевого оборудования. Обычно выбор диктуется правилами, принятыми в вашей фирме, и тем, с каким другим сетевым оборудованием ваши системы будут соединяться через сеть. В нашем курсе вы не найдете призывов применять тот или иной сетевой протокол или какое-либо определенное сетевое оборудование. В данном разделе мы оценим относящиеся к программному обеспечению и к оборудованию факторы, которые могут повлиять на функциональность и производительность SQL Server.
Уровень программного обеспечения (сетевые протоколы)
Как уже говорилось, к сетевым протоколам относятся именованные каналы (named pipes), TCP/IP, NWLink IPX/SPX, AppleTalk и Banyan VINES. Важно отметить, что все сетевые протоколы функционируют примерно одинаковым образом, по крайней мере, с точки зрения SQL Server. Если сеть не функционирует или работает не так, как вам надо, то эта проблема, скорее всего, связана с уровнем оборудования.
С другой стороны, проблемы с соединениями обычно возникают либо на уровне сетевых библиотек, либо на уровне сетевого протокола. Если у вас имеются проблемы с соединением клиента SQL Server с сервером SQL Server 2000, то попробуйте соединиться как-либо по-другому, например, через Проводник Windows. Если вы можете соединиться через Проводник Windows, но не можете через SQL Server, то ваша проблема, видимо, связана с SQL Server. Проверьте, что попытки соединения производятся через правильный сетевой протокол. Если сконфигурировано много протоколов, то будет сложнее определить, какой именно протокол используется. Если вы можете соединяться с сервером через PING, Internet Explorer или через какой-либо другой внешний источник, то проблема связана, скорее всего, с вашим выбором сетевых библиотек.
Независимо от того, какой именно сетевой протокол вы применяете, на уровне оборудования может возникнуть множество вопросов, относящихся к производительности. Вы избавитесь от многих проблем, если сконфигурируете систему так, что она не будет выходить за пределы возможностей вашей сети.
Уровень оборудования (аппаратный уровень)
Вы должны понимать работу уровня оборудования (аппаратного уровня), чтобы уметь найти причину возникновения проблем с производительностью. Уровень физического оборудования и уровень протоколов независимы друг от друга, это значит, что вы можете запускать разные сетевые протоколы на любом количестве устройств сетевого оборудования. Производительность сети можно оценить в зависимости от выбранного вами сетевого оборудования. Объем трафика, который может быть обработан сетью, зависит как от типа сети, так и от ее скорости.
Пропускная способность сети
Пропускная способность сети – это показатель объема данных, которые могут быть переданы через сеть за заданный промежуток времени. Иногда пропускная способность указывается в названии сетевого оборудования, например, 10BaseT или 100BaseT, что означает, соответственно, пропускную способность 10 и 100 Мбит/с.
Однако, измерение пропускной способности сети может привести к обманчивым результатам. Для большинства сетевых адаптеров скорость, с которой этот сетевой адаптер может передавать данные, уменьшается при уменьшении объема передаваемых данных, потому что каждая передача через сеть вызывает некоторую дополнительную нагрузку на компьютер. Например, нагрузка, вызываемая передачей 64 Kб данных приблизительно равна нагрузке, необходимой для передачи 2 Кб данных. Реляционные СУБД, в том числе и SQL Server, обычно передают небольшие объемы данных. Поэтому объем данных, который может быть обработан вашим сервером, может оказаться меньше, чем пропускная способность сетевого оборудования.
Ethernet
Хотя существует много разных стандартов сетевого оборудования, но, наверное, самым популярным из них является Ethernet. За последние несколько лет скорость Ethernet выросла и продолжает расти. Ethernet был разработан фирмами Xerox, DEC и Intel в 1976 году. В то далекое время применялся коаксиальный кабель (coaxial cable, сокращенно – "coax") и пропускная способность Ethernet составляла около 3 Mбит/с. После появления технологии 10BaseT пропускная способность выросла до 10 Mбит/с, а после появления технологии 100BaseT – до 100 Mбит/с. Вскоре ожидается появление Gigabit Ethernet, и тогда пропускная способность увеличится до 1 Гбит/с. Показатели пропускной способности Ethernet приведены ниже в таблице:
Сеть | Пропускная способность |
---|---|
Coax Ethernet | 3 Mбит/с |
10BaseT | 10 Mбит/с |
100BaseT | 100 Mбит/с |
Gigabit Ethernet | 1000 Mбит/с |
Несмотря на стремительный рост производительности, Ethernet страдает от серьезной проблемы: иногда сетевые адаптеры Ethernet пытаются передавать данные одновременно. Если два или несколько сетевых адаптеров Ethernet осуществляют передачу данных полностью одновременно, то возникнет коллизия передачи данных. Каждый из адаптеров-участников коллизии должен подождать, а затем снова попытаться передать данные. Хотя вызванные этим потери времени и невелики, но эти задержки все же замедляют передачу данных. Чем больше коллизий будет происходить, тем дольше придется ждать повторных попыток передачи данных. При увеличении объема сетевого трафика вероятность коллизий возрастает. Если объем трафика приближается к пропускной способности сети, то вероятность коллизий становится довольно высокой (рис. 11.9). Коллизии снижают производительность. Поэтому важно следить за сетевым трафиком и наблюдать за коллизиями. Например, можно придерживаться практического правила, согласно которому пропускная способность сети не должна расходоваться более чем на 75%. Конечно, ваша сеть будет переживать кратковременные периоды интенсивного использования, когда трафик будет превышать это значение, но речь идет о том, что превышения 75% уровня не должны длиться долго.
Рис. 11.9. Взаимосвязь между вероятностью коллизий и загруженностью сети
Token Ring
В сетях Token Ring (Маркерное кольцо) каждый член "кольца" (member of the ring) имеет возможность общаться с другими членами, передавая "маркер" (token). Этот маркер разрешает передавать данные только одному компьютеру в сети – тому, кто имеет его в данный момент. Применяя этот тип архитектуры, вы можете расходовать почти полностью всю пропускную способность сети, без возникновения чрезмерных задержек коммуникации.
Token Ring, как и Ethernet, содержит в себе множество технологий, каждая из которых имеет свою пропускную способность, как показано в таблице ниже. Но поскольку Token Ring является последовательностью соединений "от точки к точке", то коллизии здесь возникнуть не могут, даже при использовании полностью пропускной способности. Как и технология Ethernet, Token Ring тоже постоянно совершенствуется.
Сеть | Пропускная способность |
---|---|
IEEE 802.3 Token Ring | 1, 4 или 16 Mбит/с |
IEEE 802.5 | 100 Mбит/с |
Gigabit Token Ring | 1000 Mбит/с |
Кроме Ethernet и Token Ring существуют и многие другие стандарты сетевого оборудования, в том числе ATM и "fiber optics".
Мониторинг сети
Как вы уже видели, выбранные вами тип и скорость сетевого оборудования могут повлиять на общую производительность вашей системы базы данных. Если вы попытаетесь передавать объем данных больший, чем ваша сеть сможет обработать, то передачи данных выстроятся в очередь и начнутся задержки, которые замедлят работу всей системы.
Максимальную производительность сети вы можете оценить исходя из характеристик установленного сетевого оборудования. Вы также должны находить причины возможных проблем с производительностью. При помощи этой информации вы часто сможете решать проблемы простым добавлением сетевых плат. Первым шагом в диагностике проблем с производительностью является периодический мониторинг сети. Собранная информация пригодится для определения причины проблемы и для выработки способа преодоления проблем, которые могли бы возникнуть.
Мониторинг производительности
Мониторинг сети совсем не так прост, как можно было бы подумать. Для эффективного мониторинга сети обычно приходится покупать дополнительное оборудование или программное обеспечение для мониторинга сетей. При решении вопроса о необходимости этих приобретений надо учесть пару факторов, которые описаны в следующих двух абзацах.
Во-первых, может быть так, что не все серверы и клиенты базы данных в вашей физической сети применяют одинаковые протоколы. Например, компьютер, исполняющий TCP/IP на Ethernet, сможет обнаруживать (на уровне операционной системы) только трафик, который по своей природе является трафиком TCP/IP. Пакеты IPX/SPX будут отбрасываться уже на уровне драйверов. Как правило, для программного обеспечения мониторинга сетей потребуются нестандартные драйверы устройств и компоненты сетевого уровня.
Во-вторых, сетевые платы сами по себе отбрасывают данные, которые не предназначены для конкретного компьютера, поэтому не все сетевые данные попадают в драйвер и в операционную систему. Для наблюдения за всей сетевой активностью вам придется применять нестандартные драйверы устройств и компоненты сетевого уровня. Из-за этого типичная рабочая станция обычно не сможет следить за всем трафиком в физической сети, если только ее не подвергнуть специальной модификации.
Как только вы установите оборудование для мониторинга сети или программное обеспечение, или и то, и другое, вы сможете получить хорошую информацию для оценки объема трафика, обрабатываемого в вашей сети. Этот трафик может быть заметен для ваших компьютеров, но иногда трафик возникает из-за проблем с маршрутизацией и или с конфигурированием. (Диагностика проблем сетевого оборудования выходит за тему нашего курса.) После того как ваша система сетевого мониторинга стала работать, нужно рассмотреть следующие вопросы:
- Загруженность. Какой объем данных передается через сеть? Как эта величина соотносится с пропускной способностью сетевого оборудования?
- Размеры пакетов. Какой объем передач через сеть? Это большие, эффективные, передачи данных или же маленькие?
- Коллизии (если таковые бывают). Нет ли большого количества коллизий? Если да, то какова причина этого?
- Ошибки. Нет ли большого количества поврежденных передач данных, для которых требуются повторные передачи? Это может быть признаком неисправности сетевых адаптеров или кабелей.
Диагностика причин проблем
После того как вы соберете информацию о производительности, надо будет найти причину проблемы. Это не всегда просто. Проблемы с производительностью сети обычно не проявляют себя в виде ошибок, их действие выражается в снижении производительности. Чтобы диагностировать наличие проблемы, вам придется сравнивать информацию, собранную при мониторинге, с информацией о конфигурации сети.
Можно рекомендовать не допускать трафика, превышающего 75% от пропускной способности сети. Если большинство данных, передаваемых через сеть, имеют небольшие объемы, то этот процент можно и снизить, т.к. обработка большого количества передач данных малого объема вызывает большую загруженность, чем обработка малого количества объемистых передач данных. В сети Ethernet такое уменьшение порогового процента также уменьшит и количество коллизий. Время отклика для сетевых запросов уменьшится, а сеть станет более быстрой.
Некоторые проблемы носят, по сравнению с пропускной способностью, более очевидный характер. Проверьте, нет ли высокого уровня коллизий или ошибок. Если вы приблизились к 75-процентному порогу и уровень коллизий высок, то это значит, что вы приблизились к пределу возможностей сети. Если сетевой трафик достаточно мал, а коллизий много, то, вероятно, причины в оборудовании.
Также обратите внимание на ошибки при передаче данных, это обычно является признаком неправильной работы оборудования. Неисправности оборудования могут возникать везде – как в сетевых платах, так и в кабелях, маршрутизаторах, мостах и т.д. Когда станет ясна причина проблемы, можно будет звать специалиста по сетям.
Способы решения проблем с сетями
Проблемы с пропускной способностью, в зависимости от их существа, могут быть решены различными способами. Они могут быть решены приобретением дополнительного оборудования или заменой оборудования, либо сегментированием сети, или даже переделкой приложения.
Один из способов снижения загруженности сети заключается в увеличении пропускной способности сети. Переход от 10BaseT к 100BaseT повышает пропускную способность десятикратно. Такое решение – простое и быстрое, но может оказаться дорогостоящим. Давайте рассмотрим альтернативные способы.
Если вы видите, что объем трафика, передаваемого через сеть, очень велик, то, может быть, наступила пора разделить сеть на подсети, выделив подсети для отделов и рабочих групп вашей фирмы. Разделяя сеть на подсети, вы создаете отдельные сети для каждого подразделения и отдела, вместо того, чтобы помещать всю фирму в одну сеть. Благодаря этому количество компьютеров в отдельных сетях уменьшится и трафик тоже уменьшится. Иногда сети растут медленно в течение длительного времени, и вы можете не замечать дополнительный трафик до тех пор, пока не начнутся проблемы с производительностью. Применение подсетей может оказаться наилучшим решением для преодоления перегрузки сетей.
Другое решение – рассмотреть применение сети с точки зрения функциональности. Есть ли серьезные причины для использования сети? Быть может, приложения возвращают слишком большие объемы данных? Всегда полезно посмотреть на клиентские приложения SQL Server и проверить, не запрашивают ли они больше строк, чем это нужно пользователям. Если у вас много пользователей, то возврат минимально возможного количества строк станет простым способом уменьшить сетевой трафик.
Как видите, могут быть разные проблемы и разные способы их решения. Не бойтесь рассматривать все имеющиеся возможности. Иногда проблемы с производительностью сети могут быть проявлением логических ошибок в приложениях. Могут выявиться также ошибки в планировании времени, так, было бы неправильным запланировать резервное копирование сети в разгар рабочего дня.
Заключение
В этой лекции вы изучили основы работы и конфигурирования SQL Server в сетях. Вы познакомились с применяемыми в SQL Server уровнями сетей, от API до сетевых библиотек, сетевых протоколов и, наконец, до сетевого оборудования. Каждый из этих уровней является независимым, но все они взаимно подходят друг к другу в различных конфигурациях. У вас имеется очень много свободы при выборе различных API, сетевых библиотек, протоколов и даже аппаратных решений. И не забывайте периодически проверять сетевой трафик, что поможет избежать проблем с производительностью еще до того, как они возникнут. (О типичных проблемах с производительностью см.лекцию 36, а о том, как следует конфигурировать SQL Server со службой Microsoft Cluster Services, чтобы получить высоконадежную систему, см.лекцию 12.)
Лекция 12. Microsoft SQL Server и Microsoft Cluster Services
В последние годы системы Microsoft SQL Server 2000 превратились из систем для настольных компьютеров сначала в системы для рабочих групп, а теперь и в системы для внутренних офисов. Эти системы теперь стали крупнее и их важность для бизнеса повысилась, поэтому повысились и требования к их стабильности, к возможностям дистанционного администрирования и их отказоустойчивости. Чтобы добиться удовлетворения этих требований, фирма Microsoft затратила очень много времени и усилий на поиск ошибок в программах и на улучшение поддержки пользователей. Microsoft усовершенствовала инструментальные средства для администрирования и улучшила возможности дистанционного администрирования, были созданы такие технологии, как "Службы Кластеризации", MSCS (Microsoft Cluster Services). Кластером называется группа компьютеров, которые обеспечивают друг для друга взаимное резервное копирование на случай отказов. В этой лекции вы узнаете, как работает служба MSCS и как их конфигурировать, а также научитесь планировать действия в случае возможных отказов и узнаете, как выполнять восстановление после отказов. Служба MSCS сама по себе не может обеспечить отказоустойчивость вашей системы; чтобы ваша система могла быть восстановлена после отказов, эта технология должна применяться в сочетании с тщательным планированием.
Разновидности отказов
Главной обязанностью администратора базы данных является поддержание базы данных в рабочем состоянии в течение требуемых периодов времени, которые обычно указываются в соглашении об уровне обслуживания (service level agreement). В этом соглашении об уровне обслуживания обычно указывается объем периодов работоспособности системы, а также показатели производительности и длительность времени восстановления в случаях отказов в работе. Применение MSCS может увеличить длительность периодов работоспособности системы и сократить длительность времени восстановления. Несмотря на то, что аппаратура сервера, Windows 2000, Windows NT и SQL Server обычно стабильны и надежны, отказы все равно иногда случаются. На самом деле, в сложной компьютерной системе могут случаться разнообразные типы отказов, в том числе следующие:
- Отказы дисковых накопителей. Технология дисковых накопителей значительно усовершенствовалась, но дисковые накопители по-прежнему остаются механическими устройствами и, следовательно, подвержены износу. Дисковые накопители являются одной из наиболее типичных причин отказов.
- Отказы оборудования. Отказы оборудования могут происходить из-за износа и повреждения его компонент, чаще всего из-за перегрева. Со временем может отказать аппаратура компьютеров даже наивысшего качества.
- Отказы компонент программного обеспечения. Некоторые пороки программного обеспечения оборудования могут проявиться только при редком сочетании обстоятельств. Ваша система может работать многие месяцы или годы, пока некоторое сочетание условий не заставит проблему проявиться. Кроме того, при добавлении приложений в стабильно работающее окружение может произойти изменение библиотеки или файла, имеющих критическую важность, что и вызовет проблемы.
- Внешние отказы. Система может отказать из-за внешних причин, например, из-за отключения электропитания. Выживет ли система в таких обстоятельствах, зависит от того, применяете ли вы источники бесперебойного питания (ИБП) и резервные источники электропитания.
- Ошибки людей. Кластеризация обычно не может защитить систему от отказов, вызванных ошибками людей, например, таких, как ошибочное удаление таблицы разделов файловой системы Windows NT.
Отказы будут случаться неизбежно. Вопрос в том, как следует наилучшим образом подготовиться к некоторым из них; этому и посвящена данная лекция.
Обзор MSCS
MSCS является встроенной службой Windows 2000 Advanced Server, Windows 2000 Datacenter Server и Windows NT Enterprise Edition. MSCS применяется для формирования кластера серверов, который, как уже говорилось, является группой независимых серверов, работающих совместно как единая система. Кластер служит для обеспечения готовности (availability, этот термин может переводиться и как "доступность") клиентов к обслуживанию приложений в ситуации возникновения отказа или при запланированных отключениях. Если один из серверов кластера по какой-либо причине является недоступным, то ресурсы и приложения перемещаются на другой узел кластера.
Когда речь идет о кластеризованных системах, мы обычно применяем термин с высокой готовностью (high availability), а не отказоустойчивый (fault tolerant). Термин отказоустойчивый традиционно применяется по отношению к специализированным системам, обладающим исключительно высоким уровнем резервирования, устойчивостью к внешним воздействиям и способностью к восстановлению. Такие системы обычно применяют весьма специализированное программное обеспечение, обеспечивающее почти мгновенное восстановление при любых отдельных отказах оборудования или программного обеспечения. Отказоустойчивые системы стоят гораздо дороже, чем системы без отказоустойчивости. Кластеризованные системы, обеспечивающие высокую готовность, не столь дорогостоящи, как отказоустойчивые системы. Кластеризованные системы обычно конструируются из оборудования для стандартных серверов и программного обеспечения для работы кластера (это программное обеспечение имеет небольшой объем и входит в состав операционной системы). При увеличении потребности в обеспечении готовности можно достаточно просто включать дополнительные компьютеры в состав кластера. Хотя кластеризованные системы и не гарантируют непрерывной работы, но они обеспечивают весьма значительное повышение готовности для большинства критически важных приложений.
Системы, исполняющие MSCS, обеспечивают высокую готовность и имеют много других достоинств. Некоторые из достоинств применения MSCS перечислены ниже.
- Высокая готовность. Системные ресурсы, такие как дисковые накопители и IP-адреса, автоматически передаются от отказавшего сервера к выжившему. Это явление называется переход по отказу (failover). При возникновении ситуации, когда приложение на кластере отказывает, MSCS автоматически запускает его на выжившем сервере или распределяет работу отказавшего сервера по другим оставшимся узлам кластера. Переход по отказу происходит быстро, поэтому для пользователей он представится как лишь мгновенная заминка в обслуживании.
- Возврат к исходному узлу кластера после восстановления. После того как отказавший сервер будет починен и введен в строй, MSCS автоматически перераспределяет нагрузку на кластере. Это явление называется возврат к исходному узлу кластера (failback).
- Управляемость. При помощи программного обеспечения Cluster Administrator можно управлять всем кластером как единой системой. Вы можете легко перемещать приложения на те или иные серверы в пределах кластера, перетаскивая объекты внутри Cluster Administrator. Точно так же можно перемещать и данные. При помощи этого перетаскивания можно производить ручное балансирование нагрузок на серверы, можно также снять нагрузку с какого-либо сервера, подготовив тем самым его к плановому отключению и техническому обслуживанию. При помощи Cluster Administrator можно также следить из любого места в сети за состоянием кластера и каждого из его узлов, а также за любыми доступными ресурсами. Пример окна Cluster Administrator показан на рис. 12.1.
увеличить изображение
Рис. 12.1. Windows 2000 Cluster Administrator - Масштабируемость. По мере роста требований к системе, MSCS может быть переконфигурирована для поддержки этого роста. Если суммарная нагрузка станет превышать возможности кластера, можно будет добавить в кластер дополнительные узлы.
Основные понятия
MSCS сокращает длительность простоев, осуществляя переходы по отказу между отдельными компьютерами, применяя при этом взаимосвязь между серверами и дисковую систему с общим доступом (рис. 12.2). В качестве взаимосвязи между серверами может применяться любое высокоскоростное соединение, например, сеть Ethernet или другое сетевое оборудование. Эта взаимосвязь функционирует как канал коммуникации между серверами, благодаря которому возможна двусторонняя передача информации о состоянии кластера и о конфигурации. Благодаря разделяемой дисковой системе возможен равноправный доступ всех серверов кластера к базе данных и к другим файлам с данными. Такая разделяемая дисковая система может быть реализована при помощи SCSI, SCSI поверх Fibre Channel, а также при помощи какого-либо нестандартного оборудования. Разделяемые диски могут быть как одиночными дисками, так и RAID-системой. (Про RAID-системы см.лекцию 5.)
Рис. 12.2. Кластер Windows 2000
Как только система будет сконфигурирована как сервер кластера, она будет преобразована из обычного сервера в так называемый виртуальный сервер. Виртуальный сервер похож на обычный сервер, но для него применяется абстрагирование и отказ от настоящей физической сущности компьютера. Так как аппаратная часть компьютера, образующая виртуальный сервер, может со временем меняться, то пользователь не будет знать, на каком именно сервере выполняется его приложение в данный момент времени. Поэтому пользовательские приложения выполняются не на конкретном комплекте оборудования, а на виртуальном сервере.
Виртуальный сервер существует как элемент сети и ему сопоставлен IP-адрес, применяемый в протоколе TCP/IP. Этот IP-адрес может передаваться от одного компьютера к другому, благодаря чему пользователи продолжают "видеть" виртуальный сервер независимо от того, на каком именно оборудовании он работает. На самом деле, этот IP-адрес переходит от одного компьютера к другому, что обеспечивает одинаковое представление виртуального сервера для наружного наблюдателя. Приложение, направленное по некоторому адресу, все равно получит доступ, соответствующий этому адресу, даже если конкретный сервер, соответствующий этому адресу, и откажет (однако этот адрес теперь будет соответствовать другому серверу). Виртуальный сервер прячет от пользователя операции перехода по отказу, поэтому пользователь может продолжать свою работу, не зная о событиях, происходящих "за кулисами".
Компоненты кластера
Для создания кластера нужны некоторые компоненты: программное обеспечение для управления кластером, взаимосвязь между серверами и разделяемая дисковая система. Чтобы образовать кластер, эти компоненты должны быть сконфигурированы согласованно с приложениями, которые будут предназначены для работы на нем. В данном разделе вы познакомитесь с этими компонентами и узнаете, как они совместно работают, образуя кластер. Затем, в разделе "Конфигурирование SQL Server для работы на кластере" (далее в данной лекции) вы научитесь конфигурировать кластеры SQL Server.
Программное обеспечение MSCS для управления кластером
Программное обеспечение для управления кластером – это совокупность инструментальных средств, применяемых для технического обслуживания, конфигурирования и работы кластера. Оно содержит следующие подкомпоненты, работающие совместно и выполняющие, при необходимости, переход по отказу.
- Менеджер узлов (Node Manager). Поддерживает членство в кластере и передает "пульс" (heartbeats) членам кластера (узлам). (Этот пульс представляет собой просто периодически отсылаемые сообщения, означающие "Я жив".) Если пульс от некоторого узла прекращается, то другой узел делает вывод, что этот узел перестал функционировать, и предпринимает шаги по приему на себя его функций. Менеджер узлов является одним из наиболее критичных элементов кластера, потому что он следит за состоянием кластера и решает, какие действия должны быть предприняты.
- Менеджер базы данных конфигурации (Configuration Database Manager). Поддерживает базу данных конфигурации кластера, в которой хранятся сведения обо всех компонентах кластера, как об абстрактных логических элементах (например, виртуальных серверах), так и физических элементах (например, разделяемых дисках). Эта база данных подобна системному реестру Windows NT/Windows 2000.
- Менеджер ресурсов / Менеджер переходов по отказу (Resource Manager / Failover Manager). Запускает и останавливает службу MSCS. Информацию (например, о потере узла, о добавлении узла и т.д.) Менеджер ресурсов / Менеджер переходов по отказу получает от Монитора ресурсов и Менеджера узлов.
- Обработчик событий (Event Processor). Инициализирует кластер и осуществляет маршрутизацию информации о событиях (routes event information) среди компонент кластера. Обработчик событий также инициирует расширение кластера, давая указание Менеджеру узлов о добавлении узла.
- Менеджер коммуникаций (Communications Manager). Управляет коммуникацией между узлами кластера. Все узлы кластера, для обеспечения своей правильной работы, должны постоянно осуществлять коммуникацию друг с другом. Если этой коммуникации между узлами не будет, то информация о состоянии кластера будет потеряна и кластер не сможет функционировать.
- Менеджер глобального обновления (Global Update Manager). Передает информацию о состоянии кластера (например, информацию о добавлении узлов в кластер, об удалении узлов и т.д.) всем узлам кластера.
- Монитор ресурсов (Resource Monitor). Отслеживает состояние различных ресурсов кластера и сообщает статистические данные. Эта информация может применяться для принятия решений о необходимости выполнения на кластере переходов по отказу.
- Служба времени (Time Service). Гарантирует, что все узлы кластера сообщают одинаковое системное время. Если бы Службы времени не было, то события могли бы представляться в неверной последовательности, что приводило бы к неверным решениям. Например, если бы один узел "думал" бы, что сейчас 2 часа дня и содержал бы старую копию файла, а другой узел "думал" бы, что сейчас 10 часов утра и содержал бы более новую версию этого файла, то кластер мог бы неправильно решить, что файл на первом узле является более свежим.
Взаимосвязь между серверами
Взаимосвязь между серверами – это просто соединение между узлами кластера. Так как для узлов кластера необходима постоянная коммуникация между ними (через Службу времени, Менеджер узлов и т.д.), то поддержка этой связи очень важна. Взаимосвязь между серверами должна быть надежным каналом коммуникации.
Во многих случаях в качестве взаимосвязи между серверами может применяться сеть Ethernet, на которой исполняется протокол TCP/IP или NetBIOS. Этого вполне достаточно, но вы можете захотеть применять нестандартную, высокоскоростную взаимосвязь между серверами, которая будет гораздо быстрее, чем Ethernet. Эти взаимосвязи можно приобрести у многих поставщиков оборудования, некоторые из них предоставляют как решения для разделяемых дисков, так и решения для коммуникации. Полный список одобренных устройств для взаимосвязи между серверами вы найдете в списке совместимого оборудования на веб-сайте фирмы Microsoft по адресу http://www.microsoft.com/hcl/
Разделяемая дисковая система
Другая ключевая компонента, необходимая для создания кластера, – разделяемая дисковая система. Если к одной и той же дисковой системе могут иметь доступ многие компьютеры, то в случае отказа узла его работу может взять на себя другой узел. Разделяемая дисковая система должна предоставлять равноправный доступ многим компьютерам к одним и тем же дискам, т.е., каждый из компьютеров должен быть способен иметь доступ ко всем дискам. В нынешней версии MSCS в каждый момент времени только один компьютер может иметь доступ к дискам, но в будущих версиях станет возможен одновременный доступ к данным для многих компьютеров.
В настоящее время доступно несколько видов разделяемых дисковых систем, разрабатываются и новые технологии для дисков. Дисковые подсистемы SCSI всегда поддерживали работу со многими инициаторами, когда можно иметь много контроллеров SCSI на одной и той же шине SCSI. Это делает SCSI идеальным выбором для применения в кластерах. Фактически, системы SCSI были первыми дисковыми подсистемами, которые могли применяться для кластеризации.
Для поддержки кластеризации были разработаны также более современные дисковые технологии, такие как Fibre Channel и некоторые нестандартные фирменные решения. Системы Fibre Channel позволяют подключать диски, находящиеся на значительном удалении от компьютеров. Большинство систем Fibre Channel поддерживает применение многих контроллеров в одном кольце Fibre Channel. Для поддержки кластеризации были спроектированы или модифицированы некоторые RAID-контроллеры. Без модификаций или без внесения изменений в конфигурацию, большинство дисковых контроллеров не будет поддерживать кластеризацию.
Вопрос о кэшах контроллеров, благодаря которым возможно кэширование записей в память, также надо решать при кластеризации, в случаях, когда кэш расположен на самом контроллере (рис. 12.3). В этом случае каждый узел имеет свой собственный кэш, и мы говорим, что он находится перед разделением дисков ("in front of" the disk sharing), потому что два кэша пользуются одними и теми же дисковыми накопителями. Если каждый контроллер имеет кэш и кэш размещается на отказавшем компьютере, то данные из кэша могут быть потеряны. Из-за этого, когда вы в конфигурации кластера применяете внутренние кэши контроллера, они должны быть настроены как применяемые только для чтения (set as read-only). (При некоторых обстоятельствах такая настройка может уменьшить производительность некоторых систем.)
Рис. 12.3. Кэши контроллера перед разделением дисков
В других решениях этой проблемы с разделяемыми дисками предусматривается расслоение (чередование) RAID и кэширование внутри самой дисковой подсистемы. В этой конфигурации кэш разделяется (используется совместно) узлами и в данном случае мы говорим, что кэш находится позади разделения дисков (рис. 12.4). Теперь механизмы расслоения и кэш выглядят одинаково для всех контроллеров системы, и безопасными являются как чтение из кэша, так и запись в кэш.
Рис. 12.4. Кэш контроллера позади разделения дисков
Последние дисковые подсистемы SCSI и Fibre Channel допускают размещение RAID- контроллеров в корпусах дисковых систем, а не в корпусах компьютеров. Такие системы обеспечивают хорошую производительность и отказоустойчивость. Фактически, многие RAID-системы этого типа предлагают контроллеры и кэши, полностью защищенные при помощи избыточности. Многие из последних RAID-систем применяют архитектуру этого типа. Давайте более подробно рассмотрим некоторые дисковые подсистемы.
Подсистемы ввода-вывода.Как уже говорилось, кластеризацию поддерживают различные виды подсистем ввода-вывода. Ниже перечислены три основных вида подсистем ввода-вывода.
- SCSI JBOD. Это SCSI-система с многими инициаторами (контроллерами) на шине SCSI, адресующей простой массив дисков (just a bunch of disks, JBOD). При такой настройке диски адресуются индивидуально и должны быть либо сконфигурированы для расслоения при помощи расслоения Windows 2000, либо адресоваться индивидуально. Мы не рекомендуем применять такую подсистему.
- Внутренняя RAID-система. В каждом сервере применяется свой RAID-контроллер. Недостатком этой системы является то, что алгоритм работы RAID-системы реализован на плате, находящейся на сервере, поэтому кэши контроллеров должны быть отключены.
- Внешняя RAID-система. RAID-контроллер разделяется (используется совместно) компьютерами кластера. Кэш и алгоритм работы RAID-системы размещаются в корпусе дисковой системы, а для коммуникации с внешним контроллером применяется простой адаптер главной шины (HBA, host bus adapter).
В следующих двух разделах рассказано только о двух решениях с применением технологии RAID. Мы не рекомендуем применять решение SCSI JBOD, за исключением лишь случаев, когда кластер небольшой и главное значение имеет его стоимость.
Внутренняя RAID-система. Внутренние RAID-контроллеры спроектированы таким образом, что аппаратура, управляющая работой RAID, и кэш находятся на самом компьютере. Когда используется внутренняя RAID-система, разделяемая дисковая система разделяется до расслоения RAID, как показано на рис. 12.5.
Рис. 12.5. Внутренний RAID-контроллер
Так как кэш размещен на контроллере, который не находится в совместном использовании, все данные, которые были в кэше в момент отказа системы, станут недоступными. Это большая проблема в случае, когда работа идет с реляционными СУБД. Когда SQL Server записывает данные на диск, эти данные заносятся в журнал транзакций как записанные. Когда SQL Server пытается восстановиться после отказа системы, эти блоки данных не будут восстановлены, потому что SQL Server считает, что они уже были записаны на диск. В случае отказа при этом типе конфигурации база данных будет повреждена.
Поэтому поставщики RAID-контроллеров с кэшированием при работе их в составе кластеров сертифицируют их работу только при отключенном кэше (или, по крайней мере, при запрете записи в кэш). Если кэш был отключен, то SQL Server не получит сигнала о том, что операция записи была завершена, до тех пор, пока данные не будут действительно записаны на диск.
В некоторых ситуациях, если пользоваться кэшем контроллера можно добиться повышения производительности. Это особенно имеет смысл при использовании конфигураций RAID 10 и RAID 5, потому что для этих уровней RAID очень велика дополнительная нагрузка, появляющаяся при записи. Чтобы пользоваться кэшем записи контроллера в кластерной конфигурации, нужно пользоваться внешней RAID-системой, в которой кэш находится в совместном пользовании и данные при переходе по отказу не теряются.
Внешняя RAID-система. Во внешних RAID-системах аппаратура RAID находится за пределами компьютеров (см. рис. 12.6). Каждый сервер содержит адаптер главной шины (HBA, host bus adapter), задачей которого является передача в RAID-систему максимально большего количества запросов ввода-вывода с наивысшей возможной скоростью. А место фактического размещения данных определяется RAID-системой.
Рис. 12.6. Внешняя подсистема RAID
Внешние RAID-системы иногда называют "RAID в шкафу" или "RAID в ящике", потому что расслоение RAID производится внутри корпуса с дисками. Такие внешние подсистемы RAID обладают многими достоинствами. Они являются не только идеальным решением для MSCS, но и вообще, универсальным лучшим решением. Ниже перечислены достоинства систем "RAID в шкафу":
- Удобство при подключении. При использовании внутренних RAID-систем вам потребуются многочисленные кабели – по кабелю для каждого шкафа с дисками, выходящему из каждого RAID-контроллера. А если пользоваться внешним RAID, то вам понадобится проложить только один кабель от адаптера главной шины до RAID-контроллера и кабели от контроллера, формирующие соединение "гирляндой" (daisy chain) к каждому шкафу с дисками (см. рис. 12.7). При помощи внешних RAID-систем можно без труда соединять сотни дисководов.
- Обеспечивается избыточность RAID. Многие внешние решения RAID разрешают одному контроллеру памяти осуществлять коммуникацию и с основным, и с вторичным RAID-контроллером, что обеспечивает полное резервирование и переход по отказу к другому узлу.
- Обеспечивается кэширование в кластерах. Применяя внешние решения RAID, кэширование можно выполнить гораздо более просто. При использовании внешних RAID, вы можете разрешать применение как кэширования, так и средств для отказоустойчивости, не беспокоясь о согласованности работы кэшей из разных контроллеров (потому что имеется только один кэш и один контроллер). Фактически, при применении внешнего RAID, использование кэша записи является безопасным. При кэшировании данных от реляционных СУБД некоторый риск все же сохраняется, но при применении внешнего RAID он уменьшается. Обязательно проверьте, что поставщик ваших внешних RAID-систем поддерживает зеркальное дублирование кэшей. Зеркальное дублирование кэшей обеспечивает отказоустойчивость кэш-памяти в случае отказа ее микросхем.
- Поддержка большого количества дисковых накопителей. Для работы больших или высокопроизводительных систем иногда требуется конфигурировать дополнительные дисковые накопители. То, что дисковых накопителей может потребоваться много, вы знаете из лекции 6, где вы учились планировать мощность системы, и еще узнаете в лекции 36, посвященной типичным проблемам с производительностью. Применяя внешние устройства RAID, вы сможете присоединять сотни дисков к одному адаптеру главной шины, а внутренние RAID-системы, как и системы SCSI, ограничивают вас несколькими дюжинами дисков на один контроллер.
Рис. 12.7. Подключения кабелей внутренних RAID-систем в сравнении с подключением кабелей внешних RAID-систем
При выборе из дисковых подсистем, поддерживающих кластеризацию, доступных в настоящее время, при работе с большими кластерами лучше всего применять шкафы – внешние RAID. Конечно, свою роль могут играть вопросы их стоимости, и некоторые кластеры могут быть не настолько большими, чтобы реализовывать их как внешние RAID. Но в долгосрочной перспективе применение внешних RAID-систем обеспечит для вашего кластера наилучшую производительность, надежность и управляемость.
Категории приложений, работающих с кластерами
Приложения, которые работают на системах с MSCS можно разделить на следующие четыре категории. Эти категории приложений и их взаимодействие с MSCS показаны на рис. 12.8.
Рис. 12.8. MSCS и категории приложений
- Приложения, не рассчитанные на кластеризацию. Приложения этой категории никак не взаимодействуют с MSCS. Хотя при обычных условиях они могут работать нормально, но при отказах узлов они могут заработать неверно, что воспрепятствует их переходу на другой узел кластера.
- Приложения, рассчитанные на кластеризацию. Эти приложения рассчитаны на работу совместно с MSCS. Они могут воспользоваться достоинствами MSCS, повышающими производительность и масштабируемость. Они правильно реагируют на события, происходящие на кластере, и при отказе компонент и переходе на другой узел кластера, как правило, им не требуется уделять большого внимания (а иногда и вообще никаких забот не потребуется). SQL Server может служить примером таких приложений, рассчитанных на кластеризацию.
- Приложения для управления кластером. Приложения этой категории служат для наблюдения за кластером и для управления окружением MSCS.
- Нестандартные типы ресурсов. Эти приложения являются нестандартными ресурсами управления кластером для приложений, служб и устройств.
Режимы MSCS
Поддержку кластеров для SQL Server и MSCS можно запускать в различных режимах. В активно-пассивном режиме один сервер находится в состоянии ожидания, готовый принять на себя работу в случае отказа первичного сервера. В активно-активном режиме каждый сервер работает со своей базой данных SQL Server. В случае отказа любого из серверов другой сервер берет работу на себя, и дело кончается тем, что один сервер работает с двумя базами данных. В этом разделе мы рассмотрим преимущества и недостатки применения каждого из этих двух режимов.
Активно-пассивные кластеры
В активно-пассивных кластерах для работы приложений SQL Server применяется первичный узел (primary node), а сервер – вторичный узел (secondary node) является запасным, резервным сервером (рис. 12.9).
Рис. 12.9. Активно-пассивный кластер
В этой конфигурации один из серверов практически не используется. Этот сервер может месяцами стоять без дела. Фактически, во многих случаях резервный сервер вообще никогда не будет использоваться. И поскольку он не используется, его могут расценивать как дорогостоящее оборудование, простаивающее без дела. Так как этот сервер не может выполнять другие задачи, то для удовлетворения нужд пользователей придется покупать другое оборудование, что делает активно-пассивный режим потенциально неэкономичным.
Но, несмотря на эту неэкономичность, активно-пассивный режим имеет свои достоинства. В этой конфигурации при отказе первичного узла все ресурсы вторичного узла полностью готовы к тому, чтобы взять на себя его работу. Такая надежность важна, когда вы выполняете критически важные приложения, для которых требуются заданные показатели производительности или времени отклика. Если вы находитесь именно в такой ситуации, то тогда, возможно, активно-пассивный режим будет правильным решением.
Настоятельно рекомендуется, чтобы аппаратура вторичного узла была точно такая же, как и первичного узла (т.е., чтобы у первичного и вторичного узлов были бы одинаковые объемы оперативной памяти, одинаковые количество и типы центральных процессоров и т.д.). Если узлы имеют одинаковую аппаратуру, то вы можете быть уверены в том, что вторичная система будет работать почти с такой же скоростью, как и первичная. А иначе вы в случае перехода по отказу можете столкнуться с потерей производительности.
Активно-активные кластеры
В активно-активных кластерах выполнять приложения могут оба сервера, причем каждый сервер служит вторичным сервером для другого узла (см. рис. 12.10).
Рис. 12.10. Активно-активный кластер
Каждый из этих двух серверов работает сразу и как первичный узел для некоторых приложений, и как вторичный узел для приложений другого сервера. Эта конфигурация наиболее эффективна в экономическом плане, потому что никакое оборудование не простаивает, ожидая отказа другой системы. Обе системы активно обслуживают пользователей. Кроме того, один пассивный узел может служить вторичным узлом для нескольких первичных узлов.
Недостатком активно-активной конфигурации является лишь то, что в случае отказа производительность выжившего узла существенно снизится, потому что нагрузка на него вырастет. Выжившему узлу теперь придется исполнять не только приложения, которые работали на нем первоначально, но и приложения с первичного узла. Во многих случаях это снижение производительности окажется неприемлемым, и тогда придется применять активно-пассивную конфигурацию.
Примеры кластеризованных систем
В этом разделе мы рассмотрим четыре примера кластеризованных систем, применяющих MSCS. Эти примеры помогут вам решить, какой тип кластеров лучше всего соответствует вашим потребностям и окружению.
Пример 1 – система с высокой готовностью со статическим балансированием нагрузки
Такие системы обеспечивают высокую готовность для кластеров, на которых исполняется много приложений. Это, однако, достигается за счет некоторого падения производительности в случаях, когда на линии остается один узел. Такие системы обеспечивают максимум полезного использования аппаратных ресурсов, потому что доступен каждый из узлов. Конфигурация такого кластера показана на рис. 12.11 (это – активно-активная конфигурация кластера).
Рис. 12.11. Кластер с высокой готовностью, со статическим балансированием нагрузки
Каждый из узлов этого кластера представляет для сети свой собственный набор ресурсов (в форме виртуального сервера) и сконфигурирован с некоторым избытком мощности, чтобы быть способным исполнять приложения другого узла в случае перехода по отказу. Готовность обслуживания клиентов отказавшего узла будет зависеть от имеющихся ресурсов и мощности сервера.
Пример 2 – система с "горячим резервированием" с максимальной готовностью
Такие системы обеспечивают максимальную готовность и производительность для всех системных ресурсов. Недостатком этой конфигурации является то, что денежные затраты в оборудование почти никогда не работают. Один из узлов работает как первичный узел и исполняет все клиентские запросы. А другой узел простаивает. Этот простаивающий узел служит для "горячего резервирования" и становится доступен только в случае перехода по отказу. Если первичный узел отказывает, то узел для горячего резервирования немедленно принимает на себя все операции и продолжает обслуживание клиентских запросов. Эта конфигурация показана на рис. 12.12.
Данная конфигурация лучше всего подходит для наиболее критически важных приложений. Если ваша фирма зависит от продаж через Интернет, то вашему серверу для веб-торговли, возможно, следовало бы работать в этой конфигурации. От наличия и работоспособности системы зависит бизнес фирмы, и это оправдывает расходы на простаивающее оборудование.
Рис. 12.12. Система с "горячим резервированием" с максимальной готовностью
Пример 3 – кластеризация части сервера
Конфигурация с кластеризацией части сервера является примером того, насколько гибкой может быть MSCS. В этой системе переход по отказу разрешен лишь для некоторых приложений. Как показано на рис. 12.13, вы можете задать, чтобы некоторые приложения оставались доступными при отказе узла, а некоторые – нет.
Рис. 12.13. Кластеризация части сервера
Эта конфигурация идеальна для случаев, когда вы желаете максимально повысить полезное использование оборудования, но в то же время хотите ограничить расходование мощностей, служащих для подстраховки критически важных приложений. Кроме того, такая конфигурация поддерживает работу приложений, не рассчитанных на кластеризацию, и вместе с тем обеспечивает переход по отказу для приложений, рассчитанных на кластеризацию.
Пример 4 – только виртуальные серверы, без переходов по отказам
Наш последний пример на самом деле не является кластером, но в нем используется служба MSCS и ее поддержка виртуальных серверов. Эта конфигурация помогает организовывать ресурсы и представлять их в сети (рис. 12.4). Применение виртуальных серверов позволяет задавать для ресурсов осмысленные, описательные имена, а не пользоваться обычным списком имен серверов. Кроме того, MSCS станет автоматически перезапускать приложения и ресурсы после отказов сервера. Эта возможность полезна для приложений, не имеющих внутренних механизмов для их перезапуска. Реализация этой конфигурации также станет для вас отличной тренировкой перед реализацией настоящей кластеризации. Создав виртуальные серверы для одного узла, вы без труда сможете добавить еще один узел, не меняя настроек серверов.
Рис. 12.14. Только виртуальные серверы, без переходов по отказам
Конфигурирование SQL Server для работы на кластере
После того как вы инсталлировали и сконфигурировали MSCS, следующим шагом должно стать конфигурирование SQL Server для работы на кластере. Как уже говорилось, SQL Server является приложением, рассчитанным на кластеризацию, специально спроектированным для применения кластеризации. В данном разделе сначала рассмотрим вопросы планирования кластера, а затем расскажем о ваших действиях, необходимых для конфигурирования SQL Server на кластере.
Планирование конфигурации
Первый шаг в планировании кластера SQL Server задает тип используемого оборудования и режим, в котором будет работать кластер. Кластер может быть составлен из компьютеров в различных аппаратных конфигурациях и может работать как в активно-пассивном, так и в активно-активном режиме. От этого режима зависят количество и тип необходимого вам оборудования.
Активно-пассивные конфигурации кластера должны быть составлены из одинаковых, идентичных компьютеров, каждый из которых способен обрабатывать всю рабочую нагрузку. Так как при обычной работе в активно-пассивном режиме вторичный компьютер не используется, а после отказа не используется первичный компьютер, то производительность виртуального сервера после отказа не изменится. Пользователи не заметят никакого изменения в производительности, потому что после отказа первичного компьютера произойдет переход к точно такому же вторичному компьютеру.
Активно-активные конфигурации кластера должны состоять из двух компьютеров, каждый из которых поддерживает какую-то свою собственную рабочую нагрузку. В данной ситуации после отказа обе эти нагрузки станут обрабатываться одним из компьютеров, что снизит производительность для всех пользователей. При тщательном планировании, производительность, обеспечиваемая выжившим компьютером, останется в допустимых пределах, но гарантировать это нельзя. При планировании активно-активной конфигурации кластера вы должны быть готовы к некоторому падению производительности и возможности избавиться от некоторых служб или предупредить пользователей о том, что в случаях отказов производительность будет снижаться.
Следующим вашим действием, которое надо будет выполнить при конфигурировании SQL Server для работы на кластере, станет проверка и, возможно, изменение некоторых настроек SQL Server. Мы расскажем про эти настройки в трех следующих разделах.
Задание времени восстановления
При настройке SQL Server вы могли задать какое-либо ненулевое значение для параметра конфигурации recovery interval (интервал восстановления) (нулевое значение задано по умолчанию). Изменение этой настройки увеличит время между контрольными точками и повысит производительность, однако снизит и время восстановления (после перехода по отказам система должна восстанавливаться). В кластеризованной системе применяемое по умолчанию нулевое значение, означающее автоматическое конфигурирование, не должно быть изменено. (Главной причиной применения MSCS является наличие компьютера, на который может быть перенесена работа другого компьютера, и это перевешивает вопросы, относящиеся к производительности.) При такой настройке контрольные точки будут происходить примерно раз в минуту, и максимальное время восстановления составит тоже около одной минуты.
Конфигурирование SQL Server для активно-пассивных кластеров
Для создания активно-пассивной конфигурации кластера вам, возможно, понадобится изменить одну из настроек SQL Server. Если вторичный сервер идентичен первичному серверу, то ничего менять не надо. Если вторичный сервер имеет меньше ресурсов, чем первичный сервер, то нужно задать значение 0 для параметра конфигурации SQL Server min server memory. Благодаря такой настройке SQL Server распределит память исходя из системных ресурсов, имеющихся в наличии.
Конфигурирование SQL Server для активно-активных кластеров
Для создания активно-пассивной конфигурации кластера вы обязательно должны задать значение 0 для параметра конфигурации SQL Server min server memory. Благодаря такой настройке SQL Server распределит память исходя и системных ресурсов, имеющихся в наличии. Если этот параметр конфигурации задан как Manual, то SQL Server может распределить слишком много памяти после перехода по отказу. Так как в операционной системе Windows 2000 применяется виртуальная память, то может случиться так, что памяти будет распределено больше имеющегося объема физической памяти. На самом деле, такая проблема возникает довольно часто и становится причиной подкачки страниц памяти. Например, если у каждого из компьютеров распределено 75% от его системной памяти и произойдет переход по отказу, то для суммарного обслуживания SQL Server потребуется 150% от доступной памяти, из-за чего работа системы практически остановится.
Инсталляция SQL Server для работы на кластере
Процесс инсталляции SQL Server для работы на кластере аналогичен процессу инсталляции SQL Server, описанному в лекции 7. Прежде чем запустить процесс инсталляции для работы на кластере, вы должны решить, где именно будет инсталлироваться SQL Server. Вы должны будете установить файлы SQL Server на разделяемом дисковом накопителе, находящемся под управлением первичного сервера. Вы должны будете задать и путь инсталляции SQL Server, и путь инсталляции главной базы данных (master database) так, чтобы они указывали на этот разделяемый дисковый накопитель. Вы также должны задать сетевой протокол, под которым будет работать кластер. Ниже кратко перечислены действия по инсталляции SQL Server для работы на кластере.
- Вставьте свой компакт-диск SQL Server в привод для компакт-дисков вашего сервера. Если ваша операционная система настроена на автоматический запуск компакт-дисков, то появится главное диалоговое окно начальной установки Microsoft SQL Server 2000 (рис. 12.15). Если автоматический запуск компакт-дисков не включен, то нужно вручную запустить программу Autorun.exe, находящуюся в корневой директории компакт-диска.
Рис. 12.15. Диалоговое окно начальной установки SQL Server - Если у вас не установлены необходимые дополнительные пакеты операционной системы (service packs) или требуемая версия Microsoft Internet Explorer, или если вы просто хотите посмотреть перечень программных компонент, необходимых для инсталляции, то нажмите на SQL Server 2000 Prerequisites, и тогда откроется диалоговое окно SQL Server 2000 Prerequisites (Предварительные условия для SQL Server 2000).
Нажмите на обозначение нужной операционной системы, и тогда появится список программных компонент, необходимых для нее. Затем нажмите на обозначение программной компоненты, которую вы хотите инсталлировать. Если все необходимое программное обеспечение у вас уже установлено, то переходите к шагу 3.
Примечание. Инсталляция MSCS должна быть выполнена до запуска инсталляции SQL Server. - Нажмите на SQL Server 2000 Components. Появится стартовое окно мастера SQL Server 2000 Installation Wizard. Если у вас работают какие-либо другие программы Windows, то их нужно закрыть. Для продолжения процесса инсталляции нажмите на Next.
- В экране Computer Name нажмите на Virtual Server и введите с клавиатуры имя виртуального сервера (рис. 12.16). Для продолжения нажмите на Next.
Рис. 12.16. Экран Computer Name - Появится экран User Information (Информация о пользователе). Проверьте правильность своего имени и названия вашей фирмы. Для продолжения нажмите на Next.
- Появится экран Software License Agreement (Лицензионное соглашение об использовании программного обеспечения). Нажмите на Yes, чтобы согласиться с условиями лицензионного соглашения и продолжить процесс инсталляции.
- В экране Setup введите с клавиатуры 25-символьный ключ компакт-диска, напечатанный на желтой наклейке в инструкции, прилагаемой к компакт-диску или на футляре компакт-диска. Для продолжения нажмите на Next.
- Затем появится экран Failover Clustering (Кластеризация с переходом по отказу) (рис. 12.17). Введите IP-адрес для виртуального сервера, а затем нажмите на Add. MSCS предоставит адрес подсети. Для продолжения нажмите на Next.
- В экране Cluster Management (Управление кластером) посмотрите на определение кластера, которое предлагает SQL Server. По умолчанию в качестве предпочтительного узла задается локальный компьютер. Все остальные допустимые узлы будут показаны в окне Additional Node (Дополнительный узел). Проверьте настройки и на Next для продолжения процесса инсталляции.
- Когда появится экран Remote Information (Информация для дистанционного доступа), введите с клавиатуры пользовательский идентификатор администратора и пароль, которые будут действительны для всех выбранных узлов этого кластера.
Рис. 12.17. Экран Failover Clustering
- В экране Instance Name (Имя экземпляра) согласитесь со стандартным именем или задайте именованный экземпляр SQL Server. Если вы хотите задать именованный экземпляр, то снимите флажок Default (По умолчанию) и введите с клавиатуры желаемое имя экземпляра. Для продолжения нажмите на Next.Примечание. Экземпляры не могут получать такие имена, как DEFAULT, MSSQLSERVER и любые имена, совпадающие с зарезервированными ключевыми словами SQL Server.
- В экране Setup Type задайте нужный вам тип инсталляции. По умолчанию программа установки SQL Server инсталлирует SQL Server в первый доступный диск – разделяемый ресурс. Если вы хотите инсталлировать SQL Server в другое место, то нажмите на Browse под заголовком Data Files и задайте путь к другому диску – разделяемому ресурсу. Для продолжения нажмите на Next.
- Затем появится экран Authentication Mode (Режим аутентификации) (рис. 12.18). Настройки, заданные в этом окне, задают уровень безопасности вашей инсталляции SQL Server. Вы можете выбрать использование Windows Authentication Mode (Режим аутентификации Windows) либо Mixed Mode (Смешанный режим). При выборе Windows Authentication Mode все права пользователей в отношении базы данных наследуются из настроек Windows User Security. При выборе Mixed Mode вы можете задавать и администрировать настройки безопасности пользователей для базы данных независимо от настроек для Windows. Если вы выберете Mixed Mode, то вы должны задать пароль для учетной записи sa (системного администратора SQL Server). Вы можете оставить этот пароль пустым, но это серьезно ухудшит защищенность вашей инсталляции SQL Server.
- В экране Start Copying Files (Запустить копирование файлов) нажмите на Next.
- Появится экран Licensing Mode (Лицензионный режим). Имеется два способа для лицензирования ваших клиентов SQL Server – на сервер (Per Server) или на посадочные места (Per Seat). При использовании лицензии на сервер требуется назначать каждую Лицензию клиентского доступа (Client Access License) конкретному серверу и такая лицензия допускает только одно соединение с этим сервером. Максимальное число компьютеров-клиентов, которые могут соединяться с сервером в любой момент времени равно количеству лицензий Client Access License, выданный вами этому серверу.
Рис. 12.18. Экран Authentication ModeПри использовании лицензии на количество посадочных мест требуется лицензия Client Access License для каждого компьютера-клиента, который будет осуществлять доступ к любому из ваших серверов, исполняющих SQL Server. После того как для компьютера будет получена лицензия, он сможет осуществлять доступ к любому компьютеру в сети, на котором исполняется SQL Server 2000 без какой-либо дополнительной оплаты.Если вы не можете решить, какой режим лицензирования выбрать, нажмите на Per Server. Лицензионное соглашение разрешает возможность однократной, необратимой замены лицензии "на сервер" на лицензию "на посадочные места".
Чтобы начать инсталляцию приложений и файлов данных SQL Server, нажмите на Continue. Программа установки SQL Server инсталлирует на ваш компьютер нужные файлы и сконфигурирует необходимые компоненты. Инсталляция может потребовать лишь нескольких минут либо может продлиться дольше (это зависит от быстродействия вашего компьютера).
- Когда появится экран Setup Complete (Установка завершена), выберите опцию для перезапуска вашего компьютера и нажмите на Finish.
Как видите, конфигурирование SQL Server для работы на кластере не представляет трудностей. После того как вы сконфигурируете кластер, больше вам не придется ничего конфигурировать. Клиенты будут осуществлять доступ к SQL Server при помощи IP-адресов, переназначаемых в ходе выполнения перехода по отказу. Остальные вопросы, относящиеся к программированию, на которые вы должны обратить внимание, будут рассмотрены в разделе "За рамками MSCS".
Применение трехзвенных приложений
Большинство приложений устанавливают непосредственные соединения с базой данных. Такие приложения отсылают транзакции, на которые отвечает база данных. В случае отказа системы срок обработки транзакций истекает, и приложение тоже отказывает. Во многих случаях настройка, задающая такой способ работы, оказывается лучшим выбором, т.е. так и надо, чтобы при незавершении транзакции приложение бы отказывало. Но если вы создали кластер для переходов по отказам, то, в случае отказа, база данных довольно скоро снова станет доступной и сможет отвечать на транзакции. При тщательном проектировании трехзвенных приложений можно добиться, чтобы приложения смогли воспользоваться этими возможностями быстрого восстановления обслуживания.
У трехзвенных приложений средний уровень может распознать, что сервер прекратил отвечать, а затем подождать заданный промежуток времени и повторить отправку транзакции. Для пользователя это выразится в увеличении времени ожидания исполнения транзакции, но такая задержка все же будет лучше, чем отказ в исполнении транзакции. Для такой работы приложение должно уметь распознавать отказ соединения с сервером и понимать необходимость возобновления соединения. Приложение также должно информировать конечного пользователя об этом процессе, показывая пользователю окно с сообщением или как-нибудь иначе.
Трехзвенные приложения способны обеспечивать "гладкие" переходы по отказам. Такие приложения должны быть рассчитаны на работу с кластеризацией и должны распознавать ситуации, когда виртуальный сервер должен будет вскоре включиться и начать функционировать. Применение трехзвенной схемы в сочетании с MSCS позволяет добиться надежности в работе приложений и в хранении данных.
За рамками MSCS
Мы с вами изучили основы работы MSCS и работы SQL Server в этой архитектуре. Также мы узнали, как SQL Server может выжить на некоторых типах катастрофических отказов оборудования и программного обеспечения, как можно выполнить резервное копирование SQL Server и быстрое исполнение транзакций. Для достижения такой степени отказоустойчивости одной лишь службы MSCS будет недостаточно, понадобятся и другие меры. Две таких важных меры – это выполнение регулярных и эффективных резервных копирований и разработка плана восстановления после чрезвычайных ситуаций, про это будет подробно рассказано в лекциях 32 и 33. Резервное копирование не может быть заменено службами кластеризации и RAID-системами. Во многих случаях, если система разрушится, а резервной копии у вас не будет, никакие эти технологии не помогут. Ниже перечислены некоторые из таких ситуаций.
- Отказы оборудования. В некоторых, достаточно редких случаях, отказы оборудования могут повредить данные. При отказе первичного сервера, повредившего базу данных, вторичный сервер станет работать с поврежденной базой данных.
- Отказы программного обеспечения. Независимо от того, насколько программное обеспечение было хорошо спроектировано и оттестировано, в него могут закрасться ошибки. Если одна из таких редких программных ошибок повредит базу данных, то переход по отказу к такой базе данных будет невозможен, а RAID-технология просто обеспечит отказоустойчивое хранение поврежденных данных.
- Человеческие ошибки. Довольно часто пользователи по ошибке стирают свои данные. От этого не спасет ни технология кластеризации, ни RAID.
В лекциях 32 и 33 дан более подробный материал о планировании подготовки к катастрофам и о том, как обеспечивать выживаемость ваших систем. Приведенные выше примеры просто иллюстрируют тот факт, что кластеризация и переходы по отказам предназначены для решения специфических задач и являются лишь двумя из многих средств борьбы за обеспечение бесперебойного доступа к данным и целостности данных.
Заключение
В этой лекции вы узнали о разных конфигурациях кластеризации, об оборудовании и программном обеспечении, необходимых для создания кластеров, а также о процессе конфигурирования SQL Server для работы на кластерах. Теперь вы понимаете, что хоть служба MSCS и поможет вам в некоторых ситуациях, но она не обеспечит полную, окончательную отказоустойчивость вашей системы. Вы должны также применять отказоустойчивую дисковую подсистему и реализовать схему резервного копирования. MSCS, в сочетании с хорошей стратегией преодоления катастроф, может обеспечить максимальную готовность и надежность системы. В следующей лекции мы рассмотрим T-SQL – усовершенствованную версию языка SQL, доступную в SQL Server 2000.
Лекция 13. Введение в Transact-SQL и SQL Query Аnalyzer
В этой лекции вы познакомитесь с основными понятиями языков SQL (Structured Query Language, язык структурированных запросов) и T-SQL (Transact-SQL); также будет рассказано о различиях между этими двумя языками. Будут рассмотрены составные части SQL – язык DDL (data definition language, язык определения данных) и DML (data manipulation language, язык манипулирования данными), для каждого из этих языков будут даны примеры. Также мы кратко рассмотрим новые свойства T-SQL, имеющиеся в Microsoft SQL Server 2000. Вы узнаете, как применять различные утилиты SQL Server, в том числе утилиту командной строки T-SQL и SQL Server Query Analyzer, что позволит вам создавать объекты базы данных и управлять этими объектами. Вы также научитесь создавать сценарии, содержащие операторы T-SQL.
Что такое SQL
SQL – это язык программирования и запросов к базам данных, он применяется для осуществления доступа к данным, для запросов к реляционным СУБД, для управления базами данных и их обновления. Стандарт SQL утвержден как Американским Национальным Институтом Стандартов (ANSI, American National Standards Institute), так и Международной организацией по стандартизации (ISO, International Organization for Standardization). ANSI – это организация промышленных и деловых групп, разрабатывающая стандарты для торговли и коммуникации в Соединенных Штатах. ANSI также является членом ISO и IEC (Международной электротехнической комиссии, International Electrotechnical Commission). ANSI публикует стандарты США, которые соответствуют международным стандартам. В 1992 году ISO и IEC опубликовали международный стандарт на SQL, который принято называть SQL-92. ANSI опубликовал в Соединенных Штатах соответствующий стандарт, ANSI SQL-92, который иногда называют ANSI SQL. Хотя разные реляционные СУБД применяют несколько различающиеся версии SQL, но большинство из них соответствуют стандарту SQL-92, определенному ANSI.
Язык SQL содержит операторы, относящиеся к одному из двух основных языков программирования в составе SQL: DDL и DML, о которых мы расскажем вам в последующих разделах.
DDL
Язык DDL (data definition language, язык определения данных) применяется для определения объектов баз данных (таких как базы данных, таблиц и представления) и для управления этими объектами. (Про представления (views) будет рассказано в лекции 18.) Операторы языка DDL обычно включают в себя команды CREATE, ALTER и DROP для каждого из объектов, с которым производится работа. Например, для первоначального создания таблицы, для изменения ее свойств (скажем, для создания или для удаления колонок) и для уничтожения таблицы соответственно применяются операторы CREATE TABLE, ALTER TABLE и DROP TABLE ; мы расскажем об этих операторах в нескольких следующих разделах.
Оператор CREATE TABLE
Давайте в качестве примера применим DDL для создания в базе данных MyDB таблицы с именем Customer_Data (Сведения_о_заказчиках). Эту таблицу Customer_Data обработки мы будем использовать и в других примерах, приведенных в этой лекции. Как уже говорилось, для создания таблицы применяется оператор CREATE TABLE. Наша таблица-пример будет задана как имеющая четыре колонки, при помощи следующих операторов:
Use MyDB CREATE TABLE Customer_Data (customer_id smallint, first_name char(20), last_name char(20), phone char(10)) GO
Эти операторы создают структуру таблицы Customer_Data. Таблица Customer_Data останется пустой до тех пор, пока в нее не будут введены данные или она не будет заполнена при помощи массового копирования. (Более подробно о создании таблиц см. лекцию 10.)
Оператор ALTER TABLE
Оператор ALTER TABLE применяется для изменения определения или атрибутов таблицы. В нашем примере оператор ALTER TABLE применяется для добавления в существующую таблицу Customer_Data колонки middle_initial:
ALTER TABLE Customer_Data ADD middle_initial char(1) GO
Теперь определение таблицы содержит не четыре колонки, как было первоначально, а пять колонок. (Более подробно о применении оператора ALTER TABLE см. лекцию 15.)
Оператор DROP TABLE
Оператор DROP TABLE применяется для уничтожения определений таблиц и всех данных, индексов, триггеров, ограничений и специальных разрешений, относящихся к удаляемым таблицам. Для уничтожения нашей таблицы Customer_Data применяется команда:
DROP TABLE Customer_Data GO
(Подробно об операторе DROP TABLE см.лекцию 15.)
DML
Язык DML (data manipulation language, язык манипулирования данными) применяется для манипулирования данными, содержащимися в объектах базы данных, для чего применяются такие операторы, как SELECT, INSERT, UPDATE и DELETE. При помощи этих операторов можно соответственно выбирать строки с данными, вставлять новые строки, изменять имеющиеся строки и удалять ненужные строки. Ниже даны простые примеры применения этих операторов. (Более сложные примеры см. в лекциях 14 и 20.)
Оператор INSERT
Оператор INSERT применяется для вставки строки данных в таблицу или в представление. Например, если вы хотите добавить нового заказчика (customer) в нашу таблицу-пример Customer_Data, то оператор INSERT может выглядеть так:
INSERT INTO Customer_Data (customer_id, first_name, last_name, phone) VALUES (777, 'Frankie', 'Stein', '4895873900')
Обратите внимание, что во второй строке первого оператора SQL помещен список имен колонок. Этот список определяет, в какие именно колонки будут помещены данные (данные вводятся в той последовательности, как они указаны). Так, первое значение данных будет помещено в первую колонку из списка, в customer_id; второе значение будет помещено во вторую колонку из списка, и т.д. Мы перечислили значения данных в том же порядке, в каком были заданы колонки при создании таблицы, поэтому можно вообще не указывать имена колонок и применить вот такой оператор INSERT:
INSERT INTO Customer_Data VALUES (777, 'Frankie', 'Stein', '4895873900')
Оператор SELECT
Оператор SELECT применяется для извлечения данных из таблицы или из таблиц. Извлекаемые данные определяются перечисленными колонками и предложением WHERE. Предположим, например, что нам надо извлечь значения из колонок customer_id и first_name нашей таблицы Customer_Data, и эти данные нужны лишь для строк со значением Frankie в поле first_name. Тогда нужно применить такой оператор SELECT:
SELECT customer_id, first_name FROM Customer_Data WHERE first_name = 'Frankie' Если критерию из оператора SELECT будет соответствовать лишь одна строка, то результат может быть таким: customer_id first_name -------------- ------------- 777 Frankie
Оператор UPDATE
Оператор UPDATE применяется для обновления (т.е. изменения) значений в одной или нескольких строках таблицы. Например, допустим, заказчик Frankie Stein позвонил и попросил изменить его имя в записях базы данных на Franklin. Эту задачу выполнит такой оператор UPDATE:
UPDATE Customer_Data SET first_name = 'Franklin' WHERE last_name = 'Stein' and customer_id=777
В предложении WHERE указан идентификационный номер заказчика ( customer_id ), чтобы не допустить изменения имен других заказчиков с такой же фамилией Stein (если такие заказчики имеются), имена будут изменены лишь у заказчика с идентификационным номером 777.
Оператор DELETE
Оператор DELETE применяется для удаления из таблицы одной или нескольких строк с данными. Можно удалить даже все строки таблицы. Чтобы удалить все строки из нашей таблицы-примера Customer_Data, можно воспользоваться каким-либо одним из двух показанных ниже операторов DELETE:
DELETE FROM Customer_Data
или
DELETE Customer_Data
Ключевое слово FROM перед именем таблицы в операторе DELETE не обязательно, эти два оператора ничем не отличаются. Для удаления из таблицы Customer_Data строк, у которых значение колонки customer_id меньше, чем 100, применяется такой оператор:
DELETE FROM Customer_Data WHERE customer_id < 100
Теперь, когда вы вкратце познакомились с операторами языков DDL и DML, входящих в состав SQL, давайте рассмотрим язык T-SQL.
Что такое T-SQL
T-SQL – это усовершенствование стандартного языка программирования SQL. Первоначальный, основной SQL применяется для взаимодействия между приложениями и SQL Server. В T-SQL имеются все возможности языков DDL и DML стандартного SQL, а кроме этого имеются также расширенные функции, системные хранимые процедуры и конструкции для программирования (такие, как IF and WHILE ), обеспечивающие гораздо большую гибкость программирования. По мере выхода новых версий SQL Server возможности T-SQL растут.
Обзор новых возможностей T-SQL
В T-SQL для Microsoft SQL Server 7 появились многочисленные добавления и улучшения, в том числе новые хранимые процедуры, системные таблицы, функции, типы данных, операторы и новые возможности для старых операторов. Все было сохранено и в SQL Server 2000, и мы сейчас дадим краткий обзор этих новых возможностей (если вы не знаете о них по опыту своей работы с SQL Server 7). Однако их слишком много, чтобы мы смогли дать подробные описания, поэтому мы рассмотрим лишь несколько примеров для каждой их разновидности.
Системные хранимые процедуры
В SQL Server имеются системные хранимые процедуры, с помощью которых можно выполнять администрирование и другие задачи, требующие обновления системных таблиц и извлечения информации из системных таблиц. Системные хранимые процедуры инсталлируются вместе с SQL Server, их имена начинаются с sp_ или с xp_. Эти процедуры хранятся в базе данных master (главной системной базе данных) (а также базе msdb. – Прим. ред.), их владелец – системный администратор, но многие из них могут запускаться из любой пользовательской базы данных, извлекая при этом информацию из системных таблиц этой базы данных. Когда вы исполняете системную хранимую процедуру, она работает с системными таблицами текущей базы данных.
Многие системные хранимые процедуры появились в SQL Server 7, сейчас они по-прежнему доступны и в SQL Server 2000. В табл. 13.1 перечислены некоторые из этих системных процедур, они могут вам пригодиться.
Системная хранимая процедура | Описание |
---|---|
sp_cycle_errorlog | Закрывает текущий файл-журнал ошибок и переименовывает его в errorlog.1 (если необходимо, переименовывает старый errorlog.1 в errorlog.2 и так далее) и открывает новый файл-журнал ошибок > |
sp_helpfile | Возвращает физические имена и атрибуты файлов, сопоставленных с текущей базой данных |
sp_helpfilegroup | Возвращает имена и атрибуты групп файлов, сопоставленных с текущей базой данных |
sp_helprole | Возвращает информацию о ролях в текущей базе данных |
sp_help_alert | Возвращает информацию о предупреждениях, заданных для сервера |
sp_start_job | Приказывает, чтобы SQL Server Agent начал выполнять задание |
Некоторые из этих хранимых процедур не только немедленно выдают информацию, но могут и сохранять для дальнейшего применения важную информацию о пользовательских базах данных. Например, процедуры, возвращающие информацию о базе данных пользователя, могут оказаться полезными при исполнении в сценариях T-SQL, когда выдаваемая ими информация будет сохраняться в файле. Вы можете сохранять информацию, выдаваемую после запуска хранимых процедур sp_helpfile, sp_helpfilegroup и sp_helpdb, примененных к нужной базе данных (процедура sp_helpdb, хоть и старая, но по-прежнему пользуется популярностью). Это пригодится в случае, если придется воссоздавать базу данных и понадобится информация о первоначально созданных и сконфигурированных файлах, группах файлов и опциях базы данных. Список остальных новых системных процедур, появившихся в SQL Server 7, вы найдете в Books Online, в теме "New Features in Transact-SQL" (Новые возможности в Transact-SQL).
Системные таблицы
Системные таблицы служат для хранения информации о конфигурации SQL Server и хранения заданных для баз данных определений объектов, пользователей и полномочий доступа. Каждая пользовательская база данных имеет свои собственные системные таблицы, в которых хранится информация для этой базы данных. Системные таблицы, хранящие информацию о конфигурации на уровне сервера, хранятся только в базе данных master (главной системной базе данных). Для доступа к системным таблицам нужно применять системные хранимые процедуры, а не осуществлять доступ непосредственно. Список новых системных таблиц, появившихся первоначально в SQL Server 7, вы найдете в Books Online, в теме "New Features in Transact-SQL". Ниже перечисленные некоторые интересные системные таблицы.
- backupfile. Эта таблица находится в базе данных msdb. В ее строках хранится информация обо всех резервных копиях журналов и файлов базы данных. Хранится информация об идентификаторах файлов, о группах, к которым принадлежат файлы, и о буквах для обозначения физических дисков, на которых расположены файлы.
- restorehistory. Эта таблица находится в базе данных msdb. В ее строках хранится информация обо всех операциях восстановления файлов и баз данных. В этой таблице содержится информация о дате и времени выполненного резервного копирования, о целевой базе данных, о моменте времени, когда было восстановление, и о типе восстановления.
- sysfiles. Это – виртуальная таблица, поэтому она не может обновляться непосредственно. В ней содержится информация обо всех файлах базы данных, например, физические и логические имена файлов, размеры и максимальные размеры файлов и приращение роста (если эти значения заданы).Внимание. Для доступа к системным таблицам пользуйтесь только системными хранимыми процедурами. (Другой рекомендованный способ доступа к системным таблицам – это использование так называемых Представлений Информационной Схемы – Information_Schema views. – Прим. ред.) Системные хранимые процедуры являются как бы "изолирующей прокладкой", не дающей вам изменять те данные, которые изменять не следует. Осуществляя доступ к системным таблицам вручную, вы рискуете испортить свою базу данных, изменив важную системную информацию, из-за чего эта база данных станет бесполезной.
Функции
При помощи встроенных функций SQL Server возможно быстрое и удобное решение некоторых задач. Некоторые новые функции появились в SQL Server 7, и они остались доступными и в SQL Server 2000. Зная об имеющихся функциях, вам будет проще программировать приложения SQL Server. Полный список новых функций вы найдете в Books Online, в теме "New Transact-SQL Functions" (Новые функции Transact-SQL). Ниже приведены описания лишь нескольких из новых функций, которые могут вам пригодиться:
- NEWID. Создает глобально уникальный идентификатор (GUID, globally unique identifier), он имеет тип данных uniqueidentifier. Эту функцию можно применять для ввода значений в колонки, имеющие тип данных uniqueidentifier. Применение: NEWID(). (Этой функции не нужны параметры.)
- YEAR. Возвращает целое число, соответствующее году для заданной даты. Применение: YEAR(дата). Пример: оператор SELECT YEAR('07/11/01') выдаст значение 2001.
- MONTH. Возвращает целое число, соответствующее месяцу для заданной даты. Применение: MONTH(дата). Пример: оператор SELECT MONTH('07/11/01') выдаст значение 7.
- DAY. Возвращает целое число, соответствующее дню для заданной даты. Применение: DAY(дата). Пример: оператор SELECT DAY('07/11/01') выдаст значение 11.
- FILE_NAME. Возвращает логическое имя файла, соответствующее заданному номеру идентификатора файла. Применение: FILE_NAME (номер_идентификатора_файла). Пример: оператор SELECT FILE_NAME(4) вернет имя файла, имеющего идентификатор 4. Если в базе данных нет файла с таким идентификатором, то будет возвращено значение NULL.
Типы данных
В SQL Server 7 появилось несколько новых типов данных, а некоторые из имеющихся типов данных получили новые размеры. В SQL Server 2000 помимо этих новшеств появилось еще три новых типа данных. Про большинство типов данных было рассказано в лекции 10. Ниже дан список изменений, относящихся к типам данных, появившихся в SQL Server 7 и оставшихся и в SQL Server 2000:
- Появился новый тип данных, cursor, для переменных-курсоров. Дополнительную информацию о курсорах вы найдете в Books Online, в теме "Cursors".
- Появились новые типы данных для кодировки Unicode: nchar, nvarchar и ntext. При использовании кодировки Unicode на один символ расходуется по 2 байта, и эта кодировка может поддерживать символы всех имеющихся в мире языков.
- Появился новый тип данных uniqueidentifier, применяемый для хранения глобально уникальных идентификаторов (GUID).
- Максимальная длина строк с символьными и с двоичными данными увеличилась до 8000 байт. Эта длина допустима для типов данных char, varchar, binary и varbinary.
А ниже перечислены три новых типа данных, появившихся в SQL Server 2000:
- bigint – хранит 8-байтные целые числа.
- sql_variant – позволяет хранить значения разных типов в одной и той же колонке. В колонках этого типа хранятся как сами данные, так и сведения о них (базовый тип данных, масштаб, точность, максимальный размер и свойства для сравнения (collation)).
- table – этот тип данных аналогичен временным таблицам, описание данных включает в себя список колонок с типами данных. Этот тип данных можно применять для задания локальных переменных или для возвращаемых значений пользовательских функций.
Операторы
В SQL Server 7 появилось много новых операторов T-SQL, а имеющиеся операторы приобрели новые возможности, и все это вошло и в SQL Server 2000. Эти операторы соответствуют некоторым из новых возможностей, появившихся в SQL Server 7. Например, оператор ALTER DATABASE получил следующие новые опции для работы с файлами и группами файлов: MODIFY FILE, ADD FILEGROUP, MODIFY FILEGROUP, REMOVE FILE и REMOVE FILEGROUP. А для групп файлов новый оператор DBCC CHECKFILEGROUP проверяет размещение и структурную целостность всех таблиц в заданной группе файлов.
В SQL Server 7 и SQL Server 2000 появилось еще два оператора DBCC – DBCC SHRINKFILE и DBCC SHRINKDATABASE. Первый из них сжимает заданный файл данных, уменьшая его размер, а второй оператор сжимает все файлы в заданной базе данных, освобождая неиспользуемое место на диске.
У SQL Server 7 и SQL Server 2000 была усовершенствована архитектура для резервного копирования и восстановления. Новый оператор BACKUP позволяет выполнять полные и частичные резервные копирования базы данных и журнала, а новый оператор RESTORE позволяет восстанавливать базы данных и журналы после этого резервного копирования. Эти операторы применяются вместо операторов DUMP и LOAD из старых версий SQL Server. Полный список новых операторов и опций, появившихся в SQL Server 7 и SQL Server 2000, вы найдете в Books Online, в теме "New Features in Transact-SQL". Более подробно о резервном копировании и о восстановлении после резервного копирования будет рассказано в лекциях 32 и 33.
Как применять T-SQL
T-SQL можно применять не только в программах ваших приложений (эта тема выходит за рамки нашей книги), вы можете также исполнять интерактивные операторы T-SQL, пользуясь какой-нибудь из трех утилит – ISQL, OSQL или Query Analyzer; кроме того, вы можете создавать и исполнять сценарии SQL.
Утилита ISQL
Утилита ISQL взаимодействует с SQL Server через API-интерфейс DB-LIB; с ее помощью можно исполнять интерактивные операторы T-SQL, хранимые процедуры и файлы сценариев. API-интерфейс DB-LIB остался на уровне функциональности SQL Server 6.5, поэтому приложение ISQL не поддерживает некоторые возможности SQL Server 2000. Например, ISQL не может извлекать данные из типа данных ntext (в кодировке Unicode).
Утилита OSQL
Утилита OSQL появилась в SQL Server 7 и осталась в SQL Server 2000 в качестве замены для ISQL. Утилиты ISQL и OSQL очень во многом сходны, но OSQL для коммуникации с SQL Server применяет API-интерфейс ODBC (Open Database Connectivity), а не DB-LIB, и OSQL поддерживает все возможности SQL Server 2000. Во всем остальном OSQL и ISQL функционируют одинаково. SQL Server 2000 поддерживает обе этих утилиты, однако, чтобы не столкнуться с проблемами, о которых мы упомянули, следует пользоваться OSQL, а не ISQL.Чтобы исполнять OSQL из окна с приглашением командной строки (из окна MS-DOS), нужно просто запустить программу OSQL.exe с соответствующими параметрами, например, так:
osql –U имя_пользователя –P пароль –S имя_сервера
Когда OSQL установит соединение с SQL Server, появится такое приглашение с номером:
1>
После этого приглашения можно вводить операторы T-SQL, например, такой оператор:
1> sp_helpdb master 2> go
В результате его выполнения будет выдана информация о базе данных master. Ключевое слово go не является оператором T-SQL, это – команда, распознаваемая ISQL, OSQL и Query Analyzer и обозначающая завершение пакета операторов T-SQL. Вывод от исполнения таких интерактивных запросов будет выдаваться в окне с приглашением командной строки.
Если при наборе командных строк OSQL вы допустили опечатку, то, воспользовавшись командой RESET, можно снова вернуться к приглашению первой строки:
1> sp_helpbd 2> reset 1> sp_helpdb 2> go
Для завершения работы с утилитой OSQL введите команду QUIT или EXIT. Команду или запрос, исполняющуюся в текущий момент времени, можно завершить, нажав Ctrl+C (выход из утилиты OSQL при этом не произойдет).
Утилита OSQL имеет и другие параметры кроме -U, -P и -S. Полное описание всех параметров и дополнительную информацию об утилите OSQL вы найдете в Books Online, в теме "osql Utility".
Query Analyzer
Query Analyzer применяется для исполнения операторов или сценариев T-SQL из графического пользовательского интерфейса и для получения результатов в форматированном виде. Query Analyzer обладает также некоторыми средствами для анализа индексов запросов. Некоторые люди предпочитают применять Query Analyzer, а не запускать операторы в окне "приглашения MS-DOS". Для работы с Query Analyzer выполните следующие действия:
- Запустите Query Analyzer каким-либо из следующих трех способов.
- введите isqlw в командной строке;
- откройте Enterprise Manager и выберите SQL Query Analyzer в меню Tools;
- в меню кнопки Start наведите указатель мыши сначала на Programs, затем на Microsoft SQL Server, а затем выберите Query Analyzer.
Рис. 13.1. Диалоговое окно Connect to SQL Server - В ниспадающем списке SQL Server выберите сервер, с которым вы хотите соединяться. Точка, стоящая в этом поле, означает соединение с локальным сервером. Введите информацию для входа в систему и, если вы желаете, чтобы в случаях, когда SQL Server не запущен, он запускался бы автоматически, установите флажок Start SQL Server if it is stopped. Затем нажмите на экранную кнопку OK. Появится стартовое окно Query Analyzer (рис. 13.2).
увеличить изображение
Рис. 13.2. SQL Query Analyzer - В окне запросов введите с клавиатуры любой оператор T-SQL или вызов хранимой процедуры (рис. 13.3). Заметьте, что окно запросов на приведенном рисунке развернуто и занимает все окно Query Analyzer.
увеличить изображение
Рис. 13.3. Вызов хранимой процедуры в окне запросов - Чтобы выполнить введенный оператор, нажмите на кнопку Execute Query (Исполнить запрос), находящуюся на панели инструментов и выглядящую как зеленый треугольник, указывающий острием вправо, либо нажмите Ctrl+E*. Результаты исполнения запроса появятся в панели результатов (рис. 13.4).
увеличить изображение
Рис. 13.4. Query Analyzer показывает результаты исполнения запроса - Если нужно, чтобы Query Analyzer загрузил и исполнил созданный вами ранее T-SQL-сценарий, то нажмите на кнопку Load SQL Script в панели инструментов, выглядящую как желтая папка, или выберите команду Open в меню File, а затем найдите и укажите нужный файл со сценарием. Весь сценарий появится в верхней панели окна запросов. Для запуска сценария нажмите на кнопку Execute Query.Примечание. Query Analyzer имеет еще много других возможностей, в том числе некоторые новые возможности для SQL Server 2000. (Подробнее об этом см. лекцию 35.)
Сценарии T-SQL
Создав свои собственные сценарии, вы получите замечательную возможность для многократного запуска операторов и хранимых процедур T-SQL. Сценарий (script) – это просто файл, в котором содержатся операторы T-SQL, которые нужно запускать. В скрипте может быть как один оператор, так и последовательность операторов. Мы сразу дадим одну рекомендацию: создавая сценарии T-SQL, давайте именам их файлов расширение .sql, тогда вам будет легче находить эти файлы.
Ниже дан пример кода простого сценария:
use MyDB go sp_helpdb MyDB go sp_helpfilegroup go sp_spaceused Customer_Data go sp_spaceused Product_Info go
Этот сценарий вызывает несколько системных хранимых процедур, собирающих разнообразную информацию о базе данных MyDB и ее файлах, группах файлов и таблицах (Customer_Data и Product_Info).
Предположим, что этот сценарий был сохранен в файле MyDB_info.sql. Тогда, чтобы запустить его из командной строки, вы можете воспользоваться опциями -i и -o утилиты OSQL. Опция -i вызывает запуск сценария, находящегося во входном файле ( input ), имя которого указано после опции. Опция -o задает выходной файл ( output ), имя которого указано после опции, в него будут помещены результаты. Пусть выходной файл у нас будет иметь имя MyDB_info.out. Давайте также применим опцию -e, тогда операторы T-SQL из входного файла будут отображаться (echo) также и в выходном файле, что облегчит понимание выходного файла. Например, чтобы исполнить наш сценарий, будучи системным администратором, надо дать следующую команду в командной строке:
osql –U sa –P –i MyDB_info.sql –o MyDB_info.out –e
Посмотрите выходной файл и проверьте, что сценарий работает именно так, как надо. Пользуясь сценариями T-SQL таким способом, вы можете сохранять их вывод в файлах и просматривать его потом, например, когда вы захотите сравнить результаты работы сценария до и после внесения каких-либо изменений в базу данных. Кроме того, сценарии полезны, если вам придется использовать какие-либо операторы неоднократно.
Есть и другой способ запуска сценариев, при котором вам не понадобится каждый раз набирать с клавиатуры команду osql -u ....Надо создать .cmd-файл и поместить в него эту команду. Так, можно назвать этот файл MyDB_info.cmd и поместить в него вышеприведенную команду osql -u .... Теперь вы можете не только запустить команду MYDB_INFO из командной строки, но и дважды щелкнуть мышью на имени файла MyDB_info.cmd в Проводнике Microsoft Windows.
Сценарии можно запускать и в Query Analyzer. Чтобы запустить наш сценарий MyDB_info.sql, откройте этот файл, выбрав в Query Analyzer команду Open в меню File, после этого в верхней панели появится код сценария. Нажмите на кнопку Execute Query или нажмите клавиши Ctrl+E, и операторы сценария исполнятся. Вывод от операторов сценария будет выдаваться в соответствии с порядком исполнения операторов (рис. 13.5). Обратите внимание, что на рис. 13.5 две верхние таблицы результатов выданы хранимой процедурой sp_helpdb.
увеличить изображение
Рис. 13.5. Результаты исполнения сценария Query Analyzer
Заключение
В этой лекции вы познакомились с основами языков SQL и T-SQL, увидели примеры простых операторов DDL и DML. Теперь вы умеете запускать операторы T-SQL, причем разными способами – при помощи ISQL, OSQL, Query Analyzer и из сценариев T-SQL. (Об использовании T-SQL см. в лекциях 14, 15 и 25.)
Лекция 14. Извлечение данных при помощи Transact-SQL
Прочитав эту лекцию, вы узнаете, как извлекать данные при помощи оператора SELECT языка Transact-SQL (T-SQL). Здесь также описаны многие необязательные предложения, условия поиска и функции, которые могут применяться в операторах SELECT. Благодаря этим элементам вы сможете составлять запросы, возвращающие лишь те данные, которые вам нужны.
Оператор SELECT
Хотя оператор SELECT обычно применяется для извлечения данных со специфическими свойствами, его можно использовать и для присваивания значений локальным переменным или для вызова функций (об этом будет рассказано в разделе "Другие применения оператора SELECT" в конце этой лекции). Оператор SELECT может быть простым или сложным (но сложные операторы SELECT не обязательно лучше). Старайтесь составлять свои операторы SELECT как можно проще, пусть они только лишь извлекают нужные данные. Например, если вам нужны данные из двух колонок таблицы, то составляйте оператор SELECT для извлечения данных только из этих двух колонок, чтобы минимизировать объем возвращаемых данных.
После того как вы решили, какие именно данные и из каких таблиц вам нужны, надо решить, какие другие опции вы будете использовать (если это вообще понадобится). Эти опции могут задавать колонки из предложений WHERE, для которых будет применяться индексация, можно задать сортировку возвращаемых данных, а можно задать, чтобы выдавались различающиеся неодинаковые значения. (Об оптимизации запросов см.лекцию 35.)
Давайте начнем изучать различные опции оператора SELECT и рассмотрим иллюстрирующие их примеры. Учебные базы данных pubs и Northwind создались автоматически при инсталляции Microsoft SQL Server 2000. Чтобы ознакомиться с этими базами данных, посмотрите их таблицы, применив SQL Server Enterprise Manager.
Синтаксически оператор SELECT состоит из нескольких предложений (clauses), большинство из которых не являются обязательными. Оператор SELECT должен обязательно иметь предложения SELECT и FROM. Эти два предложения задают соответственно колонку (или колонки) и таблицу (или таблицы), из которых будут извлекаться данные. Например, простой оператор SELECT, извлекающий имена и фамилии авторов из таблицы authors базы данных pubs, может выглядеть вот так:
SELECT au_fname, au_lname FROM authors
Если вы пользуетесь утилитой OSQL с командной строкой (она была описана в лекции 13), то не забывайте давать команду GO, исполняющую оператор. При использовании OSQL полный код T-SQL для вышеприведенного оператора SELECT будет таким:
USE pubs SELECT au_fname, au_lname FROM authors GO
Если вы запускаете оператор SELECT в интерактивном режиме (например, при помощи OSQL или SQL Query Analyzer), то результаты отображаются в колонках, и для удобства восприятия эти колонки даны вместе с заголовками. (О T-SQL, OSQL и Query Analyzer см.лекцию 13.)
Предложение SELECT
Предложение SELECT содержит обязательный список выборки (select list) и, возможно, несколько необязательных аргументов. Список выборки – это заданный в предложении SELECT список выражений или колонок, определяющий, какие данные должны быть извлечены. В этом разделе мы расскажем как о необязательных аргументах предложения SELECT, так и о списке выборки.
Аргументы
Для управления выдаваемыми строками в предложении SELECT могут применяться следующие аргументы:
- DISTINCT. При использовании этого аргумента оператор SELECT возвращает только неодинаковые (уникальные) строки. Если список выборки содержит несколько колонок, то строки считаются неодинаковыми, если они различаются значениями хотя бы в одной из колонок. Строки считаются одинаковыми (дублирующимися), когда в каждой паре соответствующих колонок этих строк содержатся одинаковые значения.
- TOP n [PERCENT]. При использовании этого аргумента оператор SELECT возвращает только первые n строк из набора результатов. Если задано ключевое слово PERCENT, то будут возвращаться первые строки, составляющие n процентов от общего количества строк. При использовании ключевого слова PERCENT, число n должно быть в пределах от 0 до 100. Если в запросе имеется предложение ORDER BY, то строки вывода сначала сортируются, а затем из отсортированного набора результатов выдаются первые n строк или n процентов от общего количества строк. (О предложении ORDER BY см. раздел "Предложение ORDER BY" далее.)
Ниже даны три примера запуска оператора SELECT с разными аргументами. В первом из них при запуске используется аргумент DISTINCT, во втором – аргумент TOP 50 PERCENT, а в третьем – аргумент TOP 5:
SELECT DISTINCT au_fname, au_lname FROM authors GO
SELECT TOP 50 PERCENT au_fname, au_lname FROM authors GO
SELECT TOP 5 au_fname, au_lname FROM authors GO
Первый запрос вернет 23 строки, каждая из которых будет уникальной. Второй запрос вернет 12 строк (приблизительно 50%, с округлением до большего числа), а третий запрос вернет 5 строк.
Список выборки
Как уже говорилось, список выборки – это заданный в предложении SELECT список выражений или колонок, указывающий, какие данные должны выдаваться. Выражение может быть списком из имен колонок, из функций, и из констант. Список выборки может содержать несколько выражений и имен колонок, разделенных запятыми. В предыдущих примерах список выборки был таким:
au_fname, au_lname
Метасимвол "*". В списках выборки можно применять звездочку (символ "*"), являющуюся метасимволом (подстановочным символом, "джокером"), обозначающим все колонки из всех таблиц и представлений, указанных в предложении FROM запроса. Например, чтобы вернуть все колонки всех строк таблицы sales из базы данных pubs, воспользуйтесь таким запросом:
SELECT * FROM sales GO
Далее в этой лекции будет раздел "Перекрестные соединения", в котором описано, что произойдет, если в предложении FROM оператора SELECT, содержащего звездочку, указать более одной таблицы.
Выражения IDENTITYCOL и ROWGUIDCOL. Чтобы извлекать значения из идентифицирующей колонки таблицы (identity column, см. лекцию 10), вы можете применять в списках выборки просто выражение IDENTITYCOL. Ниже дан пример запроса для базы данных Northwind, у которой таблица Employees (Сотрудники) имеет идентифицирующую колонку:
USE Northwind GO SELECT IDENTITYCOL FROM Employees GO
Набор результатов этого запроса будет выглядеть примерно так:
EmployeeID ------------- 3 4 8 . . . 9 (всего 9 строк)
Обратите внимание, что заголовок колонки в наборе результатов – такой же, как имя колонки этой таблицы, обладающей свойством IDENTITY (в нашем случае – EmployeeID).
Примерно так же вы можете применять в списке выборки выражение ROWGUIDCOL, обозначающее колонку, обладающую свойством ROWGUIDCOL. Свойство ROWGUIDCOL может иметь лишь колонка, имеющая тип данных uniqueidentifier.
Алиасы колонок.В списках выборки можно применять алиасы колонок, благодаря чему можно поменять заголовок, выдаваемый в наборе результатов. Алиасы могут оказаться полезными в случаях, когда надо пояснить смысл колонки или чтобы дать заголовок колонке, используемой в функции, а также в качестве ссылки для предложения ORDER BY.
Когда в разных таблицах имеются колонки с одинаковыми именами, вы можете захотеть, чтобы в выводе в заголовках выдавались не только имена колонок, но и имена таблиц; это улучшит понимание выводимой информации. Рассмотрим теперь примеры с колонкой lname таблицы employee базы данных pubs. Можно дать такой запрос:
USE pubs GO SELECT lname FROM employee GO
Этот запрос выдаст такие результаты:
lname ---------- Cruz Roulet Devon . . . O’Rourke Ashworth Latimer (всего 43 строки)
Если вы хотите, чтобы в наборе результатов вместо имеющегося заголовка "lname" выводился бы заголовок "Фамилия сотрудника", подчеркнув тем самым, что фамилии взяты из таблицы сотрудников, то надо применить ключевое слово AS, вот так:
SELECT lname AS "Фамилия сотрудника" FROM employee GO
Эта команда выдаст такой вывод:
Фамилия сотрудника ------------------------- Cruz Roulet Devon . . . O’Rourke Ashworth Latimer (всего 43 строки)
Алиасы колонок можно применять в сочетании с другими типами выражений в списке выборки, а также их можно применять в предложениях ORDER BY для ссылок на колонки. Предположим, что в списке выборки имеется вызов функции. Выводу этой функции можно назначить алиас (т.е. имя), воспользовавшись ключевым словом AS после вызова функции. Если при вызове функции не пользоваться алиасом, то колонка ее вывода не будет вообще иметь никакого заголовка. Ниже дан пример оператора, назначающего заголовок "Maximum Job ID" выводу функции MAX:
SELECT MAX(job_id) AS "Maximum Job ID" FROM employee GO
Алиас колонки заключен в кавычки, потому что он состоит из нескольких слов, разделенных пробелами. Если алиас не содержит пробелов (как в следующем нашем примере), то его не нужно заключать в кавычки.
Алиас колонки, заданный в предложении SELECT, может применяться в качестве аргумента предложения ORDER BY, он позволяет предложению ORDER BY ссылаться на колонку из предложения SELECT. Это полезно, когда в списке выборки содержится функция, вывод которой должен быть отсортирован. Ниже приведен пример команды, выдающей количество проданных книг в каждом из магазинов, причем вывод отсортирован по этому количеству. В предложении ORDER BY применяется алиас Quantity_of_Books, заданный в списке выборки:
SELECT SUM(qty) AS Quantity_of_Books, stor_id FROM sales GROUP BY stor_id ORDER BY Quantity_of_Books GO
В этом примере алиас не заключен в кавычки, потому что он не содержит пробелов.
Если бы в этом запросе мы не задали бы алиас для колонки SUM(qty), то мы могли бы поместить в предложение ORDER BY не алиас, а SUM(qty), как показано в приведенном ниже примере. Вывод был бы таким же, за исключением того, что колонка сумм проданных книг выводилась бы без заголовка:
SELECT SUM(qty), stor_id FROM sales GROUP BY stor_id ORDER BY SUM(qty) GO
Помните, что алиасы колонок применяются для задания заголовков колонок вывода и никак не влияют не результаты запросов.
Предложение FROM
Предложение FROM содержит имена таблиц и представлений, из которых извлекаются данные. Каждый оператор SELECT обязательно должен иметь предложение FROM, за исключением случаев, когда список выборки не содержит имен колонок (а содержит лишь константы, переменные и арифметические выражения). Вы уже видели некоторые простые примеры предложений FROM, но предложения FROM могут содержать также и производные таблицы, соединения и алиасы.
Производные таблицы
Производная таблица (derived table) – набор результатов оператора SELECT, вложенный в предложение FROM. Набор результатов вложенного оператора SELECT используется как таблица, из которой извлекаются данные внешний оператор SELECT. Ниже дан пример запроса, использующего производную таблицу, чтобы найти имена всех магазинов (stores), предоставляющих хотя бы один вид скидок (discounts):
USE pubs GO SELECT s.stor_name FROM stores AS s, (SELECT stor_id, COUNT(DISTINCT discounttype) AS d_count FROM discounts GROUP BY stor_id) AS d WHERE s.stor_id = d.stor_id AND d.d_count >= 1 GO
В результате запуска этой команды будет извлечена одна строка, это означает, что предоставляет скидки только один из магазинов, имеющихся в базе данных.
Заметьте, что в этом запросе применяются сокращения для имен таблиц (s для таблицы stores (магазины) и d для таблицы discounts (скидки)). Эти сокращения называются алиасы таблиц (см. раздел "Алиасы таблиц" далее).
Соединения таблиц
Соединение таблиц (joined table) – это набор результатов от операции соединения (join operation), выполненной над двумя или несколькими таблицами. Над таблицами можно выполнять различные типы соединений: внутренние соединения, полные внешние соединения, левые внешние соединения, правые внешние соединения, перекрестные соединения. Давайте рассмотрим их более подробно.
Внутренние соединения. Внутреннее соединение (inner join) является типом соединений, принятым по умолчанию. Внутреннее соединение задает набор результатов, в который будут включены лишь те строки таблиц, которые соответствуют условию ON, а все несоответствующие строки будут отброшены. Чтобы задать соединение, применяйте ключевое слово JOIN. Для задания условия поиска, на котором основывается соединение, применяется ключевое слово ON. Ниже приведен пример запроса, в котором соединяются таблицы stores и discounts; этот запрос показывает, в каких магазинах предоставляются скидки и типы этих скидок. (Это соединение – внутреннее, потому что по умолчанию применяется внутреннее соединение; поэтому будут возвращены лишь строки, соответствующие условию поиска ON.)
SELECT s.stor_id, d.discounttype FROM stores s JOIN discounts d ON s.stor_id = d.stor_id GO
Набор результатов будет выглядеть примерно так:
stor_id discounttype ------------------------------ 8042 Customer Discount
Как видите, скидки предоставляет лишь один магазин, причем скидки лишь одного типа. Выданная строка является единственной строкой с совпадающими значениями stor_id из таблицы stores и stor_id из таблицы discounts. Возвращаются это значение stor_id и соответствующее ему значение discounttype.
Полные внешние соединения. Полное внешнее соединение (full outer join) задает набор результатов, состоящий как из строк, соответствующих условию ON, так и из строк, не соответствующих условию ON. Для строк, не соответствующих условию ON, значением колонки, несоответствующей условию, станет NULL. В нашем примере NULL будет означать, что либо магазин не предоставляет никаких скидок (если некоторое значение stor_id имеется в таблице stores, но отсутствует в таблице discounts), либо этот тип скидки не предоставляется никаким магазином. Запрос в следующем примере полностью совпадает с предыдущим, за исключением того, что в нем стоят ключевые слова FULL OUTER JOIN:
SELECT s.stor_id, d.discounttype FROM stores s FULL OUTER JOIN discounts d ON s.stor_id = d.stor_id GO
Набор результатов будет выглядеть примерно так:
stor_id discounttype --------- ----------------- NULL Initial Customer NULL Volume Discount 6380 NULL 7066 NULL 7067 NULL 7131 NULL 7896 NULL 8042 Customer Discount
Условию поиска будет соответствовать лишь одна строка в наборе результатов (последняя). Остальные строки имеют NULL в одной из колонок.
Левые внешние соединения. Левое внешнее соединение (left outer join) возвращает строки, в которых произошло соответствие условию поиска, плюс все строки из таблицы, заданной слева от ключевого слова JOIN. Ниже дан наш старый пример запроса, но теперь в нем используются ключевые слова LEFT OUTER JOIN:
SELECT s.stor_id, d.discounttype FROM stores s LEFT OUTER JOIN discounts d ON s.stor_id = d.stor_id GO
Набор результатов будет выглядеть примерно так:
stor_id discounttype ------- --------------------- 6380 NULL 7066 NULL 7067 NULL 7131 NULL 7896 NULL 8042 Customer Discount
В набор результатов попадут и те строки из таблицы stores, для которых не нашлось строк из таблицы discounts с совпадающим значением stor_id (в колонке discounttype набора результатов в этих строках будет стоять значение NULL ). В набор результатов попадет также одна строка, для которой произошло соответствие условию ON.
Правые внешние соединения. Правое внешнее соединение (right outer join) противоположно левому внешнему соединению: в него войдут строки, соответствующие условию поиска, плюс все строки из таблицы, заданной справа от ключевого слова JOIN. Ниже дан наш старый пример запроса, но теперь в нем используются ключевые слова RIGHT OUTER JOIN:
SELECT s.stor_id, d.discounttype FROM stores s RIGHT OUTER JOIN discounts d ON s.stor_id = d.stor_id
Набор результатов будет выглядеть примерно так:
stor_id discounttype ------- -------------------- NULL Initial Customer NULL Volume Discount 8042 Customer Discount
В набор результатов попали и те строки из таблицы discounts, которые не имеют значений stor_id, совпадающих со значениями, имеющимися в таблице stores (значением stor_id для этих строк в наборе результатов станет NULL ). В набор результатов попадет также строка, соответствующая условию ON.
Перекрестные соединения. Перекрестное соединение (cross join) – это произведение двух таблиц, в котором не задано предложение WHERE. Когда предложение WHERE задано, перекрестное соединение работает как внутреннее соединение. А без предложения WHERE будет возвращаться такой результат: каждая строка из первой таблицы сопоставляется с каждой строкой из второй таблицы, поэтому размер набора результатов будет равен числу строк первой таблицы, умноженному на число строк второй таблицы.
Чтобы понять, что такое перекрестное соединение, давайте рассмотрим еще несколько примеров. Сначала рассмотрим перекрестное соединение без предложения WHERE, а затем рассмотрим три примера перекрестных соединений с предложениями WHERE. Ниже даны три простых примера. Запустите эти запросы и обратите внимание на количество строк в наборах результатов.
SELECT * FROM stores GO SELECT * FROM sales GO SELECT * FROM stores CROSS JOIN sales GO
SELECT * FROM stores, sales GO
Чтобы не потонуть в массе ненужной информации (если информации выдано больше, чем нужно), мы можем сузить запрос, добавив в него предложение WHERE, вот так:
SELECT * FROM sales CROSS JOIN stores WHERE sales.stor_id = stores.stor_id GO
Этот оператор возвращает только те строки, которые соответствуют условию поиска в предложении WHERE, что уменьшит набор результатов до 21 строки. Из-за предложения WHERE перекрестное соединение работает как внутреннее соединение (т.е. возвращаться будут лишь строки, соответствующие условию поиска). Запрос, показанный в последнем примере, возвращает строки из таблицы sales, соединенные со строками из таблицы stores, имеющими совпадающие значения stor_id. Строки, у которых нет совпадений, не возвращаются.
Чтобы еще больше сузить набор результатов, вы можете задать, из какой именно таблицы будут извлекаться все строки и колонки, поместив перед звездочкой имя таблицы, как это сделано в следующем нашем примере. Вы также можете указать, какой таблице принадлежит колонка, поместив перед именем колонки имя таблицы (отделив его точкой):
SELECT sales.*, stores.city FROM sales CROSS JOIN stores WHERE sales.stor_id = stores.stor_id GO
Этот запрос возвращает все колонки из таблицы sales (продажи), к которым добавлена колонка city ("город) из таблицы stores, для строк с одинаковыми значениями stor_id. Фактически, в набор результатов будет включены названия городов для магазинов, в которых проводились продажи, присоединенные к строкам из таблицы sales, имеющим значения stor_id, совпадающие со значениями stor_id из таблицы stores.
Ниже приведен еще один пример запроса, не имеющий символа "*" (из таблицы sales извлекается только колонка stor_id):
SELECT sales.stor_id, stores.city FROM sales CROSS JOIN stores WHERE sales.stor_id = stores.stor_id GO
Алиасы таблиц
Вы уже видели несколько примеров, в которых применялись алиасы имен таблиц (слово алиас означает замена имени, псевдоним). Ключевое слово AS является необязательным, т.е. "FROM имя_таблицы AS алиас" будет работать точно так же, как и "FROM имя_таблицы алиас". Давайте вернемся к запросу, приведенному в качестве примера в разделе "Правые внешние соединения", в котором применяются алиасы:
SELECT s.stor_id, d.discounttype FROM stores s RIGHT OUTER JOIN discounts d ON s.stor_id = d.stor_id GO
Каждая из двух таблиц из этого примера имеет колонку stor_id. Чтобы различать, какую именно из этих двух колонок вы применяете в запросе, нужно перед именем колонки задать имя таблицы или алиас (отделив точкой). В нашем примере для таблицы stores применяется алиас s, а для таблицы discounts применяется алиас d. Задавая колонку мы должны ставить перед ее именем "s." или " d.", указывая тем самым, в какой таблице содержится эта колонка. Тот же самый запрос с применением ключевых слов AS будет выглядеть так:
SELECT s.stor_id, d.discounttype FROM stores AS s RIGHT OUTER JOIN discounts AS d ON s.stor_id = d.stor_id GO
Предложение INTO
Предложение INTO является первым из рассматриваемых нами необязательных предложений оператора SELECT. Пользуясь синтаксической конструкцией
SELECT <список_выборки> INTO<новая таблица>
вы можете извлекать данные из таблицы или из нескольких таблиц и помещать строки результатов в новые таблицы. Новые таблицы создаются автоматически при исполнении оператора SELECT ... INTO и определены в соответствии с колонками из списка выборки. Каждая колонка в новой таблице будет иметь тип данных, такой же, как и у исходных колонок, и будет иметь имя, заданное в списке выборки. Пользователь должен иметь полномочие на создание таблиц ( CREATE TABLE ) в той базе данных, где будет создана новая таблица (в целевой базе данных). (О том, как задавать полномочия см. лекцию 34.)
Оператор SELECT ... INTO можно применять для помещения строк как во временные, так и в постоянные таблицы. Для локальных временных таблиц (видимых только для текущего соединения или пользователя) вы должны поместить перед именем таблицы символ "#". Для глобальных временных таблиц (видимых для всех пользователей) вы должны поместить перед именем таблицы два символа "#" (т.е. "##"). Временная таблица автоматически уничтожается после того, как все пользователи, которые с ней работают, отсоединятся от SQL Server. Чтобы помещать данные в постоянную таблицу, не нужно применять префикс целевых таблиц, но для целевой базы данных должна быть включена настройка Select Into/Bulk Copy. Чтобы включить эту настройку для базы данных pubs, вы можете выполнить такой оператор OSQL:
sp_dboption pubs, "select into/bulkcopy", true GO
Для включения этой настройки можно также применить SQL Server Enterprise Manager, вот так:
- Нажмите правой кнопкой мыши на имя базы данных pubs в любой панели Enterprise Manager и выберите Properties в контекстном меню. Появится окно свойств базы данных pubs (pubs Properties) (рис. 14.1). (Наверное, вы его помните, оно было в лекции 9, когда мы создавали базу данных и задавали настройки для роста файла.)
Рис. 14.1. Вкладка General окна свойств базы данных - Нажмите на вкладку Options (рис. 14.2) и выберите в ниспадающем списке Model опцию Bulk-Logged. Остальные настройки не трогайте. Нажмите OK.
Рис. 14.2. Вкладка Options окна свойств базы данных - Ниже приведен пример запроса, в котором оператор SELECT ... INTO применяется для создания новой постоянной таблицы emp_info (информация о сотрудниках), в которой содержатся имена, фамилии и описания должностных обязанностей сотрудников (эта информация извлекается из базы данных pubs):
SELECT employee.fname, employee.lname, jobs.job_desc INTO emp_info FROM employee, jobs WHERE employee.job_id = jobs.job_id GO
Таблица emp_info будет иметь три колонки – fname, lname и job_desc, типы данных которых будут такими же, как и у колонок, заданных в исходных таблицах (employee и jobs). Если вы хотите, чтобы новая таблица была локальной временной таблицей, то перед ее именем надо поместить символ "#" (вот так: #emp_info), а чтобы новая таблица была глобальной временной таблицей, поместите перед ее именем "##" (вот так: ##emp_info).
Предложение WHERE и условия поиска
Чтобы ограничить количество строк, выдаваемых в ответ на запрос, вы можете применить предложение WHERE. В этом разделе мы расскажем о многих операциях, применимых в условиях поиска.
Давайте сначала договоримся об используемой терминологии. Условие поиска (search condition) может содержать произвольное количество предикатов (predicates), соединенных логическими операциями (logical operators) AND, OR и NOT (И, ИЛИ и НЕ). Предикаты –это выражения, возвращающие значения TRUE, FALSE или UNKNOWN (ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО). Выражение (expression) может быть именем колонки, константой, скалярной функцией (т.е. функцией, возвращающей одно значение), переменной, скалярным подзапросом (т.е. запросом, возвращающим одну колонку), либо комбинацией этих элементов, соединенных операциями. В этом разделе нашей книги термин "выражение" применяется также и к предикатам.
Операции сравнения
В выражениях можно использовать операции сравнения (comparison operators), перечисленные в табл. 14.1.
Операция | Проверяемое условие |
---|---|
= | Проверяется равенство двух выражений |
<> | Проверяется неравенство двух выражений |
!= | Проверяется неравенство двух выражений (то же самое, что и <> ) |
> | Проверяется, что первое выражение больше второго |
>= | Проверяется, что первое выражение больше второго или равно ему |
!> | Проверяется, что первое выражение не больше второго |
< | Проверяется, что первое выражение меньше второго |
<= | Проверяется, что первое выражение меньше второго или равно ему |
!< | Проверяется, что первое выражение не меньше второго |
В простом предложении WHERE может производиться сравнение двух выражений при помощи операции сравнения на равенство (=). Ниже приведен пример оператора SELECT, проверяющего значения в колонке lname для всех строк (а эти значения имеют тип данных char) и возвращающего TRUE, если это значение равно "Latimer" (в набор результатов будут включены строки, для которых возвращается значение TRUE ):
SELECT * FROM employee WHERE lname = "Latimer" GO
Запрос, приведенный в этом примере, вернет одну строку. Имя Latimer должно быть задано в кавычках, потому что оно является текстовой строкой.
В следующем запросе применяется операция неравенства ( <> ), на этот раз по отношению к колонке job_id, имеющей тип данных integer:
SELECT job_desc FROM jobs WHERE job_id <> 1 GO
Этот запрос выдает текст с описанием должностных обязанностей из строк таблицы jobs, имеющих значения job_id, не равные 1. Будет выдано 13 строк. Если в строке содержится значение NULL, то оно считается не равным ни 1, ни какому- либо другому значению, поэтому будут выведены и строки null-значениями.
Логические операции
Логические операции (logical operators) AND и OR проверяют два выражения и, в зависимости от их значений, возвращают булево значение TRUE, FALSE или UNKNOWN. Операция NOT выдает булево значение, противоположное значению выражения, следующего за ним. Значения, возвращаемые операциями AND, OR и NOT, показаны в таблицах на рис. 14.3. Таблицами для операций AND и OR надо пользоваться так: найдите результат первого выражения в левой колонке, найдите результат второго выражения в верхней строке, а затем посмотрите результат логической операции в ячейке на пересечении соответствующих строки и колонки. Таблица для операции NOT – совсем понятная. Результат может получить значение UNKNOWN, если среди операндов имеется значение NULL.
Рис. 14.3. Значения, возвращаемые операциями AND, OR и NOT при различных значениях операндов
В следующем запросе в предложении WHERE имеются два выражения, соединенных логической операцией AND:
SELECT job_desc, min_lvl, max_lvl FROM jobs WHERE min_lvl >= 100 AND max_lvl <= 225 GO
Как видно из таблицы (рис. 14.3), операция AND возвращает значение TRUE, когда оба условия возвращают TRUE. Этот запрос вернет четыре строки.
В следующем запросе операция OR применяется для поиска издателей из Вашингтона (федеральный округ Колумбия) и из Массачусетса. Будут возвращены строки, для которых значение TRUE явилось результатом хотя бы одного из условий.
SELECT p.pub_name, p.state, t.title FROM publishers p, titles t WHERE p.state = "DC" OR p.state = "MA" AND t.pub_id = p.pub_id GO
Этот запрос вернет 23 строки.
Операция NOT возвращает просто отрицание булева значения выражения, следующего за ним. Например, чтобы получить список всех названий книг, у которых авторские отчисления составляют не менее 20%, можно применить операцию NOT:
SELECT t.title, r.royalty FROM titles t, roysched r WHERE t.title_id = r.title_id AND NOT r.royalty < 20 GO
Этот запрос выдаст 18 названий книг, у которых авторские отчисления составляют 20% или более.
Другие ключевые слова
Кроме операций, описанных в предыдущих разделах, в условиях поиска можно применять еще много других ключевых слов T-SQL. В этом разделе мы расскажем о наиболее часто применяемых ключевых словах и приведем примеры их использования.
LIKE. Ключевое слово LIKE применяется для поиска по соответствию шаблону. Соответствие шаблону (pattern matching) проверяется для двух операндов условия поиска – сопоставляемого выражения (match expression) и шаблона (pattern), задающего условие поиска. При этом используется такой синтаксис:
<сопоставляемое_выражение> LIKE <шаблон>
Если сопоставляемое выражение соответствует шаблону, то возвращается булево значение TRUE, а если нет, то возвращается FALSE. Сопоставляемое выражение должно иметь тип данных character string, в противном случае SQL Server преобразует его в данные, имеющие тип character string, если это возможно.
Шаблоны являются строковыми выражениями (string expressions), т.е. строками, состоящими из символов (characters) и метасимволов (wildcard characters). Метасимволы – это символы, имеющие особый смысл при использовании внутри строковых выражений. Метасимволы, которые можно применять в шаблонах, перечислены в табл. 14.2.
Метасимвол | Описание |
---|---|
% | Символ процента соответствует строке из нескольких символов (в том числе, пустой строке и строке из одного символа) |
_ | Символ подчеркивания соответствует любому одному символу |
[] | Метасимвол диапазона соответствует любому одному символу из заданного диапазона или набора символов. Например, [m-p] или [mnop] соответствуют любому из символов m, n, o или p |
[^] | Метасимвол "не в диапазоне" соответствует любому одному символу, не входящему в диапазон или набор символов. Например, [^m-p] или [^mnop] соответствуют любому из символов, кроме символов m, n, o или p |
Чтобы лучше понять применение ключевого слова LIKE и метасимволов, рассмотрим несколько примеров. Если нужно найти в таблице authors все фамилии, начинающиеся с буквы S, то можно воспользоваться таким запросом с метасимволом %:
SELECT au_lname FROM authors WHERE au_lname LIKE "S%" GO
Набор результатов может быть, например, таким:
au_lname ----------- Smith Straight Stringer
В этом запросе "S%" означает, что нужно возвращать все строки с фамилиями, первой буквой которых будет S, а за ней может следовать произвольное количества букв.
Чтобы извлечь информацию об авторе, идентификатор которого начинается с числа 724, и, зная, что все идентификаторы авторов имеют формат как у номеров социального страхования (три цифры, тире, затем две цифры, затем еще тире, и затем четыре цифры), вы можете воспользоваться метасимволом "_", вот так:
SELECT * FROM authors WHERE au_id LIKE "724-__-____" GO
В набор результатов попадут две строки со следующими значениями au_id: 724-08-9931 и 724-80-9391.
А теперь давайте рассмотрим пример применения метасимвола []. Чтобы получить фамилии авторов, начинающиеся на букву от A до M, можно воспользоваться метасимволом [] в сочетании с метасимволом %, вот так:
SELECT au_lname FROM authors WHERE au_lname LIKE "[A-M]%" GO
Набор результатов будет содержать 14 строк с фамилиями, начинающимися на букву от A до M (или 13 строк, если пользоваться порядком сортировки, чувствительным к регистру букв).
Если в этом запросе поменять метасимвол [] на [^], то будут выданы строки, содержащие фамилии, начинающиеся на буквы вне диапазона от A до M:
SELECT au_lname FROM authors WHERE au_lname LIKE "[^A-M]%" GO
Такой запрос вернет 9 строк.
Если вы применяете сортировку, чувствительную к регистру букв и желаете найти все имена в некотором диапазоне букв, независимо от их регистра, то можно применить запрос, который проверит и строчные, и прописные буквы, вот так:
SELECT au_lname FROM authors WHERE au_lname LIKE "[A-M]%" OR au_lname LIKE "[a-m]%" GO
Имя "del Castillo" попадет в набор результатов, и это будет отличать этот запрос от запроса, чувствительного к регистру, находящего только ПРОПИСНЫЕ буквы от A до M.
Перед ключевым словом LIKE можно помещать операцию NOT. NOT LIKE выдает строки, не соответствующие заданному условию. Например, чтобы найти названия книг, не начинающиеся со слова The, можно воспользоваться таким запросом:
SELECT title FROM titles WHERE title NOT LIKE "The %" GO
Этот запрос вернет 15 строк.
Пользуясь ключевым словом LIKE, вы можете дать волю своей фантазии. Однако будьте осторожны и проверяйте, что ваши запросы работают именно так, как задумано. Если не поставить NOT или символ ^ там, где это надо, то набор результатов будет противоположен ожидаемому. Если не поставить в нужном месте метасимвол %, то результат тоже будет неправильным. И не забывайте о том, что первые и завершающие пробелы тоже участвуют в сопоставлении шаблону.
ESCAPE. При помощи ключевого слова ESCAPE можно задать сопоставление шаблону, содержащему сами знаки, служащие для обозначения метасимволов (т.е., сами символы ^, %, [, ] и _). Для этого вы должны задать после ключевого слова ESCAPE так называемый escape-символ, обозначающий, что символ, следующий за ним, следует понимать "как есть". Например, чтобы найти все строки из таблицы, имеющие символ подчеркивания в колонке title, можно применить такой запрос:
SELECT title FROM titles WHERE title LIKE "%e_%" ESCAPE "e" GO
Этот запрос не вернет ни одной строки, потому что ни в одном названии книги нет символов подчеркивания.
BETWEEN. Ключевое слово BETWEEN используется всегда в сочетании с ключевым словом AND и задает диапазон вхождения, применяемый как условие поиска. Ниже показан его синтаксис:
<проверяемое_выражение> BETWEEN <начальное_выражение> AND <конечное_выражение>
Если проверяемое_выражение больше или равно, чем начальное_выражение, и в то же время меньше или равно, чем конечное_выражение, то результатом условия поиска является булево значение TRUE, а в противном случае результатом условия поиска является FALSE.
Ниже приведен пример запроса, в котором BETWEEN применяется для поиска названий книг с ценой от 5 до 25 долларов:
SELECT price, title FROM titles WHERE price BETWEEN 5.00 AND 25.00 GO
Этот запрос вернет 14 строк.
Вместе с BETWEEN тоже можно применять NOT, тогда будут искаться строки, не входящие в заданный диапазон. Например, чтобы найти названия книг с ценами вне диапазона от 20 до 30 долларов (а именно, книг дешевле 20 и дороже 30 долларов), можно было бы применить такой запрос:
SELECT price, title FROM titles WHERE price NOT BETWEEN 20.00 AND 30.00 GO
В конструкции с ключевым словом BETWEEN проверяемое_выражение должно иметь такой же тип данных, как и начальное_выражение и конечное_выражение.
В последнем примере колонка price (цена) имеет тип данных money, поэтому и начальное_выражение, и конечное_выражение должны быть числами, сравнимыми с типом данных money, или для них должно быть возможным неявное преобразование в этот тип данных. Вы не можете применять в качестве проверяемого выражения значение из колонки price, а для начального и конечных выражений – символьные строки (т.к. они имеют тип данных char). Если вы все-таки сделаете это, то SQL Server выдаст сообщение об ошибке.
Мы приведем еще один пример использования ключевого слова BETWEEN, которое на этот раз применяет в качестве условия поиска текстовые строки:
SELECT au_lname FROM authors WHERE au_lname BETWEEN "Bennet" AND "McBadden" GO
Этот запрос позволяет найти фамилии авторов, которые при сортировке в алфавитном порядке попали бы между фамилиями "Bennet" и "McBadden". Поскольку границы диапазона BETWEEN считаются входящими в проверяемый диапазон, то фамилии "Bennet" и "McBadden" тоже войдут в набор результатов запроса (эти фамилии имеются в таблице).
IS NULL. Ключевое слово IS NULL используется в условиях поиска, ищущих строки, содержащие null -значение в заданной колонке. Например, чтобы найти в таблице titles названия книг, у которых нет данных в колонке notes (примечания), т.е. когда значением колонки notes является NULL, можно воспользоваться таким запросом:
SELECT title, notes FROM titles WHERE notes IS NULL GO Этот запрос выдаст такой набор результатов: title notes ---------------------------------------- ------ The Psychology of Computer Cooking NULL
Как видите, null -значения в колонке notes в наборе результатов отображаются словом NULL. Это слово не является содержимым колонки, оно служит просто обозначением того, что в данной колонке находится null-значение. (Помните, в лекции 10 объяснялось, что null -значения – это неизвестные значения.)
Чтобы найти названия книг, у которых имеются данные о колонке notes (т.е., у которых значение колонки notes не является null -значением), применяйте конструкцию IS NOT NULL, вот так:
SELECT title, notes FROM titles WHERE notes IS NOT NULL GO
Набор результатов будет содержать 17 строк, в каждой из которых в колонке notes будут иметься символы (один или несколько), т.е. не null -значения.
IN. Ключевое слово IN используется как условие поиска, проверяющее, не соответствует ли проверяемое выражение какому-либо из значений в подзапросе или в списке значений. Если соответствие найдено, то возвращается значение TRUE. NOT IN возвращает отрицание того, что получилось бы при применении IN, поэтому NOT IN возвратит значение TRUE, если проверяемое выражение не найдено в подзапросе или в списке значений. Используется такой синтаксис:
<проверяемое_выражение> IN (<подзапрос>)
или
<проверяемое_выражение> IN (<список_значений>)
Подзапрос – это оператор SELECT, который возвращает в наборе результатов только одну колонку. Подзапрос должен быть заключен в скобки. Список значений – это просто список из нескольких значений, разделенных запятыми и заключенный в скобки. Колонка, получающаяся как набор результатов подзапроса или список значений, должна иметь такой же тип данных, как и проверяемое выражение. Если необходимо, SQL Server выполнит неявное преобразование типов данных.
В приведенном ниже примере запроса ключевое слово IN применяется в сочетании со списком значений для поиска идентификаторов должностей для трех описаний должностных обязанностей:
SELECT job_id FROM jobs WHERE job_desc IN ("Operations Manager", "Marketing Manager", "Designer") GO
В этом запросе применен такой список значений: (Operations Manager, Marketing Manager, Designer). Запрос будет возвращать идентификаторы должностей из строк, содержащих в колонке job_desc какое-либо значение из списка. Благодаря ключевому слову IN ваш запрос проще и понятней для восприятия, чем запрос, который получился, если бы вы применили две операции OR, вот такой:
SELECT job_id FROM jobs WHERE job_desc = "Operations Manager" OR job_desc = "Marketing Manager" OR job_desc = "Designer" GO
В следующем запросе ключевое слово IN используется в одном операторе дважды – первый раз с подзапросом, а второй раз – со списком значений внутри подзапроса:
SELECT fname, lname -- Внешний запрос FROM employee WHERE job_id IN ( SELECT job_id -- Внутренний запрос, подзапрос FROM jobs WHERE job_desc IN ("Operations Manager", "Marketing Manager", "Designer")) GO
Сначала будет искаться подзапрос (в нашем примере – набор значений job_id ). Значения job_id получаются как результаты подзапроса и не выводятся на экран, они используются внешним запросом как выражения для его собственного условия поиска IN. Окончательный набор результатов будет содержать имена и фамилии всех сотрудников, должности которых называются Operations Manager, Marketing Manager или Designer.
Набор результатов будет таким (запрос вернет 11 строк):
fname lname ------------------------ Pedro Afonso Lesley Brown Palle Ibsen Karin Josephs Maria Larsson Elizabeth Lincoln Patricia McKenna Roland Mendel Helvetius Nagy Miguel Paolino Daniel Tonini
IN можно применять в сочетании с операцией NOT. Например, чтобы вернуть имена всех издательств, кроме находящихся в Калифорнии, Техасе и Иллинойсе, запустите такой запрос:
SELECT pub_name FROM publishers WHERE state NOT IN ( "CA", "TX", "IL") GO
Этот запрос вернет пять строк, у которых значение в колонке state (штат) не является обозначением ни одного из трех штатов, указанных в списке значений. Если вы установили настройку ANSI nulls вашей базы данных на ON, то набор результатов будет содержать только три строки. Такое малое количество выданных строк произошло потому, что две из пяти строк первоначального набора результатов в качестве значения для state будут иметь NULL, а значения NULL не извлекаются при настройке ANSI nulls заданной как ON.
Чтобы узнать, какова настройка ANSI nulls для базы данных pubs, запустите следующую системную хранимую процедуру:
sp_dboption "pubs", "ANSI nulls" GO
Если настройка ANSI nulls задана как OFF, то измените ее на ON при помощи следующего оператора:
sp_dboption "pubs", "ANSI nulls", TRUE GO
А чтобы изменить настройку с ON на OFF, примените такой же оператор, но с FALSE вместо TRUE.
EXISTS. Ключевое слово EXISTS используется для проверки существования строк в выводе подзапроса, указанного после него. Используется такой синтаксис:
EXISTS (<подзапрос>)
Если имеется хоть одна строка, удовлетворяющая подзапросу, то возвращается значение TRUE.
Чтобы найти имена авторов, у которых имеются опубликованные книги, можно применить такой запрос:
SELECT au_fname, au_lname FROM authors WHERE EXISTS ( SELECT au_id FROM titleauthor WHERE titleauthor.au_id = authors.au_id) GO
Авторы, имена которых имеются в таблице authors, но не имеющие опубликованных книг в таблице titleauthor, выбраны не будут. Если в подзапросе не будет найдено ни одной строки, то набор результатов внешнего запроса будет пустым (будет найдено ноль строк).
CONTAINS и FREETEXT. Ключевые слова CONTAINS и FREETEXT используются для полнотекстного поиска в колонках, имеющих символьные типы данных. Это обеспечивает большую гибкость, по сравнению с возможностями ключевого слова LIKE. Например, благодаря ключевому слову CONTAINS, можно искать слова, обладающие не точным соответствием, а некоторой похожестью на заданное слово или фразу (такое сопоставление называется "нечетким"). При помощи FREETEXT можно искать слова, соответствующие или нечетко соответствующие заданной строке поиска или ее части. Найденные слова не обязаны ни полностью совпадать со строкой поиска, ни следовать в порядке расположения слов в строке поиска. Эти два ключевых слова могут применяться различными способами, они обеспечивают разнообразные возможности полнотекстного поиска, рассмотрение которых выходит за рамки нашей книги.
Предложение GROUP BY
Предложение GROUP BY применяется после предложения WHERE и означает, что строки набора результатов должны быть сгруппированы в соответствии с данными в колонке группировки. Если в предложении SELECT используется агрегатная функция, то для каждой группы вычисляется и отображается в выводе итоговое агрегатное значение. Агрегатная функция выполняет вычисления и возвращает значение. (Про агрегатные функции см. раздел "Агрегатные функции" далее.)
Предложение GROUP BY особенно полезно, когда в предложении SELECT имеется агрегатная функция. Давайте рассмотрим пример оператора SELECT, применяющего предложение GROUP BY для получения сведений об общем количестве проданных книг для каждого из названий книг:
SELECT title_id, SUM(qty) FROM sales GROUP BY title_id GO
Будет выдан набор результатов, содержащий 16 строк:
title_id ---------------------- BU1032 15 BU1111 25 BU2075 35 BU7832 15 MC2222 10 MC3021 40 PC1035 30 PC8888 50 PS1372 20 PS2091 108 PS2106 25 PS3333 15 PS7777 25 TC3218 40 TC4203 20 TC7777 20
Этот запрос не содержит предложения WHERE – оно не нужно. Набор результатов состоит из колонки title_id (идентификатор названия книги) и итоговой колонки, не имеющей заголовка. Для каждого отдельного названия книги будет подсчитано общее количество экземпляров этой книги, это число будет показано в итоговой колонке. Например, пусть значение BU1032 колонки title_id встретится в таблице sales (продажи) два раза, первый раз оно будет обозначать продажу 5 экземпляров книги (колонка qty будет иметь значение 5), а во второй раз будет обозначать продажу книг по другому заказу, на этот раз будет продано 10 экземпляров книги. Агрегатная функция SUM произведет суммирование этих двух продаж, отсюда и получится, что общее количество проданных экземпляров равно 15, что и будет показано в итоговой колонке. Если вы хотите, чтобы итоговая колонка имела заголовок, воспользуйтесь ключевым словом AS, вот так:
SELECT title_id, SUM(qty) AS "Колич прод" FROM sales GROUP BY title_id GO
Теперь набор результатов станет показывать заголовок для итоговой колонки (в наборе результатов содержится 16 строк):
itle_id Колич прод ---------------------------- BU1032 15 BU1111 25 BU2075 35 BU7832 15 MC2222 10 MC3021 40 PC1035 30 PC8888 50 PS1372 20 PS2091 108 PS2106 25 PS3333 15 PS7777 25 TC3218 40 TC4203 20 TC7777 20
Возможна вложенная ("гнездовая") группировка, при которой в предложении GROUP BY задается более одной колонки. При вложенной группировке набор результатов будет группироваться по каждой из колонок, участвующих в группировке, в том порядке, в котором были заданы колонки. Например, чтобы узнать средние цены книг, сгруппированных сначала по типу, а затем по издательству, можно выполнить такой запрос:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id GO В набор результатов попадут 8 строк: type pub_id Средняя цена -------------------------------------------------- business 0736 2.99 psychology 0736 11.48 UNDECIDED 0877 NULL mod_cook 0877 11.49 psychology 0877 21.59 trad_cook 0877 15.96 business 1389 17.31 popular_comp 1389 21.48
Обратите внимание, что книги, имеющие тип psychology и business, попали в набор результатов более одного раза, потому что они сгруппированы для разных идентификаторов издательств. Значение NULL, показанное в качестве средней цены книг типа UNDECIDED (нераспределенные), отражает тот факт, что для книг этого типа в таблицу не были введены их цены, поэтому невозможно вычислить среднюю цену.
Предложение GROUP BY можно применять с необязательным ключевым словом ALL, означающим, что в набор результатов должны быть включены все группы, даже не соответствующие условию поиска. Группы, не имеющие строк, соответствующих условию поиска, будут содержать в итоговой колонке значение NULL, поэтому их будет сразу видно. Например, чтобы узнать среднюю цену для книг, имеющих авторские отчисления 12%, а также показать в наборе результатов строки для книг, имеющих авторские отчисления не 12% (у них в итоговой колонке будет значение NULL), группируя книги сначала по типам, а затем по идентификатору издательства, выполните такой запрос:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles WHERE royalty = 12 GROUP BY ALL type, pub_id GO
В набор результатов попадут 8 строк:
type pub_id Средняя цена ------------------------------------------------- business 0736 NULL psychology 0736 10.95 UNDECIDED 0877 NULL mod_cook 0877 19.99 psychology 0877 NULL trad_cook 0877 NULL business 1389 NULL popular_comp 1389 NULL
Будут выведены строки для всех типов книг, но для типов книг, у которых не имеется книг с 12-процентными авторскими отчислениями, появится NULL.
Если мы уберем ключевое слово ALL, то набор результатов будет содержать информацию только для тех типов книг, у которых имеются книги с 12-процентными авторскими отчислениями. Набор результатов будет содержать 2 строки и будет таким:
type pub_id Средняя цена --------------------------------------------------- psychology 0736 10.95 mod_cook 0877 19.99
Предложение GROUP BY часто применяется в сочетании с предложением HAVING, про которое мы сейчас вам расскажем.
Предложение HAVING
Предложение HAVING применяется, чтобы задать условия поиска для групп или для агрегатной функции. Предложение HAVING чаще всего используется после предложения GROUP BY в случаях, когда условие поиска должно проверяться уже после группировки результатов. Если условие поиска можно было бы проверить до группировки, то гораздо эффективней было бы поместить его в предложение WHERE, а не пользоваться предложением HAVING (за счет этого уменьшилось бы количество строк, участвующих в группировке). Если предложение GROUP BY отсутствует, то HAVING может применяться только в отношении агрегатной функции в списке выборки. В этом случае предложение HAVING действует точно так же, как предложение WHERE. Если попытаться использовать HAVING как-нибудь по-другому, то SQL Server выдаст сообщение об ошибке.
Предложение HAVING имеет такой синтаксис:
HAVING <условие_поиска>
Здесь условие_поиска имеет такой же смысл, что и условие поиска. (См. раздел "Предложение WHERE и условие поиска" выше в данной лекции). Единственным различием между предложениями HAVING и WHERE является то, что предложение HAVING может содержать агрегатную функцию в условии поиска, а предложение WHERE – нет.
Ниже приведен пример запроса, использующего предложение HAVING для поиска книг, сгруппированных по типам и по издательствам, средняя цена на которые превышает 15 долларов:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id HAVING AVG(price) > 15.00 GO
В набор результатов попадут 4 строки:
type pub_id Средняя цена -------------------------------------------------- psychology 0877 21.59 trad_cook 0877 15.96 business 1389 17.31 popular_comp 1389 21.48
В предложениях HAVING можно употреблять логические операции. Ниже показан несколько измененный последний пример, в нем теперь применяется логическая операция AND:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id HAVING AVG(price) >= 15.00 AND AVG(price) <= 20.00 GO
В набор результатов попадут 2 строки:
type pub_id Средняя цена -------------------------------------------------- trad_cook 0877 15.96 business 1389 17.31
Такой же результат получится, если вместо AND применить предложение BETWEEN, вот так:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id HAVING AVG(price) BETWEEN 15.00 AND 20.00 GO
Чтобы применять HAVING без предложения GROUP BY, нужно иметь агрегатную функцию в списке выборки и в предложении HAVING. Например, чтобы выводить сумму цен на книги типа mod_cook (современная кулинария), только в тех случаях, когда эта сумма будет превышать 20 долларов, можно применять такой запрос:
SELECT SUM(price) FROM titles WHERE type = "mod_cook" HAVING SUM(price) > 20 GO
Если в этом запросе поместить выражение SUM(price) > 20 в предложение WHERE, то SQL Server выдаст сообщение об ошибке, т.к. в предложениях WHERE агрегатные функции применять нельзя.
Предложение ORDER BY
Предложение ORDER BY применяется, чтобы задать порядок, в котором должны сортироваться строки набора результатов. Пользуясь ключевыми словами ASC и DESC, вы можете задать как возрастающий (ascending, от меньших значений к большим), так и убывающий (descending, от больших значений к меньшим) порядок сортировки. Если порядок сортировки не указать, то по умолчанию будет применяться возрастающий порядок сортировки. В предложении ORDER BY можно задать более одной колонки. Результаты будут сортироваться по первой из заданных колонок, но если в первой колонке встретятся строки с одинаковыми значениями, то они будут сортироваться в порядке возрастания значения из второй колонки, и т.д. Как вы увидите из материала данного раздела, такая сортировка особенно полезна при использовании вместе с предложением GROUP BY. Давайте сначала рассмотрим пример, в котором предложение ORDER BY работает с одной колонкой и сортирует список авторов по фамилии , в возрастающем порядке:
SELECT au_lname, au_fname FROM authors ORDER BY au_lname ASC GO
Набор результатов будет отсортирован в алфавитном порядке по фамилиям авторов. Не забудьте, что чувствительность сортировки к регистру букв, заданная вами при инсталляции SQL Server, повлияет на обработку фамилий вроде "del Castillo".
Если вы хотите отсортировать результаты для более чем одной колонки, то просто добавьте в предложение ORDER BY имена колонок, разделяя их запятыми. Ниже приведен пример запроса, выдающего идентификаторы должностей, фамилии и имена сотрудников, сортирующего вывод сначала по идентификатору должности, затем по фамилии, а затем по имени:
SELECT job_id, lname, fname FROM employee ORDER BY job_id, lname, fname GO
Набор результатов (43 строки) будет выглядеть так:
job_id lname fname ----------------------------------- 2 Cramer Philip 3 Devon Ann 4 Chang Francisco 5 Henriot Paul 5 Hernadez Carlos 5 Labrune Janine 5 Lebihan Laurence 5 Muller Rita 5 Ottlieb Sven 5 Pontes Maria 6 Ashworth Victoria 6 Karttunen Matti 6 Roel Diego 6 Roulet Annette 7 Brown Lesley 7 Ibsen Palle 7 Larsson Maria 7 Nagy Helvetius . . . . . . . . . 13 Accorti Paolo 13 O’Rourke Timothy 13 Schmitt Carine 14 Afonso Pedro 14 Josephs Karin 14 Lincoln Elizabeth
Сортировка по именам (не фамилиям) людей в этом запросе не влияет на набор результатов, потому что там нет даже двух людей с одинаковыми фамилиями и идентификаторами должности.
А теперь давайте рассмотрим предложение ORDER BY, работающее совместно с предложением GROUP BY и агрегатной функцией:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id ORDER BY Средняя цена GO
Набор результатов (8 строк) будет выглядеть так:
type pub_id Средняя цена ------------------------------------------------- UNDECIDED 0877 NULL business 0736 2.99 business 1389 17.31 mod_cook 0877 11.49 popular_comp 1389 21.48 psychology 0736 11.48 psychology 0877 21.59 trad_cook 0877 15.96
Результаты отсортированы в алфавитном порядке (возрастающем) по типу книг. Также обратите внимание, что в этом запросе в предложении GROUP BY должны присутствовать и type, и pub_id, потому что они не являются частью агрегатной функции. Если вы не зададите колонку pub_id в предложении GROUP BY, то SQL Server выдаст сообщение об ошибке (рис. 14.4).
В предложении ORDER BY нельзя применять агрегатные функции и подзапросы. Однако если вы зададите алиас агрегатной функции в предложении SELECT, то его применить можно в предложении ORDER BY, вот так:
SELECT type, pub_id, AVG(price) AS "Средняя цена" FROM titles GROUP BY type, pub_id ORDER BY type GO
увеличить изображение
Рис. 14.4. Сообщение об ошибке, которое появится, если не задать pub_id в предложении GROUP BY
Набор результатов (8 строк) будет выглядеть так:
type pub_id Средняя цена ------------------------------------------------- UNDECIDED 0877 NULL business 0736 2.99 business 1389 17.31 mod_cook 0877 11.49 popular_comp 1389 21.48 psychology 0736 11.48 psychology 0877 21.59 trad_cook 0877 15.96
Теперь результаты будут отсортированы по средней цене, причем NULL рассматривается как самое маленькое из значений, поэтому оно отображается в самой верхней строке списка.
Операция UNION
UNION считается не предложением (clause), а операцией (operator). Она используется для объединения результатов двух или нескольких запросов в один набор результатов. Применяя UNION, вы должны соблюдать два следующих правила:
- все запросы должны иметь одинаковое количество колонок;
- типы данных соответственных колонок из запросов должны быть совместимыми.
Колонки, перечисленные в операторах SELECT, объединенные при помощи UNION, сопоставляются друг с другом следующим образом: первая колонка из первого оператора SELECT будет соответствовать первым колонкам из всех последующих операторов SELECT, вторая колонка будет соответствовать вторым колонкам из всех последующих операторов SELECT, и т.д. Поэтому во всех операторах SELECT, объединенных при помощи UNION, должно быть одинаковое количество колонок, что гарантирует однозначное сопоставление.
Кроме того, соответственные колонки должны иметь совместимые типы данных. Это значит, что соответственные колонки должны иметь либо одинаковые типы данных, либо SQL Server сможет выполнить неявное преобразование одного типа данных в другой. Ниже дан пример применения операции UNION, соединяющей наборы результатов двух операторов SELECT, выдающих колонки city и state из обеих таблиц publishers и stores:
SELECT city, state FROM publishers UNION SELECT city, state FROM stores GO
Набор результатов (14 строк) будет таким:
city state ------------------------- Fremont CA Los Gatos CA Portland OR Remulade WA Seattle WA Tustin CA Chicago IL Dallas TX Munchen NULL Boston MA New York NY Paris NULL Berkeley CA Washington DC
Две эти колонки, city и state, в обеих таблицах имеют одинаковый тип данных (char), поэтому преобразование типа не потребуется. Заголовки колонок для набора результатов операции UNION берутся из первого оператора SELECT. Если вы хотите создать алиас для заголовка, то поместите его в первый оператор SELECT, вот так:
SELECT city AS "Все города", state AS "Все штаты" FROM publishers UNION SELECT city, state FROM stores GO
Набор результатов (14 строк) будет таким:
Все города Все штаты ------------------------------------ Fremont CA Los Gatos CA Portland OR Remulade WA Seattle WA Tustin CA Chicago IL Dallas TX Munchen NULL Boston MA New York NY Paris NULL Berkeley CA Washington DC
При объединении наборов результатов вовсе не обязательно указывать в обоих предложениях SELECT одни и те же колонки. Например, вы можете выбрать колонки city и state из таблицы stores и колонки city и country из таблицы publishers, вот так:
SELECT city, country FROM publishers UNION SELECT city, state FROM stores GO
Набор результатов (14 строк) будет таким:
city country ---------------------------- Fremont CA Los Gatos CA Portland OR Remulade WA Seattle WA Tustin CA New York USA Paris France Boston USA Munchen Germany Washington USA Chicago USA Berkeley USA Dallas USA
В этом наборе результатов верхние шесть строк берутся из набора результатов запроса, применяемого к таблице stores, а последние восемь строк берутся из набора результатов запроса, применяемого к таблице publishers. Колонка state имеет тип данных char, а колонка country имеет тип данных varchar. Так как два этих типа данных являются совместимыми, то SQL Server выполнит неявное преобразование таким образом, чтобы обе колонки стали иметь тип varchar. Колонки итогового набора результатов имеют заголовки city и country, так, как указано в первом операторе SELECT, но здесь было бы лучше, чтобы вторая колонка имела заголовок не country (страна), а State or Country (штат или страна).
Единственное ключевое слово, которое можно применять вместе с UNION – это необязательное ключевое слово ALL. Если вы примените его, то в набор результатов будут включены также все повторяющиеся строки (другими словами, в набор результатов будут включены полностью все строки). Если ключевое слово ALL не применяется, то по умолчанию из набора результатов будут исключены все дублирующиеся строки.
ORDER BY можно применять не в каждом операторе SELECT объединения, а только в самом последнем. Благодаря этому ограничению, итоговый набор результатов будет отсортирован только один раз сразу для всех результатов. С другой стороны, вы можете применять GROUP BY и HAVING в отдельных операторах, так как они влияют только на отдельные наборы результатов, а не на итоговый набор результатов. Ниже приведен пример, иллюстрирующий объединение результатов двух операторов SELECT, каждый из которых имеет предложение GROUP BY:
SELECT type, COUNT(title) AS "Number of Titles" FROM titles GROUP BY type UNION SELECT pub_name, COUNT(titles.title) FROM publishers, titles WHERE publishers.pub_id = titles.pub_id GROUP BY pub_name GO
Набор результатов (9 строк) будет таким:
type Number of Titles ———————————————————— ———————— Algodata Infosystems 6 Binnet & Hardley 7 New Moon Books 5 psychology 5 mod_cook 2 trad_cook 3 popular_comp 3 UNDECIDED 1 business 4
Этот набор результатов показывает, сколько различных названий книг было опубликовано каждым из издателей, публиковавших книги (первые три строки набора результатов) и количество названий книг для каждой из категорий. Каждое из предложений GROUP BY выполняется только на своем подзапросе.
Операцию UNION можно применять и более чем для двух операторов SELECT. Создавая объединение, не забывайте следить, чтобы все колонки и типы данных в запросах были взаимно согласованными.
Функции T-SQL
Теперь, когда вы хорошо знакомы с основными предложениями, применяемыми в операторе SELECT (немного дополнительной информации вы еще узнаете в лекции 20), давайте рассмотрим некоторые функции T-SQL, которые можно применять в предложении SELECT. Эти функции позволяют добиться большей гибкости при создании запросов; они группируются по нескольким категориям, например, относящиеся к таким вещам, как конфигурация, курсор, дата и время, безопасность, система, системная статистика, текст и изображения, математика, набор строк, строки, агрегатные функции. Функции T-SQL выполняют вычисления, преобразования, какие-либо действия, или возвращают некоторую информацию. Имеется много функций, но в этом разделе мы рассмотрим только общеупотребительные агрегатные функции.
Агрегатные функции
Как уже говорилось, агрегатные функции выполняют вычисления над набором значений и возвращают одно значение. Агрегатные функции могут быть заданы в списке выборки и чаще всего применяются в случаях, когда оператор содержит предложение GROUP BY. В некоторых из приведенных ранее примеров использовались агрегатные функции AVG и COUNT. Список имеющихся агрегатных функций перечислен в табл. 14.3.
Функция | Описание |
---|---|
AVG | Возвращает среднее арифметическое для значений выражения; null-значения игнорируются |
COUNT | Возвращает количество элементов в выражении (равное количеству строк) |
COUNT_BIG | То же самое, что и COUNT, но результат имеет тип данных bigint, а не int |
GROUPING | Возвращает специальную дополнительную колонку; применяется, только когда предложение GROUP BY содержит операцию CUBE или ROLLUP. Для дополнительной информации откройте в SQL Server Books Online вкладку Index (Предметный указатель) и откройте тему "GROUPING keyword" |
MAX | Возвращает максимальное значение из значений выражения |
MIN | Возвращает минимальное значение из значений выражения |
STDEV | Возвращает статистическое стандартное отклонение (statistical standard deviation) для всех величин выражения. Эта функция предполагает, что выражения, используемые в расчете, являются образцом всей совокупности данных |
STDEVP | Возвращает статистическое стандартное отклонение для всех величин выражения. Эта функция предполагает, что выражения, используемые в расчете, являются всей совокупностью данных |
SUM | Возвращает сумму всех значений выражения |
VAR | Возвращает статистическое отклонение (statistical variance) для всех значений из выражения. Эта функция предполагает, что выражения, используемые в расчете, являются образцом всей совокупности данных |
VARP | Возвращает статистическое отклонение для всех значений из выражения. Эта функция предполагает, что выражения, используемые в расчете, являются всей совокупностью данных |
Функция COUNT применяется специальным образом: она подсчитывает все строки таблицы. Для этого нужно после COUNT поместить символ-звездочку в скобках, вот так
SELECT COUNT(*) FROM publishers GO
Набор результатов будет таким:
---------------------- 8
Функции AVG, COUNT, MAX, MIN и SUM могут применяться с необязательными ключевыми словами ALL или DISTINCT. Для каждой из этих функций ALL означает, что функция должна применяться ко всем значениям выражения, а DISTINCT означает, что повторяющиеся значения должны участвовать в расчете только по одному разу. По умолчанию применяется опция ALL.
Как правило, применяются понятные названия агрегатных функций. Ниже приведен пример, в котором используются сразу две агрегатные функции MAX и MIN, здесь вычисляется разница цен между самой дорогой и самой дешевой книгами:
SELECT MAX(price) - MIN(price) AS "Разница цен" FROM titles GO
Набор результатов будет таким:
Разница цен ------------------------------ 19.96
В следующем примере функция SUM применяется, чтобы найти общее количество книг заказанных в каждом из магазинов:
SELECT stores.stor_name, SUM(sales.qty) AS "Заказано всего" FROM sales, stores WHERE sales.stor_id = stores.stor_id GROUP BY stor_name GO
Набор результатов (6 строк) будет таким:
stor_name Заказано всего -------------------------------------------------------- Barnum’s 125 Bookbeat 80 Doc-U-Mat: Quality Laundry and Books 130 Eric the Read Books 8 Fricative Bookshop 60 News & Brews 90
Другие применения оператора SELECT
Оператор SELECT применяется в основном для выполнения запросов, извлекающих данные из базы данных. Эти запросы могут быть простыми, а могут быть сложными. Оператор SELECT может применяться также для присваивания значений переменным и для вызова функций.
При помощи оператора SELECT вы можете, исполняя транзакцию или хранимую процедуру, присвоить значение локальной переменной, хотя для этого лучше применять оператор SET. Локальные переменные должны быть обозначены символом @ в начале имени. Например, можно присвоить значение 0 локальной переменной @count при помощи оператора SET, вот так:
SET @count = 0 GO
Вы можете применять оператор SELECT для присваивания локальным переменным значений, получаемых как результат запроса. Например, чтобы присвоить локальной переменной @price значение максимальной величины из имеющихся в колонке price, примените такой оператор:
SELECT @price = MAX(price) FROM items GO
Когда вы присваиваете значение локальной переменной внутри оператора SELECT, то лучше, когда этот оператор возвращает в запросе только одну строку. При выдаче нескольких строк локальная переменная получит значение из последней строки, выданной запросом.
Оператор SELECT можно применять также для вызова функций, например для вызова функции GETDATE, входящей в комплект поставки программного обеспечения. Оператор SELECT, приведенный в следующем примере, выдает текущие дату и время:
SELECT GETDATE() GO
Функция GETDATE не имеет никаких параметров, но скобки нужны все равно.
Заключение
В этой лекции вы изучили оператор SELECT, отдельные предложения, которые могут быть включены в него, научились ими пользоваться, узнали про условия поиска и про функции. Вы изучили материал о логических операциях, о соединениях, об алиасах, о сопоставлении шаблонам, о результатах группировки и сортировки и о многом другом. Мы дали вам большой объем информации, но у оператора SELECT имеется еще много других возможностей. (О дополнительных возможностях см. лекцию 20; там же мы рассмотрим другие операторы манипулирования данными – INSERT, UPDATE и DELETE. А в лекции 15 мы расскажем о том, как можно вносить изменения в таблицы базы данных.)
Лекция 15. Управление таблицами с помощью T-SQL и Enterprise Manager
В лекции 10 вы узнали, как создавать таблицу путем определения ее колонок и типов данных. Создав таблицу, вы можете модифицировать ее различными способами, даже если эта таблица уже содержит данные. В данной лекции описываются некоторые способы модифицирования таблиц, включая изменение, добавление, удаление и переименование колонок, а также удаление всей таблицы. (О создании и модифицировании ограничений ( constraints (*) ) таблицы (метод обеспечения целостности данных), а также триггерах (специальный тип хранимой процедуры, которая автоматически запускается при определенных условиях) см. лекции 16 и 22.)
В данной лекции мы рассмотрим использование Transact-SQL (T-SQL) и Microsoft SQL Server 2000 Enterprise Manager для управления вашими таблицами. Следует помнить, что T-SQL и Enterprise Manager имеют различные уровни гибкости для модифицирования таблицы. Enterprise Manager более полезен в том смысле, что позволяет вам выполнять определенные модификации проще, чем при использовании T-SQL. Enterprise Manager выводит на экран информативные сообщения об ошибках и иногда предлагает альтернативы, если вы пытаетесь выполнить неверную модификацию. Однако T-SQL имеет одно преимущество, состоящее в том, что если вы запускаете команды с записью сценария, то получаете записанную трассировку того, как и в каком порядке выполнялись ваши модификации. В этой лекции мы рассмотрим преимущества и недостатки использования этих двух методов для модифицирования таблиц.
Прежде чем начать изучение, нам нужно создать две таблицы в базе данных MyDB – Bicycle_Sales (Продажи велосипедов) и Bicycle_Inventory (Запасы велосипедов), – которые будут использоваться для примеров этой лекции. Таблица Bicycle_Sales содержит информацию по продажам велосипедов и состоит из следующих колонок: make_id (идентификатор изделия), model_id (идентификатор модели), description (описание), year (год), sale_id (идентификатор продажи), price (цена), quantity (количество) и sale_date (дата продажи). Колонки make_id и model_id указываются вместе как ограничение foreign key (внешний ключ). Это ограничение содержит ссылку на колонки make_id и model_id в таблице Bicycle_Inventory, образуя уникальный кластеризованный индекс. Как вы увидите в лекции 16, ограничение foreign key может содержать ссылку только на колонку первичного ключа (primary key) или другую колонку с уникальным ограничением в ссылочной таблице. (Подробное описание ограничений дается в лекции 16, описание индексов – в лекции 17.)
Колонка sale_id объявлена как кластеризованный индекс по первичному ключу для таблицы Bicycle_Sales. Ниже приводится оператор CREATE TABLE для создания каждой из этих таблиц:
USE MyDB GO CREATE TABLE Bicycle_Inventory ( make_name char(10) NOT NULL, make_id tinyint NOT NULL, model_name char(12) NOT NULL, model_id tinyint NOT NULL, in_stock tinyint NOT NULL, on_order tinyint NULL, CONSTRAINT MI_clu_indx UNIQUE CLUSTERED(make_id, model_id) ) GO CREATE TABLE Bicycle_Sales ( make_id tinyint NOT NULL,--Использована в ограничении --foreign key model_id tinyint NOT NULL,--Также использована в ограничении --foreign key description char(30) NULL, year char(4) NOT NULL, sale_id int NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED, price smallmoney NOT NULL, quantity tinyint NOT NULL, sale_date datetime NOT NULL, CONSTRAINT sales_inventory_fk FOREIGN KEY (make_id, model_id) REFERENCES Bicycle_Inventory(make_id, model_id) ) GO
Теперь, создав наши примеры таблиц базы данных, внесем некоторые изменения, используя сначала T-SQL и затем – Enterprise Manager.
Модифицирование таблицы с помощью T-SQL
В этом разделе вы узнаете, как использовать операторы T-SQL для изменения, добавления, удаления и переименования колонок в существующей таблице. Для осуществления всех модификаций таблицы используется оператор T-SQL ALTER TABLE.
Изменение колонок
Создав таблицу, вы можете изменить для колонки тип данных, точность (для числовых типов) и null-атрибут, а также добавить к колонке свойство ROWGUIDCOL или удалить его из колонки, и все это с помощью оператора ALTER TABLE. Используя другие операторы T-SQL, вы можете выполнять и другие модификации колонок, такие как добавление значения по умолчанию. (Подробно об этих операторах см. лекцию 16.)
Не все колонки можно изменять. В общем случае вы не можете изменять следующие типы колонок.
- Колонка, которая является частью ограничения primary key или foreign key.
- Колонка, используемая в репликации. (О репликации см. лекцию 26.)
- Колонка, имеющая тип данных text, ntext, image или timestamp.
- Расчетная колонка.
- Колонка ROWGUIDCOL (вы можете, однако, добавлять к колонке свойство ROWGUIDCOL или удалять его).
- Колонка, используемая в индексе.
- Колонка, используемая в ограничении check или unique. ( Об ограничениях см. лекцию 16.)
- Колонка, используемая в формировании статистики путем явного выполнения оператора CREATE STATISTICS (формируемые с помощью SQL Server данные статистики удаляются с помощью оператора ALTER TABLE ).
- Колонка, связанная со значением по умолчанию.
Все другие типы колонок можно изменять с помощью оператора ALTER TABLE. В некоторых из предыдущих случаев вы можете снять запрет на изменение колонки. Например, вы можете удалить ограничение foreign key или какое-либо другое ограничение или удалить индекс по колонке, и если к данной колонке не относятся какие-либо другие запреты, то можете затем изменять эту колонку.
Изменение типа данных
Чтобы можно было изменить тип данных какой-либо колонки, для исходного типа данных должно существовать неявное преобразование в новый тип данных. Таблицу допустимых преобразований можно найти под заголовком "CAST and CONVERT (T-SQL)" (Приведение и преобразование [T-SQL]) в Books Online. Для доступа к этой теме найдите "CAST" в Books Online и затем выберите в диалоговом окне Topics Found "CAST and CONVERT (T-SQL)".
Оператор изменения типа данных колонки имеет следующий синтаксис:
ALTER TABLE <имя_таблицы> ALTER COLUMN <имя_колонки> <новый_тип_данных>
Если вы измените для таблицы Bicycle_Sales тип данных datetime колонки sale_date на тип smalldatetime, то строки данных будут занимать меньше места.
Дело в том, что datetime занимает 8 байтов, а smalldatetime – только 4. Чтобы выполнить это изменение, используйте следующий оператор:
ALTER TABLE Bicycle_Sales ALTER COLUMN sale_date smalldatetime NOT NULL GO
Любые существующие данные таблицы будут неявно преобразованы в новый тип данных – smalldatetime. Null -атрибут NOT NULL не изменился.
Чтобы изменить тип данных char(30) колонки description на тип varchar(20) (имеющий меньшую длину), используйте следующий оператор:
ALTER TABLE Bicycle_Sales ALTER COLUMN description varchar(20) NULL GO
Отметим, что исходный тип данных char(30) допускает неявное преобразование в новый тип данных varchar(20), но varchar(20) короче. Поэтому для всех существующих строк будет без оповещения выполнено усечение значений колонки description длиной более 20 символов и преобразование в тип varchar(20).
Изменение null-атрибута
Чтобы изменить null -атрибут, вы можете изменить для колонки атрибут NOT NULL на NULL, за исключением колонок с ограничением primary key. (По определению в таких колонках не допускаются null -значения.) Вы можете изменить атрибут NULL на NOT NULL, только если в строках соответствующей колонки нет null -значений. Если колонка содержит null -значения, то вы можете выполнить оператор UPDATE для замены всех null -значений на некоторое фактическое значение и затем изменить NULL на NOT NULL для этой колонки. Если null -атрибут не указан для измененной колонки, то в этой колонке допускаются null -значения по умолчанию. Рассмотрим некоторые примеры.
Для изменения null -атрибута колонки quantity с тем, чтобы допускались null -значения, выполните следующий оператор:
ALTER TABLE Bicycle_Sales ALTER COLUMN quantity tinyint NULL GO
Тип данных колонки, tinyint, остался без изменений; изменился только null -атрибут. Теперь в колонке quantity будут допускаться null -значения. Если не введено никакого значения, будет происходить автоматическая вставка значения NULL. Это изменение не влияет на значения колонки quantity в существующих строках, но оно позволяет вставлять NULL -значения для новых строк, добавляемых к таблице.
Теперь изменим описание колонки description на NOT NULL. Мы предположим, что в этой колонке уже имеются null -значения. Поэтому сначала мы должны заменить эти null -значения на какое-то фактическое значение – в данном случае – на значение None (Нет), совместимое с типом данной колонки. Чтобы выполнить проверку на значение NULL, надежнее всего не использовать оператор равенства (=), а применять ключевые слова IS NULL или IS NOT NULL. Дело в том, что NULL означает неизвестное значение, а оператор равенства, возможно, не может выполнять сравнение для null -значений (это зависит от установки параметра базы данных ANSI nulls – ON [активизирован] или OFF [отключен]). Если для этого параметра задано значение OFF, то оператор равенства выражение = NULL возвратит значение TRUE, если выражение содержит null -значение. Этот оператор возвратит значение FALSE, если выражение не содержит null -значения. Если для параметра ANSI nulls задано значение ON, то оператор выражение = NULL возвратит для всех сравнений значение UNKNOWN и не будет выдано никаких результатов. SQL Server не возвращает значений NULL, как можно было бы ожидать, если параметр ANSI nulls установлен в значение ON. IS NULL и IS NOT NULL действуют одинаковым образом независимо от установки параметра ANSI_NULLS. Чтобы заменить null -значения колонки description на значение None, используйте следующий оператор UPDATE SET:
UPDATE Bicycle_Sales SET description = "None" WHERE description IS NULL GO
Теперь изменим null -атрибут колонки description на NOT NULL:
ALTER TABLE Bicycle_Sales ALTER COLUMN description char(30) NOT NULL GO
И в данном случае мы изменили только null -атрибут этой колонки, а исходный тип данных char(30) остался без изменений. Вы можете одновременно изменить тип данных и null -атрибут в одном операторе ALTER TABLE, как это показано ниже:
ALTER TABLE Bicycle_Sales ALTER COLUMN description varchar(20) NOT NULL GO
Этот оператор изменяет тип данных и null -атрибут колонки description.
Добавление или удаление свойства ROWGUIDCOL Property
Чтобы добавить к колонке или удалить из колонки свойство ROWGUIDCOL, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ALTER COLUMN <имя_колонки> ADD | DROP ROWGUIDCOL
Свойство ROWGUIDCOL можно добавлять только в колонку типа uniqueidentifier. Если предположить, что в нашу таблицу Bicycle_Sales была включена колонка типа uniqueidentifier с именем unique_id, то вы могли бы добавить свойство ROWGUIDCOL с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id ADD ROWGUIDCOL GO
И вы могли бы удалить это свойство с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id DROP ROWGUIDCOL GO
Добавление колонок
С помощью оператора ALTER TABLE вы можете также добавлять колонки к таблице. Определение колонок происходит почти одинаково – будь то создание или изменение таблицы. Вы должны присвоить колонке имя и тип данных и можете дополнительно присваивать другие атрибуты, свойства и ограничения.
Добавляя колонку с атрибутом NOT NULL, вы должны также объявить значение по умолчанию, чтобы это значение появилось в новой колонке уже существующих строк. Это значение по умолчанию задается с помощью ключевого слова DEFAULT. Чтобы добавить колонку, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ADD <имя_колонки> <тип_данных> <null-атрибут> DEFAULT значение_по_умолчанию
Например, чтобы добавить к таблице Bicycle_Sales колонку с именем salesperson_id (идентификатор продавца), используйте следующий оператор. (В новой колонке не допускаются null -значения, и она имеет значение по умолчанию, равное 0.)
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NOT NULL DEFAULT 0 GO
Поскольку колонка объявлена как NOT NULL, то во всех существующих строках таблицы в новую колонку будет занесено значение 0.
Если вместо этого колонка salesperson_id будет объявлена как NULL (см. ниже), то значение по умолчанию не будет обязательным:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 --Необязательное значение по умолчанию GO
Несмотря на то, что мы задали значение по умолчанию, в колонку salesperson_id существующих строк будет занесено значение NULL, а значение по умолчанию будет присваиваться только в новых строках.
Чтобы в существующих строках вместо значения NULL также было присвоено значение по умолчанию (0), используйте в ключевом слове DEFAULT опцию WITH VALUES, как это показано ниже:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 WITH VALUES GO
Опция WITH VALUES указывает, что во всех существующих строках новой колонке будет присвоено вместо значения NULL значение по умолчанию.
Удаление колонок
Вы можете также использовать оператор ALTER TABLE для удаления колонок из таблицы. Все данные удаленной колонки будут удалены из таблицы. При использовании T-SQL для удаления колонок вы не можете удалять следующие типы колонок.
- Колонка, используемая в ограничении primary key, foreign key, unique или check.
- Колонка, используемая для репликации.
- Колонка, используемая в индексе (если не удалить сначала этот индекс).
- Колонка, ограниченная каким-либо правилом.
- Колонка, связанная со значением по умолчанию.
Для удаления колонки из таблицы используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> DROP COLUMN <имя_колонки>
Следующий оператор удаляет колонку description из таблицы Bicycle_Sales:
ALTER TABLE Bicycle_Sales DROP COLUMN description GO
Колонка description и все ее значения удаляются изо всех строк таблицы.
Переименование колонок
Чтобы переименовать колонку с помощью операторов T-SQL, вы должны запустить системную хранимую процедуру sp_rename, используя следующий синтаксис:
sp_rename 'таблица.исходное_имя_колонки', 'новое_имя_колонки', 'COLUMN'
Например, чтобы заменить имя колонки description на Bicycle_desc, вам нужно использовать следующий оператор:
sp_rename 'Bicycle_Sales.description', 'bicycle_desc', 'COLUMN' GO
Исходное имя колонки должно быть задано в формате таблица.колонка, но имя таблицы не следует включать в имя новой колонки.
Модифицирование таблицы с помощью Enterprise Manager
Как уже говорилось, модифицирование таблицы с помощью Enterprise Manager выполняется проще и дает вам больше функциональных возможностей и гибкости, чем операторы T-SQL. Вы можете выполнять все свои модификации в окне Design Table (Проектирование таблицы) или с помощью схемы (диаграммы) базы данных. Рассмотрим сначала использование окна Design Table. Чтобы открыть окно Design Table для вашей таблицы Bicycle_Sales, выполните следующие шаги:
- Раскройте папку базы данных MyDB в левой панели Enterprise Manager.
- Щелкните на папке Tables (Таблицы), чтобы в правой панели появился список всех таблиц базы данных MyDB (рис. 15.1).
увеличить изображение
Рис. 15.1. Enterprise Manager - Щелкните правой кнопкой мыши на таблице Bicycle_Sales в правой панели. Выберите из контекстного меню пункт Design Table, чтобы появилось окно Design Table (рис. 15.2). В этом окне показана исходная, немодифицированная таблица Bicycle_Sales.
Рис. 15.2. Окно Design Table (Проектирование таблицы)
Изменение колонок
Чтобы изменить колонку в окне Design Table, просто щелкните на соответствующей ячейке или установите нужный флажок в "сетке" и внесите необходимые изменения. Каждая строка в этой сетке представляет колонку таблицы. Заголовки вверху сетки указывают, какое свойство задает каждая ячейка сетки.
Для некоторых ситуаций, когда T-SQL не позволяет выполнить определенные модификации и возвращает сообщение об ошибке, Enterprise Manager предоставляет дополнительные возможности, позволяющие вам правильно осуществить процесс модификаций. Например, если вы попытаетесь с помощью оператора T-SQL ALTER TABLE изменить длину данных колонки, имеющей ограничение primary key или foreign key, то получите сообщение об ошибке, аналогичное следующему сообщению:
Column or parameter #0: Cannot specify a column width on data type int. (Колонка или параметр #0: Невозможно задать ширину колонки по типу данных int.)
Но если вы используете Enterprise Manager, то увидите окно сообщения, в котором можно изменить длину данных для этой колонки.
Например, чтобы изменить тип данных tinyint на тип smallint для колонки make_id (имеющей ограничение foreign key, содержащее ссылку на колонку make_id таблицы Bicycle_Inventory), просто щелкните на tinyint, щелкните на направленной вниз стрелке, чтобы появился раскрывающийся список Data Type (Тип данных) и затем выберите smallint (рис. 15.3).
Рис. 15.3. Изменение типа данных колонки с помощью Enterprise Manager
Поскольку колонка make_id имеет ограничение foreign key, появится диалоговое окно Data Type Change Required (Требуется изменение типа данных) (рис. 15.4). Щелкните на кнопке Yes (Да), чтобы автоматически преобразовать в обеих таблицах тип колонки make_id из tinyint в smallint.
Рис. 15.4. Диалоговое окно Data Type Change Required (Требуется изменение типа данных)
Как и в случае использования T-SQL, при изменении типа данных с помощью Enterprise Manager исходный тип данных должен допускать неявное преобразование в новый тип данных. Если вы попытаетесь выполнить недопустимое преобразование, Enterprise Manager возвратит сообщение об ошибке, аналогичное тому, что отображено на рис. 15.5, где показан результат недопустимого способа изменения типа данных для колонки sale_date из типа datetime в тип text. Щелкните на кнопке OK, чтобы закрыть окно с сообщением об ошибке, и измените недопустимый тип данных на тип, допускающий неявное преобразование.
Рис. 15.5. Сообщение об ошибке, которое выводится после попытки изменения типа данных на тип, не допускающий неявного преобразования
Чтобы сохранить ваши изменения, щелкните на кнопке Save Disk (Сохранение на диске) панели инструментов окна Design Table. Затем в диалоговом окне Save (Сохранение) (рис. 15.6), нужно подтвердить, что указанные таблицы должны быть записаны на диск. Чтобы подтвердить, что вы хотите сохранить ваши изменения, щелкните на кнопке Yes.
Рис. 15.6. Диалоговое окно Save (Сохранить)
Добавление колонок
Чтобы добавить колонку, щелкните на столбце Column Name (Имя колонки) первой пустой строки окна Design Table, введите имя новой колонки, выберите тип ее данных и присвойте ей нужные атрибуты ( Allow Nulls [Разрешить null -значения], Default Value [Значение по умолчанию], Identity и т.д.). Как показано на рис. 15.7, мы добавили колонку с именем salesperson_id с типом данных tinyint, с разрешением использования null -значений и значением по умолчанию 0. Щелкните на кнопке Save Disk, чтобы сохранить ваши изменения. SQL Server добавит к таблице эту новую колонку
Рис. 15.7. Добавление новой колонки с именем salesperson_id
Удаление колонок
Удаление колонки – это простой процесс, если вы работаете с Enterprise Manager. В окне Design Table нужно просто щелкнуть правой кнопкой мыши на имени колонки или любом из ее атрибутов (на любой ячейке строки с именем данной колонки) и выбрать из контекстного меню пункт Delete Column (Удалить колонку). Соответствующая строка будет удалена из таблицы. Не забудьте щелкнуть на кнопке Save Disk, чтобы сохранить ваши изменения.
Enterprise Manager предупредит вас, если вы попытаетесь удалить колонку, которая является частью ограничения или индекса, если колонка содержит значение по умолчанию или имеет связанное с ней правило. Вы увидите окно сообщения (рис. 15.8). После щелчка на кнопке Yes последует удаление данной колонки вместе со всеми ее связями.
Рис. 15.8. Окно сообщения, которое появляется при попытке удаления колонки, имеющей связи с другими колонками и таблицами
Создание и использование схемы базы данных
Вы можете также модифицировать таблицы в Enterprise Manager с помощью схемы базы данных. Чтобы создать схему для базы данных MyDB с двумя таблицами Bicycle_Sales и Bicycle_Inventory, выполните следующие шаги:
- Раскройте MyDB в левой панели Enterprise Manager и затем щелкните правой кнопкой мыши на Diagrams (Схемы). Выберите из контекстного меню пункт Choose New Database Diagram (Выбор новой схемы базы данных), чтобы появилось начальное окно мастера создания схемы базы данных Create Database Diagram Wizard (рис. 15.9).
- Щелкните на кнопке Next (Далее), чтобы появилось окно Select Tables to be Added (Выбор таблиц для добавления) (рис. 15.10). Выделите таблицы, которые хотите включить в вашу схему, в списке Available Tables (Имеющиеся таблицы) и затем щелкните на кнопке Add. В этом примере мы добавили таблицы Bicycle_Inventory и Bicycle_Sales.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Create Database Diagram Wizard (Завершение работы мастера создания схемы базы данных). Щелкните на кнопке Finish (Готово), если выбраны нужные таблицы, или щелкните на кнопке Back (Назад) и внесите необходимые изменения.
- После щелчка на кнопке Finish вы увидите схему базы данных (рис. 15.11).
- Сохраните вашу схему, указав описательное имя (щелкните на кнопке Save Disk и введите имя, когда появится соответствующий запрос).
Рис. 15.9. Начальное окно мастера Create Database Diagram Wizard (Создание схемы базы данных)
Рис. 15.10. Окно Select Tables to be Added (Выбор таблиц для добавления)
Вертикальная линия, которая заканчивается изображением ключа и соединяет две таблицы в вашей схеме, представляет связь между ними, выраженную ограничением foreign key. Чтобы вывести на экран метку этой связи, щелкните правой кнопкой мыши на фоновой части окна и выберите из контекстного меню пункт Show Relationship Labels (Показать метки связей). Появится имя ограничения foreign key (рис. 15.12).
Чтобы выделить какую-либо таблицу, щелкните на ней; чтобы выделить более одной таблицы, щелкните на каждой таблице, удерживая клавишу Ctrl. Если щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню какой-либо пункт, то соответствующая операция будет применена ко всем выделенным таблицам. Например, если выделить в вашей схеме баз данных обе таблицы, щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню пункт Table View, затем Standard, то вид обеих таблиц будет изменен, чтобы представить на экране свойства всех колонок (рис. 15.13).
увеличить изображение
Рис. 15.11. Пример схемы базы данных
увеличить изображение
Рис. 15.12. Просмотр меток связей между таблицами
увеличить изображение
Рис. 15.13. Просмотр свойств по колонкам в схеме базы данных
Представление свойств колонок на экране для каждой таблицы аналогично окну Design Table, и каждую таблицу можно модифицировать с помощью тех же методов, что и в окне Design Table. Просто добавьте или измените данные колонок в нужных ячейках и сохраните ваши изменения, щелкнув на кнопке Save Disk. Вы можете также перемещать таблицы и изменять их размеры в схеме базы данных, выводить на экран различные представления таблиц и выполнять другие действия. Опробуйте различные команды контекстного меню. Отметим, что как только вы вносите какое-либо изменение в таблицу, рядом с именем этой таблицы появляется символ "звездочка", указывающий, что внесены изменения.
Следствия изменения таблицы
Если вы изменили таблицу, то любые необходимые изменения вносятся в существующие строки данных сразу после исполнения оператора T-SQL ALTER TABLE или после сохранения изменений, если вы используете Enterprise Manager. SQL Server налагает блокировку на данную таблицу, чтобы никакие другие пользователи не имели к ней доступа, пока выполняются изменения. Модифицирование, которое требует изменения всех строк в достаточно большой таблице, такое как добавление колонки со свойством NOT NULL и значением по умолчанию или удаление колонки, может занять некоторое время и должно выполняться с осторожностью в периоды минимального пользовательского доступа. Если вы модифицируете колонку путем изменения длины ее данных, точности или масштаба, то соответствующая таблица повторно создается в базе данных и существующие данные преобразуются в новый тип данных.
Все изменения таблиц регистрируются в журнале и могут быть полностью воспроизведены в случае аварии системы или фатальной ошибки во время процесса изменения таблицы. Но если процесс изменения завершен успешно, то для возврата таблицы к ее исходному сохранению потребуется восстановление с резервной копии. (О резервном копировании и восстановлении базы данных см. лекции 32 и 33.)
Удаление таблицы
Если вы удаляете таблицу, то удаляется все, что связано с этой таблицей: определения и данные таблицы, индексы, ограничения, триггеры и полномочия доступа. Представления и хранимые процедуры, содержащие ссылки на удаляемую таблицу, должны быть удалены явным образом. Таблицу нельзя удалить, если на нее есть ссылка с помощью ограничения foreign key в другой таблице; иными словами, таблицу нельзя удалить, если от нее зависит другая таблица. Прежде чем удалить данную таблицу, следует сначала удалить это ограничение или ссылающуюся таблицу. С другой стороны, таблицу, содержащую ограничение foreign key, можно удалить, если от нее не зависит никакая другая таблица. В этом разделе мы рассмотрим удаление таблицы с помощью T-SQL и Enterprise Manager.
Использование T-SQL для удаления таблицы
Оператор T-SQL, используемый для удаления таблицы, имеет следующий синтаксис:
DROP TABLE <имя_таблицы>
Для удаления представлений или хранимых процедур, которые ссылаются на удаляемую таблицу, используйте оператор DROP VIEW или DROP PROCEDURE. Вы можете удалять представления и хранимые процедуры до или после удаления этой таблицы. После удаления таблицы ее уже нельзя прочитать: вы должны для этого снова создать всю таблицу, ее данные и все остальное.
Для удаления таблицы Bicycle_Inventory, на которую имеется ссылка из таблицы Bicycle_Sales с помощью ограничения foreign key, мы должны сначала удалить это ограничение foreign key (с именем sales_inventory_fk ) и затем удалить таблицу, как это показано ниже:
ALTER TABLE Bicycle_Sales DROP CONSTRAINT sales_inventory_fk GO DROP TABLE Bicycle_Inventory GO
Если вы попытаетесь удалить таблицу до удаления ограничения foreign key, то получите сообщение об ошибке и таблица не будет удалена.
Использование Enterprise Manager для удаления таблицы
В Enterprise Manager имеется два метода удаления таблицы: использование диалогового окна Drop Objects (Удаление объектов) или использование схемы базы данных. Диалоговое окно Drop Objects наиболее подходит, если вы удаляете таблицу, от которой не зависят никакие другие таблицы. Чтобы использовать этот метод, выполните следующие шаги:
- В левой панели Enterprise Manager раскройте базу данных, содержащую таблицу, которую вы хотите удалить, и щелкните на папке Tables; затем в правой панели щелкните правой кнопкой мыши на имени таблицы, которую хотите удалить.
- Выберите из контекстного меню пункт Delete (Удалить), чтобы появилось диалоговое окно Drop Objects (рис. 15.14).
Рис. 15.14. Диалоговое окно Drop Objects (Удаление объектов) - Если данная таблица имеет какие-либо зависимые таблицы, щелкните на кнопке Show Dependencies (Показать зависимости), чтобы появилось диалоговое окно Dependencies (рис. 15.15). Любые таблицы, зависящие от данной таблицы, появятся в левом списке этого диалогового окна. Если имеются какие-либо зависимые таблицы, то вы не можете удалить данную таблицу, пока не будут удалены соответствующие зависимости.
- Если никакие другие таблицы не зависят от выбранной таблицы, то вы можете удалить эту таблицу, щелкнув на кнопке Drop All (Удалить все) в диалоговом окне Drop Objects.
Рис. 15.15. Диалоговое окно Dependencies для таблицы Bicycle_Sales
Чтобы удалить таблицу, которая имеет зависимые таблицы, мы будем использовать второй метод: схему базы данных. В этом примере мы удалим таблицу Bicycle_Inventory, на которую имеется ссылка с помощью ограничения foreign key в таблице Bicycle_Sales. Это удаление не удалось бы выполнить, если бы мы использовали диалоговое окно Drop Objects. Но, используя схему базы данных, где показаны обе таблицы, мы можем удалить любую таблицу, а ограничение foreign key будет удалено автоматически. Для удаления таблицы Bicycle_Inventory выполните следующие шаги:
- Откройте схему базы данных в Enterprise Manager, раскрыв базу данных, которую хотите использовать, щелкнув на Diagrams и затем дважды щелкнув на имени подходящей схемы в правой панели. Выделите имя таблицы, которую хотите удалить (в данном случае – Bicycle_Inventory).
- Щелкните правой кнопкой мыши в любом месте этой таблицы и выберите из контекстного меню пункт Delete Table From Database (Удалить таблицу из базы данных). При появлении окна, где нужно подтвердить, что вы хотите удалить данную таблицу из базы данных, щелкните на кнопке Yes. Таблица и ограничение foreign key будут удалены из схемы.
- Если вы уверены, что хотите окончательно удалить эту таблицу, сохраните свои изменения, щелкнув на кнопке Save Disk. После этого таблица будет удалена из базы данных. Если вы отказались от своего решения удалить таблицу, просто выйдите из окна Edit Diagram (Редактирование схемы) без сохранения изменений, щелкнув на кнопке Close (Закрыть). Если вы затем повторно откроете схему базы данных, исходные таблицы будут на прежнем месте. Никакие изменения не начнут действовать, пока вы не сохраните свою работу.
Заключение
В этой лекции вы узнали, как использовать T-SQL и Enterprise Manager для модифицирования таблиц базы данных путем изменения, удаления, добавления и переименования колонок. В процессе изложения материала были показаны некоторые отличия между функциональными возможностями T-SQL и Enterprise Manager. Вы также узнали, как создается схема базы данных с помощью мастера Create Database Diagram Wizard и как происходит удаление таблицы и всех ее данных из базы данных. В таблицу можно вносить другие типы модификаций, включая изменение, добавление и удаление ограничений и умолчаний. (О модификациях см. лекцию 16.)
Лекция 16. Создание и использование умолчаний, ограничений и правил
Умолчания, ограничения и правила – это необязательные атрибуты, которые можно определять по колонкам и таблицам базы данных. В лекции 15 вы ознакомились с умолчаниями, когда описывалось добавление к таблице колонки со значением по умолчанию с помощью оператора ALTER TABLE. В этой лекции вы узнаете о двух методах создания и модифицирования умолчаний. Напоминаем, что умолчания (значения по умолчанию *) – это значения, которые заносятся в определенную колонку, когда не указано явно никакого значения. Ограничения (constraints)** используются как способ идентифицирования допустимых значений для колонки (чтобы отклонять недопустимые значения) а также как средство обеспечения целостности данных в таблицах базы данных и между связанными таблицами. Мы рассмотрим в этой лекции пять типов ограничений; вы также узнаете, как создавать и модифицировать умолчания и ограничения с помощью Transact-SQL (T-SQL) и Microsoft SQL Server Enterprise Manager, хотя использование Enterprise Manager часто оказывается проще.
Умолчания
Сначала рассмотрим причину, по которой вам может потребоваться использование умолчаний для определенных колонок таблицы; для этого мы посмотрим, что происходит, если вы не задали значение по умолчанию. Если в таблицу вводится строка, содержащая колонки без значений по умолчанию, и не во все колонки, допускающие null -значения, введены конкретные данные, то этим колонкам присваивается значение NULL. Но если колонка определена с атрибутом NOT NULL и вы не ввели какое-либо значение в эту колонку при вводе строки, то будет возвращено сообщение об ошибке, информирующее, что в эту колонку нельзя поместить значение NULL. Именно в этом случае удобно применять умолчания. Умолчания можно использовать, чтобы указывать определенное значение, которое будет помещено вместо значения NULL, и тогда вы не получите сообщения об ошибке. Вам следует использовать умолчания для колонок таблицы вместо разрешения использовать null -значения, поскольку операции по таким колонкам создают более высокую дополнительную нагрузку на систему, чем операции по колонкам, в которых не допускаются null -значения.
Microsoft SQL Server 2000 позволяет вам определять значение по умолчанию для каждой колонки таблицы. Вы не можете задать умолчание для колонок, имеющих тип данных timestamp или обладающих свойством IDENTITY или ROWGUIDCOL, поскольку эти колонки должны иметь уникальные значения. Колонки этого типа несовместимы со значениями по умолчанию, поскольку применение такого значения к колонке более одного раза приводило бы к тому, что колонка уже не имела бы уникальных значений. Вы можете присваивать только одно значение по умолчанию, и оно будет автоматически использоваться каждый раз, когда это требуется. И еще одно важное замечание относительно умолчаний: значение, задаваемое по умолчанию, должно быть совместимо с типом данных соответствующей колонки.
Значение по умолчанию можно создавать и модифицировать несколькими способами. В этом разделе мы рассмотрим, как определять значение по умолчанию при создании таблицы и как модифицировать колонку, чтобы добавлять или изменять умолчание, сначала – с помощью T-SQL и затем – с помощью Enterprise Manager. Напомним, что в лекции 15 мы рассматривали добавление колонок со значением по умолчанию и влияние этого значения на существующие строки. Вы увидите здесь менее подробный пример такой вставки. Мы также рассмотрим возможности и влияние вставки значения по умолчанию в существующую колонку таблицы.
Определение и модифицирование умолчаний с помощью T-SQL
Вы можете определять значение по умолчанию для колонки посредством одного из трех операторов T-SQL: CREATE TABLE, ALTER TABLE или CREATE DEFAULT. Оператор CREATE DEFAULT, который используется в SQL Server 2000 для совместимости с предыдущими версиями, создает объект типа Default (Default-объект). Если вы используете данный метод, SQL Server сохраняет этот объект отдельно от таблицы, поэтому вы должны выполнять привязку этого объекта к колонке или колонкам с помощью системной хранимой процедуры sp_bindefault. Если вы удаляете таблицу, определение DEFAULT автоматически теряет связь с этой таблицей, но сам Default -объект остается. Но если вы используете метод CREATE TABLE или ALTER TABLE, то SQL Server сохраняет определение DEFAULT вместе с таблицей и при удалении таблицы происходит автоматическое удаление этого умолчания без необходимости выполнения дополнительных шагов. По этой причине обычно рекомендуют не использовать оператор CREATE DEFAULT. Однако использование Default -объекта может оказаться полезным, если одно значение по умолчанию будет использоваться для нескольких колонок.
Для запуска ваших операторов T-SQL вам следует использовать анализатор запросов SQL Query Analyzer, поскольку результаты будут появляться в виде графического пользовательского интерфейса (GUI), что проще для чтения, чем при запуске операторов в окне командной строки.
Оператор CREATE TABLE с атрибутом DEFAULT
Создание умолчания для колонки с помощью оператора CREATE TABLE является предпочтительным, стандартным методом. Следующий оператор создает в базе данных MyDB таблицу, содержащую умолчания для обеих колонок, – columnA (типа char) и columnB (типа int):
USE MyDB CREATE TABLE MyTable ( columnA char(15) NULL DEFAULT 'n/a', columnB int NULL DEFAULT 0 ) GO
Значение по умолчанию n/a (сокращение от not applicable – неприменимо) для колонки columnA совместимо с типом данных char этой колонки, и значение по умолчанию 0 для колонки columnB совместимо с типом данных int . Если при вставке новой строки в таблицу не указывается конкретное значение для одной или обеих колонок, то используется соответствующее значение по умолчанию. Поэтому единственным способом присваивания этим колонкам значения NULL является явная вставка NULL. Null -значения допустимы, поскольку для обеих колонок указан атрибут NULL. Если бы колонки были определены как NOT NULL, то вы не могли бы выполнять явную вставку значения NULL.
Оператор ALTER TABLE с атрибутом DEFAULT
Чтобы изменить определение DEFAULT для колонки или добавить это определение к колонке, вы можете использовать оператор ALTER TABLE. Если значение по умолчанию уже определено и вам нужно изменить его с помощью этой команды, то вы должны сначала удалить существующее умолчание, указав его имя, и затем добавить новое умолчание. (При использовании Enterprise Manager вам не придется выполнять этот шаг, и это поможет вам понять, что использование Enterprise Manager является более простым методом. Изменив таблицу с помощью Enterprise Manager, вы можете также в любой момент генерировать сценарии для повторного создания таблицы.)
Предположим, что вы не хотите изменять существующее умолчание. Если вы создали умолчание с помощью оператора CREATE TABLE или с помощью Enterprise Manager (что будет описано ниже в этой лекции), но не присвоили имя самому умолчанию, то SQL Server присвоит имя автоматически. Чтобы выяснить, какое имя было присвоено умолчанию (имя используется для удаления умолчания с помощью T-SQL), вы можете запустить хранимую процедуру sp_help, указав имя таблицы, для которой задано это умолчание, как в следующем примере:
USE MyDB GO sp_help MyTable GO
Имена всех ограничений default по таблице MyTable появятся в конце выводимых результатов в столбце под заголовком constraint_name (имя_ограничения) (рис. 16.1).
Предположим, что вы хотите изменить для колонки columnA значение по умолчанию n/a на значение not applicable. Напомним, что мы должны сначала удалить существующее умолчание и затем добавить новое. Чтобы удалить умолчание, используйте следующий оператор:
ALTER TABLE MyTable DROP CONSTRAINT DF__MyTable__columnA__1920BF5CGO
С помощью следующего оператора мы можем теперь добавить новое умолчание, присвоив ему на этот раз имя:
ALTER TABLE MyTable ADD CONSTRAINT DF_MyTable_columnA DEFAULT 'not applicable' FOR columnA GO
Если вы изменяете существующее умолчание по какой-либо колонке, для всех существующих строк в этой колонке остаются прежние значения, даже если это значение NULL. Новое значение по умолчанию будет использоваться только для новых строк.
увеличить изображение
Рис. 16.1. Результаты работы хранимой процедуры sp_help
ALTER TABLE MyTable ADD columnC tinyint NOT NULL DEFAULT 13 GO
Теперь таблица MyTable содержит еще одну колонку, columnC, которая имеет значение по умолчанию 13. Поскольку columnC – новая колонка, определенная с атрибутом NOT NULL, этой колонке в уже существующих строках таблицы будет присвоено значение по умолчанию 13.
Если бы в новой колонке было разрешено использование значений NULL, то все существующие строки получили бы в новой колонке значение NULL. Если нужно, чтобы этой колонке было присвоено значение по умолчанию (вместо NULL), то в предложении DEFAULT нужно использовать параметр WITH VALUES, как это показано ниже:
ALTER TABLE MyTable ADD columnC tinyint NULL DEFAULT 13 WITH VALUES GO
При использовании WITH VALUES новой колонке во всех существующих строках таблицы MyTable будет присвоено значение 13 (вместо значения NULL ).
Теперь, когда вы знаете, как создавать определение DEFAULT, которое сохраняется вместе с таблицей, рассмотрим использование оператора CREATE DEFAULT. С помощью этого метода создается Default -объект, который хранится отдельно от таблицы.
Оператор CREATE DEFAULT и процедура sp_bindefault
Вы можете также добавить умолчание к существующей колонке или изменить умолчание по колонке, создав сначала Default-объект с помощью оператора T-SQL CREATE DEFAULT. Создав Default-объект, вы можете затем связать его с колонкой или с определенным пользователем типом данных, используя системную хранимую процедуру sp_bindefault. Как уже говорилось, этот метод остался в SQL Server 2000 только для обратной совместимости; он не является предпочтительным методом, но может оказаться полезным, если вы будете использовать одно значение по умолчанию для колонок нескольких таблиц.
Рассмотрим пример использования оператора CREATE DEFAULT для создания Default-объекта с именем DF_not_applicable и значением n/a. Это умолчание будет создано в базе данных MyDB и затем будет связано с колонкой columnA таблицы MyTable (в предположении, что для этой таблицы не существует никаких умолчаний). Оператор CREATE DEFAULT имеет следующий синтаксис:
CREATE DEFAULT имя_умолчания AS выражение-константа Процедура sp_bindefault имеет следующий синтаксис: sp_bindefault 'имя_умолчания', таблица.колонка | определенный_пользователем_тип_данных [, futureonly]
Параметр имя_умолчания – это имя Default-объекта. Параметр таблица.колонка указывает колонку, которой вы хотите присваивать это умолчание.
С помощью следующих операторов T-SQL создается Default-объект и происходит его привязка к колонке columnA таблицы MyTable:
USE MyDB GO CREATE DEFAULT DF_not_applicable AS 'n/a' GO sp_bindefault 'DF_not_applicable', 'MyTable.columnA' GO
Если для колонки columnA уже задано значение по умолчанию, то SQL Server возвратит сообщение об ошибке, информирующее вас, что вы не можете выполнить привязку умолчания к колонке, для которой уже задано какое-либо умолчание. Удалите сначала это умолчание и затем выполните привязку нового умолчания к данной колонке. (Процесс использования оператора DROP DEFAULT для удаления Default-объекта описывается ниже в этом разделе.)
Вы можете также создать Default-объект и выполнить его привязку непосредственно к определенному пользователем типу данных. Любая колонка, которой присваивается этот конкретный тип данных, наследует данное умолчание автоматически. Вы можете использовать при обращении к процедуре sp_bindefault необязательный параметр futureonly, когда выполняете привязку Default-объекта к определенному пользователем типу данных. Этот параметр препятствует тому, чтобы существующие колонки, имеющие этот определенный пользователем тип данных, наследовали новое умолчание; тем самым только новые колонки с этим типом данных будут наследовать это умолчание. Если параметр futureonly не указан, то SQL Server выполнит привязку ко всем существующим и вновь создаваемым колонкам, имеющим определенный пользователем тип данных.
Например, создадим определенный пользователем тип данных с именем area_code (код_района) и Default-объект с именем DF_area_code и значением 786; тем самым будет выполнена привязка этого умолчания к определенному пользователем типу данных. (О создании определенных пользователем типов данных см. лекцию 10.) Это новый определенный пользователем тип данных, т.е. еще нет колонок с этим типом данных, поэтому параметр futureonly не требуется. Тем не менее мы включим его, чтобы показать его синтаксис, хотя это не окажет никакого влияния. Ниже показаны соответствующие операторы:
sp_addtype 'area_code', 'char(3)', 'NOT NULL' GO CREATE DEFAULT DF_area_code AS 786 GO sp_bindefault 'DF_area_code', 'area_code', 'futureonly' GO
Чтобы увидеть на экране этот тип данных и присвоенное ему значение по умолчанию, используйте системную хранимую процедуру sp_help (рис. 16.2).
увеличить изображение
Рис. 16.2. Результаты Query Analyzer для процедуры sp_help
Процедура sp_unbindefault
Чтобы аннулировать привязку Default-объекта к колонке или определенному пользователем типу данных, используйте процедуру sp_unbindefault, указав имя таблицы и имя колонки или имя определенного пользователем типа данных. Например, для аннулирования привязки Default-объекта DF_not_applicable к колонке columnA таблицы MyTable используйте следующий оператор:
sp_unbindefault 'MyTable.columnA' GO
Для аннулирования привязки умолчания к определенному пользователем типу данных area_code используйте следующий оператор:
sp_unbindefault 'area_code' GO
После этого все колонки, которым был присвоен определенный пользователем тип данных area_code, уже не обладают свойством использования умолчания.
Вы можете выполнить привязку Default-объекта к более чем одной колонке с помощью отдельных операторов sp_bindefault. Кроме того, отменив привязку умолчания к колонке, вы можете снова выполнить его привязку, пока не удалили сам Default-объект. Чтобы удалить Default-объект, используйте оператор DROP DEFAULT, как это показано ниже:
DROP DEFAULT DF_area_code GO
После удаления Default-объекта он уже недоступен. Если вам нужно использовать его снова, вы должны применить оператор CREATE DEFAULT для повторного создания этого объекта.
Определение и модифицирование умолчаний с помощью Enterprise Manager
Как вы уже видели в лекции 15, использование Enterprise Manager – это, видимо, наиболее простой способ создания, просмотра и модифицирования таблиц вашей базы данных. При создании или модифицировании таблицы или колонки с помощью Enterprise Manager система SQL Server автоматически берет на себя исполнение соответствующих команд T-SQL, выполняя эту работу за вас. (Пошаговые инструкции по созданию таблицы с помощью Enterprise Manager см. в лекции 10.) В этом разделе мы рассмотрим особенности использования Enterprise Manager для присваивания и модифицирования умолчания по колонке и создания Default-объекта. Это предпочтительный метод работы. Начнем с примеров присваивания и модифицирования умолчаний.
Присваивание и модифицирование умолчаний
Предположим, у нас имеется таблица с именем Product_Info в базе данных MyDB (рис. 16.3). (Инструкции по созданию этой таблицы с помощью Enterprise Manager см. в лекции 10.)
Чтобы определить умолчание, просто щелкните на имени колонки, которой хотите присвоить это умолчание, и введите значение по умолчанию в поле Default Value (Значение по умолчанию) вкладки Columns (Колонки) внизу окна. На рис. 16.3 колонке Description (Описание) присвоено значение по умолчанию "n/a"; это может быть значение-заполнитель, указывающее, что описание продукта еще не известно. Кроме того, значение по умолчанию заключено в круглые скобки – Enterprise Manager добавляет их автоматически, когда вы сохраняете таблицу.
Изменение значения по умолчанию происходит столь же просто. Замените исходное значение по умолчанию новым значением по умолчанию и сохраните свою работу, щелкнув на кнопке Save (Сохранить). На рис. 16.4 показано, что значение по умолчанию колонки Description изменено на "not available"; на рис. 16.5 показано умолчание "general merchandise" (обычные товары), добавленное к колонке Product_Name (Имя_продукта).
увеличить изображение
Рис. 16.3. Окно Design Table (Разработка таблицы) для таблицы Product_Info
Когда вы создаете или изменяете умолчание для существующей колонки с помощью Enterprise Manager, то, как и при использовании T-SQL, это не влияет на существующие строки таблицы: новое значение по умолчанию используется только при вставке новых строк. Если вы добавляете к таблице новую колонку и присваиваете ей значение по умолчанию, то в существующих строках данных этой колонке присваивается значение по умолчанию только в том случае, если не разрешено использование значений NULL. В противном случае эта новая колонка получит в существующих строках значение NULL. Чтобы разрешить использование значений NULL для новой колонки со вставкой значения по умолчанию в эту колонку для всех существующих строк, используйте метод, описанный в разделе "Оператор ALTER TABLE с атрибутом DEFAULT" выше в этой лекции.
увеличить изображение
Рис. 16.4. Окно Design Table, где показано измененное значение по умолчанию
увеличить изображение
Рис. 16.5. Окно Design Table, где показано добавленное значение по умолчанию
Создание Default-объектов и управление этими объектами
Вы можете также создавать Default-объект и просматривать существующие Default-объекты с помощью Enterprise Manager. Для просмотра существующих Default-объектов откройте Enterprise Manager, раскройте сервер и базу данных, которые хотите использовать, и щелкните на папке Defaults. Все существующие Default-объекты появятся в правой панели (рис. 16.6). Отметим, что показаны умолчания DF_not_applicable и DF_area_code, которые мы создали выше в этой лекции с помощью оператора CREATE DEFAULT.
увеличить изображение
Рис. 16.6. Просмотр существующих Default-объектов
Чтобы создать новый Default-объект и выполнить привязку этого умолчания к колонке или определенному пользователем типу данных с помощью Enterprise Manager, выполните следующие шаги.
- Раскройте сервер и базу данных, щелкните правой кнопкой мыши на Defaults и выберите из контекстного меню пункт New Default (Создать умолчание), чтобы появилось окно Default Properties (Свойства умолчания) (рис. 16.7). Мы присвоим Default-объекту имя DF_none и значение "none". По окончании щелкните на кнопке OK.
- Для привязки вашего умолчания к определенному пользователем типу данных или к колонке щелкните правой кнопкой мыши в правой панели Enterprise Manager на имени этого умолчания (в данном случае – DF_none ) и выберите из контекстного меню пункт Properties (Свойства). Снова появится окно Default Properties, но теперь будут доступны кнопки Bind UDTs (Привязка к определенным пользователем типам) и Bind Columns (Привязка к колонкам).
Рис. 16.7. Окно Default Properties (Свойства умолчания)Щелкните на кнопке Bind UDTs, чтобы появилось диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных) (рис. 16.8). В этом диалоговом окне представлены все определенные пользователем типы данных. В этом списке вы можете выбрать определенный пользователем тип данных, к которому нужно выполнить привязку умолчания. На рис. 16.8 мы видим типы данных area_code и brand_type. Если вы определили другие типы данных, то они также появятся в вашем списке. По окончании щелкните на кнопке Apply (Применить) и затем – на кнопке OK, чтобы вернуться в окно Default Properties. Мы не будем выполнять привязку нашего умолчания к какому-либо определенному пользователем типу данных; мы выполним вместо этого привязку к колонке, как показано на следующем шаге.
Рис. 16.8. Диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных) - Для привязки умолчания к колонке щелкните на пункте Bind Columns (Привязка к колонкам), чтобы появилось диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам). Теперь выберите колонку, с которой хотите связать данное умолчание. Сначала выберите имя таблицы в раскрывающемся списке Table (Таблица). Затем в списке Unbound Columns (Колонки без привязки) выберите имя колонки, с которой хотите связать умолчание. Затем щелкните на кнопке Add (Добавить). На рис. 16.9 показано это диалоговое окно после добавления колонки phone таблицы customer_data к списку Bound Columns (Колонки с привязкой).
Рис. 16.9. Диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам)) - Щелкните на кнопке OK, чтобы вернуться в окно Default Properties, и щелкните на кнопке OK еще раз, чтобы закрыть окно Default Properties.
Чтобы отменить привязку Default-объект а к определенному пользователем типу в окне Default Properties, откройте диалоговое окно Bind Default to User-defined Data Types, как это описано выше, и просто сбросьте флажок Bind. Чтобы отменить привязку Default-объект а к колонке, откройте диалоговое окно Bind Default to Columns, выделите имя этой колонки и затем щелкните на кнопке Remove (Удалить).
Чтобы удалить Default-объект, вы должны сначала отменить привязку этого умолчания ко всем другим объектам (как только что было описано). SQL Server возвратит сообщение об ошибке, если вы попытаетесь удалить умолчание, которое привязано к одному или нескольким объектам. Для удаления Default-объект а щелкните на папке Defaults в левой панели Enterprise Manager, щелкните правой кнопкой мыши на имени этого Default-объект а, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All (Удалить все) в появившемся диалоговом окне Drop Objects (Удаление объектов).
Ограничения
Ограничения автоматически обеспечивают целостность данных. Ограничения задают правила, которые определяют значения данных, допустимые для какой-либо колонки. Они позволяют ограничивать значения данных, которые вводятся в колонку, чтобы в этой колонке не оказались неверные значения. Например, с помощью ограничения вы можете ограничить значения колонки целого типа диапазоном от 1 до 100. В результате любые значения вне этого диапазона нельзя будет ввести в данную колонку. (Для создания этого диапазона вы можете использовать ограничение CHECK, как будет показано ниже.) Ограничение только по одной колонке называется ограничением колонки ; оно ограничивает значения только этой колонки. Ограничение, которое влияет на несколько колонок, называется ограничением таблицы, или табличным ограничением; в этом случае комбинация значений для колонок, указанных в данном ограничении, должна отвечать требованиям этого ограничения. Имеется пять типов ограничений: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и CHECK.
Создание и модифицирование ограничений с помощью T-SQL
В этом разделе вы узнаете об использовании каждого типа ограничений и реализации ограничений с помощью T-SQL. В следующем разделе вы узнаете, как реализовывать ограничения с помощью Enterprise Manager.
Ограничение NOT NULL
Ограничение NOT NULL является довольно простым, и мы уже видели, как оно использовалось в примерах этой лекции и предыдущих лекций. Ограничение NOT NULL задается в описании колонки, чтобы воспрепятствовать вставке null -значений в эту колонку (в противоположность ограничению NULL, которое разрешает присваивать null -значения). При использовании T-SQL вы можете указать NOT NULL при создании таблицы или позже, когда будете модифицировать какую-либо колонку. (О модифицировании таблиц базы данных см. лекцию 10.) Вам следует использовать NOT NULL вместо NULL там, где это возможно, поскольку операции с null -значениями, такие как сравнения, сопряжены с большей дополнительной нагрузкой при обработке. Как уже говорилось выше в этой лекции, лучше использовать значение по умолчанию там, где это возможно, чем разрешать вставку null -значений.
Ограничение UNIQUE
Ограничение UNIQUE обеспечивает, что в колонке или наборе колонок не будут допускаться дублированные значения; иными словами, обеспечивается уникальность значений в этой колонке или наборе колонок. Для поддержки этой уникальности SQL Server создает по умолчанию уникальный некластеризованный индекс по колонке или колонкам, указанным в ограничении UNIQUE. Вы можете, однако, указывать, каким должен быть этот индекс – кластеризованным или некластеризованным. Напомним, что таблица может иметь только один кластеризованный индекс.
Ограничение UNIQUE можно использовать для любой колонки, которая не является частью ограничения PRIMARY KEY (описывается в следующем разделе), которое также обеспечивает уникальность значений. Ограничение UNIQUE можно использовать для колонок, в которых разрешены null -значения, в то время как ограничения PRIMARY KEY нельзя использовать для таких колонок. Null -значения не затрагиваются ограничениями UNIQUE. На колонку с ограничением UNIQUE может ссылаться ограничение FOREIGN KEY (см. раздел "Ограничение FOREIGN KEY" далее). По одной таблице можно задавать несколько ограничений UNIQUE, пока общее число индексов для этой таблицы не превышает 249 некластеризованных и одного кластеризованного индекса.
Чтобы создать ограничение UNIQUE по таблице с помощью T-SQL, используйте оператор CREATE TABLE или ALTER TABLE. Например, следующий оператор создает таблицу customer (покупатель) с ограничением UNIQUE по колонке SSN в виде кластеризованного индекса:
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11) NOT NULL UNIQUE CLUSTERED, cust_phone char(10) NULL ) GO
В этом операторе CREATE использовано ограничение по колонке. В следующем примере снова создается таблица, но на этот раз с добавлением табличного ограничения UNIQUE с именем UQ_full_name по колонкам first_name, mid_init и last_name:
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11) NOT NULL UNIQUE CLUSTERED, cust_phone char(10) NULL, CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name, mid_init, last_name) ) GO
Табличное ограничение UNIQUE (ограничение по более чем одной колонке) обеспечивает уникальность комбинаций значений по соответствующим колонкам. В данном случае в базу данных нельзя ввести двух покупателей, имеющих одинаковое сочетание имени (first_name), фамилии (last_name) и инициала отчества (mid_init). В одной или двух колонках может встретиться одинаковая комбинация, но не во всех трех колонках. Отметим, что в данном случае табличное ограничение UNIQUE является некластеризованным индексом, поскольку у нас уже имеется уникальный кластеризованный индекс по колонке SSN.
Чтобы добавить ограничение UNIQUE к существующей таблице, используйте оператор ALTER TABLE. Если вы пытаетесь модифицировать существующую колонку или колонки, добавляя ограничение UNIQUE, все существующие строки данной таблицы должны содержать уникальные значения или null -значения в этой колонке или колонках, иначе вы получите сообщение об ошибке и ограничение UNIQUE не будет добавлено. Предположим, что мы создали таблицу customer без каких-либо ограничений. Ниже приводятся два оператора для добавления ограничений по колонке и по таблице:
ALTER TABLE customer ADD CONSTRAINT UQ_ssn UNIQUE CLUSTERED (SSN) GO ALTER TABLE customer ADD CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name, mid_init, last_name) GO
И снова повторим, что вы можете добавить ограничения к таблице только в том случае, если существующие данные уже отвечают требованиям ограничений.
Чтобы изменить существующее ограничение UNIQUE по какой-либо колонке или таблице с помощью T-SQL, вы должны сначала удалить соответствующее ограничение и затем снова создать его. Как и для умолчаний, вам следует использовать для ваших ограничений описательные имена, чтобы вы могли легко находить и удалять их без необходимости выяснения имен, присвоенных им системой SQL Server. При изменении ограничения с помощью Enterprise Manager система SQL Server автоматически удаляет старое ограничение и вновь создает его, когда вы сохраняете выполненные изменения (см. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее).
Ограничение PRIMARY KEY
Ограничение PRIMARY KEY используется, чтобы задать первичный ключ таблицы, представляемый колонкой или набором колонок, уникальным образом идентифицирующих строку таблицы. Поскольку первичный ключ идентифицирует строку, соответствующая колонка никогда не содержит значения NULL. В этом состоит отличие ограничения PRIMARY KEY от ограничения UNIQUE, которое допускает null-значения. Если вы определяете ограничение PRIMARY KEY по набору колонок, это ограничение указывает, что комбинация значений этих колонок должна быть уникальной для каждой строки, что аналогично ограничению UNIQUE по набору колонок. И, подобно ограничению UNIQUE, ограничение PRIMARY KEY не допускает дублированных значений. Если ограничение PRIMARY KEY присваивается колонке или набору колонок, то по этой колонке или колонкам первичного ключа автоматически создается уникальный индекс. Вы можете также задать для первичного ключа кластеризованный или некластеризованный индекс; если ничего не задано, по умолчанию создается кластеризованный индекс, если таблица еще не имеет кластеризованного индекса.
Таблица может иметь только одно ограничение PRIMARY KEY. Колонка с атрибутом IDENTITY хорошо подходит для первичного ключа, как и любая другая колонка или набор колонок, являющиеся уникальными для каждой строки. Например, в примере нашей таблицы customer мы могли бы создать колонку SSN как первичный ключ вместо создания для нее ограничения UNIQUE. Ограничение PRIMARY KEY не допускало бы null -значений и обеспечивало бы уникальность значений в колонке SSN, а по этой колонке первичного ключа был бы автоматически создан кластеризованный индекс. Следующий оператор T-SQL представляет один из способов задания колонки SSN как первичного ключа, когда вы определяете таблицу. При этом способе имя ограничению PRIMARY KEY присваивает SQL Server, поэтому он не является предпочтительным методом, так как в дальнейшем вам может потребоваться удаление данного ключа по имени.
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11) PRIMARY KEY, cust_phone char(10) NULL ) GO
Используя альтернативный способ, вы можете присвоить имя этому ограничению, добавив ключевое слово CONSTRAINT. Чтобы присвоить имя PK_SSN вашему ограничению PRIMARY KEY, используйте следующий оператор:
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11) CONSTRAINT PK_SSN PRIMARY KEY, cust_phone char(10) NULL ) GO
Вы можете также задать ограничение PRIMARY KEY после того, как определены все колонки таблицы. При использовании этого синтаксиса имя колонки должно быть заключено в круглые скобки и указано после предложения CONSTRAINT, как это показано в следующем операторе:
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11), cust_phone char(10) NULL, CONSTRAINT PK_SSN PRIMARY KEY (SSN) ) GO
Чтобы добавить ограничение PRIMARY KEY к таблице, не имеющей ограничения PRIMARY KEY, используйте оператор ALTER TABLE. Следующий оператор добавляет ограничение PRIMARY KEY к таблице customer:
ALTER TABLE customer ADD CONSTRAINT PK_SSN PRIMARY KEY CLUSTERED (SSN) GO
Здесь мы включили необязательное ключевое слово CLUSTERED, чтобы просто разъяснить, что по колонке первичного ключа будет создан кластеризованный индекс, хотя это происходит по умолчанию.
Чтобы удалить ограничение PRIMARY KEY, используйте оператор ALTER TABLE с предложением DROP CONSTRAINT. Ниже мы удаляем ограничение по колонке SSN:
ALTER TABLE customer DROP CONSTRAINT PK_SSN GO
Отметим, что для предложения DROP CONSTRAINT требуется только имя данного ограничения. Чтобы изменить существующее ограничение PRIMARY KEY по таблице с помощью операторов T-SQL, вы должны сначала удалить существующее ограничение и затем выполнить изменение таблицы, добавив новое ограничение. Это выполняется с помощью операторов ALTER TABLE...DROP CONSTRAINT и ALTER TABLE...ADD CONSTRAINT.
Ограничение FOREIGN KEY
Ограничение FOREIGN KEY определяет внешний ключ который задает связь между двумя таблицами. Колонка или колонки внешнего ключа одной таблицы ссылаются на потенциальный ключ (одна или несколько колонок) в другой таблице. При вставке строки в таблицу с ограничением FOREIGN KEY значения, которые должны быть внесены в колонку или колонки, определенные как внешний ключ, сравниваются со значениями в потенциальном ключе ссылочной таблицы. Если ни одна из строк ссылочной таблицы не соответствует значениям во внешнем ключе, то вставка новой строки не выполняется. Но если значения внешнего ключа, которые нужно внести в таблицу, все же имеются в потенциальном ключе другой таблицы, то вставка новой строки будет выполнена. Если значение, которое должно быть занесено в таблицу с ограничением FOREIGN KEY, равно NULL, то это тоже допустимо.
Проверка ограничений FOREIGN KEY происходит также в тех случаях, когда вы хотите обновить какую-либо строку в ссылочной таблице или в таблице с внешним ключом. Вы не сможете обновить какое-либо значение потенциального ключа или внешнего ключа, если это приведет к нарушению ограничения. Существует одно исключение из этого правила, когда вы обновляете ссылочную таблицу с помощью опции ON UPDATE CASCADE оператора T-SQL CREATE TABLE. (См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.) Кроме того, ограничения FOREIGN KEY проверяются, если вы хотите удалить какую-либо строку из ссылочной таблицы. Вы не сможете удалить строку из ссылочной таблицы, если строка какой-либо таблицы с внешним ключом (таблицы, содержащей ограничение FOREIGN KEY ) содержит ссылку на значение в колонке внешнего ключа.
Иными словами, для каждой строки в таблице с внешним ключом должна существовать соответствующая строка в ссылочной таблице, и эту строку нельзя удалить, пока на нее имеется ссылка. Существует также исключение из этого правила: вы можете удалить строку из ссылочной таблицы с помощью опции ON DELETE CASCADE оператора T-SQL CREATE TABLE.(См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.)
Внешний ключ может ссылаться только на те колонки, которые содержат в ссылочной таблице ограничение PRIMARY KEY или UNIQUE. Если вы попытаетесь создать внешний ключ, который ссылается на колонку, не являющуюся частью одного из этих ограничений, то SQL Server возвратит сообщение об ошибке. Кроме того, тип данных и размер колонки или колонок внешнего ключа должны совпадать со ссылочной колонкой или колонками.
Чтобы получить более ясное представление о внешних ключах, рассмотрим некоторые примеры. Сначала мы создадим таблицу с именем items (товары), которая содержит ограничение PRIMARY KEY по колонке item_id (идентификатор товара), как в следующем операторе:
CREATE TABLE items ( item_name char(15) NOT NULL, item_id smallint NOT NULL IDENTITY(1,1), price smallmoney NULL, item_desc varchar(30) NOT NULL DEFAULT 'none', CONSTRAINT PK_item_id PRIMARY KEY (item_id) ) GO
Затем мы создадим таблицу с именем inventory, содержащую ограничение FOREIGN KEY с именем FK_item_id, которое ссылается на колонку item_id в таблице items, как в следующем операторе:
CREATE TABLE inventory ( store_id tinyint NOT NULL, item_id smallint NOT NULL, item_quantity tinyint NOT NULL, CONSTRAINT FK_item_id FOREIGN KEY (item_id) REFERENCES items(item_id) ) GO
Чтобы увидеть, каким образом связаны эти таблицы, мы создадим схему (диаграмму) базы данных (рис. 16.10). (Инструкции по созданию схемы базы данных см. в лекции 15.) В данном примере items – это ссылочная таблица с потенциальным ключом item_id. Это единственно возможный потенциальный ключ, поскольку он является первичным ключом в данной таблице и эта таблица не содержит никаких ограничений UNIQUE. Напомним, что только колонки первичного ключа и колонки с ограничениями UNIQUE является допустимыми потенциальными ключами. Таблица inventory содержит ограничение FOREIGN KEY, определенное по ее колонке item_id. С помощью этого ограничения создается связь по внешнему ключу между этими двумя таблицами. Обе связанные колонки имеют тип данных smallint. Ограничение FOREIGN KEY в таблице inventory по колонке item_id гарантирует, что в колонку item_id нельзя ввести никакое значение, если этого значения нет в колонке item_id таблицы items. Иными словами, если товар отсутствует в таблице items, то он не может присутствовать в таблице inventory. Кроме того, из таблицы items нельзя удалить строку, если на нее имеется ссылка из какой-либо строки в таблице inventory. Иными словами, если какой-либо товар присутствует в таблице items и таблице inventory, этот товар нельзя удалить из таблицы items, пока он присутствует в таблице inventory. Теперь вы, вероятно, поняли, что внешние ключи используются для поддержки согласованности базы данных. Например, в данном случае вам не нужна информация о допустимости какого-либо товара в таблицах, если не существует записи об этом товаре в таблице items, предназначенной для хранения записей по каждому имеющемуся товару.
увеличить изображение
Рис. 16.10. Схема базы данных, где показана связь по внешнему ключу между таблицами items и inventory
Чтобы модифицировать ограничение FOREIGN KEY с помощью операторов T-SQL, вы должны сначала удалить старое ограничение и затем создать новое с помощью оператора ALTER TABLE. Этот метод действует аналогично модифицированию ограничения PRIMARY KEY. Ниже приводятся операторы для удаления исходного ограничения по таблице inventory и последующего добавления нового ограничения:
ALTER TABLE inventory DROP CONSTRAINT FK_item_id GO ALTER TABLE inventory ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id) REFERENCES items(item_id) GO
Если вы добавляете ограничение FOREIGN KEY к существующей колонке таблицы, SQL Server проверяет существующие строки таблицы, чтобы убедиться в том, что для значений этой колонки (за исключением null -значений) имеются соответствующие значения в колонке с ограничением PRIMARY KEY или UNIQUE ссылочной таблицы. Чтобы создать ограничение FOREIGN KEY без проверки системой SQL Server совпадения с существующими значениями, вы должны использовать опцию WITH NOCHECK оператора ALTER TABLE, как это показано ниже:
ALTER TABLE inventory WITH NOCHECK ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id) REFERENCES items(item_id) GO
Опция WITH NOCHECK препятствует тому, чтобы SQL Server проверял существующие строки таблицы, и это позволяет добавить соответствующее ограничение к таблице независимо от существующих значений. После добавления этого ограничения SQL Server обеспечивает целостность по внешнему ключу для новых строк.
Вы можете также активизировать или отключать использование ограничения FOREIGN KEY. Если вы хотите ввести строку, которая не согласуется с существующим ограничением, то можете временно отключить это ограничение, ввести строку и затем снова активизировать ограничение. Ключевое слово NOCHECK указывает, что данное ограничение следует игнорировать (отключить), а ключевое слово CHECK указывает, что ограничение следует активизировать. Следующие операторы выполняют отключение и повторную активизацию ограничения FOREIGN KEY с помощью ключевых слов NOCHECK и CHECK:
ALTER TABLE inventory NOCHECK CONSTRAINT FK_item_id --Отключает ограничение GO —Здесь должен быть оператор INSERT GO ALTER TABLE inventory CHECK CONSTRAINT FK_item_id --Повторно активизирует ограничение GO
Ограничение CHECK
Ограничение CHECK используется, чтобы ограничить множество допустимых для колонки значений определенными значениями. Значения, которые используются при вставке в колонку или обновлении колонки, проверяются на истинность (значение TRUE ) указанного в ограничении булева условия поиска. Например, если бы нам нужно было ограничить диапазон возможных значений, допустимых для колонки price (цена) таблицы items, величинами от $0,01 до $500,00, то мы использовали бы следующий оператор:
CREATE TABLE items ( item_name char(15) NOT NULL, item_id smallint NOT NULL IDENTITY(1,1), price smallmoney NULL, item_desc varchar(30) NOT NULL DEFAULT 'none', CONSTRAINT PK_item_id PRIMARY KEY (item_id), CONSTRAINT CK_price CHECK (price >= .01 AND price <= 500.00) ) GO
Отметим, что мы разрешили использование значений NULL в колонке price и задали ограничение CHECK по этой колонке. Поскольку SQL Server может отличить null -значение от любого другого типа значений, в колонке price, несмотря на ограничение CHECK, разрешены значения NULL. Кроме того, отметим, что мы присвоили этому ограничению имя CK_price. Как мы уже видели, присваивание имени ограничению упрощает последующее удаление и повторное создание этого ограничения по имени с помощью T-SQL. Например, чтобы изменить множество допустимых значений на диапазон от $1,00 до $1000,00, используйте следующий оператор:
ALTER TABLE items DROP CONSTRAINT CK_price GO ALTER TABLE items ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND price <= 1000.00) GO
Второй оператор ALTER TABLE имел бы такой же вид, если бы вы добавляли это ограничение к существующей таблице items в первый раз. При добавлении ограничения CHECK к существующей таблице применяются те же правила, что и при добавлении ограничения FOREIGN KEY. Существующие строки будут проверяться на соответствие этому ограничению. Если не все строки дают при проверке значение TRUE, то ограничение не добавляется к таблице и SQL Server возвращает сообщение об ошибке, информирующее, что оператор ALTER TABLE создает конфликтную ситуацию из-за ограничения CHECK. Если вы все же должны добавить это ограничение, используйте опцию WITH NOCHECK, чтобы указать, что должны проверяться только последующие обновления и добавляемые строки, но не существующие строки.
Вот пример использования WITH NOCHECK при добавлении ограничения CK_price:
ALTER TABLE items WITH NOCHECK ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND price <= 1000.00) GO
Вы можете также активизировать и отключать ограничение CHECK (как и ограничение FOREIGN KEY ) с помощью ключевых слов CHECK и NOCHECK, используемых с командой ALTER TABLE. Вам может потребоваться этот метод, например, для вставки цены, выходящей за указанный диапазон. В следующем примере выполняется отключение и последующая повторная активизация ограничения CHECK с именем CK_price:
ALTER TABLE items NOCHECK CONSTRAINT CK_price --Отключает ограничение GO --Здесь должен быть оператор INSERT GO ALTER TABLE items CHECK CONSTRAINT CK_price --Повторно активизирует ограничение GO
Создание и модифицирование ограничений с помощью Enterprise Manager
В этом разделе вы узнаете, как создавать, модифицировать и удалять ограничения в Enterprise Manager с помощью окна Design Table и (в случае ограничений FOREIGN KEY ) с помощью схемы базы данных. (Инструкции по созданию схемы базы данных см. в лекции 15.) Окно Design Table появляется, когда вы создаете или редактируете таблицу с помощью Enterprise Manager. Чтобы создать таблицу, раскройте в левой панели Enterprise Manager папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из контекстного меню пункт Design Table.
Разрешение использовать null-значения
Чтобы указать, можно или нельзя использовать null -значения в какой-либо колонке, просто установите или сбросьте соответствующий флажок в колонке Allow Nulls (Разрешить null -значения) окна Design Table. Вы можете задать этот параметр при создании таблицы или при ее модифицировании. (Правила для разрешения null -значений см. в лекции 10.) На рис. 16.11 показано окно Design Table для таблицы customer (см. раздел "Создание и модифицирование ограничений с помощью T-SQL" выше в этой лекции). Как видно из рисунка, null -значения допускаются в колонках mid_init и cust_phone, но в остальных трех колонках не допускаются.
увеличить изображение
Рис. 16.11. Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.
Ограничение UNIQUE
Чтобы создать или модифицировать ограничение UNIQUE с помощью Enterprise Manager, выполните следующие шаги:
- В панели инструментов окна Design Table щелкните на кнопке Table аnd Index Properties (Свойства таблицы и индексов) (кнопка справа от кнопки Save) и затем щелкните на вкладке Indexes/Keys (Индексы/Ключи) в появившемся окне Properties (Свойства). На рис. 16.12 показана вкладка Indexes/Keys окна Properties для таблицы customer. В этой вкладке будут представлены любые ограничения UNIQUE, поскольку они реализуются в виде уникальных индексов.
Данная таблица создана с помощью следующего оператора, содержащего ограничение UNIQUE в виде кластеризованного индекса по колонке SSN. (SQL Server автоматически присвоил этому индексу имя UQ_customer_398D8EEE; именно поэтому удобнее присваивать ваши собственные имена ограничениям и индексам.)
CREATE TABLE customer ( first_name char(20) NOT NULL, mid_init char(1) NULL, last_name char(20) NOT NULL, SSN char(11) NOT NULL UNIQUE CLUSTERED, cust_phone char(10) NULL ) GO
Рис. 16.12. Вкладка Indexes/Keys окна Properties для таблицы customer - Создание нового ограничения UNIQUE начните со щелчка на кнопке New (Создать) вкладки Indexes/Keys окна Properties. Выберите имена колонок, которые хотите включить в ограничение, введите имя этого нового ограничения и затем установите флажок Create UNIQUE (Создать ограничение UNIQUE ). Установите флажок Create As CLUSTERED (Создать как кластеризованный индекс), если вы хотите, чтобы это был кластеризованный индекс по данной таблице, и задайте, если хотите, коэффициент заполнения (поле Fill factor). Если вы не хотите, чтобы SQL Server автоматически пересчитывал статистику по этому индексу через определенные периоды, установите также флажок Don’t automatically recompute statistics.
- Вы можете использовать окно Properties для модифицирования ограничения UNIQUE ; например, вы можете изменять имя ограничения, указывать колонки, к которым присоединяется это ограничение, задавать ограничение как кластеризованный индекс и выбирать коэффициент заполнения для индекса. (О коэффициенте заполнения см. лекцию 17.) Внесите в это ограничение нужные вам изменения. По окончании щелкните на кнопке Close (Закрыть) и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений.>
Ограничение PRIMARY KEY
Вы можете задать ограничение PRIMARY KEY по одной колонке или по нескольким колонкам. Эта колонка или колонки должны уникальным образом идентифицировать каждую строку таблицы. Чтобы задать ограничение PRIMARY KEY, выполните следующие шаги:
- В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)
- Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение небольшого ключа. На рис. 16.13 показано окно Design Table для таблицы customer после указания колонки SSN как первичного ключа. Кроме того, из колонки SSN было удалено ограничение UNIQUE путем удаления уникального индекса, поскольку нет необходимости одновременно иметь ограничение UNIQUE и ограничение PRIMARY KEY по одной колонке.
увеличить изображение
Рис. 16.13. Задание ограничения PRIMARY KEY в окне Design Table - Если вам нужно переместить ограничение PRIMARY KEY в другую колонку, просто задайте эту новую колонку как первичный ключ. От вас не требуется удалить сначала явным образом исходный первичный ключ – SQL Server удалит и снова создаст для вас индекс PRIMARY KEY. Вы можете также модифицировать индекс PRIMARY KEY в окне Properties. И снова напомним, что ваши изменения начнут действовать после того, как вы сохраните вашу работу, щелкнув на кнопке Save в панели инструментов.Примечание. Если вы изменили ограничение PRIMARY KEY по таблице, уже содержащей данные, то повторное создание индекса может занять некоторое время. Если ваша таблица содержит много данных и вы задали существенное изменение по данному индексу, такое как изменение колонок индекса или кластеризованности, то вам следует по возможности выполнять этот вид изменений в периоды незначительного использования базы данных.
Ограничение FOREIGN KEY
Чтобы создать или модифицировать ограничение FOREIGN KEY с помощью Enterprise Manager, вы можете использовать окно Design Table или создать схему базы данных с таблицами, которые будут включены в связь по внешнему ключу. Лучше всего создавать связи по внешнему ключу во время создания таблиц (или хотя бы до того, как начнется вставка данных в таблицы). Причину этого вы узнаете из следующего примера. Сначала мы рассмотрим, как использовать окно Design Table для создания ограничения FOREIGN KEY. Мы создадим связь по внешнему ключу между двумя таблицами, описанными выше в этой лекции, – items и inventory. Мы повторно создадим таблицу items с ограничением PRIMARY KEY (которое использовали раньше), но без свойства IDENTITY по колонке item_id, так как будем работать с примером, где происходит обновление этой колонки, а вы не сможете обновлять колонку со свойством IDENTITY без выполнения некоторой дополнительной работы. Кроме того, мы повторно создадим таблицу inventory без ограничения FOREIGN KEY, чтобы его можно было добавить позже. Ниже приводятся операторы CREATE TABLE, используемые для обеих таблиц:
CREATE TABLE items ( item_name char(15) NOT NULL, item_id smallint NOT NULL, price smallmoney NULL, item_desc varchar(30) NOT NULL DEFAULT 'none', CONSTRAINT PK_item_id PRIMARY KEY (item_id) ) GO CREATE TABLE inventory ( store_id tinyint NOT NULL, item_id smallint NOT NULL, item_quantity tinyint NOT NULL ) GO
Чтобы добавить ограничение FOREIGN KEY по таблице inventory, выполните следующие шаги:
- Щелкните правой кнопкой мыши на имени таблицы inventory в правой панели Enterprise Manager и выберите пункт Design Table. Щелкните правой кнопкой мыши на свободном месте этого окна и выберите из контекстного меню пункт Relationships (Связи). Появится окно Properties с открытой вкладкой Relationships (рис. 16.14).
- Щелкните на кнопке New. Появится данные по умолчанию (рис. 16.15).
- Мы выбираем для таблицы первичного ключа таблицу items (вместо customer) и колонку item_id для связи по внешнему ключу между таблицами items и inventory. Для этого просто щелкните на одной из пустых строк под именами таблиц, и в спускающемся меню появится список выбора допустимых колонок. После того как выбраны соответствующие таблицы для связи, имя в поле Relationship Name (Имя связи) изменится (рис. 16.16).
Рис. 16.14. Вкладка Relationships (Связи) окна Properties (Свойства) для таблицы inventory
Рис. 16.15. Вкладка Relationships (Связи) с данными по умолчанию после щелчка на кнопке New (Создать)
Рис. 16.16. Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory - Внизу этого окна имеется несколько флажков (рис. 16.17). Установите флажок Check existing data on creation (Проверять существующие данные при создании), если вы хотите, чтобы SQL Server проверял существующие данные на связь по внешнему ключу. Если данные не согласуются, то ограничение не будет создано. Сбросьте этот флажок только в тех случаях, когда у вас еще нет данных или вы знаете, что существующие данные уже согласованы с этим ограничением, или вы не хотите по какой-либо причине, чтобы существующие данные были согласованы с ограничением. Но это может вызвать проблемы, если вы попытаетесь в дальнейшем обновить или удалить одну из существующих строк.
- Следующий флажок – это Enable relationship for replication (Активизировать связь для репликации). Не устанавливайте его, если вы не используете репликацию. Но даже если вы используете репликацию, вам все же не нужно устанавливать этот флажок, поскольку данные будут проверяться на согласованность с данным ограничением уже в исходных таблицах, поэтому их не обязательно проверять при репликации. Если вы все же активизировали связь для репликации и если расписания репликации этих двух таблиц не синхронизированы в достаточной степени, то вы получите ошибки во время репликации, указывающие, что какая-либо строка не может быть реплицирована, поскольку в ней нарушено ограничение по внешнему ключу.
- Следующий флажок – это Enable relationship for INSERT and UPDATE (Активизировать связь для операций INSERT и UPDATE). Установка этого флажка означает, что ограничение FOREIGN KEY будет проверяться при вставках и обновлениях, а также при удалениях. Если это является вашим намерением, установите данный флажок. Станут доступны два находящихся ниже флажка. Это флажки Cascade Update Related Fields (Каскадировать связанные с обновлением поля) и Cascade Delete Related Records (Каскадировать связанные с удалением записи). (Записью называется строка данных.)
Рис. 16.17. Вкладка Relationships, где показаны установленные флажки - Установка флажка Cascade Update Related Fields означает, что если вы обновляете ссылочную колонку ссылочной таблицы (например, обновляете значение колонки item_id в таблице items ), то это обновление будет каскадироваться в таблицу с внешним ключом. (В данном случае – то же самое значение колонки item_id будет обновлено, если оно имеется в таблице inventory.) Будет обновлено только значение данной колонки; остальная информация строки в таблице с внешним ключом останется без изменений. Установка этого флажка позволяет также выполнять обновление ссылочной колонки. Если вы не установите этот флажок, то система не позволит вам выполнить обновление ссылочной колонки, если она существует в таблице с внешним ключом. Вы получите от SQL Server сообщение об ошибке, аналогичное следующему: "UPDATE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."
(Конфликт оператора UPDATE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)
- Установка флажка Cascade Delete Related Records означает, что удаление из ссылочной таблицы будет каскадироваться в таблицу с внешним ключом. Например, если удаляется строка в таблице items, а строка в таблице inventory имеет в колонке item_id то же значение, что и удаленная строка, то эта строка также будет удалена из таблицы inventory. Это позволяет поддерживать согласованность вашей информации. Если вы не установите этот флажок, то система не позволит вам удалить строку из ссылочной таблицы, если на нее имеется ссылка в строке таблицы с внешним ключом. Вы получите сообщение об ошибке от SQL Server, аналогичное следующему: "DELETE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."
(Конфликт оператора DELETE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)
- После установки флажков щелкните на кнопке Close и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений. Появится другое окно, информирующее, что перечисленные таблицы будут сохранены в вашей базе данных; в список входят две таблицы, связанные по внешнему ключу. Для завершения щелкните на кнопке Yes. Затем вы можете закрыть окно Design Table, щелкнув на кнопке Close в верхнем правом углу этого окна (но не окна Enterprise Manager, иначе вы закроете Enterprise Manager).
Существует другой метод, который можно использовать для создания или модифицирования ограничения FOREIGN KEY: использование схемы базы данных. Чтобы изучить создание и модифицирование ограничения FOREIGN KEY с помощью схемы базы данных, мы сформируем схему, используя те же две таблицы, что и в предыдущем примере: items и inventory. Сначала мы рассмотрим схему базы данных с этими таблицами без связи по внешнему ключу и затем добавим внешний ключ. Начальная схема базы данных показана на рис. 16.18).
Рис. 16.18. Схема базы данных для таблиц items и inventory
Колонка item_id в таблице items – это колонка с первичным ключом (рис. 16.18). Это единственный "кандидат" для ссылки по внешнему ключу, так как для таблицы items не задано никаких ограничений UNIQUE. Чтобы создать связь по внешнему ключу между колонкой item_id таблицы inventory и колонкой item_id таблицы items, выполните следующие шаги.
- Щелкните на крайней левой ячейке (серый квадрат) строки для колонки item_id таблицы items и, удерживая кнопку мыши, перетащите курсор мыши на таблицу inventory. (Вы увидите пунктирную линию, сопровождающую курсор.) Отпустите кнопку мыши, когда окажетесь на строке для колонки item_id таблицы inventory. Появится диалоговое окно Create Relationship (Создать связь), показанное на рис. 16.19. Оно устроено аналогично окну Properties (окна Design Table), которое было показано выше. Колонка item_id появится в столбце каждой таблицы этого диалогового окна, указывая, что связь по внешнему ключу будет задана между двумя колонками item_id.
Рис. 16.19. В Диалоговое окно Create Relationship (Создать связь), где показана предложенная связь по внешнему ключу - Если нужно, вы можете изменить имя этой связи. Установите или сбросьте флажки внизу этого диалогового окна, чтобы выбрать нужные вам опции. Эти флажки были описаны выше в этой лекции.
- По окончании щелкните на кнопке OK, чтобы создать в схеме связь между таблицами (рис. 16.20). (Она еще не сохранена.) Линия с изображением ключа направлена от таблицы с внешним ключом к ссылочной таблице.
Рис. 16.20. Схема базы данных, где показана связь по внешнему ключу - Щелкните на кнопке Save, чтобы сохранить ваши изменения. У вас будет запрошено имя схемы базы данных, и затем нужно будет подтвердить внесение изменений в соответствующие таблицы. Для завершения щелкните на кнопке Yes.
Чтобы модифицировать ограничение FOREIGN KEY, вы можете использовать аналогичным образом оба метода, описанных в данном разделе. В окне Design Table снова откройте вкладку Relationships, внесите изменения и сохраните свою работу. В схеме базы данных щелкните правой кнопкой мыши на линии связи по внешнему ключу и выберите пункт Properties для внесения изменений в соответствующее ограничение или выберите пункт Delete Relationship From Database (Удалить связь из базы данных), чтобы полностью удалить это ограничение. Если нужно, вы можете затем создать новое ограничение.
Ограничение CHECK
Чтобы создать ограничение CHECK с помощью окна Design Table, откройте это окно для таблицы, с которой хотите работать, и выполните следующие шаги.
- Щелкните правой кнопкой мыши на окне Design Table и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties. Щелкните на вкладке Check Constraints (Ограничения Check) (рис. 16.21) и щелкните на кнопке New для таблицы items.
Рис. 16.21. Вкладка Check Constraints (Ограничения Check) окна Properties - Далее введите выражение, которое хотите использовать для проверки данных, которые будут вводиться или обновляться. В нашем примере мы добавим ограничение CHECK по колонке price таблицы items, чтобы можно было помещать значения только от $1,00 до $1000,00 (рис. 16.22).
- Обратите внимание на три флажка внизу этого окна. Установка флажка Check existing data on creation означает, что существующие данные таблицы будут проверяться на соответствие ограничению CHECK и если они не согласуются, то ограничение не будет создано. Установка флажка Enforce constraint for replication (Проверять ограничение для репликации) означает, что данное ограничение будет проверяться при репликации данных. Данные проверяются перед тем, как они попадут в исходную таблицу, т.е. установка этого флажка означает, что во время репликации будет выполняться повторная (т.е. ненужная) проверка данных. Установка флажка Enforce constraint for INSERTs and UPDATEs (ограничение для INSERT и UPDATE ) просто означает, что ограничение CHECK будет активизировано. Если не установить этот флажок, то данное ограничение будет создано, но оно не будет активизировано, т.е. не будет оказывать никакого влияния.
Рис. 16.22. Добавление ограничения CHECK по колонке price таблицы items - Щелкните на кнопке Close и затем щелкните на кнопке Save, чтобы сохранить новое ограничение. Чтобы модифицировать ограничение CHECK, используйте вкладку Check Constraint для изменения имени (Constraint name), выражения (Constraint expression) и флажков. На рис. 16.23 ограничение CHECK по колонке price изменено, с диапазона от $1,00 до $1000,00 на диапазон от $1,00 до $99,00.
Отметим, флажок Check existing data on creation теперь сброшен, поскольку ограничение уже было создано. Если вы хотите проверить существующие данные на соответствие модифицированному диапазону, установите этот флажок. Если эта проверка не проходит для существующих данных, то вы получите сообщение об ошибке и ограничение не будет модифицировано.
Вы можете также использовать вкладку Check Constraints для удаления ограничения CHECK, выбрав в списке Selected Constraint (Выбранное ограничение) имя ограничения, которое хотите удалить, и щелкнув на кнопке Delete.
Рис. 16.23. Модифицирование ограничения CHECK
Объекты типа Rule
Альтернативой использованию ограничения CHECK является создание объекта типа Rule (Rule-объекта) для ограничения значений, которые можно поместить или изменить в колонке. Rule-объект аналогичен Default-объекту в том, что он создается отдельно от таблицы и не удаляется при удалении таблицы. Вы должны также выполнить привязку Rule-объекта к колонке или к определенному пользователем типу – в данном случае – с помощью системной хранимой процедуры sp_bindrule. И, подобно Default-объекту, Rule-объекты включены в SQL Server 2000 для обратной совместимости с предыдущими версиями. Использование ограничения CHECK является предпочтительным методом ограничения значений колонок, но Rule-объекты полезно использовать, когда одно правило нужно использовать для нескольких колонок или определенных пользователем типов.
Создание Rule-объекта с помощью T-SQL
В качестве примера мы создадим Rule-объект, который выполняет ту же функцию, что и ограничение CHECK, которое мы создали выше. Наше правило использует имя переменной @price для ссылки на колонку price таблицы items. Имя переменной должно начинаться с символа "@", а имя можете выбрать произвольно. Сначала мы создадим данное правило и затем выполним его привязку к колонке, как это показано ниже:
USE MyDB GO CREATE RULE price_rule AS (@price >= .01 AND @price <= 500.00) GO sp_bindrule 'price_rule', 'items.price', 'futureonly' GO
Для отмены привязки правила и его удаления используйте следующий оператор:
sp_unbindrule 'items.price' GO DROP RULE price_rule GO
Для процедур sp_bindrule и sp_unbindrule указываются те же параметры, что и для процедур sp_bindefault и sp_unbindefault (см. раздел "Оператор CREATE DEFAULT и процедура sp_bindefault" выше в этой лекции). Каждая колонка или определенный пользователем тип может иметь только одно правило, хотя вы можете одновременно присвоить одной колонке или определенному пользователем типу правило и одно или несколько ограничений CHECK. Если вы сделаете это, SQL Server будет применять правило и все ограничения к данным таблицы при их вставке или обновлении.
Создание Rule-объекта с помощью Enterprise Manager
Чтобы использовать Enterprise Manager для создания и привязки Rule-объекта, выполните следующие шаги.
- Раскройте имя сервера и имя базы данных в Enterprise Manager. Щелкните правой кнопкой мыши на Rules (Правила) и затем выберите из контекстного меню пункт New Rule (Создать правило), чтобы появилось окно Rule Properties (Свойства правила). В данном примере мы зададим имя правила price_rule и добавим текст (рис. 16.24). Щелкните на кнопке OK, чтобы создать данный Rule-объект.
Рис. 16.24. Окно Rule Properties (Свойства правила) для создания правила - Для привязки правила щелкните на Rules в левой панели Enterprise Manager, щелкните правой кнопкой мыши на новом правиле и затем выберите из контекстного меню пункт Properties, чтобы появилось окно Rule Properties. Как и в случае привязки Default-объектов, щелкните на кнопке Bind UDTs для привязки данного правила к определенному пользователем типу или щелкните на Bind Columns для привязки данного правила к колонке или к колонкам. В данном примере мы щелкнем на кнопке Bind Columns и выберем колонку price таблицы items для привязки к ней правила (рис. 16.25).
Рис. 16.25. Привязка правила к колонке - Щелкните на кнопке OK, чтобы применить ваше правило, и затем снова щелкните на кнопке OK, чтобы закрыть окно Rule Properties
Чтобы удалить правило, вы должны сначала отменить привязку правила ко всем колонкам или определенным пользователем типам. После отмены привязки правила щелкните правой кнопкой мыши на имени этого правила, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All в диалоговом окне Drop Objects. Если имеется привязка правила к какой-либо колонке, когда вы пытаетесь удалить его, то SQL Server выведет сообщение об ошибке и не удалит данное правило.
Заключение
В этой лекции вы узнали об умолчаниях и пяти типах ограничений, которые можно задать по колонке или таблице; вы также узнали, как создавать и модифицировать умолчания и ограничения с помощью T-SQL и Enterprise Manager. Кроме того, узнали, как создавать и модифицировать умолчания и правила с помощью Default-объектов и Rule-объектов. Умолчания позволяют задавать для колонки значение по умолчанию, когда не задано конкретное значение. Ограничения можно использовать различными способами для обеспечения целостности данных в вашей базе данных. Умолчания и ограничения является полезными средствами, если они продуманно применяются к вашим таблицам базы данных. В лекции 17 мы рассмотрим использование индексов в SQL Server, включая кластеризованные и некластеризованные индексы. Использование индексов может в огромной степени увеличить эффективность доступа к данным.
Лекция 17. Создание и использование индексов
Индексы – одно из самых мощных средств, доступных разработчику базы данных. Индекс – это вспомогательная структура, позволяющая вам повышать производительность запросов за счет снижения количества операций ввода-вывода, необходимых для поиска запрошенных данных; т.е. индекс позволяет системе Microsoft SQL Server 2000 находить данные, используя меньшее число операций ввода-вывода, чем при поиске данных путем доступа только к таблице базы данных. Если для поиска строки данных вы используете индекс таблицы базы данных, SQL Server может быстро определить, где хранятся эти данные и сразу считать эти данные. Таким образом, индексы таблиц базы данных во многом похожи на индексы (алфавитные указатели) в книгах: в обоих случаях обеспечивается быстрый доступ к большим объемам информации.
В этой лекции вы узнаете об основах индексирования, включая создание индекса и типы индексов, доступные в SQL Server. Вы также узнаете, когда использовать индексы и когда не нужно их использовать, поскольку использование индекса не всегда эффективно – в некоторых ситуациях это приводит к снижению производительности.
Что такое индекс?
Как уже говорилось, индекс – это вспомогательная структура данных, используемая системой SQL Server для доступа к данным. В зависимости от типа индекса он хранится вместе с данными или отдельно от данных. Независимо от типа все индексы действуют одинаковым в своей основе способом, о котором вы узнаете в этом разделе.
В системах без индексов весь поиск данных должен выполняться путем сканирования таблиц. При сканировании таблиц приходится читать все данные и сравнивать их с запрашиваемыми данными. Обычно стараются обойтись без сканирования таблиц – из-за количества операций ввода-вывода, которое для этого требуется: сканирование больших таблиц может занимать длительный период времени и требовать использования большого количества системных ресурсов. Используя индекс, вы можете кардинально снизить количество операций ввода-вывода, ускорив доступ к данным и освободив системные ресурсы для других операций.
Индекс базы данных организован в виде структуры B-дерева. Каждая страница индекса называется индексной страницей, или узлом индекса. Структура индекса начинается на верхнем уровне с корневого узла. Корневой узел соответствует началу индекса: это первые данные, к которым осуществляется доступ при поиске данных. Корневой узел содержит ряд строк индекса. Эти строки содержат значение ключа и указатель на определенную индексную страницу (которая называется узлом-ветвью) (рис. 17.1). Эта конфигурация необходима, поскольку в случае таблицы данных среднего масштаба индекс состоит из тысяч или миллионов индексных страниц. Начав поиск с корневого узла и перемещаясь по узлам индекса, SQL Server может постепенно "приближаться" к нужным вам данным.
Если использовать в качестве аналога книгу, то индекс действует следующим образом: предположим, что началом индекса (алфавитного указателя) является страница, где указаны номера страниц для статей индекса на букву "a", "b", "c" и т.д. Затем предположим, что эти страницы содержат номера страниц для статей в диапазонах aa-ab, Ас-ad, ae-af и т.д., а соответствующие страницы – номера страниц для записей в диапазонах aaa-aab, aАс-aad, aae-aaf и т.д. При подобной организации вы можете быстро найти то, что вам нужно, с использованием относительно небольшого количества операций поиска. Такая структура аналогична индексу таблицы базы данных, когда первой страницей является корневой узел.
Рис. 17.1. Корневой узел и узлы-ветви
Как и корневой узел, каждый узел-ветвь содержит ряд индексных строк в структуре индексной страницы. Каждая индексная строка указывает на другой узел-ветвь или на узел-лист (конечный узел) (рис. 17.2). Узел-лист является последним уровнем индекса. В отличие от корневого узла каждый узел-ветвь содержит также связанный список узлов-ветвей того же уровня. Иными словами, узел "знает" о смежных узлах и об узлах более низкого уровня.
Рис. 17.2. Дерево поиска с узлами-ветвями и узлами-листьями
Как следует из названия "B-дерево", узлы-ветви разветвляются от корневого узла в древовидной форме. Каждая группа узлов-ветвей одного уровня в древовидной структуре называется уровнем индекса (рис. 17.3). Количество операций ввода-вывода, которое требуется для достижения узлов-листьев (узлов самого нижнего уровня дерева), зависит от количества уровней индекса. Если таблица базы данных содержит лишь небольшое количество данных, то корневой узел может указывать непосредственно узлы-листья, и тогда для индекса вообще не требуется никаких узлов-ветвей (маловероятная ситуация).
Рис. 17.3. Уровни индекса
В некластеризованном индексе узел-лист содержит значение ключа, а также идентификатор строки (Row ID), указывающий нужную строку в таблице, или ключ кластеризованного индекса, если имеется также кластеризованный индекс по этой таблице. А в кластеризованном индексе в узле-листе находятся сами данные. (О кластеризованных и некластеризованных индексах см. раздел "Типы индексов" далее.) Количество строк в узле-листе зависит от размера индексных записей, а в случае кластеризованного индекса – от размера данных.
Имейте в виду, что, поскольку индекс создается в отсортированном порядке, любые изменения в данных могут приводить к дополнительной нагрузке на систему. Например, если вставка приводит к созданию новой строки индекса, которую нужно поместить в узел-лист, который уже заполнен до конца, то SQL Server должен создать место для новой строки индекса. Он выполняет эту задачу, перемещая приблизительно половину строк узла-листа на другую страницу. Это перемещение данных называется расщеплением страницы. Расщепление страницы на одном уровне дерева может приводить к каскадным расщеплениям на более высоких уровнях. Расщепления страниц можно избежать путем соответствующей настройки коэффициента заполнения. (См. раздел "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
Понятия индексирования
Теперь, когда вы получили представление о структуре индексов, рассмотрим некоторые из наиболее общих понятий индексирования. В этом разделе вы узнаете об индексных ключах, уникальности индексов и типах индексов.
Индексные ключи
Индексным ключом называется колонка или колонки, которые используются для формирования индекса. Индексный ключ – это значение, позволяющее быстро находить строку, содержащую нужные вам данные (подобно статье индекса [алфавитного указателя] в книге, указывающей определенную тему в тексте). Для доступа к данным строки через индекс вы должны включить значение или значения индексного ключа в предложение WHERE нужного оператора SQL. Способ выполнения этого процесса зависит от того, какой это индекс – простой или составной.
Простые индексы
Простой индекс определяется только по одной колонке таблицы (рис. 17.4). Чтобы индекс использовался оператором SQL, ссылка на эту колонку должна быть включена в предложение WHERE данного оператора.
Рис. 17.4. Простой индекс
В зависимости от типа сохраняемых данных, количества уникальных элементов в колонке и типа используемых операторов SQL простой индекс может оказаться весьма эффективен. В других случаях необходим составной индекс. Например, если вы строите индекс для адресной книги с тысячами имен и адресов, то колонка state (штат) не слишком подходит для простого индекса, поскольку для каждого штата будет много записей. Однако, добавив к индексу колонки street (улица) и city (город), вы делаете его составным индексом, после чего почти каждая запись становится уникальной. Это может оказаться полезным, если у вас используются запросы поиска строк в соответствии с адресом.
Составные индексы
Составной индекс – это индекс, определенный более чем по одной колонке (рис. 17.5). Доступ к составному индексу может осуществляться с помощью одного или нескольких индексных ключей. В рамках SQL Server 2000 индекс может содержать до 16 колонок, и колонки ключей могут иметь длину до 900 байтов.
Рис. 17.5. Составной индекс
Для запросов, включающих составной индекс, вам не требуется помещать все индексные ключи в предложение WHERE оператора SQL, но имеет смысл использовать более одного ключа. Например, если индекс создается по колонкам a, b и c какой-либо таблицы, то доступ к этому индексу можно осуществлять с помощью оператора SELECT, содержащего выражение ( a АND b АND c ), или ( a АND b ), или a. Конечно, использование более ограничивающего предложения WHERE, содержащего, например, выражение a АND b АND c, обеспечит более высокую производительность. Скорее всего, из базы данных будет считано меньшее количество строк, поскольку строки будет указаны более точно. Если использовать a АND b или просто a, то будет инициировано сканирование индекса.
Сканирование индекса возникает потому, что критерию поиска соответствует более чем одна запись индекса. При сканировании индекса происходит сканирование узлов внутри индекса для считывание нескольких записей данных. Кроме того, индекс лишь частично соответствует выбранному значению. Например, если индекс создан по колонкам a, b и c, а в запросе указано значение только для колонки a, то будут возвращены все удовлетворяющие этому значению строки для всех значений колонок b и c.
Поскольку колонки, по которым строится индекс, упорядочиваются числовым образом, то оптимизатор запросов SQL Server может определить диапазон индексных страниц, которые могут содержать нужные данные. Если известны начальная и конечная страницы, то будут считаны все страницы, содержащие значения данных, после чего будет выполнено сканирование этих данных для выбора запрошенных данных.
Таблица местоположения заказчиков
Предположим, что у нас имеется таблица, содержащая информацию о местоположении заказчиков вашего предприятия. По колонкам state (штат), country (графство) и city (город) создается структура B-дерева в следующем порядке: state, country, city. Если в запросе в предложении WHERE указано значение Texas (Техас) колонки state, то будет использован индекс. Но поскольку значения колонок country и city не заданы в запросе, то индекс возвратит набор строк, исходя из всех записей индекса, содержащих значение Texas в колонке state. Для считывания диапазона индексных страниц используется сканирование индекса и последующее сканирование страниц данных, исходя из значений колонки state. Страницы индекса считываются последовательно таким же образом, как при сканировании таблицы для доступа к страницам данных.
В большинстве случаев сканирование индекса будет достаточно эффективным; но если происходит доступ к более чем 20 процентам строк таблицы, то более эффективным является сканирование таблицы, при котором из таблицы считываются все строки. Эффективность запросов, использующих индекс, зависит от того, как вы используете индекс (см. раздел "Использование индексов" далее), а также от степени уникальности индекса (см. следующий раздел).
Уникальность индекса
Вы можете определить индекс SQL Server как уникальный или неуникальный. В уникальном индексе каждое значение индексного ключа должно быть уникальным. В неуникальном индексе допускается дублирование индексных ключей в таблице данных. Эффективность неуникального индекса зависит от избирательности (селективности) данного индекса.
Уникальный индекс
Уникальный индекс содержит только одну строку данных для каждого индексного ключа; иными словами, значения индексного ключа не могут присутствовать в индексе более одного раза. Использование уникальных индексов гарантирует, что для поиска запрошенных данных требуется всего одна дополнительная операция ввода-вывода. SQL Server обеспечивает уникальность индекса по колонкам или комбинации колонок, образующих ключ индекса. SQL Server не допускает занесения дублированных значений ключа в базу данных. Если вы попытаетесь сделать это, появится сообщение об ошибке. SQL Server создает уникальные индексы, если задали по таблице ограничение PRIMARY KEY или ограничение UNIQUE. (Об ограничениях PRIMARY KEY и UNIQUE см. лекцию 16).
Индекс можно сделать уникальным, только если уникальны сами данные. Если данные какой-либо колонки не обладают свойством уникальности, то вы можете все же создать уникальный индекс, используя составной индекс. Например, колонка last name (фамилия), возможно, не будет уникальной, но комбинация данных этой колонки с колонками first name (имя) и middle name (отчество) может образовать уникальный индекс по данной таблице.
Неуникальные индексы
Неуникальный индекс действует так же, как уникальный индекс, за исключением того, что он может содержать дублированные значения в узлах-листьях. Все дублированные значения будут считываться, если они отвечают критерию, указанному в операторе SELECT.
Неуникальный индекс не столь эффективен, как уникальный индекс, поскольку для считывания запрошенных данных он требует дополнительной обработки (дополнительных операций ввода-вывода). Но некоторые приложения требуют использования дублированных ключей, поэтому иногда нет возможности создания уникального индекса. В некоторых случаях использовать неуникальный индекс лучше, чем вообще не использовать никакого индекса.
Типы индексов
Существует два типа индексов B-деревьев: кластеризованные индексы и некластеризованные индексы. Кластеризованный индекс хранит в своих узлах-листьях реальные строки данных. Некластеризованный индекс является вспомогательной структурой, которая указывает данные в таблице. В этом разделе мы рассмотрим отличия между этими двумя типами индексов. В этом разделе вы также ознакомитесь с полнотекстовым индексом, который является скорее каталогом, чем индексом.
Кластеризованные индексы
Как уже говорилось, кластеризованный индекс – это индекс в виде B-дерева, где хранятся реальные строки данных таблицы в отсортированном порядке в узлах-листьях (рис. 17.6). Эта система дает несколько преимуществ и имеет несколько недостатков.
Рис. 17.6. Кластеризованный индекс
Поскольку данные кластеризованного индекса хранятся в узлах-листьях, то данные становятся доступны, как только найден определенный узел-лист, что может сокращать количество операций ввода-вывода. Любое сокращение числа этих операций повышает производительность отдельных операций и системы в целом.
Еще одним преимуществом кластеризованных индексов является то, что считываемые данные получаются в отсортированном по индексу виде. Например, если кластеризованный индекс создан по колонкам state, country и city и в запросе происходит выбор данных для значения Texas колонки state, то результирующий набор будет отсортирован по колонкам country и city в том порядке, как определен индекс. Эту возможность можно использовать, чтобы избежать ненужных операций сортировки, если приложение и база данных организованы соответствующим образом. Например, если вы знаете, что вам всегда требуется сортировка данных в определенном порядке, то использование кластеризованного индекса означает, что вам не потребуется выполнять сортировку после считывания данных.
Недостатком использования кластеризованного индекса является то, что доступ к таблице всегда происходит через индекс, что может приводить к дополнительной нагрузке на систему. SQL Server начинает доступ к данным в корневом узле и проходит через индекс, пока не будет достигнут узел-лист, содержащий нужные данные. Если из-за большого объема данных создается много узлов-листьев, то количество уровней индекса, необходимых для поддержки столь большого числа узлов-листьев, тоже становится большим, что увеличивает количество операций ввода-вывода, необходимых для перемещения от корневого узла к узлу-листу.
Поскольку в кластеризованном индексе хранятся реальные данные, вы не можете создать более одного кластеризованного индекса по таблице. С другой стороны, вы можете создать некластеризованный индекс по кластеризованной таблице. (Кластеризованная таблица – это просто таблица, имеющая кластеризованный индекс.) Вам следует создавать кластеризованный индекс, используя индексные ключи, к которым наиболее часто осуществляется доступ: это даст вам наибольшую вероятность доступа к данным через кластеризованный индекс и, тем самым, наиболее высокую производительность.
Некластеризованные индексы
В отличие от кластеризованного индекса некластеризованный индекс не содержит реальных данных таблицы в своих узлах-листьях. Узлы-листья могут содержать один из двух типов информации о местоположении строк данных. Во-первых, если по таблице не создан кластеризованный индекс, то некластеризованные индексы по этой таблице хранят в своих узлах-листьях идентификаторы строк (Row ID) (рис. 17.7). Каждый идентификатор строки указывает реальную строку данных в таблице. Идентификатор строки – это значение, включающее в себя номер файла данных, номер страницы и местоположение строки на этой странице. Это значение обеспечивает быстрый доступ к реальным данным, указывая точное местоположение этих данных.
Если по таблице создан кластеризованный индекс, то некластеризованные индексы будут содержать в узле-листе значение ключа кластеризованного индекса для этих данных (рис. 17.8). При достижении узла-листа некластеризованного индекса находящееся в нем значение кластеризованного ключа используется для поиска в кластеризованном индексе, соответствующий узел-лист которого содержит искомую строку данных.
Как уже говорилось, каждая таблица может иметь только один кластеризованный индекс. Вы можете создать 249 некластеризованных индексов на одну таблицу, но это было бы неразумно (см. раздел "Рекомендации по использованию индексов"). Обычно на практике используется несколько некластеризованных индексов по различным колонкам таблицам. Чтобы определить, какой индекс использовать, оптимизатор запросов использует предикат в предложении WHERE.
Рис. 17.7. Некластеризованный индекс по таблице, не имеющей кластеризованного индекса
Рис. 17.8. Некластеризованный индекс по таблице, имеющей кластеризованный индекс
Полнотекстовые индексы
Как уже говорилось, полнотекстовый индекс SQL Server на самом деле больше похож на каталог, чем на индекс, и он имеет структуру, отличную от B-дерева. Полнотекстовый индекс позволяет выполнять поиск по группам ключевых слов. Полнотекстовый индекс является частью службы Microsoft Search; он широко используется в механизмах поиска Wеb-узлов и других текстовых операциях.
В отличие от индексов, имеющих структуру B-дерева, полнотекстовый индекс хранится вне базы данных, но поддерживается базой данных. Ввиду своего внешнего хранения этот индекс может поддерживать свою собственную структуру. К полнотекстовым индексам относятся следующие ограничения:
- Полнотекстовый индекс должен иметь колонку, которая уникальным образом идентифицирует каждую строку таблицы.
- Полнотекстовый индекс должен также содержать одну или несколько колонок символьных строк таблицы.
- Для каждой таблицы может существовать только один полнотекстовый индекс.
- Полнотекстовый индекс не обновляется автоматически, как это происходит с индексами, имеющими структуру B-дерева. В индексе со структурой B-дерева операции вставки, обновления или удаления вызывают также обновление индекса. В случае полнотекстового индекса эти операции по таблице не приводят к автоматическому обновлению этого индекса. Для обновлений следует задавать расписание или выполнять их вручную.
Полнотекстовый индекс имеет массу возможностей, которых нет в индексах со структурой B-дерева. Поскольку этот индекс используется как механизм текстового поиска, он поддерживает больше возможностей текстового поиска, чем стандартные механизмы. Используя полнотекстовый индекс, вы можете выполнять поиск слов или фраз, отдельных слов или групп слов, а также похожих слов. (О том, как создавать полнотекстовый индекс см. раздел "Использование мастера Full-Text Indexing Wizard" далее.)
Создание индексов
Создание индекса не представляет особых сложностей. Кластеризованные и некластеризованные индексы создаются аналогичным образом с помощью мастеров в Enterprise Manager или с помощью команды SQL CREATE INDEX. В этом разделе вы узнаете, как создавать индексы с помощью этих двух методов, как использовать коэффициент заполнения и как применять хранимые процедуры для создания полнотекстового индекса.
Использование мастера Create Index Wizard
Очевидно, что если вы хотите создать индекс по какой-либо таблице, эта таблица уже должна существовать в базе данных. Вы можете использовать мастер создания индекса Create Index Wizard для создания кластеризованного или некластеризованного индекса по таблице с помощью следующих шагов:
- Откройте Enterprise Manager и щелкните на кнопке Wizards (Мастера) в меню Tools. Появится диалоговое окно Select Wizard (Выбор мастера). В данном примере мы будем использовать базу данных Northwind.
- Раскройте папку Database (База данных), выберите Create Index Wizard и затем щелкните на кнопке OK.
- Появится начальное окно мастера Create Index Wizard (рис. 17.9). Отметим, что выбранные вами имя сервера и имя базы данных появятся в линейке заголовка. В данном примере выбраны сервер W2KSERVER и база данных Northwind.
Рис. 17.9. Начальное окно мастера Create Index Wizard - Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database аnd Table (Выбор базы данных и таблицы) (рис. 17.10). Здесь вы можете указать базу данных и таблицу, по которой хотите создать индекс. По умолчанию выбрана база данных, которую вы указали при запуске мастера. Представлена также используемая по умолчанию таблица этой базы данных.
Рис. 17.10. Окно Select Database аnd Table (Выбор базы данных и таблицы) - Щелкните на кнопке Next, чтобы перейти к окну Current Index Information (Информация о текущих индексах) (рис. 17.11). В данном примере используется таблица Customers, поскольку она содержит большое число строк. Как видите, небольшое число индексов уже создано по таблице Customers, включая один кластеризованный индекс и четыре некластеризованных индекса. Напомним, что вы можете создать только один кластеризованный индекс по таблице, что делает ее кластеризованной таблицей.
Рис. 17.11. Окно Current Index Information (Информация о текущих индексах)Все индексы, созданные по таблице Customers, – это простые индексы, созданные по различным колонкам. Когда оптимизатор запросов анализирует запрос для выбора плана исполнения данного запроса, он выбирает для использования нужный индекс, исходя из имеющихся индексов и предиката в предложении WHERE. - Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис. 17.12). Это окно позволяет вам выбирать колонки для включения в данный индекс. На данный момент порядок колонок не имеет значения – вы сможете изменить его позже.
Рис. 17.12. Окно Select Columns (Выбор колонок) - Задайте колонки, которые хотите включить в данный индекс, путем установки флажков справа от имен колонок. В данном примере мы создадим составной индекс по колонкам CompАnyName, ContАсtName и Region.
- Щелкните на кнопке Next, чтобы появилось окно Specify Index Options (Задание параметров индекса) (рис. 17.13). В этом окне вы можете задать несколько важных параметров, которые определяют, как будет создаваться индекс. Вы можете установить флажок Make this a clustered index (Сделать этот индекс кластеризованным), чтобы это был кластеризованный индекс. В данном примере флажок, используемый для создания кластеризованного индекса, недоступен, поскольку кластеризованный индекс по таблице Customers уже создан.
Вы можете установить флажок Make this a unique index (Сделать этот индекс уникальным), если хотите, чтобы он был уникальным. Вы можете также задать коэффициент заполнения (Fill fАсtor) как оптимальный (Optimal) или фиксированный (Fixed). Поскольку строки индекса хранятся в отсортированном порядке, системе SQL Server может потребоваться перемещение данных для поддержания этого порядка. Коэффициент заполнения указывает, насколько плотно должны размещаться данные в новом индексе, чтобы оставалось место для будущих вставок. Принятый по умолчанию коэффициент заполнения (который вы получаете, если щелкнуть на кнопке выбора Optimal) равен 0, что означает плотное заполнение узлов-листьев, но свободное пространство в вышележащих узлах индекса. (Подробнее о коэффициенте заполнения см. в разделе "Использование коэффициента заполнения для предупреждения расщеплений страниц" далее.)
Рис. 17.13. Окно Specify Index Options - Выберите ваши параметры индекса и затем щелкните на кнопке Next, чтобы появилось окно Completing the Create Index Wizard (Завершение работы мастера создания индекса) (рис. 17.14). В этом окне вы можете изменить порядок колонок, образующих индекс. Просто выделите колонку, которую хотите переместить, и щелкайте на кнопке Move Up (Вверх) или Move Down (Вниз), пока данная колонка не окажется в нужном месте. Вы можете также задать в этом окне имя индекса.
Порядок колонок в составном индексе имеет важное значение. Оператор SQL может использовать преимущества индекса, только если в предложении WHERE этого оператора указана ведущая часть индекса. На рис. 17.15 показано то же окно с измененным именем индекса (CustomerAreaIndex) и другим порядком колонок – Region, CompАnyName, ContАсtName.
Рис. 17.14. Окно Completing the Create Index Wizard
Рис. 17.15. Изменение порядка колонокПри таком порядке колонок оператор SQL должен содержать Region в своем предложении WHERE , чтобы использовать преимущества индекса, поскольку Region – это ведущая колонка. Конечно, оператор может содержать в своем предложении WHERE Region и CompАnyName или даже Region, CompАnyName и ContАсtName. Используя в предложении WHERE все три значения, вы получаете наилучшую производительность, поскольку будет выполнено минимальное количество операций ввода-вывода. И тогда уже не имеет значения, в каком порядке имена колонок указаны в предложении WHERE . - Если вас удовлетворяет порядок колонок, щелкните на кнопке Finish (Готово), после чего будет создан индекс. Этот процесс может занять от нескольких секунд до нескольких часов в зависимости от количества данных, производительности системы, производительности дисководов и памяти системы. Для создания индекса по таблице SQL Server должен прочитать все данные таблицы, поэтому время варьируется в таких широких пределах.Внимание. Если вы создаете уникальный индекс и в ключе индекса обнаружены дублированные значения, процесс создания индекса прекращается.Создание индекса с помощью мастера Create Index Wizard происходит просто, но этот процесс имеет некоторые недостатки. В частности, поскольку мастер Create Index Wizard не поддерживает информацию о задачах, которые выполняются с его помощью, вам приходится проходить через процесс, описанный в этом разделе, каждый раз, как вы создаете новый индекс. Если вы создаете индекс с помощью файла сценария, то можете использовать этот файл снова и снова. Кроме того, если вы хотите повторно создать базу данных, то должны снова пройти через все шаги мастера Create Index Wizard для каждого индекса базы данных. Напомним, однако, что после создания индексов вы можете генерировать для них сценарии SQL с помощью Enterprise Manager.
Использование TrАnsАсt-SQL
Используя TrАnsАсt-SQL (T-SQL) для создания индекса, вы можете генерировать сценарий для соответствующей команды и запускать его многократно. Вы можете также модифицировать сценарий создания индекса для создания других индексов. Кроме того, этот метод создания индекса дает вам больше гибкости, поскольку вы имеете доступ к большему числу параметров. Чтобы использовать этот метод создания индекса, просто поместите команды T-SQL в файл и считывайте этот файл в OSQL, используя следующий синтаксис:
Osql -Uимя_пользователя -Pпароль < create_index.sql
В этой команде предполагается, что создаваемый вами файл имеет имя create_index.sql. Вы можете также выполнять этот сценарий с помощью анализатора запросов Query Аnalyzer. (Более подробную информацию об этом процессе см. в лекции 13.)
Для создания индекса с помощью T-SQL вы должны использовать оператор CREATE INDEX. Эта команда имеет следующий синтаксис:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX имя_индекса ON имя_таблицы ( имя_колонки [, имя_колонки, имя_колонки, ... ] ) [ WITH параметры ] [ ON имя_группы_файлов ]
Значения в прямоугольных скобках не являются обязательными. Вы можете создать уникальный или неуникальный индекс, кластеризованный или некластеризованный индекс, с одной или несколькими колонками и с необязательными параметрами, перечисленными в табл. 17.1. Вы можете также дополнительно указать группу файлов, куда нужно поместить данный индекс.
Параметр | Описание |
---|---|
PAD_INDEX | В сочетании с параметром FILL_FАСTOR указывает, что свободное место должно быть оставлено не только в узлах-листьях, но и в узлах-ветвях |
FILL_FАСTOR ? число | Указывает, в какой степени будет заполнен каждый узел-лист; значение в процентах задается в диапазоне от 0 до 100 |
IGNORE_DUP_KEY | Указывает, что вставка дублированного значения в уникальный индекс будет игнорироваться и сопровождаться предупреждающим сообщением. Если параметр IGNORE_DUP_KEY не указан, то будет выполнен откат всей вставки |
DROP_EXISTING | Указывает, что следует удалить существующий индекс с тем же именем и создать индекс снова. Этот параметр повышает производительность, если вы снова создаете кластеризованный индекс по таблице, имеющей некластеризованные индексы, поскольку для удаления и повторного создания некластеризованных индексов не требуется выполнять отдельные шаги |
STATISTICS_NORECOMPUTE | Указывает, что не следует выполнять пересчет данных статистики. Этот параметр не рекомендуется использовать, поскольку планы исполнения будут основываться на старых данных и, вероятно, не будут оптимальными. Используйте этот параметр, только если планируете обновлять статистику вручную |
Использование сценариев T-SQL предпочтительнее использования мастера Create Index Wizard. Хотя язык T-SQL сначала кажется более трудным для использования, при длительном использовании вы увидите, что создавать индекс с помощью T-SQL гораздо проще.
Использование коэффициента заполнения для предупреждения расщеплений страниц
При обновлениях и вставках в таблице, имеющей индексы, страницы индекса тоже должны обновляться. Страницы индекса связаны друг с другом в цепочку указателями из одной страницы в другую. Имеется два указателя: один на следующую страницу и один на предыдущую. Если страница индекса заполнена до конца, то изменение в индексе приводит к изменению в цепочке указателей, поскольку между двумя страницами должна быть вставлена новая страница (в форме процесса, который называется расщеплением страницы индекса, чтобы новую информацию можно было поместить в нужном месте цепочки индекса. SQL Server перемещает приблизительно половину строк существующей страницы (где должны следовать новые данные) в эту новую страницу индекса. Две страницы, которые указывали друг на друга, теперь будут указывать на новую страницу, а новая страница – на эти две страницы (как на следующую и предыдущую). Теперь ссылка на новую страницу индекса указывает в нужное место цепочки, но страницы индекса физически уже не следуют друг за другом в базе данных (рис. 17.16). В конце концов, из-за того, что в индекс постоянно добавляются новые строки индекса (в предположении, что происходят обновления и вставки), а страница индекса имеет конечный размер, заполняется все больше и больше страниц. При этом требуется находить дополнительное пространство для новых страниц индекса. Для этого SQL Server продолжает выполнять расщепление страниц индекса, что приводит к дополнительной нагрузке на систему из-за более активного использования ЦП (CPU) и большего числа операций ввода-вывода. Кроме того, это приводит к фрагментированию индекса. Данные индекса "разбрасываются" в базе данных, вызывая снижение производительности.
Рис. 17.16. Расщепление страницы индекса
Одним из способов снижения степени расщепления и фрагментации страниц является настройка коэффициента заполнения узлов индекса. Коэффициент заполнения указывает процент заполнения узла при создании индекса, что позволяет оставить место для дополнительных строк индекса. Вы можете задать коэффициент заполнения для индекса с помощью параметра FILL_FАСTOR оператора T-SQL CREATE INDEX, как это описано выше. Если коэффициент заполнения не указан в команде CREATE INDEX, то используется значение по умолчанию данной системы. Значение по умолчанию равно значению параметра fill fАсtor, заданному в процедуре sp_configure. Это значение было задано равным 0, когда вы инсталлировали SQL Server.
Значение коэффициента заполнения изменяется в диапазоне от 0 до 100, указывая процент заполнения страницы индекса. Значение 0 соответствует особому случаю. В этом случае узлы-листья заполняются полностью, но в узлах-ветвях и корневом узле остается свободное место. Это значение задается по умолчанию при инсталляции SQL Server и обычно дает хорошие результаты.
Значение коэффициента заполнения 100 указывает, что при создании индекса все узлы индекса будут заполняться полностью. Это оптимальное значение для индексов по таблицам, в которые никогда не будут заноситься новые данные и которые не будут обновляться. Как узлы-листья, так и узлы более высоких уровней будут заполняться до конца, и любая вставка будет приводить к расщеплению страниц. Таблицы, используемые только по чтению, идеально подходят для этого значения, хотя удаление данных допустимо, поскольку не вызывает расщепления страниц.
Низкое значение коэффициента заполнения оставляет много места для вставок, но требует много дополнительного пространства для создания индекса. Если вам не требуются постоянные вставки в базу данных, то низкое значение коэффициента заполнения обычно не рекомендуется. Если происходит слишком много расщеплений страниц, попытайтесь снизить значение коэффициента заполнения и повторно генерировать индекс, чтобы посмотреть, снизится ли при этом количество расщеплений страниц.
Вы можете определять количество расщеплений страниц в секунду, происходящих в вашей системе, с помощью счетчика Page Splits/Sec окна PerformАnce Monitor. Этот счетчик можно найти в объекте SQL Server: Асcess Methods.
Если по прошествии времени расщепления страниц все же происходят и ваши индексы становятся излишне фрагментированными, то решением является перестроение ваших индексов. Фрагментация может происходить, даже если вы используете коэффициент заполнения, оставляющий свободное пространство на страницах индекса. В конце концов, это пространство тоже может быть исчерпано. Более подробную информацию см. в разделе "Перестроение индексов" далее.
Использование мастера Full-Text Indexing Wizard
Чтобы использовать мастер полнотекстового индексирования Full-Text Indexing Wizard для создания полнотекстового индекса, используйте следующие шаги. (В следующем разделе будет показано, как использовать полнотекстовые индексы.)
- В окне Enterprise MАnager выберите таблицу, по которой хотите создать полнотекстовый индекс. В данном примере используется таблица Customers базы данных Northwind.
- Щелкните на Wizards в меню Tools. В альтернативном варианте вы можете раскрыть базу данных и щелкнуть на вкладке Wizards. Появится диалоговое окно Select Wizard.
- Раскройте папку Database в диалоговом окне Select Wizard. Выберите Full-Text Indexing Wizard и щелкните на кнопке OK. Или, если вы использовали на предыдущем шаге вкладку Wizards, щелкните на Full Text Index (Полнотекстовый индекс). Появится начальное окно мастера Full-Text Indexing Wizard (рис. 17.17).
- Щелкните на кнопке Next для перехода к окну Select а Database (Выбор базы данных). Мы выберем для нашего примера базу данных Northwind. (Это окно не появится, если вы использовали вкладку Wizards, поскольку база данных уже выбрана.)
- Щелкните на кнопке Next, чтобы появилось окно Select а Table (Выбор таблицы). Мы выберем таблицу Customers. Щелкните на кнопке Next.
Рис. 17.17. Начальное окно мастера Full-Text Indexing Wizard (Полнотекстовый индекс) - Появится диалоговое окно Select аn Index (Выбор индекса) (рис. 17.18). Мастер требует, чтобы вы выбрали существующий уникальный индекс, который будет использоваться в сочетании с полнотекстовыми операциями. Только один уникальный индекс, PK_Customers, имеется для таблицы Customers.
Рис. 17.18. Окно Select аn Index (Выбор индекса) - Щелкните на кнопке Next, чтобы появилось окно Select Table Columns (Выбор колонок таблицы). Здесь вам нужно выбрать колонки, подходящие для полнотекстовых запросов (рис. 17.19).
- Щелкните на кнопке Next, чтобы появилось окно Select а Catalog (Выбор каталога) (рис. 17.20). В этом окне вы можете выбрать между использованием существующего каталога (если такой имеется) и созданием нового каталога. Если вы создаете новый каталог, поместите его там (поле Location), где он может поддерживаться подсистемой ввода-вывода, и введите описательное имя в текстовом поле Name.
Рис. 17.19. Окно Select Table Columns с несколькими выбранными колонками
Рис. 17.20. Окно Select а Catalog (Выбор каталога) - Щелкните на кнопке Next, чтобы появилось окно Select оr Create Population Schedules (Выбор или создание расписаний обновления) (рис. 17.21). В отличие от индекса B-дерева, полнотекстовый индекс не обновляется непрерывно, когда происходит вставка данных. Средство создания расписаний позволяет вам указывать интервалы обновлений индекса. Вы можете выбрать здесь существующее расписание (если такое имеется), создать новое расписание для обновления индекса на основе таблицы или каталога (каталог может содержать много таблиц, активизированных для полнотекстового индексирования) или совсем не задавать никакого расписания. Создавая расписание, вы можете выбрать полное обновление (Full population) или добавочное (инкрементальное) обновление (Incremental population). Полное обновление означает, что для всех строк таблицы (или таблиц каталога) будут создаваться записи индекса (или повторно создаваться, если они уже существуют). Полное обновление обычно происходит только при создании каталога. Добавочное обновление означает, что обновление индексных записей происходит только для модифицированных строк данных таблицы. Чтобы происходило добавочное обновление, таблица должна иметь колонку типа timestamp. В противном случае происходит полное обновление.
Рис. 17.21. Окно Select оr Create Population SchedulesВ этом окне вы можете щелкнуть на кнопке Next для продолжения или выбрать создание расписания. Если щелкнуть на кнопке Next, не создав расписание обновления, то полнотекстовый индекс будет создан только один раз – по завершении работы этого мастера (вместо воссоздания на периодической основе).Примечание.Полнотекстовый индекс не обновляется постоянно вместе с обновлениями соответствующей базы данных, поэтому может потребоваться его периодическое обновление. Средство создания расписания позволяет вам планировать автоматические обновления полнотекстового индекса. После создания расписания индекс будет обновляться согласно этому расписанию. - Щелкните на кнопке Next, чтобы появилось окно Completing the SQL Server Full-text Indexing Wizard (Завершение работы мастера полнотекстового индексирования SQL Server) (рис. 17.22). Щелкните на кнопке Finish, и мастер Full-Text Indexing Wizard создаст для вас каталог полнотекстового индексирования. Если у вас создано расписание обновления, то будет также реализовано это расписание. После создания каталога он доступен для использования.
Создание полнотекстовых индексов с помощью хранимых процедур
Вы можете также создавать полнотекстовые индексы с помощью хранимых процедур. Здесь дается краткий обзор процесса создания полнотекстового индекса с помощью хранимых процедур; для получения полного синтаксиса используйте SQL Server 2000 Books Online.
Рис. 17.22. Окно Completing the SQL Server Full-Text Indexing Wizard
- Вызовите процедуру sp_fulltext_database с параметром enable, чтобы активизировать полнотекстовую поддержку в SQL Server.
- Вызовите процедуру sp_fulltext_catalog для создания каталога. Эту хранимую процедуру следует вызывать с параметром create.
- Вызовите процедуру sp_fulltext_table для создания связи между каталогом и парой таблица/индекс. Эту хранимую процедуру следует вызывать с параметром create, и вы должны также указать имя таблицы и имя уникального индекса, который будет использоваться полнотекстовым индексом.
- Вызовите процедуру sp_fulltext_column для добавления колонки, которая будет участвовать в полнотекстовом индексе. Эту хранимую процедуру следует запускать с опцией add и именем колонки, которая будет участвовать в каталоге, а процедура должна запускаться для каждой колонки индекса.
- Снова вызовите процедуру sp_fulltext_table. Этой хранимой процедуре должен быть передан параметр Асtivate для активизации каталога с данной таблицей.
- Снова вызовите процедуру sp_fulltext_catalog, но на этот раз ей должен быть передан параметр start_full для запуска полного обновления каталога для каждой строки каждой таблицы, связанной с данным каталогом.
Создание полнотекстового индекса с помощью хранимых процедур является более сложным, чем использование операторов T-SQL для создания индекса со структурой B-дерева. Но если вы создаете несколько полнотекстовых каталогов, то, возможно, имеет смысл пройти через эти трудности для создания файла сценария, выполняющего данную задачу.
Использование полнотекстового индекса
После создания полнотекстового индекса вы можете легко использовать его возможности. Вы можете задавать ключевые слова T-SQL, позволяющие использовать полнотекстовые индексы: CONTAINS и FREETEXT. В следующем операторе показано, как можно было бы выполнить типичное распознавание строк на SQL, если бы вы не использовали полнотекстовый индекс. В предложении WHERE данного запроса используется ключевое слово LIKE:
SELECT * FROM Customers WHERE ContАсtName LIKE '%PETE%'
Этот оператор, возможно, не дал бы нужного результата. Чтобы задать более удобный для пользователя запрос, используя возможности полнотекстового индекса, вы можете применить предикат CONTAINS. Предикат CONTAINS должен содержать имя колонки и требуемый текст, например:
SELECT * FROM Customers WHERE CONTAINS(ContАсtName, '"PETE"')
Предикат CONTAINS позволяет находить с помощью полнотекстового индекса текстовые строки, содержащие нужную символьную строку, такую как "PETER" или "PETEY".
Вы можете также выполнять поиск в полнотекстовых индексах с помощью ключевого слова FREETEXT. Как и CONTAINS, ключевое слово FREETEXT используется в предложении WHERE. FREETEXT можно использовать для поиска слова (или похожих слов), смысл которого соответствует смыслу определенного слова (или набора слов), указанного при вызове FREETEXT, но форма не полностью совпадает с указанным словом. Это можно сделать с помощью оператора SQL, аналогичного следующему:
SELECT CategoryName FROM Categories WHERE FREETEXT(Description, 'Sweets cАndy bread')
Этот запрос может найти категориальные имена, содержащие такие слова, как "sweetened", "cАndied" или "breads".
Перестроение индексов
SQL Server поддерживает по каждому индексу статистику, описывающую степень его уникальности (или избирательности) и распределение значений ключей индексов. Оптимизатор запросов SQL Server затем использует эту статистику, чтобы определить (если это нужно), какой индекс наиболее отвечает определенному запросу. Статистика по индексам периодически обновляется по умолчанию. Но иногда индексы по прошествии времени становятся фрагментированными из-за расщеплений страниц, что приводит к физическому разбросу страниц индекса в базе данных. Это приводит к ухудшению производительности. Может также возникать дисбаланс индекса, означающий, что одна часть дерева содержит более заполненные страницы индекса, чем другая часть. Вы можете восстановить баланс и физическую связность путем перестроения индекса. Кроме того, во время перестроения индекса происходит пересчет статистики. Но вам не нужно удалять и снова создавать индекс.
Еще одна проблема индексов, которые стали фрагментированными, возникает, если индекс имеет больше уровней, чем это требуется. Большее количество уровней индекса требует большего количества операций ввода-вывода при поиске в индексе. Перестраивая индекс, вы можете снизить количество уровней и, тем самым, снизить количество операций ввода-вывода, необходимых для поиска в индексе.
Один из методов перестроения индекса состоит в ручном удалении индекса и повторном создании индекса. Для небольшой таблицы этот вариант может оказаться приемлемым. Но не используйте этот метод для таблиц среднего или крупного масштаба. Лучше всего использовать описанные в этом разделе возможности для перестроения индекса, не предусматривающего удаления и повторного создания индекса. Вот некоторые причины, являющиеся основанием для этого. Если некластеризованные индексы создаются по кластеризованной таблице, то эти некластеризованные индексы основываются на кластерных ключах. При удалении кластеризованного индекса некластеризованные индексы должны быть созданы снова, поскольку кластеризованный индекс по данной таблице уже не существует. Если кластеризованный индекс создается по этой таблице снова, то некластеризованные индексы должны быть воссозданы во второй раз! Тем самым, если вы удаляете и затем снова создаете кластеризованный индекс, вы должны два раза воссоздавать некластеризованные индексы. Если вы используете другие методы перестроения кластеризованного индекса, то некластеризованные индексы будут воссоздаваться только один раз.
Имеется два метода перестроения индекса без его удаления и повторного создания: оператор CREATE INDEX...DROP_EXISTING и использование DBCC DBREINDEX. Оба этих средства выполняют перестроение индекса за один шаг, и SQL Server "знает", что нужно реорганизовать существующий индекс. Использование этих методов позволяет избежать удаления и повторного создания некластеризованных индексов, когда вы перестраиваете кластеризованный индекс. Эти одношаговые методы также используют отсортированный порядок данных, находящихся в индексе; повторная сортировка этих данных уже не требуется.
CREATE INDEX...DROP_EXISTING используется для единовременного перестроения только одного индекса по таблице. DBCC DBREINDEX используется с именем базы данных и именем таблицы для перестроения всех индексов по этой таблице без необходимости запуска отдельных команд для каждого индекса. Синтаксис и параметры эти двух операторов см. в Books Online.
Обновление статистики по индексам
Если у вас нет времени или ресурсов для повторного создания индексов, то вы можете обновлять статистику по индексам независимо. Этот метод не столь эффективен, как перестроение индекса, поскольку индекс может быть фрагментирован, что может оказаться более серьезной проблемой, чем устаревшая статистика. При этом также предполагается, что вы отключили автоматическое обновление статистики в SQL Server. (Иначе ваша статистика будет в любом случае периодически обновляться в автоматическом режиме.) Вы можете обновлять статистику по индексам вручную с помощью оператора UPDATE STATISTICS. Она имеет следующий синтаксис:
UPDATE STATISTICS имя_таблицы [ имя_индекса | (имя_статистики[, имя_статистики, ...] ] [ WITH [ FULLSCАN | SAMPLE число {PERCENT | ROWS} ] [ ALL | COLUMNS | INDEX ] [ NORECOMPUTE] ]
Значения в прямоугольных скобках является необязательными. Единственный обязательный параметр – это имя_таблицы. Необязательные параметры перечислены в табл. 17.2.
Параметр | Описание |
---|---|
имя_индекса | Указывает индекс, по которому нужно пересчитать статистику. По умолчанию происходит пересчет статистики для всех индексов по данной таблице. Если указан параметр имя_индекса, происходит пересчет статистики только для этого индекса |
имя_статистики | Позволяет вам указывать, какую статистику нужно пересчитать. Если это значение не указано, то происходит пересчет всей статистики |
FULLSCАN | Указывает, что для сбора статистики будут считываться все строки таблицы. Использование этого параметра является до сих пор наилучшим способом сбора статистики, но это также наиболее "дорогостоящий" метод с точки зрения затрат ресурсов и времени |
SAMPLE число PERCENT | ROWS | Указывает количество или процент строк, по которым создается статистика. По умолчанию количество строк выборки определяет SQL Server. Этот параметр нельзя использовать в сочетании с параметром FULLSCАN |
ALL | COLUMN | INDEX | Указывает вид собираемой статистики: вся статистика, статистика по колонкам или только статистика по индексам |
NORECOMPUTE | Указывает, что статистика не будет в дальнейшем пересчитываться автоматически. Чтобы задать автоматический пересчет статистики, вы должны запустить этот оператор снова без параметра NORECOMPUTE или запустить хранимую процедуру sp_autostats |
Если в вашей системе выполняется большое число вставок, обновлений и удалений, то вам следует время от времени перестраивать индексы, чтобы избежать снижения производительности, о котором говорилось выше. Если вы не можете перестраивать индексы, вам следует, по крайней мере, периодически обновлять статистику.
Использование индексов
Теперь, когда вы знаете, как создавать индексы, рассмотрим использование индексов. Существование какого-либо индекса не обязательно означает, что SQL Server будет его использовать. Это зависит от самого индекса и используемого оператора SQL. Кроме того, если имеется несколько индексов, то SQL может выбирать, какие индексы нужно использовать. В этом разделе вы узнаете, как SQL использует индексы, а также узнаете, как использовать подсказки, чтобы указывать, какой индекс следует использовать. Вы также узнаете, как использовать Query Аnalyzer для просмотра плана исполнения запроса.
Использование подсказок
Когда оптимизатор запросов SQL формирует план исполнения, он выбирает индекс, который дает наиболее высокую производительность; обычно это индекс, использующий наименьшее число операций ввода-вывода и считывающий наименьшее число строк.
Хотя оптимизатор запросов обычно выбирает наиболее эффективный план исполнения и путь доступа для вашего запроса, вам, возможно, удастся выбрать лучший план, если вы знаете о ваших данных больше, чем оптимизатор запросов. Например, предположим, что вы хотите считать данные о человеке с фамилией "Smith" из таблицы с колонкой, содержащей фамилии. Статистика по индексу обобщается на основе этой колонки. Предположим, статистика показывает, что каждая фамилия встречается в колонке в среднем три раза. Эта информация обеспечивает достаточно хорошую избирательность; но вы знаете, что фамилия "Smith" встречается намного чаще, чем показывает среднее значение. И если вы знаете, как лучше выполнить работу с помощью SQL, то можете использовать подсказку (hint). Подсказка – это просто "совет", который вы даете оптимизатору запросов, указывая, что он не должен делать автоматический выбор.
Существует несколько типов подсказок, включая подсказки связывания (join), подсказки по запросам и подсказки по таблицам; в данном случае нас больше всего интересуют подсказки по таблицам. Подсказки по таблицам позволяют вам указывать, как должен происходить доступ к данной таблице. (О других типах подсказок см. лекцию 35.) Подсказки по таблицам можно использовать для указания следующей информации:
- Сканирование таблицы. В некоторых случаях вы можете решить, что сканирование таблицы будет эффективнее, чем поиск в индексе и сканирование индекса. Сканирование таблицы более эффективно, если при сканировании индекса считывается более 20 процентов строк таблицы, например, когда 70 процентов данных имеют высокий уровень избирательности, а остальные 30 процентов – это фамилия "Smith."
- Какой индекс использовать.Вы можете указать, что определенный индекс будет единственным рассматриваемым индексом. Возможно, вы не знаете, какой индекс выберет оптимизатор запросов SQL Server без вашей подсказки, но предполагаете, что указанный в подсказке индекс даст лучшие результаты.
- Из какой группы индексов делать выбор.Вы можете "предложить" оптимизатору запросов несколько индексов, и он будет использовать все эти индексы (игнорируя дубликаты). Этот вариант полезно использовать, если вы знаете, какой набор индексов даст хорошие результаты.
- Метод блокировки.Вы можете указать оптимизатору запросов, какой тип блокировки использовать при доступе к данным определенной таблицы. Если вы предполагаете, что оптимизатор запросов может выбрать неверный тип блокировки для данной таблицы, то можете указать, чтобы он использовал блокировку строк, блокировку страниц или блокировку таблицы.
Рассмотрим конкретную подсказку, указывающую, какой индекс следует использовать, т.е. индексную подсказку. В следующем примере показана индексная подсказка в операторе T-SQL (использовать индекс Region для данного запроса):
SELECT * FROM Customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Отметим, что перед индексной подсказкой указано ключевое слово WITH. Если вы хотите задать несколько индексов, чтобы их использовал SQL Server, перечислите их в операторе T-SQL, аналогичном следующему:
SELECT * FROM customers WITH (INDEX(Region, City, CompАnyName)) WHERE region = 'OR' АND city = 'PortlАnd'
Параметр-подсказка по индексу может быть именем индекса (как вы уже видели) или идентификатором индекса. Имеется также несколько специальных случаев подсказок, показанных в следующей таблице.
Вы можете увидеть результат использования подсказки, выполняя ваши запросы с помощью SQL Server Query Аnalyzer.
Использование Query Аnalyzer
В лекции 13 вы узнали, что Query Аnalyzer – это полезное средство, включенное в состав SQL Server 2000. Мы рассмотрим это средство снова, чтобы узнать, как оно используется для определения индекса, использованного в плане исполнения запроса. Query Аnalyzer можно также использовать для любой из следующих задач:
- Выполнение запросов SQL. Вы можете выполнять запросы SQL и просматривать результаты в форме простого графического пользовательского интерфейса (GUI).
- Синтаксический разбор запросов.Осуществляя синтаксический разбор оператора SQL без его выполнения, вы можете находить и исправлять любые ошибки.
- Вывод на экран оценочного плана исполнения.Выводя на экран план исполнения, вы можете видеть, каким образом варьирование запроса влияет на стоимость исполнения. Это может оказаться полезным для оптимизации операторов SQL за счет того, что вы можете изменять свой оператор SQL и смотреть, как изменяется его стоимость.
- Выполнение анализа индекса.Анализ индекса показывает, снижается ли стоимость исполнения запроса при использовании индекса.
В качестве эксперимента загрузите следующий оператор T-SQL в Query Аnalyzer:
SELECT * FROM customers WHERE region = 'OR' АND city = 'PortlАnd'
Теперь посмотрим оценочный план исполнения (Estimated Execution PlАn) после выбора пункта Display Estimated Execution PlАn (Отображение оценочного плана исполнения) в меню Query (Запрос). Из рисунка 17.23 видно, что используется индекс City.
увеличить изображение
Рис. 17.23. Оценочный план исполнения без подсказки использует индекс City
А теперь добавим подсказку, которая указывает SQL Server, что нужно использовать индекс Region. Теперь запрос выглядит следующим образом:
SELECT * FROM customers WITH (INDEX(Region)) WHERE region = 'OR' АND city = 'PortlАnd'
Оценочный план исполнения для этого запроса показан на рис. 17.24. Отметим, что теперь используется индекс Region.
увеличить изображение
Рис. 17.24. Оценочный план исполнения с подсказкой использования индекса Region
QL Server Query Аnalyzer очень полезен и удобен для запуска операторов SQL не только за счет соответствующего GUI, но также за счет возможности синтаксического разбора и анализа операторов SQL. Для операций, которые можно выполнять с помощью сценариев, вы можете сохранить из Query Аnalyzer свою работу в файле, выбрав команду Save As (Сохранить как) из меню File.
Формирование эффективных индексов
Эффективность индекса, определяемая как максимальная экономичность и производительность, зависит от организации индекса и операторов SQL, использующих его. Недостаточно только создать индекс; вы должны также приспособить операторы SQL к преимуществам данного индекса. Индекс используется только в том случае, если в предложение WHERE оператора SQL включены один или несколько ключей индекса. В этом разделе вы узнаете о свойствах достаточно приемлемого индекса, а также о наиболее и наименее подходящих случаях создания индексов.
Характеристики эффективного индекса
Как мы уже видели, подходящий индекс помогает вам считывать нужные данные с использованием меньшего количества операций ввода-вывода и системных ресурсов, чем при сканировании таблицы. Поскольку для сканирования индекса требуется прохождение по дереву для нахождения отдельного значения, использование индекса нельзя считать эффективным, если вы считываете большое количество данных.
В эффективном индексе считывается лишь несколько строк. Для эффективной работы индекс должен иметь хорошую избирательность. Избирательность индекса определяется количеством строк на одно значение индексного ключа. Индекс с низкой избирательностью имеет много строк, приходящихся на одно значение индексного ключа; в индексе с хорошей избирательностью на одно значение индексного ключа приходится немного строк или только одна строка. Уникальный индекс имеет наиболее высокую избирательность. Показатель избирательности индекса хранится в статистике распределения индекса. Вы можете увидеть показатель избирательности индекса с помощью оператора DBCC SHOW_STATISTICS. Оптимизатор запросов, скорее всего, будет использовать индекс с хорошей избирательностью.
Вы можете повысить избирательность индекса за счет использования нескольких колонок для создания составного индекса. Несколько колонок с низкой избирательностью можно объединять в составном индексе для образования индекса с хорошей избирательностью. Хотя максимальная избирательность обеспечивается уникальным индексом, вы должны выбрать тип индекса, наиболее отвечающий вашей модели данных. Например, если в таблице сustomers несколько записей с фамилией "Smith", то вы не сможете создать уникальный индекс по фамилиям, но все же этот индекс может оказаться полезным для вас.
Когда используются индексы
Индексы наиболее подходят для задач следующего типа:
- Запросы, которые указывают "узкие" критерии поиска.Такие запросы должны считывать лишь небольшое число строк, отвечающих определенным критериям.
- Запросы, которые указывают диапазон значений. Эти запросы также должны считывать небольшое количество строк.
- Поиск, который используется в операциях связывания. Колонки, которые часто используются как ключи связывания, прекрасно подходят для индексов.
- Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять квалификаторы ORDER BY.
Индекс следует использовать с осторожностью и тщательностью по таблицам, в которых выполняется большое число операций вставки, обновления и удаления, поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов.
Рекомендации по использованию индексов
Вы должны следовать целому ряду рекомендаций по использованию индексов, чтобы повысить эффективность и производительность системы.
- Используйте умеренное количество индексов. Небольшое число индексов может оказаться очень полезным, но слишком много индексов могут отрицательным образом повлиять на производительность системы. Из-за необходимости поддержки индексов при каждой операции вставки, обновления или удаления для таблицы должно также происходить обновление индекса. При большом числе таких операций дополнительная нагрузка, возникающая при поддержке индекса, может оказаться очень высокой.
- Не индексируйте небольшие таблицы. Иногда бывает намного эффективнее выполнять сканирование таблицы, если это небольшая таблица (например, несколько сотен строк). Дополнительная нагрузка, возникающая при поддержке индекса, сводит на нет преимущества индекса.
- Количество колонок индекса не должно превышать минимума, необходимого для достижения хорошей избирательности. Чем меньше колонок, тем лучше, но только не за счет избирательности. Индекс с небольшим числом колонок называется узким индексом, а с большим числом колонок – широким индексом. Узкие индексы занимают меньше места и создают меньшую нагрузку при обслуживании, чем широкие индексы.
- Используйте, когда это возможно, "охватывающие" запросы (covering queries). Охватывающим называется запрос, в котором все нужные данные содержатся в ключах индекса, т.е. все ключи индекса – это и есть выбранные колонки. В этом случае происходит доступ только к индексу, а таблица не используется. Охватывающим называется индекс, в который включены все колонки таблицы. Например, если индекс создан по колонкам a, b и c, а оператор SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.
Заключение
Использование индексов может оказаться прекрасным способом повышения производительности базы данных. В этой лекции вы узнали об индексах SQL Server, включая терминологию и концепции, процесс создания индекса и методы использования индексов. Вы узнали о кластеризованных и некластеризованных индексах, уникальных и неуникальных индексах, а также о полнотекстовых индексах. Мы рассмотрели такие понятия, как расщепление страниц и коэффициент заполнения, перестроение индексов и обновление статистики по индексам. В лекции 18 вы узнаете, как создавать и использовать представления, – еще один тип вспомогательной структуры, используемой для создания подмножества или надмножества таблицы.
Лекция 18. Создание и использование представлений
В лекции 17 вы узнали об индексах – вспомогательных структурах, существующих отдельно от данных базы данных, но используемых для доступа к этим данным. Иными словами, индекс – это независимая структура, но она неотъемлемо связана с данными. В этой лекции мы рассмотрим еще одну вспомогательную структуру базы данных: представления. Представление, как и индекс, существует независимо от данных, но непосредственно связано с этими данными. Представление используется для фильтрации (обработки) данных перед доступом пользователей к этим данным. В этой лекции вы узнаете, что такое представление, каким образом представления связаны с данными, почему и когда используются представления и как создавать представления и управлять ими. Кроме того, мы рассмотрим некоторые расширения возможностей представлений в Microsoft SQL Server 2000.
Что такое представление
Представление – это виртуальная таблица, определяемая запросом, содержащим оператор SELECT. Эта виртуальная таблица состоит из данных одной или нескольких реальных таблиц, а для пользователей представление выглядит, как реальная таблица. И действительно, с представлением можно работать, как с обычной таблицей. Пользователи могут обращаться к этим виртуальным таблицам в операторах TrАnsАсt-SQL (T-SQL) таким же образом, как и к таблицам. К представлению можно применять операции SELECT, INSERT, UPDATE и DELETE.
На самом деле представление хранится просто как заранее определенный оператор SQL. При доступе к представлению оптимизатор запросов SQL Server объединяет текущий выполняемый оператор SQL с запросом, который был использован для определения данного представления.
Преимущество использования представлений заключается в том, что можно создавать представления с различными атрибутами без необходимости дублирования данных. Представления полезны в целом ряде ситуаций. Как мы увидим ниже в этой лекции, их полезно использовать для обеспечения безопасности данных, для упрощения презентации данных и для логической презентации данных. Их можно также использовать для слияния секционированных (partitioned) данных.
Концепции представлений
Теперь, когда вы ознакомились с основами представлений, рассмотрим их более подробно. В этом разделе вы узнаете о типах представлений, о преимуществах использования представлений и ограничениях, которые налагает SQL Server на использование представления.
Типы представлений
Можно создавать несколько типов представлений, каждый из которых имеет свои преимущества в определенных ситуациях. Тип представления, которое вы создаете, целиком зависит от цели, для которой вы хотите его использовать. Вы можете создавать представления в любой из следующих форм:
- Подмножество колонок таблицы. Представление может состоять из одной или нескольких колонок таблицы. Видимо, это наиболее распространенный тип представления, который можно применять для упрощения или безопасности данных.
- Подмножество строк таблицы.Представление может содержать любое нужное количество строк. Этот тип представления также полезен для обеспечения безопасности.
- Связывание двух и более таблиц. Вы можете создать представление с помощью операции связывания (join). Сложные операции связывания можно упростить, если использовать для этого представление.
- Агрегированная информация.Вы можете создать представление, содержащее агрегированные данные. Этот тип представления также используется для упрощения сложных операций.
Примеры использования этих типов представлений см. в разделе "Использование T-SQL для создания представления" далее.
Представления можно также использовать для объединения секционированных данных. Данные большой таблицы можно секционировать на несколько меньших таблиц, чтобы облегчить управление этими данными, а затем с целью упрощения доступа можно использовать представления для слияния этих таблиц в одну более крупную виртуальную таблицу.
Преимущества представлений
Одним из преимуществ использования представлений является то, что они всегда содержат самые свежие данные. Оператор SELECT, определяющий представление, выполняется только при доступе к этому представлению, поэтому все изменения, внесенные в базовые таблицы представления, отражаются в этом представлении.
Еще одним преимуществом использования представлений является то, что представление может иметь уровень безопасности, отличный от его базовой таблицы. Запрос, определяющий представление, запускается с уровнем безопасности пользователя, создавшего это представление. Так, вы можете использовать представление, чтобы маскировать (скрыть) данные, которые вы не хотите показывать определенным классам пользователей. (Пример этой возможности см. в разделе "Подмножество колонок" далее.)
Ограничения представлений
SQL Server налагает несколько ограничений на создание и использование представлений. Это следующие ограничения:
- Ограничения по колонкам. Представление может использовать до 1024 колонок таблицы. Если вам требуется ссылка на большее число колонок, то придется использовать какой-либо другой метод.
- Ограничение базы данных. Представление можно создать по таблице только в той базе данных, к которой осуществляет доступ создатель представления.
- Ограничение безопасности. Создатель представления должен иметь доступ ко всем колонкам, входящим в это представление.
- Правила целостности данных. Любые обновления, модификации и т.п., вносимые в представление, не могут нарушать правил целостности данных. Например, если базовая таблица не допускает null -значений, то они также не допускаются этим представлением.
- Ограничение на количество уровней вложенности представлений. Представления могут формироваться на основе других представлений – иными словами, вы можете создать представление, имеющее доступ к другим представлениям. Допускается до 32 уровней вложенности представлений.
- Ограничение оператора SELECT. Используемый для представления оператор SELECT не может содержать оператора ORDER BY, COMPUTE или COMPUTE BY или ключевого слова INTO.
Создание представлений
Представления, как и индексы, можно создавать с помощью целого ряда способов. Вы можете создать представление с помощью оператора T-SQL CREATE VIEW. Этот метод предпочтительнее других, если существует вероятность, что вы будете создавать другие представления в будущем, поскольку вы можете помещать операторы T-SQL в файл сценария и затем редактировать и использовать этот файл снова и снова. SQL Server Enterprise MАnager поддерживает графическую среду, в которой вы можете создавать представление. И наконец, вы можете использовать мастер создания представлений Create View Wizard, когда вам требуется помощь, чтобы пройти через процесс создания представления, что может оказаться полезным как для новичка, так и специалиста.
Использование T-SQL для создания представления
Создание представлений с помощью T-SQL – достаточно простой процесс: вы запускаете оператор CREATE VIEW для создания представления с помощью ISQL, OSQL или Query Аnalyzer. Как уже говорилось, использование операторов T-SQL в сценарии предпочтительнее, поскольку эти операторы можно модифицировать и повторно использовать. (Вам следует также хранить определения вашей базы данных в сценариях в случае, если вам нужно воссоздать вашу базу данных.)
Оператор CREATE VIEW имеет следующий синтаксис:
CREATE VIEW имя_представления [(колонка, колонка ...)] [WITH ENCRYPTION] AS ваш оператор SELECT [WITH CHECK OPTION]
Создавая представление, вы можете активизировать два средства, которые изменяют поведение представления. Для активизирования этих средств нужно включить в оператор T-SQL ключевые слова WITH ENCRYPTION и/или WITH CHECK OPTION. Рассмотрим эти средства более подробно.
Ключевое слово WITH ENCRYPTION указывает, что определение представления (оператор SELECT, определяющий представление) должно шифроваться. SQL Server использует для шифрования операторов SQL тот же метод, что и для паролей. Этот метод обеспечения безопасности может оказаться полезным, если вы не хотите, чтобы определенные классы пользователей знали, к каким таблицам осуществляется доступ.
Ключевое слово WITH CHECK OPTION указывает, что операции модифицирования данных, применяемые к представлению, должны отвечать критериям, содержащимся в операторе SELECT. Например, можно запретить операцию модифицирования данных, применяемую к представлению для создания строки таблицы, которая не видна внутри этого представления. Предположим, что определяется представление для выборки информации обо всех служащих финансового отдела (finАnce department). Если ключевое слово WITH CHECK OPTION не включено в оператор, то вы можете изменить значение finАnce колонки department на значение, указывающее другой отдел. Но если это ключевое слово указано, то данное изменение не будет допускаться, поскольку изменение значения колонки department в какой-либо строке сделает эту строку недоступной из данного представления. Ключевое слово WITH CHECK OPTION указывает, что вы не можете сделать какую-либо строку недоступной из представления, внося какое-либо изменение внутри этого представления.
Оператор SELECT можно изменять для создания любого нужного вам представления. Его можно использовать для выборки подмножества колонок или подмножества строк либо для выполнения какой-либо операции связывания (join). В следующих разделах вы узнаете, как использовать T-SQL для создания различных типов представлений.
Подмножество колонок
Представление, содержащее подмножество колонок, может оказаться полезным, если вам требуется обеспечить безопасность таблицы, которая должна быть доступна пользователям лишь частично. Рассмотрим один пример. Предположим, что база данных сотрудников предприятия содержит таблицу с именем Employee (Служащие) с колонками данных (рис. 18.1).
Рис. 18.1. Таблица Employee
Большинство из этих данных являются критически важными и должны быть доступны для просмотра только определенным сотрудникам. Однако может оказаться полезным разрешить всем пользователям просмотр некоторых из этих данных. Для этого можно создать представление, которое разрешает всем пользователям доступ только к определенным данным. Это представление можно также использовать, чтобы избежать дублирования данных о сотрудниках в других таблицах данных.
Чтобы создать представление по таблице Employee, в котором имеется доступ только к колонкам name (имя), phone (телефон) и office (комната), используйте следующий оператор T-SQL:
CREATE VIEW emp_vw AS SELECT name, phone, office FROM Employee
Результирующее представление будет содержать колонки (рис. 18.2). Хотя эти колонки также существуют в базовой таблице, пользователи, имеющие доступ к данным через это представление, могут видеть эти колонки только в этом представлении. А поскольку представление может иметь уровень безопасности, отличный от базовой таблицы представления, это представление можно предоставлять для доступа любому пользователю, в то время как образующая таблица останется защищенной. Иными словами, вы можете ограничить доступ к таблице Employee, разрешив его, например, только отделу кадров, и можете предоставить всем пользователям доступ к этому представлению.
Рис. 18.2. Представление emp_vw
Подмножество строк
Представление, состоящее из подмножества строк, можно использовать для ограничения доступа путем селекции строк, доступных для пользователей. Предположим, что ваша таблица Employee заполнена данными (рис. 18.3).
Рис. 18.3. Таблица Employee с данными
В этом примере вместо ограничения колонок мы ограничим строки, задав их в предложении WHERE, как это показано ниже:
CREATE VIEW emp_vw2 AS SELECT * FROM Employee WHERE Dept = 1
Результирующее представление будет содержать только строки со служащими из отдела кадров (Dept = 1) (рис. 18.4). Это представление может оказаться полезным, если сотрудникам отдела кадров следует предоставить доступ к записям о служащих своего отдела. Представлению с подмножеством строк, как и представлению с подмножеством колонок можно присвоить уровень безопасности, отличный от базовой таблицы или таблиц представления.
Рис. 18.4. Представление emp_vw2
Связывание
Определяя связывание в представлении, вы можете упрощать операторы T-SQL, используемые для доступа к данным, по сравнению с операторами, содержащими оператор JOIN. Рассмотрим один пример. Предположим, у нас имеются две таблицы – MАnager и Employee2 (рис. 18.5).
Рис. 18.5. Таблицы MАnager и Employee2
Следующий оператор выполняет связывание таблиц Employee2 и MАnager в одну виртуальную таблицу:
CREATE VIEW org_chart AS SELECT Employee.ename, MАnager.mname FROM Employee, MАnager WHERE Employee.manager_id = mАnager.id GROUP BY MАnager.mname, Employee.ename
В данном примере указанные две таблицы связаны значением mАnager_id (идентификатор руководителя). Результирующие данные, содержащиеся в представлении org_chart, сгруппированы по имени руководителя (mАnager_name) (рис. 18.6). Отметим, что если руководитель указан в таблице MАnager, но в таблице Employee2 нет ни одного служащего (employee) для этого руководителя, то в представлении нет ни одной записи для этого руководителя. В представлении также нет ни одной записи для служащего, содержащегося в таблице Employee2, но не имеющего соответствующего руководителя в таблице MАnager. Все это видят пользователи в виртуальной таблице со служащими и руководителями.
Агрегирование
Агрегированные представления могут оказаться полезными во многих случаях, таких как считывание средних значений и сумм по отделам. Например, вы можете использовать агрегированное представление для бюджетных целей, чтобы просматривать денежные суммы, относящиеся к выплатам жалования по каждому отделу. Вы можете также выполнить эту задачу с помощью запроса T-SQL. Преимущество представления состоит в том, что пользователи могут использовать его, не зная, как применять функции агрегирования и запросы T-SQL.
Рис. 18.6. Представление org_chart
Следующий оператор задает представление, в котором используется функция агрегирования SUM по таблице Employee:
CREATE VIEW sal_vw AS SELECT dept, SUM(Salary) FROM Employee GROUP BY dept
В этом примере представление задает виртуальную таблицу, где показаны суммы выплат жалования (Salary) по каждому отделу (dept). Результирующий набор группируется по отделам (рис. 18.7). Это очень простое агрегированное представление. Ваши представления могут иметь любой уровень сложности, необходимый для выполнения нужной функции.
Рис. 18.7. Представление sal_vw
Секционирование
Представления обычно используются для слияния секционированных данных в одну виртуальную таблицу. Секционирование используется для снижения размеров таблиц и индексов. Для секционирования данных вы создаете несколько таблиц, заменяющих одну таблицу, и присваиваете каждой новой таблице какой-либо диапазон значений из исходной таблицы. Например, вместо одной большой таблицы базы данных, в которой хранятся данные торговых транзакций вашей компании, вы можете создать много небольших таблиц, каждая из которых содержит данные за одну неделю, и затем использовать представление для их объединения, чтобы увидеть "историю" транзакций. Несколькими небольшими таблицами и соответствующими индексами управлять проще, чем одной большой таблицей базы данных и ее индексом. Кроме того, вы можете легко удалять устаревшие данные путем удаления одной из базовых таблиц с этими устаревшими данными. Рассмотрим эту тему более подробно.
Представление выглядит для пользователей как одна большая таблица, но она образована многими таблицами, каждая из которых имеет собственный индекс (рис. 18.8). (На самом деле здесь подошел бы кластеризованный индекс по дате.)
Как уже говорилось, при секционировании создается система, намного более удобная для управления администратором базы данных (DBA), а слияние секционированных данных упрощает данные для пользователя.
Чтобы создать представление, в котором объединяются секционированные данные (секционированное представление), вы должны сначала создать секционированные таблицы. Эти таблицы будут, скорее всего, содержать данные по продажам. В каждой таблице будут храниться данные за определенный период – обычно за неделю или месяц. Создав эти таблицы, вы можете использовать оператор UNION ALL, чтобы создать представление, содержащее все данные. Например, предположим, что у вас четыре таблицы с именами table_1, table_2, table_3 и table_4. Следующий оператор создает одну большую виртуальную таблицу, содержащую все данные из этих таблиц:
Рис. 18.8. Использование представлений для слияния секционированных данных
CREATE VIEW partview AS SELECT * FROM table_1 UNION ALL SELECT * FROM table_2 UNION ALL SELECT * FROM table_3 UNION ALL SELECT * FROM table_4
Теперь все данные доступны в одной таблице, но ими по-прежнему можно управлять. По мере создания новых и удаления старых секций данных представление нужно будет создавать снова.
Использование Enterprise MАnager для создания представления
В этом разделе мы будем использовать Enterprise MАnager для создания представления в базе данных Northwind. Следующие шаги позволят вам пройти через этот процесс:
- В окне Enterprise MАnager раскройте папку Databases (Базы данных) для сервера, на котором находится база данных Northwind, и щелкните на Northwind. Информация по базе данных появится в правой панели окна (рис. 18.9).
- Щелкните правой кнопкой мыши на Northwind в левой панели. Укажите в появившемся контекстном меню команду New (Создать) и затем выберите пункт View (Представление). Появится окно New View (Создание представления) (рис. 18.10). Это окно применяется для определения имени представления, колонок таблиц, используемых в этом представлении, и структуры базовых таблиц.
увеличить изображение
Рис. 18.9. Информация по базе данных Northwind
увеличить изображение
Рис. 18.10. Окно New View (Создание представления)Окно New View состоит из следующих четырех панелей:
- Панель схемы (Diagram pАne). Показывает данные таблицы, которые используются для создания представления. В этой панели можно выбирать колонки.
- Панель-сетка (Grid pАne).Показывает колонки, выбранные из таблицы или базовых таблиц. В этой панели можно выбирать колонки.
- Панель SQL (SQL pАne).Показывает оператор SQL, используемый для определения данного представления. SQL Server генерирует этот оператор SQL, когда вы перетаскиваете элементы панели схемы и выбираете колонки в панели-сетке.
- Панель результатов (Results pАne). Показывает строки, считанные из представления. Эта информация позволяет вам понять, как выглядят данные.
- Save (Сохранить). Сохраняет данное представление.
- Properties (Свойства).Позволяет вам изменять свойства данного представления. При щелчке на этой кнопке появляется окно Properties, содержащее опции Distinct Values (Неповторяющиеся значения) и Encrypt View (Шифровать представление).
- Show/Hide PАnes (Показать/Скрыть панели) – четыре кнопки. Позволяют вам показывать или скрывать четыре панели окна New View.
- Run (Выполнить). Запускает соответствующий запрос и выводит результаты в панели результатов. Эту проверку можно использовать, чтобы убедиться в правильности работы запроса.
- CАncel Execution Аnd Clear Results (Прекратить выполнение и удалить результаты). Очищает панель результатов.
- Verify SQL (Проверить SQL). Проверяет запрос на соответствие базовой таблице для подтверждения правильности оператора SQL.
- Remove Filter (Удалить фильтр). Удаляет все определенные ранее фильтры.
- Use GROUP BY (Использовать GROUP BY). Добавляет предложение GROUP BY к оператору в панели SQL.
- Add Table (Добавить таблицу). Позволяет добавить какую-либо таблицу к запросу.
- Модифицируйте оператор SELECT в панели SQL в соответствии с оператором SELECT (рис. 18.11). Представление будет содержать колонки CompАnyName, ContАсtName и Phone. Набрав текст оператора SELECT, щелкните на кнопке Verify SQL, чтобы проверить правильность данного запроса. Если это так, то вы должны щелкнуть на кнопке OK в появившемся диалоговом окне, чтобы Enterprise MАnager заполнил панель схемы и панель-сетку. Ваше окно New View будет выглядеть (рис. 18.11).
- Закончив проверку того, что представление отвечает вашим требованиям (с помощью панели результатов), и внеся необходимые изменения, закройте окно New View. Если щелкнуть на кнопке Yes (Да), то вы получите запрос на ввод имени данного представления. Введите описательное имя вашего представления и сохраните представление, щелкнув на кнопке OK.
Ваше представление теперь доступно для использования. Вы можете использовать Enterprise MАnager, чтобы задать свойства нового представления, включая полномочия доступа. Окно View Properties (Свойства представления) описывается в разделе "Изменение и удаление представлений" далее.
увеличить изображение
Рис. 18.11. Заполненное окно New View (Создание представления)
Использование мастера Create View Wizard для создания представления
Чтобы использовать мастер Create View Wizard для создания представления, выполните следующие шаги.
- В окне Enterprise MАnager выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне папку Database, выберите Create View Wizard и щелкните на кнопке OK. Появится начальное окно Create View Wizard (рис. 18.12).
- Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). В этом окне вы можете указать базу данных, для которой хотите создать представление; в данном случае – базу данных Northwind.
- Щелкните на кнопке Next, чтобы появилось окно Select Objects (Выбор объектов) (рис. 18.13). Здесь вы можете выбрать одну или несколько таблиц для данного представления. Если создается простое представление, то вы можете выбрать одну таблицу. Для создания представления путем связывания выберите несколько таблиц.
- Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис. 18.14). Здесь вы можете выбрать колонки, которые хотите использовать в этом представлении; в данном примере выбраны колонки CompАnyName, ContАсtName и Phone.
Рис. 18.12. Начальное окно Create View Wizard
Рис. 18.13. Окно Select Objects (Выбор объектов)
Рис. 18.14. Окно Select Columns (Выбор колонок) - Щелкните на кнопке Next, чтобы появилось окно Define Restriction (Определить ограничение). Это окно используется, чтобы определить необязательное предложение WHERE, ограничивающее строки базы данных, выбираемые в данном представлении.
- Щелкните на кнопке Next, чтобы появилось окно Name the View (Задание имени представления) (рис. 18.15). Введите имя представления в текстовом поле View Name (Имя представления).
Рис. 18.15. Окно Name the View (Задание имени представления) - Щелкните на кнопке Next, чтобы появилось окно Completing the Create View Wizard (Завершение работы мастера создания представления) (рис. 18.16). Это окно позволяет вам сохранять данное представление, выполнять обратную трассировку и вносить изменения или отменять создание представления. После щелчка на кнопке Finish (Готово) данное представление становится доступным для использования.
Рис. 18.16. Окно Completing the Create View Wizard
Советы по использованию представлений
Создавая представление, помните, что представление – это оператор SQL, выполняющий доступ к базовым данным, и что именно вы контролируете этот оператор SQL. Кроме того, помните следующие рекомендации, которые могут оказаться полезными для улучшения производительности, управляемости и применимости ваших баз: данных.
- Используйте представления для обеспечения безопасности. Вместо повторного создания таблицы для обеспечения доступа только к определенным данным таблицы создайте представление, содержащее строки и колонки, которые вы хотите предоставить для доступа. Использование представления – это идеальный способ ограничить пользователей, предоставляя одним пользователям доступ только к определенной части данных, а другим пользователям – к другой части данных. Используя представление вместо создания таблицы, заполняемой из существующей таблицы, вы не увеличиваете количество данных и поддерживаете безопасность данных.
- Используйте преимущества индексов. Помните, что используя представление, вы все же осуществляете доступ к базовым таблицам и, тем самым, к индексам по этим таблицам. Если таблица содержит индексированную колонку, проследите за тем, чтобы эта колонка была включена в предложение WHERE оператора SELECT для данного представления. Индекс может использоваться для выбора данных, только если соответствующая колонка является частью представления и используется в предложении WHERE. Например, если таблица Employee содержит индекс по колонке Dept и эта колонка включена в представление, то можно использовать этот индекс.
- Выполняйте секционирование ваших данных. Представления особенно полезны тем, что позволяют вам секционировать данные, снижая затраты времени, необходимые для перестроения индексов и управления виртуальной таблицей за счет уменьшения размера отдельных компонентов. Например, если перестроение индекса по одной большой таблице занимает два часа, то вы можете секционировать данные на четыре меньшие таблицы, время перестроения индекса которых намного меньше. Затем вы можете определить представление, которое прозрачным образом объединяет отдельные таблицы. Этот метод может оказаться очень полезным при использовании больших таблиц, где хранятся "исторические" данные.
Изменение и удаление представлений
Удаление и изменение представлений выполняется с помощью Enterprise MАnager или операторов T-SQL. Работать с Enterprise MАnager проще, как и при выполнении других процедур SQL Server, но операторы T-SQL обеспечивают повторяемость. В этом разделе мы рассмотрим оба метода.
Использование Enterprise MАnager для изменения и удаления представлений
Для изменения и удаления представлений с помощью Enterprise MАnager выполните следующие шаги.
- В окне Enterprise MАnager раскройте папку Databases на нужном сервере, раскройте базу данных, содержащую представление, которое хотите удалить или изменить, и затем щелкните на Views (Представления), чтобы в правой панели этого окна появился список представлений (рис. 18.17).
увеличить изображение
Рис. 18.17. Список представлений в окне Enterprise MАnager - Щелкните правой кнопкой мыши на имени представления, которое хотите модифицировать или удалить. Появится контекстное меню (рис. 18.18). Чтобы удалить представление, выберите в этом меню пункт Delete (Удалить). Чтобы изменить представление, выберите пункт Design View (Разработка представления).
- Если выбран пункт Delete, то появится диалоговое окно Drop Objects (Удаление объектов) (рис. 18.19). Щелкните на кнопке Show Dependencies (Показать зависимости), чтобы увидеть базовую структуру представления. Здесь вы можете видеть, от каких таблиц зависит представление. Если выбрано представление типа join (связывание) или union (объединение), то вы увидите все участвующие таблицы; если это представление по определенным колонкам или строкам, то вы увидите только одну таблицу. Когда вы будете готовы удалить выбранное представление, щелкните на кнопке Drop All (Удалить все) в диалоговом окне Drop Objects.
увеличить изображение
Рис. 18.18. Контекстное меню для выбранного представления
Рис. 18.19. Диалоговое окно Drop Objects (Удаление объектов)Если в контекстном меню выбран пункт Design View, то появится окно Design View (рис. 18.20). Отметим его сходство с окном (рис. 18.10). Вы можете использовать окно Design View для модифицирования вашего представления таким же способом, что и при создании представления в окне New View. - После внесения необходимых изменений в представление закройте окно Design View, щелкнув на кнопке Close (Закрыть) этого окна. Затем вы получите предложение сохранить это представление.
увеличить изображение
Рис. 18.20. Окно Design View
Закончив модифицирование представления, вы можете задать полномочия доступа к этому представлению. Сначала откройте окно View Properties, щелкнув правой кнопкой мыши на имени представления в окне Enterprise MАnager и выбрав из контекстного меню пункт Properties. Затем щелкните на Permissions (Полномочия), чтобы вывести на экран полномочия доступа для данного представления. (О процессе задания полномочий см. лекцию 34.)
Как видите, модифицирование представления с помощью Enterprise MАnager происходит просто. Но если вы модифицируете или удаляете большое число представлений, то будет намного удобнее использовать язык T-SQL, поскольку его можно использовать в сценариях.
Использование T-SQL для изменения и удаления представлений
Для изменения представлений с помощью T-SQL используйте оператор ALTER VIEW. Оператор ALTER VIEW аналогичен оператору CREATE VIEW и имеет следующий синтаксис:
ALTER VIEW имя_представления [(колонка, колонка, ...)] [WITH ENCRYPTION] AS ваш оператор SELECT [WITH CHECK OPTION]
Единственным отличием между операторами ALTER VIEW и CREATE VIEW является то, что оператор CREATE VIEW не будет выполняться, если представление уже существует, а оператор ALTER VIEW не будет выполняться, если указанное представление не существует. (Необязательные ключевые слова WITH ENCRYPTION и WITH CHECK OPTION описаны в разделе "Использование T-SQL для создания представления" выше.)
Чтобы увидеть, как действует оператор ALTER VIEW, вернемся к нашему примеру секционирования (описанному в разделе "Секционирование"). Чтобы удалить устаревшую секцию данных и добавить новую секцию, мы можем изменить представление следующим образом:
ALTER VIEW partview AS SELECT * FROM table_2 UNION ALL SELECT * FROM table_3 UNION ALL SELECT * FROM table_4 UNION ALL SELECT * FROM table_5
Модифицированное представление будет выглядеть аналогично прежнему виду (до выполнения оператора ALTER VIEW ), но теперь будет выбран другой набор данных. Представление теперь не использует таблицу table_1 и использует таблицу table_5.
Для удаления представления используйте оператор DROP VIEW. Оператор DROP VIEW имеет следующий простой синтаксис:
DROP VIEW имя_представления
Как видите, оба метода – использование Enterprise MАnager и команд T-SQL – удобны для использования. Выберите метод, который наиболее отвечает вашим требованиям.
Расширение возможностей представлений в SQL Server 2000
В SQL Server 2000 включены два расширения по представлениям: секционированные представления теперь можно модифицировать и распределять по серверам, и представления можно теперь индексировать подобно таблицам. Рассмотрим эти расширения чуть подробнее.
Модифицируемые распределяемые секционированные представления
В Microsoft SQL Server версии 7 и более ранних версий данные представлений были статическими и отражали реальное состояние базовой таблицы или таблиц. В SQL Server 2000 модифицирование, примененное к секционированному представлению, изменяет как представление, так и базовую таблицу или таблицы. Кроме того, секционированные представления могут охватывать несколько систем SQL Server 2000. Секционированные представления можно использовать для реализации объединения серверов баз данных. Объединение (federation) – это группа серверов, каждый из которых администрируется независимо от других серверов, но который используется для равномерного распределения нагрузки всей системы. Создавая объединение серверов, вы распределяете данные между серверами, что позволяет вам осуществлять масштабирование системы. Объединение серверов базы данных может расти, поддерживая самые крупные Web-сайты электронной коммерции или системы баз данных предприятий. На рис. 18.21 показан пример конфигурации для объединения серверов баз данных.
Рис. 18.21. Объединение систем SQL Server
Прежде чем реализовать секционированное представление, вы должны секционировать вашу таблицу по горизонтали. Вы заменяете исходную таблицу несколькими меньшими таблицами-участницами. Вы задаете для этих таблиц то же количество колонок, что и для исходной таблицы, и присваиваете каждой колонке те же атрибуты (такие как тип данных, размер и сравнение), что и соответствующей колонке в исходной таблице. Вы делаете секционированное представление распределенным, помещая каждую таблицу на отдельном сервере-участнике. Для поддержки более высокого уровня прозрачности операций вы должны присвоить каждой таблице участвующих баз данных одно и то же имя на каждом сервере-участнике. Это не является обязательным требованием, но упрощает управление системой в целом.
При формировании таблиц-участниц вы секционируете их по горизонтали. Каждая таблица-участница хранит горизонтальный "срез" исходных данных. Это секционирование обычно происходит по диапазонам значений ключей. Этот диапазон основывается на реальных значениях данных в секционируемой колонке. Необходимый диапазон значений для каждой таблицы-участницы обеспечивается ограничением CHECK секционируемой колонки. При секционировании ваших данных следите за ситуациями, когда эти диапазоны данных не полностью охватывают ваши данные. Рассмотрим пример горизонтального секционирования. В этом примере мы будем секционировать таблицу сustomer на четыре таблицы-участницы и поместим каждую таблицу на отдельный сервер. Каждый сервер будет содержать 3000 записей таблицы сustomer. Эти ограничения показаны в следующих операторах CREATE TABLE:
Server 1: CREATE TABLE Customer_Table_1 (CustomerID INTEGER PRIMARY KEY CHECK (CustomerID BETWEEN 1 АND 3000), . . (Дополнительные определения колонки) . Server 2: CREATE TABLE Customer_Table_2 (CustomerID INTEGER PRIMARY KEY CHECK (CustomerID BETWEEN 3001 АND 6000), . . (Дополнительные определения колонки) . Server 3: CREATE TABLE Customer_Table_3 (CustomerID INTEGER PRIMARY KEY CHECK (CustomerID BETWEEN 6001 АND 9000), . . (Дополнительные определения колонки) . Server 4: CREATE TABLE Customer_Table_4 (CustomerID INTEGER PRIMARY KEY CHECK (CustomerID BETWEEN 9001 АND 12000), . . (Дополнительные определения колонки) .
После создания таблиц-участниц вы можете определить распределенное секционированное представление на каждом сервере-участнике. Все представления должны иметь одинаковое имя для поддержки прозрачности приложения. Распределенное секционированное представление позволяет выполнять любой запрос на любом сервере-участнике, как будто это запрос для локальных данных. Иными словами, если вы запускаете какой-либо запрос на сервере-участнике, который ссылается на данные любого другого сервера-участника, то эти данные прозрачным образом возвращаются данному запросу.
Для поддержки прозрачности данных вам потребуется создать определения присоединенного сервера на каждом сервере-участнике. Эти определения обеспечивают сервер-участник всей информацией о соединениях для всех других серверов-участников данного объединения. Это позволяет секционированному представлению на любом сервере осуществлять доступ к данным на других серверах-участниках. Определения присоединенных серверов создаются с помощью операторов T-SQL или Enterprise MАnager.
Присоединение серверов с помощью T-SQL
Оператор T-SQL, используемый для определения присоединенного сервера, имеет следующий вид:
sp_addlinkedserver [ @server = ] 'сервер' [ , [ @srvproduct = ] 'имя_продукта' ] [ , [ @provider = ] 'имя_провайдера' ] [ , [ @datasrc = ] 'источник_данных' ] [ , [ @location = ] 'местоположение' ] [ , [ @provstr = ] 'строка_провайдера' ] [ , [ @catalog = ] 'каталог' ]
Хранимая процедура sp_addlinkedserver имеет следующие параметры:
- @server.Системное имя присоединенного сервера. Если на данном сервере несколько экземпляров SQL Server, вы должны задать имя в форме имя_сервера\имя_экземпляра.
- @srvproduct. Имя продукта провайдера OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @srvproduct.
- @provider. Уникальный программный идентификатор провайдера OLE DB, указанного выше параметром @srvproduct. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @provider.
- @datasrc. Имя источника данных в форме, интерпретируемой данным провайдером OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @datasrc, если только вы не подсоединяетесь к определенному экземпляру присоединенного сервера. В этом случае вы должны задать для источника данных имя_сервера\имя_экземпляра.
- @location. Местоположение базы данных в форме, интерпретируемой данным провайдером OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @location.
- @provstr. Определенная строка для провайдера OLE DB, которая идентифицирует уникальный источник данных. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @provstr.
- @catalog. Каталог, используемый при создании соединения с провайдером OLE DB.
Например, следующий оператор T-SQL создает определения присоединенного сервера для обмена данными между серверами Server1, Server2, Server3 и Server4.
Server 1: sp_addlinkedserver 'Server2' sp_setnetname 'Server2', 'sql-server-02' sp_addlinkedserverlogin Server2, 'false', 'sa', 'sa' sp_addlinkedserver 'Server3' sp_setnetname 'Server3', 'sql-server-03' sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa' sp_addlinkedserver 'Server4' sp_setnetname 'Server4', 'sql-server-04' sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa' Server 2: sp_addlinkedserver 'Server1' sp_setnetname 'Server1', 'sql-server-01' sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa' sp_addlinkedserver 'Server3' sp_setnetname 'Server3', 'sql-server-03' sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa' sp_addlinkedserver 'Server4' sp_setnetname 'Server4', 'sql-server-04' sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa' Server 3: sp_addlinkedserver 'Server1' sp_setnetname 'Server1', 'sql-server-01' sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa' sp_addlinkedserver 'Server2' sp_setnetname 'Server2', 'sql-server-02' sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa' sp_addlinkedserver 'Server4' sp_setnetname 'Server4', 'sql-server-04' sp_addlinkedsrvlogin Server4, 'false', 'sa', 'sa' Server 4: sp_addlinkedserver 'Server1' sp_setnetname 'Server1', 'sql-server-01' sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa' sp_addlinkedserver 'Server2' sp_setnetname 'Server2', 'sql-server-02' sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa' sp_addlinkedserver 'Server3' sp_setnetname 'Server3', 'sql-server-03' sp_addlinkedsrvlogin Server3, 'false', 'sa', 'sa'
В дополнение к оператору T-SQL sp_addlinkedserver были использованы два оператора. Эти операторы требуются для улучшения обработки распределенного секционированного представления. Обращение к sp_setnetname связывает имя присоединенного сервера в SQL Server с сетевым именем сервера, на котором находится база данных. В этом примере имя присоединенного сервера Server2 находится на сервере с сетевым именем sql-server-02. Мы также задали "верительные данные" для входа на присоединенный сервер. Обращение к sp_addlinkedsrvlogin указывает системе SQL Server, что для доступа к присоединенному серверу нужно использовать заданный идентификатор пользователя (user ID) и пароль.
Присоединение серверов с помощью Enterprise MАnager
Enterprise MАnager тоже позволяет присоединять серверы. Для использования этого метода выполните следующие шаги:
- В окне Enterprise MАnager раскройте папку Security (Безопасность) для вашего сервера (рис. 18.22).
- Щелкните правой кнопкой мыши на Linked Servers (Присоединенные серверы) в левой панели. Выберите в появившемся контекстном меню New Linked Server (Создать присоединенный сервер). Появится окно Linked Server Properties (Свойства присоединенного сервера) (рис. 18.23).
увеличить изображение
Рис. 18.22. Раскрытие папки Security на сервере
Рис. 18.23. Вкладка General (Общие) окна Linked Server Properties - В текстовом поле Linked Server введите имя сервера SQL, который вы хотите присоединить. Щелкните на кнопке выбора SQL Server (рис. 18.24).
- Щелкните на вкладке Security. Введите локальное login-имя и установите флажок Impersonate или введите удаленное имя и пароль. На рис. 18.25 показан ввод локального имени.
Рис. 18.24. Выбор типа присоединенного сервера
Рис. 18.25. Вкладка Security окна Linked Server Properties - Щелкните на кнопке OK, чтобы завершить определение присоединенного сервера.
Присоединенный сервер теперь доступен для использования. Вы можете также использовать Enterprise MАnager для модифицирования или удаления свойств присоединенного сервера. Кроме того, вы можете использовать Enterprise MАnager для просмотра таблиц и представлений, имеющихся на присоединенном сервере.
Создание представления
После того как сделаны все определения присоединенных серверов, вы можете создать реальное представление. В следующем примере создается представление с именем sales (продажи), в котором объединяются данные по продажам из таблицы sales на четырех серверах:
CREATE VIEW sales AS SELECT * FROM /*Server1.bicycle.dbo.*/l_sales UNION ALL SELECT * FROM Server2.bicycle.dbo.l_sales UNION ALL SELECT * FROM Server3.bicycle.dbo.l_sales UNION ALL SELECT * FROM Server4.bicycle.dbo.l_sales GO
Индексированные представления
SQL Server 2000 также позволяет вам создать индекс по представлению. Поскольку представление – это просто виртуальная таблица, она имеет ту же общую форму, что и реальная таблица базы данных. Индекс создается с помощью оператора T-SQL CREATE INDEX, который вы уже использовали для создания индекса по таблице. (Этот оператор описан в лекции 17.) Единственным отличием является то, что вместо имени таблицы вы указываете имя представления. Например, следующий оператор T-SQL создает кластеризованный индекс по представлению с именем partview:
CREATE UNIQUE CLUSTERED INDEX partview_cluidx ON partview (part_num ASC) WITH FILLFАСTOR=95 ON partfilegroup
Создание индексов по представлениям имеет несколько факторов влияния на производительность. Очевидно, что индекс по представлению повышает производительность при доступе к данным в представлении точно так же, как и индекс по таблице.
Кроме того, если вы создаете индекс по представлению, SQL Server сохраняет результирующий набор представления в памяти и не обязан "материализовать" его для будущих запросов. Термин "материализовать" относится к процессу, который используется системой SQL Server для динамического слияния данных, необходимого для создания результирующего набора представления каждый раз, когда какой-либо запрос ссылается на представление. (Напомним, что представление – это динамическая структура.) Процесс материализации представления может существенно увеличить дополнительную нагрузку, которая требуется для реализации запроса. Влияние, оказываемое на производительность повторяющейся материализацией представления, может оказаться значительным в случае сложного представления или большого количества данных в представлении.
Кроме того, если вы создаете индекс по представлению, оптимизатор запросов SQL Server автоматически использует индекс в запросах, где нет явного указания имени представления в предложении FROM оператора SELECT. Иными словами, если существующий запрос в приложении или хранимой процедуре может получить преимущества от использования индексированного представления, то оптимизатор запросов будет применять для реализации запроса это индексированное представление.
Эти преимущества не достаются "бесплатно". Индексированные представления могут оказаться со временем слишком сложными, чтобы их мог поддерживать SQL Server. При каждом модифицировании базовой таблицы SQL Server должен модифицировать результирующий набор представления и (потенциально) индекс по этому представлению. А поскольку диапазон значений индекса по представлению может оказаться больше, чем любой индекс по таблице, например, если представление охватывает несколько больших таблиц, то дополнительная нагрузка, связанная с поддержкой представления и его индекса, может свести на нет любые преимущества, получаемые запросами от индексированного представления. Из-за этой дополнительной нагрузки по обслуживанию вам следует создавать индексы только по тем представлениям, для которых преимущества увеличения скорости считывания результатов перевешивают недостатки, связанные с увеличением нагрузки при обслуживании. Обычно следует индексировать представления, базовые данные которых относительно статичны, у которых в результирующем наборе обрабатывается большое количество строк и которые используются большим количеством запросов.
Заключение
В этой лекции вы узнали, что представление – это вспомогательная структура данных, которую можно использовать для создания виртуальных таблиц. Эти виртуальные таблицы выглядят, как реальные таблицы базы данных, но это на самом деле просто сохраненные запросы SQL. Эти запросы объединяются с другими запросами для доступа к базовой таблице или таблицам.
Вы можете обращаться к представлению в операторах T-SQL таким же образом, как и к таблицам. Представления можно использовать как средство безопасности для скрытия критически важных данных. Они также позволяют осуществлять более простой доступ к данным. И, кроме того, представления позволяют осуществлять логическую презентацию данных. Вы можете также использовать представления для создания виртуальной таблицы из отдельных секций.
В этой лекции вы также узнали о некоторых ограничениях и рекомендациях, касающихся использования представлений. И вы также увидели, что в определенных ситуациях вам следует создавать индексы по вашим представлениям. В лекции 19 мы рассмотрим транзакции и блокировки транзакций.
Лекция 19. Транзакции и блокировка транзакций
В этой лекции рассматриваются основы использования транзакций и блокировки транзакций. Вы узнаете, что такое транзакция, какими свойствами в Microsoft SQL Server 2000 должны обладать транзакции, чтобы их можно было использовать, как использовать режимы транзакций для указания начала и конца транзакции и как фиксировать (завершать) транзакции и выполнять их "откат" (отмену). Мы рассмотрим типы и режимы блокировки, которые используются в SQL Server при выполнении транзакций, а также концепции блокирования и взаимоблокировки. Лекция заканчивается описанием некоторых подсказок блокировки на уровне таблиц, которые вы можете использовать в ваших транзакциях.
Что такое транзакция?
Транзакция – это набор операций, который выполняется как один логический блок. Использование транзакций позволяет SQL Server обеспечивать определенный уровень целостности и восстанавливаемости данных. Журнал транзакций, который должна иметь каждая база данных, поддерживает запись всех транзакций, которые осуществляют любой тип модификации в базе данных (вставка, обновление или удаление). SQL Server использует этот журнал транзакций для восстановления данных в случае ошибок или отказов системы.
Целостность транзакции зависит, в частности, от программиста SQL. Программист должен знать, когда начинать и когда заканчивать транзакцию и в какой последовательности, чтобы модификации данных обеспечивали логическую согласованность и содержательность данных. Мы рассмотрим в последующих разделах, как начинать и заканчивать транзакции. А теперь, когда вы знаете, что такое транзакция, рассмотрим свойства, которыми должна обладать допустимая для использования транзакция.
ACID-свойства
Чтобы транзакцию можно было считать допустимой для использования, она должна отвечать четырем требованиям. Эти требования называют ACID-свойствами. "ACID" – это сокращение от "atomicity (атомарность), consistency (согласованность), isolation (изолированность) и durability (устойчивость)". В SQL Server включены механизмы, помогающие обеспечивать соответствие транзакций каждому из этих требований.
Атомарность
SQL Server обеспечивает, что в случае успешного выполнения транзакции фиксируются все модификации данных этой транзакции (в виде группы), а в случае неудачного выполнения транзакции не фиксируется ни одна из модификаций; иными словами, SQL Server обеспечивает атомарность своих транзакций. Транзакция должна выполняться как элементарная (атомарная) операция – отсюда термин "атомарность". Чтобы транзакция считалась успешно выполненной, должен быть выполнен каждый шаг (или оператор) этой транзакции. При неудачном выполнении одного из шагов вся транзакция считается неуспешной, и происходит отмена всех модификаций, внесенных с момента начала транзакции. SQL Server содержит механизм управления транзакциями, который автоматически определяет результат завершения транзакции (успешный или неуспешный) и при необходимости (в случае неуспешной транзакции) отменяет любые модификации данных.
Согласованность
SQL Server обеспечивает также согласованность ваших транзакций. Согласованность означает, что после окончания транзакции все данные остаются в согласованном состоянии (сохраняется целостность данных) – будь то успешно или неуспешно завершенная транзакция. Перед началом любой транзакции база данных должна быть в согласованном состоянии, а это означает поддержку целостности данных и правильность внутренних структур, таких как индексы B-деревьев и двунаправленные списки. После выполнения транзакции база данных тоже должна быть в согласованном состоянии – в новом состоянии для успешной транзакции или в том же состоянии, что и перед началом транзакции в случае неуспешного завершения.
Согласованность также является свойством в управлении транзакциями, которое поддерживается в SQL Server. Если ваши данные являются согласованными, а в ваших транзакциях поддерживается логическая согласованность и целостность данных, то SQL Server обеспечит согласованность данных после любой транзакции. Используя репликацию данных в распределенной среде, вы можете задавать различные уровни согласованности от конечной сходимости транзакций, т.е. скрытой согласованности, до непосредственной согласованности транзакций. Уровень согласованности будет зависеть от типа используемой вами репликации. Более подробную информацию о репликациях см. в лекциях 26, 27 и 28.
Изолированность
Изолированность означает, что каждая транзакция действует так же, как если бы она была единственной в системе; иными словами, модификации, выполняемые в одной транзакции, изолируются от модификаций, выполняемых в другой параллельно выполняемой транзакции. Тем самым на любую транзакцию не влияет никакое значение, изменяемое другой транзакцией, пока это изменение не будет зафиксировано. В случае неуспешной транзакции ее модификации не будут оказывать влияния, поскольку будет выполнен откат (отмена) соответствующих изменений. SQL Server позволяет вам задавать уровень изолированности для ваших транзакций. Характер изолируемости транзакций зависит от указанного вами уровня изолированности.
Уровни изолированности
SQL Server поддерживает четыре уровня изолированности. Уровень изолированности – значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, т.е. степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных. Указываемый вами уровень изолированности для сеанса SQL Server определяет блокирующее поведение всех операторов SELECT, выполняемых во время этого сеанса (если только вы не задали другой уровень изолированности). Блокирующее поведение описано в разделе "Блокировка транзакций" ниже в этой лекции. Ниже описано четыре уровня изолированности – от низшего до высшего:
- Read uncommitted (Чтение незафиксированных данных). Самый низкий уровень изолированности. На этом уровне транзакции изолированы только в такой степени, чтобы нельзя было читать физически поврежденные данные.
- Read committed (Чтение фиксированных данных). Принятый по умолчанию уровень для SQL Server. На этом уровне разрешается чтение только фиксированных данных. ( Фиксированные данные – это данные, которые стали постоянной частью базы данных.)
- Repeatable read (Повторяемость чтения). Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)
- Serializable (Упорядочиваемость).Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. На этом уровне результаты параллельного выполнения транзакций для базы данных совпадают с последовательным выполнением тех же транзакций (по очереди в каком-либо порядке).
Поведение параллельных транзакций
Чтобы лучше понять действие каждого уровня изолированности, мы рассмотрим сначала три типа поведения параллельно выполняемых транзакций. Это следующие типы поведения:
- Чтение нефиксированных данных (Dirty read). Чтение, при котором происходит считывание еще не фиксированных данных. Чтение нефиксированных данных возникает в том случае, когда одна транзакция модифицирует данные, а вторая транзакция читает эти модифицированные данные до того, как зафиксированы изменения, внесенные в первой транзакции. В случае отката первой транзакции вторая транзакция получит данные, которых нет в базе данных.
- Неповторяемое чтение (Nonrepeatable read). Несогласующиеся результаты, получаемые при повторном чтении. Неповторяемое чтение возникает в случае, когда чтение одной строки данных происходит более одного раза в течение одной транзакции, а между чтениями отдельная транзакция вносит изменения в эту строку. При повторном чтении в первой транзакции будут считываться другие данные, поэтому в пределах одной транзакции получаются неповторяемые результаты.
- Фантомное чтение (Phantom read). Чтение, возникающее в том случае, когда одна транзакция пытается прочитать строку, которая еще не существует в начале данной транзакции, но вставляется второй транзакцией, прежде чем закончится первая транзакция. Если первая транзакция снова выполнит поиск этой строки, то обнаружит ее неожиданное появление. Эта новая строка называется фантомной строкой.
В табл. 19.1 приводится список типов поведения, которые допускаются на каждом уровне изолированности. Как можно видеть из таблицы, уровень read uncommitted является наименее ограничивающим уровнем изолированности, а serializable – наиболее ограничивающим. Как уже отмечалось, read committed является в SQL Server принятым по умолчанию уровнем изолированности. По мере роста уровня изолированности SQL Server налагает все более ограничивающую блокировку на все более длительные периоды времени. И, как отмечалось, уровень изолированности влияет на блокирующее поведение операторов SELECT, а это означает, что изолированность влияет на режим блокировки, применяемый к читаемым данным. Режимы блокировки описаны в разделе "Блокировка транзакций" далее.
Допустимое поведение | Чтение нефиксированных данных | Неповторяемое чтение | Фантомное чтение |
---|---|---|---|
Read uncommitted | Да | Да | Да |
Read committed | Нет | Да | Да |
Repeatable read | Нет | Нет | Да |
Serializable | Нет | Нет | Нет |
Задание уровня изолированности
Вы можете задать уровень изолированности, который будет использоваться для всего сеанса пользователя SQL Server, с помощью операторов Transact-SQL (T-SQL) или с помощью функций в вашем приложении. Вы можете также задать в запросе подсказку блокировки, чтобы переопределить уровень изолированности для данной транзакции. Подсказки блокировки приводятся в секции "Подсказки блокировки" далее. Чтобы задать уровень изолированности с помощью T-SQL или в приложении DB-LIB, используйте оператор SET TRANSACTION ISOLATION LEVEL и задайте один из четырех уровней изолированности. Используется следующий синтаксис:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE GO
После того как вы задали определенный уровень изолированности для сеанса, все последующие транзакции в этом сеансе SQL Server будут осуществлять блокировку, обеспечивающую этот уровень изолированности. Чтобы определить, какой уровень изолированности SQL Server применяется в данный момент по умолчанию, используйте команду DBCC USEROPTIONS. Нужно просто указать имя данной команды:
DBCC USEROPTIONS
Эта команда возвращает в результате только те параметры, которые задал пользователь или которые являются активными. Если вы не задали уровень изолированности (оставив принятый по умолчанию уровень SQL Server), то не увидите этот уровень, запустив оператор DBCC USEROPTIONS. Но если вы все-таки задали уровень, отличный от принятого по умолчанию, то увидите этот уровень изолированности. Например, если выполнить следующие операторы, то уровень изолированности будет показан в результатах оператора DBCC USEROPTIONS:
USE pubs GO SET TRANSACTION ISOLATION LEVEL SERIALIZABLE GO DBCC USEROPTIONS GO
Результаты оператора DBCC USEROPTIONS будут выведены в следующей форме:
Set Option Value --------------------------------------------- textsize 64512 language us_english dateformat mdy datefirst 7 quoted_identifier SET arithabort SET ansi_null_dflt_on SET ansi_defaults SET ansi_warnings SET ansi_padding SET ansi_nulls SET concat_null_yields_null SET isolation level serializable (13 row(s) affected)
Для замещения принятого по умолчанию уровня изолированности можно использовать подсказки блокировки на уровне таблиц, но вам следует применять этот метод, только когда это абсолютно необходимо и вы полностью понимаете, как это повлияет на ваши транзакции. Более подробные сведения о доступных подсказках блокировки см. в разделе "Подсказки блокировки" далее.
Устойчивость
Последним из ACID-свойств является устойчивость. Устойчивость означает, что после того, как транзакция фиксирована, влияние этой транзакции в базе данных становится постоянным – даже в случае отказа системы. Устойчивость обеспечивается журналом транзакций SQL Server и вашими резервными копиями базы данных. При отказе SQL Server, операционной системы или какого-либо компонента сервера база данных будет автоматически восстановлена при перезапуске SQL Server. SQL Server использует журнал транзакций для воспроизведения фиксированных транзакций, на которые повлиял отказ системы, а также выполняет откат любых нефиксированных транзакций.
При отказе какого-либо устройства с данными или потере или порче данных вы можете восстановить базу данных, используя резервные копии базы данных и ре-зервные копии журнала транзакций. Имея обоснованный план резервного копирования, вы всегда сможете восстановить свою систему после аварии. К сожалению, при отказе ваших устройств резервного копирования и потере резервной копии, необходимой для восстановления системы, вы, возможно, не сможете восстановить свою базу данных. (О резервном копировании и восстановлении вашей базы данных и журналов транзакций см. лекции 32 и 33.) Теперь, когда вы ознакомились со свойствами транзакции, рассмотрим, как начинать и заканчивать транзакцию.
Режимы транзакций
Транзакция может начинаться в одном из трех режимов: автофиксация ( autocommit ), явный режим ( explicit ) или неявный режим ( implicit ). По умолчанию для SQL Server принят режим автофиксации. Рассмотрим, что означает каждый из этих режимов.
Режим автофиксации
В режиме автофиксации каждый оператор T-SQL фиксируется по его завершении, и в этом режиме не требуется никаких дополнительных операторов для управления транзакциями. Иными словами, каждая транзакция состоит только из одного оператора T-SQL. Режим автофиксации полезен при выполнении операторов с помощью интерактивной командной строки, утилиты OSQL или анализатора очередей SQL Server Query Аnalyzer, поскольку вам не нужно задавать в явном виде запуск и окончание каждой транзакции. Каждый оператор будет рассматриваться системой SQL Server как отдельная транзакция и будет фиксироваться сразу после его завершения. Режим автофиксации будет использоваться в каждом соединении с SQL Server, пока вы не запустите транзакцию в явном режиме с помощью оператора BEGIN TRANSACTION или пока не укажете неявный режим. По окончании явно заданной транзакции или после отключения неявного режима SQL Server возвращается к режиму автофиксации.
Явный режим
Явный режим используется чаще всего для программных приложений, а также для хранимых процедур, триггеров и сценариев. При запуске группы операторов для выполнения какой-либо задачи вам может потребоваться указание начала и конца данной транзакции, чтобы затем выполнить фиксацию всей группы операторов или отмену (откат) модификаций всей группы. Если вы явно указываете начало и конец транзакции, это означает, что вы используете явный режим, и такую транзакцию называют явной транзакцией. Явная транзакция задается с помощью операторов T-SQL или с помощью функций API. В этом разделе рассматривается только метод T-SQL; функции API выходят за рамки изложения этой книги.
Использование явной транзакции
Рассмотрим ситуацию, в которой вам потребовалось бы использование явной транзакции для запуска и окончания задачи. Предположим, что у нас имеется хранимая процедура с именем Place_Order (Поместить_Заказ), которая управляет в базе данных задачей размещения заказа покупателя на какой-либо товар. Эта процедура включает в себя следующие шаги: выбор информации о текущем счете покупателя, ввод идентификационного номера нового заказа и наименования товара, расчет стоимости заказа с учетом налогов, обновление остатка на счете покупателя с учетом общей стоимости и проверка наличия товара на складе.
Для согласованности информации в базе данных нам нужно, чтобы были завершены все эти шаги или не был завершен ни один из этих шагов. Для этой цели мы сгруппируем все операторы, управляющие данной задачей, в одну явную транзакцию. Если эти операторы не будут объединены в одну группу, это может привести к несогласованному состоянию данных. Например, при обрыве соединения клиента с сервером после завершения шага, где вводится номер нового заказа, но до обновления остатка на счете покупателя, в базе данных появится новый заказ для данного покупателя, но без снятия денег со счета покупателя. В этом случае SQL Server фиксирует каждый оператор сразу после его окончания, что оставляет хранимую процедуру незаконченной на момент разъединения сети. Но если все указанные шаги определены в рамках одной явной транзакции, то в случае разъединения SQL Server автоматически выполнит откат всей транзакции, а клиент может затем снова подсоединиться к серверу и повторно выполнить данную процедуру. Более подробную информацию см. в разделе "Откаты транзакций" далее.
Использование явных транзакций, когда ваша задача состоит из нескольких шагов, как в предыдущем примере, также дает преимущества, поскольку SQL Server (независимо от использования вами операторов ROLLBACK ) автоматически выполнит откат ваших транзакций в случае серьезных ошибок, таких как обрыв связи в сети, аварийный сбой (базы данных или клиентской системы) или взаимоблокировка. (Взаимоблокировки рассматриваются в разделе "Блокирование и взаимоблокировки" далее.) Для запуска транзакции используется оператор T-SQL BEGIN TRANSACTION. Чтобы указать конец транзакции, используется COMMIT TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN TRANSACTION вы можете дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION. Ниже показан синтаксис этих трех операторов:
BEGIN TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции] COMMIT [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции]] ROLLBACK [TRAN[SACTION] [имя_транзакции | @переменная_с_именем_транзакции | имя_точки_сохранения | @переменная_с_именем_точки_сохранения]]
Фиксирование транзакций
Как уже говорилось, фиксированной называется транзакция, все модификации которой стали постоянной частью базы данных. До фиксирования транзакции запись о ее модификациях и запись ее фиксирования заносятся в журнал транзакций базы данных. Таким образом, модификации, которые становятся постоянной частью базы данных, могут находиться в одном из двух мест: либо они фактически записываются на диск и, тем самым, оказываются в базе данных, либо они находятся в кэше данных, что позволяет в случае сбоя выполнить повтор транзакции с помощью журнала транзакций, чтобы избежать потери данной транзакции.
Все ресурсы, используемые транзакцией, такие как блокировки, освобождаются после фиксирования данной транзакции. Фиксирование транзакции считается успешным в случае успешного завершения каждого из ее операторов. Ниже приводится небольшая транзакция с именем update_state, которая изменяет в таблице publishers (издатели) значение колонки state на XX для всех издателей, у которых в этой колонке содержится значение NULL:
USE pubs GO BEGIN TRAN update_state UPDATE publishers SET state = 'XX' WHERE state IS NULL COMMIT TRAN update_state GO
Запустив эту транзакцию, вы увидите, что это повлияло на две строки. Чтобы вернуть таблицу к ее исходному состоянию (как если бы вместо фиксирования произошел откат), выполните следующую транзакцию:
USE pubs GO BEGIN TRAN undo_update_state UPDATE publishers SET state = NULL WHERE state = 'XX' COMMIT TRAN undo_update_state GO
И снова вы увидите, что это повлияло на две строки. Имена транзакций update_state (модифицировать_состояние) и undo_update_state (отменить_модификацию_состояния), используемые в операторе COMMIT TRAN, игнорируются в SQL Server: имена транзакций используются просто для удобства программиста, чтобы можно было указать имя фиксируемой транзакции. SQL Server автоматически фиксирует последнюю нефиксированную транзакцию, запущенную перед фиксированием, независимо от указания имени транзакции.
Создание вложенных транзакций
В SQL Server разрешаются вложенные транзакции, т.е. транзакции внутри транзакции. В случае вложенных транзакций вы должны явно фиксировать каждую внутреннюю транзакцию, чтобы SQL Server получал информацию об окончании внутренней транзакции и мог освободить ресурсы, используемые этой транзакцией, когда будет фиксирована внешняя транзакция. Если ресурсы блокированы, другие пользователи не могут получать доступа к этим ресурсам. Хотя вы должны явным образом включать оператор фиксации COMMIT для каждой транзакции, SQL Server не выполняет фактического фиксирования внутренних транзакций, пока не произойдет успешное фиксирование внешней транзакции; одновременно с этим SQL Server освобождает все ресурсы, используемые внутренними и внешней транзакциями. При неуспешном фиксировании внешней транзакции фиксирование внутренних транзакций не выполняется и происходит откат внешней и всех внутренних транзакций. После фиксирования внешней транзакции выполняется фиксирование внутренних транзакций. Иными словами, SQL Server по сути игнорирует операторы COMMIT внутри внутренних вложенных транзакций – в том смысле, что внутренние транзакции не фиксируются в ожидании окончательного фиксирования или отката внешней транзакции, чтобы определить статус завершения всех внутренних транзакций. (Это разъясняется в примерах на врезках "Практические советы" далее.) Кроме того, в случае использования оператора отката ROLLBACK во внешней транзакции или в любой из внутренних транзакций происходит откат всех этих транзакций. В оператор ROLLBACK нельзя включать имя внутренней транзакции; в этом случае SQL Server возвратит сообщение об ошибке. Можно включать имя внешней транзакции, имя точки сохранения или не включать никакого имени. (Описание точек сохранения приводится в разделе "Точки сохранения" далее.)
Практические советы
Рассмотрим пример вложенной транзакции, включающей в себя хранимую процедуру. Эта хранимая процедура содержит явную транзакцию и вызывается из другой явной транзакции. Поэтому транзакция в хранимой процедуре становится внутренней вложенной транзакцией. В следующей последовательности SQL показаны операторы, используемые для создания хранимой процедуры, и транзакция, которая вызывает эту хранимую процедуру. (Для упрощения в этом примере используется оператор PRINT, а не реальные операторы модифицирования данных.)
USE MyDB GO CREATE PROCEDURE Place_Order --Создает хранимую процедуру AS BEGIN TRAN place_order_tran PRINT 'Здесь должны быть SQL-операторы, выполняющие задачи по заказам' COMMIT TRAN place_order_tran GO BEGIN TRAN Order_tran --Начинает внешнюю транзакцию PRINT 'Поместите заказ' EXEC Place_Order --Вызывает хранимую процедуру, которая --начинает внутреннюю транзакцию COMMIT TRAN Order_tran --Фиксирует внутреннюю и внешнюю --транзакции GO
Выполнив эту программу, вы увидите результаты обоих операторов PRINT. Транзакция place_order_tran должна содержать внутри хранимой процедуры оператор COMMIT, отмечающий конец этой транзакции, но на самом деле это фиксирование не произойдет, пока не будет выполнено фиксирование транзакции Order_tran. Фиксирование или откат place_order_tran будет зависеть только от фиксирования Order_tran.
Хотя SQL Server не выполняет фактического фиксирования внутренних транзакций по оператору COMMIT, но все же для каждого оператора COMMIT происходит изменение системной переменной @@TRANCOUNT. Эта переменная следит за количеством активных транзакций на одно соединение с пользователем. При отсутствии активных транзакций значение @@TRANCOUNT равно 0. В начале каждой транзакции (с помощью BEGIN TRAN ) значение @@TRANCOUNT увеличивается на 1. После фиксирования каждой транзакции значение @@TRANCOUNT уменьшается на 1. Когда значение @@TRANCOUNT становится равным 0, фиксируется внешняя транзакция. Если во внешней транзакции или в любой из внутренних транзакций выполняется оператор ROLLBACK, то значение @@TRANCOUNT устанавливается равным 0. Помните, что для правильного уменьшения @@TRANCOUNT вы должны указывать фиксирование ( COMMIT ) для каждой внутренней транзакции. Вы можете проверять значение @@TRANCOUNT, чтобы определять наличие активных транзакций. Чтобы увидеть значение @@TRANCOUNT, используйте оператор SELECT @@TRANCOUNT.
Использование @@TRANCOUNT
Рассмотрим пример того, как SQL Server использует переменную @@TRANCOUNT. Предположим, что имеется вложенная транзакция, состоящая из двух транзакций: одной внутренней и одной внешней, как в предыдущем примере. После запуска обеих транзакций, но до того, как они фиксированы, значение @@TRANCOUNT равно 2. Внешняя транзакция не может быть фиксирована, поскольку @@TRANCOUNT имеет ненулевое значение. После оператора COMMIT внутренней транзакции SQL Server уменьшает @@TRANCOUNT до 1. После оператора COMMIT внешней транзакции значение @@TRANCOUNT уменьшится до 0, и будет выполнено фактическое фиксирование внешней и внутренней транзакций. Следующая программа основана на предыдущем примере, но включает в себя считывание значений @@TRANCOUNT:
USE MyDB GO DROP PROCEDURE Place_Order GO CREATE PROCEDURE Place_Order --Создает хранимую процедуру. AS BEGIN TRAN place_order_tran --Приращение TRANCOUNT PRINT 'Здесь должны быть SQL-операторы, выполняющие задачи по заказам' SELECT @@TRANCOUNT as TRANCOUNT_2 COMMIT TRAN place_order_tran --Уменьшение TRANCOUNT. GO SELECT @@TRANCOUNT as TRANCOUNT_initial BEGIN TRAN Order_tran --Приращение TRANCOUNT. PRINT 'Place an order' SELECT @@TRANCOUNT as TRANCOUNT_1 EXEC Place_Order --Вызывает хранимую процедуру, которая --начинает внутреннюю транзакцию. SELECT @@TRANCOUNT as TRANCOUNT_3 COMMIT TRAN Order_tran --Уменьшение TRANCOUNT. SELECT @@TRANCOUNT as TRANCOUNT_4 GO
При выполнении этой программы вы увидите на экране значения @@TRANCOUNT, которые выводятся в следующем порядке: 0, 1, 2, 1, 0.
Неявный режим
В неявном режиме транзакция автоматически начинается при использовании определенных операторов T-SQL и продолжается, пока не появится оператор явного окончания COMMIT или ROLLBACK. Если оператор окончания не указан, то при отсоединении пользователя происходит откат данной транзакции. Следующие операторы T-SQL являются началом новой транзакции в неявном режиме:
- ALTER TABLE
- CREATE
- DELETE
- DROP
- FETCH
- GRANT
- INSERT
- OPEN
- REVOKE
- SELECT
- TRUNCATE TABLE
- UPDATE
Если один из этих операторов используется, чтобы начать неявную транзакцию, эта транзакция продолжается, пока не будет явно указано ее окончание, даже если внутри транзакции снова встретятся эти операторы. После явного фиксирования или отката данной транзакции следующее появление этих операторов является началом новой транзакции. Этот процесс продолжает действовать, пока не будет отключен неявный режим.
Чтобы задать неявный режим транзакций, вы можете использовать следующий оператор T-SQL:
SET IMPLICIT_TRANSACTIONS {ON | OFF}
Значение ON активизирует неявный режим, и OFF отключает его. После отключения неявного режима используется режим автофиксации.
Неявные транзакции полезно использовать, когда запускаются сценарии с модификациями данных, которые требуется защитить внутри транзакции. Вы можете включить неявный режим в начале сценария, выполнить необходимые модификации и отключить этот режим в конце сценария. Во избежание конфликтов параллельных операций отключайте неявный режим после модификации данных и перед просмотром данных. Если вслед за операцией фиксирования следует оператор SELECT, то с него начинается новая транзакция в неявном режиме, и соответствующие ресурсы не будут освобождены, пока не будет фиксирована эта транзакция.
Откаты транзакций
Откаты могут происходить в двух формах: автоматический откат, выполняемый SQL Server, или программируемый вручную откат. В определенных случаях SQL Server выполнит для вас откат. Но для обеспечения логической согласованности в ваших программах вы должны при необходимости явным образом обращаться к оператору ROLLBACK. Рассмотрим более подробно эти два метода.
Автоматические откаты
Как уже говорилось ранее в этой лекции, при сбое транзакции вследствие серьезной ошибки, такой как потеря сетевого соединения при выполнении данной транзакции или отказ клиентского приложения или компьютера, SQL Server выполняет автоматический откат транзакции. Во время отката происходит отмена всех модификаций, выполненных в данной транзакции, и освобождение всех ресурсов, использовавшихся этой транзакцией.
Если при исполнении какого-либо оператора возникает ошибка, такая как нарушение ограничения или правила, то по умолчанию SQL Server автоматически выполняет откат только этого определенного оператора, в котором возникла ошибка. Чтобы изменить это поведение, вы можете использовать оператор SET XACT_ABORT. Если задать для XACT_ABORT значение ON, то в случае ошибки исполнения SQL Server автоматически выполнит откат транзакции. Этот метод полезно использовать, например, когда один оператор вашей транзакции не выполняется из-за того, что он нарушает ограничение по внешнему ключу, и поэтому вы не хотите, чтобы выполнялись последующие операторы. По умолчанию для XACT_ABORT задано значение OFF.
SQL Server использует также автоматический откат при восстановлении сервера. Например, если у вас отключился источник питания во время выполнения транзакций и произошла перезагрузка системы, то при перезапуске SQL Server выполнит автоматическое восстановление. При автоматическом восстановлении происходит чтение информации из журнала транзакций для воспроизведения фиксированных транзакций, которые не были записаны на диск, и отката транзакций, которые находились в процессе выполнения (еще не были фиксированы) в момент отказа источника питания.
Программируемые откаты
С помощью оператора ROLLBACK вы можете указать точку в транзакции, где будет выполнен откат. Оператор ROLLBACK прекращает данную транзакцию и выполняет откат (отмену) всех выполненных изменений. Если вы запускаете откат в середине какой-либо транзакции, то остальная часть этой транзакции игнорируется. Если, например, эта транзакция является хранимой процедурой и оператор ROLLBACK выполняется в этой процедуре, то происходит откат всей процедуры и переход к обработке оператора, следующего после вызова хранимой процедуры.
Если вам нужно выполнить откат, исходя из количества строк, возвращенных оператором SELECT, используйте системную переменную @@ROWCOUNT. Эта переменная содержит количество строк, которое возвращается в результате запроса или на которое влияет модификация или удаление. Если конкретное количество строк не имеет значения и вам просто нужно определить наличие строки или строк для определенного условия, то вы можете использовать совместно с оператором SELECT оператор IF EXISTS. Этот оператор не возвращает количества строк данных, а только значение TRUE или FALSE. Если результат равен TRUE, то выполняется следующий оператор; если результат равен FALSE, то следующий оператор не выполняется. В операторе IF EXISTS может также использоваться предложение ELSE. Рассмотрим пример использования предложения IF EXISTS...ELSE. В следующей транзакции происходит модификация значений ставки арендной платы (royalty) в таблице roysched для двух ставок арендной платы (royalty rates) (16 процентов и 15 процентов), но если ни одна из этих ставок не существует, то ни одна из команд UPDATE выполняться не будет. Для обеспечения такого результата в этой транзакции используется оператор ROLLBACK.
BEGIN TRAN update_royalty --Начать транзакцию. USE pubs IF EXISTS (SELECT titles.title, roysched.royalty FROM titles, roysched WHERE titles.title_id = roysched.title_id AND roysched.royalty = 16) UPDATE roysched SET royalty = 17 WHERE royalty = 16 --Имеется 13 строк. ELSE ROLLBACK TRAN update_royalty --ROLLBACK не выполняется. IF EXISTS (SELECT titles.title, roysched.royalty FROM titles, roysched WHERE titles.title_id = roysched.title_id AND roysched.royalty = 15) --Нет ни одной строки. BEGIN UPDATE roysched SET royalty = 20 WHERE royalty = 15 COMMIT TRAN update_royalty END ELSE --Выполняется ROLLBACK. ROLLBACK TRAN update_royalty GO
В этой транзакции первый оператор IF EXISTS (SELECT...) определяет, что существует несколько строк, и поэтому оператор UPDATE выполняется (показывая, что модификация касается 13 строк). Второй оператор SELECT возвращает 0 строк, и поэтому второй оператор UPDATE не выполняется, но выполняется оператор ROLLBACK TRAN update_royalty. Поскольку ROLLBACK выполняет откат всех модификаций до самого начала данной транзакции, то происходит откат первой модификации. Если снова выполнить первый оператор SELECT, то вы по-прежнему увидите 13 строк со значением royalty, равным 16, как и было в исходном состоянии базы данных, когда мы запускали данную транзакцию. И снова изменение royalty на значение 17 будет отменено (будет выполнен откат) из-за оператора ROLLBACK.
Откат транзакции нельзя выполнить после ее фиксирования. (Напомним, что внутренняя транзакция на самом деле не фиксируется, пока не будет фиксирована внешняя транзакция.) Чтобы можно было выполнить явный откат отдельной транзакции, оператор ROLLBACK должен предшествовать оператору COMMIT. В случае вложенных транзакций после фиксирования внешней транзакции (и, тем самым, внутренних транзакций) уже нельзя выполнить откат ни одной из транзакций. Как уже отмечалось, вы не можете выполнить откат только внутренних транзакций; должен быть выполнен откат всей транзакции (всех внутренних транзакций и внешней транзакции). Поэтому, включив имя транзакции в оператор ROLLBACK, проследите за тем, чтобы было указано имя внешней транзакции (во избежание путаницы и сообщения об ошибке от SQL Server). Однако существует обходной путь, позволяющий избежать отката всей транзакции и сохранить часть модификаций: вы можете использовать точки сохранения.
Точки сохранения
Вы можете избежать отката всей транзакции; для этого нужно использовать точку сохранения, которая позволяет выполнять откат только до определенной точки в транзакции, а не до самого начала транзакции. Все модификации, выполненные до точки сохранения, остаются в силе и не подвергаются откату; но для всех операторов, выполняемых после точки сохранения (которую вы должны указать в транзакции) вплоть до оператора ROLLBACK, будет выполнен откат. Затем начнут выполняться операторы, следующие за оператором ROLLBACK. Если вы затем зададите откат транзакции без указания точки сохранения, то, как обычно, будет выполнен откат всех модификаций вплоть до начала данной транзакции, т.е. будет отменена вся транзакция. Отметим, что при откате транзакции до точки сохранения SQL Server не освобождает блокированные ресурсы. Они будут освобождены после фиксирования транзакции или после отката всей транзакции.
Чтобы указать точку сохранения в транзакции, используйте следующий оператор:
SAVE TRAN[SACTION] {имя_точки_сохранения | @переменная_с_именем_точки_сохранения}
Поместите точку сохранения в том месте транзакции, до которого вы хотите выполнять откат. Чтобы выполнить откат до точки сохранения, используйте ROLLBACK TRAN вместе с именем точки сохранения, как это показано ниже:
ROLLBACK TRAN имя_точки_сохранения
Вы можете использовать другие операторы T-SQL, чтобы продолжить транзакцию. Не забудьте включить оператор COMMIT или другой оператор ROLLBACK после первого оператора ROLLBACK, чтобы завершить всю транзакцию.
Блокировка транзакций
В SQL Server используется объект, который называется блокировкой (lock) ; он препятствует тому, чтобы несколько пользователей одновременно вносили изменения в базу данных и чтобы один пользователь считывал данные, которые изменяет в этот момент другой пользователь. Блокировка помогает обеспечивать логическую целостность транзакций и данных. Управление блокировками осуществляется внутренним образом из программного обеспечения SQL Server и захват блокировки осуществляется на уровне пользовательского соединения. Если пользователь захватывает блокировку (становится ее владельцем) по какому-либо ресурсу, то эта блокировка указывает, что данный пользователь имеет право на использование данного ресурса. К ресурсам, которые может блокировать пользователь, относятся строка данных, страница данных экстент (8 страниц), таблица или вся база данных. Например, если пользователь владеет блокировкой по странице данных, то другой пользователь не может выполнять операции на этой странице, которые повлияют на операции пользователя, владеющего данной блокировкой. Поэтому любой пользователь не может модифицировать страницу данных, которая блокирована и считывается в данный момент другим пользователем. Кроме того, ни один пользователь не может владеть блокировкой, конфликтующей с блокировкой, которой уже владеет другой пользователь. Например, два пользователя не могут одновременно владеть блокировками на одновременную модификацию одной и той же страницы. Одна блокировка не может одновременно использоваться более чем одним пользователем.
Система управления блокировками SQL Server автоматически захватывает и освобождает блокировки в соответствии с действиями пользователей. Для управления блокировками не требуется никаких действий со стороны DBA (администратора базы данных) или программиста. Однако вы можете использовать программные подсказки (hint), чтобы задать для SQL Server, какой тип блокировки нужно захватывать при выполнении определенного запроса или модификации базы данных (см. раздел "Подсказки блокировки" далее).
В данном разделе мы рассмотрим уровни детализации блокировок, а также режимы блокировки. Но сначала рассмотрим некоторые возможности управления блокировками, которые повышают производительность SQL Server.
Возможности управления блокировками
SQL Server поддерживает блокировку на уровне строк, т.е. позволяет захватывать блокировку по строке страницы данных или страницы индекса. Блокировка на уровне строк – самый высокий уровень детализации, который можно получить в SQL Server. Этот нижний уровень блокировки дает больше возможностей параллельной работы многим приложениям оперативной обработки транзакций (OLTP). Блокировка на уровне строк особенно полезна, когда выполняются вставки, обновления и удаления в таблицах и индексах.
В дополнение к возможности блокировки на уровне строк SQL Server обеспечивает простоту администрирования для конфигурации блокировок. Вы не обязаны задавать вручную параметр конфигурации блокировок, чтобы определить количество блокировок, доступное для использования в SQL Server. По умолчанию при увеличении необходимого количества блокировок SQL Server динамически выделяет дополнительное количество вплоть до предела, определяемого памятью SQL Server. Если какое-то количество блокировок больше не используется, SQL Server освобождает их. SQL Server также оптимизирован для динамического выбора типа блокировки, который захватывается по какому-либо ресурсу – обычно это блокировка на уровне строк для вставок, обновлений и удалений и блокировка страниц для сканирования таблиц. В следующем разделе дается более подробное описание уровней блокировок.
Уровни блокировок
Блокировки могут захватываться по целому ряду ресурсов; тип ресурса определяет уровень детализации данной блокировки. В табл. 19-2 приводится список ресурсов, которые может блокировать SQL Server, начиная с самого подробного и до самого крупного уровня детализации.
Ресурс | Тип блокировки | Описание |
---|---|---|
Идентификатор строки | Уровень строки | Блокирует отдельную строку в таблице |
Ключ | Уровень строки | Блокирует отдельную строку в индексе |
Страница | Уровень страницы Блокирует отдельную страницу размером 8 Кб в таблице или индексе | |
Экстент | Уровень экстента | Блокирует экстент – группу из 8 последовательных страниц данных или страниц индекса |
Таблица | Уровень таблицы | Блокирует всю таблицу |
База данных | Уровень базы данных | Блокирует всю базу данных |
При снижении уровня детализации снижается степень параллельности. Например, блокировка всей таблицы с помощью определенного типа блокировки может заблокировать доступ к этой таблице другим пользователям. Но при этом снижается объем передачи дополнительной служебной информации (непроизводительные затраты), поскольку используется меньшее количество блокировок. По мере повышения уровня детализации, например, до уровня блокировки страниц и строк, уровень параллельности возрастает, поскольку увеличивается количество пользователей, одновременно получающих доступ к различным страницам и строкам в таблице. В этом случае увеличиваются также непроизводительные затраты, поскольку при отдельном доступе к большому числу строк или страниц требуется больше блокировок.
SQL Server автоматически выбирает тип блокировки, подходящий для данной задачи, минимизируя при этом непроизводительные затраты на блокировку. SQL Server также автоматически определяет режим блокировки для каждой транзакции, касающейся блокируемого ресурса; ниже приводится описание этих режимов.
Режимы блокировки
Режим блокировки указывает, каким образом одновременно работающие пользователи (или транзакции) могут осуществлять доступ к какому-либо ресурсу. Захват каждого типа блокировки происходит в одном из этих режимов. Имеется шесть режимов блокировки: разделяемая блокировка (shared), блокировка изменений (update), монопольная блокировка (exclusive), блокировка намерения (intent), блокировка схемы (schema) и блокировка массовых изменений (bulk update).
Разделяемая блокировка
Режим разделяемой блокировки используется только для операций чтения, таких как операции с помощью оператора SELECT. Этот режим позволяет одновременно выполняемым транзакциям выполнять чтение одного и того же ресурса, но при этом ни одна из транзакций не может модифицировать этот ресурс. Разделяемые блокировки освобождаются сразу после окончания чтения, за исключением случаев, когда степень изолированности задана на уровне повторяемого чтения или более высоком уровне или в транзакции задана подсказка блокировки, подавляющая это поведение.
Блокировка изменений
Режим блокировки изменений используется для случаев, когда в данный ресурс могут быть внесены изменения. Только одна транзакция может захватывать блокировку изменений по определенному ресурсу. Если транзакция вносит изменения (например, когда по условию поиска найдены строки для модификации), то блокировка изменений преобразуется в монопольную блокировку (описана ниже); иначе она преобразуется в разделяемую блокировку.
Монопольная блокировка
Режим монопольной блокировки используется для операций, модифицирующих данные, таких как обновления, вставки и удаления. При захвате транзакцией монопольной блокировки по какому-либо ресурсу никакая другая транзакция не может выполнять чтение или модификацию этого ресурса. Этот режим блокировки препятствует тому, чтобы одновременно работающие пользователи изменяли одни и те же данные, что может приводить к ошибкам в данных.
Блокировка намерения
Режим блокировки намерения используется для создания иерархической структуры блокировок. Например, блокировка намерения на уровне таблицы указывает, что SQL Server предполагает захватывать блокировку по одной или нескольким страницами или строкам этой таблицы. Обычно в случае, когда в транзакции требуется захватить блокировку по какому-либо ресурсу, SQL Server сначала проверяет, существуют ли блокировки намерений для данного ресурса. Если блокировка намерения захвачена транзакцией, которая находится в состоянии ожидания этого ресурса, то вторая транзакция не может захватить монопольную блокировку. Если не существует ни одной транзакции, владеющей блокировкой намерения и ожидающей данный ресурс, то текущая транзакция может захватить монопольную блокировку по этому ресурсу. Существует три следующих типа режимов блокировки намерения:
- Разделяемое намерение (Intent shared). Указывает, что в транзакции предполагается наложить на ресурс разделяемую блокировку.
- Монопольное намерение (Intent exclusive). Указывает, что в транзакции предполагается наложить на ресурс монопольную блокировку.
- Разделяемо-монопольное намерение (Shared with intent exclusive). Указывает, что в транзакции предполагается наложить разделяемую блокировку на некоторые ресурсы и монопольную блокировку на другие ресурсы.
Для получения более подробной информации по этим типам режимов найдите "shared lock mode" (режим разделяемой блокировки) в Books Online и выберите "Understanding Locking in SQL Server" (Ознакомление с блокировкой в SQL Server) в диалоговом окне Topics Found.
Блокировка схемы
Режим блокировки схемы используется в тех случаях, когда выполняется операция изменения схемы таблицы, такая как добавление колонки в таблицу, или когда компилируются запросы. Для таких случаев существует два типа блокировок схемы: блокировка модификации схемы (Sch-M) и блокировка стабильности схемы (Sch-S). Блокировка модификации схемы используется при выполнении операции языка определения данных таблицы (DDL). Блокировка стабильности схемы используется для компиляции запросов. Когда происходит компиляция запроса, другие транзакции могут одновременно с этим запускать и захватывать блокировки по данной таблице (даже монопольные блокировки), но операторы DDL не могут применяться к таблице, если задана блокировка стабильности схемы.
Блокировка массовых изменений
Режим блокировки массовых изменений используется, когда вам нужно выполнить массовое копирование данных в таблицу с подсказкой блокировки TABLOCK или когда вы задаете параметр table lock on bulk load с помощью хранимой процедуры sp_tableoption. Целью блокировки массовых изменений является предоставление процессам разрешения на параллельное массовое копирование данных в одну таблицу, запрещая при этом доступ к этой таблице любым процессам, которые не выполняют массового копирования.
Блокирование и взаимоблокировки
Блокирование (blocking) и взаимоблокировки (deadlock) – это две дополнительные проблемы, которые могут возникать при одновременно выполняемых транзакциях. Они могут приводить к серьезным проблемам системы, а также могут замедлять и даже останавливать работу. Эти проблемы могут разрешаться в приложении, или SQL Server постарается сделать все возможное для их разрешения; они будут описаны здесь только для того, чтобы вы представляли их себе и понимали используемые концепции. Обход и разрешение проблем блокирования и взаимоблокировки являются обязанностью программиста.
Блокирование возникает в том случае, когда одна транзакция владеет блокировкой по какому-либо ресурсу, а второй транзакции требуется конфликтный тип блокировки по этому ресурсу. Вторая транзакция должна ждать, пока первая транзакция освободит свою блокировку; иными словами, она блокирована первой транзакцией. Проблема блокирования обычно возникает, когда какая-либо транзакция захватывает блокировку на длительный период времени, что приводит к цепочке блокированных транзакций, ожидающих окончания других транзакций, чтобы получить необходимые им блокировки; это состояние называют цепным блокированием. На рис. 19.1 показан пример цепного блокирования.
Взаимоблокировка отличается от блокированной транзакции в том, что взаимоблокировка возникает в случае двух блокированных транзакций, ожидающих друг друга. Например, предположим, что одна транзакция владеет монопольной блокировкой по Таблице 1, а вторая владеет монопольной блокировкой по Таблице 2. Прежде чем будет освобождена любая монопольная блокировка, первой транзакции требуется блокировка по Таблице 2 и второй транзакции – требуется блокировка по Таблице 1. Теперь каждая транзакция ждет, пока другая транзакция освободит свою монопольную блокировку, но ни одна из транзакций не сделает этого, пока не будет выполнено фиксирование или откат для завершения соответствующей транзакции. Ни одна из транзакций не может завершиться, поскольку для продолжения работы ей требуется блокировка, которой владеет другая транзакция, – ситуация взаимоблокировки! Этот сценарий показан на рис. 19.2. При возникновении взаимоблокировки SQL Server прекращает одну из транзакций, и ее требуется запустить заново.
Рис. 19.1. Цепное блокирование
Рис. 19.2. Взаимоблокировка
Подсказки блокировки
Подсказки блокировки – это ключевые слова T-SQL, которые можно использовать с операторами SELECT, INSERT, UPDATE и DELETE, чтобы задать для SQL Server использование предпочтительного типа блокировки на уровне таблицы для определенного оператора. Вы можете использовать подсказки блокировки для переопределения принятого по умолчанию уровня изолированности. Вам следует использовать этот метод только в случае абсолютной необходимости, поскольку ваша неаккуратность может привести к блокированию или взаимоблокировкам.
Рассмотрим ситуацию, где может оказаться полезным использование подсказок блокировки. Предположим, что вы используете для всех транзакций принятый по умолчанию уровень изолированности read uncommitted (чтение незафиксированных данных). При этом уровне изолированности по данному ресурсу захватывается разделяемая блокировка только до завершения чтения, и затем эта разделяемая блокировка освобождается. И если какая-либо транзакция читает одни и те же данные дважды, то результаты чтения могут не совпасть, поскольку другая транзакция могла захватить блокировку между первым и вторым чтениями и модифицировать эти данные.
Чтобы избежать проблемы повторяемости чтения, вы можете задать уровень изолированности serializable (упорядочиваемость), но это вынудит SQL Server захватить все разделяемые блокировки, необходимые для операторов SELECT во всех транзакциях, пока не будет завершена каждая транзакция. Иными словами, для целостности транзакций разделяемые блокировки будут захвачены по таблице, указанной в операторе SELECT любой транзакции. Если вы не хотите поддерживать упорядочиваемость для всех ваших транзакций, то можете добавить какую-либо подсказку блокировки для определенного запроса. Подсказка блокировки HOLDLOCK в операторе SELECT указывает SQL Server захват всех разделяемых блокировок по таблице, заданной в операторе транзакции SELECT, вплоть до конца этой транзакции – независимо от уровня изолированности. Тем самым при повторном чтении будет наблюдаться согласованность данных (они не будут изменены другой транзакцией). Использование подсказок блокировки не влияет на уровень изолированности для других транзакций.
В следующем списке дается описание существующих подсказок блокировки на уровне таблиц.
- HOLDLOCK. Захватывает разделяемую блокировку до завершения транзакции, а не освобождает ее сразу после того, как уже не требуется соответствующая таблица, страница или строка данных. Эквивалентно использованию подсказки блокировки SERIALIZABLE.
- NOLOCK. Применяется только к оператору SELECT. Не получает разделяемых блокировок и не поддерживает монопольных блокировок; читает данные, которые монопольно захвачены другой транзакцией. Эта подсказка позволяет читать нефиксированные данные ( dirty read ).
- PAGLOCK. Используется для блокировки на уровне страницы там, где обычно используется блокировка на уровне таблицы.
- READCOMMITTED. Выполняется сканирование с тем же поведением по блокировкам, как у транзакций, использующих уровень изолированности read committed (принятый по умолчанию уровень изолированности для SQL Server).
- READPAST. Применяется только к оператору SELECT и только к строкам, блокированным с помощью блокировки на уровне строк. Пропускаются строки, блокированные другими транзакциями, которые обычно включаются в набор результатов; возвращает результаты без этих блокированных строк. Может использоваться только с транзакциями, выполняемыми на уровне изолированности read committed.
- READUNCOMMITTED. Эквивалентно NOLOCK.
- REPEATABLEREAD.Выполняется сканирование с тем же поведением по блокировкам, как у транзакций, использующих уровень изолированности repeatable read.
- ROWLOCK.Используются блокировки на уровне строк вместо блокировки на уровне страниц или на уровне таблиц.
- SERIALIZABLE.Выполняется сканирование с тем же поведением по блокировкам, как у транзакций, использующих уровень изолированности serializable. Эквивалентно HOLDLOCK.
- TABLOCK.Используется блокировка на уровне таблиц вместо блокировки на уровне страниц или на уровне строк. SQL Server захватывает эту блокировку до завершения оператора.
- TABLOCKX. Используется монопольная блокировка по таблице. Внимание! Эта подсказка препятствует доступу других транзакций к этой таблице.
- UPDLOCK. Используются блокировки изменения вместо монопольных блокировок при чтении таблицы. Эта подсказка позволяет другим пользователям только читать данные и позволяет вам изменять эти данные; тем самым никакой другой пользователь не сможет модифицировать эти данные после того, как вы в последний раз прочитали их.
Вы можете объединять совместимые подсказки блокировки, такие как TABLOCK и REPEATABLEREAD, но вы не можете объединять конфликтующие подсказки, такие как REPEATABLEREAD и SERIALIZABLE. Чтобы задать подсказку блокировки на уровне таблиц, заключите эту подсказку в круглые скобки после имени таблицы в операторе T-SQL. Следующая последовательность является примером использования подсказок TABLOCKX в операторе SELECT:
USE pubs SELECT COUNT(ord_num) FROM sales (TABLOCKX) WHERE ord_date > "Sep 13 1994" GO
Подсказка TABLOCK сообщает SQL Server, что нужно захватить монопольную блокировку на уровне таблиц по таблице продаж (sales), пока не будет выполнен данный оператор. Эта подсказка обеспечивает, что никакая другая транзакция не сможет модифицировать данные в таблице sales, пока данный запрос подсчитывает заказы из этой таблицы. Будьте осторожны, используя этот вид подсказки, поскольку блокирование доступа других транзакций к этой таблице может приводить к ожиданию других транзакций, снижению времени отклика и цепному блокированию. И снова напомним: используйте подсказки блокировки на уровне таблиц только в случае абсолютной необходимости.
Заключение
В этой лекции вы ознакомились с транзакциями, включая ACID-свойства транзакции и режимы, используемые для задания начала и конца транзакции. Вы также узнали о возможностях управления блокировками SQL Server уровнях блокировок и режимах блокировок. Мы также ознакомились с блокированием, взаимоблокировками и применением подсказок блокировки. Теперь вы получили хорошее представление об основах транзакций и методах блокировки транзакций. Лекция 20 расширяет описание T-SQL, представленное в лекции 13; в этой лекции вы узнаете, как использовать операторы T-SQL INSERT, UPDATE и DELETE, а также другие операторы, которые могут вам потребоваться при написании транзакций и хранимых процедур.
Лекция 20. Расширенное описание T-SQL
Мы познакомились с этими операторами в предыдущих лекциях. Здесь также описываются ключевые слова T-SQL, используемые для управления последовательностью выполнения операторов. Вы можете использовать эти операторы и ключевые слова в любом месте, где применяется T-SQL, – в командных строках, сценариях, хранимых процедурах, в пакетных заданиях и прикладных проблемах. В частности, мы рассмотрим операторы обработки данных INSERT, UPDATE и DELETE (см. лекцию 13), а также программные конструкции IF...ELSE, WHILE и CASE.
Прежде чем перейти к нашей основной теме, мы создадим таблицу items для использования в наших примерах. (Мы создадим эту таблицу в базе данных MyDB.) Ниже приводятся операторы T-SQL, используемые для создания таблицы items:
USE MyDB GO CREATE TABLE items ( item_category CHAR(20) NOT NULL, item_id SMALLINT NOT NULL, price SMALLMONEY NULL, item_desc VARCHAR(30) DEFAULT 'No desc' ) GO
Колонка item_id могла бы вполне подойти для свойства IDENTITY. (См. раздел "Добавление свойства IDENTITY" в лекции 10). Но поскольку вы не можете явным образом помещать значения в такую колонку, то мы не используем здесь свойство IDENTITY. В данном случае мы будем использовать более гибкий подход в примерах, где используется оператор INSERT.
Оператор INSERT
Оператор INSERT, введенный в лекции 13, используется для добавления новой строки или строк в таблицу или представление. Ниже показан основной синтаксис для оператора INSERT:
INSERT [INTO] имя_таблицы [(список_колонок)] VALUES выражение | производная_таблица
Ключевое слово INTO и параметр список_колонок не являются обязательными. Параметр список_колонок указывает, в какие колонки вы помещаете данные; эти значения имеют взаимно-однозначное соответствие (по порядку) со значениями, указанными в выражении (которое может быть просто списком значений). Рассмотрим некоторые примеры.
Вставка строк
В следующем примере показано, как вставить одну строку данных в таблицу items:
INSERT INTO items (item_category, item_id, price, item_desc) VALUES ('health food', 1, 4.00, 'tofu 6 oz.') GO
Поскольку мы задали значения для каждой колонки данной таблицы и перечислили эти значения в порядке соответствующих колонок таблицы, то можно было бы совсем не использовать параметр список_колонок. Но если бы значения были заданы не в порядке колонок, то вы получили бы неверные данные или появилось бы сообщение об ошибке. Например, если запустить следующую последовательность операторов, то вы получите сообщение об ошибке, указанное после этой последовательности:
INSERT INTO items VALUES (1, 'health food', 4.00, 'tofu 6 oz.') GO Server: Msg 245, Level 16, State 1, Line 1 Syntax error converting the varchar value 'health food' to a column of data type smallint. (Синтаксическая ошибка в результате преобразования varchar-значения 'health food' в колонке данных типа smallint)
Невыполнение вставки строки и это сообщение являются следствием неверного порядка значений Мы пытались поместить значение item_id в колонку item_category и значение item_category в колонку item_id. Указанные значения несовместимы с типами данных для этих колонок. Если бы они были совместимы, то SQL Server позволил бы вставить данную строку независимо от порядка следования значений.
Чтобы увидеть, как выглядит строка, которую мы вставили в таблицу, укажите запрос выбора всех строк таблицы с помощью следующего оператора SELECT:
SELECT * from items GO Вы получите следующий набор результатов: item_category item_id price item_desc ------------------------------------------------------- health food 1 4.0000 tofu 6 oz.
При создании таблицы items было определено, что колонка price (цена) может содержать пустые значения, а для колонки item_desc (описание) было задано значение по умолчанию No desc. (Нет описания). Если в операторе INSERT не указано никакого значения для колонки price, то в эту колонку для новой строки будет помещено значение NULL. Если не указано никакого значения для колонки item_desc, то в эту колонку для новой строки будет помещено значение No desc.
Пропуск значений колонок
В первом примере оператора INSERT в предыдущем разделе мы могли бы пропустить значения, а также имена колонок для колонок price и item_desc, поскольку для них заданы значения по умолчанию. Если пропустить значение для какой-либо колонки, то мы должны включить в список_колонок имена оставшихся колонок, иначе SQL Server сопоставит перечисленные значения с колонками в порядке, указанном при определении колонок в таблице.
Например, предположим, что мы пропустим значение колонки price и вообще не укажем список_колонок, как в следующем запросе:
INSERT INTO items VALUES ('junk food', 2, 'fried pork skins') GO
SQL Server попытается поместить значение, заданное для item_desc ( fried pork skins ; третье значение в списке), в колонку price (третья колонка в таблице). В результате появится сообщение об ошибке, поскольку fried pork skins – это данные типа char, в то время как для колонки price был указан тип данных smallmoney. Это несовместимые типы данных. Сообщение об ошибке будет выведено в следующей форме:
Msg 213, Level 16, State 4, Server NTSERVER, Line 1 Insert Error: Column name or number of supplied values does not match table definition. (Имя колонки или количество представленных значений не соответствуют определению таблицы)
А теперь предположим, что тип данных для значения fried pork skins был бы совместим с типом данных для колонки price, и представим себе, как это повлияло бы на целостность таблицы. SQL Server поместил бы это значение в неверную колонку, что привело бы к несогласованности данных в таблице.
Напомним, что значение, помещаемое в таблицу или представление, должно соответствовать типу данных, совместимому с определением соответствующей колонки. Кроме того, если вставляемая строка нарушает какое-либо правило или ограничение, то вы получаете от SQL Server сообщение об ошибке и вставка не выполняется.
Чтобы избежать ошибок, связанных с несовместимыми типами данных, указывайте имена в списке_колонок в соответствии с порядком соответствующих значений, как это показано ниже:
INSERT INTO items (item_category, item_id, item_desc) VALUES ('junk food', 2, 'fried pork skins') GO
Поскольку мы не указали цену, в колонку price для данной строки будет помещено значение NULL. А теперь выполните следующий оператор SELECT:
SELECT * FROM items
Вы увидите следующий набор результатов: (в который войдут две введенные нами строки). Отметим, что в колонке price находится значение NULL.
item_category item_id price item_desc ------------------------------------------------------------------ health food 1 4.0000 tofu 6 oz. junk food 2 NULL fried pork skins
А теперь добавим другую строку, не указывая значений для колонок price и item_desc, как это показано ниже:
INSERT INTO items (item_category, item_id) VALUES ('toys', 3) GO
Набор результатов отдельно для этой строки можно получить с помощью следующего запроса:
SELECT * FROM items WHERE item_id = 3
Набор результатов будет представлен в следующей форме:
item_category item_id price item_desc ---------------------------------------------------------- toys 3 NULL No desc
Отметим, что в колонках price и item_desc находятся соответственно значения NULL и No desc. Вы можете изменить эти значения с помощью оператора UPDATE, как будет показано ниже в этой лекции.
SQL Server автоматически задает значения (когда они не указаны) для четырех типов колонок: для колонок, допускающих пустые значения ( null ), для колонок с заданным значением по умолчанию, для колонок со свойством identity и колонок с временными метками ( timestamp ). Мы уже видели, что происходит с колонками первых двух типов. Колонка identity получает следующее по порядку идентифицирующее значение, в колонку временной метки заносится текущее значение временной метки. (Эти типы колонок описаны в лекции 10.) В большинстве случае вы не можете вручную помещать значения данных в эти два типа колонок.
Добавление строк из другой таблицы
Вы можете также вставлять строки в таблицу из другой таблицы. Для этого можно использовать производную таблицу в операторе INSERT или предложение EXECUTE с хранимой процедурой, которое возвращает строку данных.
Для выполнения вставки с помощью производной таблицы создадим сначала вторую небольшую таблицу с именем two_newest_items, в которую мы поместим строки из таблицы items. Ниже показан оператор CREATE TABLE для новой таблицы:
CREATE TABLE two_newest_items ( item_id SMALLINT NOT NULL, item_desc VARCHAR(30) DEFAULT 'No desc' ) GO
Для вставки двух последних значений из колонок item_id и item_desc таблицы items в таблицу two_newest_items используйте следующий оператор INSERT:
INSERT INTO two_newest_items (item_id, item_desc) SELECT TOP 2 item_id, item_desc FROM items ORDER BY item_id DESC GO
Отметим, что вместо списка значений в этом операторе INSERT мы использовали оператор SELECT. Этот оператор возвращает данные из существующей таблицы, и эти данные используются как список значений. Кроме того, мы не использовали круглые скобки вокруг оператора SELECT, что привело бы к синтаксической ошибке.
Для получения всех строк этой новой таблицы мы можем использовать следующий запрос:
SELECT * FROM two_newest_items
Появится следующий набор результатов:
item_id item_desc --------------------- 3 No desc 2 fried pork skins
Отметим, что мы включили в оператор INSERT предложение ORDER BY item_id DESC. Это предложение указывает SQL Server, что нужно упорядочить результаты по элементу item_id в порядке убывания.
Если создать оператор SELECT в предыдущем примере вставки в виде хранимой процедуры и использовать оператор EXECUTE с именем хранимой процедуры, то мы получим те же результаты, что и в этом примере. (Хранимые процедуры описываются в лекции 21.) Для этого мы сначала удалим с помощью оператора DELETE все существующие строки в таблице two_newest_items, чтобы можно было начать работу с пустой таблицы (см. в раздел "Оператор DELETE" далее). Затем мы создадим хранимую процедуру с именем top_two и применим ее с оператором EXECUTE для вставки двух новых строк в таблицу two_newest_items. Для выполнения этих операций используются следующие операторы T-SQL:
DELETE FROM two_newest_items GO CREATE PROCEDURE top_two AS SELECT TOP 2 item_id, item_desc FROM items ORDER BY item_id DESC GO INSERT INTO two_newest_items (item_id, item_desc) EXECUTE top_two GO
Удаляются две строки, вставленные в предыдущем примере, и затем оператор INSERT помещает две новые строки (содержащие те же данные) с помощью хранимой процедуры top_two.
Оператор UPDATE
Оператор UPDATE используется для модифицирования или обновления существующих данных. Ниже показан синтаксис оператора UPDATE:
UPDATE имя_таблицы SET имя_колонки = выражение [FROM источник_для_таблицы] WHERE условие_поиска
Модифицирование строк
Основываясь на таблице items, мы обновим сначала строку junk food, которую вставили раньше без указания цены (колонка price). Чтобы найти строку, задайте в условии поиска текст fried pork skins. Чтобы задать (заменить) цену на $2, используйте следующий оператор:
UPDATE items SET price = 2.00 WHERE item_desc = 'fried pork skins' GO Теперь выберите строку junk food с помощью следующего запроса: SELECT * FROM items WHERE item_desc = 'fried pork skins' GO
Результат для строки junk food появится в следующем виде, причем исходное значение NULL колонки price будет заменено на 2.00:
item_category item_id price item_desc ------------------------------------------------------------- junk food 2 2.00 fried pork skins
Чтобы увеличить значение этого элемента на 10 процентов, вы можете запустить следующий оператор:
UPDATE items SET price = price * 1.10 WHERE item_desc = 'fried pork skins' GO
Теперь, выбрав строку junk food, вы увидите, что цена изменилась до $2.20 (значение $2, умноженное на 1.10). Цены других элементов не изменились.
С помощью оператора UPDATE вы можете модифицировать более чем одну строку. Например, чтобы модифицировать все строки в таблице items, увеличив все значения колонки price на 10 процентов, запустите следующий оператор:
UPDATE items SET price = price * 1.10 GO
Теперь в случае проверки таблицы items она будет выглядеть следующим образом:
item_category item_id price item_desc ------------------------------------------------------- health food 1 4.40 tofu 6 oz. junk food 2 2.42 fried pork skins toys 3 NULL No desc
Строки со значением NULL в колонке price не затрагиваются, поскольку NULL * 1.10 = NULL. Это не является какой-либо проблемой, и вы не получите сообщения об ошибке.
Использование предложения FROM
Оператор UPDATE позволяет вам использовать предложение FROM для указания таблицы, которая будет использоваться как источник данных при модифицировании. В список источников таблиц могут включаться имена таблиц, имена представлений, функции rowset, производные таблицы и связанные таблицы. Источником может быть даже таблица, находящаяся в процессе модифицирования. Чтобы понять, как действует этот процесс, создадим еще одну небольшую таблицу. Ниже показаны оператор CREATE TABLE для нашей новой таблицы с именем tax и оператор INSERT для вставки строки со значением 5.25 в колонку tax_percent (процент налогообложения):
CREATE TABLE tax ( tax_percent real NOT NULL, change_date smalldatetime DEFAULT getdate() ) GO INSERT INTO tax (tax_percent) VALUES (5.25) GO
В колонку change_date (дата изменения) будут помещены текущие дата и время, полученные из ее используемой по умолчанию функции GETDATE, поскольку дата не была задана явным образом.
Теперь добавим к нашей исходной таблице items новую колонку price_with_tax (цена с налогами), допускающую пустые значения, как это показано ниже:
ALTER TABLE items ADD price_with_tax smallmoney NULL GO
Затем нам нужно модифицировать новую колонку price_with_tax, чтобы она содержала результат операции items.price * tax.tax_percent для всех строк таблицы items. Для этого используйте следующий оператор UPDATE с предложением FROM:
UPDATE items SET price_with_tax = i.price + (i.price * t.tax_percent / 100) FROM items i, tax t GO
Этот оператор UPDATE реально подходит как триггер, который будет запускаться при вставке значения в колонку price. Триггер – это специальный тип хранимой процедуры, которая автоматически выполняется при возникновении определенных условий. (О триггерах см. лекцию 22.)
Использование производных таблиц
Еще одним способом использования оператора UPDATE является применение производной таблицы (или подзапроса) в предложении FROM. Производная таблица используется как входной параметр для внешнего оператора UPDATE. Для этого примера мы будем использовать в данном подзапросе таблицу two_newest_items table и таблицу items во внешнем операторе UPDATE. Нам нужно модифицировать две последние строки в таблице items, чтобы они содержали в колонке price_with_tax значение NULL. Выполняя запрос в таблице two_newest_items, мы можем найти значения item_id для строк, которые требуется модифицировать в таблице items. Это осуществляется с помощью следующего оператора:
UPDATE items SET price_with_tax = NULL FROM (SELECT item_id FROM two_newest_items) AS t1 WHERE items.item_id = t1.item_id GO
Оператор SELECT применяется как подзапрос, результаты которого помещаются во временную производную таблицу с именем t1, которая затем используется в условии поиска (предложение WHERE ). В результате подзапроса мы получаем значения item_id 2 и 3. Таким образом, затрагиваются две строки таблицы items со значениями 2 или 3. Строка со значением item_id, равным 3, уже имеет значение NULL в колонке price_with_tax, поэтому ее значения не изменяются. А в строке со значением item_id, равным 3 vv, значение price_with_tax действительно изменяется на NULL. Набор результатов, где показаны все строки таблицы items, выглядит после этой модификации следующим образом:
item_category item_id price item_desc price_with_tax -------------------------------------------------------------------------------- health food 1 4.40 tofu 6 oz. 4.6310 junk food 2 2.42 fried pork skins NULL toys 3 NULL No desc NULL
Оператор DELETE
Оператор DELETE используется для удаления строки или строк из таблицы или представления. DELETE не влияет на определение таблицы; он просто удаляет из таблицы строки данных. Ниже показан синтаксис для оператора DELETE:
DELETE [FROM] имя_таблицы | имя_представления [FROM источники_для_таблицы] WHERE условие_поиска
Первое ключевое слово FROM не является обязательным, как и второе предложение FROM. Строки не удаляются из источников для таблицы во втором предложении FROM ; они удаляются только из таблицы или представления, указанного после DELETE.
Удаление отдельных строк
Используя предложение WHERE вместе с DELETE, вы можете указывать определенные строки для удаления из таблицы. Например, чтобы удалить из таблицы items все строки со значением toys в колонке item_category, выполните следующий оператор:
DELETE FROM items WHERE item_category = 'toys' GO
Этот оператор удаляет из нашей таблицы items одну строку.
Вы можете использовать второе предложение FROM с одним или несколькими источниками для таблицы, чтобы указать другие таблицы и представления, которые можно использовать в условии поиска WHERE. Например, чтобы удалить из таблицы items строки, соответствующие строкам в таблице two_newest_items, выполните следующий оператор:
DELETE items FROM two_newest_items WHERE items.item_id = two_newest_items.item_id GO
Отметим, что в этом операторе мы опустили первое необязательное ключевое слово FROM. Первые две строки таблицы two_newest_items содержат в колонке item_id значения 2 и 3. Таблица items содержит в колонке item_id значения 1 и 2. Поэтому удаляется строка со значением item_id, равным 2 (соответствующая условию поиска). Процесс удаления не влияет на две строки в таблице two_newest_items (источник для таблицы).
Удаление всех строк
Чтобы удалить из таблицы все строки, используйте оператор DELETE без предложения WHERE. Следующий оператор DELETE удалит все строки в таблице two_newest_items table:
DELETE FROM two_newest_items GO
Теперь two_newest_items – пустая таблица: она не содержит никаких данных. Если вы хотите также удалить определение таблицы, используйте оператор DROP TABLE, как это показано ниже. (Об этом операторе см. лекцию 15.)
DROP TABLE two_newest_items GO
Ключевые слова для программирования
Вместе с операторами T-SQL можно использовать несколько полезных ключевых слов, позволяющих создавать программные конструкции для управления программной последовательностью. Эти конструкции можно использовать внутри пакетов (групп операторов T-SQL, которые выполняются за один раз), хранимых процедур, сценариев и эпизодических ( ad hoc ) запросов. (Для примеров в этом разделе используется база данных pubs.)
IF...ELSE
Конструкция IF...ELSE используется для наложения условий, определяющих, какие операторы T-SQL нужно выполнить. Для IF...ELSE используется следующий синтаксис:
IF Булево_выражение Оператор_T-SQL | блок_операторов [ELSE Оператор_T-SQL | блок_операторов]
Булево_выражение возвращает значение TRUE или FALSE. Если выражение в предложении IF возвращает значение TRUE, то выполняются следующие операторы, а предложение ELSE и его операторы не выполняются. Если выражение возвращает значение FALSE, то выполняются только операторы, следующие после ключевого слова ELSE. Блок_операторов просто указывает на использование более чем одного оператора T-SQL. При использовании блока операторов вы должны задавать ключевые слова BEGIN и END, указывающие начало и конец каждого блока, – будь то блок в предложении IF, предложении ELSE или в обоих предложениях.
Вы можете использовать предложение IF без предложения ELSE. Рассмотрим сначала пример, где используется только IF. В следующем примере происходит проверка выражения, и если результатом этого выражения является значение TRUE, то выполняется последующий оператор PRINT:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 5000 PRINT 'Year-to-date sales are greater than $5,000 for PC1035.' GO
Значение выражения IF будет равно TRUE, поскольку значение ytd_sales для строки с title_id = "PC1035" равно 8780. Будет выполнен оператор PRINT, и на экране будет выведен текст "Year-to-date sales are greater than $5,000 for PC1035" (Объем продаж на текущий год для PC1035 больше $5000).
А теперь добавим к предыдущему примеру предложение ELSE и изменим > 5000 на > 9000. Соответствующий пример показан ниже:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 9000 PRINT 'Year-to-date sales are greater than $9,000 for PC1035.' ELSE PRINT 'Year-to-date sales are less than or equal to $9,000 for PC1035.' GO
В данном случае будет выполнен оператор PRINT, следующий после предложения ELSE, поскольку выражение IF возвращает значение FALSE.
Расширим этот пример, добавив блоки операторов после предложений IF и ELSE. Выводимое сообщение и выполняемый запрос будут зависеть от значения выражения IF ( TRUE или FALSE ). Ниже приводится этот пример:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 9000 BEGIN PRINT 'Year-to-date sales are greater than $9,000 for PC1035.' SELECT ytd_sales FROM titles WHERE title_id = 'PC1035' END ELSE --ytd_sales должно быть <= 9000. BEGIN PRINT 'Year-to-date sales are less than or equal to $9,000 for PC1035.' SELECT price FROM titles WHERE title_id = 'PC1035' END GO
Если значение выражения IF равно FALSE, то выполняются операторы между BEGIN и END в предложении ELSE. Сначала выполняется оператор PRINT и затем – оператор SELECT, показывающий, что книга стоит $22.95.
Вы можете также использовать вложенные операторы IF после предложения IF или после предложения ELSE. Например, чтобы использовать вложенные операторы IF...ELSE для определения диапазона, в который попадает среднее значение ytd_sales для всех заголовков, выполните следующий пример:
IF (SELECT avg(ytd_sales) FROM titles) < 10000 IF (SELECT avg(ytd_sales) FROM titles) < 5000 IF (SELECT avg(ytd_sales) FROM titles) < 2000 PRINT 'Average year-to-date sales are less than $2,000.' ELSE PRINT 'Average year-to-date sales are between $2,000 and $4,999.' ELSE PRINT 'Average year-to-date sales are between $5,000 and $9,999.' ELSE PRINT 'Average year-to-date sales are greater than $9,999.' GO
При выполнении этого примера вы дважды увидите среди результатов следующее предупреждающее сообщение: "Warning: Null value eliminated from aggregate" (Предупреждение: Значение Null исключено из совокупности). Это сообщение просто означает, что пустые значения ( null ) колонки ytd_sales не учитывались как значения при расчете среднего значения. Конечным результатом этого примера будет "Average year-to-date sales are between $5,000 and $9,999" (Среднее значение продаж на текущий год в диапазоне от $5000 до $9999), поскольку среднее значение равно $6090. Будьте аккуратны при использовании вложенных операторов IF. Можно легко запутаться в том, какой IF относится к очередному ELSE, или оставить IF без соответствующего ELSE. Использование символов табуляции для отступов, как в предыдущем примере, упрощает определение соответствующих пар IF...ELSE.
WHILE
Конструкция WHILE используется для проверки условия, которое вызывает повторяющееся выполнение какого-либо оператора или блока операторов, пока значение это условия равно TRUE. Эту конструкцию обычно называют циклом WHILE, так как операторы внутри конструкции WHILE выполняются циклическим образом. Ниже приводится синтаксис:
WHILE Булево_выражение Оператор_T-SQL | Блок_операторов [BREAK] Оператор_T-SQL | Блок_операторов [CONTINUE]
Как и в предложениях IF...ELSE, вы задаете в цикле WHILE блок операторов с помощью BEGIN и END. Ключевое слово BREAK используется для выхода из цикла WHILE, после чего выполнение продолжается с оператора, следующего после конца цикла WHILE. Если цикл WHILE встроен в другие циклы WHILE, то ключевое слово BREAK вызывает выход только из того цикла WHILE, в котором оно находится; любые операторы вне этого цикла, а также внешние циклы продолжают выполняться. Ключевое слово CONTINUE в цикле указывает, что следует повторить операторы между ключевыми словами BEGIN и END в данном цикле, игнорируя любые другие операторы после CONTINUE.
Рассмотрим пример, где простой цикл WHILE используется для выполнения одного оператора UPDATE. В этом цикле WHILE проверяется условие, что среднее значение по колонке royalty меньше 20. Если результатом проверки является значение TRUE, то колонка royalty модифицируется (увеличивается на 5 процентов). Затем условие цикла WHILE проверяется снова и модификация повторяется, пока среднее значение колонки royalty не станет равным или больше 20. Цикл имеет следующий вид:
WHILE (SELECT AVG(royalty) FROM roysched) < 20 UPDATE roysched SET royalty = royalty * 1.05 GO
Поскольку среднее значение колонки royalty (ставка арендной платы) сначала было равно 15, этот цикл WHILE выполнится 6 раз, прежде чем среднее значение не достигнет 20 ; затем выполнение цикла прекращается, поскольку результатом проверяемого условия становится значение FALSE.
Теперь рассмотрим пример, где в цикле WHILE используются BREAK, CONTINUE, BEGIN и END. Вы будет повторять в цикле оператор UPDATE, пока среднее значение royalty не превысит 25 процентов. Но если во время цикла максимальное значение royalty в таблице превысит 27 процентов, то мы прервем цикл независимо от среднего значения. Мы также добавим оператор SELECT после конца цикла WHILE. Ниже приводится соответствующая последовательность T-SQL:
WHILE (SELECT AVG(royalty) FROM roysched) < 25 BEGIN UPDATE roysched SET royalty = royalty * 1.05 IF (SELECT MAX(royalty)FROM roysched) > 27 BREAK ELSE CONTINUE END SELECT MAX(royalty) AS "MAX royalty" FROM roysched GO
Этот цикл будет выполнен только один раз, поскольку значение royalty больше 27 уже имеется в этой таблице. Оператор UPDATE все же выполняется один раз, так как среднее значение меньше 25 процентов. Затем проверяется условие оператора IF, и результатом является значение TRUE, поэтому выполняется оператор BREAK, вызывающий выход из цикла WHILE. Выполнение программы затем продолжается, начиная с оператора, следующего за ключевым словом END (последний оператор SELECT ).
Напомним, что вы можете также использовать вложенные циклы WHILE, но следует учитывать, что ключевое слово BREAK или CONTINUE применяется только к циклу, из которого оно было вызвано, но не к внешним циклам WHILE.
CASE
Ключевое слово CASE используется для оценки списка условий и возврата одного из нескольких возможных результатов. Возвращаемый результат зависит от того, какое условие совпадает с другим указанным условием или является истинным. Наиболее распространенным применением CASE является замена кодового или сокращенного значения на более понятное значение и упорядочивание значений, как будет показано в наших примерах этого раздела. Имеется два формата для конструкции CASE: простой и поисковый. В простом формате на входе после CASE задается в виде выражения значение, которое проверяется на равенство со значением в выражении или выражениях WHEN. В поисковом формате происходит проверка булева выражения на значение TRUE или FALSE, а не проверка на равенство с каким-либо значением. Сначала рассмотрим простой формат. В простом формате предложение CASE имеет следующий синтаксис:
CASE входное_выражение WHEN выражение_для_when THEN результирующее_выражение [WHEN выражение_для_when THEN результирующее_выражение...n] [ELSE выражение_для_else] END
Значение результирующего выражения возвращается в том случае, если значение соответствующего выражения WHEN равно значению входного выражения. Выражения сравниваются в порядке их следования в предложении CASE. Если не обнаружено ни одного совпадения, то возвращается значение результирующего выражения ELSE (если оно задано); в противном случае возвращается значение NULL. Отметим, что в простом формате значение входного выражения CASE и значение выражения WHEN должны иметь одинаковый тип данных или допускать неявное преобразование типов.
В следующем примере используется простой формат предложения CASE внутри оператора SELECT. Колонка payterms (сроки платежей) таблицы sales (продажи) содержит одно из следующих значений для каждой строки: Net 30, Net 60, On invoice или None. С помощью следующего оператора T-SQL в колонке payterms можно выводить на экран альтернативные (более понятные) значения:
SELECT 'Payment Terms' = (сроки платежей) CASE payterms WHEN 'Net 30' THEN 'Payable 30 days --к оплате в течение 30 дней after invoice' --после получения счета-фактуры WHEN 'Net 60' THEN 'Payable 60 days --к оплате в течение 60 дней after invoice' --после получения счета-фактуры WHEN 'On invoice' THEN 'Payable upon --к оплате по receipt of invoice' --получении счета-фактуры ELSE 'None' END, title_id FROM sales ORDER BY payterms GO
В этом предложении CASE проверяется значение payterms для каждой строки, указанной в операторе SELECT. Значение результирующего выражения возвращается в том случае, если значение выражения WHEN равно значению колонки payterms. Результаты предложения CASE появляются в колонке Payment Terms результирующего набора, как это показано ниже:
Payment Terms title_id ---------------------------------------------------- Payable 30 days after invoice PC8888 Payable 30 days after invoice TC3218 Payable 30 days after invoice TC4203 Payable 30 days after invoice TC7777 Payable 30 days after invoice PS2091 Payable 30 days after invoice MC3021 Payable 30 days after invoice BU1111 Payable 30 days after invoice PC1035 Payable 60 days after invoice PS1372 Payable 60 days after invoice PS2106 Payable 60 days after invoice PS3333 Payable 60 days after invoice PS7777 Payable 60 days after invoice BU7832 Payable 60 days after invoice MC2222 Payable 60 days after invoice PS2091 Payable 60 days after invoice BU1032 Payable 60 days after invoice PS2091 Payable upon receipt of invoice PS2091 Payable upon receipt of invoice BU1032 Payable upon receipt of invoice BU2075 Payable upon receipt of invoice MC3021 (21 row(s) affected)
А теперь рассмотрим второй формат предложения CASE – поисковый формат. В этом формате предложение CASE имеет следующий синтаксис:
CASE WHEN Булево_выражение THEN результирующее_выражение [WHEN Булево_выражение THEN результирующее_выражение...n] [ELSE результирующее_выражение_для_else] END
Предложение CASE в поисковом формате отличается от CASE в простом формате тем, что в поисковом формате после ключевого слова CASE нет входного выражения, а после ключевых слов WHEN следуют булевы выражения, которые проверяются на значение TRUE или FALSE (а не на равенство). В поисковом формате предложение CASE проверяет значения булевых выражений и выводит значение результирующего выражения для первого булева выражения, возвращающего значение TRUE. (Выражения проверяются в порядке их следования.)
Например, предложение CASE внутри следующего оператора SELECT проверяет значение колонки price (цена) каждой строки и возвращает символьную строку, соответствующую диапазону цен (Price Range), в который попадает цена данной книги:
SELECT 'Price Range' = CASE WHEN price BETWEEN .01 AND 10.00 THEN 'Inexpensive: $10.00 or less' --дешевые WHEN price BETWEEN 10.01 AND 20.00 THEN 'Moderate: $10.01 to $20.00' --умеренные WHEN price BETWEEN 20.01 AND 30.00 THEN 'Semi-expensive: $20.01 to $30.00' --не слишком дорогие WHEN price BETWEEN 30.01 AND 50.00 THEN 'Expensive: $30.01 to $50.00' --дорогие WHEN price IS NULL THEN 'No price listed' --цена не указана ELSE 'Very expensive!' --очень дорогие END, title_id FROM titles ORDER BY price GO
Результирующий набор имеет следующий вид:
Price Range title_id ———————————————— ———— No price listed MC3026 No price listed PC9999 Inexpensive: $10.00 or less MC3021 Inexpensive: $10.00 or less BU2075 Inexpensive: $10.00 or less PS2106 Inexpensive: $10.00 or less PS7777 Moderate: $10.01 to $20.00 PS2091 Moderate: $10.01 to $20.00 BU1111 Moderate: $10.01 to $20.00 TC4203 Moderate: $10.01 to $20.00 TC7777 Moderate: $10.01 to $20.00 BU1032 Moderate: $10.01 to $20.00 BU7832 Moderate: $10.01 to $20.00 MC2222 Moderate: $10.01 to $20.00 PS3333 Moderate: $10.01 to $20.00 PC8888 Semi-expensive: $20.01 to $30.00 TC3218 Semi-expensive: $20.01 to $30.00 PS1372 Semi-expensive: $20.01 to $30.00 PC1035 (18 row(s) affected)
Другие ключевые слова
Ниже приводятся другие ключевые слова, которые можно использовать для управления программной последовательностью:
- GOTO метка. Выполняет передачу управления на метку, определенную в GOTO.
- RETURN. Безусловный выход из запроса или процедуры.
- WAITFOR. Задает задержку или определенное время для выполнения оператора.
Заключение
В этой лекции мы рассмотрели использование операторов T-SQL INSERT, UPDATE и DELETE. Мы также рассмотрели ключевые слова T-SQL IF, ELSE, WHILE, BEGIN, END и CASE, которые используются для управления программной последовательностью. В лекции 21 вы узнаете, как создавать хранимые процедуры, в которых вы можете использовать эти операторы и конструкции.
Лекция 21. Создание хранимых процедур и управление этими процедурами
В этой лекции вы ознакомитесь с хранимыми процедурами Microsoft SQL Server 2000, а также с их использованием. Сначала мы рассмотрим типы хранимых процедур, используемых в SQL Server. Затем вы узнаете, как создавать ваши собственные хранимые процедуры и управлять этими процедурами, а также как определять параметры и переменные. Для создания хранимых процедур вы можете использовать четыре метода. В этой лекции описывается, как использовать язык Transact-SQL (T-SQL), утилиту SQL Server Enterprise Manager и мастер создания хранимых процедур Create Stored Procedure Wizard. Четвертый метод создания хранимых процедур – использование SQL Distributed Management Objects (SQL-DMO) – не рассматривается здесь, поскольку он относится к прикладному программированию. Как вы увидите, для всех трех методов, описанных в этой лекции, требуется, чтобы вы использовали операторы T-SQL, поэтому уделите особое внимание описанию первого метода в разделе "Использование оператора CREATE PROCEDURE".
Что такое хранимая процедура?
Хранимая процедура – это набор операторов T-SQL, который компилируется системой SQL Server в единый "план исполнения". Этот план сохраняется в кэш-области памяти для процедур при первом выполнении хранимой процедуры, что позволяет использовать этот план повторно; системе SQL Server не требуется снова компилировать эту процедуру при каждом ее запуске. Хранимые процедуры T-SQL аналогичны процедурам в других языках программирования в том смысле, что они допускают входные параметры и возвращают выходные значения в виде параметров или сообщения о состоянии (успешное или неуспешное завершение). Все операторы процедуры обрабатываются при вызове процедуры. Хранимые процедуры используются для группирования операторов T-SQL и любых логических конструкций, необходимых для выполнения задачи. Поскольку хранимые процедуры сохраняются в виде процедурных блоков, они могут использоваться различными пользователями для согласованного повторяемого выполнения одинаковых задач и даже в различных приложениях. Хранимые процедуры также позволяют поддерживать единый подход к управлению задачей, что помогает обеспечивать согласованное и корректное внедрение любых деловых правил.
Ваше приложение может взаимодействовать с SQL Server двумя способами: вы можете программировать в приложении отправку операторов T-SQL от клиента на SQL Server или можете создавать хранимые процедуры, которые хранятся и выполняются на сервере. Если вы отправляете ваши операторы T-SQL на сервер, то эти операторы передаются через сеть и рекомпилируются SQL Server каждый раз, когда происходит их запуск. Используя хранимые процедуры, вы можете выполнять их путем вызова из вашего приложения с помощью одного оператора. Как уже говорилось, при первом запуске хранимой процедуры происходит ее компиляция и создание плана ее исполнения, который сохраняется в памяти. Затем при последующих вызовах этой процедуры SQL Server использует этот план исполнения без необходимости повторного компилирования. Поэтому в тех случаях, когда для выполнения задачи требуется выполнить несколько операторов T-SQL или когда требуется частая обработка какого-либо оператора, использование хранимой процедуры способствует снижению сетевого трафика и может оказаться эффективнее и быстрее, чем отправка каждого оператора через сеть от клиента на сервер.
Использование хранимых процедур может повысить производительность и в других отношениях. Например, использование хранимых процедур для проверки условий сервера может повысить производительность за счет снижения количества данных, которые должны передаваться между клиентом и сервером, и снижения объема обработки, выполняемой на клиентской машине. Для проверки какого-либо условия из хранимой процедуры можно включить в хранимую процедуру условные операторы (например, конструкции IF и WHILE, см. лекцию 20). Логика этой проверки будет обрабатываться на сервере с помощью хранимой процедуры, поэтому вам не потребуется программировать эту логику в самом приложении а серверу не нужно будет возвращать промежуточные результаты клиенту для проверки данного условия. Вы можете также вызывать хранимые процедуры из сценариев, пакетных заданий и интерактивных командных строк с помощью операторов T-SQL, показанных в примерах далее.
Хранимые процедуры также обеспечивают простой доступ к базе данных для пользователей. Пользователи могут осуществлять доступ к базе данных, не зная деталей архитектуры таблиц и без непосредственного доступа к данным таблиц, – они просто запускают процедуры, которые выполняют требуемые задачи. Тем самым хранимые процедуры помогают обеспечивать соблюдение деловых правил.
Хранимые процедуры могут принимать входные параметры, использовать локальные переменные и возвращать данные. Хранимые процедуры могут возвращать данные с помощью выходных параметров, а также могут возвращать коды завершения, результирующие наборы из операторов SELECT или глобальные курсоры. Вы увидите примеры этих методов (кроме использования глобальных курсоров) в последующих разделах.
Имеется три типа хранимых процедур: системные хранимые процедуры, расширенные хранимые процедуры и простые определяемые пользователем хранимые процедуры. Системные хранимые процедуры предоставляет SQL Server, и они имеют префикс sp_. Они используются для управления SQL Server и вывода на экран информации о базах данных и пользователях. Системные хранимые процедуры были введены в лекции 13. Расширенные хранимые процедуры являются динамически подключаемыми библиотеками (DLL), которые может динамически загружать и выполнять SQL Server. Обычно их пишут на C или C++, и они исполняют процедуры, внешние относительно SQL Server. Расширенные хранимые процедуры имеют префикс xp_. Простые определяемые пользователем хранимые процедуры создаются пользователем и настраиваются для выполнения тех задач, которые требуются данному пользователю.
В этой лекции мы будет в основном рассматривать простые определяемые пользователем хранимые процедуры. Но прежде чем перейти к изучению этих процедур, мы кратко изложим некоторые базовые сведения о расширенных хранимых процедурах. Расширенные хранимые процедуры придают высокую степень гибкости и расширяемости среде SQL Server. Они позволяют создавать ваши собственные внешние процедуры на C, C++ или других языках программирования. Расширенные внешние процедуры выполняются в том же стиле, что и два других типа хранимых процедур. Вы можете передавать параметры в расширенные хранимые процедуры, как и в другие типы хранимых процедур, и они могут возвращать результирующие наборы и/или сообщения о состоянии.
Как уже говорилось, расширенные хранимые процедуры – это библиотеки DLL, которые динамически загружает и выполняет SQL Server. Они выполняются непосредственно в адресном пространстве SQL Server, и вы можете программировать их, используя интерфейс прикладного программирования (API) SQL Server Open Data Services.
Расширенные хранимые процедуры пишут вне SQL Server. Закончив разработку расширенной хранимой процедуры, вы регистрируете ее в SQL Server с помощью операторов T-SQL или через Enterprise Manager.
Создание хранимых процедур
В этом разделе мы рассмотрим три метода создания хранимой процедуры: использование оператора T-SQL CREATE PROCEDURE, использование Enterprise Manager и использование мастера Create Stored Procedure Wizard. Независимо от выбранного метода не забывайте тестировать каждую процедуру, выполняя при необходимости последующее редактирование, пока она не будет работать должным образом.
Использование оператора CREATE PROCEDURE
Оператор CREATE PROCEDURE имеет следующий синтаксис:
CREATE PROC[EDURE] имя_процедуры [ {@имя_параметра тип_данных} ] [= по_умолчанию][OUTPUT] [,...,n] AS оператор(ы)_t-sql
Создадим какую-либо простую хранимую процедуру. Эта процедура будет выбирать (и возвращать) три колонки данных для каждой строки таблицы Orders, в которой дата колонки ShippedDate больше даты колонки RequiredDate. Отметим, что хранимая процедура может быть создана только в текущей базе данных, к которой осуществляется доступ, поэтому сначала следует указать эту базу данных с помощью оператора USE. Прежде чем создать эту процедуру, мы выясним также, существует ли хранимая процедура с именем, которое мы хотим использовать. Если она существует, то мы удалим ее, и затем создадим новую процедуру с этим именем. Ниже показан набор T-SQL, используемый для создания этой процедуры:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "LateShipments" AND type = "P") DROP PROCEDURE LateShipments GO CREATE PROCEDURE LateShipments AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers WHERE ShippedDate > RequiredDate AND Orders.ShipVia = Shippers.ShipperID GO
Если запустить данный набор, то будет создана хранимая процедура. Для запуска хранимой процедуры просто обратитесь к ней по имени, как это показано ниже:
LateShipments GO
Процедура LateShipments возвратит 37 строк данных.
Если оператор, вызывающий данную процедуру, входит в пакет операторов и не является первым оператором этого пакета, то вы должны использовать вместе с вызовом процедуры ключевое слово EXECUTE (сокращается до "EXEC"), как это показано в следующем примере:
SELECT getdate() EXECUTE LateShipments GO
Вы можете использовать ключевое слово EXECUTE, даже если процедура выполняется как первый оператор в пакете или является единственным оператором, который у вас выполняется.
Использование параметров
Теперь добавим к нашей хранимой процедуре входной параметр, чтобы мы могли передавать данные в эту процедуру. Чтобы задать входные параметры в хранимой процедуре, укажите список этих параметров с символом @ перед именем каждого параметра, т.е. @имя_параметра. Вы можете задать в хранимой процедуре до 1024 параметров. В нашем примере мы создадим параметр с именем @shipperName. При запуске хранимой процедуры мы укажем имя компании-грузоотправителя (shipperName), и результатом запроса будут строки только для этого грузоотправителя. Ниже приводится T-SQL-программа, используемая для создания новой хранимой процедуры:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "LateShipments" AND type = "P") DROP PROCEDURE LateShipments GO CREATE PROCEDURE LateShipments @shipperName char(40) AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers WHERE ShippedDate > RequiredDate AND Orders.ShipVia = Shippers.ShipperID AND Shippers.CompanyName = @shipperName GO
Для запуска этой хранимой процедуры вы должны указать входной параметр. Если параметр не указан, SQL Server выведет сообщение об ошибке, например, в следующей форме:
Procedure LateShipments, Line 0 Procedure 'LateShipments' expects parameter '@shipperName', which was not supplied. (Процедура LateShipments, Строка 0 процедуры 'LateShipments', предполагается параметр '@shipperName', который не был указан) Чтобы получить строки для грузоотправителя Speedy Express, выполните следующие операторы: USE Northwind GO EXECUTE LateShipments "Speedy Express" GO
Вы увидите 12 строк, возвращенные в результате вызова этой хранимой процедуры.
Вы можете также задать для параметра значение по умолчанию, которое будет использоваться, когда этот параметр не указан в обращении к процедуре. Например, чтобы использовать для вашей хранимой процедуры значение по умолчанию United Package, измените текст создаваемой процедуры следующим образом: (изменена только строка CREATE PROCEDURE )
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "LateShipments" AND type = "P") DROP PROCEDURE LateShipments GO CREATE PROCEDURE LateShipments @shipperName char(40) = "United Package" AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers WHERE ShippedDate > RequiredDate AND Orders.ShipVia = Shippers.ShipperID AND Shippers.CompanyName = @shipperName GO
Теперь при запуске процедуры LateShipments без входного параметра ( @shipperName ) по умолчанию для этого параметра будет использоваться значение United Package ; процедура возвратит 16 строк. Но если вы укажете входной параметр, то его значение заместит значение, определенное по умолчанию.
Для возврата значения параметра хранимой процедуры в вызывающую программу используйте ключевое слово OUTPUT после имени этого параметра. Чтобы сохранить значение в переменной, которую можно использовать в вызывающей программе, используйте при вызове хранимой процедуры ключевое слово OUTPUT. Чтобы увидеть, как это происходит, мы создадим новую хранимую процедуру, которая выбирает цену единицы указанного продукта. Входной параметр @prod_id – это идентификатор продукта, а выходной параметр @unit_price – это возвращаемое значение цены единицы продукта. В вызывающей программе будет объявлена локальная переменная с именем @price, которая будет использоваться для сохранения возвращаемого значения. Ниже приводится набор операторов, используемый для создания хранимой процедуры GetUnitPrice:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "GetUnitPrice" AND type = "P") DROP PROCEDURE GetUnitPrice GO CREATE PROCEDURE GetUnitPrice @prod_id int, @unit_price money OUTPUT AS SELECT @unit_price = UnitPrice FROM Products WHERE ProductID = @prod_id GO
Прежде чем использовать переменную в вызове хранимой процедуры, вы должны объявить эту переменную в вызывающей программе. Например, в следующей программе мы сначала объявим переменную @price и присвоим ей тип данных money (который должен быть совместим с типом данных выходного параметра), а затем выполним хранимую процедуру:
DECLARE @price money EXECUTE GetUnitPrice 77, @unit_price = @price OUTPUT PRINT CONVERT(varchar(6), @price) GO
Оператор PRINT возвращает значение 13.00 в переменной @price. Отметим, что мы использовали оператор CONVERT для преобразования значения @price в данные типа varchar, чтобы их можно было напечатать как строку, как символьный тип данных или как тип данных, которые могут быть неявно преобразованы в символьный тип, что требуется для оператора PRINT.
Кроме того, отметим, что в хранимой процедуре и в вызывающей программе для выходных переменных использовались различные имена, чтобы вам было легче следить за положением этих переменных в примере и чтобы показать, что можно использовать различные имена.
При обращении к хранимой процедуре вы можете также задать входное значение в выходном параметре. Это означает, что это значение будет введено в хранимую процедуру, где это значение может быть изменено или использовано для операций; затем новое значение возвращается в вызывающую программу. Чтобы поместить входное значение в выходной параметр, нужно просто присвоить это значение соответствующей переменной в вызывающей программе перед выполнением процедуры или выполнить запрос, который считывает значение в переменную и затем передает эту переменную в хранимую процедуру. А теперь рассмотрим использование локальных переменных внутри хранимой процедуры.
Использование локальных переменных внутри хранимой процедуры
Как показано в предыдущем разделе, для создания локальных переменных используется ключевое слово DECLARE. При создании локальной переменной вы должны задать для нее имя и тип данных, а также поставить перед именем переменной символ @. При объявлении переменной ей первоначально присваивается значение NULL.
Локальные переменные можно объявлять в пакете, в сценарии (или вызывающей программе) или в хранимой процедуре. Переменные часто используются в хранимых процедурах для хранения значений, которые будут проверяться в условном операторе или возвращаться оператором RETURN хранимой процедуры. Переменные в хранимых процедурах часто используются как счетчики. Область действия локальной переменной в хранимой процедуре начинается с точки объявления этой переменной и заканчивается выходом из данной процедуры. После выхода из хранимой процедуры эта переменная уже недоступна для использования.
Рассмотрим пример хранимой процедуры, содержащей локальные переменные. Эта процедура вставляет пять строк в таблицу с помощью циклической конструкции WHILE. Сначала мы создадим таблицу с именем mytable для этого примера и затем создадим хранимую процедуру InsertRows. В этой процедуре мы будем использовать локальные переменные @loop_counter и @start_val, которые объявим вместе и разделим запятой. В следующей T-SQL-программе создается таблица и хранимая процедура:
USE MyDB GO CREATE TABLE mytable ( column1 int, column2 char(10) ) GO CREATE PROCEDURE InsertRows @start_value int AS DECLARE @loop_counter int, @start_val int SET @start_val = @start_value – 1 SET @loop_counter = 0 WHILE (@loop_counter < 5) BEGIN INSERT INTO mytable VALUES (@start_val + 1, "new row") PRINT (@start_val) SET @start_val = @start_val + 1 SET @loop_counter = @loop_counter + 1 END GO
А теперь выполним эту хранимую процедуру с начальным значением 1, как это показано ниже:
EXECUTE InsertRows 1 GO
Вы увидите пять значений, выведенных для @start_val: 0, 1, 2, 3 и 4.
Выберите все строки из таблицы mytable с помощью следующего оператора:
SELECT * FROM mytable GO
После выполнения этого оператора SELECT мы получим следующие выходные результаты:
column1 column2 ----------------------- 1 new row 2 new row 3 new row 4 new row 5 new row
После завершения хранимой процедуры переменные @loop_counter и @start_val уже недоступны. Вы получите сообщение об ошибке, если попытаетесь вывести их с помощью следующего оператора T-SQL:
PRINT (@loop_counter) PRINT (@start_val) GO
Сообщение об ошибке будет иметь следующую форму:
Msg 137, Level 15, State 2, Server JAMIERE3, Line 1 Must declare the variable '@loop_counter'. (Должна быть объявлена переменная '@loop_counter') Msg 137, Level 15, State 2, Server JAMIERE3, Line 2 Must declare the variable '@start_value'. (Должна быть объявлена переменная '@start_value')
Те же правила, связанные с областью действия переменной, применимы к выполнению пакетного набора операторов. Как только появляется ключевое слово GO (являющееся признаком конца пакета), локальные переменные, объявленные внутри пакета, становятся недоступны. Область действия локальной переменной находится только в пределах пакета. Чтобы лучше понять эти правила, рассмотрим вызов хранимой процедуры в одном из приведенных выше примеров:
USE Northwind GO DECLARE @price money EXECUTE GetUnitPrice 77, @unit_price = @price OUTPUT PRINT CONVERT(varchar(6), @price) GO PRINT CONVERT(varchar(6), @price) GO
В первом операторе PRINT выводится значение локальной переменной @price из данного пакета. Во втором операторе сделана попытка вывести его снова вне пакета, но в результате появится сообщение об ошибке в следующей форме:
13.00 Msg 137, Level 15, State 2, Server JAMIERE3, Line 2 Must declare the variable '@price'. (Должна быть объявлена переменная '@price')
Отметим, что первый оператор PRINT выполнен успешно. (Он вывел значение 13.00.)
Возможно, вам потребуется использовать операторы BEGIN TRANSACTION, COMMIT и ROLLBACK в хранимой процедуре, которая содержит более одного оператора T-SQL. Это позволяет указывать, какие операторы должны быть сгруппированы как одна транзакция. (Об использовании транзакций и этих операторов см. лекцию 19.)
Использование RETURN
Вы можете возвращаться из любой точки хранимой процедуры в вызывающую программу с помощью ключевого слова RETURN, обеспечивающего безусловный выход из процедуры. RETURN можно также использовать для выхода из пакета или блока операторов. При выполнении оператора RETURN в хранимой процедуре работа процедуры прекращается в этой точке, и происходит переход к следующему оператору вызывающей программы. Операторы, следующие после RETURN в хранимой процедуре, не выполняются. С помощью RETURN вы можете также возвращать целое значение.
Сначала рассмотрим пример использования RETURN просто для выхода из хранимой процедуры. Мы создадим модифицированную версию процедуры GetUnitPrice, которая проверяет, было ли задано входное значение, и если нет, то выводит сообщение для пользователя и возвращается в вызывающую программу. Для этого мы определим входной параметр со значением по умолчанию NULL и затем будем проверять это значение в процедуре; если входной параметр имеет значение NULL, это означает, что входное значение не задано. Ниже приводится пример удаления и повторного создания этой процедуры:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "GetUnitPrice" AND type = "P") DROP PROCEDURE GetUnitPrice GO CREATE PROCEDURE GetUnitPrice @prod_id int = NULL AS IF @prod_id IS NULL BEGIN PRINT "Please enter a product ID number" RETURN END ELSE BEGIN SELECT UnitPrice FROM Products WHERE ProductID = @prod_id END GO
А теперь запустим GetUnitPrice без ввода входного значения и посмотрим результаты. Для запуска этой хранимой процедуры вы должны указать оператор EXECUTE, поскольку вызов процедуры не является первым оператором этого пакета. Используйте следующую последовательность:
PRINT "Before procedure" EXECUTE GetUnitPrice PRINT "After procedure returns from stored procedure" GO
Результаты будут выведены в следующей форме:
Before procedure (До процедуры) Please enter a product ID number (Введите идентификационный номер продукта) After procedure returns from stored procedure (После возврата из хранимой процедуры)
Второй оператор PRINT включен для того, чтобы показать, что после оператора RETURN хранимой процедуры выполнение данного пакета продолжается с оператора PRINT.
Теперь рассмотрим использование RETURN для возврата значения в вызывающую программу. Возвращаемое значение должно быть целым. Это может быть константа или переменная. Вы должны объявить в вызывающей программе переменную, в которой будет храниться возвращаемое значение для дальнейшего использования в этой программе. Например, следующая процедура возвратит значение 1, если цена единицы продукции для продукта, указанного во входном параметре, меньше $100 ; иначе она возвратит значение 99.
CREATE PROCEDURE CheckUnitPrice @prod_id int AS IF (SELECT UnitPrice FROM Products WHERE ProductID = @prod_id) < 100 RETURN 1 ELSE RETURN 99 GO
Для вызова этой хранимой процедуры и использования возвращаемого значения объявите в вызывающей программе переменную и приравняйте ее возвращаемому значению хранимой процедуры (указав значение 66 в ProductID для входного параметра):
DECLARE @return_val int EXECUTE @return_val = CheckUnitPrice 66 IF (@return_val = 1) PRINT "Unit price is less than $100" GO
В результате будет выведен текст "Unit price is less than $100" (Цена единицы продукции меньше $100), поскольку цена единицы продукции для указанного продукта равна $17 и, тем самым, возвращаемое значение равно 1. Убедитесь в том, что вы задали целый тип данных, когда объявляете переменную, которая используется для хранения значения, возвращаемого оператором RETURN, поскольку этот оператор возвращает целое значение.
Использование SELECT для возвращаемых значений
Вы можете также возвращать данные из хранимой процедуры с помощью оператора SELECT, находящегося внутри этой процедуры. Вы можете возвращать результирующий набор из запроса SELECT или возвращать значение переменной.
Рассмотрим пару примеров. Сначала мы создадим новую хранимую процедуру с именем PrintUnitPrice, которая возвращает цену единицы продукции для продукта, указанного во входном параметре (с помощью идентификатора этого продукта). Используется следующая последовательность:
CREATE PROCEDURE PrintUnitPrice @prod_id int AS SELECT ProductID, UnitPrice FROM Products WHERE ProductID = @prod_id GO
Вызовите эту процедуру со значением входного параметра 66, как это показано ниже:
PrintUnitPrice 66 GO
Результаты будут выведены в следующей форме:
ProductID UnitPrice ------------------------------------------ 66 17.00 (1 row(s) affected)
Для возврата значений переменных с помощью оператора SELECT, укажите после SELECT имя соответствующей переменной. В следующем примере мы снова создадим хранимую процедуру CheckUnitPrice, которая возвращает значение переменной, а также зададим заголовок выводимой колонки:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "CheckUnitPrice" AND type = "P") DROP PROCEDURE CheckUnitPrice GO CREATE PROCEDURE CheckUnitPrice @prod_id INT AS DECLARE @var1 int IF (SELECT UnitPrice FROM Products WHERE ProductID = @prod_id) > 100 SET @var1 = 1 ELSE SET @var1 = 99 SELECT "Variable 1" = @var1 PRINT "Can add more T-SQL statements here" GO
Вызовите эту процедуру со значением входного параметра 66, как это показано ниже:
CheckUnitPrice 66 GO
Результаты выполнения этой хранимой процедуры будут выведены в следующей форме:
Variable 1 -------------- 99 (1 row(s) affected) Can add more T-SQL statements here
Мы вывели текст оператора PRINT "Can add more T-SQL statements here" (Здесь можно добавить другие операторы T-SQL), чтобы показать отличие между возвратом значения с помощью SELECT и возвратом значения с помощью RETURN. Оператор RETURN прекращает работу хранимой процедуры в том месте, где он находится, а оператор SELECT возвращает свой результирующий набор, после чего продолжается выполнение хранимой процедуры.
Если бы в этом примере мы не задали заголовок колонки (просто указали бы SELECT @var1 ), то получили бы результат без заголовка, как это показано ниже:
-------------- 99 (1 row(s) affected)
Использование Enterprise Manager
Теперь, когда вы знаете, как использовать T-SQL для создания хранимых процедур, рассмотрим, как использовать для их создания Enterprise Manager. Чтобы создать хранимую процедуру с помощью Enterprise Manager, вам по-прежнему нужно знать, как записываются операторы T-SQL. Enterprise Manager просто снабжает вас графическим интерфейсом, в котором можно создавать вашу процедуру. Мы опробуем этот метод, повторно создав хранимую процедуру InsertRows, как это описано ниже.
- Чтобы удалить хранимую процедуру, сначала раскройте папку базы данных MyDB в левой панели. Enterprise Manager и щелкните на папке Stored Procedures (Хранимые Процедуры). В правой панели появятся все хранимые процедуры этой базы данных. Щелкните правой кнопкой мыши на хранимой процедуре InsertRows (она должна существовать – мы создали ее ранее в этой лекции) и выберите из контекстного меню пункт Delete (Удалить). (Вы можете также переименовать или скопировать хранимую процедуру через это контекстное меню.) Появится диалоговое окно Drop Objects (Удаление объектов) (рис. 21.1). Щелкните на кнопке Drop All (Удалить все), чтобы удалить хранимую процедуру.
- Щелкните правой кнопкой мыши на папке Stored Procedures и выберите из контекстного меню пункт New Stored Procedure (Создать хранимую процедуру). Появится диалоговое окно Stored Procedure Properties (Свойства хранимой процедуры) (рис. 21.2).
Рис. 21.1. Диалоговое окно Drop Objects (Удаление объектов)
Рис. 21.2. Окно Stored Procedure Properties (Свойства хранимой процедуры) - В поле Text (Текст) вкладки General (Общие) замените [OWNER].[PROCEDURE NAME] ([Владелец].[Имя процедуры]) на имя хранимой процедуры – в данном случае, – InsertRows. Затем введите текст T-SQL-программы для этой хранимой процедуры. На рис. 21.3 показано окно Stored Procedure Properties после ввода текста T-SQL-программы для процедуры InsertRows.
Рис. 21.3. Текст T-SQL-программы для новой хранимой процедуры - Щелкните на кнопке Check Syntax (Проверить синтаксис), чтобы SQL Server указал ошибки синтаксиса T-SQL в хранимой процедуре. Исправьте найденные синтаксические ошибки и снова щелкните на кнопке Check Syntax. После успешной проверки синтаксиса вы увидите окно сообщения (рис. 21.4). Щелкните на кнопке OK
Рис. 21.4. Окно сообщения об успешной проверке синтаксиса хранимой процедуры - Щелкните на кнопке OK в окне Stored Procedure Properties, чтобы создать вашу хранимую процедуру и вернуться в окно Enterprise Manager. Щелкните на папке Stored Procedures в левой панели Enterprise Manager, чтобы показать новую хранимую процедуру в правой панели (рис. 21.5).
увеличить изображение
Рис. 21.5. Новая хранимая процедура в окне Enterprise Manager - Чтобы присвоить пользователям полномочия выполнения новой хранимой процедуры, щелкните правой кнопкой мыши на имени этой хранимой процедуры в правой панели Enterprise Manager и выберите из контекстного меню пункт Properties (Свойства). В появившемся окне Stored Procedure Properties щелкните на кнопке Permissions (Полномочия). Появится окно Object Properties (Свойства объектов) (рис. 21.6). Установите флажки в колонке EXEC для пользователей или ролей базы данных, которым вы хотите разрешить выполнение этой хранимой процедуры. В данном примере полномочия выполнения хранимой процедуры InsertRows предоставлены трем пользователям.
Рис. 21.6. Вкладка Permissions окна Object Properties (Свойства объектов) - Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы присвоить выбранные вами полномочия и вернуться в окно Stored Procedure Properties. Для завершения щелкните на кнопке OK.
Вы можете также использовать Enterprise Manager для редактирования хранимой процедуры. Для этого щелкните правой кнопкой мыши на имени этой процедуры и выберите из контекстного меню пункт Properties. Выполните редактирование процедуры в окне Stored Procedure Properties (рис. 21.3), проверьте синтаксис, щелкнув на кнопке Check Syntax, щелкните на кнопке Apply и затем щелкните на кнопке OK.
Кроме того, вы можете использовать Enterprise Manager для управления полномочиями по хранимой процедуре. Для этого щелкните правой кнопкой мыши на имени хранимой процедуры в окне Enterprise Manager, укажите в контекстном меню пункт All Tasks (Все задачи) и выберите пункт Manage Permissions (Управление полномочиями). Вы можете также создавать публикацию для репликации (см. лекцию 26), генерировать сценарии SQL и отображать зависимости (dependencies) для хранимой процедуры из подменю All Tasks. Если вы решите генерировать сценарии SQL, то SQL Server автоматически создаст файл сценария (с указанным вами именем), который будет содержать определение хранимой процедуры. Затем вы сможете при необходимости повторно создать процедуру, используя этот сценарий.
Использование мастера Create Stored Procedure Wizard
Третий метод создания хранимых процедур – использование мастера создания хранимых процедур Create Stored Procedure Wizard – дает вам основу для написания ваших процедур из шаблонных операторов T-SQL. Вы можете применить мастер для создания хранимой процедуры, используемой для вставки, удаления или обновления строк таблиц. Этот мастер не помогает создавать процедуры, которые считывают строки из таблицы.
Мастер позволяет вам создавать несколько хранимых процедур в одной базе данных без необходимости выхода из мастера и его перезапуска. Однако для создания процедуры в другой базе данных вы должны снова запустить мастер. Для запуска этого мастера выполните следующие шаги.
- В окне Enterprise Manager выберите из меню Tools (Сервис) пункт Wizards (Мастера), чтобы появилось диалоговое окно Select Wizard (Выбор мастера). Раскройте папку Database и щелкните на строке Create Stored Procedure Wizard (рис. 21.7).
Рис. 21.7. Диалоговое окно Select Wizard (Выбор мастера) - Щелкните на кнопке OK, чтобы появилось начальное окно мастера Create Stored Procedure Wizard (рис. 21.8).
Рис. 21.8. Начальное окно мастера Create Stored Procedure Wizard (Создание хранимых процедур) - Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). Введите имя базы данных, в которой вы хотите создать хранимую процедуру.
- Щелкните на кнопке Next, чтобы появилось окно Select Stored Procedures (Выбор хранимых процедур) (рис. 21.9). Здесь вы увидите список всех таблиц в выбранной базе данных с тремя колонками флажков. Эти колонки представляют три типа хранимых процедур, которые можно создать с помощью этого мастера: хранимые процедуры, которые выполняют вставку (Insert), удаление (Delete) и обновление (Update) данных. Установите нужные флажки в колонках рядом с именем каждой таблицы.
Рис. 21.9. Окно Select Stored Procedures (Выбор хранимых процедур)В данном примере показаны две таблицы, которые использовались на протяжении всей этой книги. Как видно из рисунка, таблице Bicycle_Inventory были присвоены две процедуры: процедура вставки (insert)) и процедура обновления (update). Как показано в последующих шагах, вы можете изменять эти процедуры до их реального создания.Примечание. Одна хранимая процедура может выполнять несколько типов модификаций данных, но мастер Create Stored Procedure Wizard создает каждый тип модификаций в виде отдельной хранимой процедуры. Вы можете изменять любую из создаваемых этим мастером процедур, добавляя другие операторы T-SQL. - Щелкните на кнопке Next, чтобы появилось окно мастера Create Stored Procedure Wizard (рис. 21.10). В этом окне содержится список имен и описаний всех хранимых процедур, которые будут созданы, когда вы завершите работу мастера.
- Чтобы переименовать и отредактировать хранимую процедуру, начните с выбора ее имени в окне Completing the Create Stored Procedure Wizard и затем щелкните на кнопке Edit (Правка), чтобы появилось окно Edit Stored Procedure Properties (Редактирование свойств хранимой процедуры) (рис. 21.11). Это окно содержит список колонок таблицы, на которые повлияет данная процедура. Колонки, для которых установлен флажок в колонке Select, будут использоваться в данной хранимой процедуре.
Рис. 21.10. Окно мастера Completing the Create Stored Procedure Wizard
Рис. 21.11. Окно Edit Stored Procedure Properties (Редактирование свойств хранимой процедуры)В этом примере показано шесть колонок таблицы Bicycle_Inventory, на которые может повлиять процедура вставки с текущим именем insert_Bicycle_Inventory_1. Для каждой колонки таблицы установлен флажок в колонке Select. Эти флажки указывают, что при выполнении данной хранимой процедуры потребуется ввод значений во все шесть колонок и что хранимая процедура вставит эти шесть значений в соответствующие шесть колонок. - Для переименования хранимой процедуры удалите существующее имя в текстовом поле Name и замените его новым именем.
- Для редактирования хранимой процедуры щелкните на кнопке Edit SQL (Редактировать SQL), чтобы появилось диалоговое окно Edit Stored Procedure SQL (Редактирование SQL хранимой процедуры) (рис. 21.12). Здесь вы можете видеть
T-SQL-программу для хранимой процедуры. Как видно из рисунка, здесь используются довольно простые операторы T-SQL. В данном примере пять параметров, которые вы указываете при вызове этой хранимой процедуры, – это значения, которые вставляются в виде новой строки в таблицу. Для редактирования этой процедуры просто введите ваши изменения в текстовом окне. Закончив правку, щелкните на кнопке Parse (Синтаксический разбор), чтобы проверить синтаксис, исправьте ошибки и затем щелкните на кнопке OK, чтобы вернуться в окно мастера Completing the Create Stored Procedure Wizard.
Рис. 21.12. Диалоговое окно Edit Stored Procedure SQL - После внесения возможных изменений и проверки процедуры щелкните на кнопке Finish (Готово), чтобы создать хранимые процедуры. Не забудьте задать полномочия по каждой из хранимых процедур после создания этих процедур. (См. раздел "Использование Enterprise Manager" выше.)
Как видите, этот мастер нельзя назвать очень полезным. Если вы знаете, как писать программы на языке T-SQL, то вы можете также использовать сценарии или Enterprise Manager для создания ваших собственных хранимых процедур.
Управление хранимыми процедурами с помощью T-SQL
Теперь, когда мы знаем, как создавать хранимые процедуры, рассмотрим, как использовать операторы T-SQL для изменения, удаления и просмотра содержимого хранимой процедуры.
Оператор ALTER PROCEDURE
Оператор T-SQL ALTER PROCEDURE используется для изменения хранимой процедуры, созданной с помощью оператора CREATE PROCEDURE. При использовании оператора ALTER PROCEDURE сохраняются исходные полномочия, установленные для данной хранимой процедуры, а изменения не влияют на любые зависимые процедуры или триггеры. (Зависимая процедура или триггер – это соответствующий объект, который вызывается процедурой.)
Синтаксис оператора ALTER PROCEDURE аналогичен синтаксису оператора CREATE PROCEDURE:
ALTER PROC[EDURE] имя_процедуры [ {@имя_параметра тип_данных} ] [= по_умолчанию] [OUTPUT] [,...,n] AS оператор(ы)_t-sql
В операторе ALTER PROCEDURE вы должны переписать всю хранимую процедуру, внося нужные изменения. Например, изменим хранимую процедуру GetUnitPrice, которую мы использовали в предыдущем примере, добавив условие проверки цен единицы продукции, превышающих $100, как это показано ниже:
USE Northwind GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "GetUnitPrice" AND type = "P") DROP PROCEDURE GetUnitPrice GO CREATE PROCEDURE GetUnitPrice @prod_id int, @unit_price money OUTPUT AS SELECT @unit_price = UnitPrice FROM Products WHERE ProductID = @prod_id GO ALTER PROCEDURE GetUnitPrice @prod_id int, @unit_price money OUTPUT AS SELECT @unit_price = UnitPrice FROM Products WHERE ProductID = @prod_id AND UnitPrice > 100 GO
Теперь предоставим полномочия выполнения по этой хранимой процедуре пользователю DickB с помощью следующего оператора:
GRANT EXECUTE ON GetUnitPrice TO DickB GO
Как уже говорилось выше, при изменении хранимой процедуры полномочия сохраняются. Изменим данную процедуру, чтобы выбирать строки, у которых значение колонки UnitPrice больше 200 (вместо 100), как это показано ниже:
ALTER PROCEDURE GetUnitPrice @prod_id int, @unit_price money OUTPUT AS SELECT @unit_price = UnitPrice FROM Products WHERE ProductID = @prod_id AND UnitPrice > 200 GO
После выполнения этого оператора ALTER PROCEDURE пользователь DickB будет по-прежнему иметь полномочия запуска данной хранимой процедуры.
Оператор DROP PROCEDURE
Оператор T-SQL DROP PROCEDURE действует просто – он удаляет хранимую процедуру. Вы не сможете восстановить хранимую процедуру после ее удаления. Если вам нужно использовать удаленную процедуру, вы должны полностью воссоздать ее с помощью оператора CREATE PROCEDURE. Все полномочия по удаленной хранимой процедуре будут утрачены, и они должны быть предоставлены снова. Ниже приводится пример использования DROP PROCEDURE для удаления процедуры GetUnitPrice:
USE Northwind GO DROP PROCEDURE GetUnitPrice GO
Хранимая процедура sp_helptext
Системная хранимая процедура sp_helptext позволяет вам просматривать определение любой хранимой процедуры и оператора, который использовался для создания этой процедуры. (Ее можно также использовать для просмотра определения триггера, представления, правила или значения по умолчанию.) Это средство полезно, если вы хотите быстро воспроизвести определение процедуры (или одного из только что упомянутых объектов), когда используете ISQL, OSQL или анализатор запросов SQL Query Analyzer. Вы можете также направлять выходные результаты в файл, чтобы создать из этого определения сценарий, который можно использовать для редактирования или повторного создания процедуры. Чтобы использовать sp_helptext, вы должны указать в качестве параметра имя вашей хранимой процедуры (или имя другого объекта). Например, для просмотра операторов, которые использовались выше для создания процедуры InsertRows, используйте следующую команду. (И здесь для выполнения данной команды вы должны использовать базу данных, в которой находится процедура.)
USE MyDB GO sp_helptext InsertRows GO
Выводимые результаты выглядят следующим образом:
Text --------------------------------------------------------------------- CREATE PROCEDURE InsertRows @start_value int AS DECLARE @loop_counter int, @start_val int SET @start_val = @start_value – 1 SET @loop_counter = 0 WHILE (@loop_counter < 5) BEGIN INSERT INTO mytable VALUES (@start_val + 1, 'new row') PRINT (@start_val) SET @start_val = @start_val + 1 SET @loop_counter = @loop_counter + 1 END
Заключение
В этой лекции вы узнали, что такое системные хранимые процедуры и определяемые пользователем хранимые процедуры и почему они используются. Вы также узнали, как создавать хранимые процедуры с помощью операторов T-SQL, Enterprise Manager или мастера Create Stored Procedure Wizard, и увидели, чем отличаются эти методы. Кроме того, вы узнали, как использовать параметры и переменные и как выполнять хранимые процедуры. Мы также рассмотрели операторы T-SQL, используемые для изменения, удаления и просмотра текста хранимой процедуры. В лекции 22 мы рассмотрим триггеры – специальный тип хранимых процедур, – которые автоматически запускаются при определенных условиях.
Лекция 22. Создание и использование триггеров
Триггер – это специальный класс хранимой процедуры. В этой лекции вы узнаете, что выполняют триггеры и когда их следует использовать. Вы также узнаете о расширении возможностей триггеров в Microsoft SQL Server 2000. Вы изучите на практике два метода создания триггеров: с помощью операторов Transact-SQL (T-SQL) и с помощью SQL Server Enterprise Manager. Вы также узнаете, как управлять триггерами и модифицировать их.
Что такое триггер?
Триггер – это специальный тип хранимой процедуры, которая запускается автоматически системой SQL Server при модифицировании какой-либо таблицы одним из трех операторов: UPDATE, INSERT или DELETE. Триггеры, как другие хранимые процедуры, могут содержать простые или сложные операторы T-SQL. В отличие от других типов хранимых процедур триггеры запускаются автоматически при указанных модификациях данных; их нельзя запустить вручную по имени. Когда происходит запуск триггера, говорят, что он активизируется (fire). Триггер создается по одной таблице базы данных, но он может осуществлять доступ и к другим таблицам и объектам других баз данных. Триггеры нельзя создать по временным таблицам или системным таблицам, а только по определенным пользователем таблицам или представлениям. Таблица, по которой определяется триггер, называется таблицей триггера.
Существует пять типов триггеров: UPDATE, INSERT, DELETE, INSTEAD OF и AFTER. Как следует из названий, триггер UPDATE активизируется, когда выполняются изменения (обновления) в какой-либо таблице, триггер INSERT активизируется, когда происходит вставка данных в таблицу и триггер DELETE активизируется, когда из таблицы удаляются данные. Триггер INSTEAD OF выполняется вместо операции вставки, обновления или удаления. Триггер AFTER активизируется после какой-либо запускающей операции и обеспечивает механизм управления порядком выполнения нескольких триггеров.
Операции обновления, вставки и удаления называются событиями модификации данных. Вы можете создать триггер, который активизируется при возникновении более чем одного события модификации данных.
Например, вы можете создать триггер, который будет активизироваться, когда происходит выполнение оператора UPDATE или INSERT, и такой триггер мы будем называть триггером UPDATE/INSERT. Вы можете даже создать триггер, который будет активизироваться при возникновении любого из трех событий модификации данных (триггер UPDATE/INSERT/DELETE ).
Вам следует знать некоторые из других общих правил, относящихся к триггерам. Это следующие правила:
- Триггеры запускаются только после завершения оператора, который вызвал их активизацию. Например, UPDATE -триггер не будет активизироваться, пока не будет выполнен оператор UPDATE.
- Если какой-либо оператор пытается выполнить операцию, которая нарушает какое-либо ограничение по таблице или является причиной какой-то другой ошибки, то связанный с ним триггер не будет активизирован.
- Триггер рассматривается как часть одной транзакции вместе с оператором, который вызывает его. Поэтому из триггера можно вызвать оператор отката, и этот оператор выполнит откат как триггера, так и соответствующего события модификации данных. Кроме того, при возникновении серьезной ошибки, такой как разъединение с пользователем, SQL Server автоматически выполнит откат всей транзакции.
- Триггер активизируется только один раз для одного оператора, даже если этот оператор влияет на несколько строк данных.
При активизации триггера результаты (если они есть) возвращаются вызывающей программе, как и при использовании хранимых процедур. Обычно результаты не возвращаются из оператора INSERT, UPDATE или DELETE (это операторы, вызывающие активизацию триггера). Результаты обычно возвращаются из запросов SELECT. Поэтому, чтобы избежать результатов, возвращаемых в приложение из триггера, откажитесь от использования операторов SELECT и присваивания переменных в определении триггера. Если вам все-таки нужно, чтобы триггер возвращал результаты, вы должны включить в приложение специальную обработку там, где разрешены модификации в таблице, содержащей триггер, чтобы приложение получало возвращаемые данные и обрабатывало их нужным образом.
Если вам нужно назначить переменную внутри триггера, используйте оператор SET NOCOUNT ON в начале триггера, чтобы не было возвращаемых результирующих строк. Оператор SET NOCOUNT указывает, нужно ли возвращать сообщение, указывающее, сколько строк было затронуто запросом или оператором (например, "23 rows affected"). По умолчанию для SET NOCOUNT задается значение OFF, а это означает выдачу сообщения о количестве затронутых строк. Отметим, что этот параметр не влияет на реальные возвращаемые результаты из оператора SELECT ; он влияет только на возврат сообщений о количестве строк.
Расширение возможностей триггеров в SQL Server 2000
В SQL Server 2000 включены два новых триггера: триггер INSTEAD OF и триггер AFTER. Триггер INSTEAD OF выполняется вместо запуска оператора SQL. Тем самым переопределяется действие запускающего оператора. Вы можете задать по одному триггеру INSTEAD OF на один оператор INSERT, UPDATE или DELETE. Триггер INSTEAD OF можно задать для таблицы и/или представления. Вы можете использовать каскады триггеров INSTEAD OF, определяя представления поверх представлений, где каждое представление имеет отдельный триггер INSTEAD OF. Триггеры INSTEAD OF не разрешается применять для модифицируемых представлений, содержащих опцию WITH CHECK. Прежде чем задавать триггер INSTEAD OF для одного из этих представлений, вы должны удалить опцию WITH CHECK из модифицируемого представления с помощью команды ALTER VIEW. Более подробную информацию по созданию представлений см. в лекции 18.
Триггер AFTER активизируется после успешного выполнения всех операций, указанных в запускающем операторе или операторах SQL. Сюда включается весь каскад действий по ссылкам и все проверки ограничений. Если у вас имеется несколько триггеров AFTER, определенных по таблице для определенного оператора или набора операторов, то вы можете задать, какой триггер будет активизирован первым и какой триггер – последним. Если у вас определено больше двух триггеров, то вы можете задать порядок активизации только первого и последнего триггера. Все остальные триггеры активизируются случайным образом. Порядок активизации задается с помощью оператора T-SQL sp_settriggerorder.
Кроме новых триггеров, SQL Server 2000 позволяет также задавать триггеры как по представлениям, так и по таблицам. В предыдущих версиях SQL Server разрешалось задавать триггеры только по таблицам. Триггеры по представлениям действуют точно так же, как и триггеры по таблицам.
Когда использовать триггеры
Триггеры, как и ограничения, можно использовать для поддержки целостности данных и деловых правил, но триггер не следует использовать как замену ограничения, когда достаточно использовать только ограничение. (Ограничения описаны в лекции 16.) Например, вам не нужно создавать триггер, который проверяет наличие значения в колонке первичного ключа одной таблицы, чтобы определить, можно ли вставить это значение в соответствующую колонку другой таблицы; в этой ситуации прекрасно подойдет ограничение FOREIGN KEY. Однако вам может потребоваться триггер для каскадирования изменений, вносимых в связанные таблицы базы данных. Например, вы можете создать триггер DELETE по колонке title_id в таблице titles базы данных pubs, который удалит строки в таблицах sales, roysched и titleauthor, если удаляется соответствующая строка в таблице titles. (Мы увидим в следующем разделе, как создать этот триггер DELETE.)
Вы можете также использовать триггеры для проведения более сложных проверок по данным, чем это допускается при использовании ограничения CHECK. (Ограничения CHECK подробно описываются в лекции 16.) Дело в том, что триггеры могут обращаться к колонкам таблиц, отличных от таблицы, по которой они определены, в то время как ограничения CHECK действуют в рамках только одной таблицы.
Триггеры также полезно использовать для выполнения нескольких операций в ответ на одно событие модификации данных. Если вы создаете несколько триггеров для одного типа события модификации данных, то все эти триггеры будут активизироваться, когда происходит это событие. (Следует помнить, что если несколько триггеров определено по таблице или представлению для какого-либо события, то каждый триггер должен иметь уникальное имя.)
Вы можете создать один триггер, который будет активизироваться для нескольких типов событий модификации данных. Этот триггер будет активизироваться каждый раз, когда будет возникать событие, для которого он определен. Поэтому триггер, определенный по определенной таблице или представлению для вставок, изменений и удалений, будет активизироваться при каждом возникновении любого из этих событий по данной таблице или представлению.
Когда вы создаете какой-либо триггер, SQL Server создает две специальные временные таблицы. Вы можете обращаться к этим таблицам при написании T-SQL-программы, которая образует определение этого триггера. Эти таблицы всегда находятся в памяти и являются локальными по отношению к данному триггеру, и каждый триггер имеет доступ только к своим временным таблицам. Эти временные таблицы являются копиями таблицы базы данных, по которой определяется данный триггер. Вы можете использовать эти временные таблицы, чтобы увидеть влияние, оказанное каким-либо событием модификации данных на исходную таблицу. Вы увидите примеры этих специальных таблиц (с именами deleted и inserted) в следующем разделе.
Создание триггеров
Теперь, зная, что такое триггеры и когда они используются, перейдем к особенностям создания триггеров. В этом разделе мы рассмотрим сначала метод создания триггеров с помощью T-SQL и затем – метод с использованием Enterprise Manager. Чтобы использовать Enterprise Manager для создания триггеров, вам нужно знать программирование с помощью T-SQL, как и в случае, когда вы используете Enterprise Manager для создания других типов хранимых процедур.
Использование оператора CREATE TRIGGER
Чтобы использовать T-SQL для создания триггера, нужно применить оператор CREATE TRIGGER. (В методе с Enterprise Manager также используется этот оператор.) Оператор CREATE TRIGGER имеет следующий синтаксис:
CREATE TRIGGER имя_триггера ON {таблица | представление} [WITH ENCRYPTION] {FOR | AFTER | INSTEAD OF} {[DELETE] [,] [INSERT] [,] [UPDATE]} [WITH APPEND] [NOT FOR REPLICATION] AS оператор_sql [...n]
Как видно из этого описания, вы можете создать триггер для оператора INSERT, UPDATE, DELETE, INSTEAD OF или AFTER или для любой комбинации из этих пяти операторов. Вы должны задать хотя бы одну опцию с предложением FOR. Это предложение указывает, возникновение какого типа события модификации данных (или типов событий) по указанной таблице приведет к активизации данного триггера.
При вызове триггера будут выполнены операторы SQL, указанные после ключевого слова AS. Вы можете поместить сюда несколько операторов, включая программные конструкции, такие как IF и WHILE. В определении триггера не допускаются следующие операторы:
- ALTER DATABASE
- CREATE DATABASE
- DISK INIT
- DISK RESIZE
- DROP DATABASE
- LOAD DATABASE
- LOAD LOG
- RECONFIGURE
- RESTORE DATABASE
- RESTORE LOG
Использование таблиц deleted и inserted
Как уже говорилось, при создании триггера вы имеете доступ к двум временным таблицам с именами deleted и inserted. Их называют таблицами, но они отличаются от реальных таблиц баз данных. Они хранятся в памяти, а не на диске.
Эти две таблицы имеют одинаковую структуру с таблицей (одинаковые колонки и типы данных), по которой определяется данный триггер. Таблица deleted содержит копии строк, на которые повлиял оператор DELETE или UPDATE. Строки, удаляемые из таблицы данного триггера, перемещаются в таблицу deleted. После этого к данным таблицы deleted можно осуществлять доступ из данного триггера. Таблица inserted содержит копии строк, добавленных к таблице данного триггера при выполнении оператора INSERT или UPDATE. Эти строки добавляются одновременно в таблицу триггера и в таблицу inserted. Поскольку оператор UPDATE обрабатывается как DELETE, после которого следует INSERT, то при использовании оператора UPDATE старые значения строк копируются в таблицу deleted, а новые значения строк – в таблицу триггера и в таблицу inserted.
Если вы попытаетесь проверить содержимое таблицы deleted из триггера, который активизирован в результате выполнения оператора INSERT, эта таблица окажется пустой, но сообщение об ошибке не возникнет. Выполнение оператора INSERT не приводит к копированию значений строк в таблицу deleted. Аналогичным образом, если вы попытаетесь проверить содержимое таблицы inserted из триггера, который активизирован в результате выполнения оператора DELETE, эта таблица окажется пустой. Выполнение оператора DELETE не приводит к копированию значений строк в таблицу inserted. И здесь просмотр пустой таблицы не приведет к сообщению об ошибке; поэтому для использования этих таблиц с целью просмотра результатов модификаций убедитесь в том, что для доступа из триггера у вас выбрана соответствующая таблица.
Создание вашего первого триггера
Чтобы увидеть, как работает триггер, создадим простую таблицу с определенным по ней триггером, который печатает определенный текст при каждой модификации. Программа T-SQL для создания этой таблицы имеет следующий вид:
USE MyDB GO CREATE TABLE Bicycle_Inventory ( make_name char(10) NOT NULL, make_id tinyint NOT NULL, model_name char(12) NOT NULL, model_id tinyint NOT NULL, in_stock tinyint NOT NULL, on_order tinyint NULL, ) GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Print_Update" AND type = "TR") DROP TRIGGER Print_Update GO CREATE TRIGGER Print_Update ON Bicycle_Inventory FOR UPDATE AS PRINT "The Bicycle_Inventory table was updated" GO
Чтобы проверить ваш триггер, выполним вставку строки в эту таблицу и затем модифицируем ее:
INSERT INTO Bicycle_Inventory VALUES ("Trek",1,"5500",5,1,0) GO UPDATE Bicycle_Inventory SET make_id = 2 WHERE model_name = "5500" GO
Будет возвращено сообщение "The Bicycle_Inventory table was updated", так как в результате выполнения оператора UPDATE был запущен триггер. В данном примере мы задали в нашем триггере вывод сообщения, чтобы можно было увидеть работу этого триггера. Но обычно не требуется, чтобы триггер возвращал выходные данные. Однако в определенных обстоятельствах это может оказаться полезным. Например, предположим, что вы создаете триггер типа UPDATE, который выполняет свои операторы, только когда в указанную колонку заносится определенное значение, но эта модификация происходит неверно. Если добавить в триггер оператор PRINT, который выводит значение этой колонки до выполнения других операторов триггера, это, видимо, поможет определить, где лежит источник проблемы – в логике самого триггера или в модифицируемых данных.
Создание триггера типа DELETE
Перейдем к более сложному примеру – триггер типа DELETE, который каскадирует изменения в связанные таблицы. Мы создадим триггер, который будет удалять строки из таблиц sales, roysched и titleauthor базы данных pubs, когда соответствующая строка удаляется из таблицы titles. Мы будем использовать таблицу deleted, чтобы указывать, какие строки нужно удалить из связанных таблиц. (Напомним, что при удалении какой-либо строки из таблицы триггера эта строка копируется в таблицу deleted; затем вы можете проверить содержимое таблицы deleted и удалить соответствующие записи в других таблицах.) Чтобы этот триггер мог работать, нам нужно было бы удалить ограничения FOREIGN KEY из таблиц titleauthor, roysched и sales, которые связаны с колонкой title_id таблицы titles. В данном примере мы создадим триггер так, как будто этих ограничений FOREIGN KEY не существует. Если все же попытаться удалить строку из таблицы titles, не удалив ограничений FOREIGN KEY, то вы получите сообщение об ошибке от SQL Server и удаление не произойдет.
Ниже показана программа T-SQL для этого триггера:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Delete_Title" AND type = "TR") DROP TRIGGER Delete_Title GO CREATE TRIGGER Delete_Title ON titles FOR DELETE AS DELETE sales FROM sales, deleted WHERE sales.title_id = deleted.title_id PRINT "Deleted from sales" DELETE roysched FROM roysched, deleted WHERE roysched.title_id = deleted.title_id PRINT "Deleted from roysched" DELETE titleauthor FROM titleauthor, deleted WHERE titleauthor.title_id = deleted.title_id PRINT "Deleted from titleauthor" GO
Чтобы проверить этот триггер, используйте оператор DELETE следующим образом:
DELETE titles WHERE title_id = "PC1035" GO
Если выполнить этот оператор DELETE, то произойдет активизация триггера (при условии, что вы удалили отмеченные выше ссылки на внешние ключи [FOREIGN KEY] ). Вы увидите сообщение с количеством затронутых строк для события модификации данных по таблице titles, после которого следуют сообщения, заданные в трех операторах PRINT из этого триггера, и сообщения о количестве затронутых строк в трех других таблицах; эти выходные сообщения показаны ниже:
(1 row(s) affected) Deleted from sales (5 row(s) affected) Deleted from roysched (1 row(s) affected) Deleted from titleauthor (1 row(s) affected)
Еще одно применение таблицы deleted – это сохранение всех строк, удаленных из таблицы, в резервной таблице для последующего анализа данных. Например, чтобы сохранить строки, удаленные из таблицы roysched, в новой таблице с именем roysched_backup, используйте следующую программу:
USE pubs GO CREATE TABLE roysched_backup ( title_id tid NOT NULL, lorange int NULL, hirange int NULL, royalty int NULL ) CREATE TRIGGER tr_roysched_backup ON roysched FOR DELETE AS INSERT INTO roysched_backup SELECT * FROM deleted GO SELECT * FROM roysched_backup GO
Отметим, что мы присвоили резервной таблице те же имена колонок и те же типы данных, что и в исходной таблице. Вы можете использовать другие имена колонок для таблицы roysched_backup, но обязаны использовать одинаковые типы данных для обеих таблиц, чтобы обеспечить совместимость.
Создание триггера типа INSERT
В этом примере мы создадим триггер типа INSERT (триггер, который активизируется при выполнении оператора INSERT ) по таблице sales. Этот триггер при вставке строки в таблицу sales будет модифицировать колонку ytd_sales в таблице titles добавляя в нее значение, которое было помещено в колонку qty таблицы sales. Этот триггер запрашивает таблицу inserted, чтобы получить значение qty, которое было помещено в таблицу sales. Мы включим в этот запрос оператор SELECT *, с помощью которого увидим, что содержит таблица inserted. Ниже приводится T-SQL-текст для этого триггера:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Update_ytd_sales" AND type = "TR") DROP TRIGGER Update_ytd_sales GO CREATE TRIGGER Update_ytd_sales ON sales FOR INSERT AS SELECT * FROM inserted UPDATE titles SET ytd_sales = ytd_sales + qty FROM inserted WHERE titles.title_id = inserted.title_id GO
Отметим, что мы использовали в операторе UPDATE предложение FROM источник_для_таблицы (FROM inserted), чтобы указать, что значение qty должно поступать из таблицы inserted. Теперь выполним следующий оператор INSERT для просмотра результатов из этого триггера:
INSERT INTO sales VALUES(7066, 1, "March 7, 2000", 100, "Net 30", "BU1111") GO
Вы увидите следующие результаты. В первом наборе результатов показана строка, выбранная из таблицы inserted, и второе сообщение "1 row(s) affected" получено из оператора UPDATE.
stor_id ord_num ord_date qty payterms title_id ---------------------------------------------------------------------------------------- 7066 1 2000-03-07 00:00:00.000 100 Net 30 BU1111 (1 row(s) affected) (1 row(s) affected)
Создание триггера типа UPDATE
Теперь создадим UPDATE -триггер, который будет просматривать колонку price (цена) при модификации таблицы titles, чтобы убедиться, что цена книги не возросла более чем на 10 процентов. В противном случае будет использован оператор ROLLBACK, который выполнит откат данного триггера и оператора, вызвавшего триггер. Если триггер активизирован из транзакции, то произойдет откат всей транзакции. Таблицы deleted и inserted используются в данном примере для проверки изменения цены. Ниже приводится определение этого триггера:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Update_Price_Check" AND type = "TR") DROP TRIGGER Update_Price_Check GO CREATE TRIGGER Update_Price_Check ON titles FOR UPDATE AS DECLARE @orig_price money, @new_price money SELECT @orig_price = price from deleted PRINT "orig price =" PRINT CONVERT(varchar(6),@orig_price) SELECT @new_price = price from inserted PRINT "new price =" PRINT CONVERT(varchar(6),@new_price) IF (@new_price > (@orig_price * 1.10)) BEGIN PRINT "Rollback occurred" ROLLBACK END ELSE PRINT "Price is OK" GO
Чтобы проверить этот триггер, выполните сначала следующие операторы, чтобы проверить текущую цену книги с идентификатором заголовка (title_id) BU1111:
SELECT price FROM titles WHERE title_id = "BU1111" GO
Цена составляет $11.95. Теперь попробуем увеличить цену на 15 процентов с помощью следующих операторов:
UPDATE titles SET price = price * 1.15 WHERE title_id = "BU1111" GO
Вы увидите следующие результаты:
orig price = (исходная цена) 11.95 new price = (новая цена) 13.74 Rollback occurred (Произошел откат)
Произошла активизация триггера, который вывел исходную цену и новую цену и выполнил откат (поскольку цена возросла более чем на 10 процентов).
Теперь снова проверим цену, чтобы убедиться, что был выполнен откат этой модификации. Используйте следующий T-SQL-набор:
SELECT price FROM titles WHERE title_id = "BU1111" GO
Цена снова стала равной $11.95, а это означает, что был выполнен откат модификации.
Теперь увеличим цену на 9 процентов и убедимся, что цена изменена. Для этой модификации используется следующий T-SQL-набор:
UPDATE titles SET price = price * 1.09 WHERE title_id = "BU1111" GO SELECT price FROM titles WHERE title_id = "BU1111" GO
Цена стала равной $13.03, и поскольку изменение составило меньше 10 процентов, то триггер не инициировал откат.
Создавая триггер UPDATE, вы можете задать, чтобы этот триггер выполнял определенные операторы только в случае модификации определенной колонки или колонок. Например, давайте снова создадим предыдущий триггер, но на этот раз будет использовать предложение IF UPDATE, чтобы указать, что триггер проверяет колонку price, только если была обновлена сама эта колонка:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Update_Price_Check" AND type = "TR") DROP TRIGGER Update_Price_Check GO CREATE TRIGGER Update_Price_Check ON titles FOR UPDATE AS IF UPDATE (price) BEGIN DECLARE @orig_price money, @new_price money SELECT @orig_price = price FROM deleted PRINT "orig price =" PRINT CONVERT(varchar(6),@orig_price) SELECT @new_price = price FROM inserted PRINT "new price =" PRINT CONVERT(varchar(6),@new_price) IF (@new_price > (@orig_price * 1.10)) BEGIN PRINT "Rollback occurred" ROLLBACK END ELSE PRINT "Price is OK" END GO
Теперь в случае модификации одной или нескольких колонок в таблице titles, за исключением колонки price, триггер пропустит операторы между ключевыми словами BEGIN и END в операторе IF, т.е. фактически будет пропущен весь триггер.
Чтобы проверить этот триггер, выполните следующие операторы T-SQL, модифицирующие сумму продаж за год (значение в колонке ytd_sales) для книги со значением BU1111 в колонке title_id.
UPDATE titles SET ytd_sales = 123 WHERE title_id = "BU1111" GO
Отметим, что в выходные результаты не будут включены никакие сообщения, указанные в операторах PRINT данного триггера. Сам триггер активизируется, так как мы модифицировали таблицу titles. Но поскольку была модифицирована колонка ytd_sales, а не колонка price, то результатом условия IF было значение FALSE. Поэтому операторы данного триггера не выполнялись. Этот метод препятствует тому, чтобы SQL Server обрабатывал ненужные операторы.
Создание триггера INSTEAD OF
Триггер INSTEAD OF позволяет вам управлять тем, что происходит, когда выполняются функции INSERT, UPDATE или DELETE. Триггер INSTEAD OF используется в первую очередь при модификации объединенного представления (union view). Обычно объединенные представления недоступны для модификации, поскольку SQL Server "не знает", какую базовую (underlying) таблицу или таблицы нужно модифицировать. Для обхода этой ситуации вы определяете по данному представлению триггер INSTEAD OF, позволяющий модифицировать базовые (underlying) таблицы. Рассмотрим один пример. Следующие операторы T-SQL создают представление под именем TitlesByAuthor со ссылкой на таблицы authors, titles и titleauthor. (О создании представлений см. лекцию 18.)
USE pubs GO CREATE VIEW TitlesByAuthor AS SELECT authors.au_id, authors.au_lname, titles.title FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titleauthor.title_id = titles.title_id GO
Теперь после создания представления мы используем следующий набор T-SQL для вывода всех строк (они также показаны здесь), отвечающих критериям данного представления:
USE pubs GO SELECT * FROM TitlesByAuthor GO au_id au_lname title ————— ——————— ————————————————————— 238-95-7766 Carson But Is It User Friendly? 724-80-9391 MacFeather Computer Phobic AND Non-Phobic Individuals: 756-30-7391 Karsen Computer Phobic AND Non-Phobic Individuals: 267-41-2394 O’Leary Cooking with Computers: 724-80-9391 MacFeather Cooking with Computers: 486-29-1786 Locksley Emotional Security: A New Algorithm 648-92-1872 Blotchet-Halls Fifty Years in Buckingham Palace Kitchens 899-46-2035 Ringer Is Anger the Enemy? 998-72-3567 Ringer Is Anger the Enemy? 998-72-3567 Ringer Life Without Fear 486-29-1786 Locksley Net Etiquette 807-91-6654 Panteley Onions, Leeks, and Garlic: 172-32-1176 White Prolonged Data Deprivation: Four Case Studies 427-17-2319 Dull Secrets of Silicon Valley 846-92-7186 Hunter Secrets of Silicon Valley 712-45-1867 del Castillo Silicon Valley Gastronomic Treats 274-80-9391 Straight Straight Talk About Computers 267-41-2394 O’Leary Sushi, Anyone? 472-27-2349 Gringlesby Sushi, Anyone? 672-71-3249 Yokomoto Sushi, Anyone? 213-46-8915 Green The Busy Executive’s Database Guide 409-56-7008 Bennet The Busy Executive’s Database Guide 722-51-5454 DeFrance The Gourmet Microwave 899-46-2035 Ringer The Gourmet Microwave 213-46-8915 Green You Can Combat Computer Stress! (25 row(s) affected)
Если вы попытаетесь удалить из этого представления строку, в которой значение колонки au_lname равно Carson, то появится следующее сообщение:
Server: Msg 4405, Level 16, State 1, Line 1 View or function 'TitlesByAuthor' is not updatable because the FROM clause names multiple tables. (Представление или функция 'TitlesByAuthor' недоступна для модифицирования, поскольку предложение FROM ссылается names на несколько таблиц)
Чтобы обойти эту ситуацию, мы создадим для операции удаления триггер INSTEAD OF. Следующий набор операторов T-SQL создает триггер INSTEAD OF с именем Delete_It:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = 'Delete_It' AND type = 'TR') DROP TRIGGER Delete_It GO CREATE TRIGGER Delete_It ON TitlesByAuthor INSTEAD OF DELETE AS PRINT 'Row from authors before deletion...' SELECT au_id, au_lname, city, state FROM authors WHERE au_lname = 'Carson' PRINT 'Deleting row from authors...' UPDATE authors SET au_lname = 'DELETED' WHERE au_lname = 'Carson' PRINT 'Verifying deletion...' SELECT au_id, au_lname, city, state FROM authors WHERE au_lname = 'Carson' GO
И если теперь мы введем операторы для удаления строки Carson из этого представления, то произойдет активизация триггера INSTEAD OF и мы получим следующие выходные результаты:
Row from authors before deletion... (Строка из authors перед удалением) au_id au_name city state ----------------------------------------------------------------------------------- 238-95-7766 Carson Berkeley CA (1 row(s) affected) Deleting row from authors... (Удаление строки из authors) (1 row(s) affected) Verifying deletion...: (Проверка удаления) au_id au_name city state ----------------------------------------------------------------------------------- (0 row(s) affected)
Использование триггеров AFTER
Как уже говорилось ранее в этой лекции, триггер AFTER – это просто триггер, который активизируется после завершения указанного события модификации данных. Если у вас определен по таблице более чем один триггер AFTER для определенного события или набора событий, то вы можете задать, какой триггер будет активизироваться первым и какой – последним. Любые другие триггеры, определенные по данной таблице для этого события или набора событий, будут активизироваться в случайном порядке. Первый и последний триггеры задаются с помощью оператора T-SQL sp_settriggerorder. Этот оператор имеет следующий синтаксис:
sp_settriggerorder [@triggername =] 'имя_триггера', [@order=] {'first' | 'last' | 'none'}
Рассмотрим один пример. Предположим, что у нас четыре триггера, определенных по таблице: MyTrigger, MyOtherTrigger, AnotherTrigger и YetAnotherTrigger. Мы хотим убедиться, что после запускающего события AnotherTrigger активизируется первым и MyTrigger активизируется последним. Мы вводим следующие операторы T-SQL:
sp_settriggerorder @triggername = 'AnotherTrigger', @order = 'first' go sp_settriggerorder @triggername = 'MyTrigger', @order = 'last' go sp_settriggerorder @triggername = 'MyOtherTrigger', @order = 'none' go sp_settriggerorder @triggername = 'YetAnotherTrigger', @order = 'none' go
Обозначение "none" для MyOtherTrigger и YetAnotherTrigger указывает, что SQL Server должен активизировать эти триггеры случайным образом после активизации AnotherTrigger и до активизации MyTrigger. Поскольку этот случайный порядок активизации принят для триггеров по умолчанию, то вы не обязаны явно запускать оператор sp_settriggerorder для триггеров, которые запускаются случайным образом.
Использование вложенных триггеров
Вложенные триггеры – это триггеры, которые активизируются другими триггерами. Они отличаются от рекурсивных триггеров, которые активизируют сами себя. Вложенный триггер инициируется, когда событие модификации данных внутри другого триггера активизирует этот вложенный триггер. Как и в SQL Server 7, SQL Server 2000 допускает до 32 уровней вложенности триггеров. Один триггер активизирует второй триггер, который, в свою очередь, активизирует третий триггер, и т.д. вплоть до 32-го триггера. Использование вложенных триггеров разрешается в SQL Server 2000 по умолчанию. Вы можете указать, разрешается ли в SQL Server использование вложенных триггеров, задав соответствующий параметр конфигурации сервера для вложенных триггеров Например, чтобы блокировать использование вложенных триггеров, выполните следующую команду:
sp_configure "nested triggers", 0 GO
Значение 0 блокирует использование вложенных триггеров; значение 1 разрешает их использование. Рассмотрим пример использования вложенных триггеров. В этом примере мы создадим вложенные триггеры, которые будут выполнять каскадные удаления при удалении заголовка книги из таблицы titles. (См. раздел "Создание триггера типа DELETE" ранее.) Мы создали отдельный триггер, который выполняет эту операцию. Сначала мы удалим этот триггер, чтобы он не активизировался. Затем мы создадим три триггера. Второй и третий триггеры будут вложенными триггерами. Первый триггер будет активизировать второй триггер, который будет активизировать третий триггер. Вот эта программа:
USE pubs GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Delete_Title" AND type = "TR") DROP TRIGGER Delete_Title GO CREATE TRIGGER TR_on_titles ON titles FOR DELETE AS DELETE sales FROM sales, deleted WHERE sales.title_id = deleted.title_id PRINT "Deleted from sales" GO CREATE TRIGGER TR_on_sales ON sales DELETE roysched FROM roysched, deleted WHERE roysched.title_id = deleted.title_id PRINT "Deleted from roysched" GO CREATE TRIGGER TR_on_roysched ON roysched DELETE titleauthor FROM titleauthor, deleted WHERE titleauthor.title_id = deleted.title_id PRINT "Deleted from titleauthor" GO
Для успешной работы этих триггеров вы должны удалить ограничения FOREIGN KEY по таблицам, указанным в этих триггерах (см. раздел "Создание триггера типа DELETE" ранее). Чтобы проверить, работают ли все эти триггеры, запустите следующий оператор DELETE:
DELETE FROM titles WHERE title_id = "PS7777" GO
Вы увидите следующий набор результатов:
(2 row(s) affected) (1 row(s) affected) Deleted from titleauthor (Удалено из titleauthor) (2 row(s) affected) Deleted from roysched (Удалено из roysched) (1 row(s) affected) Deleted from sales (Удалено из sales) (1 row(s) affected)
При сбое на любом уровне набора вложенных триггеров происходит отмена всей транзакции и откат модификаций всех данных до начала данной транзакции.
Использование Enterprise Manager
Чтобы создать триггер с помощью Enterprise Manager, вы просто вводите свои операторы T-SQL в окне Trigger Properties (Свойства триггера). Для использования этого метода выполните следующие шаги.
- В окне Enterprise Manager щелкните правой кнопкой мыши на имени таблицы, по которой вы хотите создать триггер. В появившемся контекстном меню укажите All Tasks (Все задачи) и затем выберите из подменю All Tasks пункт Manage Triggers (Управление триггерами). Появится окно Trigger Properties (рис. 22.1).
Рис. 22.1. Окно Trigger Properties (Свойства триггера) - Введите в окне Text предложения T-SQL для вашего триггера. На рис. 22.2 показано окно Trigger Properties, содержащее T-SQL-текст триггера с именем Print_Update.
Рис. 22.2. Окно Trigger Properties с текстом триггера - Щелкните на кнопке Check Syntax (Проверить синтаксис) для проверки синтаксиса. При отсутствии синтаксических ошибок появится диалоговое окно, показанное на рис. 22.3. В противном случае внесите необходимые исправления. Щелкните на кнопке Apply (Применить), чтобы создать данный триггер. Имя нового триггера теперь появится в раскрывающемся списке Name (Имя). На рис. 22.4 показан список с включенным в него именем вашего нового триггера.
Рис. 22.3. Диалоговое окно с сообщением об успешном завершении синтаксической проверки - Окно Trigger Properties остается открытым, что позволяет вам создавать новые триггеры по данной таблице. Если вам не нужно создавать новые триггеры, щелкните на кнопке Close (Закрыть).
Рис. 22.4. Имя нового триггера в раскрывающемся списке Name
Управление триггерами
Теперь, когда вы знаете, как создавать триггер, вам надо научиться управлять триггерами. В этом разделе мы рассмотрим сначала управления триггерами с помощью команд T-SQL, а затем – управление с помощью Enterprise Manager.
Управление триггерами с помощью операторов T-SQL
Имеется несколько операторов, с помощью которых можно управлять триггерами. Вы можете просматривать текст триггера, просматривать существующие триггеры по определенной таблице, изменять текст триггера, удалять триггеры и разрешать или блокировать использование триггеров. Все эти возможности описаны в данном разделе.
Просмотр текста триггера
Информацию о триггерах можно получить с помощью двух системных хранимых процедур: sp_helptext и sp_helptrigger. Процедура sp_helptext, после которой указывается имя триггера, используется для вывода на экран текста, который использовался для создания этого триггера. Например, для просмотра определения созданного ранее триггера Print_Update используйте следующий оператор:
USE MyDB GO sp_helptext Print_Update GO
Результаты выглядят следующим образом:
Text ------------------------------------------------- CREATE TRIGGER Print_Update ON Bicycle_Inventory FOR UPDATE AS PRINT "The Bicycle Inventory table was updated."
Просмотр триггеров, имеющихся по какой-либо таблице
Для просмотра триггеров, существующих по определенной таблице (или чтобы увидеть, что нет ни одного триггера), используйте хранимую процедуру sp_helptrigger, после которой укажите имя этой таблицы. Для просмотра триггеров по таблице MyTable используйте следующий оператор:
USE MyDB GO sp_helptrigger MyTable GO
Ниже приводятся результаты:
trigger_name trigger_owner isupdate isdelete isinsert isafter isinsteadof ----------------------------------------------------------------------------------------------- Print_Update dbo 1 0 0 1 0 (1 row affected)
В результатах показано имя триггера, владелец триггера и тип события модификации данных (или типы событий), активизирующего данный триггер.
Результирующие колонки isupdate, isdelete, isinsert, isafter и isinsteadof содержат значение 1, если триггер активизируется событием модификации данных, которое указано именем колонки, или 0 в противном случае. Если триггер активизируется более чем одним типом событий модификации данных, то значение 1 может быть в нескольких колонках.
Использование оператора ALTER TRIGGER
Чтобы изменить определение триггера, вы можете удалить и заново создать соответствующий триггер или использовать оператор ALTER TRIGGER. Для этого оператора используется тот же синтаксис, что и для оператора CREATE TRIGGER. Если вы модифицируете триггер, то должны переопределить весь этот триггер. Например, для изменения триггера Print_Update, чтобы он активизировался при выполнении операторов INSERT или UPDATE, которые влияют на таблицу Bicycle_Inventory, используйте следующий текст:
USE MyDB GO ALTER TRIGGER Print_Update ON Bicycle_Inventory FOR UPDATE, INSERT AS PRINT "Bicycle_Inventory was updated or a row was inserted" GO
Теперь старая версия данного триггера не существует; она заменена новой версией. Теперь этот триггер будет активизироваться при изменениях в Bicycle_Inventory и при вставке строк в эту таблицу. Ниже показаны примеры операторов, используемых для выполнения этих операций:
INSERT INTO Bicycle_Inventory VALUES ("Trek",1,"Lance S.E.",1,0,1) GO UPDATE Bicycle_Inventory SET in_stock = 1 WHERE model_name = "Lance S.E." GO
Использование оператора DROP TRIGGER
Для удаления триггера из таблицы используйте оператор DROP TRIGGER. Вы можете удалить триггер, который вам больше не нужен. Этот оператор имеет следующий синтаксис:
DROP TRIGGER имя_триггера Чтобы удалить триггер Print_Update, используйте следующий оператор: USE Bicycle_Inventory GO DROP TRIGGER Print_Update GO
Теперь при попытке увидеть существующие триггеры по таблице MyTable (с помощью следующих операторов T-SQL) вы увидите, что нет ни одного триггера:
USE MyDB GO sp_helptrigger MyTable GO
Блокирование (disabling) и разблокирование (enabling) триггеров
Вы можете использовать оператор ALTER TABLE для разблокирования и блокирования триггера без удаления определения этого триггера из таблицы. Поскольку каждый триггер создается по определенной таблице, то мы используем оператор ALTER TABLE вместо оператора ALTER TRIGGER. Создадим триггер из первого примера этой лекции, чтобы использовать его в следующем примере:
USE MyDB GO IF EXISTS (SELECT name FROM sysobjects WHERE name = "Print_Update" AND type = "TR") DROP TRIGGER Print_Update GO CREATE TRIGGER Print_Update ON Bicycle_Inventory FOR UPDATE AS PRINT "Bicycle_Inventory table was updated" GO
В момент создания этот триггер автоматически становится доступен для активизации (он разблокирован). Чтобы блокировать активизацию этого триггера (до момента, когда будет снова задано разблокирование) с сохранением определения этого триггера в соответствующей таблице, используйте опцию DISABLE TRIGGER, как это показано ниже:
ALTER TABLE Bicycle_Inventory DISABLE TRIGGER Print_Update GO
Теперь после этого изменения в таблице Bicycle_Inventory триггер Print_Update не будет активизироваться, пока не будет явно задано разблокирование с помощью опции ENABLE TRIGGER, как это показано ниже:
ALTER TABLE Bicycle_Inventory ENABLE TRIGGER Print_Update GO
Предложения ENABLE TRIGGER и DISABLE TRIGGER полезно использовать, когда вы хотите прекратить активизацию триггера, но сохранить его на тот случай, если он понадобится в будущем. Определение триггера не изменяется, поэтому вам не придется создавать его снова в будущем; вам нужно будет только разблокировать его.
Управление триггерами с помощью Enterprise Manager
Используя Enterprise Manager, вы можете управлять вашими триггерами с помощью графического интерфейса. Но вам по-прежнему нужно знать, как создаются программы на языке T-SQL.
Удаление триггера
Чтобы удалить триггер с помощью Enterprise Manager, выполните следующие шаги.
- Откройте окно Trigger Properties, щелкнув правой кнопкой мыши на имени таблицы, указав в контекстном меню All Tasks и выбрав пункт Manage Triggers из подменю All Tasks.
- В окне Trigger Properties выберите имя данного триггера из раскрывающегося списка Name и щелкните на кнопке Delete (Удалить).
- Появится диалоговое окно подтверждения (рис. 22.5). Щелкните на кнопке Yes (Да), чтобы удалить выбранный вами триггер.
Рис. 22.5. Диалоговое окно, в котором вы подтверждаете удаление триггера
Модифицирование триггера
Чтобы модифицировать триггер с помощью Enterprise Manager, выполните следующие шаги.
- Откройте окно Trigger Properties, щелкнув правой кнопкой мыши на имени таблицы, указав в контекстном меню All Tasks и выбрав пункт Manage Triggers из подменю All Tasks.
- Выберите имя данного триггера из раскрывающегося списка Name.
- Отредактируйте текст T-SQL в окне Text. Для отступов в тексте используйте клавиши Ctrl+Tab. Вы можете использовать оператор CREATE TRIGGER или ALTER TRIGGER. В обоих случаях SQL Server удалит существующий триггер и создаст его заново. Вы можете даже использовать оператор CREATE TRIGGER, указав после него имя существующего триггера. Вы не получите сообщения об ошибке, которое возникло бы при использовании интерактивных OSQL или ISQL. Закончив редактирование, щелкните на кнопке Apply. После SQL Server автоматически модифицирует определение данного триггера.
Заключение
В этой лекции вы ознакомились со специальным типом хранимых процедур, который называется триггером, и узнали о пяти типах триггеров, которые могут быть созданы по определенной таблице: INSERT, UPDATE, DELETE, AFTER и INSTEAD OF. Вы также узнали, как создавать и модифицировать эти триггеры с помощью операторов T-SQL и Enterprise Manager. В лекции 23 вы узнаете, как осуществлять доступ к SQL Server 2000 из Internet с помощью таких технологий, как ADO и XML.
Лекция 23. Доступ к Microsoft SQL Server 2000 из Internet
Появление Microsoft SQL Server 2000 на платформе операционной системы Microsoft Windows 2000 упростило публикацию баз данных SQL Server в Internet. Сочетание Windows 2000 и Microsoft Internet Information Server (IIS) 5 образует обширный массив компонентов и интерфейсов, которые можно использовать для связи и взаимодействия с вашими базами данных SQL Server 2000. Эта лекция знакомит вас с базовыми концепциями доступа к Microsoft SQL Server из Internet с использованием разнообразных методов. Поскольку эта книга не является руководством по разработке, в данной лекции дается лишь обзор различных методов доступа. Выпущено много хороших книг, из которых вы можете получить информацию об особенностях программирования.
Эта лекция начинается с описания концепций программирования для Internet и используемых по умолчанию интерфейсов программирования для Internet, доступных в среде Microsoft Windows 2000. Вы ознакомитесь с основами ODBC-программирования и с ADO. Вы также ознакомитесь с ISAPI и ASP как средствами доступа к SQL Server. И, наконец, вы ознакомитесь с языком XML, узнаете, что это такое, и как его использовать. Эта лекция охватывает много тем, но она поможет вам понять работу базовых инструментов программирования для Internet.
Концепции программирования для Internet
В этом разделе вы ознакомитесь с основами подсоединения к SQL Server приложений, снабженных средствами Internet. Эти приложения содержат два различных интерфейса, причем необходимы оба интерфейса, поскольку они выполняют различные задачи: это интерфейс для пользователя и интерфейс для SQL Server. Данный раздел знакомит вас с возможностями соединения между приложением и SQL Server, и в нем рассматриваются методы соединения с помощью служб IIS и механизма ODBC.
Использование Windows 2000 и IIS 5 как платформы для Internet
Используя Windows 2000 IIS 5 как платформу для Internet-приложений, разработчики получают непревзойденные средства доступа к возможностям SQL Server. Разработчики могут использовать такие возможности, как сценарии выполняемые на сервере (server-side scripting) с интегрированным доступом к базам данных, источники данных открытого интерфейса доступа к базам данных, OLE DB (обширный набор интерфейсов модели компонентных объектов [COM] для универсального доступа к данным) и архитектура Web-приложений, известная под названием ISAPI (Internet Server API – интерфейс прикладного программирования Internet-сервера) (сильный "конкурент" традиционных приложений на основе общего шлюзового интерфейса CGI [Common Gateway Interface]).
Использование источников данных ODBC
ODBC, несомненно, является наиболее предпочтительным интерфейсом баз данных для платформы Microsoft Windows. Используя ODBC, разработчики могут получать доступ к широкому спектру разнородных источников данных, начиная с простых текстовых файлов, электронных таблиц Microsoft Excel и до баз данных Microsoft Access и SQL Server. ODBC обеспечивает общедоступный и при этом мощный уровень абстрагирования для программиста баз данных.
Разработка Internet-приложений с использованием SQL Server не является исключением. Источники данных ODBC являются главным средством доступа к базам данных SQL Server через Web-серверы. Они осуществляют это с помощью набора COM-объектов OLE DB, которые называют объектами данных ActiveX (ADO). ADO обеспечивает объектно-ориентированный интерфейсный доступ в источники данных ODBC, что является более простым методом, чем использование интерфейса API ODBC C. Используя ADO, разработчики могут реализовать простые объекты, представляющие соединения с базой данных, команды (такие как операторы SQL или хранимые процедуры) и наборы записей, аналогичные курсорам клиента и обладающие в значительной степени такими же функциональными возможностями, как курсоры баз данных сервера. Все эти объекты и интерфейсы баз данных делают Internet-разработку с помощью SQL Server почти тривиальной, обеспечивая при этом некоторые из более сильных возможностей, доступных в ODBC, такие как организация пула соединений (связного пула).
Наиболее важным аспектом Web-приложения на основе ODBC является надлежащее использование пула соединений. Организация пулов соединений позволяет приложению среднего звена поддерживать и использовать разделяемым образом соединения с базами данных SQL Server. Разделяемые (совместно используемые) соединения остаются открытыми в течение заданного периода времени и доступными для разделяемого использования пользователями. Установление соединений часто является операцией с интенсивным использованием ресурсов и может налагать большую дополнительную нагрузку на сервер базы данных. Поскольку Web-серверы и связанные с ними Internet-приложения обрабатывают большой объем трафика, то установление и, что еще более важно, – повторное установление соединений следует минимизировать с помощью пула соединений базы данных. Это позволит сократить время соединений для пользователей и снизит дополнительную нагрузку на ресурсы сервера баз данных. По умолчанию служба IIS 5 активизирует пул соединений с базами данных.
Выбор сетевой библиотеки
Хотя SQL Server поддерживает сетевые библиотеки, такие как named pipes (именованные каналы) и Banyan Vines, вам следует при развертывании базы данных SQL Server в Internet использовать в качестве сетевой библиотеки TCP/IP. TCP/IP обеспечивает гибкое использование сети и самую быструю возможность соединений при максимальной производительности среди всех сетевых библиотек в SQL Server. (О сетевых библиотеках см. лекцию 11.)
Используя в качестве сетевой библиотеки TCP/IP, вы ограничены использованием стандартного метода обеспечения безопасности как метода безопасности SQL Server. В этом методе для аутентификации используется учетная запись подключения (login-запись) SQL Server. Использование интегрированной системы безопасности, которая не поддерживается TCP/IP и в которой для аутентификации используются учетные записи Windows, обеспечивает более надежную защиту, и можно доказать, что эта система является наиболее эффективным средством поддержки централизованного управления учетными записями на предприятии. Однако по ряду причин использование интегрированной системы безопасности может приводить к снижению производительности*.
Во-первых, эффективность использования пулов соединений ODBC может существенно снижаться, если вы используете интегрированную систему безопасности. При реализации интегрированной системы безопасности каждый пользователь для аутентификации через Web-сервер на сервере базы данных использует уникальные данные входа. Превосходство в производительности, обеспечиваемое пулом соединений, теряется из-за того, что необходимо повторное использование одного из соединений пула, а запрос соединения должен включать входное имя и пароль, идентичный тому, что используется существующим соединением.
Во-вторых, соединения, базирующиеся на сетевой библиотеке named pipes (именованные каналы), наиболее часто используемой с интегрированной системой безопасности, обычно имеют низкую скорость. Кроме того, использование библиотеки named pipes создает проблемы для пулов соединений. Вы можете использовать пулы соединений в сочетании с named pipes путем использования учетной записи Anonymous как допустимого входа в SQL Server, но в большинстве реализаций для создания отдельных соединений с SQL Server используется аутентификация с запросом/подтверждением или базовая аутентификация. Это фактически сводит на нет любые улучшения производительности, которые могут быть получены с помощью пула соединений.
Если SQL Server инсталлируется на машине, отличной от Web-сервера, то использование интегрированной системы безопасности также ограничивает доступные возможности аутентификации. В этом случае нельзя использовать аутентификацию с запросом/подтверждением, и остаются только варианты базовой аутентификации и анонимной аутентификации. Анонимная аутентификация для системы, которая защищена каким-либо иным образом в Internet, обычно не рекомендуется, и, как уже отмечалось, использование базовой аутентификации ограничивает преимущества организации пула соединений.
Использование ISAPI для доступа к SQL Server
ISAPI – это набор вызовов функций, предназначенных для того, чтобы снабдить разработчиков Internet-приложений мощным методом расширения функциональных возможностей IIS. Приложения ISAPI показывают очень высокую производительность и позволяет осуществлять низкоуровневое управление. Фактически приложения ISAPI могут работать лучше других существующих Web-приложений для IIS. Кроме того, используя ISAPI, разработчик получает доступ ко всему массиву функций Win32 API.
Приложения ISAPI реализуются как динамически подключаемые библиотеки (DLL), которые поставляются в двух формах: расширения и фильтры. Поскольку библиотеки DLL – это обычно откомпилированные программные компоненты для данного типа машины, они выполняются намного быстрее, чем любая интерпретируемая программа или сценарий. Если высокая производительность и масштабируемость являются важными факторами вашего Internet-приложения (в ущерб простоте программирования и модифицирования), то расширение или фильтр ISAPI наиболее подходят для этой цели. В следующих двух разделах подробно описываются расширения и фильтры ISAPI, а в следующем за ними разделе рассматриваются ограничения программирования и использование приложений ISAPI.
Расширения ISAPI
Расширения ISAPI реализуются как библиотеки DLL и загружаются либо в пространство процесса IIS, либо в пространство отдельного процесса. У вас имеется этот выбор для каждого расширения ISAPI, которое вы индексируете на вашем Web-сервере. Если стабильность приложений является важным фактором, то расширения следует загружать в пространство отдельного процесса, чтобы ошибка расширения ISAPI не привела к аварийному отказу всего сервера (что возможно в случае экспериментальных или непроверенных расширений ISAPI).
Для обращения к расширению ISAPI используется виртуальный адрес .dll-файла в URL. Пример: http://www.mydomain.com/SampleISAPI.dll.
При таком способе обращения соответствующее расширение ISAPI загружается в память (если оно еще не загружено), и это расширение обрабатывает весь запрос, причем IIS действует просто как "посредник" для обмена данными с браузером клиента. Еще одним возможным применением этого подхода может быть реализация собственного (заказного) поискового механизма для сайта Internet.
Фильтры ISAPI
Фильтры ISAPI также реализуются как библиотеки DLL, но они загружаются в пространство процесса IIS, когда происходит запуск Web-сервера, и остаются в памяти, пока он не будет закрыт. Фильтры ISAPI можно сконфигурировать для получения любого количества уведомлений о событиях фильтра (filter event notifications), возникающих для каждого запроса протокола HTTP (протокола гипертекстовой передачи), который обрабатывается IIS, и для каждого HTTP-ответа, который генерируется IIS. При загрузке фильтра ISAPI он сообщает IIS (посредством специальной передаваемой структуры), о каких типах событий следует оповещать фильтр. При возникновении такого события уведомление об этом событии передается на каждый фильтр ISAPI, который зарегистрировал свою "заинтересованность" в этом событии.
Фильтры ISAPI являются довольно мощным средством и могут быть использованы для реализации сжатия или шифрования данных, нестандартной аутентификации, регистрации и анализа Web-трафика и даже сценарных механизмов на сервере (server-side scripting engines). Вы можете создать фильтр ISAPI, который просматривает каждый набор Web-страниц, который должен быть доставлен клиенту, ищет специальные теги разметки и действует в соответствии с этими инструкциями подобно тому, как это делает ASP-страница.
Способность проверки и модифицирования каждого входного и выходного потока данных делает фильтры ISAPI мощным и гибким средством. Однако слишком интенсивное использование фильтров ISAPI приводит к резкому снижению общей производительности и масштабируемости сайта. Например, при фильтрации каждой входной и выходной страницы это может стать слишком большой нагрузкой, чтобы с ней могла справляться система, поскольку это требует передачи большого объема дополнительной информации. Следует уделять огромное внимание тому, чтобы свести к минимуму объем работы, выполняемой фильтрами ISAPI. Например, в заказной схеме шифрования фильтр должен выполнять шифрование, а IIS должна выполнять обмен данными с клиентом. Это позволяет снизить количество задач, которые должен выполнять данный фильтр ISAPI.
Ограничения ISAPI
Технология ISAPI может обеспечивать наиболее высокую производительность, но она имеет некоторые недостатки. Для разработки расширений и фильтров ISAPI требуется больше времени, чем для разработки сценарных страниц, поскольку расширения и фильтры ISAPI обычно пишутся на C или C++, и по этой же причине возрастают трудности сопровождения. Для перехода на расширение или фильтр ISAPI требуется повторная компиляция всего приложения, а не просто замена какого-либо одного файла. Хотя расширения и фильтры ISAPI обычно работают быстрее, чем их сценарные аналоги на сервере, они не дают абсолютной гарантии полной масштабируемости. И наконец, определенные абстракции программирования, которые считают очевидными большинство разработчиков сценариев для сервера (в особенности сеансовый объект – session object), почему-то отсутствуют в ISAPI-программировании. ISAPI-программирование происходит на существенно более низком уровне, чем создание сценариев на сервере.
Использование ASP для доступа к SQL Server
ASP – это среда сценариев для сервера, которую могут использовать разработчики для создания интерактивных динамических Web-страниц, используемых для создания мощных Web-приложений. ASP-файл – это текстовый файл с расширением имени .asp, который может содержать любое сочетание текста, тегов HTML и сценариев для сервера. Хотя ASP используются исключительно для сервера, разработчики могут включать сценарий для клиентской стороны со своим HTML-текстом, который обрабатывается не Web-сервером, а клиентским браузером.
Если Web-сервер получает запрос на ASP-файл, то он обрабатывает сценарии для сервера, содержащиеся в специальных тегах этого файла, для создания Web-страницы. В результате получается чисто HTML-файл, который также может включать сценарные компоненты для клиентской стороны. Этот файл передается затем клиентскому браузеру. Клиентский браузер воспроизводит эти компоненты на экране. Ничего из исходного текста ASP не передается клиенту. Весь синтаксический разбор и структурирование выполняются на сервере. Пользователи не могут увидеть команды сценария, с помощью которых была создана страница, представленная на их экране.
Кроме сценариев для сервера ASP-файлы могут содержать вызовы COM-компонентов, которые выполняют множество задач, включая доступ к базам данных, и реализуют объекты бизнес-логики (деловых правил), которые могут совместно использоваться в нескольких средствах разработки.
Технология ASP нейтральна в языковом смысле. Разработчики, имеющие опыт работы с такими языками, как Microsoft Visual Basic Scripting Edition (VBScript), Microsoft JScript или Perl, обнаружат много знакомого в разработке ASP-файлов. В ASP-страницах может использоваться язык сценариев, для которого Web-сервер имеет инсталлированный совместимый с COM механизм обработки сценариев. Механизм (машина) обработки сценариев – это программа, обрабатывающая команды, написанные на определенном языке. В IIS включены механизмы обработки сценариев для популярных языков VBScript (основывается на Visual Basic) и JScript (реализация Microsoft для спецификации языка 262 Европейской ассоциации производителей компьютеров [ECMA]). Механизмы сценариев для популярных языков, таких как Perl, можно получить от независимых поставщиков.
ASP имеет ряд преимуществ по сравнению с традиционными CGI-приложениями. Как уже говорилось, разработчикам, уже знакомым с VBScript или JScript, не нужно изучать новый язык, такой как C или Perl. ASP содержит расширенные функциональные возможности, включающие объекты для сеансов пользователей, запросов и ответов, что намного упрощает разработку индивидуализированного содержания. Кроме того, при обработке и сборе информации HTML-форм и ее сохранении в базе данных для ASP-файла требуется намного меньше времени и объема программирования, чем для полного CGI-приложения, написанного и откомпилированного на языке C. А поскольку весь текст ASP непосредственно встраивается в HTML-документ, это увеличивает удобство сопровождения.
Использование XML для доступа к SQL Server
"XML" – это сокращение от "Extensible Markup Language" (расширяемый язык разметки), но на самом деле XML – это не язык. Это, скорее, система определения других языков и общего синтаксиса для выражения структуры данных. В отличие от языка HTML, который является языком разметки, используемым строго для описания того, как будет представлен Web-документ, XML описывает содержание и структуру документа. Структурированные данные – это данные, которые размечены для своего содержимого или использования.
XML является расширяемым по своей сути. Разработчики используют XML для определения данных внутри Web-страниц, а уровень детализации определяется только потребностями самого разработчика. Например, разработчик будет использовать теги <AUTHOR> (автор) или <TITLE> (заголовок) для описания информации о книгах и публикациях. Если требуются дополнительные определения, то разработчик может добавить теги <RETAILPRICE> (розничная цена), <PUBLISHER (издательство) или даже <ISBN> (стандартный международный код книги).
Использование XML аналогично созданию таблицы в базе данных, когда требуется определить, какие элементы данных (колонки) необходимы для полного описания строк данных в этой таблице, исходя из требований приложения.
Поскольку XML не описывает представление на экране, то XML-документ можно написать один раз и затем выводить его разнообразными способами с использованием различных устройств: через Web-браузер, сотовый телефон, на дисплеях, используемых в автомобилях, и т.д. Каждое из этих устройств может иметь свои требования к отображению: монитор компьютера может выводить изображение с разрешением 800 x 600 пикселов, в то время как беспроводное Internet-устройство – только 200 x 200 пикселов. Так как XML определяет только структуру и содержание документа, то каждое устройство может визуализировать версию документа, адаптируемую к своему дисплею с помощью собственного интегрированного браузера. В отличие от HTML-документов XML-документы могут еще долго применяться после того, как устареют технологии разработки и визуализации, использовавшиеся в период написания этих XML-документов.
Реальным преимуществом XML является способность взаимодействия с объектной моделью документов (DOM) – интерфейсом, который определяет механизмы доступа к данным в документе. Используя DOM, разработчики могут писать сценарии динамического содержимого в стандартизованной форме. Например, разработчики могут использовать модель DOM, чтобы определенная часть содержимого формировалась определенным образом. С помощью этого метода можно реализовать небольшие эффекты, такие как добавление части текста, например заголовка книги, в тег XML с именем <TITLE>, который изменяет цвета, когда устройство указания пользователя перемещается вокруг него, и является гиперссылкой на онлайновый книжный магазин. Получение таких эффектов является в настоящее время не слишком простой задачей при использовании специализированных моделей DOM и спецификаций страниц стилей, однако новые стандарты DOM от консорциума World Wide Web (W3C) помогут разработчикам XML поддерживать настоящую независимость от используемых платформ.
Кроме того, XML быстро становится стандартом обмена данными и документами. XML используется для обмена данными между разнородными системами баз данных в Internet. Например, поставщик компонентов для автомобилей может использовать XML для обмена данными о запасах с производителем автомобилей, даже если они используют совершенно различные системы баз данных на двух различных платформах. А поскольку XML описывает, как структурированы данные, то он может связывать без каких-либо проблем две несовместимые иным образом системы.
Заключение
В этой лекции вы ознакомились с основами разработки Internet-приложений при использовании SQL Server и IIS 5 на платформе операционной системы Windows 2000. Существует широкий диапазон средств разработки – от сред разработки сценариев, таких как ASP, до использования откомпилированных продуктов, таких как расширения и фильтры ISAPI. Каждый из этих вариантов имеет свои преимущества и недостатки. Выбирая инструментарий для разработки вашего полномасштабного Internet-приложения, тщательно проанализируйте компромиссы каждого варианта, чтобы избежать последующих проблем.
Лекция 24. Загрузка базы данных
После создания вашей базы данных и таблиц базы данных вы можете переходить к загрузке ваших данных в эту базу. Имеется несколько методов загрузки данных в базу данных; выбираемый вами метод зависит от типа источника ваших данных, от вида обработки, которая будет выполняться с данными, и от того, куда будут загружаться данные. В этой главе мы рассмотрим следующие методы загрузки в базу данных:
- Использование программы Bulk Copy Program (BCP). BCP – это внешняя программа, поставляемая вместе с Microsoft SQL Server 2000 для загрузки файлов данных в базу данных. BCP можно также использовать для копирования данных из какой-либо таблицы SQL Server в файл данных.
- Использование оператора BULK INSERT. Оператор Transact-SQL (T-SQL) BULK INSERT позволяет вам копировать большие объемы данных из файла данных в таблицу SQL Server в рамках системы SQL Server. Поскольку этот оператор является оператором SQL (выполняется из ISQL, OSQL или анализатора запросов Query Analyzer), то весь процесс выполняется как поток SQL Server. Этот оператор нельзя использовать для копирования данных из SQL Server в файл данных.
- Использование служб преобразования данных Data Transformation Services (DTS). DTS – это набор инструментальных средств, поставляемых вместе с SQL Server, которые намного упрощают задачу копирования данных в SQL Server и из SQL Server. В набор DTS включен мастер для импорта данных и мастер для экспорта данных.
Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.
Для вас могут оказаться полезными следующие дополнительные операции:
- Оператор SELECT...INTO. Этот оператор используется для копирования данных из одной таблицы в другую.
- Переходные таблицы.Переходные таблицы – это временные таблицы, которые обычно используются для преобразования данных внутри базы данных. Вы можете использовать эти таблицы, чтобы облегчить процесс загрузки и модифицировать данные во время загрузки.
Производительность операций загрузки
В этом разделе мы рассмотрим три параметра конфигурирования, которые обычно используются для повышения производительности операций загрузки. Два из этих трех параметров влияют на журнальное протоколирование во время операций массового копирования и третий параметр влияет на блокировку. Массовое копирование – это операция, при которой данные копируются большими порциями; копирование данных большими порциями является наиболее эффективным способом для воспроизведения данных.
Параметры журнального протоколирования
SQL Server использует достаточно сложный механизм протоколирования, чтобы исключить потери данных в случае отказа системы. Журнальное протоколирование имеет важное значение для целостности данных в системе, но оно может существенно увеличивать нагрузку на систему. Вы можете снижать эту нагрузку за счет уменьшения количества протоколируемых данных во время массовых загрузок.
По умолчанию все операции вставки в базу данных полностью протоколируются, что позволяет выполнить восстановление и откат транзакций в случае отказа системы. Отключая полное протоколирование массового копирования (которое выполняется с помощью программы BCP, оператора BULK INSERT или оператора SELECT...INTO ), вы можете снизить количество протоколируемых данных, но при этом будут поддерживаться только операции отката. Это повысит производительность резервного копирования, но потребует повторного запуска всего процесса загрузки в базу данных в случае отказа системы, поскольку не будет выполняться журнальное протоколирование, которое обычно используется для восстановления базы данных. Этот вариант относится к переходным таблицам, только если вы загружаете эти таблицы с помощью описанных выше методов массового копирования.
Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:
- Для параметра базы данных SELECT INTO/BULKCOPY задано значение TRUE. Вот синтаксис этой команды с использованием хранимой процедуры sp_dboption:
exec sp_dboption имя_базы_данных, "select into/bulkcopy", TRUE
- Вы можете также конфигурировать этот параметр с помощью Enterprise Manager. (О Enterprise Manager см. главу 8.)
- Таблица, в которую загружаются данные, не реплицируется. (О репликации см. главы 26, 27 и 28.)
- Задана подсказка TABLOCK. (Более подробную информацию по этой подсказке см. далее в разделе "Необязательные параметры".) Если для таблицы, в которую загружаются данные, определены индексы, то SQL Server не требует от вас указания подсказки TABLOCK.
Еще один параметр базы данных – trunc. log on chkpt – отключает сохранение журнальных записей, когда для этого параметра задано значение TRUE. В этом случае происходит усечение журнала транзакций каждый раз, как встречается контрольная точка. Это повышает производительность массового копирования, но означает, что вы не получите ни повторного выполнения, ни отката в случае отказа системы.
Чтобы задать этот параметр с помощью хранимой процедуры, используйте sp_dboption со следующими параметрами:
exec sp_dboption имя_базы_данных, "trunc. log on chkpt", TRUE
Рис. 24.1. Вкладка Options (Параметры) окна Properties (Свойства) базы данных
Параметр блокировки
Вы можете также повысить производительность массового копирования путем активизации параметра table lock on bulk load (блокировка таблицы при массовой загрузке). Этот параметр позволяет вам использовать для операции массового копирования одну табличную блокировку вместо нескольких блокировок по строкам. Значение параметра table lock on bulk load задается с помощью хранимой процедуры sp_tableoption со следующими параметрами:
exec sp_tableoption "имя_таблицы", "table lock on bulk load", TRUE
(Не забудьте восстановить в исходное состояние параметр trunc. log on chkpt после завершения загрузки.) Поскольку параметр table lock on bulk load влияет на режим блокировки данной таблицы только во время массовой загрузки, то если вы не выполняете массовую загрузку, никакого ухудшения производительности не происходит.
Программа массового копирования (BCP)
С помощью BCP вы можете выполнять копирование из файла данных в SQL Server или из SQL Server в файл данных. BCP полезна для передачи данных в SQL Server из других баз данных, а также для передачи данных, создаваемых пользователем. В этом разделе вы узнаете об использовании программы BCP и ее параметров, а также о форматировании данных, чтобы их можно было копировать с помощью BCP в SQL Server и из SQL Server.
Синтаксис BCP
BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для BCP требуется указывать определенные обязательные параметры, и вы можете использовать с этой программой много дополнительных (необязательных) параметров. Ниже приводится формат команды BCP. (Указаны все обязательные и необязательные параметры.)
bcp {[[имя_базы_данных.][владелец].]{имя_таблицы | имя_представления} | "запрос"} {in | out | queryout | format} файл_данных [-m максимум_ошибок] [-f форматный_файл] [-e файл_ошибок] [-F первая_строка] [-L последняя_строка] [-b размер_группы] [-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6] [-q] [-C кодовая_страница] [-t ограничитель_полей] [-r разделитель_строк] [-i входной_файл] [-o выходной_файл] [-a размер_пакета] [-S имя_сервера[\имя_экземпляра]] [-U login_id] [-P пароль] [-T] [-v] [-R] [-k] [-E] [-h "подсказка [,...n]"]
Обязательные параметры
Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью BCP вы можете извлекать данные из файла данных и помещать их таблицу (или представление) SQL Server или извлекать данные из таблицы (или представления) и помещать их в файл данных.
Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)
В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).
Местоположение файла данных, используемого в операции массового копирования, указывается параметром файл_данных. Это должен быть соответствующий путь доступа.
И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.
Параметр | Описание |
---|---|
In (В базу данных) | Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server |
Out (Из базы данных) | Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных |
Queryout (Извлечение с помощью запроса) | Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных |
Format (Формат) | Указывает, что в дополнение к операции массового копирования программа BCP будет создавать форматный файл. Для создания этого форматного файла используются параметры форматирования ( -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы BCP, чтобы вам не требовалось повторять их при последующем использовании BCP |
Необязательные параметры
Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы BCP при выполнении массового копирования.
Параметр | Описание |
---|---|
-a размер_пакета | Указывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером |
-b размер_группы | Указывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку |
-c | Указывает, что BCP использует символьный тип данных |
-e файл_ошибок | Указывает путь доступа к файлу ошибок, в котором протоколируются ошибки при работе BCP |
-f форматный_файл | Указывает путь доступа к форматному файлу, который ранее использовался программой BCP. Форматный файл создается в том случае, если BCP запускается с параметром format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать |
-h "подсказка [,.n]" | Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:
|
-i входной_файл | Указывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой BCP, когда база данных работает в интерактивном режиме |
-k | Указывает, что в пустые колонки заносятся значения null, а не значения по умолчанию |
-m максимум_ошибок | Указывает, сколько ошибок должно произойти, чтобы BCP прекратила работу. Если этот параметр не указан, то используется значение по умолчанию, равное 10 |
-n | Указывает, что BCP использует собственные (native) типы данных |
-o выходной_файл | Указывает выходной файл, в который поступает выходная информация программы BCP. Это обычный текстовый файл, который можно читать с помощью Notepad (Блокнота) или других утилит |
-q | Указывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел |
-r разделитель_строк | Указывает символ окончания строк. По умолчанию используется символ новой строки |
-t ограничитель_полей | Указывает ограничитель полей. По умолчанию используется символ табуляции (tab) |
-v | Выводит номер версии и информацию об авторских правах программы BCP |
-w | Указывает, что BCP использует символы Unicode |
-C кодовая_страница | Указывает кодовую страницу данных в файле данных |
-E | Указывает, что копируемый файл содержит значения для идентификации колонок |
-F первая_строка | Указывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных |
-L последняя_строка | Указывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк |
-N | Указывает, что BCP использует собственные типы данных для несимвольных данных и Unicode для символьных данных |
-P пароль | Указывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U. |
-R | Указывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы |
-S имя_сервера | Указывает имя сервера, на который выполняется копирование |
-T | Указывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети |
-U login_id | Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных |
-V 60 | 65 | 70 | Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n |
-6 | Указывает, что BCP использует типы данных Microsoft SQL Server 6 или Microsoft SQL Server 6.5 |
Как видно из этой таблицы, для использования возможностей BCP можно задавать разнообразные параметры и комбинации этих параметров. Наилучшим способом ознакомления с этими параметрами является проработка примеров использования BCP, которые приводятся ниже.
Использование BCP
В этом разделе мы рассмотрим несколько примеров использования BCP для загрузки данных в SQL Server и из SQL Server. Эти примеры не охватывают все возможности, но они дадут вам хорошее представление о разнообразных режимах и методах работы с помощью BCP.
Вы можете использовать BCP из командной строки, как это описано выше, или в интерактивном стиле. Для вызова BCP без какого-либо дополнительного взаимодействия с этой программой, вы должны задать параметр -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа BCP будет работать в интерактивном режиме.
Загрузка данных путем интерактивного использования BCP
Использование BCP для загрузки данных в интерактивном режиме может вызывать определенные трудности, поскольку этот метод требует, чтобы вы указывали ширину и типы колонок. Вы не обязаны это делать, если используете параметры командной строки, как это описано в следующем разделе. Хотя использование BCP в интерактивном режиме не рекомендуется, мы рассмотрим пример использования этого метода, чтобы вы имели полное представление о том, как работает BCP. В этом примере мы выполним копирование данных из файла data2.file в таблицу Customers базы данных Northwind с записью ошибок в файл err.file. Вы должны иметь заранее созданный файл данных data2.file. Этот файл содержит данные, которые вам нужно загрузить в таблицу Customers. Для запуска интерактивного сеанса в качестве системного администратора введите следующий оператор:
bcp Northwind.dbo.Customers in data2.file -e err.file -Usa
Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).
Далее программа BCP будет запрашивать у вас информацию, касающуюся данных, которые вы хотите копировать. Ниже приводится пример интерактивного сеанса. Отметим, что ввод пользователя показан полужирным шрифтом.
Enter the file storage type of field CustomerID [nchar]: char (Введите тип файлового хранения для поля ...) Enter prefix-length of field CustomerID [1]: 0 (Введите длину префикса поля ...) Enter length of field CustomerID [26]: 5 (Введите длину поля ...) Enter field terminator [none]: , (Введите ограничитель поля ...) Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: 40 Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: 30 Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: 30 Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: 60 Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: 15 Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: 10 Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: 24 Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: 24 Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: Y (Хотите сохранить эту информацию о формате в файле?) Host filename [bcp.fmt]: data.fmt (Имя файла) Starting copy... (Начало копирования) SQLState = S1000, NativeError = 0 Error = [Microsoft][ODBC SQL Server Driver] Unexpected EOF encountered in BCP data-file (Ошибка = ... непредвиденный конец файла в файле данных BCP) 5 rows copied. (Скопировано 5 строк) Network packet size (bytes): 4096 (Размер сетевого пакета [в байтах]) Clock Time (ms.): total 51 Avg 10 (98.04 rows per sec.) (Время (мс): всего 51 В среднем 10 (98.04 строк в сек.)
Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа BCP достигла конца файла, было выдано сообщение об ошибке, поскольку мы не указали количество строк для копирования.
Загрузка данных программой BCP с помощью параметров командной строки
Как уже говорилось, вам будет намного проще использовать BCP для загрузки данных, если вы будет использовать параметры командной строки. В примере этого раздела мы будем использовать BCP для загрузки данных из файла данных, состоящего из символьных колонок, разделенных символами табуляции (tab). Чтобы указать, что в файле данных используется символьный формат, мы будем использовать параметр -c. Кроме того, использование параметра -c позволяет выполнять BCP в неинтерактивном режиме. Следующая команда копирует 25 строк данных из файла данных data.file. в таблицу Customers базы данных Northwind:
bcp Northwind.dbo.Customers in data.file -e err.fil -c -Usa
Поскольку параметр -c указывает символьные данные, вам не нужно задавать длину полей и длину префиксов. Если предположить, что вы создали файл data.file с 25 строками данных, разделенных символом tab в соответствии с колонками таблицы Customers, и ввели пароль sa, то соответствующий сеанс будет иметь следующую форму: (Размер вашего сетевого пакета и время работы, возможно, будут отличаться.)
Starting copy... 25 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 80 Avg 3 (312.50 rows per sec.)
В этом примере направление копирования было указано параметром in, т.е. данные копировались в базу данных. Всегда имеет смысл указывать файл ошибок, в котором ведется журнал ошибок, возникших во время сеанса BCP. Если вы не указываете файл ошибок, эти ошибки выводятся на экран и, в конце концов, в результате прокрутки исчезают с экрана.
Загрузка данных с помощью параметра -f (format)
В нашем первом примере раздела "Использование BCP" мы создали форматный файл с именем data.fmt. Вместо ввода вручную всех параметров форматирования, таких как storage type (тип хранения), prefix length (длина префикса), field length (длина поля) и field terminator (разделитель полей), вы можете использовать форматный файл. Для вызова этого файла используется параметр -f (format), как это показано ниже:
bcp Northwind.dbo.Customers in data2.file -e err.fil -f data.fmt -L 5 -Usa
В предположении, что вы ввели пароль sa и создали data2.file, сеанс будет иметь следующую форму:
Starting copy... 5 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 50 Avg 10 (100.00 rows per sec.)
В дополнение к параметру -f в данном примере включен параметр -L. Этот параметр указывает последнюю строку для копирования из входного файла. В данном примере последней обрабатываемой строкой была пятая строка. В результате здесь не появится сообщение об ошибке EOF (конец файла), которое мы видели в предыдущем примере.
Извлечение данных путем интерактивного использования BCP
Использование BCP в интерактивном режиме для копирования данных из базы данных проще, чем использование BCP для копирования в базу данных, поскольку при извлечении данных BCP самостоятельно заполняет для вас параметры длины полей. Мы используем следующую команду для интерактивного копирования данных из таблицы Customers базы данных Northwind:
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса. (Ввод пользователя показан полужирным шрифтом.)
Enter the file storage type of field CustomerID [nchar]: char Enter prefix-length of field CustomerID [1]: 0 Enter length of field CustomerID [26]: Enter field terminator [none]: , Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: n Host filename [bcp.fmt]: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 10 Avg 0 (9600.00 rows per sec.)
В этом интерактивном сеансе BCP создается файл с разделителями – символами табуляции (напомним, что символ табуляции является разделителем по умолчанию); этот файл можно просматривать с помощью Notepad. Это текстовый файл, и все его данные являются данными символьного типа. К сожалению, BCP не добавляет символ новой строки в конце каждой строки. Тем самым при просмотре файл с помощью Notepad вы увидите одну очень длинную строку данных.
Извлечение данных с помощью BCP с параметрами командной строки
Чтобы создать более удобный для чтения файл данных, в котором данные разделены символом табуляции, а каждая строка заканчивается символом новой строки, используйте параметр -c, как это показано ниже:
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -c -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса, как показано ниже:
Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
Извлечение данных с использованием параметра queryout
В нашем последнем примере для извлечения данных используется параметр queryout. Это параметр позволяет вам задавать запрос при копировании данных из базы данных SQL Server. С помощью этого запроса происходит выбор определенных данных и копирование только этих данных. Параметр queryout достаточно прост для использования – просто не забывайте указывать запрос в кавычках, как это показано ниже:
bcp "SELECT CustomerID, CompanyName FROM Northwind..Customers" queryout dataout.dat -e err.fil -c -U sa Как обычно, введите пароль sa; сеанс будет показан в следующей форме: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
Результатом этого запроса будет файл данных с разделителями в виде символов табуляции и признаками конца строк; этот файл состоит из двух колонок: CustomerID и CompanyName. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.
Оператор BULK INSERT
Оператор T-SQL BULK INSERT аналогичен программе BCP – в том смысле, что оба средства можно использовать для массового копирования данных из файла данных в базу данных SQL Server. Но, в отличие от BCP, оператор BULK INSERT нельзя использовать для извлечения данных из баз данных SQL Server. Это ограничение уменьшает его функциональные возможности, но поскольку оператор BULK INSERT выполняется как поток внутри SQL Server, это устраняет необходимость передачи данных из одной программы в другую, что повышает производительность при загрузке данных. Таким образом, оператор BULK INSERT загружает данные более эффективно, чем программа BCP.
Синтаксис BULK INSERT
Как и BCP, оператор BULK INSERT имеет несколько обязательных параметров и много необязательных. Вызов BULK INSERT из SQL Server (с помощью ISQL, OSQL или анализатора запросов [Query Analyzer]) происходит с помощью следующего оператора. (Здесь приводятся все обязательные и необязательные параметры.)
BULK INSERT [['имя_базы_данных'.]['владелец'].] {'имя_таблицы' | 'имя_представления' FROM 'файл_данных' } [WITH ( [BATCHSIZE [ = размер_группы ]] [[,] CHECK_CONSTRAINTS ] [[,] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница']] [[,] DATAFILETYPE [ = {'char'|’native’| 'widechar'|’widenative’}]] [[,] FIELDTERMINATOR [ = 'ограничитель_полей' ]] [[,] FIRSTROW [ = первая_строка ]] [[,] FIRETRIGGERS [ = триггеры ]] [[,] FORMATFILE [ = 'путь_к_форматному_файлу' ]] [[,] KEEPIDENTITY ] [[,] KEEPNULLS ] [[,] KILOBYTES_PER_BATCH [ = килобайт_на_группу ]] [[,] LASTROW [ = последняя_строка ]] [[,] MAXERRORS [ = максимум_ошибок ]] [[,] ORDER ( { колонка [ ASC | DESC ]}[ ,...n ])] [[,] ROWS_PER_BATCH [ = строк_на_группу ]] [[,] ROWTERMINATOR [ = 'разделитель_строк' ]] [[,] TABLOCK ] )]
Обязательные параметры
Местоположение файла данных указывается параметром файл_данных. Это должен быть допустимый путь доступа к файлу.
Местоположение базы данных, в которую помещаются данные, задается определением таблицы или представлением. Как видно из определения синтаксиса оператора, вы можете также указывать владельца таблицы или представления и/или имя базы данных. Если использовать эту команду массовой вставки для вставки данных в какое-либо представление, то вы можете затрагивать только одну из базовых таблиц, указываемую в предложении FROM этого представления.
Необязательные параметры
Вы можете использовать необязательные параметры и ключевые слова, которые перечислены в табл. 24.3, чтобы модифицировать поведение BULK INSERT. Как вы увидите из описания, параметры, которые можно использовать с оператором BULK INSERT, аналогичны параметрам программы BCP.
Необязательный параметр | Описание |
---|---|
BATCHSIZE = размер | Указывает количество строк в группе (пакетном задании). Каждая группа обрабатывается как одна транзакция |
CHECK_CONSTRAINTS | Указывает на то, что будет выполняться проверка ограничений. По умолчанию ограничения игнорируются. |
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница' ] | Указывает кодовую страницу данных в файле данных. Этот параметр полезно использовать только с типами данных char, varchar и text |
ATAFILETYPE [ = 'char' | 'native' | 'widechar' | 'widenative' ] | Указывает тип данных в файле данных; по умолчанию это тип char. Другие типы: native (собственные типы данных базы данных), widechar (символы Unicode) и widenative (то же, что и native, но типы char, varchar и text сохраняются как Unicode) |
FIELDTERMINATOR [ = ограничитель_полей ] | Указывает ограничитель полей, используемый с типами данных char и widechar. По умолчанию это символ табуляции ( \t ) |
FIRSTROW [ = первая_строка ] | Номер первой строки для копирования. По умолчанию 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных. |
FORMATFILE [ = форматный_файл ] | Указывает путь доступа к форматному файлу |
KEEPIDENTITY | Указывает, что в импортируемых файлах данных присутствуют значения для колонки со свойством identity |
KEEPNULLS | Указывает, что в пустых колонках сохраняется значение null |
KILOBYTES_PER_BATCH [ = число ] | Указывает приблизительное количество килобайт на одну группу (пакетное задание), используемую при массовом копировании |
LASTROW [ = последняя_строка ] | Указывает последнюю строку для выполнения массового копирования. По умолчанию используется значение 0. Этот параметр полезно использовать, если вы хотите вставить только определенное количество строк |
MAXERRORS [ = максимум_ошибок ] | Указывает, сколько ошибок должно произойти, чтобы прекратить вставку. Значение по умолчанию равно 10 |
ORDER ( колонка [ASC | DESC] ) | Задает, что данные в указанной колонке должны быть отсортированы в указанном порядке (по возрастанию или убыванию) |
ROWS_PER_BATCH [ = строк_на_группу ] | Указывает количество строк на одну группу (пакетное задание). Каждая группа копируется в виде одной транзакции. По умолчанию вставка всех строк файла данных выполняется как одна транзакция с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка групп, что позволит выполнять другую обработку |
ROWTERMINATOR [ = разделитель_строк ] | Указывает разделитель строк для данных типа char и widechar. По умолчанию используется символ новой строки ( \n ) |
Использование BULK INSERT
Рассмотрим два примера использования оператора BULK INSERT.
В обоих примерах мы будем загружать данные из файла с символьными данными data.file (который использовали в предыдущих примерах) в таблицу Customers базы данных Northwind.
Для загрузки данных в базу данных используйте следующий оператор T-SQL:
BULK INSERT Northwind..Customers FROM 'C:\data.file' WITH ( DATAFILETYPE = 'char' ) GO
Вы можете добавлять любое количество параметров. В следующем примере используется большее количество необязательных параметров:
BULK INSERT Northwind..Customers FROM 'C:\data.file' WITH ( BATCHSIZE = 5, CHECK_CONSTRAINTS, DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', FIRSTROW = 5, LASTROW = 20, TABLOCK )
Этот оператор будет загружать из файла данных только строки 5-20. Указывается, что разделителем полей будет символ табуляции (несмотря на то, что он используется по умолчанию). В этом примере также указано, что во время процесса массовой вставки будут проверяться ограничения, а также задается блокировка таблицы на период загрузки. Транзакции, выполняющие загрузку, будут выполняться группами по пять строк.
Службы преобразования данных Data Transformation Services (DTS)
Средство DTS является частью SQL Server Enterprise Manager и предназначено для того, чтобы вы могли легко импортировать данные в базу данных и экспортировать данные из базы данных. DTS включает в себя двух мастеров: мастер импорта Import Wizard и мастер экспорта Export Wizard.* В этом разделе мы рассмотрим использование этих мастеров.
Мастер Import Wizard
Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BCP и оператора T-SQL BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.
- В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, на который вы хотите импортировать данные. В меню Tools (Сервис) выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard (Выбор мастера) раскройте папку Data Transformation Services (Службы преобразования данных), щелкните на DTS Import Wizard (Мастер импорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Import Data (Импорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.2).
Рис. 24.2. Начальное окно мастера Data Transformation Services Import/Export Wizard - Щелкните на кнопке Next (Далее), чтобы появилось окно Choose а Data Source (Выберите источник данных) (рис. 24.3).
Рис. 24.3. Окно Choose а Data Source (Выберите источник данных)Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип Text File (Текстовый файл). Вы можете выбрать источник данных из следующих вариантов:- dBase
- Microsoft Access
- Microsoft Data Link
- Microsoft Excel
- Microsoft Visual FoxPro
- Other (ODBC data source) (Другой [источник данных ODBC])
- Other OLE_DB data source (Другие источники данных OLE_DB)
- Paradox
- Data files (Файлы данных)
- Щелкните на кнопке Next, чтобы появилось окно Select file format (Выбор формата файла) (рис. 24.4). (Окно Select file format появляется только в том случае, если выбран тип файла Text File.) В этом окне вы можете выбрать формат файла. Ниже описываются параметры этого окна:
- Кнопки выбора Delimited (С ограничителями) и Fixed field (Поле фиксированной ширины) позволяют вам выбрать формат входного файла, а также определенный символ-ограничитель или фиксированную ширину полей.
- В раскрывающемся списке File type (Тип файла) вы можете выбрать тип кодировки для входного файла: ANSI, OEM или Unicode.
Рис. 24.4. Окно Select file format (Выбор формата файла) - В раскрывающемся списке Row delimiter (Разделитель строк) вы можете указать символ, который используется как признак конца каждой строки входного файла.
- В раскрывающемся списке Text qualifier (Описатель текста) вы можете указать ограничитель текста в файле с ограничителями.
- В прокручиваемом списке Skip rows (Пропустить строки) вы можете указать, сколько строк нужно пропустить в начале входного файла.
- Флажок First row has column names (Первая строка содержит имена колонок) указывает, что первая строка содержит не данные, а названия, и ее нужно пропустить.
- Выберите вариант Delimited для формата файла, символы {CR}{LF} для разделителя строк (Row delimiter) и вариант <none> (нет) в списке Text qualifier. Затем щелкните на кнопке Next, чтобы появилось окно Specify Column Delimiter (Указание ограничителя колонок) (рис. 24.5). (Если щелкнуть на кнопке выбора Fixed Field вместо Delimited, то появится окно Fixed Field Column Positions (Позиции колонок полей фиксированной ширины).) Это окно удобно для указания ограничителя колонок, поскольку вы получаете немедленный результат в зависимости от вашего выбора, который показывает, насколько подходит ваш выбор. Вы можете использовать запятую (кнопка выбора Comma), точку с запятой (Semicolon) или любой другой ограничитель. После выбора ограничителя в окне Preview (Просмотр) появляются строки. Это позволяет вам увидеть, насколько подходит выбранный вами ограничитель для данных входного файла.
- После выбора ограничителя щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя данных) (рис. 24.6). Это окно позволяет вам выбрать базу данных, в которую будет выполнен импорт. Вы должны указать в поле Destination (Получатель) SQL Server ODBC (ODBC-алиас для соответствующей базы данных), а также сервер (поле Server) и базу данных (поле Database). В данном примере вы укажем базу данных Northwind. Вы должны также выбрать тип аутентификации: в системе Windows или в SQL Server (кнопка выбора Use Windows Authentication или Use SQL Server Authentication). Выбрав аутентификацию в SQL Server, вы должны ввести имя пользователя и пароль для SQL Server (соответственно поля Username и Password). (О системе безопасности для SQL Server см. главу 34.) Если ввести неверное имя пользователя или пароль, то вы можете повторить попытку, щелкнув на кнопке Refresh (Обновить). Чтобы модифицировать дополнительные свойства, включая параметры безопасности и тайм-аут соединения, щелкните на кнопке Advanced (Дополнительно) и выберите нужные параметры в появившемся окне. Обычно эти свойства не требуется модифицировать.
Рис. 24.5. Окно Specify Column Delimiter (Указание ограничителя колонок)
Рис. 24.6. Окно Choose a Destination (Выбор получателя данных)
- Щелкните на кнопке Next, чтобы появилось окно Select Source Tables and Views (Выбор исходных таблиц и представлений) (рис. 24.7). В этом окне вам нужно выбрать из раскрывающегося списка колонки Destination таблицу, в которую будут загружаться данные. Вы можете предварительно просмотреть эти данные, щелкнув на кнопке Preview. Вы можете также использовать кнопки Select All (Выбрать все) и Deselect All (Отменить весь выбор), чтобы выбрать все таблицы или не выбирать ни одной таблицы.
Рис. 24.7. Окно Select Source Tables and Views (Выбор исходных таблиц и представлений) - В том же окне вы имеете доступ к службам преобразования. Эти службы позволяют вам преобразовывать данные (изменять колонки и т.д.) при выполнении импорта. Для преобразования данных сначала щелкните на кнопке Transform (Преобразование) (кнопка с тремя точками под словом Transform), чтобы открыть диалоговое окно Column Mappings and Transformations (Отображение и преобразование колонок) (рис. 24.8). Во вкладке Column Mappings (Отображение колонок) вы можете выбрать создание новой таблицы (кнопка выбора Create destination table) либо удаление строк (Delete rows) или добавление строк (Append rows) в существующей таблице. Вариант Append rows to destination table (Добавление строк к таблице-получателю) принят по умолчанию. Если выбрать создание новой таблицы, то с помощью кнопки Edit SQL (Редактировать SQL) вы можете просматривать и модифицировать оператор SQL, который будет использоваться для создания этой таблицы.
- Щелкните на вкладке Transformations для просмотра параметров преобразования (рис. 24.9). В окне этой вкладки вы можете выбрать копирование непосредственно в колонки таблицы (Copy the source columns directly ...) или преобразование информации во время ее копирования (Transform information as it is copied). Здесь указаны такие способы преобразования, как преобразование точности (16-битные данные в 32-битные, 32-битные в 16-битные). Можно также задавать преобразование значений null (NOT NULL to NULL, NULL to NOT NULL).
- Щелкните на кнопке OK, чтобы закрыть это диалоговое окно, и щелкните на кнопке Next, чтобы появилось окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета) (рис. 24.10). В этом окне вы можете выбрать немедленный запуск процесса импорта или запланировать его на определенное время в будущем. Вы можете также сохранить этот пакет DTS, чтобы можно было снова выполнить этот импорт в будущем. Для этого установите флажок Save DTS Package (Сохранить пакет DTS), который находится в секции Save (Сохранение) внизу данного окна. Тем самым вы сохраните выбранные вами значения параметров служб преобразования.
Рис. 24.8. Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)
Рис. 24.9. Вкладка Transformations диалогового окна Column Mappings and Transformations - Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS) (рис. 24.11). Щелкните на кнопке Finish (Готово), чтобы выполнить импорт.
Рис. 24.10. Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)
Рис. 24.11. Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS) - После щелчка на кнопке Finish вы увидите окно Executing Package (Идет выполнение пакета) (рис. 24.12). Затем появится окно сообщения, информирующее вас, что копирование данных завершено или возникла ошибка.
Как видно из описания, мастер DTS Import Wizard превращает выполнение импорта данных в простую процедуру. Однако при повторяемом выполнении этой задачи более эффективным будет создание сценария, поскольку он наиболее подходит для быстрого и простого многократного использования. Файл сценария создается путем сохранения оператора BULK INSERT в .sql-файле.
Рис. 24.12. Окно Choose a Destination (Выбор получателя данных)
Мастер Export Wizard
Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы BCP, мастер Export Wizard может также экспортировать данные в хранилища, отличные от файлов данных. Для использования Export Wizard выполните следующие шаги.
- В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, с которого вы хотите экспортировать данные. В меню Tools выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard раскройте папку Data Transformation Services, щелкните на DTS Export Wizard (Мастер экспорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Export Data (Экспорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.13).
Рис. 24.13. Начальное окно Data Transformation Services Import/Export Wizard - Щелкните на кнопке Next, чтобы появилось окно Choose a Data Source (рис. 24.14). В этом окне вы можете указать источник данных. Вы можете оставить вариант по умолчанию (Microsoft OLE DB Provider for SQL Server) или выбрать вариант Microsoft ODBC Driver for SQL Server. При любом варианте произойдет подсоединение к SQL Server. Для экспорта данных из других систем управления базами данных можно использовать другие варианты. Затем выберите базу данных – в данном случае базу данных Northwind. Вы можете также задать дополнительные параметры, такие как тайм-аут соединения, сетевой адрес, сетевые библиотеки и идентификатор рабочей станции, в окне, которое появится, если щелкнуть на кнопке Advanced. Однако эти параметры обычно не требуется модифицировать.
Рис. 24.14. Окно Choose a Data Source (Выбор источника данных) - Щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя) (рис. 24.15). Параметры этого окна варьируются в зависимости от типа данных выбранного вами получателя данных; однако в большинстве случаев вам потребуется ввести данные для входа и информацию о файле. В данном случае мы выберем вариант получателя данных Text File (Текстовый файл), который не требует данных для входа, поэтому мы сможем сохранить таблицу базы данных в текстовой форме. Введите имя выходного файла в текстовом поле File name (Имя файла).
- Щелкните на кнопке Next, чтобы появилось окно Specify Table Copy or Query (Копия таблицы или запрос) (рис. 24.16). В этом окне вы можете выбрать между экспортом всей таблицы (кнопка выбора Copy table(s)...) или экспортом, осуществляемым через запрос (кнопка выбора Use a query...). Если в качестве получателя данных выбрана другая база данных SQL Server, то станет доступна третья кнопка выбора – Copy objects and data between SQL Server databases (Копировать объекты и данные между базами данных SQL Server).
Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type SQL Statement (Введите оператор SQL) (рис. 24.17). Здесь вы можете ввести оператор, который осуществит выбор данных для экспорта. С помощью этого запроса можно выбрать подмножество колонок или строк или выбрать всю таблицу, как это показано в данном примере.
Рис. 24.15. Окно Choose a Destination (Выбор получателя)
Рис. 24.16. Окно Specify Table Copy or Query (Копия таблицы или запрос)
Рис. 24.17. Окно Type SQL Statement (введите оператор SQL)) - Щелкните на кнопке Next, чтобы появилось окно Select destination file format (Выбор формата выходного файла) ((рис. 24.18). (Раскрывающийся список Source не появится в этом окне, если вы вошли в это окно из окна Type SQL Statement.) Здесь вы можете задать несколько параметров форматирования для выходного файла, включая выбор между файлом с ограничителями и файлом с полями фиксированной ширины. По окончании выбора параметров форматирования щелкните на кнопке Next.
Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the source database (Копировать таблицу(ы) и представление(я) из исходной базы данных) в окне Specify Table Copy Or Query и щелкнуть на кнопке Next, то появится окно Select destination file format (рис. 24.18). (В данном случае в окне появится раскрывающийся список Source.) В этом окне вам нужно выбрать исходную таблицу, а также выбрать параметры форматирования для выходного файла. По окончания щелкните на кнопке Next.
Рис. 24.18. Окно Select destination file format - После щелчка на кнопке Next в окне Select destination file format появится окно Save, schedule, and replicate package (рис. 24.19). Здесь вы можете выбрать между запуском этого задания и сохранением DTS-пакета для будущего использования. Это окно является аналогом соответствующего окна мастера Import Wizard.
- Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Export Wizard (рис. 24.20). Щелкните на кнопке Finish для запуска экспорта.
- После щелчка на кнопке Finish в окне мастера Export Wizard начнется выполнение процесса экспорта данных. Как и в случае мастера Import Wizard появится окно Executing Package (рис. 24.21). Затем появится окно сообщения, где говорится об успешном или неуспешном завершении данной работы.
Оба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.
Рис. 24.19. Окно Save, schedule, and replicate package
Рис. 24.20. Окно Completing the DTS Export Wizard
Рис. 24.21. Окно Executing Package
Переходные таблицы
Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать переходные таблицы.
Основы использования переходных таблиц
Переходная таблица – это временная область хранения базы данных, в которую вы можете копировать данные. Затем вы можете использовать T-SQL для преобразования данных в нужный формат путем выполнения таких операций, как операции объединения, использующие переходную таблицу и существующие таблицы.
Возможность обработки данных во время процесса загрузки в переходные таблицы позволяет вам обходить определенные ограничения методов загрузки данных. Большинство методов загрузки данных позволяют вам только копировать данные в базу данных без какой-либо обработки. Используя DTS, вы можете выполнять некоторые преобразования данных, но не можете вносить изменения, основываясь на данных, содержащихся в базе данных. Главным преимуществом использования переходных таблиц является то, что вы получаете возможность выполнения операций объединения (слияния), используя при этом информацию, содержащуюся в самой переходной таблице или в существующих таблицах.
Использование переходных таблиц
В этом разделе мы рассмотрим три примера использования переходных таблиц: слияние и загрузка таблицы, загрузка и разбиение таблицы, а также загрузка уникальных значений в таблицу. Эти примеры помогут вам понять, какие преимущества переходных таблиц вы можете использовать при загрузке данных в вашу базу данных.
Слияние и загрузка таблицы
Рассмотрим таблицу "рынка" данных (data mart), которая является комбинацией двух таблиц из систем оперативной обработки транзакций (OLTP). Эта таблица содержит колонки A, B, C, D и E; колонки A, B и C существуют в одной таблице и колонки C, D и E – в другой таблице. Обе входные таблицы можно сделать переходными, а для загрузки общей таблицы в рынок данных можно использовать операцию слияния (рис. 24.22).
Рис. 24.22. Использование переходных таблиц для слияния
Загрузка и разбиение таблицы
Следствием нашего первого примера является сценарий, при котором одна таблица загружается в несколько таблиц рынка данных, что может потребоваться в целях упорядочивания. Эту задачу можно легко выполнить путем копирования данных в переходную таблицу и использования двух запросов для загрузки переходной таблицы в таблицы рынка данных (рис. 24.23).
Рис. 24.23. Использование переходных таблиц для разделения данных
Загрузка уникальных значений в таблицу
Вы можете загружать уникальные значения в таблицу путем массового копирования данных для загрузки в переходную таблицу и последующего использования оператора T-SQL для вставки данных в основную таблицу, только если этих данных еще нет в таблице. Эта возможность полезна в тех случаях, когда вы загружаете данные, которые могут нарушать некоторые деловые правила. Для копирования уникальных значений из переходной таблицы используйте оператор NOT IN, как это показано ниже:
INSERT INTO table ( columnA, columnB ) SELECT columnA, columnB FROM staging_table WHERE columnA NOT IN ( SELECT columnA FROM table )
Этот несколько усложненный оператор SQL просто загружает из переходной таблицы в основную таблицу строки, которые содержат в колонке columnA значение, не совпадающее со значением той же колонки в основной таблице, что позволяет избежать вставки дублированных значений.
Оператор SELECT...INTO
Использование оператора SELECT...INTO на самом деле не является методом загрузки базы данных; это способ создания новых таблиц из существующих таблиц или переходных таблиц. Оператор SELECT...INTO нельзя использовать для заполнения существующей таблицы.
Примечание. Чтобы можно было использовать оператор SELECT...INTO, для параметра базы данных select into/bulkcopy должно быть задано значение TRUE. Чтобы задать этот параметр, используйте следующий оператор T-SQL:
exec sp_dboption <имя_базы_данных>, "select into/bulkcopy", TRUE
Ниже приводится синтаксис оператора SELECT...INTO:
SELECT <список_колонок> INTO <имя_новой_таблицы> <предложение_для_select>
Переменная предложение_для_select указывает операторы, которые обычно уточняют оператор SELECT, такие как FROM и WHERE. Оператор SELECT...INTO легко использовать, как показано в следующем примере:
exec sp_dboption "example", "select into/bulkcopy", TRUE GO SELECT order_id, contact_id, item_id, item_description, amount INTO newsales FROM stage GO exec sp_dboption "example", "select into/bulkcopy", FALSE GO
В данном случае указана база данных "example" и создаваемая таблица newsales. Данные извлекаются из таблицы stage.
Заключение
В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BCP, оператора BULK INSERT и средств DTS. Вы также ознакомились с переходными таблицами, которые удобно использовать при определенных условиях. И вы узнали, как использовать оператор SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.
Лекция 25. Службы компонентов и Microsoft Distributed Transaction Coordinator
В этой лекции вы ознакомитесь с продуктом Microsoft Distributed Transaction Coordinator (MS DTC – координатор распределенных транзакций), позволяющим осуществлять доступ к нескольким источникам данных из одной транзакции базы данных, обеспечивая при этом целостность данных. Как вы увидите в этой лекции, MS DTC используется для многих целей, и услуги, которые он обеспечивает, требуются многим типам приложений.
MS DTC является частью служб компонентов (Component Services) – набора продуктов и технологий, включенного в Microsoft Windows 2000, который разработан на основе нескольких служб Microsoft Windows NT. В частности, службы компонентов основываются на технологиях Component Object Model (COM) и Distributed COM (DCOM), Microsoft Transaction Server, Microsoft Internet Information Server и Microsoft Message Queue Server. В службах компонентов Windows 2000 модели COM и DCOM развились до следующего уровня – COM+. Приложения COM+ и другие системные службы образуют Windows 2000 Component Services.
Прежде чем перейти к подробному описанию MS DTC, в этой лекции дается введение в технологии, используемые в Component Services. Этот обзор даст вам достаточный объем информации, чтобы решить, можете ли вы получить преимущества от использования этих технологий в вашей среде.
Обзор Component Services
Component Services состоит из ряда отдельных продуктов и утилит, управление которыми осуществляется из одной консоли управления. Консоль управления Component Services – это оснастка консоли Microsoft Management Console (MMC). В состав Component Services входят следующие утилиты и продукты:
- Службы приложений COM+
- MS DTC
- Службы Event Viewer
- Системные службы
- Система Microsoft Message Queuing
Для запуска управляющей утилиты Component Services щелкните на кнопке Start, укажите пункт Programs (Программы), укажите пункт Administrative Tools (Администрирование) и затем выберите Component Services. Появится консоль администрирования Component Services (рис. 25.1).
увеличить изображение
Рис. 25.1. . Консоль администрирования Component Services
Службы приложений COM+
Приложения COM+ спроектированы и разработаны в соответствии со спецификацией Microsoft COM+. COM+ является расширением модели COM, способствующей созданию и развертыванию распределенных приложений в рамках предприятия. Усовершенствования, внесенные в COM+, упрощают повышение уровня безопасности и включение компонентов управления очередями в ваши приложения.
Вы можете администрировать и конфигурировать компоненты приложений COM+ из консоли администрирования Component Services. Для доступа к вашим приложениям COM+ раскройте папки Component Services, Computers (Компьютеры), My Computer (Мой компьютер) и затем COM+ Applications (Приложения COM+) (рис. 25.2).
Рис. 25.2. Просмотр приложений COM+ в консоли администрирования Component Services
Как видно из рисунка, здесь показаны приложения COM+, которые были зарегистрированы. Раскрывая эти приложения COM+, вы получаете доступ к компонентам приложения.
MS DTC
Как видно из предыдущего рисунка, под папкой COM+ Applications консоли администрирования Component Services находится папка для DTC (Distributed Transaction Coordinator). MS DTC подробно описывается ниже в этой лекции, поэтому он здесь не рассматривается.
Службы просмотра событий Event Viewer
Службы Event Viewer являются развитием утилиты Event Viewer, входящей в состав Windows NT. Как и утилита Event Viewer для Windows NT, службы Event Viewer в Windows 2000 Component Services позволяют вам осуществлять доступ к журналам событий. Все сообщения об ошибках и информационные сообщения приложений, системы безопасности и операционной системы протоколируются в этих журналах событий. Время от времени вам следует проверять эти журналы. Для просмотра событий раскройте папку Event Viewer (рис. 25.3) и щелкните на имени журнала событий, который вам нужно просмотреть.
увеличить изображение
Рис. 25.3. Раскрытие папки Event Viewer для просмотра событий приложений, системы безопасности и операционной системы
Системные службы
Компонент системных служб в Component Services – это развитие утилиты Services, используемой в составе Windows NT. Этот компонент, как и утилита Services в Windows NT, позволяет вам просматривать и администрировать все службы, сконфигурированные в вашей системе. Для просмотра системных служб раскройте папку Services (рис. 25.4).
увеличить изображение
Рис. 25.4. Раскрытие папки Services для просмотра системных служб
Для запуска или отключения какой-либо службы щелкните правой кнопкой мыши на имени этой службы и выберите нужный пункт из появившегося контекстного меню (рис. 25.5).
Рис. 25.5. Щелкните правой кнопкой мыши на соответствующей службе, чтобы появилось контекстное меню
Для просмотра и изменения свойств какой-либо службы нужно выбрать пункт Properties (Свойства) из меню, показанного в предыдущем примере, или дважды щелкнуть на имени этой службы. В обоих случаях появится окно Properties этой службы (рис. 25.6).
Рис. 25.6. Вкладка General (Общие) окна Properties выбранной службы
Из вкладки General этого окна вы можете изменять тип запуска данной службы (поле Startup type), а также прекращать или приостанавливать (кнопка Stop или Pause) работу службы в зависимости от контекста выполнения. В окнах других вкладок вы можете изменять параметры входа данной службы в Windows 2000 (вкладка Log on). Этот параметр может оказаться очень важным для таких служб, как MS DTC и SQL Server Agent. Вы можете указывать, будут ли они запускаться автоматически, когда происходит запуск системы; вы можете также изменять учетную запись, которую используют SQL Server и MS DTC. Кроме того, вы можете задавать, какие действия будут предприняты в случае отказа соответствующей службы, и можете также просматривать, от каких служб зависит данная служба и какие службы зависят от нее.
Microsoft Message Queuing
Хотя Microsoft Message Queuing (MSMQ) не представлена в консоли управления Component Services, ее можно рассматривать как часть Component Services, поскольку Microsoft Message Queuing использует MS DTC для внешних транзакций. Microsoft Message Queuing позволяет передавать сообщения между различными приложениями и/или различными системами. Message Queuing может передавать транзакционные и нетранзакционные сообщения. Приложения используют Message Queuing для передачи устойчивых сообщений между серверами. Устойчивое сообщение – это сообщение, которое не будет потеряно в случае аварии системы, такой как отказ источника питания. В случае временного отказа питания системы MSMQ восстановит очередь сообщений после возобновления подачи питания. Microsoft Message Queuing использует метод передачи сообщений с промежуточным хранением, при котором сообщения сохраняются в очереди даже при обрыве связи в сети. Кроме того, Message Queuing обладает следующими возможностями:
- Передача сообщений без установления соединения. Чтобы система Message Queuing отправила сообщение, не обязательно устанавливать соединение. Кроме того, сообщения можно маршрутизировать; например можно использовать шлюз между различными сетевыми протоколами.
- Динамическое администрирование очередей. Очереди можно добавлять или модифицировать без необходимости завершения и повторного запуска Message Queuing.
- Задание приоритетов сообщений. Сообщения, отправляемые с помощью Message Queuing, могут иметь различные приоритеты, что позволяет отправлять первыми более важные сообщения.
- Поддержка кластеров.Message Queuing определяет наличие кластеров, поддерживая кластеры с архитектурой типа active/active (активность всех компонентов) и типа active/passive (один активный и несколько пассивных компонентов).
- Интеграция со службами каталогов Active Directory. Это позволяет Message Queuing использовать службу каталогов в Active Directory.
- Взаимодействие с MSMQ 1. Система Message Queuing совместима с MSMQ 1, которая предшествовала Message Queuing.
- Интеграция с системой безопасности Windows 2000. Это позволяет использовать расширенные возможности управления безопасностью в рамках Windows 2000.
- Резервное копирование и восстановление сообщений.Можно выполнять резервное копирование сообщений и восстанавливать их в случае отказа системы.
- Администрирование из оснастки MMC. Как и для многих других управляющих утилит, администрирование теперь осуществляется из оснастки MMC.
Как видите, система Microsoft Message Queuing обладает многими возможностями. Но эта лекция посвящена описанию MS DTC – компоненту транзакционных сообщений системы Microsoft Message Queuing.
Microsoft Distributed Transaction Coordinator (MS DTC)
Как уже говорилось, MS DTC – это составная часть служб компонентов Windows 2000 Component Services. (Последняя версия MS DTC вошла в состав SQL Server 7.) В Component Services также включена технология COM+. COM+ используется при необходимости нетранзакционной передачи сообщений, а MS DTC – при необходимости транзакционной передачи.
MS DTC в основном используется для управления распределенными транзакциями. Распределенной называется транзакция, в которой используются данные из двух или более баз данных. Эти базы данных могут находиться в отдельных компьютерных системах или в одной системе. Транзакции между таблицами одной базы данных не считаются распределенными транзакциями. Транзакции между базами данных одной системы можно инициировать как стандартные (нераспределенные) транзакции; однако SQL Server выполняет их как распределенные транзакции.
Обзор MS DTC
Многим приложениям требуется координация транзакций, использующих несколько источников данных. Координация необходима, когда несколько источников данных включаются в одну транзакцию, поскольку это гарантирует выполнение данной транзакции с поддержкой свойства атомарности. Иными словами, координация обеспечивает успешное завершение всех отдельных транзакций (использующих свои источники данных), которые входят в одну большую транзакцию, либо невыполнение всех этих транзакций. Если одна часть транзакции успешно завершена, а другая не выполнена, это может привести к проблемам несогласованности и потерям данных. Служба MS DTC обеспечивает для вас эту координацию. (Без этой службы разработчикам пришлось бы заботиться об определенных схемах согласования распределенных транзакций в своих приложениях.) MS DTC делает это, выполняя двухфазное фиксирование транзакций.
Двухфазное фиксирование транзакций не является какой-то новой технологией и применяется не только для SQL Server. Технология двухфазного фиксирования транзакций известна уже много лет, но ее надежность и производительность были улучшены. Кроме того, повышена гибкость двухфазного фиксирования транзакций. Например, распределенную транзакцию, использующую двухфазное фиксирование, можно выполнять между базой данных SQL Server и базой данных Oracle. Возможность выполнения такой транзакции определяется тем, что в обеих базах данных поддерживается двухфазное фиксирование транзакций и такие протоколы доступа, как ODBC.
Двухфазное фиксирование – это операция фиксирования, разбитая на две части: первая часть – это фаза подготовки, после которой следует фаза фиксирования. Эти фазы инициируются из приложения командой COMMIT, которая указывает службе MS DTC, что нужно выполнить двухфазное фиксирование транзакций. MS DTC координирует эту операцию с системами, участвующими в этой распределенной транзакции, осуществляя взаимодействие с SQL Server в своей системе и с MS DTC в других системах. Компоненты MS DTC, управляющие двухфазным фиксированием, называются диспетчерами ресурсов (resource managers).
Передавая команду COMMIT, MS DTC указывает диспетчерам ресурсов, что нужно выполнить фазу подготовки операции двухфазного фиксирования. На фазе подготовки выполняются все функции, необходимые для того, чтобы произошло фиксирование, включая очистку буферов и внесение записей в журнал транзакций. Операции, выполняемые на этом этапе, аналогичны операциям, входящим в стандартную операцию фиксирования. Единственным отличием является то, что на фазе подготовки SQL Server не помечает транзакцию как фиксированную и не освобождает ресурсы и блокировки, используемые данной транзакцией. После завершения всех действий, необходимых для подготовки транзакции к фиксированию в источнике данных, диспетчер ресурсов для этого источника данных возвращает сигнал успешного завершения диспетчеру транзакций. После получения сигналов успешного завершения ото всех источников данных можно инициировать фазу фиксирования.
На фазе фиксирования происходит фактическое фиксирование в распределенных системах. Если все диспетчеры ресурсов сигнализируют об успешном завершении фазы фиксирования, в приложение отправляется соответствующее уведомление. Если один из диспетчеров ресурсов сообщает о неуспешном завершении, то остальным диспетчерам ресурсов отправляется уведомление о том, что нужно выполнить операцию отката. Затем сообщение об этом передается в приложение. В случае прерывания связи между системами в какой-то момент истекает время тайм-аута транзакции и тоже инициируется откат. При отказе любой системы, участвующей в распределенной транзакции, все системы, участвующие в этой транзакции, выполняют откат.
Примеры использования MS DTC
В этом разделе мы рассмотрим два примера, которые показывают, насколько важны службы координации MS DTC при использовании распределенных транзакций. Эти примеры показывают, что происходит, когда некоторые транзакции в распределенной транзакции завершаются успешно, а некоторые – неуспешно.
Банковские транзакции
Предположим, вы разрабатываете способ выполнения транзакций компьютерными системами в двух банках для перевода (трансферта) денег между этими банками. Когда клиент запрашивает электронный перевод денег, этими системами должны быть выполнены две основные транзакции: нужно снять деньги со счета 1 в банке A и добавить их на счет 2 в банке B.
Как происходит этот электронный перевод? Если бы оба счета находились в одном банке, этот перевод можно было бы выполнить простым обновлением данных в базе данных одной системы. Но поскольку счета нашего примера находятся в различных банках, этот перевод включает в себя инициирование удаленной транзакции. Транзакция, состоящая из двух транзакций, может быть инициирована любой из двух систем, участвующих в данной транзакции, или третьей системой (клиентской системой).
Эти две транзакции выполняются банковским терминалом, инициирующим программу, которая запускает последовательность SQL-операторов в третьей (клиентской) компьютерной системе. Эти SQL-операторы выполняют следующие операции:
- Обновляют счет 1 в системе A, снимая с него n долларов.
- Фиксируют транзакцию.
- Обновляют счет 2 в системе B, добавляя к нему n долларов.
- Фиксируют транзакцию.
Этот метод действует, пока в любой из систем нет никаких проблем, но это отнюдь не самый надежный способ перевода денег. Что произойдет при сбое в одной из систем во время этих операций? Возможны следующие результаты:
- Не будет выполнена первая транзакция из-за ошибки в системе A или в клиентской системе. Тем самым не будет выполнена вторая транзакция и поэтому никаких денег не будет переведено.
- Первая транзакция выполнится успешно, но не будет выполнена вторая транзакция из-за ошибки в системе B или в клиентской системе. Деньги будут потеряны.
Второй результат явно неприемлем. Вот более подходящий способ выполнения этой транзакции:
- Обновление счета 1 в системе A; с него снимается n долларов.
- Обновление счета 2 в системе B; к нему добавляется n долларов.
- Фиксирование обеих транзакций в одном наборе. Фиксируются либо обе транзакции, либо ни одна из них.
MS DTC позволяет вам выполнять эти операции. Используя службу MS DTC, вы можете указывать, какие распределенные транзакции фиксируются как один набор. Либо фиксируются все эти транзакции, либо для всех них выполняется откат.
Приложение электронной коммерции
Многие приложения электронной коммерции предназначены для управления тысячами онлайновых пользователей и множеством параллельных транзакций. Компании, использующие такие приложения, часто выполняют их в нескольких системах. Одна компьютерная система может не подходить по многим причинам, включая следующие:
- Мощность одной системы недостаточна. Количество транзакций, выполняемых приложением электронной коммерции, может превысить возможности одной системы.
- Деловая логика.Возможно, имеет смысл с точки зрения деловой перспективы выполнять различные функции в различных системах. Например, компании нужно, чтобы информация пользователей была в одной системе, а информация о продукции – в другой системе.
- Используется аутсорсинг (использование услуг сторонних организаций).Функции электронной коммерции иногда выполняются сторонними организациями. Например, одна компания может использовать услуги другой компании для формирования счетов-фактур.
При использовании нескольких систем (или нескольких баз данных одной системы) для доступа к информации в этих системах (или базах данных) используются распределенные транзакции. Если не использовать MS DTC, то возможны ситуации, когда не удается обеспечить свойство атомарности.
Рассмотрим транзакцию в системе электронной коммерции с использованием распределенных транзакций. В этом примере покупатель хочет использовать свою кредитную карточку для приобретения определенного товара – новой миски для собаки – у воображаемой компании под названием Piercetronics. Разобьем эту транзакцию на ее основные компоненты.
- Покупатель устанавливает соединение с Web-сервером компании Piercetronic. На данный момент он, скорее всего, просматривает статические Web-страницы и фактически не подсоединяется к базе данных.
- Просматривая товары, он, в конце концов, находит миску, которую хочет приобрести. Затем он выбирает этот товар, чтобы поместить его в свою покупательскую корзину.
- Чтобы поместить товар в покупательскую корзину, требуется выполнить две операции с базой данных:
- Должен быть выполнен поиск, чтобы определить, какой это покупатель: уже выполнявший покупки (зарегистрированный) или новый покупатель. Если это зарегистрированный покупатель, то считывается идентификатор его счета. (Некоторые приложения делают это в момент покупки.)
- Выбранный товар помещается в таблицу покупательской корзины.
- Когда покупатель указывает, что он готов оплатить покупку, начинается выполнение транзакции или набора транзакций с базой данных для осуществления следующих операций:
- Выполняется чтение таблицы покупательской корзины, чтобы найти товар, который приобретает покупатель.
- В таблицу заказов помещается новая строка, содержащая данный заказ.
- Осуществляется доступ в базу данных покупателей для обновления счета данного покупателя, чтобы выписать счет-фактуру на данный заказ. Поскольку в данном примере информация счетов покупателей хранится в базе данных, отличной от базы данных, содержащей таблицу заказов, то данная транзакция становится распределенной транзакцией.
- Теперь удаляется запись в таблице покупательской корзины. (Однако в некоторых приложениях таблица покупательской корзины очищается позже в составе пакетной операции.)
- После обновления таблицы счетов и таблицы заказов можно фиксировать данную транзакцию. На этом выполнение распределенной транзакции заканчивается.
- В дальнейшем сотрудники склада компании Piercetronic выполнят доступ в базу данных и составят заказ на доставку. В частности, будут выполнены следующие транзакции:
- Выполняется запрос к таблице заказов и считывается данный заказ.
- Соответствующий товар снимается с полки и помещается в коробку для доставки.
- Система компании Piercetronic подсоединяется к процессору кредитных карточек для снятия денег со счета покупателя. Эта транзакция является распределенной транзакцией, поскольку снимаемая сумма записывается также локально. (Некоторые приложения выписывают счет на карточку покупателя, когда он оплачивает сумму, но это не является типичной процедурой, поскольку получение подтверждения по кредитной карточке обычно занимает больше времени, чем можно держать открытой данную транзакцию.)
- В составе распределенной транзакции происходит обновление таблицы заказов, а также обновление базы данных, содержащей информацию счетов, чтобы отразить факт доставки.
- Происходит доставка пакета с покупкой, и собака покупателя получает новую миску.
При отказе любого из этих компонентов во время распределенных транзакций и при отсутствии службы MS DTC в системе компании Piercetronics, с помощью которой выполняется двухфазное фиксирование, возможно возникновение нескольких проблем, включая следующие:
- С кредитной карточки покупателя могут быть сняты деньги, а товар не будет получен.
- Его заказ может быть помещен и доставлен без снятия денег с его кредитной карточки.
- Таблица заказов может быть обновлена, чтобы указать доставку товара, а фактическая доставка не будет выполнена.
Все это показывает, что при выполнении распределенных транзакций необходимо следить за тем, чтобы обновление происходило во всех системах или не происходило ни в одной из систем. Без координации этих транзакций возможна несогласованность баз данных и возникновение ряда проблем.
Свойства MS DTC
Как уже говорилось, служба MS DTC используется в SQL Server для координирования транзакций. Она осуществляет сложные процедуры взаимодействия и проверки ошибок, чтобы обеспечивать нужную последовательность событий. Отсутствие службы MS DTC может осложнить координацию обновлений в системах серверов и обеспечение согласованности баз данных.
Вы можете вызывать MS DTC с помощью одного из следующих методов:
- Вызов удаленной процедуры, которая является распределенной транзакцией.
- Обновление данных в нескольких источниках данных OLE DB.
- Встраивание команд MS DTC в ваше приложение.
При использовании одного из трех методов распределенная транзакция инициируется из SQL Server в той же системе, где инициируется ваша транзакция (рис. 25.7). Экземпляр SQL Server, действующий на сервере, где была инициирована данная транзакция, выполнит все операции, необходимые для вызова службы MS DTC, чтобы управлять распределенной транзакцией, и никакого вмешательства пользователя не потребуется. Все операции будет выполнять за вас SQL Server.
Рис. 25.7. Взаимодействие с MS DTC в распределенной транзакции, инициированной из SQL Server
При использовании третьего метода (встраивание команд MS DTC в ваше приложение) клиентское приложение и сетевой интерфейс SQL Server будут взаимодействовать с MS DTC, а также с SQL Server. Клиент SQL Server будет помогать в координировании распределенной транзакции. Архитектура этой распределенной транзакции показана на рис. 25.8.
Рис. 25.8. Взаимодействие с MS DTC в распределенной транзакции, инициированной встроенными вызовами MS DTC из приложения
Программирование MS DTC
Поскольку эта книга не предназначена для разработчиков, вы не найдете здесь всех деталей, относящихся к инициированию и программированию распределенных транзакций. В этом разделе просто перечислены способы, с помощью которых вы можете инициировать распределенные транзакции, и показано, как проверять работу MS DTC, запуская простую транзакцию.
Вы можете инициировать распределенную транзакцию, выполнив одно из следующих действий:
- Доступ к удаленным источникам данных из обычной транзакции. Сделав это, вы расширяете данную транзакцию до распределенной транзакции. Любой распределенный запрос внутри транзакции расширяет эту транзакцию.
- Явное использование команды BEGIN DISTRIBUTED TRANSACTION. Это явный способ создания распределенной транзакции.
- Использование параметра конфигурирования SQL Server REMOTE_PROC_ TRANSACTIONS.Это приводит к немедленному расширению транзакций до распределенных транзакций при вызове удаленной хранимой процедуры.
- Вызов функций OLE DB или ODBC.В OLE DB и в SQL Server включается синтаксис для инициирования распределенных транзакций.
Вы можете проверять работу MS DTC, инициируя распределенную транзакцию с помощью T-SQL. Распределенная транзакция инициируется с помощью команды T-SQL BEGIN DISTRIBUTED TRANSACTION, и вы фиксируете ее с помощью команды COMMIT, как это показано в следующем примере.
BEGIN DISTRIBUTED TRANSACTION SELECT EmployeeID FROM Northwind.dbo.Employees SELECT emp_id FROM pubs.dbo.employee GO COMMIT GO
Введите только первые четыре строки этой последовательности. Задерживая команду COMMIT и команду завершения GO, вы сможете просмотреть транзакцию в папке Transaction List (Список транзакций) папки Distributed Transaction Coordinator консоли администрирования MMC Component Services. Для просмотра этой папки раскройте папку Component Services, раскройте папку Computers, затем – My Computer и, наконец, раскройте Distributed Transactions Coordinator в консоли администрирования MMC Component Services. После просмотра данной транзакции введите последние две строки этой последовательности команд T-SQL. Отметим, что данная транзакция, теперь уже фиксированная, больше не появится в окне Transaction List. Конечно, большинство распределенных транзакций сложнее данной транзакции и включает обновления и вставки, но этот пример легко выполнить и он не изменяет никаких таблиц базы данных.
Вызов распределенных транзакций обычно происходит из программы с помощью API-вызовов ODBC или DB-LIB, используемых для запуска и завершения каждой транзакции. Распределенные транзакции программируются почти так же, как и другие транзакции, за исключением того, что соединения должны открываться с отключенным параметром автофиксации (Autocommit), чтобы каждый оператор SQL Server не фиксировался автоматически. Служба MS DTC будет управлять двухфазным фиксированием каждый раз, когда соответствующее приложение заканчивает транзакцию с помощью команды COMMIT или ROLLBACK.
Администрирование MS DTC
По умолчанию MS DTC инсталлируется вместе с Windows 2000. Все, что вам нужно сделать, – это активизировать эту технологию. Вы можете запустить MS DTC двумя способами: с помощью диспетчера служб SQL Server Service Manager и с помощью компонента системных служб в Component Services, который был описан выше в этой лекции. Чтобы вызвать утилиту SQL Server Service Manager, щелкните на кнопке Start, укажите Programs, Microsoft SQL Server и затем выберите Service Manager (рис. 25.9).
Рис. 25.9. Использование SQL Server Service Manager для запуска MS DTC
Если Distributed Transaction Coordinator не представлен в поле Services (Службы), выберите его из раскрывающегося списка. Для запуска этой службы щелкните на кнопке Start/Continue (Запуск/Продолжить) и для прекращения работы службы щелкните на кнопке Stop. Вам следует также установить флажок, который указывает запуск MS DTC при запуске операционной системы.
Мониторинг MS DTC
Чтобы следить за работой MS DTC, вы должны использовать консоль администрирования Component Services. Запустите эту консоль (как это описано выше в данной лекции) и раскройте Component Services, Computers, My Computer и Distributed Transaction Coordinator (рис. 25.10).
увеличить изображение
Рис. 25.10. Папка Distributed Transaction Coordinator в консоли администрирования Component Services
Вы увидите две опции в этой папке: Transaction List (Список транзакций) и Transaction Statistics (Статистика транзакций).
Transaction List
В представлении Transaction List (рис. 25.11), можно увидеть список распределенных транзакций, которые выполняются в данный момент в вашей системе. Вы можете просматривать свойства транзакции и можете реально воздействовать на транзакцию, вызывая ее фиксирование или прекращение. Для этого нужно щелкнуть правой кнопкой мыши на соответствующей транзакции и выбрать нужный пункт из появившегося контекстного меню.
увеличить изображение
Рис. 25.11. Представление Transaction List со списком транзакций MS DTC
Transaction Statistics
Представление Transaction Statistics (рис. 25.12), позволяет вам просматривать информацию о распределенных транзакциях, такую как количество выполняемых в данный момент транзакций и максимальное количество активных транзакций. Эта информация позволяет вам оценивать работу распределенных транзакций, происходящую в вашей системе. Это также полезно для планирования будущей мощности системы.
Рис. 25.12. Представление Transaction Statistics, где показаны транзакции MS DTC
Как видите, мониторинг распределенных транзакций выполнять нетрудно. И, как вы видели выше в этой лекции, создание и выполнение распределенных транзакций тоже не представляет особых сложностей.
Заключение
В этой лекции вы ознакомились с работой службы MS DTC и созданием распределенных транзакций. Представлен также обзор продуктов и технологий Component Services, поставляемых вместе с Windows 2000. Кроме того, вы узнали, как администрировать компоненты Component Services. В следующих нескольких лекциях вы узнаете о репликации в SQL Server.
Лекция 26. Репликация в Microsoft SQL Server: обзор типов репликации и репликация моментальных снимков
Технология репликации баз данных Microsoft SQL Server предназначена для того, чтобы помочь вам в распространении данных и хранимых процедур по серверам вашей компании. Репликация позволяет вам конфигурировать системы для автоматического копирования данных в другие системы. Используя репликацию баз данных, вы можете копировать столько данных, сколько вам нужно и можете размещать данные в любом количестве систем. Поскольку процесс репликации выполняется автоматически и поскольку во время репликации в базе данных сохраняется информация о состоянии репликации и реплицированных данных, то не существует никакой опасности потери данных. Если процедура репликации прервана (например, из-за отказа источника питания), то она возобновится с точки отказа, как только системы снова будут работать в обычном режиме.
Репликация – это сложный процесс, поэтому в данной книге для описания репликации выделены три лекции. В этой лекции вы ознакомитесь с основами репликации, а также узнаете о репликации моментальных снимков. В лекции 27 вы узнаете о репликации транзакций и в лекции 28 – о репликации слиянием. В этих трех лекциях содержится информация, необходимая для глубокого понимания репликации SQL Server, включая сведения о конфигурировании, администрировании и использовании технологии репликации.
Что такое репликация базы данных?
Репликация базы данных – это процесс копирования (реплицирования) данных из одной таблицы или базы данных в другую таблицу или базу данных. Используя эту технологию, вы можете распространять копии всей базы данных в несколько систем вашей компании или распространять выбранные части базы данных. При использовании технологии репликации SQL Server происходит автоматизация задачи копирования и распространения данных. После задания параметров и конфигурирования репликации никакого вмешательства пользователя уже не требуется. Поскольку репликация и обработка данных выполняется из базы данных SQL Server, это обеспечивает более высокий уровень стабильности и восстанавливаемости. Если во время репликации происходит сбой (или выполняется другая транзакция SQL Server), то после устранения соответствующей проблемы операции возобновляются с точки, где произошел сбой. В связи с этим многие люди предпочитают репликацию другим методам перемещения данных между системами.
Имеется много возможностей для конфигурирования репликации в вашей сети. Например, вы можете указывать, сколько данных будет реплицироваться. Вы можете задавать допустимый тип доступа к реплицированным копиям – только по чтению или с разрешением модифицирования. И вы можете задавать, насколько часто должны реплицироваться данные. Мы рассмотрим эти и другие парамерБ¤ZQV рБ¤ZQV АИџZQV 0:ўZQV XВ¤ZQV В¤ZQV @ В¤ZQV х двух лекций.
Понятия репликации
В этом разделе вы узнаете о базовых понятиях репликации баз данных. Мы рассмотрим такие понятия, как метафора "опубликовать-и-подписаться" (publish-and-subscribe), три типа репликации, данные репликации, распространение данных и агенты репликации.
Компоненты репликации
Репликация в Microsoft SQL Server 2000 основывается на метафоре "опубликовать-и-подписаться", впервые использованной для репликации в SQL Server 6. Эта метафора базируется на трех основных понятиях: издатели, дистрибьюторы и подписчики. Издатель – это система базы данных, которая предоставляет данные для репликации. Дистрибьютор (распространитель) – это система базы данных, которая содержит дистрибутивную базу данных (или псевдоданные), используемую для поддержки и управления репликацией. Подписчик – это система базы данных, которая получает реплицированные данные и сохраняет их в реплицированной базе данных.
Издатели
Издатель – система Microsoft Windows 2000, содержащая базу данных SQL Server. Эта база данных содержит данные, которые должны реплицироваться в другие системы. Кроме того, база данных SQL Server следит за тем, какие данные изменились, чтобы их можно было эффективно реплицировать. Издатель также поддерживает информацию о том, какие данные сконфигурированы для репликации. В зависимости от выбранного типа репликации издатель выполняет больший или меньший объем работы во время процесса репликации. Это описывается более подробно далее.
Среда репликации может содержать несколько подписчиков, но любой заданный набор данных, сконфигурированных для репликации (этот набор называется статьей), может иметь только одного издателя. (Статьи описываются более подробно в разделе "Данные репликации" ниже в этой лекции.) То, что для определенного набора данных имеется только один издатель, не означает, что этот издатель является единственным компонентом, который может модифицировать данные: подписчик тоже может модифицировать и даже повторно публиковать данные. Однако это может потребовать некоторых усилий, как вы увидите из этой лекции и следующих двух лекций.
Дистрибьюторы
Серверы, действующие как дистрибьюторы, кроме дистрибутивной базы данных хранят также метаданные, данные журнала (истории) репликации и другую информацию. Во многих случаях дистрибьютор также управляет распространением данных репликации подписчикам. Издатель и дистрибьютор не обязательно должны быть на одном сервере. На самом деле вы, скорее всего, будете использовать для дистрибьютора выделенный сервер. Для каждого издателя при его создании должен быть задан дистрибьютор, и каждый издатель может иметь только одного дистрибьютора. (Более подробно см. в разделе "Конфигурирование публикования и распространения" далее.)
Подписчики
Как уже говорилось, подписчики – это серверы баз данных, которые хранят реплицированные данные и получают информацию об изменениях. Подписчики также могут вносить изменения и являться издателями для других систем. Чтобы подписчик получал реплицированные данные, он должен подписаться на эти данные. Подписка на репликацию подразумевает конфигурирование подписчика для получения этих данных. Подписка – это информация базы данных, на которую вы подписываетесь. (Более подробно о связях между этими компонентами см. в разделе "Конфигурирование репликации моментальных снимков" далее.)
Типы репликации
В SQL Server используется три типа репликации: репликация моментальных снимков, репликация транзакций и репликация слиянием. Эти типы репликации поддерживают различные уровни согласованности данных в реплицированной базе данных, и они налагают различные уровни нагрузки на серверы.
Репликация моментальных снимков
Репликация моментальных снимков (или просто репликация снимков) – это наиболее простой тип репликации. При использовании репликации снимков периодически создается снимок (картина) базы данных, который распространяется подписчикам. Главным преимуществом репликации снимков является то, что она не налагает непрерывной нагрузки на издателей и подписчиков. Это означает, что она не требует, чтобы издатели непрерывно следили за изменениями данных, а также не требует непрерывной передачи данных подписчикам. Главным недостатком является то, что база данных у подписчика соответствует только последнему снимку базы данных издателя.
Во многих случаях, как вы увидите позже в этой лекции, репликация снимков является вполне достаточной, например, когда источник данных модифицируется лишь время от времени. С такой информацией, как списки телефонов, списки цен и описание товаров, можно вполне справляться с помощью репликации снимков. Эти списки можно обновлять раз в день в нерабочее время.
Репликация транзакций
Репликацию транзакций можно использовать для репликации изменений, вносимых в базу данных. При использовании репликации транзакций любые изменения, вносимые в статьи (наборы данных, сконфигурированные для репликации) немедленно считываются из журнала транзакций и распространяются дистрибьюторам. Используя репликацию транзакций, вы можете поддерживать издателя и его подписчиков почти всегда в одинаковом состоянии (в зависимости от того, как вы сконфигурировали репликацию).
Репликацию транзакций следует использовать в тех случаях, когда важно поддерживать все реплицируемые системы на уровне текущих изменений. Репликация транзакций накладывает на систему более высокую нагрузку, чем репликация снимков, поскольку она по отдельности передает в реплицируемые системы каждую транзакцию, которая вносит изменения в систему. Однако репликация транзакций поддерживает системы в более согласованном состоянии, чем репликация снимков и репликация слиянием. (О репликации транзакций см. лекцию 27.)
Репликация слиянием
Репликация слиянием выполняется аналогично репликации транзакций в том смысле, что она следит за всеми изменениями, которые вносятся в статьи. Но вместо отдельного распространения транзакций, которые вносят изменения, репликация слиянием периодически передает пакет изменений. И поскольку при репликации слиянием данные передаются пакетами, она похожа на репликацию снимков. (Хотя в случае репликации снимков распространяются все данные, сконфигурированные для репликации, а не только изменения.) (О репликация слиянием см. лекцию 28.)
Данные репликации
Вы группируете данные, подлежащие репликации, в виде объекта, который называется публикацией. Публикация состоит из одной или нескольких статей. Рассмотрим более подробно статьи и публикации.
Статьи
Как уже говорилось, статья – это отдельный набор данных, который подлежит репликации. Статья может быть целой таблицей, подмножеством таблицы, состоящим из определенных колонок или строк, или хранимой процедурой. Вы создаете эти подмножества с помощью фильтров. Фильтр, используемый для создания подмножества, состоящего из строк, называется горизонтальным фильтром. Фильтр, используемый для создания подмножества, состоящего из колонок, называется вертикальным фильтром. Более подробное описание горизонтальных и вертикальных фильтров приводится ниже в этой лекции.
Публикации
Публикация – это набор статей, сгруппированных в виде одного блока. Публикации позволяют реплицировать логическую группировку статей в виде одного объекта репликации. Например, вы можете создать публикацию, которая будет использоваться для репликации базы данных, состоящей из нескольких таблиц, каждая из которых определена как статья. Репликация базы данных в целом как одной публикации является более эффективной операцией, чем репликация таблиц по отдельности.
Публикация может состоять из одной статьи, но она почти всегда состоит из нескольких статей. Однако подписчик может подписываться только на публикации, но не статьи. Поэтому для подписки на одну статью вы должны сконфигурировать публикацию, содержащую только эту статью, и затем подписаться на эту публикацию.
Push-подписка и pull-подписка
Реплицируемые данные можно распространять целым рядом способов. Все методы распространения базируются либо на push-подписке (принудительная подписка), либо на pull-подписке (подписка по запросу). Подписчик может одновременно использовать сочетание push- и pull-подписок.
Push-подписка (принудительная)
Если вы задаете push-подписку, доставка изменений подписчикам обеспечивается дистрибьютором. Изменения инициируются без какого-либо запроса от подписчика. Push-подписку полезно использовать в тех случаях, когда желательно централизованное администрирование, поскольку в этом случае управление и администрирование репликации осуществляется дистрибьютором, а не несколькими подписчиками. Иными словами, инициирование и плановые задачи репликации осуществляются на дистрибьюторе.
Использование push-подписки дает вам высокий уровень гибкости в планировании графика репликаций. Push-подписки можно конфигурировать таким образом, чтобы распространять изменения сразу после их реализации или выполнять модификации на основе какого-либо регулярного расписания. Более подробная информация по этим возможностям приводится в разделе "Конфигурирование репликации моментальных снимков" ниже в этой лекции.
Pull-подписка (по запросу)
Pull-подписка позволяет подписчиками инициировать репликацию. Репликация может инициироваться в виде запланированной задачи или вручную. Pull-подписку полезно использовать, если у вас большое число подписчиков и если эти подписчики не всегда подсоединены к сети. Поскольку pull-подписка инициируется подписчиками, то подписчики, не всегда подсоединенные к сети, могут периодически подсоединяться и запрашивать данные репликации. Это может оказаться полезным для снижения количества ошибок, возникающих на сервере дистрибьютора. Если дистрибьютор пытается инициировать репликацию подписчику, которые не отвечает, это приводит к сообщению об ошибке. Но если репликация инициируется подписчиком, только когда он подсоединен, никаких ошибок не возникает.
Агенты репликации
Для выполнения операций, необходимых для перемещения реплицируемых данных от издателя к дистрибьютору и затем подписчику, используются несколько агентов: Snapshot Agent, Log Reader Agent, Distribution Agent и Merge Agent. В этом разделе вы узнаете, что делают эти агенты и как управлять ими.
Snapshot Agent (Агент создания снимков состояния)
Агент Snapshot Agent используется для создания и распространения снимков мгновенного состояния от издателя дистрибьютору (или в местоположение снимка). Snapshot Agent создает данные репликации (снимок), а также создает информацию (метаданные), которая используется агентом Distribution Agent для распространения этих данных. Snapshot Agent сохраняет снимок на дистрибьюторе (или в указанном вами месте). Snapshot Agent также обеспечивает поддержку информации о состоянии синхронизации объектов репликации; эта информация хранится в дистрибутивной базе данных.
Snapshot Agent большую часть времени находится в неактивном состоянии и может периодически активизироваться в соответствии с заданным вами расписанием для выполнения своих задач. При каждом запуске Snapshot Agent выполняет следующие задачи.
- Snapshot Agent устанавливает соединение от дистрибьютора к издателю. Если соединение недоступно, то Snapshot Agent не продолжает создание снимка. После установления соединения Snapshot Agent блокирует все статьи, участвующие в репликации, чтобы обеспечить согласованность данных в снимке. (По этой причине не стоит планировать репликацию снимков на периоды пиковой нагрузки.)
- Snapshot Agent устанавливает соединение от издателя к дистрибьютору. После установления этого соединения Snapshot Agent формирует копию схемы для каждой статьи и сохраняет эту информацию в дистрибутивной базе данных. Эти данные трактуются как метаданные.
- Snapshot Agent получает снимок реальных данных издателя и записывает их в файл в местоположении для снимка. Местоположением снимка не обязательно является дистрибьютор. Если в репликации участвуют только системы, относящиеся к SQL Server, то файл сохраняется как собственная программа массового копирования. (Массовое копирование описывается в лекции 24.) Если в репликации участвуют системы различных типов, то данные сохраняются в текстовых файлах. На данном этапе информация для синхронизации указывается агентом Snapshot Agent.
- После копирования данных Snapshot Agent обновляет информацию в дистрибутивной базе данных.
- Snapshot Agent освобождает блокировки, которые он захватывал по статьям и протоколирует снимок в файле журнала (истории).
Как видите, Snapshot Agent обеспечивает только создание снимка; он не распространяет его подписчикам. Эту задачу выполняют другие агенты.
При использовании репликации снимков и изменении данных издателя снимок следует часто обновлять. Поскольку снимок регулярно копируется для подписчиков, он должен соответствовать текущему состоянию данных.
Log Reader Agent (Агент чтения журнала)
Агент Log Reader Agent используется в репликации транзакций для извлечения информации об изменениях из журнала транзакций на издателе для репликации этих команд в дистрибутивную базу данных. Каждая база данных, использующая репликацию транзакций, имеет собственного агента Log Reader Agent на издателе. (О Log Reader Agent см. лекцию 27.)
Distribution Agent (Агент распространения)
Агент Distribution Agent распространяет снимки и транзакции из дистрибутивной базы данных подписчикам. Каждая публикация имеет собственного агента Distribution Agent. Если вы используете push-подписку, то Distribution Agent выполняется на дистрибьюторе. Если вы используете pull-подписку, то Distribution Agent выполняется на подписчике.
Merge Agent (Агент слияния)
Агент Merge Agent используется в репликации слиянием для согласования (слияния) накопившихся изменений, выполненных с момента последнего согласования. Если вы используете репликацию слиянием, то агенты Distribution Agent и Snapshot Agent не используются: взаимодействие с издателем и дистрибьютором осуществляет Merge Agent. (О Merge Agent см. лекцию 28.)
Queue Reader Agent (Агент очередей)
Агент Queue Reader Agent используется для распространения выполненных изменений подписчикам репликации снимков или репликации транзакций, которые были сконфигурированы с опцией отложенных обновлений (Queued updating). Эта опция позволяет вносить изменения на подписчике без необходимости использования какой-либо распределенной транзакции.
Мониторинг работы агентов
Вы можете следить за любым из агентов с помощью Enterprise Manager. Для этого выполните следующие шаги.
- В окне Enterprise Manager раскройте группу серверов и затем раскройте папку для сервера, используемого как дистрибьютор.
- Раскройте папку Replication Monitor и затем раскройте папку Agents (Агенты).
- Раскройте тип агента, за работой которого вы хотите следить.
- В правой панели щелкните правой кнопкой мыши на агенте, за которым вы хотите следить, и выберите из появившегося контекстного меню пункт Agent History (Журнал работы агента) для просмотра журнала операций данного агента.
Конфигурирование публикования и распространения
Теперь, когда вы ознакомились с базовыми понятиями репликации, мы рассмотрим, как выполняется первый шаг конфигурирования репликации в SQL Server: задание параметров публикования и распространения. Для выполнения этой задачи используется мастер конфигурирования публикования и распространения Configure Publishing And Distribution Wizard. (Хотя репликацию SQL Server можно полностью сконфигурировать с помощью хранимых процедур, предпочтительным методом является использование мастеров конфигурирования репликации.) Ниже приводится список других мастеров, используемых в процессе конфигурирования репликации (доступ ко всем этим мастерам осуществляется через Enterprise Manager).
- Create Publication Wizard (Создание публикации).
- Create Pull Subscription Wizard (Создание pull-подписки).
- Create Push Subscription Wizard (Создание push-подписки).
- Disable Publishing And Distribution Wizard (Отключение публикования и распространения).
Процедуры, описанные в этом разделе, используются для задания параметров публикования и распространения независимо от типа репликации, который вы хотите реализовать. После конфигурирования публикования и распространения вы конфигурируете тип репликации. Инструкции по заданию определенных типов репликации приводятся ниже в этой лекции и в следующих двух лекциях. Для конфигурирования публикации и распространения выполните следующие шаги.
- В окне Enterprise Manager щелкните на сервере, который хотите конфигурировать как дистрибьютор. Выберите из меню Tools пункт Wizards (Мастера). В появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Replication (Репликация) и затем выберите мастер Configure Publishing and Distribution Wizard (рис. 26.1). Щелкните на кнопке OK.
Рис. 26.1. Диалоговое окно Select Wizard (Выбор мастера) - Появится начальное окно мастера Configure Publishing and Distribution Wizard (рис. 26.2).
Рис. 26.2. Начальное окно мастера Configure Publishing and Distribution Wizard - Щелкните на кнопке Next, чтобы появилось окно Select Distributor (Выбор дистрибьютора) (рис. 26.3).
- В этом окне вы можете сделать сервер, выбранный на шаге 1, как дистрибьютором, так и издателем, или сконфигурировать только публикование и использовать уже сконфигурированный дистрибьютор. Если вы хотите использовать в качестве дистрибьютора последнюю выбранную систему, щелкните на первой кнопке выбора. После этого мастер создаст для вас дистрибутивную базу данных и журнал. Если вы хотите использовать для дистрибьютора другую систему SQL Server, щелкните на второй кнопке выбора. Если нет никаких других систем, сконфигурированных как дистрибьюторы, то будет доступна только первая кнопка выбора. Скорее всего, вы захотите выделить для дистрибьютора отдельную систему.
Рис. 26.3. Окно Select Distributor (Выбор дистрибьютoра)Примечание. Для одного издателя можно определить только одного дистрибьютора. Для всех публикаций должен использоваться один и тот же дистрибьютор. - Если вы решили использовать в качестве дистрибьютора другую систему, то вы должны зарегистрировать эту систему SQL Server и она уже должна быть сконфигурирована как дистрибьютор. Щелкните на кнопке Add Server (Добавить сервер) в окне Registered SQL Server Properties (Свойства зарегистрированного SQL Server), выберите метод аутентификации для установления соединения с системой SQL Server на данном дистрибьюторе.
- В целях нашего примера сделайте дистрибьютором систему, которую вы конфигурируете. В конце концов, в этом разделе описывается, как конфигурировать дистрибьютор.
- На этом шаге мастер проверяет, что издатель имеет доступ к дистрибьютору. Если учетная запись, которую использует SQL Server, не дает доступа, то будет вызвано окно SQL Server Agent Properties (Свойства агента SQL Server), чтобы вы могли модифицировать учетную запись подключения (login-запись) этого агента (рис. 26.4).Примечание. Если в процессе инсталляции вы сконфигурировали для SQL Server использование учетной записи LocalSystem, то появится предупреждение, что учетная запись LocalSystem имеет полномочия доступа только в локальной системе. Если в процессе инсталляции вы сконфигурировали SQL Server для использования учетной записи на уровне домена, то вы не получите этого предупреждения и вам не нужен будет доступ к окну SQL Server Agent Properties.
Рис. 26.4. Окно SQL Server Agent Properties (Свойства агента SQL Server) - В этом окне вы можете модифицировать и другие свойства агента SQL Server Agent. (Более подробную информацию см. в лекции 31.) По окончании модифицирования SQL Server Agent щелкните на кнопке OK.
- Появится окно Configure SQL Server Agent (Конфигурирование SQL Server Agent) (рис. 26.5). В этом окне запрашивается, чтобы вы сконфигурировали SQL Server Agent для автоматического запуска. Репликация выполняется под управлением SQL Server Agent, и если этот агент не работает, то ничего не будет реплицироваться. Щелкните на первой кнопке выбора для автоматического запуска SQL Server Agent (рекомендуемый вариант) или на второй кнопке выбора для запуска вручную. Для продолжения щелкните на кнопке Next.
Рис. 26.5. Окно Configure SQL Server Agent (Конфигурирование SQL Server Agent) - Появится окно Specify Snaphot Folder (Задание папки для снимка) (рис. 26.6). В этом окне вы можете задать местоположение для снимка. Это директория, где находятся снимки. Выберите новое местоположение или оставьте местоположение по умолчанию. Для продолжения щелкните на кнопке Next.
Рис. 26.6. Окно Specify Snaphot Folder (Задание папки для снимка) - Появится окно Customize the Configuration (Настройка конфигурации) (рис. 26.7).
Рис. 26.7. Окно Customize the Configuration (Настройка конфигурации) - В этом окне вы можете оставить без изменения принятые по умолчанию параметры для дистрибутивной базы данных (вторая кнопка выбора) или выбрать настройку дистрибутивной базы данных (первая кнопка выбора). Если вас устраивают параметры по умолчанию, то процесс завершен и вы переходите к последнему окну. Для данного примера щелкните на первой кнопке выбора.Примечание. Принятое по умолчанию местоположение файлов данных SQL Server может находиться на диске с недостаточной производительностью и емкостью. На следующем шаге вы увидите, как переместить дистрибутивную базу данных на диск с достаточной мощностью и производительностью ввода-вывода.
- Щелкните на кнопке Next, чтобы появилось окно Provide Distribution Database Information (Задание информации о дистрибутивной базе данных) (рис. 26.8). Здесь вы можете указать имя этой базы данных и местоположения для файлов дистрибутивной базы данных и журналов. Вы должны сделать это, если размер дистрибутивной базы данных превысит пространство, доступное в местоположении по умолчанию.
Рис. 26.8. Окно Provide Distribution Database Information (Задание информации о дистрибутивной базе данных) - Щелкните на кнопке Next, чтобы появилось окно Enable Publishers (Активизация издателей) (рис. 26.9). В этом окне вы можете выбрать использование издателя, отличного от сервера, выбранного на шаге 1, или добавить издателей. (Чтобы установить соединение с SQL Server на другом издателе, щелкните на кнопке New.)
- Щелкните на кнопке Next, чтобы появилось окно Enable Publication Databases (Активизация баз данных для публикации) (рис. 26.10). Здесь вы можете активизировать репликацию транзакций или репликацию слиянием для определенных баз данных. По умолчанию на издателе не активизируется ни одной базы данных. Если пропустить этот шаг, то вы создадите издателя и дистрибьютора, но не определите никаких публикаций. Вы можете определить публикации позже с помощью мастера Create Publication Wizard, что является предпочтительным методом.
- Щелкните на кнопке Next, чтобы появилось окно Enable Subscribers (Активизация подписчиков) (рис. 26.11). В этом окне вы можете выбрать подписчика для выбранного вами издателя. Однако предпочтительнее сделать это отдельно с помощью мастера Configure Publishing and Distribution Wizard.
Рис. 26.9. Окно Enable Publishers (Активизация издателей)
Рис. 26.10. Окно Enable Publication Databases (Активизация баз данных для публикации)
Рис. 26.11. Окно Enable Subscribers (Активизация подписчиков) - Щелкните на кнопке Next, чтобы появилось окно мастера Completing the Configure Publishing and Distribution Wizard (Завершение конфигурирования публикования и распространения) (рис. 26.12). В этом окне показана сводка ваших параметров. Щелкните на кнопке Finish (готово), чтобы применить созданную вами конфигурацию. Это может занять несколько минут. По завершении этого процесса вы увидите несколько информационных окон, где будет описано выполнение процесса, а также указано, нужно ли вам сконфигурировать SQL Server Agent для автоматического запуска. Для выполнения агентов репликации должен быть запущен агент SQL Server Agent. Отметим, что по окончании работы этого мастера в окне Enterprise Manager появится папка Replication Monitor.
Рис. 26.12. Окно Completing the Configure Publishing and Distribution Wizard (Завершение конфигурирования публикования и распространения)Примечание. Если вы хотите изменить конфигурацию реплицируемой базы данных, щелкните на имени этой базы данных в окне Enterprise Manager и укажите в меню Tools пункт Replication, чтобы появилось подменю, содержащее пункты для управления вашей конфигурацией.
Репликация моментальных снимков
В этом разделе приводится подробная информация о репликации снимков. Сначала вы узнаете, когда следует использовать репликацию снимков. Затем вы узнаете, как конфигурировать этот тип репликации.
Применение репликации снимков
Репликация снимков очень полезна в определенных ситуациях, когда достаточно использовать статические данные. Как вы уже знаете, при репликации снимков создается снимок мгновенного состояния данных, и этот снимок копируется подписчикам. Эти данные не обновляются, пока не будет применен следующий снимок. Если вы используете репликацию снимков, то вам не следует модифицировать данные на подписчике, поскольку они будут перезаписаны, когда будет применен следующий снимок.
К типам приложений, которым может помочь применение репликации снимков, можно отнести:
- Списки цен, которые распространяются на удаленные хранилища. Обычно вполне достаточно обновлять цены один раз в сутки.
- Поисковые таблицы, которые не требуют частого обновления.Поисковые таблицы обычно имеют относительно статичные данные.
Другие приложения также могут использовать репликацию снимков. Однако при необходимости частой репликации данных более полезны репликация транзакций и репликация слиянием.
Конфигурирование репликации моментальных снимков
Как уже говорилось, прежде чем конфигурировать любой тип репликации, вы должны задать параметры публикования и распространения, что уже описано выше в этой лекции. Чтобы задать репликацию снимков, вам нужно сначала сконфигурировать публикацию и затем сконфигурировать подписчиков.
Конфигурирование публикаций
Конфигурирование публикации позволяет вам указывать, какие данные будут реплицироваться, как они будут реплицироваться и когда будет происходить репликация. Для конфигурирования публикации выполните следующие шаги.
- В окне Enterprise Manager откройте меню Tools. Далее укажите пункт Replication (Репликация) и затем выберите команду Create and Manage Publications (Создание и управление публикациями) или выберите пункт Wizards, раскройте в появившемся диалоговом окне Select Wizard папку Replication и выберите Create Publication Wizard. В обоих случаях появится диалоговое окно Create and Manage Publications (рис. 26.13). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.
Рис. 26.13. Диалоговое окно Create and Manage Publications (Создание и управление публикациями) Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:- Push New Subscription (Новая push-подписка).Позволяет вам создать новую push-подписку для уже существующей публикации. Этот процесс описан в разделе "Конфигурирование подписок" ниже в этой лекции.
- Properties and Subscriptions (Свойства и подписки). Позволяет вам модифицировать свойства как публикаций, так и подписок.
- Script Publication (Сценарий создания публикации).Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
- Delete Publication (Удалить публикацию).Позволяет вам удалить уже сконфигурированную публикацию.
- Выберите базу данных, которую хотите использовать для данной публикации (на рис. 26.13 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера создания публикаций Create Publication Wizard. Появится начальное окно мастера Create Publication Wizard (рис. 26.14).
Рис. 26.14. Начальное окно мастера Create Publication Wizard (Создание публикаций) - Обратите внимание на флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере) внизу этого окна. В данном примере мы не будем устанавливать этот флажок. Если установить этот флажок, то мастер предложит вам варианты создания подписок с немедленными обновлениями (immediate updating) и отложенными обновлениями (queued updating). Этот дополнительный выбор позволяет подписчикам обновлять данную публикацию так же, как и издателю. Кроме того, мастер предложит вам возможность преобразования данных в подписках.
Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 26.15). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. Будет выделена база данных, выбранная вами на шаге 2.
- Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 26.16).
Рис. 26.15. Окно Choose Publication Database (Выбор базы данных для публикаций)
Рис. 26.16. Окно Select Publication Type (Выбор типа публикаций) В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:- Snapshot publication (Публикация для репликации снимков). Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
- Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
- Merge publication (Публикация для репликации слиянием). Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
- Щелкните на кнопке выбора Snapshot Publication и щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 26.17). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. На рис. 26.17 показана установка по умолчанию, которая указывает, что все подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить третий флажок, который указывает, что данные репликации будут преобразовываться с символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.
Рис. 26.17. Окно Specify Subscriber Types (Указание типов подписчиков)
- Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 26.18). В этом окне вы можете указывать таблицы и другие объекты, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. В левом списке этого окна вы можете установить один или несколько флажков колонки Show (Показать), чтобы вывести в правом списке список объектов, который может включать таблицы, хранимые процедуры и представления. Затем, устанавливая флажки в правом списке, вы можете по отдельности задать любое количество таблиц, хранимых процедур и представлений для публикации. Или вы можете просто установить один или несколько флажков в колонке Publish All (Публиковать все) левого списка для выбора всех элементов объектов соответствующего типа в текущей базе данных для публикации. Напомним, что каждая таблица, хранимая процедура или представление рассматриваются как статья, а публикация – это набор логически сгруппированных статей.
Кроме того, обратите внимание на кнопку Article Defaults (Установки по умолчанию для статей) этого окна. Эта кнопка позволяет вам задавать параметры по умолчанию для различных статей вашей системы. При щелчке на этой кнопке у вас будет запрошен выбор типа статьи. Щелкните на Table Articles (Статья-таблица) и щелкните на кнопке OK. Появится окно Default Table Article Properties (Свойства по умолчанию статьи-таблицы) (рис. 26.19). Во вкладке General (Общие) вы можете задавать такие параметры, как:
- имя статьи (поле Name);
- описание статьи (Description);
- имя таблицы-получателя данной статьи (Destination table name);
- владельца таблицы-получателя данной статьи (Destination table owner).
Рис. 26.18. Окно Specify Articles (Указание статей)
Рис. 26.19. Вкладка General окна Default Table Article Properties (Свойства по умолчанию статьи-таблицы) Во вкладке Snapshot (Снимок) (рис. 26.20), вы можете задавать следующее:
Рис. 26.20. Вкладка Snapshot (Снимок) окна Default Table Article Properties - отсекать любые существующие данные и задавать, как обрабатываются индексы;
- задавать, копируются ли кластеризованные и некластеризованные индексы;
- задавать, преобразуются ли определяемые пользователем типы данных в базовые типы данных;
- задавать, реплицируются ли ограничения.
- Когда вы будете готовы выйти из окна Specify Articles, щелкните на кнопке Next. Будет выполнен анализ публикации. Если вы публикуете базу данных Northwind, как в данном примере, то появится окно сообщения (рис. 26.21). Оно информирует вас, что вы пытаетесь реплицировать колонку типа IDENTITY и что свойство IDENTITY публикуемой колонки не будет передаваться в соответствующую колонку таблицы подписчика.
Рис. 26.21. Окно сообщения, которое появляется, если вы пытаетесь реплицировать колонку типа IDENTITY - После завершения анализа данной публикации (и после щелчка на кнопке OK для возврата в окно мастера, если появилось окно информационного сообщения) появится окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 26.22). В этом окне вы просто указываете имя и описание публикации. Вы можете также установить флажок List this publication in Active Directory (Включить эту публикацию в список Active Directory).
Рис. 26.22. Окно Select Publication Name and Description (Выбор имени и описания публикации) - Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 26.23). В этом окне вы указываете, будете ли определять фильтры данных (щелчком на кнопке выбора Yes) или будете использовать принятые по умолчанию параметры конфигурации (щелчком на кнопке выбора No). Щелкнув на кнопке выбора No и щелкнув затем на кнопке Next, вы переходите в окно Completing the Create Publication Wizard (Завершение работы мастера создания публикации) (рис. 26.31). В данном примере мы щелкнем на кнопке выбора Yes, чтобы увидеть оставшиеся окна и задать дополнительные параметры.
- Щелкните на кнопке Next, чтобы появилось окно Filter Data (Фильтрация данных) (рис. 26.24). В этом окне вы указываете, хотите ли вы фильтровать данные по вертикали (фильтрация колонок) или по горизонтали (фильтрация строк). В данном примере мы выберем и вертикальную, и горизонтальную фильтрацию.Примечание.Фильтрация используется для одних и тех целей в случае репликации снимков или репликации транзакций. Однако способ выполнения фильтрации зависит от типа используемой репликации. В следующей лекции приводится дополнительная информация о влиянии фильтрации на репликацию транзакций. В случае репликации снимков фильтрацию выполняет предложение WHERE, используемое для создания снимка. (На шаге 13 данного раздела описано, как задавать предложение WHERE.)
Рис. 26.23. Окно Customize the Properties of the Publication (Настройка свойств в данной публикации)
Рис. 26.24. Окно Filter Data (Фильтрация данных)
- Щелкните на кнопке Next, чтобы появилось окно Filter Table Columns (Фильтрация колонок таблицы) (рис. 26.25). В этом окне вы можете исключать колонки из данной репликации. Сначала выберите таблицу из списка Tables in publication (Таблицы в публикации) и затем в списке Columns in selected table (Колонки в выбранной таблице) сбросьте флажки рядом с колонками, которые не хотите реплицировать. Это позволяет осуществлять вертикальную фильтрацию статьи, при которой будет создаваться реплицированная таблица с меньшим количеством колонок, чем в таблице издателя.Примечание. Колонки с первичным ключом нельзя включать в фильтрацию. Причину вы узнаете в следующей лекции.
Рис. 26.25. Окно Filter Table Columns (Фильтрация колонок таблицы) - Щелкните на кнопке Next, чтобы появилось окно Filter Table Rows (Фильтрация строк таблицы) (рис. 26.26). В этом окне вы можете выбирать таблицы, в которых хотите фильтровать данные по строкам. Выберите таблицу и щелкните на кнопке Build [...] (Создать [...]), чтобы создать фильтр.
Рис. 26.26. Окно Filter Table Rows (Фильтрация строк таблицы) - Появится диалоговое окно Specify Filter (Задать фильтр) (рис. 26.27). В этом диалоговом окне вы можете добавлять к SQL-оператору предложение WHERE, которое будет использоваться для фильтрации строк данных. По окончании выбора строк, которые будут реплицироваться, щелкните на кнопке OK, чтобы вернуться в окно мастера.
- Щелкните на кнопке Next, чтобы появилось окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) (рис. 26.28). В этом окне вы можете указывать, могут ли получать доступ к данным репликации анонимные подписчики (первая кнопка выбора), или это могут делать только известные подписчики (вторая кнопка выбора). Ваш выбор должен основываться на требованиях вашей конфигурации.
Рис. 26.27. Диалоговое окно Specify Filter (Задать фильтр)
Рис. 26.28. Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) - Щелкните на кнопке Next, чтобы появилось окно Set Snapshot Agent Schedule (Задать расписание для Snapshot Agent) (рис. 26.29). В этом окне вы можете согласиться с принятым по умолчанию расписанием запусков агента Snapshot Agent или вызвать диалоговое окно, в котором можете задать новое расписание.
Рис. 26.29. Окно Set Snapshot Agent Schedule (Задать расписание для Agent Schedule) - Щелкните на кнопке Change (Изменить), чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 26.30). В этом диалоговом окне вы можете задавать, когда будет выполняться репликация снимков. Выберите расписание, которое наиболее отвечает вашим потребностям. Расписание, показанное на рис. 26.30, заканчивает свое действие в тот же день, когда оно начинает действовать. Если вы конфигурируете репликацию снимков (как в данном примере), то вы должны задать выполнение этого задания в виде повторяющегося расписания, если хотите, чтобы происходило периодическое обновление снимка. При конфигурировании репликации транзакций вы должны запускать получение снимка после того, как создали новую подписку, если только эта подписка не является анонимной. Репликация слиянием всегда применяет к подписчику последний полученный снимок. По окончании установки расписания щелкните на кнопке OK.
Рис. 26.30. Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) - Щелкните на кнопке Next, чтобы появилось окно мастера Completing the Create Publication Wizard (рис. 26.31). В нем представлена сводка заданной вами информации о данной публикации.
Рис. 26.31. Окно Completing the Create Publication Wizard - Просмотрев сводку, щелкните на кнопке Finish. Вы увидите ход выполнения работы этого мастера по мере создания публикации. Затем появится диалоговое окно (рис. 26.32) с сообщением, что создание публикации завершено.
Рис. 26.32. Диалоговое окно, информирующее о завершении задачи
Вы создали публикацию, которую можно распространять подписчикам. Вы можете активизировать подписчиков или модифицировать свойства этой публикации в диалоговом окне Create and Manage Publications (описано выше в этом разделе).
Модифицирование расписания репликации снимков
При изменении состояния вашей сети вам может потребоваться модификация расписания репликации снимков. (Инструкции по начальному конфигурированию расписания репликации снимков приводятся в предыдущем разделе.) При конфигурировании расписания репликации снимков вы должны учесть несколько факторов, которые приводятся ниже.
- Степень изменчивости данных. Если данные часто изменяются, то снимки должны обновляться достаточно часто. Если данные относительно стабильны, то частое обновление снимков не требуется.
- Критичность изменений. Зависят ли системы-подписчики от обновленных данных? Если да, то снимки должны обновляться чаще.
- Скорость системы. Если сеть, издатель, дистрибьютор и подписчики имеют очень высокую скорость работы, то снимки можно обновлять чаще без возникновения проблем производительности, влияющих на другие компоненты системы.
Чтобы сконфигурировать расписание репликации снимков, выполните следующие шаги.
- В окне Enterprise Manager раскройте сервер, который хотите модифицировать, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Snapshot Agents.
- В правой панели щелкните правой кнопкой мыши на данной публикации и выберите из появившегося контекстного меню пункт Agent Properties (Свойства агентов) (рис. 26.33).
увеличить изображение
Рис. 26.33. Публикация, представленная в окне Enterprise Manager - Появится окно Properties (Свойства) (рис. 26.34). В этом окне представлены свойства для выбранного вами агента публикации.
- Щелкните на вкладке Schedules (Расписания) (рис. 26.35). В этой вкладке показано текущее расписание для данной публикации. С помощью кнопки New Schedule (Создать расписание) вы можете добавить новое расписание. С помощью кнопки New Alert (Создать оповещение) вы можете создать новое оповещение. Кнопка Edit (Редактирование) используется для модифицирования какого-либо существующего расписания. Кнопка Delete (Удаление) используется для удаления какого-либо существующего расписания.
Рис. 26.34. Вкладка General окна свойств агента
Рис. 26.35. Вкладка Schedules окна свойств агента - Щелкните на кнопке Edit, чтобы появилось диалоговое окно Edit Job Schedule (Редактирование расписания заданий) (рис. 26.36). В этом диалоговом окне вы можете конфигурировать агент Snapshot Agent для его запуска по расписанию, которое отвечает вашим требованиям. Чтобы изменить повторяющееся расписание, нужно сначала щелкнуть на кнопке Change, с помощью которой вызывается диалоговое окно Edit Recurring Job Schedule. В диалоговом окне Edit Job Schedule вы можете конфигурировать данный агент таким образом, чтобы он запускался, когда простаивает центральный процессор (ЦП) (вторая кнопка выбора), что является новой возможностью SQL Server. Этот тип расписания может оказаться полезным в некоторых случаях, но, выбрав его, вы не будете точно знать, когда будет запускаться агент. Введите нужное вам расписание и щелкните на кнопке OK.
Рис. 26.36. Диалоговое окно Edit Job Schedule (Редактировать расписание задач)
Когда вы завершите эти шаги, издатель обновит информацию о расписании репликации снимков в дистрибутивной базе данных. Это расписание будет определять, насколько часто будет создаваться снимок. Чтобы модифицировать информацию, определяющую, насколько часто снимок копируется подписчикам, вам нужно сконфигурировать для этой подписки агент Distribution Agent.
Активизация подписчиков
Прежде чем конфигурировать подписчиков, вы должны активизировать их в дистрибутивной базе данных. Активизация подписчика позволяет системе SQL Server взаимодействовать с дистрибутивной базой данных. Установив соединение между дистрибутивной базой данных и подписчиком, вы можете конфигурировать подписки (см. раздел "Конфигурирование подписок".) Чтобы активизировать подписчика, выполните следующие шаги.
- В меню Tools окна Enterprise Manager укажите пункт Replication и затем выберите пункт Configure Publishing, Subscribers, and Distribution (Конфигурировать публикование, подписчиков и распространение); или выберите в меню Tools пункт Wizards, в появившемся диалоговом окне Select Wizard раскройте папку Replication и затем выберите Configure Publishing and Distribution Wizard. При обоих методах появится окно Publisher and Distributor Properties (Свойства издателя и дистрибьютора) (рис. 26.37).
- В окне Publisher and Distributor Properties щелкните на вкладке Subscribers (рис. 26.38). Здесь вы увидите текущий список подписчиков, определенных в вашей сети. Чтобы подписка отправлялась подписчику, вы должны определить здесь этого подписчика.
В этой вкладке вы можете выбрать подписчиков, которые имеют полномочия подписки на издателя, указанного в этой вкладке. Открыв в первый раз окно Publisher and Distributor Properties, вы увидите в списке только систему издателя, так как еще не добавили ни одного подписчика.
- Чтобы добавить подписчика, сначала щелкните на кнопке New, чтобы появилось диалоговое окно Enable New Subscriber (Активизировать нового подписчика) (рис. 26.39). В этом диалоговом окне нужно выбрать вид подписчика, которого вы хотите активизировать (SQL Server, Microsoft Access, OLE DB, ODBC и т.д.). Тем самым определяется тип публикаций, на которые может подписываться новый подписчик. Выберите SQL Server Database (База данных SQL Server) и щелкните на кнопке OK.
Рис. 26.37. Окно Publisher and Distributor Properties (Свойства издателя и дистрибьютoра)
Рис. 26.38. Вкладка Subscribers (Подписчики) окна Publisher аnd Distributor Properties (Свойства издателя и дистрибьютoра)
Рис. 26.39. Диалоговое окно Enable New Subscriber (Активизировать нового подписчика) - Появится окно Registered SQL Server Properties (рис. 26.40). Поскольку мы выбрали на предыдущем шаге вариант SQL Server database, то здесь представлены характерные для SQL Server параметры соединения. Если бы мы выбрали другой вариант в диалоговом окне Enable New Subscriber, то здесь было бы представлено другое окно. Задайте имя системы и метод аутентификации для системы, которую вы активизируете как подписчика.
Рис. 26.40. Окно Registered SQL Server Properties (Зарегистрированные свойства SQL сервера)Если вы хотите увидеть список доступных систем SQL Server, из которых можно сделать выбор, щелкните на кнопке [...] рядом с полем Server. Появится диалоговое окно Select Server (Выбор сервера) (рис. 26.41). Здесь вы можете выбрать сервер, чтобы активизировать его как подписчика.
Рис. 26.41. Диалоговое окно Select Server (Выбор сервера) - После завершения задач шага 4 и щелчка на кнопке OK в диалоговом окне Select Server и в окне Registered SQL Server Properties снова появится окно Publisher and Distributor Properties с новым подписчиком в списке Subscribers (рис. 26.42). Добавленную систему можно теперь использовать как подписчика на указанного издателя.
Рис. 26.42. Окно Publisher аnd Distributor Properties, где показан новый подписчик
Конфигурирование подписок
Теперь, когда вы сконфигурировали издателя, дистрибьютора и публикации и активизировали подписчиков, можно конфигурировать подписки. Вы можете конфигурировать подписки либо из подписчика, либо из издателя. Из подписчика вы можете конфигурировать pull-подписку (подписку по запросу); из издателя вы можете конфигурировать push-подписку (принудительную подписку).
Конфигурирование pull-подписок. Управление и конфигурирование pull-подписок осуществляет подписчик. Тем самым вы должны выбрать подписчика в Enterprise Manager, прежде чем вызывать мастера pull-подписки Pull Subscription Wizard. Обычно pull-подписку используют подписчики, которые не подсоединены постоянно к сети. Например, pull-подписка подходит для используемых мобильным торговым персоналом переносных компьютеров, которые нерегулярно подсоединяются к сети и обновляют подписку. Чтобы сконфигурировать pull-подписку, выполните следующие шаги.
- В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication, выберите Pull Subscription to (Pull-подписка) и затем выберите Pull New Subscription (Новая pull-подписка) в появившемся диалоговом окне Pull Subscription; или выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizard и затем выберите Pull Subscription Wizard. При обоих методах появится начальное окно мастера Pull Subscription Wizard (рис. 26.43). (На рисунках этого раздела для подписчика выбран сервер с именем PTC5 и для издателя выбран сервер с именем PTC4.)
- Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) (рис. 26.44). В этом окне вы можете выбрать метод поиска издателя, который можно осуществлять на зарегистрированных серверах (по умолчанию) или в Active Directory. Тем самым определяется, как происходит поиск издателей, что будет влиять на результаты, показанные в следующем окне.
Рис. 26.43. Начальное окно Pull Subscription Wizard
Рис. 26.44. - Щелкните на кнопке Next, чтобы появилось окно Choose Publication (Выбор публикации) (рис. 26.45). Это окно используется, чтобы идентифицировать публикацию, которая будет использоваться в данной репликации. Здесь представлены серверы, зарегистрированные с вашей системой SQL Server. Раскройте нужную систему-издателя и выберите публикацию, которую хотите использовать (рис. 26.45).
Если вам нужно зарегистрировать сервер, щелкните на кнопке Register Server (Зарегистрировать сервер). Появится окно Registered SQL Server Properties. Мы использовали это окно в предыдущем разделе, когда активизировали подписчика.
- Выбрав публикацию, щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации) (рис. 26.46). В этом окне вы можете задать, с какой login-записью подписчик подсоединяется к дистрибьютору. Принятый по умолчанию вариант Impersonate The SQL Server Agent Account (Использовать учетную запись агента SQL Server Agent) является наиболее подходящим выбором. Если в системе, которую вы конфигурируете, используется SQL Server Agent, сконфигурированный для использования специальной учетной записи, то здесь следует задать компоненты этой учетной записи.
Рис. 26.45. Окно Choose Publication (Выбор публикаций)
Рис. 26.46. Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации) - Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных) (рис. 26.47). В этом окне вы указываете, в какую базу данных следует помещать реплицируемые статьи. На рис. 26.47 показана выбранная для подписки база данных с именем Sub. Если вы хотите создать новую базу данных, щелкните на кнопке New, чтобы открыть окно Database Properties (Свойства базы данных).
Рис. 26.47. Окно Choose Destination Database (Выбор целевой базы данных) - Если вы открыли окно Database Properties для создания новой базы данных, щелкните на кнопке OK, чтобы вернуться по окончании в окно Choose Destination Database. Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 26.48). Щелкните на кнопке выбора Yes, чтобы инициализировать схему базы данных и данные у подписчика.
Рис. 26.48. Окно Initialize Subscription (Инициализация подписки) - Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка) (рис. 26.49). В этом окне вы можете выбрать, откуда будет доставляться снимок. Обычно достаточно принять установку по умолчанию, которая указывает, что снимок выбран из принятого по умолчанию местоположения.
- Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (Задать расписание для агента распространения) (рис. 26.50). В этом окне вы можете выбрать непрерывные обновления, обновления по расписанию или обновления по запросу.
Рис. 26.49. Окно Snapshot Delivery (Доставка снимка)
Рис. 26.50. Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)Напомним, что мы задали в данном примере репликацию снимков, поэтому все содержимое статей будет копироваться на подписчик каждый раз, как будет происходить обновление. В зависимости от частоты изменения данных и важности поддержки данных в синхронизированном состоянии вы можете выбрать любой из этих вариантов. Щелкните на кнопке Change, чтобы вызвать диалоговое окно Edit Recurring Job Schedule, описанное выше в этой лекции. В этом диалоговом окне вы можете задать ваше собственное повторяющееся расписание. - Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб) (рис. 26.51). Вы можете запустить из этого окна SQL Server Agent, если он еще не запущен. В этом окне показано, запущен ли SQL Server Agent на данном подписчике. Если SQL Server Agent не запущен, вы получите запрос на его запуск. Если вы хотите запустить SQL Server Agent вручную, раскройте папку Management (Управление) в окне Enterprise Manager, щелкните правой кнопкой мыши на SQL Server Agent и используйте пункты появившегося контекстного меню для запуска или остановки SQL Server Agent.
Рис. 26.51. Окно Start Required Services (Запуск требуемых служб) - Если SQL Server Agent еще не сконфигурирован для автоматического запуска, то вы увидите окно Configure SQL Server Agent. Сконфигурируйте этот агент и щелкните на кнопке OK. Если SQL Server Agent уже сконфигурирован для автоматического запуска, это окно не появится.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки) (рис. 26.52). Щелкните на кнопке Finish, чтобы завершить задание параметров подписки.
Рис. 26.52. Окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки)
Теперь статьи будут реплицироваться на подписчик и будут регулярно обновляться в соответствии с заданным вами расписанием. Возможно, что прежде чем можно будет начать репликацию, вам потребуется проверить расписание, по которому будут запускаться агенты публикации. Агент Snapshot Agent запускается по своему собственному расписанию, и если вы не сконфигурировали его для немедленного распространения снимка на дистрибьютор, то для поступления данных на дистрибьютор может потребоваться некоторое время. Несмотря на то, что репликация действует, реальные данные не поступят подписчику, пока не выполнит свою работу Snapshot Agent.
Конфигурирование push-подписок. Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard. При использовании push-подписки расписание репликаций определяется на дистрибьюторе. Push-подписка – это типичный метод подписки для стационарных подписчиков. Причиной использования таких подписок является удобство управления всеми подписками с дистрибьютора вместо необходимости отдельного управления каждой подпиской с подписчика. Для запуска мастера Push Subscription Wizard выполните следующие шаги.
- Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 26.53). Выделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку).
Рис. 26.53. Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Push Subscription Wizard, выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription. В обоих случаях появится начальное окно мастера Push Subscription Wizard (рис. 26.54). - Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 26.55). Это окно используется для указания подписчиков, которые будут принудительно получать эту публикацию. В данном случае выбрана система PTC4. Эти подписчики должны быть активизированы в соответствии с разделом "Активизация подписчиков" выше в этой лекции.
Рис. 26.54. Начальное окно мастера Push Subscription Wizard
Рис. 26.55. Окно Choose Subscribers (Выбор подписчиков) - Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 26.56). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований. Чтобы использовать существующую базу данных, введите имя этой базы данных или щелкните на кнопке Browse (Обзор) и выберите базу данных из появившегося списка существующих баз данных. Для создания новой базы данных щелкните на кнопке Browse or Create (Обзор или создание) и затем щелкните на кнопке Create New в появившемся диалоговом окне Browse Databases (Обзор баз данных). Появится окно Database Properties (Свойства базы данных), которое используется в Enterprise Manager для создания новой базы данных. После создания новой базы данных вы возвратитесь в окно Choose Destination Database.
Рис. 26.56. Окно Choose Destination Database - Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (рис. 26.57). Здесь вы можете выбрать между непрерывным обновлением подписки или ее обновлением в соответствии с указанным вами расписанием. При использовании репликации снимков вариант непрерывного обновления подписки не имеет смысла. Если вы хотите изменить расписание, щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule, которое было описано выше. Здесь вы можете сконфигурировать повторяющееся расписание.
Рис. 26.57. Окно Set Distribution Agent ScheduleПримечание.Расписание, которое вы задаете с помощью этого мастера, используется для обновления клиента данными из снимка. Это расписание должно быть скоординировано с расписанием обновления снимка. Если снимок не был обновлен, то подписка будет обновлена старыми данными из снимка. - Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (рис. 26.58). В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. Если схема уже существует, то будет доступен вариант отказа от инициализации схемы. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда происходит инициализация снимка; в противном случае вам придется запускать этот агент вручную. Кроме того, важно задать расписание для агента Snapshot Agent таким образом, чтобы оно соответствовало расписаниям pull- и push-подписок. (См. раздел "Модифицирование расписания репликации снимков" выше в этой лекции.)
Рис. 26.58. Окно Initialize Subscription - Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 26.51), где вы можете запустить агент SQL Server Agent, если он еще не запущен.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 26.59). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. Вы увидите диалоговое окно, описывающее продвижение работы мастера, после чего появится окно сообщения, где указывается, что эта операция успешно завершена. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.
Рис. 26.59. Окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки)
Управление репликацией
Теперь вы знаете, как создавать и конфигурировать реплицируемую базу данных в среде SQL Server 2000. Чтобы управлять этой реплицируемой средой или устранять проблемы, если репликация не запускается, вы будете использовать возможности мониторинга и параметры конфигурирования в Enterprise Manager.
Мониторинг и управление агентами репликации
Агенты репликации можно найти в папке Replication Monitor окна Enterprise Manager. Для доступа к агентам выполните следующие шаги.
- Раскройте группу серверов, раскройте сервер и затем раскройте папку Replication Monitor.
- Если сервер, который вы раскрыли, является издателем, то под папкой Replication Monitor появятся папки Publishers (Издатели) и Agents (Агенты). В папке Publishers находятся издатели, которые принадлежат данному серверу. В папке Agents находятся папки для агентов Snapshot Agents, Log Reader Agents, Distribution Agents, Merge Agents и различных агентов (папка Miscellaneous Agents), которые используются для очистки и протоколирования в журнале выполняемых операций.
- Хотя обычно не требуется запускать или прекращать работу агентов, вы можете использовать для этого Replication Monitor. Если создается впечатление, что ваша реплицируемая система не работает после того, как вы сконфигурировали ее, то вполне вероятно, что еще не запущен агент Snapshot Agent, возможно, из-за того, что для этого агента используется принятое по умолчанию расписание. (Именно поэтому в процессе конфигурирования вы имеете возможность сразу инициализировать создание снимка.) Проверяйте состояние агентов, щелкая на папке соответствующих агентов в Enterprise Manager и просматривая информацию об этих агентах в правой панели (рис. 26.60). Здесь вы можете определить, был ли запущен данный агент, и можете запустить его при необходимости. После запуска агента он действует, пока не закончит свою работу, после чего он становится неактивным. После этого SQL Server Agent будет запускать этот агент репликации, исходя из его регулярного расписания.
увеличить изображение
Рис. 26.60. Агент Snapshot Agent, представленный в окне Enterprise Manager - Щелкните правой кнопкой мыши на агенте, чтобы появилось контекстное меню, содержащее ряд опций, которые вы можете использовать для мониторинга и управления агентами (рис. 26.61).
Рис. 26.61. Опции агента репликации
Эти опции описаны ниже.
- Error Details (Подробности ошибок).Выводятся подробное описание возникших ошибок.
- Agent History (Журнал работы агента). Выводится протокол операций агента.
- Agent Properties (Свойства агента). Позволяет вам модифицировать расписание работы агента репликации. Вы можете также модифицировать метод доступа к базе данных, задачи данного агента и уведомления. Кроме того, вы можете задать получение сообщений электронной почты, оповещающих вас о событиях данного агента.
- Agent Profiles (Профили агента). Позволяет вам просматривать и модифицировать параметры агента, такие как тайм-ауты login-записи, размер пакета и тайм-ауты запросов.
- Start Agent и Stop Agent (Запуск агента и Остановка агента). Позволяют вам запускать агент, если он остановлен, или останавливать его, если он запущен.
- Refresh Rate and Settings (Частота и параметры обновления). Позволяет вам модифицировать частоту обновления данных монитора производительности Performance Monitor.
- Select Columns (Выбрать колонки). Позволяет вам указывать, какие колонки просматриваются в панели результатов.
- Help (Справка). Справочная информация для данного окна.
Отключение репликации
Вы можете легко отключить все операции или часть операций репликации в вашей системе с помощью мастеров Enterprise Manager, чтобы удалить определенные компоненты репликации. В этом разделе вы узнаете, как выполнять эту простую задачу.
Удаление push-подписок
Чтобы удалить push-подписку, используйте Enterprise Manager в системе дистрибьютора для вызова мастера Push Subscription Wizard. После вызова мастера Push Subscription Wizard появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication (Удалить публикацию). Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку. Щелкните на кнопке Yes, чтобы удалить подписку.
Удаление pull-подписок
Чтобы удалить pull-подписку, используйте Enterprise Manager в системе подписчика для вызова мастера Pull Subscription Wizard. После вызова мастера Pull Subscription Wizard появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication. Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку.
Удаление распространения и публикаций
Чтобы удалить распространение и публикации, вы должны вызвать мастер Disable Publishing and Distribution Wizard (Отключение публикования и распространения). В первом окне этого мастера вы указываете, что вам нужно: отключить все распространение и все публикации или удалить только публикации. Если выбрать первый вариант, то будет удалено все – публикование, распространение и публикации. Если выбрать второй вариант (принятый по умолчанию), то будут удалены только публикации. Затем вы должны выбрать публикации, которые хотите удалить. После вашего выбора появится окно подтверждения, где вам дается последняя возможность отменить свое решение. Чтобы удалить выбранные вами компоненты репликации, щелкните на кнопке Yes.
Настройка репликации снимков
В этом разделе вы узнаете, как конфигурировать и настраивать систему репликации снимков для получения оптимальных характеристик. Система репликации снимков конфигурируется и настраивается намного проще, чем системы репликации транзакций и репликации слиянием. В случае репликации транзакций и репликации слиянием подписчики первоначально получают снимок, а затем в эти системы постоянно добавляются меньшие порции реплицируемых данных. В отличие от этого при репликации снимков происходит полное обновление базы данных подписчика, и, тем самым, этот процесс выполняется намного проще. Этот раздел начинается с обзора атрибутов репликации снимков, а затем приводятся рекомендации по конфигурированию, мониторингу и настройке.
Атрибуты репликации снимков
Поскольку при репликации снимков существующая база данных копируется на дистрибьютор и затем на подписчик, производительность репликации снимков зависит от способности определенных компонентов систем перемещать большие объемы данных Здесь приводятся факторы, влияющие на производительность репликации снимков. Планируя и конфигурируя должным образом вашу систему репликации снимков, вы можете снизить влияние этих факторов на производительность.
- Производительность подсистемы ввода-вывода на издателе. Поскольку вся база данных (или ее части) копируются с издателя, то производительность подсистемы ввода-вывода издателя может оказаться ограничивающим фактором. Задача создания снимка занимает в большей степени устройства ввода-вывода, чем ЦП; тем самым мощность ЦП обычно не является определяющим фактором.
- Производительность подсистемы ввода-вывода на дистрибьюторе. Дистрибьютор получает за один раз большие объемы данных и через некоторое время распространяет эти данных подписчикам. Недостаточно быстрая подсистема ввода-вывода на дистрибьюторе может существенно замедлять процесс создания снимка.
- Производительность подсистемы ввода-вывода на подписчике. Дистрибьютор пытается за один прием поместить базу данных или ее часть на подписчике. Если подсистема ввода-вывода на подписчике неадекватна данному требованию, это приводит к снижению производительности репликации.
- Пропускная способность сети между издателем, дистрибьютором и подписчиком. В связи с передачей больших объемов данных в сети может легко возникать эффект "узкого места". Убедитесь в том, что ваша сеть не ограничивает производительность репликации.
Конфигурирование репликации моментальных снимков
В этом разделе даются некоторые рекомендации по конфигурированию репликации снимков. Поскольку в репликации снимков используется дистрибутивная база данных, в которой хранится только информация о состоянии процесса репликации, а не сами реплицируемые данные (для чего используется отдельный файл), то обычно нет необходимости выполнять настройку SQL Server на дистрибьюторе. Следующие рекомендации помогут вам в настройке системы репликации снимков, работающей оптимальным образом.
- Конфигурируйте достаточную мощность подсистем ввода-вывода на издателе, дистрибьюторе и подписчике.
- Конфигурируйте дистрибьютор таким образом, чтобы снимок находился на системе издателя.
- Конфигурируйте дистрибьютор и издатель на одной системе.
- Увеличьте количество BCP-потоков (потоков массового копирования).
Рассмотрим каждую из этих рекомендаций более подробно.
Конфигурирование достаточной мощности подсистем ввода-вывода
Как уже говорилось в предыдущем разделе, при репликации снимков за один раз копируется большой объем данных, поэтому недостаточно быстрая дисковая подсистема может замедлять весь процесс. Увеличивая производительность определенных подсистем ввода-вывода, вы повышаете производительность всего процесса репликации. В системе, участвующей в репликации, такой как любая система SQL Server, журнал транзакций следует помещать на его собственном томе RAID 1, чтобы обеспечить защиту данных. Файлы данных следует размещать на одном или нескольких томах RAID 10 или RAID 5. Используемый вами уровень тома RAID зависит от компонента репликации, который вы конфигурируете, – издатель, дистрибьютор или подписчик.
Конфигурирование подсистемы ввода-вывода на издателе. Выбор тома, который вы используете для файла данных на издателе, – RAID 5 или RAID 10 – зависит от соотношения операций чтения/записи при доступе к данному тому. Как уже говорилось в лекции 5, для любого дискового тома, на котором выполняется более 10 процентов операций записи, не подходит RAID 5, и для него следует использовать RAID 10. Причиной является излишняя дополнительная нагрузка, связанная с операциями записи на RAID 5. Поэтому, выясняя, можете ли вы использовать RAID 5, выполняйте мониторинг системы и следите за количеством операций записи по сравнению с операциями чтения. Независимо от выбранного вами уровня RAID вам следует должным образом планировать подсистему ввода-вывода, как это рекомендовано в лекциях 5 и 6.
Конфигурирование подсистемы ввода-вывода на дистрибьюторе. Поскольку при репликации снимков файл сохраняется на дистрибьюторе, а база данных SQL Server для этого не используется, то вы должны убедиться, что местоположение снимка имеет достаточную мощность подсистемы ввода-вывода, чтобы справляться с большим числом операций записи. Таким образом, для размещения снимка больше подходит RAID 10, чем RAID 5. Как вы увидите далее в этом разделе, в некоторых случаях более эффективным является размещение снимка на издателе.
Конфигурирование подсистемы ввода-вывода на подписчике. Вы можете увеличить производительность репликации снимков за счет использования тома RAID 10 вместо тома RAID 5 для файлов данных на подписчике. Причиной является большое количество операций записи на подписчике во время репликации снимков.
Выбор местоположения для снимка
Поскольку при репликации снимков снимок сначала копируется на дистрибьютор, а позже копируется на подписчик, то вы можете удалить этот дополнительный шаг из процесса репликации. Дистрибьютор будет по-прежнему использоваться, но вы можете сконфигурировать его для хранения снимка на издателе. Тем самым будет исключена лишняя операция сетевого копирования. Чтобы сконфигурировать дистрибьютор для хранения снимка на издателе, выполните следующие шаги:
- На дистрибьюторе вызовите мастер Configure Publishing аnd Distribution Wizard. Когда появится окно Publisher аnd Distributor Properties, щелкните на вкладке Publishers (рис. 26.62).
Рис. 26.62. Вкладка Publishers окна Publisher аnd Distributor Properties - Щелкните на кнопке [...]. Появится окно Publisher Properties (рис. 26.63).
- В этом окне вы можете сконфигурировать местоположение снимка в системе, где формируется этот снимок. Делая это, вы должны убедиться, что это местоположение имеет достаточную мощность подсистемы ввода-вывода, чтобы справляться с дополнительной нагрузкой, связанной с записью этого снимка.Примечание. При конфигурировании местоположения снимка на дистрибьюторе вы конфигурируете местоположение для всех публикаций. Если вы обслуживаете более чем одну систему-издатель с этим дистрибьютором, то вам не следует делать это.
Рис. 26.63. Окно Publisher Properties
Конфигурирование дистрибьютора и издателя в одной системе
Если единственным типом репликации, который вы используете, является репликация снимков, то вы можете легко сконфигурировать дистрибьютора и издателя в одной системе. Это приведет к снижению сетевого трафика, поскольку снимок не нужно будет копировать на дистрибьютор через сеть. Но если существует проблема производительности на издателе, то вам следует оставить снимок на дистрибьюторе, чтобы он брал на себя нагрузку, связанную с распространением снимка.
Увеличение количества BCP-потоков
Вы можете также повысить производительность репликации за счет увеличения количества BCP-потоков, используемых для процесса репликации. Для этого выполните следующие шаги:
- В окне Enterprise Manager раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Snapshot Agents. В правой панели щелкните правой кнопкой мыши на нужной публикации и выберите из появившегося контекстного меню пункт Agent Profiles. Появится диалоговое окно Snapshot Agent Profiles (рис. 26.64).
- Щелкните на кнопке New Profile (Создать профиль). В результате будет создан новый профиль по умолчанию этого агента и появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации), в котором вы можете модифицировать профиль (рис. 26.65). Здесь вы можете изменить параметр MaxBcpThreads.
- После внесения изменений задайте имя этого профиля и щелкните на кнопке OK. Будет выполнено сохранение этого профиля. Затем выберите этот профиль в диалоговом окне Snapshot Agent Profiles.
Рис. 26.64. Диалоговое окно Snapshot Agent Profiles
Рис. 26.65. Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)
Мониторинг системы репликации снимков
Мониторинг системы репликации снимков осуществляется с помощью монитора производительности Microsoft Windows 2000 Performance Monitor. В этом мониторе имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Кроме того, для мониторинга репликации снимков полезен ряд стандартных объектов Performance Monitor.
- SQLServer:Replication Agents. Указывает количество работающих агентов репликации каждого типа.
- SQLServer:Replication Dist. Предоставляет информацию о задержке при распространении.
- SQLServer:Replication Snapshot. Предоставляет информацию о производительности репликации снимков.
- PhysicalDisk. Предоставляет информацию об операциях ввода-вывода. Это очень полезная информация, поскольку многие проблемы производительности репликации снимков связаны с подсистемами ввода-вывода.
- Processor. Позволяет вам следить за процессорами системы.
- System.Предоставляет информацию о системе в целом.
Эти счетчики дают вам достаточно хорошее представление о том, насколько "гладко" выполняется процесс репликации. Но репликация снимков может происходить очень быстро, поэтому будьте внимательны. Если ваша система хорошо сконфигурирована и хорошо настроена, то процесс репликации снимков выполняется достаточно быстро. Чтобы обеспечить оптимальную производительность репликации, следите за возникновением следующих потенциальных проблем:
- Узкие места подсистем ввода-вывода.При слишком высокой интенсивности ввода-вывода следите за числом операций ввода-вывода в секунду и за временем на одну операцию ввода-вывода.
- Узкие места в сети. Найти узкое место в сети – непростая задача, но вы можете определить его наличие, рассчитав пропускную способность сети и сравнив ее со временем репликации снимков.
Настройка системы репликации снимков
Настройка системы репликации снимков обычно означает просто ее надлежащее конфигурирование. Наиболее существенными проблемами, которые влияют на производительность репликации, являются проблемы ввода-вывода и производительности сети. Вы должны оценить производительность вашей сети и затем определить, достаточно ли этого для потребностей вашей репликации. Рассмотрим один пример.
Предположим, у вас имеется база данных объемом 5 Гб. Если у вас используется сеть 10BaseT, то она дает максимальную пропускную способность 10 Мбит/с, что приблизительно составляет 1 мегабайт в секунду (Мб/с). Таким образом, для репликации в этой сети базы данных объемом в 5 Гб потребуется 5120 секунд, или 1,4 часа. Вот соответствующий расчет: (5 Гб * 1024 (Мб/Гб)) / 1 (Мб/с) = 5120 с, или 1,4 часа. Но в сети 100BaseT та же репликация может быть выполнена за 8,3 минут. А в сети Gigabit Ethernet та же задача может быть выполнена за 51 с. Сравнение по сетям перечислены в табл. 26.1.
Скорость сети | Время выполнения репликации снимков для базы данных 5 Гб |
---|---|
10BaseT | 5120 секунд, или 85,3 минуты, или 1,4 часа |
100BaseT | 516 секунд, или 8,3 минуты |
Gigabit Ethernet | 51 секунда |
Как видите, тип сети играет существенную роль. Выполняя подобные расчеты, вы получите хорошее представление о том, насколько быстро будет выполняться репликация. Если репликация занимает слишком много времени, то, возможно, на это влияет узкое место где-либо еще, – в подсистеме ввода-ввода, в памяти, на диске и т.д.
Заключение
В этой лекции вы узнали о трех типах репликации SQL Server: репликация снимков, репликация транзакций и репликация слиянием. Вы также узнали, что означает для репликации в SQL Server метафора "опубликовать-и-подписаться", которая впервые появилась в SQL Server 6. И вы узнали, как конфигурировать репликацию снимков. Осваивая репликацию на практике, вы начнете понимать, насколько гибкой является репликация в SQL Server. В лекциях 27 и 28 вы будете узнавать о все более сложных формах репликации: репликации транзакций и репликации слиянием.
Лекция 27. Репликация транзакций
В лекции 26 был дан обзор репликации в Microsoft SQL Server 2000, включая краткое описание репликации транзакций. В данной лекции приводится уже подробное описание этой темы. Здесь описывается, как действует этот метод репликации, когда его следует использовать, а также как его конфигурировать, как выполнять его мониторинг и как настраивать системы, участвующие в репликации транзакций.
Репликация транзакций, видимо, является наиболее распространенным методом репликации. Она позволяет достаточно быстро передавать подписчикам изменения после того, как они применены к издателям, и это происходит без особого увеличения нагрузки на издателей.
Введение в репликацию транзакций
Как следует из названия, репликация транзакций используется для репликации того, что происходит в транзакциях. При использовании этого метода репликации база данных подписчика создается первоначально с помощью моментального снимка (snapshot) – мы будем называть его просто снимком, – а последующие изменения, которые вносятся в базу данных издателя, реплицируются подписчику в соответствии с транзакциями. Все обновления, вставки и удаления, выполняемые в базе данных, распространяются именно таким образом.
Транзакции считываются из журнала транзакций агентом чтения журнала Log Reader Agent, который запускается на дистрибьюторе и подсоединяется к издателю. Эти транзакции обрабатываются и помещаются в дистрибутивную базу данных на дистрибьюторе. Позже агенты распространения (Distribution Agents) считывают эту информацию из дистрибутивной базы данных и применяют транзакции к базе данных подписчика.
Каждая база данных, которая использует репликацию транзакций, имеет собственного агента Log Reader Agent, который запускается на дистрибьюторе и следит за журналом транзакций этой базы данных на издателе. На каждую базу данных используется только один агент Log Reader Agent – независимо от количества публикаций, определенных по соответствующей базе данных.
Log Reader Agent запускается на дистрибьюторе в соответствии с расписанием, которое определяется при создании публикации. В зависимости от вашего выбора Log Reader Agent работает в соответствии с регулярным расписанием или непрерывно. При работе Log Reader Agent происходит следующая последовательность событий.
- Log Reader Agent читает журнал транзакций системы с данной публикацией и создает список операторов INSERT, UPDATE, DELETE и других модификаций данных, которые были выбраны для репликации, включая удаления таблиц, изменения в определениях колонок и т.д.
- Log Reader Agent обрабатывает данные из журнала транзакций и выполняет фильтрации, определенные по статьям. Сюда относятся все горизонтальные и вертикальные фильтрации.
- Эти модификации объединяются в пакет и отправляются в дистрибутивную базу данных на дистрибьюторе. Внутри дистрибутивной базы данных имеется несколько таблиц, в которых отслеживаются изменения репликации и задачи. Выполняемые на издателе модификации, которые должны распространяться подписчикам, сохраняются в таблице с именем MSRepl_commands. Эта таблица содержит реальные команды репликации в сжатом формате. Таблица MSRepl_commands содержит по одной строке для каждой операции INSERT, UPDATE и DELETE по каждой определенной ранее статье. Если модификация, которая вносится в таблицу базы данных издателя, относится к нескольким статьям, то это изменение будет дублировано в дистрибутивной базе данных. Например, если таблица A содержится в трех статьях, то изменение в таблице A приведет к появлению трех строк в дистрибутивной базе данных.
- После успешной передачи каждого пакета в дистрибутивную базу данных происходит фиксирование транзакций этого пакета. При отказе фиксирования в журнал ошибок агента записывается сообщение об ошибке.
- После успешного фиксирования этих изменений в дистрибутивной базе данных Log Reader Agent помечает последнее изменение, включенное в последнюю операцию репликации, чтобы не было повторения этих изменений.
- После того как транзакция прочитана из журнала транзакций и фиксирована в дистрибутивной базе данных, Log Reader Agent помечает те строки журнала транзакций, которые подходят для усечения (eligible to be truncated).
Для каждой модификации базы данных публикации создается хотя бы одна запись в дистрибутивной базе данных. В некоторых случаях модификация в базе данных публикации приводит к созданию нескольких записей в дистрибутивной базе данных. Вот эти случаи.
- Вставка в таблицу приводит к вставке в дистрибутивную базу данных для каждой статьи, в которую входит данная таблица. Если таблица входит в две различные публикации, то она определена в двух отдельных статьях. Каждая из двух статей получит свою строку в дистрибутивной базе данных для каждой операции вставки, обновления и удаления, выполняемой в базе данных соответствующей публикации.
- Для каждого обновления или удаления, влияющего на несколько строк, создается соответствующее количество строк в дистрибутивной базе данных. Для оператора SQL, который выполняет операцию обновления или удаления для нескольких строк, агент Log Reader Agent создает по отдельной команде в дистрибутивной базе данных для каждой из этих строк. Предложение WHERE в операторе SQL преобразуется в предложение WHERE, которое указывает строку в базе данных в соответствии со значение первичного ключа. Например, операция обновления, которая влияет на все строки в 10-строчной таблице, приведет к созданию 10 записей в дистрибутивной базе данных, для каждой из которых в предложении WHERE указывается значение первичного ключа.
Применение репликации транзакций
Репликация транзакций может применяться, когда подписчикам требуется поддерживать информацию на уровне текущего состояния данных издателя. Репликацию транзакций можно сконфигурировать таким образом, чтобы обновление подписчика происходило вскоре после обновления издателя. Даже в непрерывном режиме работы агент Log Reader Agent вместо непрерывного чтения обращается к журналу транзакций через определенное количество секунд, чтобы снизить нагрузку на журнал транзакций издателя.
Репликацию транзакций можно сконфигурировать таким образом, чтобы подписчики тоже могли модифицировать базу данных. Это свойство придает репликации транзакций высокую степень гибкости и находит применение в ряде случаев.
- Передача сообщений. Репликацию транзакций можно использовать для передачи сообщений между системами, когда важно следить за тем, что подписчик получил эти сообщения. Если происходит разъединение в сети, то данные будут переданы, как только соединение в сети будет восстановлено.
- Поддержка текущего состояния информации в магазинах. Многие компании используют репликацию транзакций для передачи данных между главным офисом и магазинами розничной торговли. При каждом обновлении цен в главном офисе они также обновляются в системах розничной торговли.
- Распределение нагрузки. Репликацию транзакций можно использовать для снятия части нагрузки с баз данных с помощью отчетных систем, которые могут обрабатывать длительные требующие интенсивного использования ресурсов запросы, освобождая тем самым главные серверы.
Существует много применений для репликации транзакций. В зависимости от конфигурации вашей системы и ваших приложений репликация транзакций может оказаться для вас очень полезным средством.
Конфигурирование системы репликации транзакций
Конфигурирование репликации транзакций выполняется аналогично конфигурированию репликации моментального снимка. Сначала вы должны сконфигурировать публикацию и затем задать, чтобы она принудительно передавалась подписчику (push-подписка) или запрашивалась подписчиком (pull-подписка).
Конфигурирование публикаций
Процесс создания публикации для репликации транзакций почти идентичен процессу создания публикации для репликации моментальных снимков. Для конфигурирования публикации транзакций выполните следующие шаги.
- В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication (Репликация) и выберите команду Create аnd Manage Publications (Создание и управление публикациями); или выберите пункт Wizards (Мастера), раскройте папку Replication в появившемся в диалоговом окне Select Wizard (Выбор мастера) и выберите Create Publication Wizard (Мастер создания публикации). При любом способе появится диалоговое окно Create and Manage Publications
(рис. 27.1). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.
Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:
- Push New Subscription (Новая push-подписка). Позволяет вам создать новую push-подписку для уже существующей публикации. (См. раздел "Конфигурирование подписок" далее.)
Рис. 27.1. Диалоговое окно Create and Manage Publications - Properties and Subscriptions (Свойства и подписки). Позволяет вам модифицировать свойства как публикаций, так и подписок.
- Script Publication (Сценарий создания публикации). Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
- Delete Publication (Удалить публикацию). Позволяет вам удалить уже сконфигурированную публикацию.
- Push New Subscription (Новая push-подписка). Позволяет вам создать новую push-подписку для уже существующей публикации. (См. раздел "Конфигурирование подписок" далее.)
- Выберите базу данных, которую хотите использовать для данной публикации (на рис. 27.1 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера Create Publication Wizard. Появится начальное окно мастера (рис. 27.2). Установите флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере).
Рис. 27.2. Начальное окно мастера Create Publication Wizard - Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 27.3). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. По умолчанию будет выделена база данных, выбранная вами на шаге 2.
Рис. 27.3. Окно Choose Publication Database (Выбор баз данных для публикаций)Примечание. Если для системы, выбранной вами на шаге 1, еще не определен дистрибьютор, то вы получите запрос выбора дистрибьютора в окне Select Distributor (Выбор дистрибьютора). Напомним, что издатель может иметь только одного дистрибьютора – независимо от количества публикаций. Если у вас уже определен дистрибьютор, то появится окно Choose Publication Database, как это описано выше. - Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 27.4).
Рис. 27.4. Окно Select Publication Type (Выбор типа публикации)В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:- Snapshot publication (Публикация для репликации снимков). Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
- Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
- Merge publication (Публикация для репликации слиянием).Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
- Щелкните на кнопке выбора Transactional Publication и щелкните на кнопке Next, чтобы появилось окно Updatable Subscriptions (Модифицируемые подписки) (рис. 27.5). Это окно появится, так как мы установили флажок Show Advanced Options in this Wizard. (Если бы вы не установили этот флажок, то появилось бы окно Specify Subscriber Types (Указание типов подписчиков).)
Рис. 27.5. Окно Updatable Subscriptions (Модифицируемые подписки)В этом окне вы можете указывать, какие изменения, внесенные на подписчиках, реплицируются издателям. Ниже описаны флажки этого окна.- Immediate updating (Немедленное обновление).Активизируются подписки с немедленным обновлением. Это означает, что агенты репликации будут использовать Microsoft Distributed Transaction Coordinator (MS DTC – координатор распределенных транзакций) для выполнения двухфазного фиксирования по транзакциям, которые модифицируют данные подписчиков, чтобы можно было вносить изменения на подписчике и немедленно реплицировать их на издателе. (О MS DTC и двухфазном фиксировании см. лекцию 25.) По умолчанию флажок подписок с немедленным обновлением не установлен.
- Queued updating (Отложенное обновление). Активизирует подписки с отложенным обновлением. Это означает, что модификации, которые выполняются на подписчике, будут помещаться в очередь до того момента, когда их можно будет применить на издателе. Это позволяет подписчику модифицировать базу данных, но не требует двухфазного фиксирования с издателем.
Примечание. Репликация с немедленным обновлением полезна в тех случаях, когда идентичность систем является требованием, но учтите, что при двухфазном фиксировании возникает большая дополнительная нагрузка. Если у вас нет немедленного доступа к обеим системам, то соответствующая транзакция не может быть фиксирована. Репликацию с немедленным обновлением следует использовать только при абсолютной необходимости. - Щелкните на кнопке Next, чтобы появилось окно Transform Published Data (Преобразование опубликованных данных) (рис. 27.6). Преобразование данных является новой возможностью SQL Server. Для преобразования реплицированных данных используется набор Microsoft Data Transformation Services (DTS – службы преобразования данных). DTS позволяет выполнять следующие преобразования данных:
- преобразование значений или типов данных;
- изменение регистра букв;
- слияние данных;
- разделение данных.
Рис. 27.6. Окно Transform Published Data (Преобразование опубликованных данных)
- Щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 27.7). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. Если возможно, используйте установку по умолчанию, которая указывает, что все серверы-подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить третий флажок, который указывает, что данные репликации будут преобразовываться с символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.
Рис. 27.7. Окно Specify Subscriber Types (Указание типов подписчиков) - Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 27.8). В этом окне вы можете указывать таблицы, хранимые процедуры и представления, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. Выберите все нужные вам таблицы, хранимые процедуры и представления в правой части окна или установите один или несколько флажков в колонке Publish All (Публиковать все) для выбора всех элементов объектов соответствующего типа в базе данных. Напомним, что каждый объект рассматривается как статья, а публикация – это набор логически сгруппированных статей.
Рис. 27.8. Окно Specify Articles (Указание статей)Примечание.Если на подписчике имеются хранимые процедуры, то репликацию можно сконфигурировать таким образом, чтобы реплицировать вызовы этих хранимых процедур, а не результаты вызовов хранимых процедур. - Щелкните на кнопке Next. На этом этапе SQL Server проверяет данную публикацию, и если он найдет ошибки, то вы увидите окно (рис. 27.9).
Рис. 27.9. Окно Article Issues (Вопросы по статьям) - После завершения анализа данной публикации (и после щелчка на кнопке OK для возврата в окно мастера, если появилось информационное диалоговое окно) щелкните на кнопке Next, чтобы появилось окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 27.10). В этом окне вы указываете имя и описание публикации.
Рис. 27.10. Окно Select Publication Name аnd Description (Выбор имени и описания публикации) - Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 27.11). В этом окне вы указываете, хотите ли определять фильтры данных и настраивать другие свойства. Щелкните на кнопке Yes (Да).
Рис. 27.11. Окно Customize the Properties of the Publication (Настройка свойств данной публикации)
- Щелкните на кнопке Next, чтобы появилось окно Filter Data (Фильтрация данных) (рис. 27.12). В этом окне вы указываете, хотите ли вы фильтровать данные по вертикали (фильтрация колонок) или по горизонтали (фильтрация строк). Установите оба флажка и щелкните на кнопке Next.
Рис. 27.12. Окно Filter Data (Фильтрация данных) - Появится окно Filter Table Columns (Фильтрация колонок таблицы) (рис. 27.13). В этом окне вы можете исключать колонки из данной репликации. Сначала выберите таблицу из списка Tables in Publication (Таблицы в публикации) и затем в списке Columns in Selected Table (Колонки в выбранной таблице) сбросьте флажки рядом с колонками, которые не хотите реплицировать. Это позволяет осуществлять вертикальную фильтрацию статьи, при которой будет создаваться реплицированная таблица с меньшим количеством колонок, чем в таблице издателя.
Рис. 27.13. Окно Filter Table Columns (Фильтрация колонок таблицы)Примечание.Колонки с первичными ключами нельзя включить в фильтрацию, поскольку колонки с первичными ключами используются в репликации транзакций, как это описано выше в этой лекции. - Щелкните на кнопке Next, чтобы появилось окно Filter Table Rows (Фильтрация строк таблицы) (рис. 27.14). В этом окне вы можете выбирать таблицы, в которых хотите фильтровать данные по строкам. Выберите таблицу и щелкните на кнопке Build [...] (Создать [...]), чтобы создать фильтр.
Рис. 27.14. Окно Filter Table Rows (Фильтрация строк таблицы) - Появится диалоговое окно Specify Filter (Задать фильтр) (рис. 27.15). В этом диалоговом окне вы можете добавлять к SQL-оператору предложение WHERE, которое будет использоваться для фильтрации строк данных. По окончании указания строк, которые будут реплицироваться, щелкните на кнопке OK, чтобы вернуться в окно мастера.
Рис. 27.15. Диалоговое окно Specify Filter (Задать фильтр) - Щелкните на кнопке Next, чтобы появилось окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) (рис. 27.16). В этом окне вы можете указывать, могут ли получать доступ к данным репликации анонимные подписчики (первая кнопка выбора), или это могут делать только известные подписчики (вторая кнопка выбора). Ваш выбор должен основываться на вашей конфигурации и требованиях безопасности.
Рис. 27.16. Окно Allow Anonymous Subscriptions (Разрешить доступ анонимным подписчикам) - Щелкните на кнопке Next, чтобы появилось окно Set Snapshot Agent Schedule (Задать расписание для агента снимков Snapshot Agent). (Об использовании этого окна см. шаги 15 и 16 подраздела "Конфигурирование репликации моментальных снимков" лекции 26.) Поскольку в репликации транзакций снимок используется только для первоначального создания базы данных подписчика, то вам, видимо, не нужно задавать регулярное расписание для создания снимка; вместо этого вы можете создать снимок вручную.
- После того, как вы зададите расписание, щелкните на кнопке Next, чтобы появилось окно мастера Completing the Create Publication Wizard (Завершение работы мастера создания публикации), просмотрите сводку по данной публикации и щелкните на кнопке Finish (Готово). Когда создание вашей публикации будет завершено, появится соответствующее информационное диалоговое окно.
Конфигурирование Log Reader Agent
После создания публикации вам, возможно, потребуется модифицировать поведение агента чтения журнала Log Reader Agent. Например, вы можете задать, как происходит вызов Log Reader Agent, выбрав режим, в котором он будет работать. В непрерывном режиме (это режим по умолчанию) запуск Log Reader Agent происходит при запуске SQL Server Agent. Затем он подсоединяется к журналу транзакций на издателе и выполняет непрерывное чтение этого журнала. В режиме расписания Log Reader Agent запускается в соответствии с заданным вами расписанием и переходит в неактивное состояние после того, как прочитает все реплицируемые транзакции из журнала транзакций. Изменяя режим и другие свойства, вы можете повышать производительность и снижать объем нагрузки на издатель. Чтобы сконфигурировать Log Reader Agent, выполните следующие шаги.
- В окне Enterprise Manager раскройте сервер, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Log Reader Agents.
- В правой панели Enterprise Manager щелкните правой кнопкой мыши на публикации. Появится контекстное меню (рис. 27.17).
Рис. 27.17. Контекстное меню для публикации - Выберите пункт Agent Properties (Свойства агента). Появится окно свойств данного агента Log Reader Agent (рис. 27.18).
- Щелкните на вкладке Steps (Шаги) (рис. 27.19). В этой вкладке вы увидите шаги, которые выполняет данный Log Reader Agent, когда происходит его вызов. Здесь выводятся и описываются три следующих шага.
- Log Agent startup message (Сообщение о запуске агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение (таблица MSLogreader_history в дистрибутивной базе данных).
Рис. 27.18. Окно свойств Log Reader Agent
Рис. 27.19. Вкладка Steps (Шаги) окна свойств Log Reader Agent - Run agent (Запуск агента).Запуск данного агента в соответствии с заданным расписанием. При работе в непрерывном режиме этот агент работает, пока не будет отключена система.
- Detect nonlogged agent shutdown (Обнаружено незарегистрированное отключение агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение в случае отключения агента.
- Log Agent startup message (Сообщение о запуске агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение (таблица MSLogreader_history в дистрибутивной базе данных).
- Выделите шаг Run agent и щелкните на кнопке Edit (Редактировать), чтобы появилось диалоговое окно Edit Job Step (Редактирование шага) (рис. 27.20). В этом диалоговом окне вы можете конфигурировать способ вызова Log Reader Agent.
Для агента Log Reader Agent можно сконфигурировать много параметров. Параметры по умолчанию этого агента можно модифицировать в окне Command (Команда) диалогового окна Edit Job Step и в диалоговом окне Replication Agent Profile Details (Детали профиля агента репликации) (рис. 27.22). Здесь описаны два параметра, которые вы можете модифицировать в диалоговом окне Edit Job Step.
- Continuous (Непрерывный). Указывает, работает ли Log Reader Agent в непрерывном режиме. Чтобы задать режим расписания, удалите этот параметр.
Рис. 27.20. Вкладка General диалогового окна Edit Job Step (Редактирование шага) - DistributorSecurityMode (Режим безопасности дистрибьютора).Указывает, какой режим аутентификации использует Log Reader Agent: SQL Server или Microsoft Windows 2000.
- Continuous (Непрерывный). Указывает, работает ли Log Reader Agent в непрерывном режиме. Чтобы задать режим расписания, удалите этот параметр.
- Закончив модифицирование свойств Log Reader Agent, щелкните на кнопке OK, чтобы сохранить ваши изменения.
Вы можете модифицировать другие параметры в профиле Log Reader Agent. Чтобы модифицировать профиль, выполните следующие шаги.
- В правой панели Enterprise Manager щелкните правой кнопкой мыши на Log Reader Agent и выберите из появившегося контекстного меню пункт Agent Profiles (Профили агента). Появится диалоговое окно Log Reader Agent Profiles(рис. 27.21).
- Щелкните на кнопке New Profile (Создать профиль), чтобы создать новый профиль. Текущий профиль нельзя модифицировать. В результате появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации) (рис. 27.22).
- В этом диалоговом окне вы можете модифицировать следующие параметры:
- HistoryVerboseLevel. Указывает, сколько информации будет протоколироваться в журнале. Обычно хватает принятого по умолчанию уровня, если только у вас не возникают проблемы.
- LoginTimeout. Указывает допустимое время ожидания в секундах для Log Reader Agent.
- PollingInterval. Указывает, насколько часто опрашивается журнал транзакций на издателе (для получения новых транзакций).
- QueryTimeout.Указывает допустимое время ожидания в секундах для запроса.
- ReadBatchSize.Указывает количество транзакций, которое считывается из журнала транзакций в одном пакете.
Рис. 27.21. Диалоговое окно Log Reader Agent Profiles
Рис. 27.22. Диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации)
Конфигурирование pull-подписок
Управление и конфигурирование pull-подписок осуществляется со стороны подписчика. Тем самым вы должны конфигурировать pull-подписку с помощью Enterprise Manager в системе подписчика. Чтобы сконфигурировать pull-подписку, выполните следующие шаги.
- В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication, выберите пункт Pull Subscription To (Pull-подписка) и затем щелкните на Pull New Subscription (Новая pull-подписка) в появившемся диалоговом окне Pull Subscription To; или выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizard, затем выберите Create Pull Subscription Wizard (Мастер создания pull-подписки) и щелкните на кнопке OK. При обоих методах появится начальное окно мастера Pull Subscription Wizard (рис. 27.23). Отметим, что в этом окне имеется флажок, с помощью которого в этом мастере можно показывать дополнительные параметры. В данном примере мы установим этот флажок. Это позволит активизировать преобразование данных.
Рис. 27.23. Начальное окно Pull Subscription Wizard - Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) (рис. 27.24). В этом окне вы можете определить, где выполняется поиск публикации. Можно выбрать поиск в стандартных точках сети Windows 2000 или в службе Active Directory. Выберите первый вариант, принятый по умолчанию, который указывает что вы будете искать публикации на зарегистрированных серверах.
Рис. 27.24. Окно Look for Publications (Поиск публикаций) - Щелкните на кнопке Next, чтобы появилось окно Choose Publication (Выбор публикации) (рис. 27.25). Это окно используется, чтобы идентифицировать публикацию, которая будет использоваться в данной репликации. Здесь представлены серверы, зарегистрированные с вашей системой SQL Server. Выберите публикацию, которую хотите реплицировать.
Рис. 27.25. Окно Choose Publication (Выбор публикации) - Щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации) (рис. 27.26). В этом окне вы можете задать login-запись и пароль для дистрибьютора.
- Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных) (рис. 27.27). В этом окне вы указываете, в какую базу данных следует помещать реплицируемые статьи. Если вы хотите создать новую базу данных, щелкните на кнопке New, чтобы открыть окно Database Properties (Свойства базы данных).
Рис. 27.26. Окно Specify Synchronization Agent Login (Задать login-запись для агента синхронизации)
Рис. 27.27. Окно Choose Destination Database (Выбор целевой базы данных) - Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 27.28). Щелкните на кнопке выбора Yes, чтобы инициализировать схему базы данных и данные у подписчика. Если у вас уже есть ранее созданная схема, щелкните на кнопке выбора No.
- Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка) (рис. 27.29). В этом окне вы можете указать папку для снимка, отличную от принятой по умолчанию папки. Если вы не хотите изменять папку для снимка, используйте вариант по умолчанию (первая кнопка выбора).
- Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (Задать расписание для агента распространения) (рис. 27.30). В этом окне вы можете выбрать непрерывные обновления, обновления по расписанию или обновления по запросу. В большинстве случаев предпочтительным вариантом являются обновления по расписанию (вторая кнопка выбора).
Рис. 27.28. Окно Initialize Subscription (Инициализация подписки)
Рис. 27.29. Окно Snapshot Delivery (Доставка снимка)
Рис. 27.30. Окно Set Distribution Agent Schedule (Задать расписание для агента распространения)Принимая решение о том, как работать с обновлениями в вашей системе, помните, что более частые запуски агента Distribution Agent приводят к увеличению нагрузки и на дистрибьюторе, и на подписчике. Запускайте этот агент, сколько вам требуется, но не допускайте излишнего использования.
Чтобы изменить расписание для агента Distribution Agent, щелкните на кнопке Change и модифицируйте расписание в появившемся диалоговом окне Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий).
Примечание.Если у вас выбрано преобразование данных публикации, то появится окно Specify DTS Package (Задать пакет DTS). Для продолжения работы у вас уже должен быть создан пакет DTS. Если у вас еще нет такого пакета, создайте его и затем снова запустите мастер. В данном примере мы не задаем преобразование данных. - Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб) (рис. 27.31). Вы можете запустить из этого окна SQL Server Agent, если он еще не запущен. В этом окне показано, запущен ли SQL Server Agent на данном подписчике. Если SQL Server Agent не запущен, вы получите запрос на его запуск. Если вы хотите запустить SQL Server Agent вручную, раскройте папку Management (Управление) в окне Enterprise Manager, щелкните правой кнопкой мыши на SQL Server Agent и используйте пункты появившегося контекстного меню для запуска или остановки SQL Server Agent.
Рис. 27.31. Окно Start Required Services (Запуск требуемых служб) - Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки) (рис. 27.32). Щелкните на кнопке Finish, чтобы завершить задание параметров подписчика.
Теперь статьи будут реплицироваться на подписчик и будут регулярно обновляться в соответствии с заданным вами расписанием. Возможно, что прежде чем можно будет начать репликацию, вам потребуется проверить расписание, в соответствии с которым будут запускаться агенты публикации. Агент Snapshot Agent запускается по своему собственному расписанию, и если вы не сконфигурировали его для немедленного распространения снимка на дистрибьютор, то для поступления данных на дистрибьютор может потребоваться некоторое время. Несмотря на то, что репликация действует, реальные данные не поступят подписчику, пока не выполнит свою работу Snapshot Agent.
Рис. 27.32. Окно Completing the Pull Subscription Wizard
Конфигурирование push-подписок
Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard. При использовании push-подписки расписание репликаций определяется на дистрибьюторе. Для запуска мастера Push Subscription Wizard выполните следующие шаги:
- Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 27.33).
Рис. 27.33. Публикация, выбранная в диалоговом окне Create and Manage PublicationsВыделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку). Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Create Push Subscription Wizard и щелкните на кнопке ОК. Выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription. Появится начальное окно мастера Push Subscription Wizard (рис. 27.34).
Рис. 27.34. Начальное окно мастера Push Subscription Wizard - Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 27.35). В этом окне выбирается система, которая будет получателем выбранной вами публикации.
Рис. 27.35. Окно Choose Subscribers (Выбор подписчиков) - Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 27.36). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований.
Рис. 27.36. Окно Choose Destination Database - Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Location (Задать местоположение для агента распространения) (рис. 27.37). Здесь вы можете выбрать между выполнением этого агента распространения на дистрибьюторе (принятый по умолчанию и рекомендуемый вариант) и его выполнением на подписчике. Для тех, кто знаком с репликацией транзакций в SQL Server 7, это новая возможность.
Рис. 27.37. Окно Set Distribution Agent Location (Задать местоположение для агента распространения) - Щелкните на кнопке Next, чтобы появилось окно Set Distribution Agent Schedule (рис. 27.38). Здесь вы можете выбрать между непрерывным обновлением подписки или ее обновлением в соответствии с указанным вами расписанием. Щелкните на кнопке выбора Using the Following Schedule (Использовать следующее расписание) и щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule. Здесь вы можете легко сконфигурировать повторяющееся расписание. Принимая решение о том, насколько часто должна обновляться подписка, следует помнить, что при непрерывном обновлении возникает большая дополнительная нагрузка. Отметим, что репликация по запросу недоступна для push-подписки.
Рис. 27.38. Окно Set Distribution Agent Schedule - Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (рис. 27.39).
Рис. 27.39. Окно Initialize Subscription В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда вы инициализируете снимок; в противном случае вам придется запускать этот агент вручную. После того как снимок инициализирован и начинается репликация, вам не нужно использовать снимок, пока не потребуется создать новую подписку. Каждый раз, как вы создаете подписку, создавайте новый снимок, и вам больше не нужно создавать снимки в соответствии с каким-либо расписанием, если только вам не потребуется ресинхронизация базы данных подписчика с использованием снимков. - Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 27.40). Вы можете задать, чтобы агент SQL Server Agent был запущен автоматически, если он еще не запущен.
Рис. 27.40. Окно Start Required Services - Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 27.41). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.
Рис. 27.41. Окно Comple-ting the Push Subscription Wizard (Завершение работы мастера push-подписки)
Конфигурирование, мониторинг и настройка дистрибьютора для репликации транзакций
В этом разделе вы узнаете, как осуществлять конфигурирование, мониторинг и настройку дистрибьютора для репликации транзакций Как уже говорилось в предыдущей лекции, дистрибьютор – это сервер, содержащий базу данных SQL Server, которая называется дистрибутивной базой данных и используется как хранилище данных репликации. Эти данные хранятся в базе данных SQL Server, обеспечивая ряд преимуществ, включая следующие:
- Высокая производительность. SQL Server обеспечивает высокую производительность, которая требуется дистрибьютору для получения, хранения и распространения данных.
- Надежность. Поскольку SQL Server поддерживает высокий уровень восстанавливаемости, то база данных SQL Server идеально подходит для данных репликации. Используя журнал транзакций, SQL Server может выполнять восстановление после аварий системы без потери каких-либо данных.
- Простота использования. Поскольку процесс репликации SQL Server непосредственно взаимодействует с дистрибьютором через протоколы передачи данных, это позволяет легко устанавливать и конфигурировать дистрибьютор.
Конфигурирование дистрибьютора
В зависимости от того, как часто вносятся модификации в вашу базу данных, интенсивность операций на дистрибьюторе может оказаться довольно высокой. Поскольку дистрибьютор использует базу данных SQL Server, все модификации, выполняемые на дистрибьюторе, должны протоколироваться в журнале транзакций. Вам следует конфигурировать дистрибутивную базу данных и этот журнал достаточно большими, чтобы можно было выполнять необходимую работу, и достаточно быстрыми, чтобы выполнять эту работу эффективно. Хотя принятая по умолчанию конфигурация распространения подходит для небольших систем репликации, она не соответствует многим системам, поскольку мастера репликации SQL Server не размещают журнал транзакций и файлы данных SQL Server оптимальным образом. Они обычно размещаются на принятом по умолчанию томе SQL Server, причем журнал транзакций и файлы базы данных оказываются на одном томе.
Конфигурируя должным образом дистрибутивную базу данных, вы можете избежать дорогостоящих проблем производительности. Вот некоторые рекомендации по конфигурированию дистрибутивной базы данных.
- Используйте RAID-контроллер для системы с дистрибутивной базой данных. Использование аппаратного RAID-контроллера более эффективно, чем использование программных RAID.
- Конфигурируйте журнал транзакций дистрибутивной базы данных на томе RAID 1. Журнал транзакций должен быть изолирован, чтобы иметь более высокую производительность при последовательных операциях ввода-вывода.
- Конфигурируйте журнал транзакций достаточно большим, чтобы не возникала необходимость частого резервного копирования журнала транзакций. В зависимости от ваших потребностей у вас должна быть возможность обходиться всего лишь одним резервным копированием журнала транзакций в сутки (предпочтительно вечером).
- Конфигурируйте дистрибутивную базу данных на томе RAID 1 или RAID 10. RAID 5 не подходит в связи с большим количеством операций записи в дистрибутивную базу данных.
- Конфигурируйте дистрибутивную базу данных достаточно большой, чтобы у нее был запас для дополнительных данных репликации. В случае отказа сервера подписчика в этой базе данных могут накопиться данные репликации за несколько дней.
- Выполняйте настройку базы данных репликации, как и любой другой базы данных SQL Server.
Конфигурирование дистрибьютора с помощью Enterprise Manager
Для конфигурирования дистрибутивной базы данных, как это показано в предыдущем списке, вам нужно задать, где находится эта база данных. Чтобы сделать это с помощью Enterprise Manager, сначала вызовите мастер Configure Publishing and Distribution Wizard. Используйте этот мастер, чтобы задать публикование и распространение, указывая в окне Customize the Configuration (Настройка конфигурации), что вы хотите настроить параметры распространения (щелкнув на кнопке Yes). Это позволяет вам задать местоположение дистрибутивной базы данных вручную. (Это также позволяет вам выбирать имя для базы данных, активизировать публикование и создавать как публикации, так и подписчиков.)
К сожалению, используя этот мастер, вы не можете задавать размер дистрибутивной базы данных. Вы можете увеличить размер дистрибутивной базы данных, вызвав окно свойств этой базы данных в Enterprise Manager и изменив размер базы данных или файлов журнала транзакций. Если вы хотите одновременно задать местоположение базы данных и ее размер, то вы можете использовать хранимую процедуру sp_adddistributiondb.
Конфигурирование дистрибьютора с помощью sp_adddistributiondb
С помощью системной хранимой процедуры sp_adddistributiondb вы можете использовать сценарий создания дистрибутивной базы данных. Это полезно, когда вы хотите задать размер и местоположение этой базы данных и ее журнала транзакций. И написав сценарий, с помощью которого создается дистрибутивная база данных, вы можете использовать его для различных систем или для повторного создания дистрибутивной базы данных в случае реконфигурирования системы.
Синтаксис хранимой процедуры sp_adddistributiondb приводится в SQL Server Books Online. Ниже показан пример использования этой хранимой процедуры:
sp_adddistributor Dash
Следующий оператор SQL инициализирует систему с именем Dash как дистрибьютора.
sp_adddistributiondb @database=dist, @data_folder=’C:\mssql2000\data’, @data_file=’dist.mdf’, @data_file_size=10, @log_folder=’C:\mssql2000\data’, @log_file=’dist.ldf’, @log_file_size=2, @min_distretention=0, @max_distretention=72, @history_retention=96, @security_mode=0, @login=’sa’, @password=’’, @createmode=0
Мониторинг дистрибьютора
Мониторинг дистрибьютора осуществляется с помощью монитора производительности Microsoft Windows 2000 Performance Monitor (perfmon). В этом мониторе имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:
- SQLServer:Replication Agents. Указывает количество работающих агентов репликации каждого типа.
- SQLServer:Replication Dist. Предоставляет информацию о задержке при распространении.
- SQLServer:Replication Logreader. Предоставляет данные об активности и задержке агента Log Reader Agent
- SQLServer:Replication Merge. Предоставляет данные о частоте операций слияния
- SQLServer:Replication Snapshot. Предоставляет информацию о производительности репликации снимков.
Используя Performance Monitor для мониторинга этих значений, вы можете иногда определять наличие проблем производительности на дистрибьюторе. Данные perfmon дают массу полезной информации, но она не всегда идентифицирует проблемы. В случае мониторинга дистрибьютора нас больше всего интересует объект SQLServer:Replication Dist. Этот объект предоставляет следующие счетчики:
- Dist:Delivered Cmds/sec.Следит за количеством команд в секунду, переданных подписчику. Это дает вам хорошее представление об интенсивности операций на данном подписчике.
- Dist:Delivered Trans/sec. Следит за количеством транзакций в секунду, переданных подписчику. Этот счетчик также дает вам хорошее представление об интенсивности операций на данном подписчике.
- Dist:Delivery Latency. Следит за количеством времени, которое требуется для применения транзакций к подписчику после того, как они были доставлены на дистрибьютор. Это может дать вам некоторое представление о том, насколько перегружен дистрибьютор. (backed up).
Хотя эти счетчики являются в некотором смысле индикаторами того, как работает процесс распространения в целом, они недостаточно полезны, когда вы определяете, нужна ли вам настройка дистрибьютора, поскольку наиболее важным аспектом настройки дистрибьютора является настройка базы данных SQL Server. Вам следует на самом деле следить в основном за следующими проблемами:
- Высокий процент использования ЦП. Не слишком ли высока интенсивность использования одного или нескольких ЦП в течение длительных периодов (больше 75 процентов от их мощности)?
- Узкие места подсистемы ввода-вывода. Не слишком ли высока интенсивность использования ввода-вывода? Следите за количеством операций ввода-вывода в секунду и длительностью одной операции ввода-вывода.
- Время отклика.Не слишком ли велики значения времени отклика в SQL Server?
Настройка дистрибьютора
Как уже говорилось выше, дистрибьютор – это сервер, содержащий дистрибутивную базу данных, и эта база данных должна быть настроена таким же образом, как и любая другая база данных SQL Server. Вы можете повысить производительность дистрибьютора путем выбора состава системы, хотя, как вы знаете из лекции 6, в некоторых случаях это сложная задача. Дистрибьютор должен обладать достаточной мощностью, чтобы выполнять дополнительную работу. Дистрибьютор является "посредником" между издателями и подписчиками, и его следует сконфигурировать так, чтобы он не был узким местом. Ниже приводятся некоторые советы по конфигурированию и настройке дистрибьютора:
- Настройка подсистемы ввода-вывода. Обеспечьте, чтобы дистрибьютор, как и любая другая система SQL Server, имел достаточную мощность системы ввода-вывода.
- Используйте многопроцессорную систему.Мощность ЦП обычно не является проблемой, поскольку в большинстве случаев операции, выполняемые на дистрибьюторе, не требуют интенсивного использования ЦП. Однако вам следует использовать хотя бы два ЦП, чтобы можно было выполнять параллельные операции.
- Настраивайте операционную систему. Конфигурируйте службу Server , чтобы получать максимальную производительность для сетевых приложений. Это приведет к конфигурированию системы памяти в пользу приложений по сравнению с файловыми службами. Для этого нужно использовать значок Network в панели управления. Кроме того, удалите все службы, которые не будут использоваться, такие как IIS и FTP.
- Следите за дистрибьютором во время репликации моментальных снимков.При репликации снимков, которая используется, когда происходит копирование начального снимка в репликации транзакций и репликации слиянием, одновременно выполняется большое число операций ввода-вывода. Поскольку на дистрибьютор записывается такое количество данных, может возникнуть перегрузка подсистемы ввода-вывода дистрибьютора. В этой ситуации возрастает время, которое требуется для применения снимка. Поэтому вам нужно следить за дистрибьютором во время передачи снимка.
- Настраивайте SQL Server. Используя методы и рекомендации, полученные в этой книге, выполняйте настройку системы SQL Server.
Настройка репликации транзакций
В этом разделе вы узнаете, как конфигурировать и настраивать систему репликации транзакций для получения высокой производительности. Раздел начинается с обзора атрибутов репликации транзакций, после чего даются рекомендации по конфигурированию, мониторингу и настройке.
Атрибуты репликации транзакций
Репликация транзакций начинается с копирования снимка на дистрибьютор и затем на подписчик. После копирования снимка на дистрибьюторе начинает работать агент Log Reader Agent, который выполняет чтение журнала транзакций издателя в непрерывном режиме или в соответствии с регулярным расписанием. Периодичность чтения журнала транзакций определяется тем, как вы сконфигурировали Log Reader Agent. (Нагрузка, налагаемая на издатель при чтении журнала транзакций, – это единственная нагрузка на издатель, относящаяся к репликации.)
Транзакции, которые считываются агентом Log Reader Agent из журнала транзакций на издателе, помещаются в дистрибутивную базу данных. Затем эти транзакции передаются подписчикам. Имеются следующие факторы, которые могут ограничить производительность репликации транзакций.
- Производительность подсистемы ввода-вывода для журнала транзакций на издателе. Чтение журнала транзакций выполняется для того, чтобы определить, какие изменения были выполнены в базе данных. А поскольку во время репликации происходит не только чтение, но и запись в журнал транзакций, это может препятствовать последовательному доступу к журналу транзакций. При этом может возникать эффект узкого места. Чтобы избежать этого, журнал должен быть тщательно сконфигурирован.
- Производительность дистрибьютора.В зависимости от количества операций репликации и числа издателей, которые используют дистрибьютор, на этом дистрибьюторе могут возникать проблемы производительности. Ранее в этой лекции вы узнали, как конфигурировать и настраивать дистрибьютор.
- Производительность подписчика. В зависимости от выполняемых на подписчике операций на нем могут возникать проблемы производительности. Чтобы воспрепятствовать этим проблемам, выполните стандартную настройку в базе данных SQL Server этого подписчика.
Как видите, имеется ряд факторов, которые могут ограничивать производительность. Путем правильного выбора состава и конфигурирования используемых систем вы можете снизить влияние этих факторов и обеспечить высокую производительность.
Конфигурирование репликации транзакций
Конфигурирование системы репликации транзакций состоит из нескольких задач. Как уже говорилось в предыдущем разделе, вы должны правильно сконфигурировать журнал транзакций на издателе, поскольку он испытывает дополнительную нагрузку при использовании репликации. В этом разделе мы рассмотрим несколько других рекомендаций, о которых вы должны помнить при конфигурировании вашей системы репликации транзакций. Ниже приводится список этих рекомендаций.
- Сконфигурируйте достаточную мощность подсистем ввода-вывода на всех системах, участвующих в репликации в соответствии с общими рекомендациями по конфигурированию мощности подсистем ввода-вывода. (Возможно, вам потребуется сконфигурировать более высокую мощность ввода-вывода для журнала транзакций на издателе, чем это обычно требуется.)
- Увеличьте размер пакета фиксирования на дистрибьюторе.
- Настройте Log Reader Agent.
Конфигурирование достаточной мощности ввода-вывода
Конфигурируя достаточную мощность подсистем ввода-вывода, вы можете повысить производительность всего процесса репликации. Как и в любой системе SQL Server, журнал транзакций системы, участвующей в репликации, должен находиться для защиты данных на своем томе RAID 1. Файлы данных должны находиться на одном или нескольких томах RAID 10 или RAID 5. В отличие от репликации снимков для репликации транзакций требуются лишь небольшие изменения в стандартных конфигурациях ввода-вывода. Эти требования описаны в данном разделе.
Конфигурирование подсистемы ввода-вывода на издателе. В общем случае при конфигурировании подсистемы ввода-вывода издателя вы должны следовать стандартным рекомендациям по конфигурированию SQL Server, описанным на протяжении этой книги. Однако для журнала транзакций издателя может потребоваться более высокая мощность ввода-вывода, чем это обычно требуется. Обычно журнал транзакций следует конфигурировать на томе RAID 1. При необходимости (это зависит от степени занятости вашей системы) вам следует сконфигурировать его на томе RAID 10, используя большее количество дисков. RAID 5 не подходит для журнала транзакций.
Конфигурирование подсистемы ввода-вывода на дистрибьюторе. Дистрибьютор следует конфигурировать таким образом, чтобы дистрибутивная база данных имела собственный журнал транзакций на выделенном томе RAID 1. Это позволит получить максимальную производительность для журнала дистрибутивной базы данных, что повысит производительность самого дистрибьютора.
Конфигурирование подсистемы ввода-вывода на подписчике. При репликации транзакций не требуется какого-либо особого конфигурирования ввода-вывода на подписчике. Просто следуйте общим рекомендациям по определению состава и конфигурации систем, описанным на протяжении этой книги.
Конфигурирование размера пакета фиксирования на дистрибьюторе. Размер пакета фиксирования на дистрибьюторе определяет, сколько транзакций репликации фиксируются на дистрибьюторе в одном пакете. Если увеличить размер пакета, то за один раз будет фиксироваться больше строк, что увеличит время, в течение которого таблицы дистрибутивной базы данных будут недоступны для других процессов. (Во время модификации базы данных происходит захват блокировок по таблицам.) Если снизить размер пакета, то за один раз будет фиксироваться меньше строк, что дает возможность более быстрого доступа других процессов к дистрибутивной базе данных.
При большом количестве операций, применяемых к дистрибутивной базе данных другими источниками (то есть издателем и несколькими подписчиками) попытайтесь снизить размер пакета. Если Log Reader Agent запускается в соответствии с периодическим расписанием и получает много транзакций для единовременной вставки в дистрибутивную базу данных, то вам, видимо, поможет увеличение размера пакета. Может быть, вам не потребуется изменять размер пакета; но если вы будете делать это, сравните отличия в производительности при увеличении и уменьшении этого размера, чтобы определить, какой вариант лучше.
Вы можете конфигурировать размер пакета фиксирования в Enterprise Manager, вызвав окно свойств агента распространения Distribution Agent. (См. раздел "Мониторинг и управление агентами репликации" в лекции 26.)
Настройка Log Reader Agent
Как уже говорилось, операции чтения журнала транзакций издателя, выполняемые агентом Log Reader Agent, могут приводить к прерыванию операций ввода-вывода, которые обычно выполняются последовательным образом. Конфигурируя Log Reader Agent, вы можете снизить его влияние на этот журнал. Существует несколько способов сделать операции Log Reader Agent более эффективными. Один из способов – это использование дискового контроллера с кэшем для дискового тома с этим журналом. Поскольку Log Reader Agent выполняет чтение с диска журнала, то кэш на контроллере позволит осуществлять чтение из этого кэша вместо применения операций ввода-вывода с произвольным доступом.
Еще один способ настройки Log Reader Agent – это его конфигурирование для менее частого запуска. Log Reader Agent может работать в непрерывном режиме или периодически. Если в вашей системе не происходит большого количества модификаций, то, возможно, Log Reader Agent может работать непрерывно без нарушения доступа к журналу транзакций. Но при высоком уровне занятости журнала транзакций вашей системы вы можете увеличить производительность издателя, задав менее частые запуски Log Reader Agent. Тогда Log Reader Agent будет выполнять чтение из журнала транзакций реже, что позволит сохранить последовательный доступ для операций ввода-вывода этого журнала.
И еще одним способом повышения эффективности Log Reader Agent в системах с высокой нагрузкой является увеличение размера пакета чтения. Этот размер определяет, сколько транзакций считывается из журнала транзакций и копируется на дистрибьютор за один раз. Использование этого параметра в системах с высокой нагрузкой может повысить производительность. Кроме того, увеличение размера пакета чтения может оказаться полезным при увеличении интервала опроса. Увеличивая размер пакета чтения для Log Reader Agent, вам следует также увеличить размер пакета фиксирования транзакций на дистрибьюторе, чтобы привести его в соответствие с новым размером пакета чтения.
Вы можете конфигурировать агент Log Reader Agent путем вызова окна его свойств в Enterprise Manager. (См. раздел "Мониторинг и управление агентами репликации" в лекции 26.)
Мониторинг системы репликации транзакций
Мониторинг операций репликации транзакций выполняется так же, как и мониторинг других типов репликации, т.е. через Performance Monitor (perfmon). В perfmon имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:
- SQLServer:Replication Agents. Указывает количество работающих агентов репликации каждого типа.
- SQLServer:Replication Dist. Предоставляет информацию о задержке при распространении. Длительные задержки могут быть признаком того, что дистрибьютор перегружен.
- SQLServer:Replication Logreader. Предоставляет данные об активности и задержке агента Log Reader Agent. Следите за длительными задержками. Это может быть признаком того, что имеется проблема, касающаяся чтения журнала транзакций на издателе агентом Log Reader Agent. Кроме того, следите за количеством переданных транзакций в секунду. При большом количестве вам, возможно, требуется более мощная подсистема ввода-вывода на дисковых томах журнала транзакций.
Используя Performance Monitor для мониторинга этих значений, вы можете определить наличие проблем производительности Log Reader Agent или дистрибьютора. Данные perfmon дают массу полезной информации, но она не всегда идентифицирует проблемы.
Настройка системы репликации транзакций
Основные шагами в настройке системы репликации транзакций являются надлежащее конфигурирование и мониторинг системы, как это описано в предыдущих разделах. Кроме того, после ввода системы в эксплуатацию, когда вы можете выполнять ее мониторинг, вам, возможно, потребуется изменение интервала опроса. Обычно вполне подходит значение по умолчанию, равное 10 секундам. При увеличении частоты опроса (т.e. уменьшении интервала опроса) транзакции реплицируются быстрее, но увеличивается нагрузка на журнал транзакций. При уменьшении частоты опроса (т.e. увеличении интервала опроса) вы снижаете нагрузку на журнал транзакций, но время репликации транзакций увеличивается.
Кроме того, если в вашей системе происходят частые обновления, вам может потребоваться увеличение размера пакета чтения. Как уже говорилось, это позволит агенту Log Reader Agent считывать за один раз больше транзакций. Если увеличить это значение и оставить интервал опроса в 10 секунд, то будет реплицироваться больше транзакций и станет меньше дополнительная нагрузка.
Вам может также потребоваться мониторинг производительности сети и (при необходимости) ее увеличение, как и в случае репликации снимков. Если ваша система работает неадекватным образом, например, если центральные процессоры и подсистемы ввода-вывода достигли предела своих возможностей, а процесс репликации занимает слишком много времени, то у вас, возможно, имеются сетевые проблемы. К сожалению, сетевые проблемы нельзя диагностировать с помощью perfmon. Следует использовать продукт для мониторинга сети, такой как Microsoft Systems Management Server (SMS). Выполните мониторинг сетевой платы, чтобы определить, не достигла ли она предела своих возможностей.
И, наконец, помните, что издатель, дистрибьютор и подписчики – это системы SQL Server. Поэтому вам следует настраивать эти системы точно так же, как и любую другую систему SQL Server. Рекомендации по настройке систем SQL Server приводятся на протяжении всей этой книги.
Реализация репликации транзакций
В этом разделе вы узнаете о методах реализации репликации транзакций. Она может быть реализована по схеме "один-к-многим" или "многие-к-одному". Репликация транзакций часто реализуется через глобальную сеть (WAN).
Репликация типа "один-к-многим"
В большинстве реализаций репликации транзакций используется схема "один-к-многим". При этом типе реализации одна таблица публикуется для одного или нескольких подписчиков.
Репликация типа "многие-к-одному"
В схеме репликации "многие-к-одному" одна база данных подписывается на более чем одну подписку. Это не самая распространенная схема репликации, но тем не менее она широко используется. Поскольку репликация транзакций выполняется путем чтения журнала транзакций на издателе и применения операций вставки, обновления и удаления на подписчике, то она прекрасно подходит для этой схемы репликации. Единственным потенциальным недостатком является то, что подписывающаяся таблица должна иметь определенный в ней первичный ключ. И если источники ваших данных не портят этот первичный ключ, то схема репликации "многие-к-одному" работает должным образом.
Репликация через глобальную сеть (WAN)
Репликация через глобальную сеть не только возможна, но и довольно широко распространена. Если вы реплицируете данные через глобальную сеть, то вам следует непрерывно следить за операциями распространения и выявлять случаи слишком длительной репликации, связанные с ограничениями пропускной способности сети. Кроме того, если возможно, конфигурируйте репликацию таким образом, чтобы взаимодействие через глобальную сеть выполнялось только агентом Distribution Agent. Это означает конфигурирование системы таким образом, чтобы дистрибьютор и издатель находились по одну сторону глобальной сети.
Заключение
В этой лекции вы ознакомились с основами репликации транзакций. Вы узнали, что такое репликация транзакций, как она выполняется, как осуществлять ее мониторинг и как ее настраивать. Понимание механизма действия репликации транзакций и результатов ее работы поможет вам в ее эффективном использовании и конфигурировании. В следующей лекции вы узнаете о репликации слиянием.
Лекция 28. Репликация слиянием
Репликация слиянием отличается от репликации транзакций тем, что она по своей сути является многонаправленной. При использовании репликации слиянием издатели и подписчики могут равным образом обновлять публикацию. Репликация транзакций также позволяет подписчикам обновлять публикацию, но эти два типа репликации выполняются совершенно различным образом. В этой лекции вы узнаете, как действует репликация слиянием и как выполнять ее конфигурирование, мониторинг и настройку.
Введение в репликацию слиянием
При репликации слиянием происходит многонаправленная репликация между издателем и одним или несколькими подписчиками. Это позволяет нескольким системам иметь модифицируемые копии публикации и модифицировать свои собственные копии. Модификация на издателе будет реплицироваться подписчикам. Модификация на подписчике будет реплицироваться издателю и затем реплицироваться остальным подписчикам.
В отличие от репликации транзакций репликация слиянием осуществляется путем инсталляции триггеров на издателе и на подписчиках. При каждом изменении в публикации или в одной из ее копий происходит активизация соответствующего триггера, который помещает в очередь команду репликации для отправки в дистрибутивную базу данных. Эта команда, в конце концов, передается в дистрибутивную базу данных и затем передается на системы, участвующие в репликации. В связи с таким способом работы репликация слиянием создает значительно более высокую нагрузку (в особенности на издателе), чем репликация транзакций.
Как вы узнаете из этой лекции, ключевыми компонентами системы репликации слиянием являются агент слияния Merge Agent и дистрибутивная база данных. Merge Agent согласует (выполняет слияние) накапливающиеся изменения, которые были внесены после предыдущего согласования. В случае репликации слиянием агент распространения (Distribution Agent) не используется – Merge Agent взаимодействует как с и издателем, так и с дистрибьютором. Агент создания снимка (Snapshot Agent) используется только для создания начальной базы данных. Merge Agent выполняет следующие задачи:
- Merge Agent загружает все изменения с подписчика.
- Все строки без конфликта (строки, которые не были одновременно модифицированы и на издателе, и на подписчике), загружаются сразу; конфликтующие строки (строки, модифицированные на обеих системах) отправляются арбитру. Арбитр – это модуль, который используется для разрешения конфликтов в репликации слиянием. Вы можете конфигурировать этот модуль для разрешения конфликтов в соответствии с вашими требованиями.
- Все изменения применяются к издателю.
- Merge Agent загружает все изменения с издателя.
- Все строки без конфликта загружаются сразу; конфликтующие строки отправляются арбитру.
- Все изменения применяются к подписчику.
Этот процесс повторяется в соответствии с тем, как он запланирован. В случае push-подписок (принудительных подписок) агент Merge Agent запускается на издателе. В случае pull-подписок (подписок по запросу) Merge Agent запускается на подписчике. Каждая публикация в репликации слиянием имеет своего собственного агента Merge Agent.
Виды использования репликации слиянием
Репликация слиянием используется при необходимости многонаправленной репликации. Репликация слиянием находит разнообразное применение. То, что подписчики могут модифицировать данные, повышает уровень ее гибкости и применимости. В частности, репликация слиянием может находить следующее применение:
- Совместное использование данных отделами. Отделы, обрабатывающие, например, платежные ведомости, счета кредиторов и счета дебиторов, могут иметь доступ к одним и тем же данным. Пользователи каждого отдела могут модифицировать эти данные и получать слияние изменений на системах других отделов.
- Совместная работа с данными в нескольких точках. Репликацию слиянием можно использовать в тех случаях, когда пользователям в нескольких точках требуются одни и те же данные и внесение изменений в эти данные.
- Передача сообщений.Репликацию слиянием можно использовать как систему передачи сообщений, в которой можно модифицировать данные и отправлять изменения назад в исходную систему.
Конфигурирование системы репликации слиянием
Конфигурирование репликации слиянием происходит аналогично конфигурированию репликации моментальных снимков и репликации транзакций. Сначала вы должны сконфигурировать публикацию и затем задать, чтобы она принудительно передавалась подписчику (push-подписка) или запрашивалась подписчиком (pull-подписка).
Конфигурирование публикаций
Несмотря на то, что процесс конфигурирования публикаций был описан в лекциях 26 и 27, здесь приводятся процедуры, используемые с целью создания публикаций для репликации слиянием, поскольку они несколько отличаются от процедур, используемых для создания публикаций других типов. Чтобы сконфигурировать публикацию для репликации слиянием, выполните следующие шаги.
- В окне Enterprise Manager щелкните на меню Tools. Далее укажите пункт Replication (Репликация) и выберите команду Create аnd Manage Publications (Создание и управление публикациями); или выберите пункт Wizards (Мастера), раскройте папку Replication в появившемся в диалоговом окне и выберите Create Publication Wizard (Мастер создания публикации). При любом способе появится диалоговое окно Create аnd Manage Publications (рис. 28.1). В этом диалоговом окне вы можете выбрать базу данных или таблицу, содержащую данные, которые вы хотите публиковать.
Рис. 28.1. Диалоговое окно Create аnd Manage Publications (Создание и управление публикациями) Если публикации уже существуют, то в дополнение к кнопке Create Publication (Создать публикацию) будут доступны следующие кнопки:- Push New Subscription (Новая push-подписка). Позволяет вам создать новую push-подписку для уже существующей публикации. (Cм. раздел "Конфигурирование подписок" далее.)
- Properties and Subscriptions (Свойства и подписки).Позволяет вам модифицировать свойства как публикаций, так и подписок.
- Script Publication (Сценарий создания публикации).Позволяет вам создать сценарий, который можно использовать для создания других публикаций.
- Delete Publication (Удалить публикацию).Позволяет вам удалить уже сконфигурированную публикацию.
- Выберите базу данных, которую хотите использовать для данной публикации (на рис. 28.1 выбрана база данных Northwind), и затем щелкните на кнопке Create Publication для вызова мастера Create Publication Wizard. Появится начальное окно мастера (рис. 28.2). Установите флажок Show advanced options in this wizard (Показать дополнительные параметры в этом мастере).
Рис. 28.2. Начальное окно мастера Create Publication Wizard - Щелкните на кнопке Next, чтобы появилось окно Choose Publication Database (Выбор базы данных для публикации) (рис. 28.3). В этом окне вы можете (снова) выбрать базу данных, содержащую данные, которые хотите публиковать. По умолчанию будет выделена база данных, выбранная вами на шаге 2.
Рис. 28.3. Окно Choose Publication Database (Выбор базы данных для публикации) - Щелкните на кнопке Next, чтобы появилось окно Select Publication Type (Выбор типа публикации) (рис. 28.4).
Рис. 28.4. Окно Select Publication Type (Выбор типа публикации)В этом окне вы можете выбрать один из трех типов репликации. Будут представлены следующие варианты выбора:- Snapshot publication (Публикация для репликации снимков).Создает публикацию для репликации снимка соответствующей статьи, который периодически копируется на подписчик. Такую публикацию можно создавать из любой таблицы.
- Transactional publication (Публикация для репликации транзакций). Создает публикацию для репликации транзакций, в соответствии с которыми происходит обновление подписки изменениями, выполненными на издателе. Статьи могут создаваться только из таблиц с первичным ключом.
- Merge publication (Публикация для репликации слиянием).Создает публикацию для репликации слиянием, которая позволяет выполнять двустороннюю репликацию между издателем и подписчиком. Статьи могут создаваться из любых таблиц.
- Щелкните на кнопке выбора Merge publication и щелкните на кнопке Next, чтобы появилось окно Specify Subscriber Types (Указание типов подписчиков) (рис. 28.5). В этом окне вы можете указывать, будут ли все подписчики использовать SQL Server. Если возможно, используйте установку по умолчанию, которая указывает, что все серверы-подписчики будут работать с SQL Server 2000 (Servers running SQL Server 2000). Если вас устраивает этот выбор, то вы конфигурируете репликацию для использования собственных типов данных SQL Server 2000. Если в вашей конфигурации имеются системы с SQL Server 7, установите второй флажок. Если используются устройства SQL Server CE, установите третий флажок. Если в вашей конфигурации имеются системы, не использующие SQL Server, вам следует установить четвертый флажок, который указывает, что данные репликации будут преобразовываться в символьный формат. Это преобразование сложных собственных типов данных приводит к дополнительной нагрузке на серверы.
Рис. 28.5. Окно Specify Subscriber Types (Указание типов подписчиков) - Щелкните на кнопке Next, чтобы появилось окно Specify Articles (Указание статей) (рис. 28.6). В этом окне вы можете указывать таблицы, хранимые процедуры и представления, которые будут реплицироваться как статьи. Эти статьи образуют публикацию, которую вы создаете. Выберите все нужные вам таблицы, хранимые процедуры и представления в правой части окна или установите один или несколько флажков в колонке Publish All (Публиковать все) для выбора всех элементов объектов соответствующего типа в базе данных. Напомним, что каждый объект рассматривается как статья, а публикация – это набор логически сгруппированных статей.
Рис. 28.6. Окно Specify Articles (Указание статей)Примечание.Если на подписчике имеются хранимые процедуры, то репликацию можно сконфигурировать таким образом, чтобы реплицировать вызовы этих хранимых процедур, а не результаты вызовов хранимых процедур. - Поскольку мы указываем репликацию слиянием, то можно определить дополнительные атрибуты по статьям. Чтобы сконфигурировать эти атрибуты, сначала щелкните на кнопке [...] справа от определения соответствующей статьи. Появится окно Article Properties (Свойства статьи) (рис. 28.7).
Рис. 28.7. Вкладка General окна Table Article Properties (Свойства статьи)Во вкладках этого окна вы можете конфигурировать различные свойства статьи. На рис. 28.7 показана вкладка General (Общие). Здесь вы можете задавать имя статьи и владельца целевой базы данных, а также определять, что считается конфликтом. Принятый по умолчанию вариант (вторая кнопка выбора) указывает, что модификации, которые вносятся в одну колонку двумя источниками, будут рассматриваться как конфликт. Вы можете расширить это определение (первая кнопка выбора), указав, что изменения, которые вносятся в одну строку двумя источниками, будут рассматриваться как конфликт. - Щелкните на вкладке Resolver (Арбитр) (рис. 28.8), чтобы выбрать арбитра. При использовании арбитра по умолчанию (первая кнопка выбора) издатель всегда "выигрывает" конфликт у подписчика. Кроме того, для синхронизации первый подписчик всегда "выигрывает" конфликт среди подписчиков. Обычно это желательный способ разрешения конфликтов. Вы можете вместо этого выбрать один из ряда других арбитров, включая настраиваемые арбитры, которые вы можете определять самостоятельно.
Рис. 28.8. Вкладка Resolver (Арбитр) окна Table Article Properties - Во вкладке Merging Changes (Изменения при слиянии) (рис. 28.9), вы можете задавать дополнительную проверку безопасности для определенных операций. Установив один или несколько флажков в секции Check Permissions (Проверка полномочий) вы указываете, что перед выполнением определенной операции или операций будут проверяться полномочия агента Merge Agent на выполнение этой операции или операций. Кроме того, эта вкладка содержит флажок, который установлен по умолчанию. Этот флажок указывает, что изменения нескольких колонок в одной строке будут выполняться в виде одной операции с оператором UPDATE. Вам следует согласиться с этой установкой по умолчанию. Когда будете готовы продолжить работу, щелкните на кнопке OK.
- Щелкните на кнопке Next. На данном этапе происходит проверка публикации, и, скорее всего, вы увидите окно (рис. 28.10). Для репликации слиянием требуется колонка с уникальным идентификатором. Эта колонка автоматически добавляется в таблицу. Кроме того, колонки типа identity будут создаваться с параметром NOT FOR REPLICATION (Не для репликации).
Рис. 28.9. Вкладка Merging Changes (Изменения при слиянии) окна Table Article Properties
Рис. 28.10. Окно Article Issues (Вопросы по статьям)
- Щелкните на кнопке Next. Появится окно Select Publication Name and Description (Выбор имени и описания публикации) (рис. 28.11). В этом окне вы указываете имя и описание публикации.
- Щелкните на кнопке Next, чтобы появилось окно Customize the Properties of the Publication (Настройка свойств данной публикации) (рис. 28.12). В этом окне вы указываете, хотите ли определять фильтры данных и настраивать другие свойства публикации. Щелкните на кнопке No (Нет). (О возможностях, которые появляются при щелчке на кнопке Yes см. лекцию 27.)
Рис. 28.11. Окно Select Publication Name and Description (Выбор имени и описания публикации)
Рис. 28.12. Окно Customize the Properties of the Publication (Настройка свойств данной публикации) - Щелкните на кнопке Next. Появится окно мастера Completing the Create Publication Wizard (Завершение работы мастера создания публикации). Щелкните на кнопке Finish (Готово), и для вас будет создана публикация. Вы увидите ход выполнения по мере завершения различных шагов. И, наконец, вы увидите окно, в котором показаны выполненные шаги и сводка результатов.
Если вы посмотрите теперь содержимое папки Replication Monitor для агентов слияния Merge Agent, то обнаружите, что там ничего нет. Поскольку агенты Merge Agent используются для двусторонней репликации, то прежде чем начать репликацию, вам необходимо сконфигурировать подписчиков. После того как вы сконфигурируете подписчиков, Merge Agents появятся в папке Replication Monitor.
Конфигурирование подписок
Аналогично репликации моментальных снимков и репликации транзакций последним шагом в конфигурировании репликации слиянием является конфигурирование подписчиков. Сначала вы должны активизировать подписчиков в дистрибутивной базе данных; этот процесс был описан в разделе "Активизация подписчиков" лекции 26. Затем вы конфигурируете подписки со стороны подписчика или издателя. Со стороны подписчика вы можете конфигурировать pull-подписку; со стороны издателя вы можете конфигурировать push-подписку.
Конфигурирование pull-подписок
Управление и конфигурирование pull-подписок осуществляется со стороны подписчика. Тем самым вы должны конфигурировать pull-подписку с помощью Enterprise Manager в системе подписчика. Мы уже видели в разделе "Конфигурирование pull-подписок" лекции 27, как конфигурировать pull-подписку. Поскольку в данном случае используются почти те же шаги, мы приведем краткое описание и выделим отличия.
- Вызовите окно мастера Pull Subscription Wizard (Мастер pull-подписки).
- Появится начальное окно Pull Subscription Wizard.
- Щелкните на кнопке Next, чтобы появилось окно Look for Publications (Поиск публикаций) Выберите для данного примера зарегистрированные серверы.
- Щелкните на кнопке Next, чтобы появилось окно Choose Publications (Выбор публикаций), и выберите публикацию, которую хотите реплицировать.
- Щелкните на кнопке Next, чтобы появилось окно Specify Synchronization Agent Login (Задать учетную запись подключения [login-запись] для агента синхронизации), и укажите, какую учетную запись будет использовать агент слияния для взаимодействия с издателем и дистрибьютором.
- Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (Выбор целевой базы данных), и выберите базу данных.
- Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки), и щелкните на нужной кнопке выбора.
- Щелкните на кнопке Next, чтобы появилось окно Snapshot Delivery (Доставка снимка), и укажите местоположение для снимка.
- Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Schedule (Задать расписание для агента слияния). Это окно аналогично окну Set Distribution Agent Schedule, которое вы видели в предыдущей лекции. Сделайте свой выбор в этом окне.
- Щелкните на кнопке Next, чтобы появилось окно Set Subscription Priority (Задать приоритет подписки) (рис. 28.13). Здесь вы можете задать значение приоритета подписки, которое будет использовано для определения "победителя" конфликта. Вариант по умолчанию (рекомендованный) указывает, что для разрешения конфликта будет использоваться значение приоритета по издателю.
- Щелкните на кнопке Next, чтобы появилось окно Start Required Services (Запуск требуемых служб), и запустите SQL Server Agent, если он еще не запущен.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Pull Subscription Wizard (Завершение работы мастера pull-подписки). Просмотрите ваши установки и затем щелкните на кнопке Finish. По окончании вашей работы с этим мастером будет создана pull-подписка, которая будет обновляться в соответствии с регулярным расписанием.
Рис. 28.13. Окно Set Subscription Priority (Задать приоритет подписки)
Конфигурирование push-подписок
Push-подписка (принудительная подписка) инициируется на издателе. Push-подписка конфигурируется с помощью мастера Push Subscription Wizard (Мастер push-подписки). Для запуска этого мастера выполните следующие шаги:
- Вызовите Push Subscription Wizard, используя один из двух методов. Для использования первого метода укажите пункт Replication в меню Tools окна Enterprise Manager и затем выберите пункт Push Subscription to Others (Push-подписка для других). Появится диалоговое окно Create and Manage Publications (Создание и управление публикациями) (рис. 28.14).
Рис. 28.14. Публикация, выбранная в диалоговом окне Create and Manage Publications (Создание и управление публикациями)Выделите публикацию в списке Databases and Publications (Базы данных и публикации) и затем щелкните на кнопке Push New Subscription (Создать push-подписку). Чтобы использовать второй метод, выберите из меню Tools пункт Wizards, раскройте папку Replication в появившемся диалоговом окне Select Wizards, выберите Create Push Subscription Wizard и щелкните на кнопке OK. Выделите публикацию в появившемся диалоговом окне Create and Manage Publications и затем щелкните на кнопке Push New Subscription. - Появится начальное окно мастера Push Subscription Wizard (рис. 28.15).
Рис. 28.15. Начальное окно мастера Push Subscription Wizard - Щелкните на кнопке Next, чтобы появилось окно Choose Subscribers (Выбор подписчиков) (рис. 28.16). В этом окне выбирается система, которая будет получателем выбранной вами публикации. Сделайте выбор из списка активизированных подписчиков.
Рис. 28.16. Окно Choose Subscribers (Выбор подписчиков) - Щелкните на кнопке Next, чтобы появилось окно Choose Destination Database (рис. 28.17). В этом окне вы указываете базу данных, в которой будет размещаться данная публикация на подписчике. Вы можете выбрать базу данных, которая уже существует, или создать новую базу данных – в зависимости от конфигурации вашей системы и ваших требований. Чтобы увидеть список существующих баз данных, щелкните на кнопке Browse Or Create (Обзор или создание). Если вы хотите создать базу данных, щелкните на кнопке Browse Or Create, щелкните на кнопке Create New (Создать новую) и затем создайте базу данных в появившемся окне Database Properties (Свойства базы данных).
Рис. 28.17. Окно Choose Destination Database - Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Location (Задать местоположение для агента слияния) (рис. 28.18). Здесь вы можете выбрать, где будет запускаться Merge Agent. Вы можете согласиться с вариантом, принятым по умолчанию, который указывает запуск Merge Agent на дистрибьюторе, или выбрать запуск агента на подписчике. Если ваш дистрибьютор не слишком сильно загружен, вам следует принять вариант по умолчанию.
Рис. 28.18. Окно Set Merge Agent Location (Задать местоположение для агента слияния) - Щелкните на кнопке Next, чтобы появилось окно Set Merge Agent Schedule (рис. 28.19). В этом окне вы можете выбрать непрерывные обновления или обновления по указанному вами расписанию. Щелкните на кнопке Change, чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий). Здесь вы можете легко конфигурировать повторяющееся расписание. Принимая решение о том, как обновлять подписку, помните, что непрерывные обновления сопряжены с большой нагрузкой на систему.
Рис. 28.19. Окно Set Merge Agent Schedule (Задать расписание для агента слияния)
- Щелкните на кнопке Next, чтобы появилось окно Initialize Subscription (Инициализация подписки) (рис. 28.20).
Рис. 28.20. Окно Initialize Subscription (Инициализация подписки)В этом окне вы указываете, нужно ли инициализировать данную подписку. По умолчанию выбран вариант инициализации схемы и набора данных на подписчике. В этом окне вы можете также запустить Snapshot Agent, если он еще не запущен. Имеет смысл запускать Snapshot Agent, когда вы инициализируете снимок; в противном случае вам придется запускать этот агент вручную. После того как снимок инициализирован и начинается репликация, вам не нужно использовать снимок, пока не потребуется создать новую подписку. Каждый раз, как вы создаете подписку, создавайте новый снимок, и вам больше не нужно создавать снимки в соответствии с каким-либо расписанием, если только вам не потребуется ресинхронизация базы данных подписчика с использованием снимков. - Щелкните на кнопке Next, чтобы появилось окно Set Subscription Priority (рис. 28.21). Здесь вы можете задать значение приоритета подписки, которое будет использовано для определения "победителя" конфликта. Вариант по умолчанию (рекомендованный) указывает, что для разрешения конфликта будет использоваться значение приоритета по издателю.
Рис. 28.21. Окно Set Subscription Priority (Задать приоритет подписки) - Щелкните на кнопке Next, чтобы появилось окно Start Required Services (рис. 28.22), где вы можете задать запуск агента SQL Server Agent, если он еще не запущен.
Рис. 28.22. Окно Start Required Services - Щелкните на кнопке Next, чтобы появилось окно Completing the Push Subscription Wizard (Завершение работы мастера push-подписки) (рис. 28.23). Просмотрите сводку ваших установок и затем щелкните на кнопке Finish, чтобы начать процесс копирования снимка подписчику. После завершения работы этого мастера создается push-подписка, которая будет обновляться на регулярной основе.
Рис. 28.23. Окно Completing the Push Subscription Wizard
Управление репликацией
Теперь вы знаете, как создавать и конфигурировать реплицируемую базу данных в среде SQL Server 2000. Чтобы управлять этой реплицируемой средой или устранять проблемы, если репликация не запускается, вы будете использовать возможности мониторинга и параметры конфигурирования в Enterprise Manager.
Мониторинг и управление агентами репликации
Агенты репликации можно найти в папке Replication Monitor окна Enterprise Manager. Для доступа к этим агентам выполните следующие шаги.
- Раскройте группу серверов, раскройте сервер и затем раскройте папку Replication Monitor.
- Если сервер, который вы раскрыли, является издателем, то под папкой Replication Monitor появится папки Publishers (Издатели) и Agents (Агенты). В папке Publishers находятся издатели, которые принадлежат данному серверу. В папке Agents находятся папки для агентов Snapshot Agents, Log Reader Agents, Distribution Agents, Merge Agents и различных агентов (папка Miscellaneous Agents), которые используются для очистки и протоколирования выполняемых операций.
- Хотя обычно не требуется запускать или прекращать работу агентов, вы можете использовать для этого Replication Monitor. Если создается впечатление, что ваша реплицируемая система не работает после того, как вы сконфигурировали ее, то вполне вероятно, что не запущен агент Snapshot Agent, возможно, из-за того, что этот агент использует принятое по умолчанию расписание. (Именно поэтому в процессе конфигурирования вы имеете возможность сразу инициализировать создание снимка.) Проверяйте состояние агентов, щелкая на папке соответствующих агентов в Enterprise Manager и просматривая информацию об этих агентах в правой панели (рис. 28.24). Здесь вы можете определить, был ли запущен данный агент, и можете запустить его при необходимости. После запуска агента он действует, пока не закончит свою работу, после чего он становится неактивным. После этого SQL Server Agent будет запускать этот агент репликации, исходя из его регулярного расписания.
увеличить изображение
Рис. 28.24. Агент Merge Agent, представленный в окне Enterprise Manager - Щелкните правой кнопкой мыши на агенте, чтобы появилось контекстное меню, содержащее ряд опций, которые вы можете использовать для мониторинга и управления агентами. Меню, которое появляются для агента Merge Agent (рис. 28.25).
Ниже описываются опции меню для агента Merge Agent.
- Error Details (Подробности ошибок).Выводятся подробное описание возникших ошибок.
- Agent History (Журнал работы агента). Выводится протокол операций агента.
- Agent Properties (Свойства агента).Позволяет вам модифицировать расписание работы агента репликации. Вы можете также модифицировать метод доступа к базе данных, задачи данного агента и уведомления. Кроме того, вы можете задать получение сообщений электронной почты, оповещающих вас о событиях данного агента.
увеличить изображение
Рис. 28.25. Опции агента Merge Agent - Agent Profiles (Профили агента). Позволяет вам просматривать и модифицировать параметры агента, такие как тайм-ауты учетной записи подключения (login), размер пакета и тайм-ауты запросов.
- Run Agent At Subscriber (Запуск агента на подписчике). Позволяет указывать запуск агента на подписчике.
- Run Agent At Distributor (Запуск агента на дистрибьюторе). Позволяет указывать запуск агента на дистрибьюторе.
- Start Agent и Stop Agent (Запуск агента и Остановка агента). Позволяют вам запускать агент, если он остановлен, или останавливать его, если он запущен.
- Refresh Rate And Settings (Частота и параметры обновления). Позволяет вам модифицировать частоту обновления данных монитора производительности Performance Monitor.
- Select Columns (Выбрать колонки). Позволяет вам указывать, какие колонки просматриваются в панели результатов.
- Show Anonymous Subscriptions (Показать анонимные подписки). Указывает, будут ли показаны анонимные подписки в этом окне.
- Help (Справка). Справочная информация для данного окна.
Конфигурирование Merge Agent
После создания публикации вам, возможно, потребуется модифицировать поведение агента слияния Merge Agent. Например, вы можете задать, как происходит вызов Merge Agent, выбрав режим, в котором он будет работать. В непрерывном режиме запуск Merge Agent происходит при запуске SQL Server Agent. В режиме расписания (который является предпочтительным режимом) Merge Agent запускается в соответствии с расписанием и переходит в неактивное состояние после доставки всех реплицируемых транзакций. Чтобы сконфигурировать Merge Agent, выполните следующие шаги.
- В окне Enterprise Manager раскройте сервер, раскройте папку Replication Monitor, раскройте папку Agents и затем щелкните на папке Merge Agents.
- В правой панели Enterprise Manager щелкните правой кнопкой мыши на публикации и выберите из появившегося контекстного меню пункт Agent Properties (Свойства агента).
- Появится окно свойств данного агента Merge Agent (рис. 28.26).
Рис. 28.26. Вкладка General окна свойств Merge Agent - Щелкните на вкладке Steps (Шаги) (рис. 28.27).
Рис. 28.27. Вкладка Steps (Шаги) окна свойств Merge AgentВ этой вкладке вы увидите шаги, которые выполняет данный Merge Agent, когда происходит его вызов. Здесь выводятся и описываются три следующих шага.- Merge Agent Startup Message (Сообщение о запуске агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение (таблица MSLogreader_history в дистрибутивной базе данных).
- Run Agent (Запуск агента). Запуск данного агента в соответствии с заданным расписанием. При работе в непрерывном режиме этот агент работает, пока не будет отключена система.
- Detect Nonlogged Agent Shutdown (Обнаружено незарегистрированное отключение агента). В таблицу журнала работы агента Log Reader Agent помещается сообщение в случае отключения агента.
- Выделите шаг Run Agent и щелкните на кнопке Edit (Редактировать), чтобы появилось диалоговое окно Edit Job Step (Редактирование шага) (рис. 28.28). В этом диалоговом окне вы можете конфигурировать способ вызова Merge Agent.
Рис. 28.28. Вкладка General диалогового окна Edit Job Step (Редактирование шага)Для агента Merge Agent можно сконфигурировать много параметров. Параметры по умолчанию этого агента можно модифицировать в окне Command (Команда) диалогового окна Edit Job Step и в диалоговом окне Replication Agent Profile Details (Детали профиля агента репликации), которое описано ниже в этой лекции. Здесь описаны два параметра, которые вы можете модифицировать в диалоговом окне Edit Job Step. Д- Continuous (Непрерывный). Указывает, работает ли Merge Agent в непрерывном режиме. Чтобы задать режим расписания, удалите этот параметр.
- DistributorSecurityMode (Режим безопасности дистрибьютора). Указывает, какой режим аутентификации использует Merge Agent: SQL или Microsoft Windows 2000.
Дополнительная информация. Описание этих параметров можно найти в SQL Server Books Online. Выполните поиск "Merge Agent, starting" (Merge Agent, запуск) в индексе Books Online. - Закончив модифицирование свойств Merge Agent, щелкните на кнопке OK, чтобы сохранить ваши изменения.
Вы можете модифицировать другие параметры в профиле Merge Agent. Чтобы модифицировать профиль, выполните следующие шаги:
- В правой панели Enterprise Manager щелкните правой кнопкой мыши на Merge Agent, как это описано выше в этом разделе, и выберите из появившегося контекстного меню пункт Agent Profiles (Профили агента). Появится диалоговое окно Merge Agent Profiles (рис. 28.29).
Рис. 28.29. Диалоговое окно Merge Agent ProfilesОтметим, что это диалоговое окно содержит гораздо больше вариантов, чем диалоговое окно Log Reader Agent Profiles, которое вы видели в лекции 27. Эти профили обеспечивают широкий диапазон функциональных возможностей, чтобы вы могли выбрать профиль, который наиболее подходит для конкретной конфигурации вашей системы. - Щелкните на кнопке New Profile (Создать профиль), чтобы создать новый профиль. Текущий профиль нельзя модифицировать. В результате появится диалоговое окно Replication Agent Profile Details (Детали профиля агента репликации), (рис. 28.30).
- В этом диалоговом окне вы можете модифицировать следующие параметры:
- BcpBatchSize. Указывает количество строк, которые будут передаваться в операции массового копирования. Он используется в основном для журнального протоколирования.
- ChangesPerHistory. Указывает пороговое значение, при переходе которого происходит журнальное протоколирование передаваемых и получаемых сообщений.
- DownloadGenerationsPerBatch. Указывает количество поколений данных, которое будет загружаться в пакете
- DownloadReadChangesPerBatch. Указывает количество изменений, которое будет считываться в пакете.
- DownloadWriteChangesPerBatch. Указывает количество изменений, которое будет применяться в пакете.
Рис. 28.30. иалоговое окно Replication Agent Profile Details (Детали профиля агента репликации) - FastRowCount. Указывает тип проверки достоверности, который будет использоваться. Значение 1 указывает быстрый метод, значение 0 – метод подсчета строк (rowcount).
- HistoryVerboseLevel. Указывает, сколько информации будет протоколироваться в журнале.
- KeepAliveMessageInterval. Указывает количество секунд между проверкой с помощью метода контрольных импульсов (heartbeat), реализуемого участниками репликации, чтобы определить, функционируют ли остальные участники репликации.
- LoginTimeout. Указывает допустимое время ожидания в секундах для Merge Agent.
- MaxDownloadChanges. Указывает максимальное количество получаемых загрузок в одном сеансе.
- MaxUploadChanges. Указывает максимальное количество отправляемых загрузок в одном сеансе.
- MaxDeadlockRetries. Указывает максимальное количество попыток агента в случае взаимоблокировки.
- PollingInterval. Указывает, насколько часто опрашивается журнал транзакций на издателе (для получения новых транзакций).
- QueryTimeout. Указывает допустимое время ожидания в секундах для запроса.
- UploadGenerationsPerBatch. Указывает количество поколений отправляемых загрузок, которые будут обрабатываться в одном пакете.
- UploadReadChangesPerBatch. Указывает количество операций чтения, которое будет обрабатываться в одном пакете.
- UploadWriteChangesPerBatch.Указывает количество операций записи, которое будет обрабатываться в одном пакете.
- Validate. Указывает, нужно ли проводить проверку достоверности в конце сеанса.
- ValidateInterval. Указывает, насколько часто проводится проверка достоверности (если она вообще проводится), когда агент работает в непрерывном режиме.
Если Merge Agent используется в режиме расписания, а не в непрерывном режиме, то он вызывается агентом SQL Server Agent и выполняет, прежде чем закончить работу, то количество изменений, которое указано параметрами MaxUploadChanges и MaxDownloadChanges.
Отключение репликации
Вы можете легко отключить все операции или часть операций репликации в вашей системе с помощью мастеров Enterprise Manager, чтобы удалить определенные компоненты репликации. В этом разделе вы узнаете, как выполнять эту простую задачу.
Удаление push-подписок
Чтобы удалить push-подписку, используйте Enterprise Manager в системе дистри-бьютора для вызова мастера Push Subscription Wizard. После вызова этого мастера появится диалоговое окно Create and Manage Publications. В поле списка Databases and Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication (Удалить публикацию). Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку. Щелкните на кнопке Yes, чтобы удалить подписку.
Удаление pull-подписок
Чтобы удалить pull-подписку, используйте Enterprise Manager в системе подписчика для вызова мастера Pull Subscription Wizard. После вызова этого мастера появится диалоговое окно Create and Manage Publications. В поле списка Databases And Publications выделите подписку, которую хотите удалить, и затем щелкните на кнопке Delete Publication. Вы получите запрос для подтверждения того, что действительно хотите удалить данную подписку.
Удаление распространения и публикаций
Чтобы удалить распространение и публикации, вы должны вызвать мастер Disable Publishing and Distribution Wizard (Отключение публикования и распространения). В первом окне этого мастера вы указываете, что вам нужно: отключить все распространение и все публикации или удалить только публикации. Если выбрать первый вариант, то будет удалено все – публикование, распространение и публикации. Если выбрать второй вариант (принятый по умолчанию), то будут удалены только публикации. Затем вы должны выбрать публикации, которые хотите удалить. После вашего выбора появится окно подтверждения, где вам дается последняя возможность отменить свое решение. Чтобы удалить выбранные вами компоненты репликации, щелкните на кнопке Yes.
Мониторинг и настройка системы репликации слиянием
В этом разделе описывается, как выполнять мониторинг и настройку системы репликации слиянием для получения оптимальной производительности. Кроме того, в этом разделе представлены некоторые рекомендации по конфигурированию для систем репликации слиянием. В данном разделе также дается обзор атрибутов репликации слиянием.
Атрибуты репликации слиянием
Репликация слиянием существенно отличается от других методов репликации. В отличие от репликации транзакций и репликации снимков она не является однонаправленным методом репликации. Модификации могут выполняться на издателе и на любом числе подписчиков. Кроме того, в случае репликации транзакций происходит чтение журнала транзакций (для отслеживания изменений), что является внешней операций по отношению к обычным операциям SQL Server, в то время как в случае репликации слиянием для реплицируемых таблиц создаются триггеры, которые активизируются при изменениях в этих таблицах.
Репликация слиянием начинается с применения снимка, но поскольку эта операция выполняется только один раз, вам не нужно настраивать процесс репликации снимка. Чтобы выполнять репликацию, система слияния создает таблицы как на издателе, так и на дистрибьюторе. Кроме того, к каждой реплицируемой таблице добавляется новая колонка, содержащая уникальный идентификатор строк. Он используется для уникального идентифицирования каждой строки, чтобы агент репликации мог эффективно отслеживать изменения.
При вставке или модифицировании строки триггер помечает эту строку для репликации. Затем происходит активизация агента Merge Agent, который собирает все помеченные строки и отправляет их дистрибьютору для репликации. Одновременно с этим Merge Agent модифицирует любые строки в таблицах издателя, которые были модифицированы в таблицах системы или систем подписчика. Так осуществляется двусторонняя репликация.
Конфигурирование репликации слиянием
Если вы используете репликацию слиянием, правильное конфигурирование сети и подсистем ввода-вывода, участвующих в репликации систем, крайне важно для повышения производительности репликации так же, как и в случае использования других методов репликации. Вы можете также повысить производительность репликации слиянием за счет конфигурирования размера пакета слияния. Увеличивая размер этого пакета, вы обеспечиваете использования меньшего числа более крупных пакетов, что является более эффективным методом. Кроме того, вам может потребоваться настройка репликации снимка, однако репликация снимка происходит только один раз, поэтому вы можете пропустить этот шаг. И наконец, вы можете модифицировать Merge Agent; этот процесс был описан выше в этой лекции. В данном разделе описаны конфигурирование ввода-вывода и конфигурирование размера пакета слияния.
Конфигурирование достаточной мощности ввода-вывода
Конфигурируя достаточную мощность подсистем ввода-вывода, вы можете повысить производительность всего процесса репликации. Как и в любой системе SQL Server, журнал транзакций системы, участвующей в репликации, должен находиться для защиты данных на своем собственном томе RAID 1. Файлы данных должны находиться на одном или нескольких томах RAID 10 или RAID 5. В отличие от репликации транзакций для репликации слиянием требуются лишь небольшие изменения в стандартных конфигурациях ввода-вывода.
Конфигурирование подсистем ввода-вывода на издателе. В общем случае при конфигурировании подсистемы ввода-вывода издателя вы должны следовать стандартным рекомендациям по конфигурированию SQL Server, описанным на протяжении этой книги. В отличие от репликации транзакций при репликации слиянием не возникает дополнительной нагрузки на журнал транзакций, поэтому следуйте стандартным рекомендациям по настройке, когда конфигурируете мощность подсистемы ввода-вывода для этого журнала.
Конфигурирование подсистемы ввода-вывода на дистрибьюторе.Дистрибьютор следует конфигурировать таким образом, чтобы дистрибутивная база данных имела собственный журнал транзакций на выделенном дисковом томе RAID 1. Это позволит получить максимальную производительность для журнала дистрибутивной базы данных, что повысит производительность самого дистрибьютора.
Конфигурирование подсистемы ввода-вывода на подписчике. Поскольку репликация слиянием является многонаправленной, подписчик и издатель настраиваются аналогичным образом. Просто следуйте общим рекомендациям по определению состава и конфигурации систем, описанным на протяжении этой книги.
Конфигурирование размера пакета слияния
В нагруженных системах вы можете повышать производительность репликации слиянием путем конфигурирования размера пакета слияния. Размер пакета слияния определяет, сколько измененных строк копируется на дистрибьютор за один раз. Если увеличить размер пакета, то будет отправляться меньшее количество более крупных пакетов, что может оказаться более эффективным.
Мониторинг системы репликации слиянием
Мониторинг репликации слиянием выполняется через Windows 2000 Performance Monitor (perfmon). В perfmon имеется ряд объектов, которые добавляются при использовании репликации SQL Server. Это следующие объекты:
- SQLServer:Replication Agents. Указывает количество работающих агентов репликации каждого типа.
- SQLServer:Replication Merge. Предоставляет данные об интенсивности операций слияния. Это информация о количестве конфликтов в секунду, количестве отправляемых загрузок в секунду и количестве получаемых загрузок в секунду. Эта информация фактически не помогает при настройке репликации транзакций.
Счетчики репликации слиянием SQL Server не слишком полезны для выявления проблем производительности. Лучше всего настроить систему репликации транзакций так же, как любую систему SQL Server, и уделить особое внимание тому, как работает сеть. Выявляйте узкие места там, где они обычно возникают в сети, а также следуйте рекомендациям этой лекции и двух предыдущих лекций, чтобы определить, не перегружен ли дистрибьютор.
Настройка системы репликации слиянием
Основные шагами в настройке системы репликации слиянием являются надлежащее конфигурирование и мониторинг системы, как это описано в предыдущих разделах; кроме того, следует уделять особое внимание производительности подсистем ввода-вывода и сети. Вы можете выполнять мониторинг системы через perfmon, но, как уже говорилось, perfmon не дает достаточно полезных данных для репликации слиянием. Вместо этого для настройки системы вы можете полагаться на другие счетчики SQL Server и счетчики Microsoft Windows 2000.
Как уже говорилось в лекции 24, вам может потребоваться изменение размера пакета массового копирования (BCP) и размера пакета слияния, если ваша система выполняет много обновлений. Увеличивая размер пакета BCP, вы увеличиваете производительность применения исходного снимка. Увеличивая размер пакета слияния, вы обеспечиваете копирование большего количества изменений за один раз, что может оказаться более эффективным методом. Если за один раз копируется больше изменений, система затрагивается менее часто, но она должна выполнять больше работы во время выполнения репликации.
Кроме того, вы можете изменять интервал опроса. Обычно вполне подходит значение этого интервала по умолчанию. Прежде чем настраивать интервал опроса, попробуйте изменить размеры пакетов. Если вы считаете, что репликация слиянием должна выполняться более часто или менее часто, измените интервал опроса.
Вам может также потребоваться мониторинг производительности сети и (при необходимости) ее увеличение, как и в случае репликации снимков или репликации транзакций. Если видно, что ваша система работает не оптимально, например, если центральные процессоры и подсистемы ввода-вывода достигли предела своих возможностей, а процесс репликации занимает слишком много времени, то у вас, возможно, имеются сетевые проблемы. К сожалению, сетевые проблемы нельзя диагностировать с помощью perfmon. Perfmon не имеет счетчика, который бы отражал проблемы сети. Следует использовать продукт для мониторинга сети, такой как Microsoft Systems Management Server (SMS). Выполните мониторинг сетевой платы, чтобы определить, не достигла ли она предела своих возможностей. Если ваша сеть достигла предела своих возможностей, приобретите более быстрые сетевые платы или добавьте для репликации и/или резервного копирования и восстановления частную сеть. И, наконец, помните, что издатель, дистрибьютор и подписчики – это системы SQL Server. Поэтому вам следует настраивать эти системы точно так же, как и любую другую систему SQL Server. Рекомендации по настройке для систем SQL Server приводятся на протяжении всей этой книги.
Заключение
Эта лекция является последней из трех лекций, описывающих репликацию в SQL Server. В этой лекции вы узнали, как выполняется репликация слиянием, почему вам может потребоваться репликация слиянием и как правильно конфигурировать, отслеживать и настраивать репликацию слиянием. В следующей лекции вы узнаете, что такое Microsoft Analysis Services и как использовать эти службы.
Лекция 29. Использование Microsoft SQL Server Аnalysis Services
Microsoft SQL Server 2000 Аnalysis Services (прежнее название OLAP Services) – это компонент SQL Server 2000, предназначенный для оперативной аналитической обработки (OLAP); с помощью этого компонента вы можете получать доступ и извлекать данные вашего склада данных (data warehouse) и рынка данных (data mart). В этой лекции вы узнаете, из каких компонентов состоит Аnalysis Services, как их инсталлировать и как их использовать. Кроме того, вы узнаете об улучшениях Аnalysis Services, включенных в SQL Server 2000. Поскольку эта книга предназначена для администраторов SQL Server, а не разработчиков приложений, здесь рассматриваются только темы инсталляции, конфигурирования и администрирования Аnalysis Services. Темы разработки приложений здесь не рассматриваются.
Обзор Аnalysis Services
Аnalysis Services – это набор средств (инструментов), помогающий вам в разработке и управлении данными, которые используются в оперативной аналитической обработке. Аnalysis Services состоит из сервера Аnalysis Service, English Query и других поддерживающих компонентов. Сервер Аnalysis Service формирует кубы данных, используемые в многомерном анализе. Термин "куб" используется для описания агрегированных данных. Эти агрегированные (итоговые) данные используются для комплексных аналитических запросов, таких как ежемесячные объемы продаж и прогнозы продаж. (Кубы описаны более подробно в подразделе "Кубы OLAP" далее.)
В многомерном анализе для исследования базы данных с различных точек зрения (размерностей) используется несколько запросов. Рассмотрим один пример. Представим себе базу данных магазина велосипедов, где хранятся данные по продажам за последний год. Один запрос в операции многомерного анализа может использоваться для исследования покупательского спроса. Другой запрос – для получения результатов ежемесячных продаж. Еще один запрос – для исследования продаж определенного велосипеда или компонента. Хотя все запросы используют одни и те же данные, каждый запрос применяется для получения своего аспекта (размерности) по этим данным.
Компоненты Аnalysis Services
Аnalysis Services содержит ряд инструментов и мастеров, которые вы можете использовать для доступа к многомерным данным. Аnalysis Services состоит из следующих компонентов:
- Аnalysis Manager. Содержит графический пользовательский интерфейс для доступа к таким службам анализа, как создание кубов, управление безопасностью и обзор источников данных.
- Data Warehousing Framework. Содержит набор компонентов и интерфейсов API, с помощью которых реализуются возможности склада данных SQL Server.
- Data Transformation Services (DTS). Используется для загрузки и преобразования данных в рынок данных или склад данных. В DTS входят мастер импорта Import Wizard и мастер экспорта Export Wizard, которые позволяют выполнять как перемещение, так и преобразование данных. (Об использовании DTS см. лекцию 24)
- Repository.Содержит ряд интерфейсов, моделей схем баз данных и заранее определенных преобразований данных для включения в Data Warehousing Framework. Поскольку преобразования данных выполняются регулярно, их определения можно сохранять для будущего использования.
- Data Mining.Содержит алгоритмы для определения и реализации многомерных кубов.
- English Query. Преобразует вопросы на английском языке в операторы SQL, которые можно применять к базе данных.
- Extensible Markup Language (XML).Стандартный язык форматирования и представления данных. XML – это ключевой компонент для передачи данных между приложениями, используемый для публикации данных в Internet.
Как вы увидите в данной лекции, эти компоненты совмещаются друг с другом, как элементы головоломки, образуя единый инструмент.
Кубы OLAP
Основной формой представления данных в Аnalysis Services является куб OLAP. Куб является многомерным представлением как подробных, так и итоговых данных. Подробные данные – это конкретные данные строки, в то время как итоговые данные – это агрегированные данные. Кубы разрабатываются на основе аналитических требований, устанавливаемых самими данными. Каждый куб представляет свой бизнес-объект, такой как продажи или материально-производственные запасы. Каждая сторона куба является соответствующим размерностным представлением данных. Иными словами, куб состоит из различных "плоскостей" данных (отсюда название "куб данных").
Кубы Аnalysis Services формируются с использованием одного из двух типов схем баз данных: "звезда" и "снежинка". (Хотя тема формирования схем относится к вопросам разработки, в этой лекции дается краткое описание этих двух типов схем, чтобы вы могли лучше понимать работу Аnalysis Services.) Схемы обоих типов состоят из таблиц фактов и таблиц размерности. Аnalysis Services агрегирует данные в этих таблицах для создания кубов. Рассмотрим этот процесс более подробно.
Таблицы фактов
Таблица фактов (fact table) – это таблица для склада данных (data warehouse), в которой хранятся накопленные данные. Эти накопленные данные являются базовой информацией склада данных. В нашем примере магазина велосипедов эта информация состоит из записи транзакций (транзакций базы данных и транзакций [операций] продаж), которые произошли в магазине велосипедов. В эту запись включаются такие данные, как дата транзакции, тип транзакции, наименование проданного товара, стоимостное выражение транзакции (в долларах), имя покупателя и имя продавца. Эту запись можно использовать как основу для многомерного анализа.
Итак, данные таблицы фактов основываются на бизнес-транзакции (деловой операции). Этой транзакцией может быть продажа какого-либо товара, транзакция с использованием кредитной карты, прибыль и т.д. По сути, в таблицу фактов записывается некоторый тип бизнес-события.
Таблица фактов в складе данных является самой большой таблицей базы данных с наибольшей интенсивностью операций. Как вы понимаете, таблица фактов может содержать миллионы записей и занимать более одного терабайта (1024 гигабайт).
Таблицы размерности
Таблица размерности (dimension table) используется для определения полей в таблице фактов, например, имени продавца, типа транзакции или наименования товара. Этот процесс похож на нормализацию, т.е. разбиение данных на группы для более эффективной обработки. В то время как таблица фактов содержит накапливаемую информацию о транзакциях, таблица размерности содержит информацию, которая используется для извлечения полезного материала из таблицы фактов. Иными словами, таблицы размерности используются для определения "смысла" данных, содержащихся в таблице фактов.
Например, таблица фактов, содержащая записи продаж, может иметь таблицу размерности с информацией о торговых представителях, которая используется для создания таких итоговых данных, как объемы продаж за месяц на одного продавца. Может также использоваться таблица размерности, содержащая региональные данные, которые используются для создания итоговых данных, такие как объем продаж по регионам.
В отличие от таблицы фактов таблицы размерности обычно занимают немного места и содержат лишь несколько строк. Склад данных обычно содержит только одну или две таблицы фактов, но несколько таблиц размерности.
Схемы
Схема типа "звезда" (или плоская схема) характерна для складов данных. Эта схема состоит из одной таблицы фактов и нескольких таблиц размерности. Схема типа "звезда" обычно представляется как таблица фактов, окруженная несколькими таблицами размерности в форме звезды. Каждая таблица размерности соответствует какой-либо колонке в таблице фактов. Таблицы размерности используются как основа для анализа данных в таблице фактов.
В схеме типа "снежинка" (или многомерной схеме) несколько таблиц размерности связываются друг с другом, прежде чем присоединиться к таблице фактов; иными словами, создается несколько уровней таблиц размерности, и каждый уровень соответствует колонке в таблице фактов (рис. 29.1).
Рис. 29.1. Схемы типа "звезда" и "снежинка"
Агрегирование данных
Аnalysis Services агрегирует колонки в таблице фактов, используя данные таблиц размерности. Например, таблицы размерности, которые относятся к сотрудникам, можно использовать для суммирования данных по продажам на одного сотрудника. Таблицы размерности, которые относятся к товарам, можно использовать для суммирования данных по товарам. Поскольку при агрегировании, основанном на таблицах размерности, создаются различные слои (или размерности) данных, это приводит к формированию виртуального куба данных, который описан выше.
Кубы OLAP, создаваемые с помощью Аnalysis Services, это, по сути, функции агрегирования, которые рассчитываются в соответствии со схемой типа "звезда" или "снежинка". Для создания этих агрегатов применяется мастер Аnalysis Services Wizard, который вы используете по своему усмотрению для создания бизнес-моделей и принятия деловых решений.
Метаданные
Термин "метаданные" используется для описания данных о данных. Так, подробные и итоговые данные, которые используются для описания данных в базе данных, считаются метаданными. В примере, который мы использовали, таблица продаж и окружающие таблицы размерности представляют данные. Итоговая информация, которую мы создаем (распределение продаж по продавцам, продаж по товарам), – это метаданные. Возможность создания метаданных (итоговых таблиц или агрегатов данных) является главным преимуществом Аnalysis Services. Используя Аnalysis Services, вы можете легко создавать метаданные и далее заниматься другой работой без необходимости поддержки этих данных вручную.
Улучшения анализа данных в SQL Server 2000
В SQL Server 2000 включено несколько улучшений и новых средств для анализа данных и складов данных. Эти улучшения включают дополнительные средства и информацию, помогающие выполнять процесс анализа данных. В этом разделе вы узнаете о некоторых важных улучшениях.
Улучшения в извлечении данных
В Аnalysis Services включена новая технология извлечения (добычи) данных, которую можно использовать для выявления связей данных в реляционных базах данных и кубах OLAP. Эти связи можно добавлять к существующим кубам OLAP для дополнительного анализа данных. Одним из уникальных новых средств извлечения данных является дерево решений Microsoft Decision Tree. Decision Tree использует для анализа данных усложненные методы и алгоритмы классификации. Затем процесс дерева решений формирует одно или несколько деревьев решений, которые можно использовать для упреждающего анализа по новым данным. Например, дерево решений можно сформировать для анализа кредитной истории и покупательской истории потенциальных покупателей в нашем магазине велосипедов. Это дерево решений можно, тем самым, использовать для оценки кредитоспособности покупателя.
Еще одним новым средством извлечения данных в Аnalysis Services является использование кластеризации. Технология кластеризации, используемая в извлечении данных, полностью отличается от типа кластеризации, описанного в лекции 12. При выполнении кластеризации в Аnalysis Services используется алгоритм "ближайшего соседа", позволяющий быстро группировать записи данных в кластеры, имеющие сходные характеристики. Эти связи часто бывают неочевидными или интуитивными. Тем самым технология кластеризации открывает новые пути для анализа данных.
Кроме того, в состав средств извлечения данных SQL Server включены новые мастера и диалоговые окна, что упрощает их использование. Эти улучшения позволяют DBA быстро выполнять большинство задач создания и поддержки рынка данных или склада данных.
Улучшения для таблиц размерности
SQL Server 2000 содержит несколько улучшений по таблицам размерности. SQL Server теперь поддерживает родительские/дочерние размерности, размерности реляционной OLAP (ROLAP) и размерности с разрешением записи.
Родительские/дочерние размерности позволяют определять иерархии, которые базируются на родительских/дочерних отношениях между элементами исходной таблицы. Примером родительских/дочерних отношений является сборка компонента из частей. Одна часть (родительская) может иметь много подчиненных (дочерних) компонентов. Использование родительской/дочерней размерности "привязывает" подчиненные компоненты к родительской части при выполнении анализа данных.
ROLAP-размерность смягчает ограничения размеров, присущие стандартной многомерной модели OLAP (MOLAP), которая используется в Аnalysis Services. Модель MOLAP позволяет использовать размерности, содержащие до 5 миллионов элементов. Если набор элементов выходит за этот предел, требуется ROLAP-размерность. Модель ROLAP может разрастаться до очень больших размеров, но модель MOLAP существенно превосходит ROLAP в производительности при запросе набора элементов. По этой причине вам следует определять модели ROLAP только для очень больших размерностей.
При использовании размерности с разрешением записи элементы этой размерности можно модифицировать с помощью Аnalysis Manager и клиентских приложений, поддерживающих отложенную запись по размерности. Для управления доступом к размерности по записи клиентских приложений используются роли SQL Server. Роли SQL Server описываются в лекции 34.
Улучшения по безопасности
В SQL Server 2000 включены также улучшения по безопасности, которые позволяют вам лучше защищать используемые в анализе вашего предприятия данные, которые могут оказаться крайне важными. Эти улучшения включают изменения в защите таблиц размерности, средства защиты ячеек и поддержку дополнительных методов аутентификации.
Таблицы размерности теперь функционируют в рамках основанной на ролях модели безопасности SQL Server. Для каждой из определенных ролей вы можете ограничить доступ к отдельным размерностям, уровням и элементам. Кроме того, вы можете задать полномочия доступа к этим ресурсам по чтению и чтению/записи. SQL Server 2000 поддерживает основанную на ролях модель безопасности как для систем FAT, так и систем NTFS.
SQL Server 2000 позволяет применять роли на уровне ячеек куба. В Аnalysis Manager включены диалоговые окна, позволяющие управлять доступом роли к любой комбинации ячеек куба. Кроме того, вы можете изменять полномочия доступа к кубу по чтению и чтению/записи для каждой роли.
Поскольку в систему SQL Server 2000 включена модель безопасности Windows 2000, в ней можно использовать протокол Kerberos, NT Lane Manager Security Support Provider или любой другой тип провайдера, использующего интерфейс Security Support Provider Interface (SSPI) для выполнения аутентификации, когда пользователь или приложение запрашивает доступ к кубам и их данным. Это позволяет вам использовать согласованную модель безопасности на всех уровнях вашей системы SQL Server.
Улучшения в English Query
Средство English Query улучшено в SQL Server 2000 для обеспечения большей интеграции с комплектом продуктов Microsoft Visual Studio 6. Это позволяет разработчикам включать в приложения обычные предложения на английском языке вместо операторов T-SQL. Кроме того, включено новое графическое авторское средство, помогающее разработке предложений English Query. В SQL Server 2000 включен также мастер SQL Project Wizard, который автоматически создает базовые структуры базы данных для поддержки English Query, что несколько смягчает сложность установки среды English Query. Этот мастер сканирует таблицы базы данных и строит соответствующие компоненты SQL Server.
Инсталляция Аnalysis Services
Аnalysis Services инсталлируется вместе с SQL Server 2000 как составная часть комплекта SQL Server 2000 Components. Для инсталляции Аnalysis Services выполните следующие шаги.
- В меню инсталляции SQL Server 2000 щелкните на SQL Server Components и затем щелкните на Install Аnalysis Services. Появится начальное диалоговое окно Welcome.
- Щелкните на кнопке Next (Далее), чтобы появилось диалоговое окно лицензионного соглашения Software License Agreement. Прочитав и согласившись с текстом лицензии, щелкните на кнопке Yes (Да).
- Появится диалоговое окно Select Components (Выбор компонентов) (рис. 29.2). В этом диалоговом окне нужно выбрать компоненты Аnalysis Services, которые вы хотите инсталлировать. Выберите все компоненты, установив флажок рядом с именем каждого компонента. Если вы уже инсталлировали определенный компонент, то вы не сможете изменить его флажок. Чтобы выбрать новое местоположение для инсталляции Аnalysis Services, щелкните на кнопке Browse (Обзор). Выбрав целевую папку, щелкните на кнопке Next.
Рис. 29.2. Диалоговое окно Select Components (Выбор компонентов) - Появится диалоговое окно Data Folder Location (Местоположение папки Data) (рис. 29.3). Это диалоговое окно похоже на диалоговое окно Choose а Destination Location. Однако здесь выбирается местоположение папки Data. Чтобы указать местоположение, отличное от принятого по умолчанию, вы можете щелкнуть на кнопке Browse. Выбрав местоположение папки Data, щелкните на кнопке Next.
Рис. 29.3. Диалоговое окно Data Folder Location (Местоположение папки Data) - Появится диалоговое окно Select Program Folder (Выбор папки для программы) (рис. 29.4). Здесь нужно выбрать папку, в которой разместится Аnalysis Services. Обычно установка по умолчанию является приемлемой. Щелкните на кнопке Next, чтобы завершить инсталляцию.
Рис. 29.4. Диалоговое окно Select Program Folder (Выбор папки для программы)
Завершив инсталляцию Аnalysis Services, вы можете инсталлировать English Query. Средство English Query считается частью Аnalysis Services, но оно инсталлируется отдельно. Вы не обязаны инсталлировать English Query для использования Аnalysis Services. Чтобы инсталлировать English Query, выполните следующие шаги.
- В меню инсталляции SQL Server 2000 щелкните на SQL Server Components и затем щелкните на Install English Query. Процесс инсталляции сначала установит Microsoft Data Access Components (MDAC) и Microsoft Visual Studio Components. После инсталляции этих компонентов появится диалоговое окно Welcome. Для продолжения щелкните на кнопке Continue.
- Появится диалоговое окно лицензионного соглашения Software License Agreement. Прочитав и согласившись с текстом лицензии, щелкните на кнопке I Agree (Я согласен).
- Появится диалоговое окно Microsoft English Query 2000 Setup (рис. 29.5).
Рис. 29.5. Диалоговое окно Microsoft English Query 2000 SetupЗдесь вы можете выбрать тип инсталляции – Complete (Полная) или Run-time Only (Только для выполнения). В случае типа Complete инсталлируются все компоненты, в то время как инсталляция типа Run-time Only позволяет указывать, какие компоненты нужно инсталлировать. Вы можете также указать папку для инсталляции, но установка по умолчанию обычно является приемлемой. Если вы не слишком хорошо знаете English Query, щелкните на кнопке Complete. После этого будут инсталлированы компоненты English Query. Щелкните на кнопке OK, чтобы завершить инсталляцию.
Для доступа к Аnalysis Services и компонентам English Query после их инсталляции щелкните на кнопке Start (Пуск), укажите Programs (Программы), укажите Microsoft SQL Server и затем укажите Аnalysis Services. В подменю Аnalysis Services вы можете указать один из следующих вариантов.
- Аnalysis Manager. Вызов основного компонента Аnalysis Services. В этот компонент входят мастера и утилиты, которые позволяют вам использовать Аnalysis Services.
- Books Online. Вызов оперативной документации Аnalysis Services.
- MDX Sample Application. Вызов примера приложения, поставляемого вместе с Аnalysis Services.
Использование Аnalysis Services
Теперь, когда вы знаете, что такое Аnalysis Services и как происходит инсталляция этого средства, мы рассмотрим, как использовать эти его службы для создания и управления вашим складом данных. В этом разделе мы сконфигурируем источник данных, создадим базу данных OLAP по этому источнику данных и, наконец, создадим куб по этой базе данных.
Конфигурирование источника данных
Первым шагом в подключении Аnalysis Services к базе данных SQL Server является создание системного источника данных ODBC (Open Database Connectivity – интерфейса открытого взаимодействия с базами данных) для данного сервера. Для выполнения этой задачи используется утилита ODBC Data Sources, которая находится в папке Administrative Tools. Чтобы задать системный источник данных, выполните следующие шаги.
- Щелкните на кнопке Start, укажите Programs, укажите Administrative Tools (Администрирование) и затем выберите Data Sources (ODBC) (Источники данных [ODBC]). Появится диалоговое окно ODBC Data Source Administrator (Администратор источников данных ODBC) (рис. 29.6).
- Щелкните на вкладке System DSN (Системный источник данных) (рис. 29.7). Вы увидите несколько источников данных в окне списка System Data Sources (Системные источники данных). Некоторые из этих источников данных уже определены как подключения к SQL Server. Допустимо, а иногда желательно иметь несколько источников данных ODBC, которые ссылаются на одну и ту же базу данных, – в зависимости от того, как используется эта база данных. В этом примере мы создадим источник данных ODBC, который ссылается на базу данных Northwind.
Рис. 29.6. Вкладка User DSN диалогового окна ODBC Data Source Administrator
Рис. 29.7. Вкладка System DSN диалогового окна ODBC Data Source Administrator - Щелкните на кнопке Add (Добавить). Появится диалоговое окно Create New Data Source (Создание нового источника данных) (рис. 29.8). В окне списка выберите SQL Server. Затем щелкните на кнопке Finish (Готово).
- Появится диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server) (рис. 29.9). Здесь вы должны присвоить имя вашему источнику данных, задать его описание и указать, к какому серверу SQL вы хотите подсоединиться. Для продолжения щелкните на кнопке Next.
- В следующем диалоговом окне (рис. 29.10) нужно указать режим аутентификации, который будет использоваться при подсоединении пользователей к SQL Server. Вы можете выбрать аутентификацию Windows NT (первая кнопка выбора) или аутентификацию SQL Server (вторая кнопка выбора). В нижней части этого диалогового окна вы увидите флажок, который установлен по умолчанию. Если вы не хотите подсоединиться к SQL Server в данный момент, чтобы получить принятую по умолчанию информацию для остальной части процесса установки, сбросьте этот флажок. Для продолжения щелкните на кнопке Next.
Рис. 29.8. Диалоговое окно Create New Data Source (Создание нового источника данных)
Рис. 29.9. Диалоговое окно Create a New Data Source to SQL Server (Создать новый источник данных для SQL Server)
Рис. 29.10. Задание режима аутентификации - В следующем диалоговом окне (рис. 29.11), вы указывает базу данных, которая будет использоваться, имя файла этой базы данных и режимы ANSI. Аnalysis Services позволяет вам выбирать базу данных, к которой вы будете подсоединяться, поэтому вы не обязаны задавать имя базы данных по умолчанию. Однако нет ничего страшного, если вы укажете это имя, поскольку другие приложения могут использовать это имя источника данных (DSN). По окончании щелкните на кнопке Next.
Рис. 29.11. Указание базы данных по умолчанию - В следующем диалоговом окне (рис. 29.12), вы можете заменить английский язык, используемый для сообщений SQL Server, на другой язык, активизировать переводы, указать региональные параметры и местоположение файла журнала для длительных запросов и статистики драйвера. Для продолжения щелкните на кнопке Finish.
Рис. 29.12. Задание языка и других параметров - Появится диалоговое окно ODBC Microsoft SQL Server Setup (рис. 29.13). В этом диалоговом окне сообщается, что будет создан новый источник данных ODBC, и приводятся все параметры, выбранные вами для данного источника данных.
Рис. 29.13. Диалоговое окно сводки ODBC Microsoft SQL Server Setup - Вы должны проверить этот источник данных, щелкнув на кнопке Test Data Source (Тестировать источник данных). В результате будет проверено соединение с базой данных. После успешной проверки соединения щелкните на кнопке OK, и выбранный источник данных (DSN) будет доступен для использования.Примечание. Чтобы вы могли конфигурировать и тестировать источник данных, у вас должен быть запущен SQL Server.
Создание базы данных OLAP
Теперь, когда вы сконфигурировали и проверили источник данных ODBC, можно переходить к созданию базы данных OLAP. Создание базы данных OLAP заключается в установке существующей базы данных как базы данных OLAP. Вы должны подготовиться к тому, чтобы указать, какие таблицы будут использоваться как таблицы фактов и какие таблицы – как таблицы размерности.
В процессе создания базы данных вы будете использовать Аnalysis Manager, мастер Cube Wizard, мастер Dimension Wizard и мастер Storage Design Wizard. Для создания этой базы данных выполните следующие шаги.
- Щелкните на кнопке Start, укажите Programs, укажите Microsoft SQL Server, укажите Аnalysis Services и затем выберите Аnalysis Manager. Появится окно Аnalysis Manager (рис. 29.14).
увеличить изображение
Рис. 29.14. Окно Аnalysis Manager - Раскройте в левой панели папку Аnalysis Servers и затем раскройте папку с именем вашего сервера. Щелкните правой кнопкой мыши на имени этого сервера и выберите из контекстного меню пункт New Database (Создать базу данных), чтобы появилось диалоговое окно Database (рис. 29.15). Задайте имя новой базы данных (поле Name) и введите краткое описание (поле Description). В данном примере мы назовем базу данных Northwind_OLAP.
Рис. 29.15. Диалоговое окно Database (База данных)Примечание. Раскрыв папку с именем вашего сервера, вы увидите базу данных, уже сконфигурированную в Аnalysis Manager. Эта база данных с именем FoodMart 2000 создается автоматически, если во время инсталляции Аnalysis Services у вас установлен флажок Sample Applications (Примеры приложений) в диалоговом окне Select Components. - Щелкните на кнопке OK, чтобы вернуться в окно Аnalysis Manager. Если раскрыть папку Аnalysis Servers и раскрыть папку с именем вашего сервера, то вы увидите, что в нее добавлена новая база данных. (Эта база данных имеет имя, но она еще не имеет связи с источником данных SQL Server – мы займемся этим чуть позже.) Раскройте папку этой базы данных (в данном случае это база данных Northwind_OLAP), чтобы появились папки Data Sources (Источники данных), Cubes (Кубы), Shared Dimensions (Разделяемые размерности), Mining Models (Модели извлечения данных) и Database Roles (Роли базы данных) (рис. 29.16).
увеличить изображение
Рис. 29.16. Раскрытая база данных OLAP - Щелкните правой кнопкой мыши на папке Cubes, укажите в контекстном меню команду New Cube (Создать куб) и затем выберите пункт Wizard (Мастер) в подменю New Cube. Появится начальное окно Cube Wizard (Мастер создания куба) (рис. 29.17). Этот мастер используется для выбора источника данных, который указывается на уровне куба.
Рис. 29.17. Начальное окно мастера Cube Wizard (Мастер создания куба) - Щелкните на кнопке Next, чтобы появилось окно Select a fact table from a data source (Выбор таблицы фактов из источника данных) (рис. 29.18). Чтобы выбрать базу данных SQL Server, щелкните на кнопке New Data Source (Новый источник данных).Появится окно Data Link Properties (Свойства канала данных) (рис. 29.19). Во вкладке Provider (Провайдер) вы можете указать источник данных для данного куба, но в данном случае мы будем использовать вкладку Connection (Соединение) для выбора источника данных, который мы создали выше в этой лекции.
Рис. 29.18. Окно Select a fact table from a data source (Выбор таблицы фактов из источника данных) - Появится окно Data Link Properties (Свойства канала данных) (рис. 29.19). Во вкладке Provider (Провайдер) вы можете указать источник данных для данного куба, но в данном случае мы будем использовать вкладку Connection (Соединение) для выбора источника данных, который мы создали выше в этой лекции.
Рис. 29.19. Вкладка Provider (Провайдер) окна Data Link Properties (Свойства канала данных) - Во вкладке Connection окна Data Link Properties (рис. 29.20) выберите имя источника данных (в нашем примере DataSourceExample), введите имя пользователя (поле User name) и пароль (Password) и введите начальный каталог, который будете использовать (поле Enter the initial catalog to use). Если у вас нет пароля администратора (вам следует его использовать, если вы находитесь в сети), установите флажок Blank password (Пустой пароль).
Рис. 29.20. Вкладка Connection (Соединение) окна Data Link Properties - Здесь вам нужно проверить данное соединение, щелкнув на кнопке Test Connection (Тестировать соединение). Если проверка закончится успешно, появится сообщение "connection succeeded" (Успешное соединение). В противном случае у вас, возможно, что-то указано неверно. В случае успешной проверки щелкните на кнопке OK, чтобы вернуться в окно Select a fact table from a data source мастера Cube Wizard ( рис. 29.21).
Рис. 29.21. Окно Select a fact table from a data source мастера Cube Wizard с указанными источниками данных и таблицами
- В списке Data Sources and Tables (Источники данных и таблицы) этого окна дважды щелкните на таблице, которую хотите использовать как источник данных для вашего куба. В этом примере нужно дважды щелкнуть на таблице Orders. Несмотря на то, что таблица Orders не является в точности таблицей размерности, она устроена аналогично такой таблице. (Эта таблица используется здесь, чтобы данный пример мог выполнить обычный пользователь.)
- Щелкните на кнопке Next, чтобы появилось окно Select the numeric columns that define your measures (Выберите числовые колонки, которые определяют ваши измерения) (рис. 29.22).
Рис. 29.22. Окно select the numeric columns that define your measures (Выберите числовые колонки, которые определяют ваши измерения) Здесь вы можете выбрать колонку или колонки, которые будут определять числовые измерения куба; они будут использоваться для агрегирования. В данном случае выберите колонки OrderID и Freight, дважды щелкнув на этих именах или выделив каждую колонку и щелкнув на направленной вправо стрелке. - Щелкните на кнопке Next, чтобы появилось окно Select the dimensions for your cube (Выберите размерности для вашего куба) (рис. 29.23). Здесь вам нужно выбрать таблицы размерности, которые будут использоваться в данном кубе. В нашем примере мы создадим таблицу размерности.
- Щелкните на кнопке New Dimension (Создать размерность), чтобы появилось начальное окно мастера Dimension Wizard, показанное на рис. 29.24.
- Для продолжения щелкните на кнопке Next. Появится окно Choose how you want to create the dimension (Выбор способа создания размерности) (рис. 29.25). В этом окне нужно указать, как будет создана размерность. Вы можете выбрать схему "звезда" (кнопка выбора Star schema), схему "снежинка" (Snowflake schema), родительские/дочерние отношения (Parent-Child), виртуальную размерность (Virtual dimension) или модель извлечения данных (Mining model). В данном примере щелкните на кнопке выбора Star Schema.
Рис. 29.23. Окно Select the dimensions for your cube (Выберите размерности для вашего куба)
Рис. 29.24. Начальное окно мастера Dimension Wizard
Рис. 29.25. Окно Choose how you want to create the dimension (Выбор способа создания размерности) - Щелкните на кнопке Next, чтобы появилось окно Select the dimension table (Выбор таблицы размерности) (рис. 29.26). В данном примере выберите в качестве таблицы размерности таблицу Employees.
Рис. 29.26. Окно Select the dimension table (Выбор таблицы размерности) - Щелкните на кнопке Next, чтобы появилось окно Select the dimension type (Выбор типа размерности) (рис. 29.27). Здесь вы можете выбрать тип размерности: стандартную размерность (Standard dimension) или размерность времени (Time dimension). В данном примере щелкните на кнопке выбора Standard Dimension.
Рис. 29.27. Окно Select the dimension type (Выбор типа размерности)
- Щелкните на кнопке Next, чтобы появилось окно Select the levels for your dimension (Выбор уровней для вашей размерности) (рис. 29.28). Вы можете выбрать в этом окне несколько уровней агрегирования, но в данном простом примере мы выберем только один уровень – Employee Id. Чтобы выбрать уровень, выделите соответствующую колонку и щелкните на направленной вправо стрелке или дважды щелкните на этой колонке.
Рис. 29.28. Окно Select the levels for your dimension (Выбор уровней для вашей размерности) - Щелкните на кнопке Next, чтобы появилось окно Specify the member key columns (Задание ключевых колонок) (рис. 29.29). Если вы формируете куб из нескольких таблиц, то указываете здесь ключевые колонки таблиц.
Рис. 29.29. Окно Specify the member key columns (Задание ключевых колонок) - Щелкните на кнопке Next, чтобы появилось окно Select advanced options (Выбор дополнительных параметров) (рис. 29.30). Здесь вы можете модифицировать размерность (флажок Changing dimension), указать порядок сортировки по элементам размерности (флажок Ordering ...) и определять режим хранения (флажок Storage mode ...). Если вы создаете очень большой куб, то должны задать модель хранения ROLAP, описанную выше в этой лекции. При выборе любого из этих вариантов мастер выведет соответствующие окна, в которых вы сможете сделать свой выбор. Мы не рассматриваем здесь эти окна.
Рис. 29.30. Окно Select advanced options (Выбор дополнительных параметров) - Щелкните на кнопке Next, чтобы появилось окно Finish the Dimension Wizard (Завершение работы мастера размерности) (рис. 29.31). Задайте имя размерности и щелкните на кнопке Finish.
Рис. 29.31. Окно Finish the Dimension Wizard (Завершение работы мастера размерности) - Закончив работу мастера Dimension Wizard, вы возвратитесь в окно Select the dimensions for your cube (рис. 29.23) мастера Cube Wizard. Ваша новая размерность появится в списке Cube Dimensions (Размерности куба). Здесь вы можете продолжить работу, выбрав таблицу размерности, которая используется для создания итоговых данных по таблице фактов, или можете создать новые таблицы размерности, щелкнув на кнопке New Dimension и снова запустив мастер Dimension Wizard.
Для продолжения щелкните на кнопке Next. Получив вопрос, хотите ли вы считать строки (if you want to count the rows), щелкните на кнопке Yes. Появится окно Finish the Cube Wizard (Завершение работы мастера создания куба) (рис. 29.32). Вам останется только задать имя этого куба.
Рис. 29.32. Окно Finish the Cube Wizard (Завершение работы мастера создания куба) - После щелчка на кнопке Finish появится окно Cube Editor (Редактор куба) (рис. 29.33). Выполните необходимое редактирование куба и затем выйдите из окна Cube Editor, щелкнув на кнопке Close. Обычно никакого редактирования не требуется.
увеличить изображение
Рис. 29.33. Окно Cube Editor (Редактор куба)
- После выхода из окна Cube Editor появится сообщение, где запрашивается, хотите ли вы задать варианты хранения для вашего куба. Щелкните на кнопке Yes. Появится начальное окно мастера Storage Design Wizard (Мастер структуры хранения) (рис. 29.34).
Рис. 29.34. Начальное окно мастера Storage Design Wizard (Мастер структуры хранения) - Щелкните на кнопке Next, чтобы появилось окно Select the type of data storage (Выбор типа хранения данных) (рис. 29.35).
Рис. 29.35. Окно Select the type of data storage (Выбор типа хранения данных)Здесь вы можете выбрать между хранением данных в виде размерностей, в реляционной форме или в виде комбинации этих двух типов; для данного примера щелкните на кнопке выбора MOLAP, чтобы хранить данные в виде структур данных Аnalysis Services. Если выбрать хранение данных в реляционной форме (кнопка выбора ROLAP), то новые таблицы будут сохраняться в базе данных, с которой вы работаете (в данном случае – Northwind). И последний вариант – HOLAP (гибридная OLAP), при котором базовые данные хранятся в реляционной форме и агрегированные данные – в виде многомерной структуры. - Щелкните на кнопке Next, чтобы появилось окно Set aggregation options (Задание параметров агрегирования) (рис. 29.36), где вы можете задать дополнительные параметры создания агрегированных данных. Для данного примера используйте вариант, принятый по умолчанию (100 MB), и щелкните на кнопке Start, чтобы создать агрегаты данных.
Рис. 29.36. Окно Set aggregation options (Задание параметров агрегирования)Поскольку в этом примере мы используем очень небольшую таблицу, для расчета агрегатов данных потребуется лишь несколько секунд. Результирующие агрегаты будут рассчитаны в виде графиков, после чего снова появится окно Set aggregation options (рис. 29.37). Отметим, что у нас не слишком много данных для этого примера, поэтому график – это всего лишь вертикальная линия вдоль оси ординат.
Рис. 29.37. Окно Set aggregation options с графиком агрегированных данных - Щелкните на кнопке Next, чтобы появилось окно Finish the Storage Design Wizard (Завершение работы мастера) (рис. 29.38). Здесь вы можете завершить работу мастера Storage Design Wizard в данный момент (кнопка выбора Process Now) или сохранить ваши параметры и отложить завершение на другой момент (Save, but don’t process Now). Второй вариант полезно использовать, если вы хотите подождать до окончания основного рабочего времени, когда снизится нагрузка на систему, чтобы создать данное хранилище. В данном примере щелкните на кнопке Process Now.
Рис. 29.38. Окно Finish the Storage Design Wizard (Завершение работы мастера) - Щелкните на кнопке Finish. Появится диалоговое окно Process (Обработка) (рис. 29.39). По окончании операции создания хранилища для куба внизу этого окна появится сообщение, информирующее об успешном завершении этой операции. Щелкните на кнопке Close, чтобы закончить этот процесс.
Рис. 29.39. Диалоговое окно Process (Обработка)
Модифицирование существующей базы данных OLAP
База данных OLAP модифицируется в Аnalysis Manager аналогично созданию базы данных OLAP. В этом разделе мы будет модифицировать базу данных FoodMart 2000. База данных FoodMart 2000 включается в инсталляцию Аnalysis Services (если во время инсталляции вы установили флажок Sample Applications). Чтобы отредактировать куб в базе данных FoodMart 2000, выполните следующие шаги.
- В окне Аnalysis Manager раскройте папку Аnalysis Servers, раскройте сервер, раскройте папку FoodMart 2000 и затем раскройте папку Cubes (рис. 29.40).
увеличить изображение
Рис. 29.40. Окно Аnalysis Manager - Щелкните правой кнопкой мыши на папке Sales и выберите из контекстного меню пункт Edit (Редактировать). Появится окно Cube Editor (рис. 29.41). В этом окне показаны связи между таблицами размерности и фактов в этом кубе.
После вызова окна Cube Editor вы получаете целый ряд возможностей.
- Создание новой размерности. Вызовите Dimension Manager, щелкнув правой кнопкой мыши на папке Dimensions или на имени любой размерности в левой панели. Средство Dimension Manager устроено аналогично мастеру Dimension Wizard, о котором мы говорили выше в этой лекции. Оно используется для добавления к базе данных новых размерностей или удаления существующих размерностей.
- Удаление размерности. Для удаления размерности нужно щелкнуть на ней правой кнопкой мыши и выбрать пункт Remove (Удалить). Эта операция необратимым образом удаляет размерность из базы данных.
- Создание, удаление или переименование измерения (measure). Щелкните правой кнопкой мыши на данном измерении (в папке Measures) и выберите пункт New Measure, Delete или Rename.
увеличить изображение
Рис. 29.41. Окно Cube Editorr - Создание нового расчетного элемента. Щелкните правой кнопкой мыши на папке Calculated Members или на любом расчетном элементе и выберите пункт New Calculated Member (Новый расчетный элемент).
- Редактирование, удаление или переименование расчетного элемента. Щелкните правой кнопкой мыши на расчетном элементе и затем выберите пункт Edit, Delete или Rename.
Во вкладке Schema (Схема) правой панели вы можете щелкать правой кнопкой мыши на заголовках таблиц размерности или фактов и выбирать следующие команды:
- Insert A Table (Вставить таблицу). Позволяет добавлять таблицы к базе данных.
- Change Alias (Изменить алиас). Позволяет переименовывать существующее свойство куба. Вы можете определять производное свойство куба, которое базируется на другом свойстве куба, не изменяя базового свойства.
- Browse Data (Обзор данных). Позволяет считывать данные таблиц для просмотра.
- Replace (Заменить). Позволяет выбрать другую таблицу для замены таблицы, которая уже находится в базе данных.
- Remove (Удалить – только для таблиц размерности). Позволяет удалить таблицу размерности из базы данных.
- Чтобы убедиться в полезности системы OLAP, выберите пункт Data (Данные) из меню View (Вид) в Аnalysis Manager или щелкните на вкладке Data. Во вкладке Data окна Cube Editor (рис. 29.42), вы можете выбрать итоговые данные в соответствии с критериями, которые можете выбрать с помощью целого ряда раскрывающихся меню. Эти меню порождаются размерностями данного куба. Вкладка Data аналогична диалоговому окну Cube Browser (Браузер куба), которое мы вскоре рассмотрим.
увеличить изображение
Рис. 29.42. Вкладка Data окна Cube EditorВо вкладке Data вы можете выбирать различные комбинации переменных, чтобы получать различные представления данных. Поскольку итоговые данные уже рассчитаны, результаты появляются очень быстро. Если бы у вас не было итоговых данных, то вам пришлось бы запускать отдельные запросы. В случае большого рынка данных или склада данных процесс расчета агрегатов данных мог бы занять много времени.
Обработка данных
После создания кубов вы получаете ряд средств, позволяющих вам просматривать и обрабатывать данные. Для доступа ко многим из этих средств вы можете щелкнуть правой кнопкой мыши на имени куба в левой панели окна Аnalysis Manager. Вот некоторые из этих средств:
- Process (Обработка). Используется для обновления агрегатов данных. Поскольку агрегаты данных не обновляются автоматически при изменении базовых данных, их следует периодически обновлять. Этот процесс может занимать много времени, и его следует планировать на подходящее для этого время (ночью, в выходные дни и т.д.).
- Design Storage.Вызов мастера Storage Design Wizard. Это позволяет вам модифицировать базовые свойства хранения кубов OLAP. Выше в этой лекции вы изучали, как использовать Storage Design Wizard.
- Usage-Based Optimization (Оптимизация, основанная на использовании). Вызов мастера Usage Based Optimization Wizard, который помогает вам настраивать куб путем улучшения агрегатов данных на основании истории запросов по этим агрегатам. Вы делаете это путем просмотра выполненных запросов к базе данных и оптимизации этих запросов. Мастер Usage Based Optimization Wizard предлагает вам способы модифицирования запросов или самих агрегатов.
- Browse Data (Просмотр данных). Позволяет вам просматривать агрегаты данных. При выборе варианта Browse Data появится диалоговое окно Cube Browser (рис. 29.43) для примера с базой данных FoodMart 2000. Как видно из рисунка, это диалоговое окно аналогично вкладке Data окна Cube Editor. В окне Cube Browser вы можете легко создавать настраиваемые результаты, используя хранимые агрегаты данных внутри куба.
Рис. 29.43. Диалоговое окно Cube Browser - Usage Аnalysis (Анализ использования). Вызов мастера Usage Аnalysis Wizard, который позволяет вам анализировать запросы, направляемые к кубу. Мастер Usage Аnalysis Wizard использует данные о запросах, направленных к кубу, основываясь на ваших критериях. Этот мастер похож на мастер Usage Based Optimization Wizard в том, что он позволяет выбирать критерии, чтобы определять, какие запросы требуют для своего выполнения больше всего времени. Однако мастер Usage Аnalysis Wizard используется только для просмотра этих данных.
Поскольку Аnalysis Services не выполняет автоматического обновления кубов OLAP и поскольку базовые данные могут изменяться, вы должны обновлять эти данные с частотой, которую считаете необходимой для вашей системы. Если данные модифицируются часто и пользователям требуется свежая информация, то вам может потребоваться частое обновление кубов. Если приемлемы вчерашние данные, то вполне достаточно обновлять данные ночью.
Для обновления кубов нужно щелкнуть правой кнопкой мыши на соответствующей папке базы данных OLAP и выбрать пункт Process All Cubes (Обработка всех кубов). Как уже говорилось, если вы хотите обновлять кубы по отдельности, щелкните правой кнопкой мыши на имени куба и выберите из контекстного меню пункт Process.
Ваш доступ к OLAP-кубам SQL Server происходит через приложение OLE DB, путем просмотра данных через Аnalysis Manager или путем установки связи с базой данных OLAP. Диалоговое окно Cube Browser в Аnalysis Manager является полезным средством просмотра данных, основываясь на кубах, которые вы уже создали.
Но если у вас есть уже функционирующий склад данных или рынок данных, который уже функционирует, то вам, возможно, будет трудно включить SQL Server Аnalysis Services в уже существующую работу, поскольку Аnalysis Services действует путем создания новых кубов данных, базирующихся на вашей базе данных, и доступ к этим кубам осуществляется через интерфейс OLE DB. Если ваше текущее приложение не использует OLE DB, то вам, видимо, не удастся использовать возможности Аnalysis Services.
Аnalysis Services можно использовать для выполнения многомерного анализа во многих типах складов и рынков данных. Для выполнения многомерного анализа из агрегатов данных вы можете использовать диалоговое окно Cube Browser в Аnalysis Manager. Использование преимуществ Аnalysis Services зависит от возможностей включения этих служб в вашу деловую среду.
Заключение
В этой лекции вы узнали, что такое Аnalysis Services и как устанавливать это средство. Вы также узнали, как создавать кубы и как поддерживать агрегированные данные в базе данных SQL Server. Информация этой лекции поможет вам определить, подойдет ли для вашей среды использование Аnalysis Services. В следующей лекции вы узнаете о некоторых задачах и средствах, связанных с администрированием системы SQL Server.
Лекция 30. Администрирование Microsoft SQL Server
Правильное конфигурирование ваших серверов SQL и регулярное выполнение задач обслуживания ваших баз данных – это ключ к достижению высокой эффективности работы. В этой лекции вы узнаете о средствах динамического конфигурирования Microsoft SQL Server 2000, которые помогают упростить процесс конфигурирования системы баз данных. Вы также узнаете, как использовать мастер Database Maintenance Plan Wizard для создания автоматизированного плана обслуживания ваших баз данных. Использование планов обслуживания – это отличный способ поддерживать ваши базы данных в рабочем состоянии.
Средства автоматического конфигурирования SQL Server
SQL Server содержит множество автоматических средств, предназначенных для снижения расходов, которые обычно связаны с конфигурированием и настройкой системы управления реляционными базами данных (RDBMS). В этом разделе вы ознакомитесь с некоторыми из этих средств. (Те, кто работал с Microsoft SQL Server 7, уже знают об этих средствах, поскольку они были введены именно в SQL Server 7.) Вы узнаете, как они действуют, как их использовать для облегчения вашей работы администратора баз данных (DBA) и как переопределять при необходимости эти автоматические средства.
Динамическое управление памятью
Динамическое управление памятью позволяет SQL Server динамически конфигурировать количество памяти, используемое для буферного кэша и кэша процедур, исходя из доступной памяти системы. Поскольку в SQL Server включено динамическое управление памятью, DBA не обязан вручную управлять размером каждого кэша. Но в определенных ситуациях вам может потребоваться ограничение количества памяти, используемой SQL Server, и такая возможность тоже существует.
Как действует динамическое управление памятью
Средство динамического управления памятью действует путем постоянного мониторинга доступной физической памяти в системе. SQL Server увеличивает или уменьшает пул памяти SQL Server (описан в следующем разделе), исходя из своих потребностей и количества доступной памяти. Это может оказаться очень полезным в системах, где количество используемой памяти относительно стабильно, но если количество памяти, используемое процессами, не связанными с SQL Server, варьируется, то SQL Server будет постоянно изменять свое распределение памяти, и это может создавать проблемы.
Компьютерная система, которая используется в основном как сервер базы данных SQL Server, вполне подходит для динамического управления памятью. В такой системе количество памяти, используемое процессами, отличными от SQL Server, стабильно, поэтому SQL Server будет автоматически выделять себе память, необходимую для своей эффективной работы вплоть до предела доступной физической памяти. Затем SQL Server будет поддерживать это количество, пока не потребуется память другим процессам. Если другому процессу действительно требуется память, SQL Server освобождает необходимое количество памяти, чтобы оно было доступно для другого процесса.
Компьютерная система, на которой выполняются процессы с постоянно изменяющимися требованиями памяти, причем количество процессов часто увеличивается или уменьшается, не слишком подходит для динамического управления памятью. На такой системе использование памяти постоянно изменяется, что требует от SQL Server постоянного закрепления и освобождения памяти, когда она требуется другим процессам, что может оказаться неэффективным из-за дополнительной нагрузки. В системе такого типа может оказаться более эффективным ручное выделение фиксированного количества памяти для SQL Server или задание минимального и максимального количества памяти, которое может получать SQL Server. Вы узнаете, как это сделать, ниже в этой лекции.
Таким образом, выбор между динамическим и ручным управлением памятью определяется степенью изменчивости использования памяти в системе. Применяя мониторинг использования памяти системой SQL Server, вы можете определить, изменяется ли количество используемой памяти каким-либо регулярным образом или остается достаточно стабильным. Для мониторинга использования памяти вы можете использовать Microsoft Windows 2000 Performance Monitor. Счетчик Total Server Memory (KB) внутри объекта SQLServer:Memory Manager показывает количество памяти в килобайтах (Кб), которое использует в данный момент SQL Server. Чтобы определить, как изменяется использование памяти в течение времени, следите за этим счетчиком в окне диаграмм (chart window).
Пул памяти
SQL Server динамически выделяет и освобождает память в пуле. Пул памяти содержит определенное количество памяти, которое разделяется между следующими компонентами:
- Буферный кэш. Содержит страницы базы данных, считанные в память. Буферный кэш обычно забирает основную часть пула памяти.
- Память для соединений. Используется каждым соединением с SQL Server. Память для соединений содержит структуры данных, с помощью которых отслеживается контекст каждого пользователя; это информация о позиционировании курсора, значения параметров очереди и информация хранимых процедур.
- Структуры данных. Содержит глобальную информацию о блокировках и дескрипторах базы данных, включая информацию о владельцах блокировок, о типах захваченных блокировок, а также о различных файлах и группах файлов.
- Кэш журнала. Используется для информации журнала, которая будет записана в журнал транзакций. Он также используется, когда происходит чтение последней информации, записанной в этот кэш. Использование кэша журнала повышает производительность операций записи в журналы. Кэш журнала не следует путать с буферным кэшем.
- Кэш процедур. Используется для хранения планов исполнения операторов Transact-SQL (T-SQL) и хранимых процедур, когда происходит их выполнение.
Поскольку в случае использования динамического управления памятью распределение памяти динамически изменяется, пул памяти может все время увеличиваться или уменьшаться. Кроме того, указанные пять компонентов пула памяти тоже могут динамически изменять свои размеры. Это распределение недоступно для конфигурирования; управление осуществляет SQL Server. Например, когда требуется больше памяти, чтобы в кэше процедур можно было хранить больше операторов T-SQL, SQL Server может забирать часть памяти из буферного кэша и использовать ее для кэша процедур.
Использование дополнительной памяти
Количество памяти, доступной для SQL Server, зависит от используемой операционной системы Windows. Microsoft Windows NT Server 4 поддерживает 4 Гб памяти, 2 Гб из которых выделяется для пользовательских процессов и 2 Гб резервируется для использования системой. Это ограничение в 2 Гб представляет максимальное количество памяти, которое может быть выделено для SQL Server в NT 4.0. Но в системе Windows NT Server 4 Enterprise Edition количество виртуальной памяти, выделяемой для процесса, на 50 процентов больше – 3 Гб. Это увеличение стало возможным, так как память, выделенная для системы, была сокращена до 1 Гб. Такое увеличение виртуальной памяти, выделенной для процессов, позволяет вам увеличивать размер пула памяти до величины, близкой к 3 Гб. Чтобы активизировать эту поддержку в Windows NT 4 Enterprise Edition, вы должны добавить флаг /3GB к строке загрузки в файле Boot.ini, что можно сделать с помощью значка System (Система) в панели управления.
Имеется две версии операционной системы Windows 2000, в которых SQL Server 2000 Enterprise Edition может использовать интерфейс расширенной памяти Windows 2000 Address Windowing Extensions (AWE) API, поддерживающий адресные пространства большего размера. SQL Server поддерживает около 8 Гб в системе Windows 2000 Advanced Server и около 64 Гб в системе Windows 2000 Datacenter Server. AWE поддерживается только в этих двух операционных системах и не поддерживается в Windows 2000 Professional. (Для получения более подробной информации см. лекцию 2 этой книги и тему "Using AWE Memory on Windows 2000" [Использование AWE-памяти в Windows 2000] в Books Online.)
Параметры конфигурирования памяти SQL Server
Следующие параметры конфигурирования SQL Server связаны с конкретными аспектами распределения памяти. Вы можете задать эти параметры с помощью SQL Server Enterprise Manager или с помощью хранимой процедуры sp_configure. Для просмотра всех этих параметров с помощью sp_configure у вас должно быть задано значение 1 для параметра show advanced options (показать дополнительные параметры).
- awe enabled (активизирована awe). Разрешает SQL Server использовать расширенную память (AWE-память, о которой говорилось выше). Значение 1 для этого параметра активизирует эту память. Данный параметр доступен только в SQL Server Enterprise Edition, и его можно задать только с помощью процедуры sp_configure.
- index create memory (память для создания индекса). Ограничивает количество памяти, используемое для сортировок при создании индекса. Параметр index create memory является самоконфигурируемым. Он не требует изменений в большинстве случаев. Но если вы испытываете трудности при создании индексов, то можете попытаться увеличить значение этого параметра по сравнению с его значением по умолчанию.
- max server memory (максимальная память для сервера). Задает максимальное количество памяти, которое может захватить для пула памяти SQL Server. Оставьте значение по умолчанию, если хотите, чтобы SQL Server динамически захватывал и освобождал память. Если вы хотите выделить память статически (чтобы используемое количество памяти не изменялось), задайте одинаковые значения для этого параметра и параметра min server memory.
- min memory per query (минимальная память на один запрос).Задает минимальное количество памяти (в килобайтах), которое будет выделяться для выполнения одного запроса.
- min server memory (минимальная память для сервера). Задает минимальное количество памяти, которое может захватить для пула памяти SQL Server. Оставьте значение по умолчанию, чтобы использовалось динамическое распределение памяти. Если вы хотите выделить память статически, задайте одинаковые значения для этого параметра и параметра max server memory.
- set working set size (размер рабочего набора). Указывает, что для памяти, которую занял SQL Server, не допускается свопинг, даже если эта память может более эффективно использоваться другим процессом. Параметр set working set size не должен использоваться, если для SQL Server задано динамическое использование памяти. Его следует использовать, только когда для параметров min server memory и max server memory задано одинаковое значение. В этом случае SQL Server захватит определенное статическое количество памяти, не подлежащей страничному обмену.
Другие параметры динамического конфигурирования
В SQL Server имеется несколько параметров динамического конфигурирования или SQL Server Enterprise Manager (но не все параметры можно задать через Enterprise Manager). Чтобы задать какой-либо параметр через sp_configure, откройте Query Analyzer (Анализатор очередей) или osql-соединение в окне командной строки и запустите эту хранимую процедуру со следующими параметрами:
sp_configure "имя параметра", значение
Имя параметра – это имя параметра конфигурирования, а значение – это значение, которое вы хотите ему присвоить. Если запустить эту команду, не указывая значение, то SQL Server возвратит текущее значение указанного параметра. Чтобы увидеть список всех параметров и их значений, запустите sp_configure без какого-либо параметра. Несколько параметров считаются дополнительными. Для просмотра и конфигурирования этих параметров с помощью sp_configure вы должны сначала задать для параметра show advanced options (показать дополнительные параметры) значение 1, как это показано ниже:
sp_configure "show advanced options", 1
Параметр show advanced options не оказывает влияния на параметры, которые можно конфигурировать через Enterprise Manager.
Чтобы задать значение какого-либо параметра с помощью Enterprise Manager, сначала откройте в Enterprise Manager окно Properties (Свойства) для сервера, щелкнув правой кнопкой мыши на имени этого сервера и выбрав из контекстного меню пункт Properties (рис. 30.1).
Рис. 30.1. Вкладка General окна Properties в Enterprise Manager
Вы можете затем осуществлять доступ к определенным динамическим параметрам во вкладках этого окна. В следующих разделах описываются динамические параметры SQL Server, не связанные с памятью; в каждом разделе указывается, можно ли задавать соответствующий параметр в Enterprise Manager, и если да, то указывается местоположение этого параметра в окне Properties.
Параметр locks (блокировки)
SQL Server динамически конфигурирует количество используемых в системе блокировок в соответствии с текущими потребностями. Вы можете задать значение параметра locks для указания максимального количества блокировок, ограничив тем самым количество памяти, которое использует для блокировок SQL Server. По умолчанию задано значение 0, что позволяет SQL Server динамически захватывать и освобождать блокировки в зависимости от изменяющихся требований системы. В SQL Server разрешается использовать для блокировок до 40 процентов всей его памяти. Вам следует оставить для этого параметра принятое по умолчанию значение 0, чтобы SQL Server захватывал блокировки по необходимости. Этот параметр входит в группу дополнительных параметров, и его можно задать только с помощью sp_configure.
Параметр recovery interval (интервал восстановления)
Параметр recovery interval указывает максимальное количество минут, которое может потратить SQL Server для восстановления после аварии. (См. ниже в этой лекции раздел "Контрольные точки" с более подробным описанием того, как действуют контрольные точки.) Время, которое требуется SQL Server для восстановления базы данных, зависит от момента, когда была создана последняя контрольная точка. Поэтому значение recovery interval используется в SQL Server для динамического определения моментов автоматического применения контрольных точек.
Например, когда происходит "чистое" закрытие SQL Server, контрольные точки создаются по всем базам данных, поэтому при перезапуске SQL Server восстановление занимает немного времени. Но если происходит вынужденная остановка SQL Server без "чистого" отключения (из-за отказа источника питания или аварии другого типа), то при повторном запуске SQL Server должен восстанавливать каждую базу данных путем отката всех транзакций, которые не были фиксированы, и повторного выполнения транзакций, которые были фиксированы, но их изменения еще не были записаны на диск к моменту аварии. Если последняя контрольная точка была создана незадолго до аварии системы, то на восстановление уйдет немного времени. Если последняя контрольная точка была создана задолго до аварии системы, это потребует более длительного времени восстановления.
SQL Server определяет, насколько часто нужно создавать контрольные точки, согласно встроенному алгоритму и, как уже говорилось, в соответствии со значением recovery interval. Например, если вы зададите для recovery interval значение 5, то SQL Server будет создавать контрольные точки по каждой базе данных с такой частотой, чтобы восстановление после аварии занимало бы примерно 5 минут. По умолчанию значение recovery interval равно 0, указывая на автоматическое конфигурирование интервала в SQL Server. Если используется это значение по умолчанию, то время восстановления меньше 1 минуты и контрольные точки создаются для активных баз данных приблизительно каждую минуту. Во многих случаях преимущества частого создания контрольных точек теряются за счет снижения производительности, вызываемого созданием контрольных точек. Со временем вам придется снизить количество создаваемых контрольных точек, увеличив значение recovery interval. Выбираемое вами значение будет зависеть от деловых требований, связанных с тем, сколько времени могут ждать пользователи в случае восстановления системы после аварии. Обычно следует использовать значение в интервале от 5 до 15 минут, соответствующее времени восстановления от 5 до 15 минут.
Параметр recovery interval входит в группу дополнительных параметров. Вы можете задать его в Enterprise Manager во вкладке Database Settings (Параметры базы данных) окна Properties в поле Recovery Interval (min) (рис. 30.2).
Рис. 30.2. Задание параметра recovery interval
Параметр user connections (количество соединений с пользователями)
SQL Server динамически конфигурирует допустимое количество соединений пользователей с SQL Server. В SQL Server допускается до 32767 соединений с пользователями Задавая значение user connections, отличное от 0, вы указываете максимально допустимое количество одновременных подсоединений пользователей к SQL Server. (Количество допустимых подсоединений пользователей также зависит от ограничений ваших приложений и оборудования.) Количество подсоединений пользователей будет также динамически конфигурироваться вплоть до указанного максимума.
Например, если подсоединяются только 10 пользователей, будет выделено только 10 объектов-соединений с пользователями (user connection). Если достигнуто максимальное значение, а SQL Server требуются новые соединения с пользователями, то вы получите сообщение об ошибке, где указывается, что достигнуто максимальное значение по количеству соединений с пользователями.
В большинстве случаев принятое по умолчанию значение параметра user connections изменять не требуется. Отметим, что для каждого соединения требуется порядка 40 Кб памяти.
Чтобы определить максимальное количество соединений с пользователями, допустимое в вашей системе, вы можете использовать SQL Server Query Analyzer или следующий оператор T-SQL:
SELECT @@MAX_CONNECTIONS
Параметр user connections входит в группу дополнительных параметров. Вы можете задать его в Enterprise Manager во вкладке Connections (Соединения) окна Properties в поле-счетчике Maximum Concurrent User Connections (Максимальное число одновременных соединений с пользователями) (рис. 30.3).
Рис. 30.3. Задание параметра user connections
Параметр open objects (количество открытых объектов)
Параметр open objects входит в группу дополнительных параметров; его можно задать только с помощью процедуры sp_configure. Этот параметр определяет максимально допустимое количество одновременно открытых объектов базы данных, таких как таблицы, представления, хранимые процедуры, триггеры, правила и значения по умолчанию. Принятое по умолчанию значение 0 указывает, что SQL Server будет динамически регулировать допустимое количество одновременно открытых объектов в данной системе. Вам следует оставить это значение по умолчанию без изменений. Если вы все же измените его, а SQL Server потребуется больше открытых объектов, чем вы сконфигурировали, то появится сообщение об ошибке от SQL Server, где указывается, что вы превысили допустимое количество открытых объектов. Кроме того, для каждого открытого объекта требуется некоторое количество памяти, поэтому вашей системе может потребоваться большее количество физической памяти, чтобы поддерживать необходимое количество открытых объектов.
Статистика
Статистика по колонкам необходима для повышения производительности запросов в вашей системе. SQL Server может собирать статистическую информацию, касающуюся распределения значений в колонке таблицы. Оптимизатор запросов Query Optimizer затем использует эту информацию для определения оптимального плана исполнения запроса. Статистику можно собирать по двум типам колонок: по тем, что являются частью индекса, и по тем, что не входят в индекс, но используются в предикате запроса (в предложении WHERE ). Оставив принятые по умолчанию значения SQL Server для базы данных, вы разрешаете автоматическое создание обоих типов статистики в SQL Server. Статистика по индексированным колонкам создается при создании соответствующего индекса. Статистика по неиндексированным колонкам создается, когда она требуется для какого-либо запроса (только по одной колонке, а не по нескольким, как вы увидите в подразделе "Команда CREATE STATISTICS" этого раздела). Если статистика устарела (не использовалась в течение определенного периода времени), то SQL Server автоматически удаляет ее.
Чтобы создать статистику и по индексированным, и по неиндексированным колонкам, SQL Server использует только выборку данных таблицы, но не все строки таблицы. Это снижает дополнительную нагрузку, связанную с этой операцией, но в некоторых случаях выборка недостаточно хорошо характеризует данные и статистика оказывается не совсем точной.
В Enterprise Manager вы можете активизировать или отключать автоматическое создание статистики по базе данных. Для этого сначала откройте окно Properties этой базы данных. Во вкладке Options вы увидите флажок Auto Create Statistics (Автоматическое создание статистики). (На рис. 30.4 этот флажок установлен для базы данных MyDB.) Этот флажок установлен (активизирован) по умолчанию.
В окне Properties соответствующей базы данных вы также увидите флажок Auto Update Statistics (Автоматическое обновление статистики). Этот флажок, который установлен по умолчанию для каждой базы данных, указывает, что SQL Server при необходимости будет автоматически обновлять статистику по колонкам таблицы. Статистику требуется обновлять в тех случаях, когда изменилось большое количество (или большой процент) строк таблицы (посредством операций обновления, вставки и удаления). При большом числе изменений в данных текущая статистика становится менее точной. SQL Server автоматически определяет, когда требуется обновить статистику. Если вы решили отключить автоматическое создание статистики, сбросив этот флажок, то вы должны выполнять эти задачи вручную, чтобы убедиться в нормальной работе вашей базы данных. В следующих разделах описывается, как создавать и обновлять статистику вручную.
Рис. 30.4. Окно Properties для базы данных MyDB
Команда CREATE STATISTICS
Вы можете создавать статистику по определенным колонкам таблицы вручную с помощью оператора T-SQL CREATE STATISTICS. Создание статистики вручную отличается от автоматического создания в том, что оно позволяет вам объединять несколько колонок, генерируя для комбинации колонок такую информацию, как среднее количество дублированных значений и отличающихся значений. Команда CREATE STATISTICS имеет следующий синтаксис:
CREATE STATISTICS имя_статистики ON имя_таблицы ( колонка [ , колонка... ] ) [ [WITH [ FULLSCAN | SAMPLE размер PERCENT ] [ , NORECOMPUTE ]
Вам следует ввести имя для набора статистики, который вы создаете, имя таблицы, а также имя хотя бы одной колонки. Вы можете указать несколько имен колонок для сбора статистики по комбинации колонок. Отметим, что вы не можете указывать для статистики расчетные колонки или колонки с типом данных ntext, text или image. Для сбора статистики можно указывать полное сканирование ( FULLSCAN ) или выборку данных ( SAMPLE ). Для полного сканирования требуется больше времени, чем для выборки, поскольку сканируется каждая строка таблицы, но результаты могут оказаться более точными. Используя выборку, вы должны указать процент данных, включаемых в выборку. Ключевое слово NORECOMPUTE указывает, что автоматическое обновление этой статистики отключено, что позволяет использовать статистику, которая уже не отражает текущее состояние данных.
Вам может потребоваться создание статистики по колонкам, которые совместно используются в предикате запроса. Например, вы можете создать статистику по колонкам FirstName (Имя) и LastName (Фамилия) таблицы Employees (Сотрудники) базы данных Northwind для поиска сотрудника по имени и фамилии. Для этого используется следующая последовательность T-SQL:
CREATE STATISTICS name ON Northwind..Employees (FirstName, LastName) WITH FULLSCAN, NORECOMPUTE
Этот оператор рассчитывает статистику для всех строк колонок FirstName и LastName и отключает автоматический перерасчет статистики.
Если вы хотите запустить статистику для всех колонок всех таблиц базы данных вручную без ввода операторов CREATE STATISTICS для каждой колонки каждой таблицы, то можете использовать хранимую процедуру sp_createstats. Эта хранимая процедура описана в следующем разделе.
Процедура sp_createstats
Вы можете запустить статистику для всех допустимых колонок всех таблиц пользовательских базы данных с помощью хранимой процедуры sp_createstats. Статистика будет создана для всех колонок, по которым еще не создана статистика. Каждый набор статистики будет создан по какой-либо одной колонке. Процедура sp_createstats имеет следующий синтаксис:
sp_createstats [ 'indexonly' ] [ , 'fullscan' ] [ , 'norecompute' ]
Параметр indexonly указывает, что статистика будет создана только по колонкам, включаемым в индекс. Параметр fullscan указывает, что будет выполнено полное сканирование всех строк, а не случайная выборка; иначе говоря, будет использована выборка 100 процентов данных. Параметр norecompute указывает, что по этой новой статистике будет отключено автоматическое обновление статистики. Новой статистике присваивается имя колонки, по которой она создается.
Команда UPDATE STATISTICS
По умолчанию SQL Server автоматически обновляет статистику. Вы можете отключить эту возможность с помощью команды UPDATE STATISTICS и затем обновлять статистику вручную, чтобы она соответствовала текущему состоянию данных. Эта команда позволяет вам обновлять статистику по индексированным колонкам и неиндексированным колонкам. Возможно, вы создадите сценарий, который будет выполнять команду UPDATE STATISTICS для наиболее часто модифицируемых таблиц, и затем будете периодически запускать этот сценарий как задание SQL Server. Это позволит поддерживать статистику в соответствии с текущим состоянием данных и поддерживать более высокую производительность запросов. (О синтаксисе и параметрах команды UPDATE STATISTICS см. в разделе "Перестроение индексов" [Rebuilding Indexes] лекция 17.) Чтобы активизировать или отключить автоматическое обновление для определенной статистики, вы можете использовать хранимую процедуру sp_autostats, которая описывается далее.
Процедура sp_autostats
Используя системную хранимую процедуру sp_autostats, вы можете активизировать или отключить автоматическое обновление определенной статистики. Запуск этой процедуры не приводит к обновлению данной статистики; она просто определяет, должно ли происходить автоматическое обновление статистики. Вызов этой хранимой процедуры происходит с одним, двумя или тремя параметрами: имя таблицы и – дополнительно – флаг и имя статистики. Флаг указывает состояние автоматического обновления и может принимать значения ON (включено) или OFF (отключено). Чтобы вывести текущий статус обновления для всех наборов статистики по определенной таблице (статистика по индексированным колонкам и неиндексированным колонкам), запустите эту команду с именем этой таблицы. Следующая команда выводит этот статус для наборов статистики по таблице Customers:
USE Northwind GO sp_autostats Customers GO
Будет выведено имя каждого набора статистики независимо от значения флага автоматического обновления ( ON или OFF ) и время последнего обновления. Не обращайте внимания на заголовок первой колонки Index Name (Имя индекса). Он относится ко всем наборам статистики, а не только к индексам. Если вы не отключили вручную обновление для этих наборов статистики, то они будут представлены со статусом ON, поскольку это принятое по умолчанию состояние в SQL Server.
Чтобы отключить автоматическое обновление всех наборов статистики в таблице Customers базы данных Northwind, используйте следующую команду:
USE Northwind GO sp_autostats Customers, 'OFF' GO
Вы можете снова активизировать автоматическое обновление статистики, задав для флага значение ON. Чтобы изменить статус определенного набора статистики или статистики для индекса, включите в обращение соответственно имя набора статистики или имя индекса. Например, следующая команда задает автоматическое обновление статистики для индекса PK_Customers:
USE Northwind GO sp_autostats Customers, 'ON', 'PK_Customers' GO
Статус всех других наборов статистики по таблице Customers не изменится.
Рост файлов
Работая с SQL Server 2000, вы можете конфигурировать файлы данных для их автоматического увеличения по мере необходимости. Это средство полезно, поскольку оно препятствует случайному выходу файлов за пределы допустимого дискового пространства. Однако использование это средства не освобождает вас от обязанности мониторинга размера ваших баз данных и выполнения время от времени процедур планирования мощности. Вы также должны следить за тем, как быстро происходит рост таблиц, чтобы вы могли определить, нужно ли вам выполнять регулярное удаление ненужных, возможно, устаревших данных в некоторых таблицах, чтобы сдерживать рост ваших таблиц. По мере роста количества данных в таблице запросы могут занимать больше времени, что приводит к снижению уровня производительности. Тема конфигурирования автоматического роста при создании базы данных была затронута в лекции 9, а здесь вы узнаете, как изменять параметры увеличения файлов для существующей базы данных. Параметры автоматического роста файлов можно сконфигурировать в Enterprise Manager. Для этого выполните следующие шаги.
- В левой панели Enterprise Manager раскройте сервер и затем щелкните на папке Databases (Базы данных). Щелкните правой кнопкой мыши на базе данных, которую вы хотите модифицировать (в данном примере мы будем модифицировать базу данных MyDB), и выберите из контекстного меню пункт Properties, чтобы открыть окно свойств базы данных Properties.
- Щелкните на вкладке Data Files (Файлы данных) (рис. 30.5), чтобы увидеть свойства файлов данных для этой базы данных. Параметры секции File properties (Свойства файлов) предназначены для того, чтобы вы могли контролировать рост файла данных. Чтобы разрешить автоматический контроль роста файла, установите флажок Automatically grow file (Автоматический рост файла). Используя средство автоматического увеличения файла, вы должны задать ограничения, чтобы воспрепятствовать неконтролируемому росту файла.
Рис. 30.5. Вкладка Data Files (Файлы данных) окна Properties базы данных MyDBМаксимальный размер файла указывается с помощью параметров секции Maximum file size (Максимальный размер файла). Щелкните на кнопке выбора Restrict file growth (Ограничить рост файла) и введите максимально допустимый размер в прокручиваемом поле-счетчике. Если щелкнуть на кнопке выбора Unrestricted file growth (Неограниченный рост файла), то в дальнейшем вы можете столкнуться с тем, что вся ваша дисковая подсистема заполнена до конца без какого-либо предупреждения, создавая проблемы как для работы, так и производительности.Степень роста файла задается с помощью параметров секции File growth (Рост файла). Если щелкнуть на кнопке выбора In megabytes (Мегабайты), то после заполнения этого файла данных SQL Server увеличит его размер на указанную величину. Если щелкнуть на кнопке выбора By percent (Проценты), то SQL Server увеличит размер файла данных на указанную величину в процентах от текущего размера.
- Щелкните на вкладке Transaction Log (Журнал транзакций) (рис. 30.6), чтобы задать параметры автоматического роста для журнала транзакций. Параметры этой вкладки используются так же, как и соответствующие параметры вкладки Data Files. Вы должны задать пределы для файлов журнала транзакций, чтобы воспрепятствовать их неконтролируемому росту.
Рис. 30.6. Вкладка Transaction Log (Журнал транзакций) для окна Properties базы данных MyDBСредство контроля автоматического роста файлов удобно использовать во многих случаях. Просто убедитесь в том, что вы не задали случайно неконтролируемый рост файла, что может привести к использованию этим файлом всего дискового пространства вашей системы.
Контрольные точки
SQL Server выполняет операции с контрольными точками автоматически. Частота создания контрольных точек автоматически рассчитывается в соответствии со значением, которые вы задали для параметра конфигурирования SQL Server recovery interval. Этот параметр указывает длительность вашего ожидания в минутах при восстановлении базы данных после аварии системы. Контрольные точки создаются достаточно часто, чтобы время восстановления системы не превысило указанного вами значения в минутах. Кроме того, контрольные точки автоматически создаются при отключении SQL Server с помощью оператора SHUTDOWN или Service Control Manager (Диспетчер управления службами). Вы можете также создавать контрольные точки вручную с помощью оператора CHECKPOINT.
Если вы хотите, чтобы система работала оптимальным образом и если вы готовы подождать подольше, то можете задать для параметра recovery interval достаточно большое значение, например, 60. Это означает, что при аварии вашей системы автоматическое восстановление будет занимать до 60 минут. При создании контрольных точек выполняется большое количество операций записи на диск, а они могут отбирать часть ресурсов обработки у пользовательских транзакций, увеличивая время отклика на запросы пользователей. Вот почему менее частое создание контрольных точек может помочь в повышении производительности по транзакциям в целом. Конечно, слишком большое значение параметра может приводить к слишком длительному простою после аварии. Обычно для recovery interval задают значение от 5 до 15 (минут).
По умолчанию для recovery interval задано значение 0. Это значение указывает, что SQL Server будет определять наилучшие моменты создания контрольных точек, исходя из загруженности системы. Обычно при использовании этого значения по умолчанию контрольные точки создаются приблизительно раз в минуту. Если вы считаете, что они создаются слишком часто, то можете изменить значение recovery interval. Чтобы определить, не слишком ли часто SQL Server создает контрольные точки, используйте флаг трассировки SQL Server -T3502. Это флаг указывает запись информации по контрольным точкам в журнал ошибок SQL Server. Отметим, что контрольные точки создаются по каждой базе данных.
Планы обслуживания баз данных
План обслуживания – это набор задач, которые SQL Server будет автоматически выполнять по вашим базам данных согласно заданному вами расписанию. Целью плана обслуживания является автоматизация важных административных задач и снижение объема ручной работы DBA. Вы можете создавать отдельный план для каждой базы данных, несколько планов для одной базы данных или один план для нескольких баз данных.
Имеются четыре следующие основные категории административных задач, которые вы можете планировать путем создания плана обслуживания.
- Оптимизации.
- Проверки целостности.
- Резервное копирование баз данных.
- Резервное копирование журнала транзакций.
Выполнение этих задач имеет важное значение для поддержки хорошо работающей и восстанавливаемой базы данных. Типы оптимизационных задач, которые вы включите в ваш план, будут зависеть от производительности и степени использования вашей базы данных. Выполнение проверок целостности является хорошим средством, чтобы обеспечить согласованность и сохранность базы данных. А регулярное резервное копирование требуется для того, чтобы обеспечить восстанавливаемость базы данных в случае аварии системы или пользовательских ошибок. В силу особой важности операций резервного копирования вам следует разработать стратегию автоматизированного резервного копирования. Мы подробно рассмотрим каждую из этих категорий задач в данном разделе.
Для создания плана обслуживания используется мастер Database Maintenance Plan Wizard. В данном разделе вы узнаете, как использовать этот мастер, а затем узнаете, как выводить на экран задания плана обслуживания и как редактировать этот план.
Использование мастера Database Maintenance Plan Wizard для создания плана обслуживания
Для использования мастера Database Maintenance Plan Wizard выполните следующие шаги.
- Запустите этот мастер из Enterprise Manager с помощью одного из следующих методов.
- Выберите из меню Tools пункт Database Maintenance Planner (Планировщик обслуживания баз данных).
- Щелкните на имени базы данных в левой панели и затем щелкните на New Maintenance Plan (Новый план обслуживания) под заголовком Maintenance (Обслуживание) в правой панели. Если вы не видите заголовка Maintenance, убедитесь в том, что у вас выбран пункт Taskpad (Панель задач) в меню View (Вид) Enterprise Manager. Возможно, вам придется также выполнить прокрутку, чтобы увидеть заголовок Maintenance.
- Щелкните на имени базы данных, выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне Select Wizard (Выбор мастера) папку Management (Управление) и затем выберите Database Maintenance Plan Wizard.
- Раскройте сервер в левой панели, раскройте папку Management, щелкните правой кнопкой мыши на Database Maintenance Plans (Планы обслуживания баз данных) и затем выберите из появившегося контекстного меню пункт New Maintenance Plan.
- Щелкните правой кнопкой мыши на имени соответствующей базы данных, выберите пункт All Tasks (Все задачи) и затем выберите из этого меню Maintenance Plan.
Рис. 30.7. Начальное окно мастера Database Maintenance Plan Wizard - Щелкните на кнопке Next (Далее), чтобы появилось окно Select Databases (Выбор баз данных) (рис. 30.8). Здесь вы можете выбрать базу или базы данных, для которых хотите создать план обслуживания.
Рис. 30.8. Окно Select Databases (Выбор баз данных) - Щелкните на кнопке Next, чтобы появилось окно Update Data Optimization Information (Обновление информации по оптимизации данных) (рис. 30.9). Вы можете выбирать следующие типы оптимизации для базы или баз данных, выбранных на предыдущем шаге.
- Reorganize data and index pages (Реорганизация страниц данных и индексов).Этот флажок указывает, что все индексы и все таблицы базы данных будут удалены и воссозданы с использованием указанного коэффициента заполнения (или количества свободного места на каждой странице), что может повысить производительность обновлений. В случае таблиц, предназначенных только для чтения, реорганизация страниц не является необходимостью. В случае таблиц, для которых часто выполняются вставки или изменения, свободное место, которое первоначально было доступно на ваших индексных страницах, постепенно заполняется, и начинает происходить фрагментация страниц. Установите этот флажок, чтобы выполнить повторное создание ваших индексов и образовать свободное место для будущего роста во избежание задержек и нагрузок, вызываемых фрагментацией страниц.
Вы можете выбрать между повторным созданием индексов с исходным количеством свободного места или указать новый процент свободного места на одну страницу. Если задать слишком большой процент, то вы рискуете снизить производительность операций чтения. Установив этот флажок, вы не можете установить следующий флажок – Update statistics used by query optimizer.
Совет.Удаление и повторное создание индексов может оказаться более длительным, чем использование DBCC DBREINDEX, см. раздел "Перестроение индексов" (Rebuilding Indexes) лекции 17. Вы можете также создать свое собственное задание по перестроению индексов вместо использования этого средства.
Рис. 30.9. Окно Update Data Optimization Information (Реорганизация страниц данных и индексов) - Update statistics used by query optimizer (Обновление статистики, используемой оптимизатором запросов) При установке этого флажка SQL Server выполнит перерасчет статистики распределения по всем индексам в соответствующей базе данных. SQL Server использует эту информацию для выбора оптимального плана исполнения для запросов. Если вы не изменили принятый по умолчанию параметр для обновления статистики (рассмотренный выше в этой лекции), то SQL Server автоматически генерирует статистику путем выборки небольшого процента данных в таблице, соответствующей каждому индексу.
Флажок этого окна можно использовать для того, чтобы SQL Server выполнял выборку с использованием большего процента данных (указанного вами) или чтобы задать частоту, с которой SQL Server должен обновлять эту статистику, вместо автоматического выбора частоты в SQL Server. Чем больше процент выборки данных, тем точнее будет статистика, но при этом SQL Server потратит больше времени. Эта информация может помочь в повышении производительности при интенсивном изменении данных в индексируемых колонках. Вы можете проверить используемый план исполнения для ваших запросов с помощью анализатора запросов SQL Query Analyzer, чтобы определить, насколько эффективно используются индексы и насколько необходима установка данного флажка. Установив этот флажок, вы не сможете установить предыдущий флажок.
- Remove unused space prom database files (Удалить неиспользуемое пространство из файлов базы данных) Этот флажок применяется для удаления неиспользуемого пространства; этот процесс также известен как уплотнение (сжатие) файла (file shrink). Вы можете задать, насколько большим должно стать неиспользуемое пространство, чтобы произошло сжатие файла, а также процент пространства, которое должно остаться свободным после сжатия. Удалив свободное пространство, вы можете использовать DBCC SHRINKFILE для снижения размера данного файла. Если нужно, вы можете сделать его меньше, чем при первоначальном создании. Это позволит использовать для других целей дисковое пространство, которое раньше было занято файлом. Кроме того, сжатие файла за счет удаления неиспользуемого пространства может повысить производительность. В случае таблиц, предназначенных только для чтения, реорганизация страниц не является необходимостью.
Вы можете задать время, за которое должны выполняться эти задачи, щелкнув на кнопке Change (Изменить) и введя новое расписание в появившемся диалоговом окне Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 30.10). Эти задачи следует выполнять в периоды небольшой загруженности системы, например, в выходные дни или ночью, поскольку это требует определенного времени и может увеличивать время отклика на запросы пользователей.
Рис. 30.10. Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий)
- Reorganize data and index pages (Реорганизация страниц данных и индексов).Этот флажок указывает, что все индексы и все таблицы базы данных будут удалены и воссозданы с использованием указанного коэффициента заполнения (или количества свободного места на каждой странице), что может повысить производительность обновлений. В случае таблиц, предназначенных только для чтения, реорганизация страниц не является необходимостью. В случае таблиц, для которых часто выполняются вставки или изменения, свободное место, которое первоначально было доступно на ваших индексных страницах, постепенно заполняется, и начинает происходить фрагментация страниц. Установите этот флажок, чтобы выполнить повторное создание ваших индексов и образовать свободное место для будущего роста во избежание задержек и нагрузок, вызываемых фрагментацией страниц.
- Щелкните на кнопке Next, чтобы появилось окно Database Integrity Check (Проверка целостности базы данных) (рис. 30.11).
Рис. 30.11. Окно Database Integrity Check (Проверка целостности базы данных)В этом окне вы можете указать, нужно ли выполнять проверку целостности. При проверке целостности проверяется размещение и структурная целостность таблиц и индексов (если индексы включены в проверку) с помощью команды DBCC CHECKDB. Вы можете указывать, будут ли включаться в проверку индексы, будет ли SQL Server пытаться устранить небольшие проблемы (рекомендуется устанавливать этот флажок) и должны ли все эти проверки целостности выполняться перед резервным копированием. Если вы указали, что выполнение проверок должно происходить перед резервным копированием, то в случае обнаружения какой-либо проблемы это резервное копирование выполняться не будет. Щелкните на кнопке Change, чтобы изменить время, когда будут выполняться эти задачи. Проверка целостности может занимать несколько часов в зависимости от размера ваших баз данных, поэтому следите за тем, чтобы они не планировались на периоды интенсивного использования баз данных. Проверки должны проводиться регулярно, возможно, ежемесячно или еженедельно, или перед резервным копированием баз данных. - Щелкните на кнопке Next, чтобы появилось окно Specify the Database Backup Plan (План резервного копирования баз данных) (рис. 30.12). В этом окне вы указываете, будет ли создаваться план автоматизированного резервного копирования. (Рекомендуется создавать такой план.) Чтобы активизировать автоматическое резервное копирование, установите флажок Back up the database as part of the maintenance plan (Выполнять резервное копирование как часть плана обслуживания). (О выполнении резервного копирования см. лекцию 32.) Вы можете указать для SQL Server проверку целостности резервной копии по окончании копирования. SQL Server выполняет это для подтверждения того, что резервная копия создана полностью и все тома резервной копии доступны. Вы можете также указывать, где должна храниться резервная копия – на ленте или диске. Щелкните на кнопке Change, чтобы изменить время, когда будет выполняться резервное копирование.
Рис. 30.12. Окно Specify the Database Backup Plan (План резервного копирования баз данных) - Щелкните на кнопке Next, чтобы появилось окно Specify Backup Disk Directory (Дисковая директория для резервной копии) (рис. 30.13).
Рис. 30.13. Окно Specify Backup Disk Directory (Дисковая директория для резервной копии)Это окно появляется, только если вы задали в предыдущем окне резервное копирование на диск; оно не появится, если вы задали резервное копирование на ленту. В этом окне вы можете задать местоположение файла резервной копии или использовать принятую по умолчанию директорию для резервной копии. Если у вас несколько баз данных, для которых выполняется резервное копирование (таких как master, model, msdb), то вы можете выбрать размещение резервной копии каждой базы данных в ее собственной поддиректории, чтобы поддерживать определенную организацию файлов резервных копий. Вы можете выбрать автоматическое удаление файлов резервных копий по истечении определенного срока хранения, чтобы освобождалось пространство на дисках, а также можете задавать расширение имен файлов, которое хотите использовать для файлов резервных копий. - Щелкните на кнопке Next, чтобы появилось окно Specify the Transaction Log Backup Plan (План резервного копирования журнала транзакций) (рис. 30.14).
Рис. 30.14. Окно Specify the Transaction Log Backup Plan)Это окно устроено аналогично окну Specify the Database Backup Plan, показанному на рис. 30.12, но параметры этого окна используются для создания плана резервного копирования журнала транзакций. Резервное копирование журнала транзакций должно происходить между резервными копированиями вашей базы данных. Для восстановления любых изменений, выполненных с момента последнего резервного копирования базы данных, используется резервная копия журнала транзакций. Иначе говоря, резервные копии журнала транзакций позволяют вам восстанавливать данные между резервными копированиями базы данных.Если у вас выбрано сохранение резервных копий на диске, то следующим будет окно Specify Backup Disk Directory, в котором вы задаете информацию о местоположении файла резервной копии.
- Щелкните на кнопке Next, чтобы появилось окно Reports to Generate (Генерируемые отчеты) (рис. 30.15). В этом окне вы можете выбрать создание отчета, содержащего результаты выполнения задач плана обслуживания. Этот отчет содержит подробности выполненных шагов и любые возникшие ошибки. В этом окне вы также задаете местоположение для сохранения отчета, а также можете задать удаление отчетов через определенный период времени и отправку отчета по электронной почте указанным адресатам.
Рис. 30.15. Окно Reports to Generate (Генерируемые отчеты) - Щелкните на кнопке Next, чтобы появилось окно Maintenance History (Журнал обслуживания) (рис. 30.16). Здесь вы можете выбрать запись отчета с журналом (историей) обслуживания в таблицу базы данных на локальном сервере и задать максимальный размер этого отчета. Вы можете также указать запись этого отчета на удаленный сервер и задать максимальный размер этого отчета.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Database Maintenance Plan Wizard (Завершение работы мастера создания плана обслуживания баз данных) (рис. 30.17). В этом окне показана сводка вашего плана обслуживания. План получит имя по умолчанию, но вы можете задать другое имя, набрав его в текстовом поле Plan Name (Имя плана). Проверьте эту сводку и пройдите в обратном направлении, если хотите изменить какие-то параметры. Если план вас устраивает, щелкните на кнопке Finish (Готово).
Рис. 30.16. Окно Maintenance History (Журнал обслуживания)
Рис. 30.17. Окно Completing the Database Maintenance Plan Wizard (Завершение работы мастера создания плана обслуживания баз данных)
Отображение заданий плана обслуживания
Для нашего примера плана обслуживания мы создали по одной задаче в каждой из четырех категорий. Чтобы увидеть список этих заданий (запланированных задач), раскройте папку Management в левой панели Enterprise Manager, раскройте агент SQL Server Agent и затем щелкните на строке Jobs (Задания) (рис. 30.18).
увеличить изображение
Рис. 30.18. Задания, созданные в нашем примере плана обслуживания
Редактирование плана обслуживания
Чтобы отредактировать план обслуживания, щелкните в левой панели Enterprise Manager на имени базы данных, для которой создан план обслуживания, и затем выберите имя этого плана под заголовком Maintenance в правой панели. Возможно, вам потребуется выполнить прокрутку, чтобы увидеть заголовок Maintenance. Появится диалоговое окно Database Maintenance Plan (рис. 30.19).
Во вкладке General вы можете указывать, какие базы данных будет затрагивать ваш план обслуживания. В других вкладках вы можете изменять значения параметров, которые сконфигурировали с помощью мастера Database Maintenance Plan Wizard. Закончив редактирование плана, щелкните на кнопке OK. Ваш план теперь начнет выполняться в соответствии с указанным вами расписанием.
Рис. 30.19. Вкладка General диалогового окна Database Maintenance Plan
Заключение
В этой лекции вы узнали о средствах динамического конфигурирования SQL Server 2000, которые помогают снижать объем работы по настройке, выполняемой администраторами баз данных (DBA). Вы также узнали, как создавать план обслуживания баз данных для автоматического выполнения административных задач. В лекции 31 вы узнаете, как использовать SQL Server Agent для определения заданий и оповещений. Создавая задания и оповещения, вы можете еще больше автоматизировать административные задачи.
Лекция 31. Автоматизация административных задач
В лекции 30 мы рассмотрели некоторые из параметров автоматического конфигурирования и параметров баз данных, входящих в Microsoft SQL Server 2000 и помогающих снизить объем работы DBA по настройке баз данных. В этой лекции вы узнаете, как использовать некоторые дополнительные средства, предоставляемые в SQL Server, для автоматизации других административных задач с помощью службы SQLServerAgent. Служба SQLServerAgent позволяет автоматически выполнять определенные периодические задачи с базой данных и оповещать DBA или другое указанное лицо о том, что на сервере возникла какая-либо проблема или событие. Использование этих возможностей позволяет DBA обходиться без ручного и непрерывного мониторинга системы баз данных, чтобы определять, когда должны выполняться определенные задачи, что позволяет выделить время для более сложных вопросов по базам данных, таких как построение и настройка индексов, оптимизация запросов или планирование будущего роста.
Для автоматизации административных задач используются три основных средства: задания (jobs), оповещения (alerts) и операторы (operators). В этой лекции вы узнаете о службе SQLServerAgent и о том, как использовать эту службу для создания и использования заданий, оповещений и операторов. Вы также узнаете о журнале ошибок SQLServerAgent, который можете использовать для слежения за работой, выполняемой SQLServerAgent.
Служба SQLServerAgent
Агент SQL Server Agent запускается отдельно от SQL Server, как служба с именем SQLServerAgent. Эта служба включена в состав SQL Server 2000, но она должна запускаться отдельно – вручную или автоматически. (Об инструкциях по запуску SQLServerAgent см. лекцию 8.) После запуска этой службы вы можете переходить к определению любых нужных вам заданий, оповещений и операторов.
Задания
Задания – это административные задачи, которые определяются один раз и могут выполняться многократно. Вы можете запускать задание вручную, а также планировать запуск задания системой SQL Server в определенное время, в соответствии с регулярным расписанием или при возникновении оповещения. (Об оповещениях описаны далее в разделе "Оповещения".) Задания могут состоять из операторов Transact-SQL (T-SQL), команд Microsoft Windows NT или Microsoft Windows 2000, исполняемых программ или сценариев Microsoft ActiveX. Задания также автоматически создаются для вас, когда вы используете репликацию или создаете план обслуживания базы данных. Задание может состоять из одного или нескольких шагов, и каждый шаг может быть вызовом более сложного набора шагов, например обращением к хранимой процедуре. SQL Server автоматически следит за результатом выполнения заданий (успешное или неуспешное завершение); вы можете задавать оповещения, которые будут отправляться в каждом случае.
Задания могут выполняться локально на сервере, а в случае нескольких серверов в сети вы можете назначать один из серверов как главный сервер, а остальные серверы – как серверы-получатели. На главном сервере хранятся определения заданий для всех серверов, и этот сервер действует как центр обмена информацией для координирования работы всех заданий. Каждый сервер-получатель периодически подсоединяется к главному серверу, обновляет список своих заданий, если какие-либо задания изменились, загружает любые новые задания с главного сервера и затем отсоединяется для выполнения этих заданий. Когда сервер-получатель завершает какое-либо задание, он снова подсоединяется к главному серверу и сообщает о статусе его завершения.
Рассмотрим ситуацию, в которой вам может потребоваться создать задание. Предположим, что у вас имеется таблица базы данных, в которой ведется запись по каждой выполненной в банковской среде транзакции, такой как вклад денег на счет, снятие денег со счета и перевод (трансферт) денег. Каждая запись содержит колонку временной метки (timestamp),где указывается время выполнения транзакции. Эта таблица непрерывно растет, и ее нужно периодически сокращать. Для удаления строк из этой таблицы вы можете написать небольшую хранимую процедуру, в которой используется оператор DELETE для удаления строк, которые хранятся больше двух месяцев (в предположении, что банк должен хранить записи только два месяца). Затем вы можете создать задание для выполнения этой хранимой процедуры раз в неделю, например в ночь на воскресенье. Тем самым вы можете воспрепятствовать бесконечному росту данной таблицы. Это позволяет экономить пространство на диске и, кроме того, обычно повышает производительность. При меньшем количестве данных, среди которых выполняется по запросу, SQL Server может быстрее выполнить этот запрос. А теперь перейдем к подробностям создания заданий.
Создание задания
Чтобы определить задание, вы можете использовать Enterprise Manager, сценарии T-SQL, мастер создания заданий Create Job Wizard или SQL-Distributed Management Objects (SQL-DMO). Поскольку метод SQL-DMO связан с программированием, он выходит за рамки материала этой книги. В этом разделе вы узнаете о трех других методах создания заданий.
Использование Enterprise Manager
Сначала создадим задание с помощью Enterprise Manager. Один из наиболее распространенных случаев применения заданий – это резервное копирование баз данных. (Для этого можно также использовать мастер плана обслуживания Maintenance Plan Wizard, см. лекцию 30.) В следующем примере создается задание на резервное копирование базы данных MyDB. В нем запланированы запуск резервного копирования каждый вечер в 11 P.M. (23:00) и запись результата завершения этого задания (успешное или неуспешное) в журнал событий приложения Windows NT или Windows 2000 и в выходной файл. Для создания этого задания, которое мы назовем MyDB_backup_job, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management (Управление) и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Jobs (Задания) и выберите из контекстного меню пункт New Job (Создать задание). Появится окно New Job Properties (Свойства нового задания) (рис. 31.1).
Рис. 31.1. Вкладка General окна New Job Properties (Свойства нового задания) - Во вкладке General задайте следующие параметры:
- Name (Имя). Введите в текстовом поле Name имя задания (в данном случае – MyDB_backup_job ). Имя задания может содержать до 128 символов. Каждое задание на сервере должно иметь уникальное имя. Постарайтесь задать описательное имя.
- Enabled (Активизировать). Установленный флажок Enabled указывает, что задание должно быть активизировано. Возможно, вы захотите сначала деактивизировать задание, чтобы проверить его вручную и убедиться, что оно правильно работает. Проверив задание и убедившись в правильности его работы, используйте этот флажок для активизации задания, чтобы оно автоматически запускалось в соответствии с расписанием.
- Category (Категория).Выберите категорию для задания; в данном случае мы используем принятую по умолчанию категорию Uncategorized (Local) (Без категории [Локально]). Вы можете выбирать из списка категорий, которые создаются при инсталляции SQL Server, или можете создавать свои собственные категории. (О создании новой категории см. в подразделе "Создание новой категории" далее.) В список инсталлированных категорий входят Uncategorized (Local), Database Maintenance (Обслуживание базы данных), Full Text (Полнотекстовый поиск), Web Assistant (Web-помощник) и 10 категорий для репликации. Категории используются для группирования родственных заданий. Например, вы можете группировать в одной категории все задания, которые используются для выполнения задач обслуживания базы данных, или группировать задания по отделам, таким как отделы бухгалтерского учета, продаж и маркетинга. Категории позволяют вам следить за несколькими заданиями: вам не нужно просматривать весь список заданий, когда вас интересует только определенная часть заданий.
- Owner (Владелец). Владелец – это пользователь, который создает задание, или пользователь, для которого создается задание. Только роли sysadmin позволяют изменять владельца задания или изменять задание, владельцем которого является другой пользователь. (О роли SQL Server см. лекцию 34). Все роли sysadmin, а также владелец задания могут изменять определение задания, а также запускать и останавливать задание. В раскрывающемся списке Owner всегда выбирайте пользователя, который будет выполнять задание. В данном примере используется пользователь, который создает задание, поэтому соответствующий пользователь выбран автоматически, и вы можете оставить этот выбор без изменений.
- Description (Описание).В текстовом поле Description вы указываете, какие задачи выполняет этот задание, и цель этого задания. Вам следует всегда вводить описание. Это позволяет другим пользователям быстро определять, для чего предназначено задание. Описание может содержать до 512 символов.
- Target local server (На локальном сервере). Если щелкнуть на этой кнопке выбора, то задание будет выполняться только на локальном сервере. Если к данному серверу подсоединены удаленные серверы, то будет доступна кнопка выбора Target multiple servers (На нескольких серверах). Щелкните на этой кнопке выбора, чтобы указать удаленные серверы, на которых также будет запускаться это задание.
Рис. 31.2. Заполненная вкладка General - Щелкните на вкладке Steps (Шаги) и щелкните на New (Создать), чтобы появилось диалоговое окно New Job Step (Новый шаг задания) (рис. 31.3). Шаги задания – это команды или операторы, которые определяют задачи данного задания. Каждое задание должно содержать хотя бы один шаг и может содержать несколько шагов. Во вкладке General диалогового окна New Job Step введите следующую информацию:
- В текстовом поле Step name (Имя шага) введите имя данного шага (в данном случае введите MyDB_backup ).
- В раскрывающемся списке Type (Тип) выберите тип шага. В данном примере выберите Transact-SQL Script (TSQL) (Сценарий T-SQL), поскольку для выполнения этого задания мы будем использовать команды T-SQL. Среди других вариантов выбора – ActiveX Script (Сценарий ActiveX), Operating System Command (Команда операционной системы), Replication Distributor (Дистрибьютор репликации), Replication Transaction-Log Reader (Репликация, чтение журнала транзакций), Replication Merge (Репликация слиянием), QueueReader (Репликация, чтение данных из очереди) и Replication Snapshot (Репликация моментального снимка).
Рис. 31.3. Заполненная вкладка General диалогового окна New Job Step (Новый шаг задания) - В раскрывающемся списке Database (База данных) выберите имя базы данных, с которой будет работать данное задание. Для данного примера выберите базу данных MyDB.
- В текстовом поле Command (Команда) введите команды, которые хотите включить в данный шаг. Для данного примера это команды T-SQL для резервного копирования базы данных MyDB устройство резервного копирования с именем MyDB_backup1. Это устройство должно быть создано заранее. (О создании устройств резервного копирования см. лекцию 32.} Кроме того, наш случай – это простой пример, в котором резервная копия базы данных будет записываться в один и тот же файл каждую ночь. На практике для выполнения резервного копирования вам следует использовать план обслуживания базы данных (см. лекцию 30), поскольку это позволит вам создавать новое устройство резервного копирования на каждый день. Вы можете также щелкнуть на кнопке Open (Открыть), чтобы открыть файл, если у вас есть подготовленный сценарий, который вы хотите ввести как задание.
- Щелкните на кнопке Parse (Синтаксический разбор), чтобы проверить синтаксис ваших шагов T-SQL, и затем щелкните на вкладке Advanced (Дополнительно) и задайте параметры (рис. 31.4). В этой вкладке вы можете выбрать, какое действие следует предпринять при успешном (success) и неуспешном (failure) завершении данного задания: Quit the job reporting success (Завершить задание с выдачей кода успешного завершения), Quit the job reporting failure (Завершить задание с выдачей кода неуспешного завершения) или перейти к следующему шагу. Вы можете также задать количество повторных попыток выполнения шага задания, если он не был успешно выполнен, а также интервал между попытками. Если шаг представлен командой T-SQL или сценарием, то вы можете выбрать выходной файл, в который будут выводиться результаты T-SQL. Вы можете задать добавление выходных результатов к этому файлу при каждом запуске задания (кнопка выбора Append) или указать замещение старых результатов новыми (кнопка выбора Overwrite). Щелкните на кнопке View (Просмотр), чтобы увидеть содержимое выходного файла. Установите флажок Append output to step history (Добавлять выходные результаты в журнал выполнения шагов), чтобы результаты выполнения задания добавлялись в таблицу журнала для данного задания. Вы можете также указать пользователя (поле Run as user), который будет запускать этот набор T-SQL.
Рис. 31.4. Заполненная вкладка Advanced (Дополнительно) диалогового окна New Job Step
- Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы вернуться во вкладку Steps окна New Job Properties, где вы можете при необходимости определить другие шаги задания. Щелкните на кнопке New, чтобы добавить новый шаг вслед за существующим шагом. Чтобы вставить новый шаг перед существующим шагом, выделите этот существующий шаг и затем щелкните на кнопке Insert (Вставить), чтобы появилось окно New Job Step. Введите информацию для шага, который вы хотите вставить. Для удаления шага выделите этот шаг и щелкните на кнопке Delete (Удалить); для редактирования шага выделите его и щелкните на кнопке Edit (Редактирование). Вы можете также переместить шаг в списке, выделив его и щелкая на кнопке "стрелка вверх" или "стрелка вниз" справа от метки Move Step (Переместить шаг). В раскрывающемся списке Start Step (Начальный шаг) вы можете выбрать шаг, который будет выполняться первым в данном задании. Рядом с идентификационным номером шага, который будет выполняться первым, появится зеленый флаг. Щелкните на кнопке Apply, чтобы включить ваши шаги в задание. Если логика последовательности выполняемых шагов приводит к тому, что не будет выполняться какой-либо шаг, то после щелчка на кнопке Apply SQL Server выведет предупреждающее сообщение и позволит вам изменить логику последовательности.
- Чтобы создать расписание для этого задания, щелкните на вкладке Schedules (Расписания). Чтобы найти текущее время на каком-либо сервере, выберите имя этого сервера в раскрывающемся списке NOTE: The Current Date/Time On Target Server (Текущие дата/время на целевом сервере). Щелкните на кнопке New Schedule (Создать расписание), чтобы появилось диалоговое окно New Job Schedule (Новое расписание задания) (рис. 31.5). Расписание указывает, в какие моменты времени и по каким дням следует запускать задание. Задание может запускаться один раз или регулярно. Если вы хотите запускать задание вручную или время от времени, то вы не обязаны задавать расписание задания, а просто запускать задание, когда вам потребуется. Введите в поле имени расписания (Name) MyDB_backup_schedule, задайте параметры в секции Schedule Type (Тип расписания) (в данном случае щелкните на кнопке выбора Recurring [Повторяющееся]) и установите флажок Enabled (Активизировать). (Эти параметры показаны на рис. 31.5.) Флажок Enabled имеет то же назначение, что и в окне New Job Properties.
Рис. 31.5. Диалоговое окно New Job Schedule (Новое расписание задания) - Поскольку мы выбрали расписание повторяющегося типа, то вы должны задать моменты времени и дни, когда должно запускаться это задание. Для этого щелкните на кнопке Change (Изменить), чтобы появилось диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий). Введите новые моменты времени и дни, затем щелкните на кнопке OK, чтобы вернуться в диалоговое окно New Job Schedule. (Напомним, что нам нужно задать ежедневное резервное копирование, которое будет запускаться в 11 P.M.)
- Щелкните на кнопке OK в диалоговом окне New Job Schedule, чтобы согласиться с расписанием и вернуться в окно New Job Properties. Чтобы удалить какое-либо расписание, выделите имя этого расписания и щелкните на кнопке Delete. Чтобы отредактировать какое-либо расписание, выделите имя этого расписания и щелкните на кнопке Edit.Примечание. Вы можете также создать новое оповещение для этого задания. Оповещения подробно рассматриваются далее.
- Щелкните на вкладке Notifications (Уведомления) (рис. 31.6). В этой вкладке вы можете определять процесс уведомления, чтобы оператор (или указанный пользователь) получал уведомление об успешном или неуспешном результате выполнения задания или об окончании задания. Это уведомление может быть отправлено по электронной почте, на пейджер или как сообщение в сети с помощью команды NET SEND. Статус задания можно записывать в журнал событий Windows NT или Windows 2000, и вы можете даже автоматически удалять задание в случае успешного выполнения, неуспешного завершения или после окончания. Чтобы сконфигурировать уведомление для операторов, установите нужные флажки E-mail operator (Оператор для электронной почты), Page operator (Оператор с пейджером) и Net send operator (Оператор в сети) и выберите имя оператора в раскрывающемся списке справа от флажка. (О создании операторов см. раздел "Операторы" далее.) В крайних правых списках выберите условие, по которому инициируется уведомление. Чтобы записывать результаты в журнал событий (Write to Windows application event log) или автоматически удалять задание по его окончании (Automatically delete job), установите нужные флажки и затем в соответствующих раскрывающихся списках выберите условие, по которому нужно выполнить действие, указанное флажком. В данном примере установите флажок Write to Windows application event log.
Рис. 31.6. Вкладка Notifications (Уведомления) окна New Job Properties - Закончив формирование параметров, щелкните на кнопке Apply, чтобы создать ваше задание, и затем щелкните на кнопке OK, чтобы выйти из окна New Job Properties и вернуться в Enterprise Manager.
- Щелкните на строке Jobs в левой панели Enterprise Manager. Вы увидите задание MyDB_backup_job, включенное в список заданий в правой панели.
Создание новой категории. Чтобы создать новую категорию, раскройте сервер в левой панели Enterprise Manager, раскройте папку Management (Управление), щелкните правой кнопкой мыши на строке Jobs, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Manage Job Categories (Управление категориями заданий). Появится диалоговое окно Job Categories (Категории заданий) (рис. 31.7), где вы можете добавлять новые категории, просматривать существующие категории и задания, которые в них входят, и удалять категории.
Рис. 31.7. Диалоговое окно Job Categories (Категории заданий)
Использование T-SQL
Команды T-SQL, используемые для создания задания, добавления шагов к заданию и создания расписания для задания, – это системные хранимые процедуры sp_add_job, sp_add_jobstep и sp_add_jobschedule. Эти хранимые процедуры имеют много необязательных параметров, как это показано в их синтаксисе, представленном в этом разделе. SQL Server присваивает каждому неуказанному параметру значение по умолчанию. Enterprise Manager намного удобнее для создания заданий, поскольку его графический пользовательский интерфейс позволяет вам увидеть все параметры для задания, чтобы вы ничего не забыли. Используя T-SQL, вы должны задавать значения для всех необязательных параметров или быть уверенным в том, что принятые по умолчанию значения всех пропущенных вами параметров подходят для вашего задания. Вместо запуска этих хранимых процедур вручную вам следует использовать Enterprise Manager. Вы можете затем генерировать сценарии T-SQL, которые использовал Enterprise Manager для создания вашего задания; для этого щелкните правой кнопкой мыши на имени этого задания, укажите в контекстном меню All Tasks и выберите команду Generate SQL Script (Генерировать SQL-сценарий). Этот метод поможет вам повторно создать задание с помощью сценария, если это когда-нибудь потребуется.
Для запуска этих хранимых процедур вы должны использовать базу данных msdb, поскольку они хранятся в этой базе данных. Рассмотрим параметры, которые указываются в этих хранимых процедурах, – на тот случай, если вы все же захотите использовать их. Для всех хранимых процедур, описанных в этом разделе, используется один общий синтаксис. Хранимая процедура sp_add_job имеет следующий синтаксис:
sp_add_job [@job_name =] 'job_name' [,[@enabled =] enabled] [,[@description =] 'description'] [,[@start_step_id =] step_id] [,[@category_name =] 'category'] [,[@category_id =] category_id] [,[@owner_login_name =] 'login'] [,[@notify_level_eventlog =] eventlog_level] [,[@notify_level_email =] email_level] [,[@notify_level_netsend =] netsend_level] [,[@notify_level_page =] page_level] [,[@notify_email_operator_name =] 'email_name'] [,[@notify_netsend_operator_name =] 'netsend_name'] [,[@notify_page_operator_name =] 'page_name'] [,[@delete_level =] delete_level] [,[@originating_server =] 'server_name' [,[@job_id =] job_id OUTPUT]
Процедура sp_add_jobstep имеет следующий синтаксис:
sp_add_jobstep [@job_id =] job_id | [@job_name =] 'job_name'] [,[@step_id =] step_id] {,[@step_name =] 'step_name'} [,[@subsystem =] 'subsystem'] [,[@command =] 'command'] [,[@additional_parameters =] 'parameters'] [,[@cmdexec_success_code =] code] [,[@on_success_action =] success_action] [,[@on_success_step_id =] success_step_id] [,[@on_fail_action =] fail_action] [,[@on_fail_step_id =] fail_step_id] [,[@server =] 'server'] [,[@database_name =] 'database'] [,[@database_user_name =] 'user'] [,[@retry_attempts =] retry_attempts] [,[@retry_interval =] retry_interval] [,[@os_run_priority =] run_priority] [,[@output_file_name =] 'file_name'] [,[@flags =] flags]
Процедура sp_add_jobschedule имеет следующий синтаксис:
sp_add_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name', [@name =] 'name' [,[@enabled =] enabled] [,[@freq_type =] freq_type] [,[@freq_interval =] freq_interval] [,[@freq_subday_type =] freq_subday_type] [,[@freq_subday_interval =] freq_subday_interval] [,[@freq_relative_interval =] freq_relative_interval] [,[@freq_recurrence_factor =] freq_recurrence_factor] [,[@active_start_date =] active_start_date] [,[@active_end_date =] active_end_date] [,[@active_start_time =] active_start_time] [,[@active_end_time =] active_end_time]
Использование мастера Create Job Wizard
В состав Enterprise Manager включен мастер, который помогает вам пройти через процесс формирования заданий в пошаговом режиме. Правда, этот мастер ограничен в том, что вы можете создать только один шаг задания. Тем не менее он позволяет вам создавать расписание для задания и указывать операторов, которые будут получать уведомление о статусе задания. Создав такое задание, вы можете затем добавлять к нему новые шаги, модифицируя задание с помощью Enterprise Manager.
Чтобы использовать мастер Create Job Wizard, выполните следующие шаги.
- В Enterprise Manager выберите из меню Tools пункт Wizards (Мастера) в появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Management и выберите Create Job Wizard, чтобы появилось начальное окно мастера Create Job Wizard (рис. 31.8).
Рис. 31.8. Начальное окно мастера Create Job Wizard - Щелкните на кнопке Next, чтобы появилось окно Select job command type (Выбор типа команды для задания) (рис. 31.9). В этом окне вы можете указывать, какой тип шага вы создаете для задания. Для данного примера щелкните на Transact-SQL command (Команда T-SQL)
Рис. 31.9. Окно Select job command type (Выбор типа команды для задания). - Щелкните на кнопке Next, чтобы появилось окно Enter Transact-SQL Statement (Ввод оператора T-SQL) (рис. 31.10). Для оператора T-SQL вы должны выбрать базу данных, в которой будет выполняться эта команда, и затем ввести оператор или операторы для задания или щелкнуть на кнопке Open (Открыть), чтобы найти и открыть файл, содержащий операторы T-SQL, которые вы хотите использовать. Щелкните на кнопке Parse для проверки синтаксиса введенных вами операторов T-SQL. Если у вас выбран тип команды Operating-system shell command (Команда для запуска из командной строки) или Active script (Активный сценарий), то вы получите запрос на ввод команд этого типа. Для данного примера введите оператор T-SQL для резервного копирования главной базы данных на ранее созданное устройство с именем backup_master_dev (рис. 31.10).
Рис. 31.10. Окно Enter Transact-SQL Statement (Ввод оператора T-SQL) - Щелкните на кнопке Next, чтобы появилось окно Specify job schedule (Задать расписание задания) (рис. 31.11). Здесь вы можете указать, когда должно запускаться это задание.
Рис. 31.11. Окно Specify job schedule (Задать расписание задания)Вариант Now (Сейчас) указывает, что задание будет запущено, как только мастер завершит свою работу. Назначение других кнопок выбора описывается их названием. Для данного примера щелкните на кнопке выбора On a recurring basis (На повторяющейся основе) и затем щелкните на кнопке Schedule, чтобы задать расписание. Появится диалоговое окно Edit Recurring Job Schedule (рис. 31.12). Используйте его параметры для создания нужного расписания и щелкните на кнопке OK для возврата в окно Specify job schedule.
Рис. 31.12. Диалоговое окно Edit Recurring Job Schedule - Щелкните на кнопке Next, чтобы появилось окно Job Notifications (Уведомления для задания) (рис. 31.13).
Рис. 31.13. Окно Job Notifications (Уведомления для задания)В раскрывающихся списках Net send и/или E-mail выберите оператора, который будет получать уведомление о статусе завершения этого задания. У вас уже должны быть определены операторы, чтобы они появились в раскрывающемся списке. На рис. 31.13 не определено ни одного оператора (No operators). Если вы хотите уведомлять оператора, который еще не определен, завершите работу мастера и затем добавьте этого оператора, как это описано в разделе "Операторы" далее. Вы можете затем модифицировать свойства задания, включив уведомление для этого оператора. Вы можете также прекратить работу мастера, создать оператора и затем снова выполнить запуск мастера. - Щелкните на кнопке Next, чтобы появилось окно Completing the Create Job Wizard (Завершение работы мастера) (рис. 31.14). Здесь вы можете назначить имя задания, заменив заданное по умолчанию имя в текстовом поле Job Name (Имя задания); в данном примере ваше задание названо Backup_master_job. Проверьте текст в окне Description, чтобы убедиться, что он отражает нужные вам параметры, и если да, то щелкните на кнопке Finish (Готово), чтобы создать это задание. Если нет, то щелкните на кнопке Back (Назад) и внесите нужные изменения. Если задание создано успешно, то появится окно информационного сообщения. Щелкните на кнопке OK, чтобы закрыть это окно.
Рис. 31.14. Окно Completing the Create Job WizardПосле завершения работы мастера Create Job Wizard это новое задание появится в папке Jobs окна Enterprise Manager.
Управление заданием
Вы можете управлять вашими заданиями и редактировать их в Enterprise Manager или с помощью T-SQL. И здесь для вас будет проще использовать Enterprise Manager, поскольку вам не нужно заботиться о синтаксисе и значениях по умолчанию, связанных с хранимыми процедурами T-SQL, поскольку графический интерфейс Enterprise Manager помогает вам пройти через всю установку свойств задания.
Использование Enterprise Manager
С помощью Enterprise Manager вы можете вручную запускать, останавливать, деактивизировать, активизировать и редактировать задание, а также создавать для него сценарии T-SQL. Ниже приводятся инструкции для каждой из этих задач.
- Для запуска задания щелкните правой кнопкой мыши на имени этого задания в правой панели Enterprise Manager и выберите из контекстного меню пункт Start Job (Запустить задание).
- Для остановки текущего выполняемого задания и отмены всех повторных попыток, сконфигурированных для этого задания, щелкните правой кнопкой мыши на имени задания и выберите из контекстного меню пункт Stop Job (Остановить задание).
- Чтобы деактивизировать задание для его последующего тестирования, не допуская его запуска в запланированное время или по какой-либо другой причине, щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Disable Job (Деактивизировать задание). Чтобы снова активизировать задание, выберите пункт Enable Job.
- Чтобы редактировать задание, расписание или любое другое свойство задания, щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Properties, чтобы появилось окно свойств задания Properties, которое содержит те же четыре вкладки, которые вы использовали для создания этого задания. Внесите свои изменения, щелкните на кнопке Apply и затем щелкните на кнопке OK.
- Чтобы создать сценарий T-SQL для вашего задания на тот случай, если вы захотите снова создать этот задание без повторного ввода операторов T-SQL, щелкните правой кнопкой мыши на имени этого задания, укажите в контекстном меню пункт All Tasks и затем выберите команду Generate SQL Script, чтобы появилось диалоговое окно Generate SQL Script. Введите имя файла, выберите формат файла (Unicode, ANSI или текст OEM) и щелкните на кнопке OK.
Использование T-SQL
Вы можете также запускать, останавливать, активизировать, деактивизировать и редактировать задание с помощью следующих хранимых процедур T-SQL. Не забудьте, что при выполнении этих процедур у вас должна использоваться база данных msdb.
- sp_start_job. Сразу запускает указанное задание. В этой процедуре нужно указывать имя задания или идентификационный номер задания.
- sp_stop_job. Останавливает текущее выполняемое задание. В этой процедуре нужно указывать имя задания, идентификационный номер задания или имя главного сервера.
- sp_update_job. Позволяет вам активизировать, деактивизировать и изменять свойства задания. В этой процедуре нужно указывать имя задания или идентификационный номер задания.
Просмотр журнала выполнения задания
SQL Server поддерживает журнал (историю) с информацией о выполнении задания в таблице sysjobhistory системной базы данных msdb. Вы можете просмотреть информацию журнала выполнения задания с помощью Enterprise Manager или T-SQL.
Использование Enterprise Manager
Для просмотра журнала задания с помощью Enterprise Manager выполните следующие шаги.
- Щелкните правой кнопкой мыши на имени задания в правой панели Enterprise Manager и выберите из контекстного меню пункт View Job History (Просмотр журнала задания), чтобы появилось диалоговое окно Job History (рис. 31.15). Здесь вы увидите строку информации, описывающую каждое выполнение этого задания, любых операторов, получивших уведомления, а также ошибки или сообщения, полученные от SQL Server.
Рис. 31.15. Диалоговое окно Job History (Журнал заданий) - Для просмотра дополнительных подробностей о статусе выполнения задания установите флажок Show step details (Показать подробности по шагам) в верхнем правом углу этого диалогового окна. На рис. 31.16 показаны подробности резервного копирования базы данных MyDB.
Рис. 31.16. Подробности по шагам, представленные в диалоговом окне Job History - Для удаления всех сообщений щелкните на кнопке Clear All (Очистить все). Для обновления экрана, чтобы можно было увидеть статус любых новых заданий, которые были запущены после того, как вы открыли диалоговое окно Job History, щелкните на кнопке Refresh (Обновить). Чтобы закрыть диалоговое окно Job History, щелкните на кнопке Close (Закрыть).
Использование T-SQL
Для просмотра журнала с информацией о выполнении запланированных заданий с помощью T-SQL запустите хранимую процедуру sp_help_jobhistory в базе данных msdb. Эта процедура имеет следующий синтаксис:
sp_help_jobhistory [[@job_id =] job_id] [, [@job_name =] 'job_name'] [, [@step_id =] step_id] [, [@sql_message_id =] sql_message_id] [, [@sql_severity =] sql_severity] [, [@start_run_date =] start_run_date] [, [@end_run_date =] end_run_date] [, [@start_run_time =] start_run_time] [, [@end_run_time =] end_run_time] [, [@minimum_run_duration =] minimum_run_duration] [, [@run_status =] run_status] [, [@minimum_retries =] minimum_retries] [, [@oldest_first =] oldest_first] [, [@server =] 'server'] [, [@mode =] 'mode']
Если запустить эту процедуру без параметров или без параметра job id (Идентификатор задания) или job name (Имя задания), то будет возвращена информация обо всех запланированных заданиях. Параметр mode (режим) указывает, нужно ли возвращать всю информацию журнала задания ( FULL ) или только сводку ( SUMMARY ). Значение по умолчанию – SUMMARY.
Оповещения
Оповещение – это действие, которое возникает на сервере в ответ на событие или состояние производительности. Оповещения могут реализоваться как уведомления операторам, могут инициировать запуск указанных заданий и могут перенаправлять события другому серверу. Событие – это ошибка или сообщение, которые записываются в журнал событий приложений Windows NT или Windows 2000 (вы можете просматривать этот журнал с помощью утилиты Event Viewer, поставляемой вместе с Windows NT или Windows 2000). Состояние производительности – это характеристика работы системы, доступная для мониторинга с помощью Performance Monitor (Windows NT) или System Monitor (Windows 2000), такая как процент использования ЦП или количество блокировок, используемых SQL Server. В этой лекции мы будем рассматривать System Monitor в Windows 2000, хотя Performance Monitor в Windows NT действует почти так же.
При возникновении какого-либо события служба SQLServerAgent сравнивает это событие со списком определенных вами оповещений, и если для этого события существует оповещение, то происходит запуск этого оповещения.
Запуск оповещения для определенного состояния производительности происходит в том случае, если указанный объект SQL Server в System Monitor достигает определенного порогового значения производительности, например, счетчик User Connections (Количество пользовательских соединений) внутри объекта General Statistics (Общая статистика) в System Monitor. Например, вы можете указать запуск оповещения, если значение этого счетчика достигнет 50. (О работе System Monitor описывается см. лекцию 36.)
Протоколирование сообщений в журнале событий
Прежде чем перейти к созданию оповещения для какого-либо события, мы рассмотрим типы событий, которые приводят к передаче сообщений в журнал событий приложений Windows NT или Windows 2000; только эти события можно использовать для создания оповещений. События (или ошибки) с уровнем серьезности (severity level) от 19 до 25 автоматически передаются в журнал событий приложений Windows NT или Windows 2000 и поэтому могут использоваться для запуска оповещений. По умолчанию события с уровнем серьезности меньше 19 не протоколируются в журнале, и поэтому эти события не могут использоваться для запуска оповещений. Чтобы эти события протоколировались в журнале, вы должны использовать sp_altermessage, оператор RAISERROR WITH LOG или xp_logevent, позволяющие изменить статус протоколирования события или сообщения. В данном разделе вы узнаете, как создавать определенное пользователем сообщение о событии и как изменять это сообщение, чтобы обеспечить его запись в журнал событий приложений.
Создание определенного пользователем сообщения о событии
Вся информация для системных и определенных пользователем сообщений сохраняется в таблице sysmessages базы данных master. Чтобы создать определенное пользователем сообщение, используйте системную хранимую процедуру T-SQL sp_addmessage. Она имеет следующий синтаксис:
sp_addmessage [@msg_num =] msg_id, [@severity=] severity, [@msg_text=] 'msg_text' [,[@lang =] 'language'] [,[@with_log=] 'with_log'] [,[@replace =] 'replace']
Определенное пользователем сообщение должно иметь значение идентификатора сообщения ( msg_id ) 50001 или больше. Параметр severity – это уровень серьезности ошибки, на который ссылается сообщение, в диапазоне от 1 до 25, причем более высокие значения означают более высокий уровень серьезности ошибки. Уровни серьезности от 19 до 25 может задавать только системный администратор. Параметр msg_text – это текст сообщения об ошибке, который появится в журнале событий приложений при возникновении данной ошибки. Параметр language указывает, на каком языке будет написано сообщение, поскольку вместе с SQL Server может быть инсталлировано несколько языков. Параметр with_log (с журналом) может иметь значение TRUE или FALSE, указывая, будет ли данное сообщение всегда протоколироваться в журнале событий приложений Windows NT или Windows 2000. Значение по умолчанию – FALSE. Оператор RAISERROR WITH LOG (описывается в следующем разделе) изменяет это значение, если оно равно FALSE. Параметр replace (заменять) указывает, что данное сообщение должно заменять существующее сообщение, имеющее тот же номер идентификатора ( msg_id ).
Владельцы роли public имеют полномочия выполнения процедуры sp_addmessage, но чтобы создать сообщение с уровнем серьезности больше 18 или задать значение TRUE для параметра with_log, вы должны быть владельцем роли sysadmin.
Рассмотрим пример использования sp_addmessage. Следующий оператор создает новое сообщение, которое будет всегда протоколироваться в журнале событий (поскольку для параметра with_log задано значение TRUE ):
sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "TRUE" GO
Изменение параметров протоколирования сообщения о событии
Предположим, что существующее сообщение, или сообщение, которое вы только что создали, не позволяет протоколировать его в журнале (или вы не включили параметр with_log ), как в следующем примере:
sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "FALSE" GO
Если в дальнейшем вам потребуется протоколировать это сообщение в журнале, вы должны изменить его статус протоколирования. Для этого используйте процедуру sp_altermessage, чтобы всегда происходило протоколирование в журнале, как в следующем примере:
sp_altermessage 50001, WITH_LOG, "TRUE" GO
В качестве альтернативного средства вы можете использовать оператор RAISERROR с параметром WITH LOG, чтобы возвращать данное сообщение в ваше приложение, а также в журнал событий приложений и в журнал SQL Server. Например, следующий оператор отправляет в вашу программу сообщение 50001 с уровнем серьезности 16 и значением параметра состояния (state) 1, где state – это числовое значение, которое можно использовать для отслеживания, если сообщение передается более чем в одно местоположение:
RAISERROR (50001, 16, 1) WITH LOG GO
Чтобы изменить статус протоколирования сообщения вы можете также использовать расширенную хранимую процедуру xp_logevent, которая находится в базе данных master. При использовании этой процедуры сообщение передается в журнал событий и в журнал SQL Server, но не в клиентское приложение. Ниже приводится пример использования этой процедуры:
USE master GO xp_logevent 50002, "Customer ID out of range", warning GO
Первые два параметра являются обязательными: это идентификационный номер определенного пользователем сообщения (который, как уже говорилось, должен быть больше 50000) и текст сообщения, которое будет передаваться в эти журналы. Третий параметр (уровень серьезности) не является обязательным. Он может быть представлен одной из трех текстовых строк: informational (информационное), warning (предупреждение) или error (ошибка). Значение уровня серьезности определяет, какой тип значка появится рядом с сообщением в окне Event Viewer, чтобы вы могли легко отличать предупреждения от ошибок. Для Windows 2000 информационное сообщение снабжено синим значком "i", предупреждение – желтым значком "!" и ошибка – красным значком "X". Если уровень серьезности не задан, то по умолчанию используется значение informational.
Создание оповещения
Теперь мы готовы создать оповещение по событию и по состоянию производительности. Для создания оповещения вы можете использовать Enterprise Manager, T-SQL или SQL-DMO. И здесь мы будем рассматривать только методы использования Enterprise Manager и T-SQL, поскольку SQL-DMO выходит за рамки материала этой книги.
Использование Enterprise Manager для создания оповещения по событию
В этом примере мы создадим оповещение по системному сообщению, которое уже имеет уровень серьезности 24. Это сообщение будет протоколироваться по умолчанию в журнале событий без какого-либо вмешательства пользователя, необходимого для изменения его статуса протоколирования. Чтобы создать оповещение по событию, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management (Управление) и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Alerts (Оповещения) и выберите из контекстного меню пункт New Alert (Создать оповещение). Появится окно New Alert Properties (Свойства нового оповещения) (рис. 31.17). Во вкладке General введите имя оповещения, которое может содержать до 128 символов. Для данного примера введите IO_error_alert. Флажок Enabled (Активизировано) позволяет вам активизировать или деактивизировать это оповещение. Деактивизация оповещения означает, что оно не будет запускаться (аналогично деактивизации задания). Для данного примера проследите за тем, чтобы оповещение было активизировано. В раскрывающемся списке Type (Тип) выберите SQL Server event alert (Оповещение по событию), поскольку нам нужно создать оповещение, которое будет запускаться при возникновении определенного события. (Другой тип оповещения – SQL Server performance condition alert (Оповещение по состоянию производительности); пример этого типа события будет показан далее.) Для нашего примера мы создадим оповещение, которое будет запускаться при возникновении ошибки ввода-вывода.
Рис. 31.17. Вкладка General окна New Alert Properties - В секции Event alert definition (Определение оповещения по событию) окна New Alert Properties нужно задать событие, по которому будет запускаться данное оповещение, щелкнув на кнопке выбора Error number (Номер ошибки) или Severity (Уровень серьезности) и указав затем номер ошибки или уровень серьезности. Если задан уровень серьезности, то данное оповещение будет запускаться по всем ошибкам с этим уровнем серьезности. Для данного примера щелкните на кнопке выбора Error Number и затем щелкните на кнопке обзора Browse (...), чтобы выполнить поиск номера. Появится диалоговое окно Manage SQL Server Messages (Управление сообщениями SQL Server) (рис. 31.18).
- Для поиска определенной ошибки, нужно выбрать соответствующую категорию в окне списка Severity вкладки Search (Поиск) и щелкнуть на кнопке Find (Найти). Найденные ошибки будут представлены в списке вкладки Messages (Сообщения). Два флажка внизу вкладки Search можно использовать для ограничения поиска. Флажок Only include logged messages (Включать только протоколируемые в журнале сообщения) позволяет выполнять поиск только тех сообщений, которые автоматически протоколируются в журнале событий. Флажок Only include user-defined messages (Включать только определенные пользователем сообщения) ограничивает поиск только теми сообщениями, которые определены пользователями. Для нашего примера мы хотим найти все фатальные ошибки оборудования, поэтому выделите в окне списка Severity ошибку 024 – Fatal Error: Hardware Error (Фатальная ошибка: Ошибка оборудования) и затем щелкните на кнопке Find. Во вкладке Messages (рис. 31.19), появится ошибка с номером 823 (и уровнем серьезности 24).
Рис. 31.18. Вкладка Search (Поиск) диалогового окна Manage SQL Server Messages
Рис. 31.19. Вкладка Messages (Сообщения) диалогового окна Manage SQL Server Messages - Щелкните на кнопке OK, чтобы подтвердить выбор этого сообщения и вернуться во вкладку General окна New Alert Properties. В раскрывающемся списке Database Name (Имя базы данных) вы можете задать, что оповещение будет запускаться, только если данное событие возникло в указанной базе данных. Оставьте значение по умолчанию All Databases (Все базы данных). В текстовом поле Error message contains this text (Сообщение об ошибке содержит следующий текст) вы можете ввести строку символов (до 100 символов), которая ограничивает круг ошибок, по которым будет запускаться данное оповещение, только теми ошибками, текст которых содержит данную строку. Если оставить это поле пустым, то никакого ограничения не применяется.
- Щелкните на вкладке Response (Отклик) (рис. 31.20). В этой вкладке вы можете указать действие, которое следует предпринять, если возникнет это оповещение. Установите флажок Execute job (Выполнить задание) и выберите в раскрывающемся списке имя задания, которое будет выполнено в случае этого оповещения. Щелчок на кнопке New Operator (Создать оператора) позволяет вам создать нового оператора, который будет получать уведомление. В списке Operators to notify (Операторы для уведомления) будут представлены существующие операторы. Вы можете задать, нужно ли уведомлять оператора по электронной почте (колонка E-mail), через пейджер (pager), с помощью NET SEND или с помощью комбинации этих методов.
Рис. 31.20. Вкладка Response (Отклик) окна New Alert PropertiesЕсли вы указываете какого-либо оператора для уведомления по электронной почте, а также устанавливаете флажок Include alert error text in E-mail (Включить текст ошибки оповещения в электронную почту), то текст ошибки будет отправлен оператору в сообщении оповещения. Чтобы включить в сообщение электронной почты дополнительный текст, введите его в текстовом поле Additional notification message to send (Дополнительное сообщение уведомления для отправки) внизу этой вкладки. В этом поле можно ввести до 512 символов. На рис. 31.20 показан оператор TestOperator, выбранный для уведомления по электронной почте. Включено также дополнительное сообщение.Отметим также поля-счетчики Delay between responses (Задержки между откликами). Они указывают, насколько часто будет извещаться оператор при повторных случаях этого оповещения. Значение 60 минут означает, что уведомление оператору будет отправляться только один раз в течение любого 60-минутного периода.
- Для подтверждения введенных вами параметров оповещения и отклика щелкните на кнопке Apply. Затем щелкните на кнопке OK, чтобы закрыть это окно.
Использование Enterprise Manager для создания оповещения по состоянию производительности
Теперь мы используем Enterprise Manager для создания оповещения, которое будет запускаться при возникновении определенного состояния производительности. Отметим, что служба SQLServerAgent опрашивает счетчики производительности с 20-секундными интервалами, поэтому кратковременные пиковые или низкие нагрузки, возникающие между опросами, возможно, не будут обнаруживаться. Чтобы создать оповещение, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Alerts и выберите из контекстного меню пункт New Alert. Появится окно New Alert Properties (рис. 31.21). Во вкладке General в текстовом поле Name введите имя оповещения. (Для данного примера используйте user_alert.) Флажок Enabled (Активизировано) позволяет вам активизировать или деактивизировать это оповещение. Чтобы задать оповещение по состоянию производительности, выберите в раскрывающемся списке Type вариант SQL Server performance condition alert.
Рис. 31.21. Вкладка General окна New Alert Properties - В секции Performance condition alert definition (Определение оповещения по состоянию производительности) нужно определить состояние производительности, по которому будет запускаться это оповещение. Выберите в раскрывающемся списке Object (Объект) объект производительности SQL Server, который хотите использовать для запуска оповещения, и затем выберите в раскрывающемся списке Counter (Счетчик) нужный счетчик. Используйте поле Alert if counter (Оповещение в случае, если счетчик), чтобы указать, в какой ситуации должно запускаться оповещение. И, наконец, задайте пороговое значение (поле Value), переход которого будет приводить к запуску этого оповещения. На рис. 31.21 показаны параметры, используемые для запуска оповещения, когда счетчик SQL Server User Connections превышает значение 100.
- Чтобы завершить создание этого оповещения, задайте параметры на вкладке Response, как это описано на шаге 5 предыдущего раздела, щелкните на кнопке Apply и затем щелкните на кнопке OK.
Использование T-SQL для создания оповещения по событию или по состоянию производительности
Вы можете также использовать для создания оповещений T-SQL, но не забывайте, что если вы создаете оповещения с помощью Enterprise Manager, то можете затем генерировать для этих оповещений сценарии T-SQL. (Для этого щелкните правой кнопкой мыши на Alerts в папке SQL Server Agent, укажите в контекстном меню пункт All Tasks и затем выберите оператор Generate SQL Script.) Вероятно, использование Enterprise Manager вам покажется более легким для создания оповещений, поскольку для метода T-SQL требуется знать и помнить много необязательных параметров вместе с их значениями по умолчанию. Чтобы добавить оповещение с помощью T-SQL, нужно использовать хранимую процедуру sp_add_alert. Эта процедура используется для создания оповещений как по событию, так и по состоянию производительности. Тип создаваемого оповещения указывается соответствующим параметром. Процедура sp_add_alert имеет следующий синтаксис:
sp_add_alert [@name =] 'name' [, [@message_id =] message_id] [, [@severity =] severity] [, [@enabled =] enabled] [, [@delay_between_responses =] delay_between_responses] [, [@notification_message =] 'notification_message'] [, [@include_event_description_in =] include_event_description_in] [, [@database_name =] 'database'] [, [@event_description_keyword =] 'event_description_keyword_pattern'] [, {[@job_id =] job_id | [@job_name =] 'job_name'}] [, [@raise_snmp_trap =] raise_snmp_trap] [, [@performance_condition =] 'performance_condition'] [, [@category_name =] 'category']
Для модификации оповещения, просмотра информации оповещения и удаления оповещения используются соответственно хранимые процедуры sp_update_alert, sp_help_alert и sp_delete_alert. Напомним, что все эти хранимые процедуры находятся в базе данных msdb.
Операторы
Операторы – это отдельные люди, которые могут получать уведомление от SQL Server по завершении какого-либо задания или при возникновении какого-либо события. Оператор – это человек, ответственный за обслуживание одной или нескольких систем, на которых работает SQL Server. Вы уже знаете, как определять сообщение уведомления, которое будет отправляться оператору. Как уже говорилось, имеется три метода, используемых для связи с операторами: отправка сообщений электронной почты, отправка на пейджер и использование команды NET SEND (которая отправляет сетевое сообщение на компьютер оператора.) Чтобы можно было применять каждый из этих методов, ваша система должна отвечать определенным требованиям. Для связи через электронную почту и с пейджером вы должны инсталлировать на сервере совместимый с MAPI-1 клиент ("MAPI" означает "Messaging API" – интерфейс прикладного программирования для сообщений), такой как Microsoft Outlook или Microsoft Exchange Client, и должны создать почтовый профиль для службы SQLServerAgent. Для пейджинговой связи вам нужно также инсталлировать на почтовом сервере программное обеспечение сторонних фирм для связи электронной почты с пейджером, которое обрабатывает входные сообщения электронной почты и преобразует их в пейджинговые сообщения. Чтобы использовать NET SEND, у вас должна работать операционная система Windows NT или Windows 2000, поскольку NET SEND не поддерживается в Microsoft Windows 95/98.
Вы должны определить каждого оператора в SQL Server. Вы можете создать несколько операторов для разделения между ними обязанностей, а также резервного оператора, который получит уведомление, когда недоступны другие операторы (например, когда не проходит сообщение на пейджер). Вы можете создать оператора с помощью Enterprise Manager, T-SQL или SQL-DMO. Мы рассмотрим в этом разделе использование Enterprise Manager и T-SQL; метод SQL-DMO выходит за рамки материала этой книги.
Использование Enterprise Manager для создания оператора
Чтобы создать оператора с помощью Enterprise Manager, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management и затем раскройте папку SQL Server Agent. Щелкните правой кнопкой мыши на Operators и выберите из контекстного меню пункт New Operator, чтобы появилось окно New Operator Properties (Свойства нового оператора) (рис. 31.22). Во вкладке General введите имя нового оператора и затем заполните все или некоторые из следующих данных: адрес электронной почты этого оператора, адрес пейджера и адрес для команды NET SEND.
Рис. 31.22. Вкладка General окна New Operator Properties (Свойства нового оператора)Если вы ввели адрес пейджера, то можете задать в секции Pager on duty schedule (Расписание дежурства на пейджере) дни и периоды времени, когда можно отправлять сообщения этому оператору. Например, если у вас несколько операторов, то вы можете разделять между ними время работы, когда один оператор получает сообщения на пейджер в понедельник, среду и пятницу, а второй – во вторник, четверг и субботу. - Щелкните на вкладке Notifications. Если щелкнуть на кнопке выбора Alerts (в верхнем правом углу), то появится список существующих оповещений (рис. 31.23). Устанавливая флажки в соответствующих колонках, вы можете задавать, по каким оповещениям нужно уведомлять этого оператора и какой метод связи будет для этого использоваться.
Рис. 31.23. Вкладка Notifications окна New Operator Properties со списком оповещений - При создании нового оператора кнопка выбора Jobs для вас недоступна, так как нет таких заданий, которые бы уведомляли нового оператора, поскольку новый оператор еще не создан. Чтобы новый оператор не получал уведомлений, сбросьте флажок Operator is available to receive notifications (Оператор доступен для получения уведомлений). Отключение этой возможности позволяет вам временно приостанавливать отправку уведомлений оператору, например, когда данный оператор в отпуске. Вы можете затем снова активизировать отправку уведомлений, повторно установив этот флажок, когда оператор вернется к работе.
- Щелкните на кнопке Send E-mail (Отправить электронную почту), чтобы создать тестовое сообщение для отправки оператору, представленному во вкладке General. (Вы получите сообщение об ошибке, если не указали адрес электронной почты во вкладке General.) Затем вы можете отправить сообщение электронной почты, в котором описываются типы уведомлений, заданные для этого оператора. Внизу вкладки Notifications вы увидите информацию о последних попытках уведомлений этому оператору по типам используемых средств отправки.
Использование T-SQL для создания оператора
Команды T-SQL, используемые для создания оператора, модифицирования информации об операторе, просмотра информации об операторе и удаления оператора, – это соответствующие хранимые процедуры, находящиеся в базе данных msdb: sp_add_operator, sp_update_operator, sp_help_operator и sp_delete_operator. И здесь вы увидите, что вам легче использовать Enterprise Manager. Вы можете генерировать сценарии T-SQL после того, как создали оператора с помощью Enterprise Manager:
Ниже представлен синтаксис sp_add_operator:
sp_add_operator [@name =] 'name' [, [@enabled =] enabled] [, [@email_address =] 'email_address'] [, [@pager_address =] 'pager_address'] [, [@weekday_pager_start_time =] weekday_pager_start_time] [, [@weekday_pager_end_time =] weekday_pager_end_time] [, [@saturday_pager_start_time =] saturday_pager_start_time] [, [@saturday_pager_end_time =] saturday_pager_end_time] [, [@sunday_pager_start_time =] sunday_pager_start_time] [, [@sunday_pager_end_time =] sunday_pager_end_time] [, [@pager_days =] pager_days] [, [@netsend_address =] 'netsend_address'] [, [@category_name =] 'category']
Журнал ошибок службы SQLServerAgent
Служба SQLServerAgent имеет собственный журнал ошибок, в который записываются запуск и отключение SQLServerAgent и любые предупреждения, ошибки и информационные сообщения, связанные с заданием или оповещением SQLServerAgent. Чтобы использовать журнал ошибок SQLServerAgent, выполните следующие шаги.
- В Enterprise Manager раскройте папку сервера и раскройте папку Management. Щелкните правой кнопкой мыши на SQL Server Agent и выберите из контекстного меню пункт Display Error Log (Показать журнал ошибок). Появится журнал ошибок (рис. 31.24).
Рис. 31.24. Диалоговое окно SQL Server Agent Error Log - В раскрывающемся списке Type (Тип) вы может выбирать просмотр сообщений об ошибках, предупреждающих сообщений, информационных сообщений или все трех типов (All Types). На рис. 31.25 показано, как выглядит журнал ошибок непосредственно после запуска службы SQLServerAgent. (Отметим, что в раскрывающемся списке Type выбран вариант All Types.)
Рис. 31.25. Диалоговое окно SQL Server Agent Error Log, где показаны все типы сообщений - Каждый раз, как вы запускаете SQLServerAgent, происходит повторный запуск журнала ошибок с перезаписью всех существующих сообщений этого журнала. Вы можете искать сообщение, содержащее определенную строку, набрав эту строку в текстовом поле Containing Text (Содержит текст) и нажав затем клавишу Enter или щелкнув на кнопке Apply Filter (Применить фильтр). На рис. 31.26 показан журнал ошибок после поиска строки "CPU".
Рис. 31.26. Результаты поиска определенной строки в сообщениях журнала ошибок - Дважды щелкните на самом сообщении, чтобы появилось диалоговое окно SQL Server Agent Error Log Message (Сообщение журнала ошибок SQL Server Agent) (рис. 31.27). Если в результате поиска будет показано несколько сообщений, то вы можете использовать для перехода между сообщениями кнопки Next (Следующее) и Previous (Предыдущее). Эти кнопки недоступны, если найдено только одно сообщение.
В журнал ошибок SQLServerAgent поступает сообщение об ошибке, если по какой-либо причине недоступен оператор или не выполняется задание. Вам следует время от времени просматривать журнал ошибок, чтобы определить наличие ошибок, на которые нужно обратить внимание.
Рис. 31.27. Диалоговое окно SQL Server Agent Error Log Message
Заключение
В этой лекции вы узнали, как использовать службу SQLServerAgent для автоматизации некоторых административных задач путем определения заданий и операторов, создания уведомлений для операторов, а также создания оповещений по событиям и состояниям производительности. Вы узнали о том, насколько важно использовать уровни серьезности ошибок при создании оповещений и как изменять статус протоколирования сообщения об ошибке, чтобы оно записывалось в журнал событий Windows NT или Windows 2000. И вы узнали, как просматривать файл журнала ошибок службы SQLServerAgent, в который записывается информация о SQLServerAgent, а также любые сообщения об ошибках и предупреждения, возникшие во время оповещений и заданий. В лекции 32 мы рассмотрим резервное копирование баз данных SQL Server.
Лекция 32. Резервное копирование Microsoft SQL Server
Резервное копирование базы данных является одной из наиболее важных задач администратора баз данных (DBA). Имея файлы резервной копии и тщательно планируя восстановление после аварии, DBA может восстанавливать систему в случае отказа. DBA несет ответственность за поддержку системы в работоспособном состоянии, насколько это возможно, и за максимально быстрое восстановление ее работы в случае отказа системы. Простой системы может доставлять неудобства и приносить большие убытки. Поэтому важно как можно быстрее восстановить базу данных и вернуть ее к работе. Здесь могут помочь такие технологии, как кластеризация и отказоустойчивые дисковые подсистемы, но они не могут служить заменой добротного планирования и надежного метода резервного копирования.
В силу особой важности тем резервного копирования, восстановления и воспроизведения базы данных им посвящены две лекции. В этой лекции вы узнаете о журнале транзакций Microsoft SQL Server и различных методах резервного копирования базы данных. В лекции 33 вы узнаете, как восстанавливать базу данных из резервной копии, как действует процесс воспроизведения SQL Server и как создавать и реализовать план восстановления после аварии.
Терминология резервного копирования
Прежде чем перейти к методам резервного копирования, мы рассмотрим определенную терминологию. В этом разделе вы узнаете некоторые факты об операциях резервного копирования, восстановления и воспроизведения.
Резервное копирование и восстановление
Операции резервного копирования (backup) и восстановления (restore) связаны друг с другом и предполагают сохранение информации базы данных для использования в будущем – аналогично операциям резервного копирования и восстановления, которые могут выполняться операционной системой. При резервном копировании данные копируются из базы данных и сохраняются в другом месте. Резервное копирование операционной системы и резервное копирование базы данных отличаются в том, что в первом случае происходит сохранение отдельных файлов, а во втором – сохранение всей базы данных. Обычно база данных совместно используется многими пользователями, в то время как многие файлы операционной системы принадлежат отдельным пользователям. Тем самым при резервном копировании базы данных создается резервная копия данных сразу всех пользователей. Поскольку SQL Server предназначен для максимально возможной непрерывной эксплуатации, процесс резервного копирования может выполняться во время работы базы данных и даже в то время, как пользователи осуществляют доступ к базе данных.
При восстановлении данных из резервной копии они копируются назад в базу данных. Не путайте восстановление (restore) с воспроизведением (регенерацией) (recovery): это две различные операции.
В отличие от процесса резервного копирования процесс восстановления не может выполняться во время работы SQL Server. Кроме того, таблицу нельзя восстановить отдельно. Если один пользователь теряет часть данных в базе данных, потерянные данные восстановить непросто, поскольку операция восстановления восстанавливает всю базу данных или какую-то ее часть. Выделение данных отдельного пользователя из всех данных базы данных может оказаться затруднительным.
Воспроизведение
Воспроизведение (регенерация) (recovery) – это способность системы управления реляционной базой данных (СУРБД – RDBMS) уцелеть после аварии системы и воспроизвести выполненные транзакции. SQL Server не выполняет запись на диск после каждого изменения, вносимого в базу данных. Если бы это было так, то большая система (например, банковская) работала бы намного медленнее, поскольку в каждой транзакции приходилось бы ждать, пока не закончится очередная запись, создающая задержку в системе.
Именно задержки при записи изменений на диск приводят к тому, что база данных после отказа системы может остаться в запорченном состоянии из-за того, что некоторые изменения, внесенные в базу данных, могли быть не записаны на диск, а изменения, записанные на диск, могли быть не зафиксированы. Для поддержки целостности базы данных SQL Server протоколирует все изменения в журнале транзакций. (Журнал транзакций подробно описывается в разделе "Журнал транзакций" ниже в этой лекции.) При запуске SQL Server после отказа системы журнал транзакций используется для повторного исполнения (воспроизведения) транзакций, которые были фиксированы, но не записаны на диск, и отката (отмены результатов) транзакций, которые не были фиксированы на момент аварии системы. Такой подход гарантирует точность данных.
SQL Server должен быть подготовлен к обработке нескольких типов транзакций в процессе воспроизведения, включая следующие транзакции.
- Транзакции, содержащие только запросы.Никакого воспроизведения не требуется.
- Транзакции, которые внесли изменения в данные базы данных и были фиксированы, но не были записаны на диск.Во время воспроизведения SQL Server читает страницы данных с диска, снова вносит изменения и затем перезаписывает эти страницы на диск.
- Транзакции, которые внесли изменения в данные базы данных, были фиксированы и записаны на диск. Во время воспроизведения SQL Server определяет, что изменения были действительно записаны на диск. Никакого вмешательства не требуется.
- Транзакции, которые внесли изменения в данные базы данных, но не были фиксированы. Во время воспроизведения SQL Server использует журнал транзакций для отката (отмены) всех изменений, внесенных в страницы данных, и восстанавливает базу данных к состоянию, в котором она была до запуска этих транзакций.
При запуске SQL Server после аварии системы происходит автоматический запуск механизма воспроизведения. В этом механизме воспроизведения используется журнал транзакций, позволяющий определить, для каких транзакций требуется воспроизведение и для каких не нужно. Многие транзакции не требуют воспроизведения, но SQL Server должен прочитать журнал транзакций, чтобы определить, каким транзакциям это все же требуется. SQL Server начинает чтение журнала транзакций с момента создания последней контрольной точки. (Контрольные точки рассматриваются ниже в этой лекции.)
В случае отказа системы, после которого требуется восстановление базы данных из файлов резервной копии (например, в случае потери диска), используются журнал транзакций и резервные копии журнала транзакций – для восстановления базы данных к состоянию, в котором она находилась на момент отказа. Таким образом, операции восстановления и воспроизведения обычно используются совместно друг с другом. В случае отказа источника питания, возможно, потребуется только воспроизведение.
При повторном исполнении транзакции происходит воспроизведение изменений, внесенных в базу данных, но не записанных на диск, чтобы вернуть файлы данных к состоянию, в котором они находились на момент отказа. Иными словами, повторное исполнение фиксированных транзакций приводит базу данных к состоянию, в котором она находилась на момент отказа (за вычетом всех нефиксированных транзакций).
Отказы системы
У вас могут возникнуть сомнения в необходимости резервного копирования, если вы используете такие технологии, как службы кластеризации Microsoft Cluster Services и отказоустойчивые дисковые подсистемы RAID. Тем не менее резервное копирование необходимо. Возможны различные случаи отказов вашей системы, а упомянутые системы поддержки отказоустойчивости и восстановления в случае отказов позволяют продолжить нормальную работу вашей системы не для всех случаев отказов. В этом разделе мы рассмотрим некоторые из потенциальных причин отказов и способы восстановления после этих отказов.
Некоторые из отказов могут носить умеренный характер; некоторые могут оказаться разрушительными. Чтобы понять важность резервного копирования, вы должны знать о трех основных категориях отказов: отказы оборудования, отказы программного обеспечения и человеческие ошибки.
Отказы оборудования
Отказы оборудования – это, видимо, наиболее распространенный тип отказов, с которыми вы будете сталкиваться. Хотя эти отказы возникают менее часто по мере роста надежности компьютерного оборудования, но компоненты компьютеров все равно со временем становятся подвержены износу. Вот следующие типичные отказы оборудования.
- Отказ ЦП (CPU), памяти или шины (магистрали) данных. Эти отказы обычно приводят к аварийному отказу системы. После замены неисправного компонента и перезапуска системы SQL Server автоматически выполняет воспроизведение базы данных. Собственно база данных не затрагивается таким отказом, поэтому ее восстановление (с резервной копии) не требуется; SQL Server просто должен воспроизвести потерянные транзакции
- Отказ диска. Если вы используете отказоустойчивые матрицы RAID, то отказ этого типа, возможно, вообще не повлияет на состояние базы данных. Вы должны просто отремонтировать матрицу RAID. Но при отказе всей матрицы RAID единственной альтернативой является восстановление базы данных из резервной копии и использование резервных копий журнала транзакций для воспроизведения базы данных.
- Катастрофический отказ системы или полная потеря сервера. При разрушении всей системы из-за пожара или другой катастрофы, возможно, потребуется восстановление "с нуля". Потребуется новое оборудование, восстановление базы данных с резервной копии и воспроизведение базы данных с помощью резервных копий данных и журнала транзакций.
Отказы программного обеспечения
Отказы программного обеспечения происходят редко, и вашу систему, возможно, никогда не затронет такой тип отказов. Однако отказы программного обеспечения обычно более разрушительны, чем отказы оборудования, поскольку программное обеспечение содержит встроенные средства, которые сводят к минимуму отказы оборудования, а без этих защитных средств система подвержена аварийным отказам в случае отказов оборудования. Примером программного средства является журнал транзакций, предназначенный для восстановления систем после отказов оборудования. Существуют следующие типичные отказы программного обеспечения.
- Отказы операционной системы. Если отказ этого типа происходит в подсистеме ввода-вывода, то могут быть запорчены данные на диске. Если отказ не затрагивает базу данных, требуется только воспроизведение. Если запорчена информация в базе данных, то остается только восстановление базы данных с резервной копии.
- Отказ СУРБД (RDBMS). Возможен отказ самого SQL Server. Если отказ этого типа привел к порче данных, то должно быть выполнено восстановление базы данных с резервной копии и последующее воспроизведение. Если данные не запорчены, то для возврата системы к состоянию, в котором она находилась на момент отказа, требуется только автоматическое воспроизведение.
- Отказ приложения.Возможен отказ приложений, что может приводить к порче данных. Если отказ этого типа привел к порче данных, то должно быть выполнено восстановление базы данных с резервной копии (как и в случае отказа СУРБД). Если данные не запорчены, то восстановление не нужно; автоматическое воспроизведение вернет систему к состоянию, в котором она находилась на момент отказа. Возможно, вам потребуется получить исправление от поставщика этого приложения, чтобы не допустить повторения отказа этого типа.
Человеческие ошибки
Третьей основной категорией отказа является человеческая ошибка. Человеческие ошибки могут возникать в любой момент и без предупреждения. Они могут быть умеренными и серьезными. К сожалению ошибки этого типа могут оставаться незамеченными в течение дней или даже недель, что затрудняет процесс восстановления. Поддерживая хорошие взаимоотношения с вашими пользователями (включая средства связи), вы можете быстрее и проще выполнять восстановление после ошибок пользователей. Пользователи не должны опасаться вашей реакции и сразу сообщать вам об ошибке. Чем раньше вы узнаете об ошибке, тем лучше. Следующие отказы могут быть вызваны человеческой ошибкой:
- Потеря сервера с базой данных. К потере сервера могут приводить такие человеческие ошибки, как внезапное отключение питания или отключение сервера без закрытия SQL Server. Воспроизведение происходит автоматически при перезапуске SQL Server, но может потребовать определенного времени. Если отказ не затронул базу данных на диске, то восстановление не требуется.
- Потеря данных. Этот тип потери данных может быть вызван, например, случайным удалением файла данных, что привело к потере базы данных. Для возврата базы данных к ее состоянию до отказа должны быть выполнены операции восстановления и воспроизведения.
- Потеря таблицы или порча данных.Если таблица удалена по ошибке или ее данные изменены некорректным образом, то для возврата таблицы к ее исходному состоянию вы можете использовать восстановление и воспроизведение. Это может оказаться очень сложным делом, поскольку отдельную таблицу или небольшой набор данных нельзя просто восстановить из резервной копии. Пример восстановления данных после отказа этого типа приводится в лекции 33.
Журнальное протоколирование в SQL Server
Чтобы понять, как сочетаются операции резервного копирования и восстановления с воспроизведением базы данных, вам нужно сначала узнать, как происходит журнальное протоколирование в SQL Server. В этом разделе дается обзор возможностей журнального протоколирования и создания контрольных точек в SQL Server, а также описывается резервное копирование журнала транзакций.
Журнал транзакций
Журнал транзакций используется для записи всех транзакций и модификаций, которые вносятся в базу данных этими транзакциями. Именно эта запись позволяет выполнять воспроизведение. При фиксировании транзакции операция фиксирования не завершается, пока в журнал транзакций не будет внесена запись о фиксировании данной транзакции. Поскольку изменения, которые вносятся в базу данных, не сразу записываются на диск, журнал транзакций является единственным средством, с помощью которого можно воспроизвести транзакции в случае отказа системы.
Поток откладываемой записи (Lazywriter Thread)
Изменения, вносимые в базу данных, сначала вносятся в данные, которые находятся в кэше SQL Server. То, что изменения вносятся сначала в кэш, требуется в первую очередь для повышения производительности, поскольку ожидание при операциях ввода-вывода занимает много времени. Эти изменения записываются в конечном итоге на диск, но этот процесс выполняется в фоновом режиме и не виден пользователю. Поскольку модифицированные страницы хранятся в кэше, то может пройти существенный период времени, прежде чем эти страницы (их еще называют ожидающими, черновыми страницами – dirty pages) будут записаны соответствующим потоком (подпроцессом) SQL Server. Этот поток называют потоком откладываемой записи ("ленивым" потоком Этот поток использует LRU-список записи страниц, где первой в очереди записи на диск находится наиболее давно обрабатывавшаяся страница и последней является только что обрабатывавшаяся страница. Страница, которая постоянно модифицируется (и, тем самым, все время перемещается в конец этого списка), вообще может быть не записана этим потоком на диск. Подобные вещи могут увеличивать время воспроизведения, поскольку для применения изменений к таким данным потребуется прочитать много журнальных записей. Например, в большой системе с объемом RAM-памяти более 1 Гб и большим числом изменений в базе данных воспроизведение может занять несколько часов. – lazywriter thread).
Кроме потока откладываемой записи, поток контрольной точки а также выполняет запись ожидающих страниц на диск. (Мы рассмотрим более подробно поток контрольной точки ниже в этом разделе.)
Последовательная запись в журнал
Журнал транзакций содержит "историю транзакций", поэтому операции ввода-вывода для журнала транзакций – это в основном операции записи, которые обычно выполняются последовательно. В случае отката транзакций происходит чтение журнала транзакций, что приводит к нарушению последовательного характера операций ввода-вывода. Поскольку откаты происходят довольно редко (так как аварии системы случаются редко и пользователи не слишком часто отменяют транзакции), ввод-вывод для журнала транзакций имеет достаточно устойчивый характер. Вы можете существенно повысить производительность операций ввода-вывода, поместив журнал транзакций на его собственный диск или матрицу RAID (см. лекции 4 и 5). В силу исключительной важности журнала транзакций для воспроизведения базы данных вам следует защитить его с помощью дисковой матрицы RAID.
Размер журнала транзакций
В зависимости от числа изменений, вносимых в базу данных, журнал транзакций может увеличиваться до больших размеров. Поскольку журнал транзакций состоит из одного или нескольких файлов, размер которых ограничен, этот журнал будет заполняться до конца, и поэтому его приходится время от времени укорачивать (усекать). Автоматическое усечение журнала выполняется по завершении его резервного копирования, как мы увидим ниже в этой лекции.
Воспроизведение с помощью журнала транзакций
В случае отказа системы, при котором не повреждены файлы данных, текущий журнал транзакций используется для воспроизведения базы данных, поскольку это требуется для повторного исполнения транзакций, которые еще не были записаны на диск. Количество требующих воспроизведения страниц зависит от количества ожидающих записи (черновых) страниц в базе данных, которое, в свою очередь, определяется интервалом между контрольными точками. При создании очередной контрольной точки происходит запись всех черновых страниц на диск, что позволяет уменьшить время, необходимое для воспроизведения. Контрольные точки и интервал между контрольными точками подробно описываются в разделе "Контрольные точки" ниже в этой лекции.
Свойства журнала транзакций
Журнал транзакций значительно изменился после версии Microsoft SQL Server 6.5. Журнал транзакций SQL Server 2000 имеет те же характеристики, что и в Microsoft SQL Server 7. Это следующие характеристики.
- Обработка журнала транзакций отличается от обработки обычного файла данных. При записи и чтении не используются 8-килобайтные страницы, как для файлов данных. Теперь формат страниц данных уже не используется для журнала транзакций: запись может выполняться группами любого размера. Таким образом, если потоку записи журнала требуется записать лишь небольшое количество данных, он не будет использовать для этого 8 Кб данных. При частых обновлениях системы поток записи журнала может выполнять запись крупными блоками данных (16 Кб, 32 Кб и т.д.).
- Журнал транзакций можно сконфигурировать для автоматического увеличения по мере необходимости. Это средство позволяет добавлять при необходимости больший объем пространства, но его следует использовать с осторожностью, чтобы не допустить неконтролируемый рост журнала транзакций и использование всего диска этим журналом.
- Для журнала транзакций теперь можно использовать несколько файлов. Эти файлы также можно сконфигурировать для автоматического роста. Для файлов журнала транзакций не используется расслоение данных (striping); они используются друг за другом. (Расслоение данных описывается в лекции 5.)
- Журнал транзакций можно перемещать на другие системы для его воспроизведения на резервной системе. Это средство называется доставкой журнала транзакций (log shipping) и подробно описывается в следующей лекции.
Непротоколируемые операции
Теперь, когда вы знакомы с правилами журнального протоколирования и воспроизведения, вам пора узнать об исключениях из этих правил. Как уже говорилось, обычно все транзакции и изменения, которые они вносят, записываются в журнал транзакций. Однако вы можете выполнять определенные операции, которые не записываются в журнал транзакций. Такие операции называются непротоколируемыми. Выполняя массовую операцию (в которой используется большое количество ресурсов журнала транзакций), как непротоколируемую операцию, вы повышаете производительность этой операции.
Поскольку непротоколируемые операции не записываются в журнал транзакций, вы должны повторить их при необходимости воспроизведения. Поэтому вы должны тщательно продумать последствия активизации непротоколируемых операций, прежде чем сделать это. Имеются следующие операции, которые можно выполнять как непротоколируемые операции.:
- SELECT INTO
- BULK COPY и программа массового копирования (BCP)
- CREATE INDEX
- Определенные текстовые операции
Ниже в этом разделе мы рассмотрим чуть подробнее операции этого списка.
Чтобы активизировать непротоколируемые массовые операции с определенной базой данных, вы должны задать для работы этой базы данных режим воспроизведения BULK_LOGGED. Кроме этого режима, можно также задавать режимы воспроизведения FULL и SIMPLE. Эти режимы задаются с помощью команды ALTER DATABASE, как это показано здесь для базы данных Northwind:
ALTER DATABASE Northwind SET RECOVERY BULK_LOGGED ALTER DATABASE Northwind SET RECOVERY FULL ALTER DATABASE Northwind SET RECOVERY SIMPLE
При использовании режима BULK_LOGGED массовые операции, описанные в следующих разделах (за некоторыми исключениями, которые тоже описываются в следующих разделах), не протоколируются в журнале, а все остальные операции протоколируются. Если выбран режим воспроизведения FULL, то протоколируются все операции. А в случае режима SIMPLE данные можно восстанавливать только из последней резервной копии.
SELECT INTO
Оператор SELECT INTO используется для создания новой таблицы в базе данных. Поскольку оператор SELECT INTO нельзя использовать для выборки данных в существующий объект, его можно использовать только для создания данных, но не для обновления данных. Этот процесс создания можно легко повторить; поэтому операции SELECT INTO вполне подходят для выполнения как непротоколируемые операции.
BULK COPY и программа BCP
Чтобы операции BULK COPY и BCP можно было выполнять как непротоколируемые операции, они должны отвечать следующим требованиям.
- Для параметра базы данных select into/bulkcopy должно быть задано значение TRUE.
- Целевая таблица не может иметь никаких индексов (за исключением случаев, когда они является пустыми перед запуском массового копирования).
- Целевая таблица не может реплицироваться, поскольку для транзакционной репликации используются записи журнала транзакций.
- Чтобы задать блокировку на уровне таблиц, должна быть указана подсказка TABLOCK.
Эти ограничения позволяют выполнять операции массового копирования с большей скоростью при экономии места в журнале транзакций. Однако при необходимости восстановления базы данных из резервной копии эти непротоколируемые операции придется повторить.
CREATE INDEX
Операции оператора CREATE INDEX также вполне подходят для выполнения как непротоколируемые операции, поскольку индексы можно повторно создать при необходимости. Повторное создание индексов не представляет сложностей. Но в случае больших таблиц этот процесс может занять много времени и потребовать интенсивного использования ресурсов.
Текстовые операции
К текстовым операциям, которые можно выполнять как непротоколируемые операции, относятся WRITETEXT и UPDATETEXT. Чтобы активизировать выполнение этих операций без протоколирования, вам нужно просто использовать описанный выше режим BULK_LOGGED.
Контрольные точки
Создание контрольной точки – это операция, которая используется для синхронизации физических файлов данных с кэшем базы данных, чтобы уменьшить время воспроизведения в случае отказа системы. Время, необходимое для воспроизведения базы данных, определяется периодом времени, прошедшим с момента создания последней контрольной точки, и количеством черновых (ожидающих записи) страниц в буферном кэше. Таким образом, уменьшение интервала между контрольными точками снижает время воспроизведения, но за счет дополнительной нагрузки, налагаемой процессом создания контрольной точки.
Контрольные точки создаются в результате запуска оператора CHECKPOINT, при отключении SQL Server с помощью оператора SHUTDOWN или с помощью Service Control Manager, а также при автоматическом запуске операции контрольной точки из SQL Server.
Операции контрольной точки
В процессе создания контрольной точки выполняется ряд следующих операций.
- Запись всех черновых страниц, которые еще ожидали записи перед запуском контрольной точки. Все страницы, которые содержат измененные данные и еще не записаны на диск, теперь записываются на диск.
- Запись всех незавершенных транзакций в журнал транзакций.Тем самым SQL Server получает данные о транзакциях, которые находились в процессе выполнения на момент создания контрольной точки. В случае отказа системы процесс воспроизведения использует эти данные для воспроизведения этих транзакций.
- Запись всех черновых страниц журнала на диск. Тем самым буфер журнала полностью сбрасывается диск.
- Сохранение записей журнала контрольных точек в базе данных. Тем самым происходит сохранение записи о контрольной точке вне журнала транзакций, что необходимо из-за возможности резервного копирования и усечения журнала транзакций.
Конфигурирование интервала между контрольными точками
Интервал между контрольными точками определяется параметром конфигурирования SQL Server recovery interval. Этот параметр задается для всей системы SQL Server, а не для каждой базы данных, но контрольные точки создаются по отдельным базам данных. Этот параметр указывает, сколько минут потребует SQL Server для воспроизведения каждой базы данных в случае отказа системы. Значение 0 указывает, что интервал будет определять SQL Server (обычно он меньше 1 минуты). Для систем с большим объемом памяти, где выполняется очень много операций вставки и обновления, это принятое по умолчанию значение может приводить к созданию излишнего числа контрольных точек. В этом случае вы можете задать для этого параметра более высокое значение. Если ваши пользователи готовы ждать достаточно долго в случае отказа системы (например, 30 минут), производительность транзакций вашей системы будет выше. Значение этого параметра зависит от допустимости простоев в вашей компании и возможной частоты отказов системы.
Интервал между контрольными точками определяется также количеством записей в журнале транзакций. Он не зависит от системного времени или размера журнала. Чем больше записей в журнале транзакций, тем короче интервал между контрольными точками. Чем больше сделано изменений, тем больше записей будет помещено в журнал транзакций, поэтому SQL Server определит интервал между контрольными точками для более частой записи этих изменений на диск. При малом числе изменений, вносимых в базу данных, журнал транзакций будет содержать лишь несколько записей, и интервал между контрольными точками будет больше.
Вы можете изменять значения параметра recovery interval двумя способами: используя Enterprise Manager или с помощью Transact-SQL (T-SQL). Чтобы задать параметр recovery interval из Enterprise Manager, в левой панели щелкните правой кнопкой мыши на имени сервера, для которого хотите задать этот параметр, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties (Свойства SQL Server). Щелкните на вкладке Database Settings (Параметры базы данных) (рис. 32.1), и задайте нужный вам интервал (в минутах) в поле-счетчике Recovery Interval (Интервал воспроизведения).
Рис. 32.1. Окно SQL Server Properties (Параметры базы данных)
Чтобы задать значение recovery interval с помощью T-SQL, используйте хранимую процедуру sp_configure, как это показано ниже:
sp_configure "recovery interval", 1 GO
Вы увидите следующее сообщение:
DBCC execution completed. If DBCC printed error messages, contact your system administrator. Configuration option changed. Run the RECONFIGURE statement to install. (Работа DBCC завершена. Если DBCC вывел сообщения об ошибках, обратитесь к вашему системному администратору. Параметр конфигурирования изменен. Для реализации выполните оператор RECONFIGURE.)
Изменение не будет реализовано, если вы не запустите команду RECONFIGURE. Если вы уверены в правильности изменения, введите следующий оператор T-SQL:
RECONFIGURE GO
Команда RECONFIGURE указывает SQL Server, что нужно реализовать изменения конфигурации. Чтобы измененное значение параметра recovery interval начало действовать, вам не нужно выполнять перезапуск SQL Server.
Чтобы убедиться, что внесенное вами значение действует, используйте следующий оператор T-SQL:
sp_configure "recovery interval" GO
Результаты будут выведены в следующей форме:
name minimum maximum config_value run_value ------------------------------------------------------------------------------------------------ recovery interval (min) 0 32767 1 1
Это показывает, что значение параметра recovery interval действительно было задано.
Методы резервного копирования
Существуют различные методы резервного копирования базы данных: полное и разностное резервное копирование, резервное копирование журнала транзакций, группы файлов и файла данных. Каждый из них имеет свои режимы и возможности работы. Полное резервное копирование (full backup) предусматривает резервное копирование всех данных базы данных, группы файлов или файла данных. Разностное резервное копирование (differential backup) предусматривает резервное копирование только тех данных, которые изменились с момента последнего резервного копирования. Резервное копирование журнала транзакций используется для резервного копирования и усечения журнала транзакций. (Как уже говорилось, резервное копирование журнала транзакций является определяющей задачей для DBA, поскольку данные журнала транзакций используются в сочетании с резервными копиями базы данных.) Резервное копирование групп файлов и файла данных используется для создания резервной копии определенной группы файлов или файла данных в базе данных.
Все виды резервного копирования в SQL Server выполняются для определенной базы данных. Для полного резервного копирования вашей системы вы должны создать резервные копии всех баз данных вашей системы, а также их журналов транзакций. Не забывайте также выполнять резервное копирование базы данных master. И помните, что без хороших резервных копий вам, возможно, не удастся восстановить свои данные в случае отказа системы.
Полное резервное копирование
Как уже говорилось, полное резервное копирование подразумевает резервное копирование всей базы данных. Выполняется резервное копирование всех групп файлов и файлов данных, которые являются частью этой базы данных. Если у вас несколько баз данных, то вам следует создать для всех них резервные копии. Полное резервное копирование является, видимо, наиболее распространенным методом резервного копирования баз данных небольшого и среднего размера. В зависимости от размера баз данных этот процесс может занимать очень много времени, и если для вас важен вопрос времени, то вы можете предусмотреть разностное резервное копирование или резервное копирование групп файлов, как это описано ниже. После запуска резервного копирования вы не можете приостановить его – оно продолжает выполняться, пока не будет получена резервная копия всей базы данных. (О выполнении полного резервного копирования базы данных см. раздел "Выполнение резервного копирования" далее.)
Разностное резервное копирование
Разностное резервное копирование позволяет вам выполнять резервное копирование только той информации, которая изменилась с момента последнего резервного копирования. Поскольку создается резервная копия только части данных, это происходит быстрее и занимает меньше места, чем полная резервная копия. Недостатком является то, что восстановление с разностных копий происходит сложнее и занимает больше времени, чем восстановление с полной резервной копии. Для восстановления с разностной копии требуется восстановление полной резервной копии и всех разностных копий, созданных с момента последнего полного резервного копирования.
Резервное копирование журнала транзакций
Резервное копирование журнала транзакций позволяет вам получать резервные копии журнала транзакций. Эти резервные копии важны для воспроизведения базы данных, как это описано выше в данной лекции.
Резервное копирование группы файлов
Резервное копирование группы файлов предусматривает резервное копирование всех файлов данных, связанных с отдельным файлом в базе данных. Этот процесс похож на полное резервное копирование, поскольку копируются все данные файлов данных независимо от времени создания последней резервной копии этих файлов. Вы можете использовать этот тип резервного копирования для группы файлов, связанной с определенным отделом или рабочей группой, – в зависимости от конфигурации вашей системы. Если ваша система разбита на отделы, которые имеют доступ к своим группам файлов, то вы можете выполнять резервное копирование данных каждого отдела по различным расписаниям.
Резервное копирование файла данных
Резервное копирование файла данных позволяет вам получать резервную копию отдельного файла из группы файлов. Этот тип резервного копирования действует в сочетании с возможностью восстановления отдельного файла данных в SQL Server. Резервное копирование файла данных может оказаться полезным, если у вас недостаточно времени для ежесуточного резервного копирования всей группы файлов, поскольку вы можете использовать ротацию копируемых файлов данных. В случае отказа диска, сопряженного с потерей или порчей файла данных, вы сможете восстановить только этот файл данных. И чем больше период времени, прошедший с момента резервного копирования этого файла данных, тем больше времени займет процесс восстановления.
Выполнение резервного копирования
Вы можете выполнять резервное копирование с помощью Enterprise Manager, команд T-SQL или мастера создания резервной копии базы данных Create Database Backup Wizard. Во многих случаях проще всего использовать Create Database Backup Wizard, но Enterprise Manager также несложно использовать. С другой стороны, команды T-SQL можно помещать в сценарии SQL, которые можно многократно повторять. Вам следует использовать метод, наиболее отвечающий вашим требованиям.
Сами операции резервного копирования можно направлять на физическое устройство или логическое устройство. Физическое устройство – это компонент оборудования, такой как ленточное или дисковое устройство. Операционная система присваивает физическим устройствам имена, и для доступа к этим устройствам вы должны использовать эти имена. Поскольку эти заранее назначенные имена бывает трудно запомнить, вам может потребоваться создание для физического устройства алиаса (определенного пользователем альтернативного имени). Такой алиас называют логическим устройством. Это логическое устройство существует только в рамках SQL Server, и его можно использовать только для резервного копирования в SQL Server, чтобы ссылаться на него как на логическое устройство резервного копирования.Если вы хотите выполнять резервное копирование данных на логическое устройство, то должны создать это устройство заранее. Прежде чем перейти к методам выполнения резервного копирования, мы рассмотрим, как создается логическое устройство резервного копирования. Мы будем использовать для примеров этого раздела логическое устройство резервного копирования. (Для получения сведений о добавлении к системе физических устройств обратитесь к вашему системному администратору.)
Создание логических устройств резервного копирования
Вы можете создавать логические устройства резервного копирования, используя Enterprise Manager или T-SQL. В этом разделе мы рассмотрим оба метода. Использование нескольких устройств резервного копирования может повысить производительность. (Рекомендации по производительности резервного копирования см. в разделе "Улучшение характеристик резервного копирования" далее.)
Создание устройств резервного копирования с помощью Enterprise Manager
Чтобы создать устройство резервного копирования с помощью Enterprise Manager, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте папку SQL Server Group, раскройте папку сервера и затем раскройте папку Management (Управление).
- Щелкните правой кнопкой мыши на Backup (Резервное копирование) и выберите из контекстного меню пункт New Backup Device (Создать устройство резервного копирования), чтобы появилось окно Backup Device Properties (Свойства устройства резервного копирования) (рис. 32.2).
Рис. 32.2. Окно Backup Device Properties (Свойства устройства резервного копирования) - Введите описательное имя для устройства резервного копирования в текстовом поле Name. Текстовое поле File name (Имя файла) заполняется автоматически. Чтобы изменить путь доступа к файлу, введите новый путь доступа или щелкните на кнопке обзора Browse [...], чтобы открыть диалоговое окно Backup Device Location (Местоположение устройства резервного копирования). В данном примере имя устройства резервного копирования – backup_dev_1. Если вы добавляете ленточное устройство, щелкните на кнопке View Contents (Просмотр содержимого), чтобы увидеть все наборы резервного копирования, которые имеются в данный момент на данном ленточном устройстве.
По окончании этих шагов устройство готово к использованию. Вы узнаете, как использовать устройства резервного копирования, ниже в этой лекции, когда будете изучать создание резервной копии. Отметим, что если у вас нет ленточных устройств, подсоединенных к вашей системе, то кнопка выбора Tape Drive Name (Имя ленточного устройства) недоступна.
Создание устройств резервного копирования с помощью T-SQL
Для создания устройства резервного копирования с помощью T-SQL используйте хранимую процедуру sp_addumpdevice. Она имеет следующий синтаксис:
sp_addumpdevice тип_устройства, логическое_имя, физическое_имя
Значением параметра тип_устройства может быть disk для дискового устройства, tape для ленточного устройства или pipe для подсоединения программного обеспечения сторонних форм к системе резервного копирования. Параметр логическое_имя – это имя, которое вы присваиваете данному устройству; это имя используется для ссылки на устройство в операторах BACKUP и RESTORE. Параметр физическое_имя – это имя, присвоенное системой устройству или файлу.
Например, чтобы создать логическое устройство с именем Backup_dev_2 для файла на диске, используйте следующий синтаксис:
sp_addumpdevice 'disk', 'Backup_dev_2', 'C:\MSSQL2K\BACKUP\Backup_dev_2.BAK'
Создание удаленного устройства резервного копирования
Чтобы создать резервную копию вашей базы данных на удаленной системе, вы должны сначала создать устройство резервного копирования с помощью системной хранимой процедуры sp_addumpdevice. Вы не можете создать устройство резервного копирования на удаленном сервере с помощью Enterprise Manager. Чтобы задать удаленную систему, вы должны указать в качестве физического имени полное UNC-имя, как это показано в следующем примере:
sp_addumpdevice 'disk', 'netbackup1', '\\ptc4\c$\backup\netbackup1.bck'
Создав это устройство резервного копирования, вы можете копировать на него данные с помощью Enterprise Manager или команд T-SQL.
Резервное копирование данных через несколько сетей
Вы можете также выполнять резервное копирование через несколько сетевых интерфейсных плат. Выполняя резервное копирование данных на несколько устройств через несколько сегментов локальной сети, вы можете обходить проблемы пропускной способности сети, которые могут ограничивать производительность. В случае резервного копирования данных на несколько компьютерных систем просто укажите имена этих систем. В случае резервного копирования данных на одну систему через два сегмента локальной сети вы можете указать IP-адрес в UNC-адресе, как это показано ниже:
sp_addumpdevice 'disk', 'netbackup1', '\\100.100.100.1\c$\backup\netbackup1.bck' sp_addumpdevice 'disk', 'netbackup2', '\\100.100.200.1\c$\backup\netbackup2.bck'
Создав эти устройства резервного копирования, вы можете копировать на них данные с помощью Enterprise Manager или операторов T-SQL.
Резервное копирование с помощью Enterprise Manager
Создав одно или несколько устройств резервного копирования, вы можете выполнять резервное копирование. Сначала мы рассмотрим использование Enterprise Manager. Чтобы избежать повторений, методы резервного копирования журнала транзакций и базы данных описываются по возможности вместе; при этом указываются конкретные параметры для каждого метода и отличия между ними.
Выполнение резервного копирования
Для выполнения резервного копирования с помощью Enterprise Manager выполните следующие шаги.
- Вызовите утилиту SQL Server Backup с помощью одного из следующих методов.
- Раскройте папку сервера в левой панели Enterprise Manager и затем раскройте папку Management. Щелкните правой кнопкой мыши на Backup и выберите из контекстного меню пункт Backup A Database (Резервное копирование базы данных).
- Раскройте папку сервера в левой панели Enterprise Manager, щелкните правой кнопкой мыши на Database, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Backup Database.
- Раскройте папку сервера в левой панели Enterprise Manager и затем щелкните на папке Databases. В правой панели щелкните правой кнопкой мыши на базе данных, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Backup Database.
Появится диалоговое окно SQL Server Backup (рис. 32.3).
Рис. 32.3. Вкладка General диалогового окна SQL Server Backup
- В раскрывающемся списке Database верхней секции этого диалогового окна выберите базу данных, для которой хотите выполнить резервное копирование. (Если вы использовали третий метод на шаге 1, то имя соответствующей базы данных уже будет выбрано.) Имя резервной копии автоматически формируется на основе имени базы данных, хотя вы можете переопределить это автоматическое имя путем ввода имени резервной копии в текстовом поле Name. Вы можете также ввести описание резервной копии в текстовом поле Description. Это описание может оказаться важным для вас при восстановлении базы данных. Например, если вы создаете эту резервную копию непосредственно перед удалением какой-либо таблицы, имеет смысл включить этот факт в описание. Если резервное копирование выполняется перед загрузкой новых данных, включите эту информацию в ваше описание.
- В секции Backup (Резервное копирование) этого диалогового окна вы должны указать тип резервного копирования. Доступные кнопки выбора будут варьироваться в зависимости от выбранной вами базы данных. Например, по умолчанию для базы данных Northwind установлен параметр Truncate log on checkpoint. (Усечение журнала транзакций при создании контрольной точки). В этом случае кнопки выбора Transaction Log и File and Filegroup недоступны для программы резервного копирования. Секция Backup содержит следующие кнопки выбора.
- Database – Complete (База данных – Полное). Полное резервное копирование базы данных, т.е. всех данных соответствующей базы данных.
- Database – Differential (База данных – Разностное).Разностное резервное копирование базы данных, т.е. всех данных, которые изменились с момента предыдущего резервного копирования.
- Transaction Log (Журнал транзакций). Резервное копирование журнала транзакций; при этом также происходит усечение журнала транзакций.
- File And Filegroup (Файл и группа файлов). Резервное копирование одного файла или группы файлов; вы должны указать этот файл или группу файлов.
- В секции Destination (Местоположение резервной копии) вы должны выбрать тип устройства для резервной копии – Tape (Лента) или Disk (Диск). Щелкнув на кнопке Add, вы можете добавлять логические или физические устройства резервного копирования. Появится диалоговое окно Select Backup Destination (Выбор местоположения резервной копии) (рис. 32.4). В этом диалоговом окне вы можете указать имя файла или выбрать устройство резервного копирования из раскрывающегося списка Backup device. Щелкните на кнопке OK, чтобы вернуться во вкладку General диалогового окна SQL Server Backup. В примере на рис. 32.3 в списке Backup to представлены два устройства. Чтобы удалить какое-либо устройство, выделите это устройство и щелкните на кнопке Remove (Удалить). Для просмотра содержимого устройства щелкните на кнопке Contents (Содержимое).
Если определенное устройство резервного копирования уже использовалось раньше, появится следующая информация о резервной копии.
- Name (Имя). Имя, выбранное тем, кто запускал резервное копирование.
- Server (Сервер). Имя сервера, на котором выполнялось резервное копирование.
- Database (База данных). Имя базы данных, для которой было выполнено резервное копирование.
- Type (Тип). Тип резервного копирования (Complete, Differential, Transaction Log, Filegroup, File)
Рис. 32.4. Диалоговое окно Select Backup Destination - Date (Дата).Дата и время резервного копирования.
- Expiration (Срок окончания действия).Срок окончания действия, указанный для резервной копии.
- Size (Размер). Общий размер набора резервного копирования.
- Description (Описание).Описание, заданное для резервной копии.
- В секции Overwrite (Перезапись) диалогового окна SQL Server Backup вы можете выбирать между перезаписью носителя (кнопка выбора Overwrite ...), такого как лента или диск, и добавлением к предыдущим данным (кнопка выбора Append...). Но если вы используете ленты и чередуете их, то вам нужно удалять предыдущую информацию. Хотя вы можете перезаписывать эту информацию, щелкнув на кнопке выбора Overwrite existing media в этом диалоговом окне, вам следует вместо этого принять за правило стирать информацию перед резервным копированием. Тем самым вы гарантируете себя от случайной перезаписи ленточного или дискового устройства.
- В секции Schedule (Расписание) вы можете задать расписание для запуска резервного копирования в определенное время. Создание резервных копий по расписанию особенно полезно для резервного копирования журнала транзакций, которое может выполняться регулярным образом, чтобы избежать переполнения журнала транзакций. Чтобы задать расписание резервного копирования, установите флажок Schedule и затем щелкните на кнопке обзора (...), чтобы появилось диалоговое окно Edit Schedule (Редактировать расписание) (рис. 32.5).
Рис. 32.5. Диалоговое окно Edit Schedule (Редактировать расписание) - Введите имя расписания в текстовом поле Name. Имена расписаний позволяют вам создавать несколько расписаний, например, отдельное расписание для каждого резервного копирования.
В секции Schedule type (Тип расписания) вы можете выбрать один из следующих типов расписания (в порядке кнопок выбора): автоматически при запуске SQL Server Agent, когда не будет занят ЦП, запускать резервное копирование один раз или повторять его. Если у вас выбран однократный запуск резервного копирования, то вы используете всплывающий календарь On date (Дата) для выбора даты резервного копирования и поле-счетчик At time (Время) для выбора времени.
Чтобы задать расписание для периодически повторяющегося резервного копирования, щелкните на кнопке выбора Recurring (Периодически) и щелкните на кнопке Change (Изменить).
Появится диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) (рис. 32.6). Это диалоговое окно предоставляет вам разнообразные гибкие возможности по созданию расписания. Используя вариант Daily (Ежедневно), Weekly (Еженедельно) или Monthly (Ежемесячно), вы можете указывать частоту и срок действия соответствующего задания.
Рис. 32.6. Диалоговое окно Edit Recurring Job Schedule (Редактировать расписание повторяющихся заданий) - Щелкните на кнопке OK, чтобы вернуться в диалоговое окно Edit Schedule, щелкните еще раз на кнопке OK, чтобы вернуться в диалоговое окно SQL Server Backup, и затем щелкните на вкладке Options (рис. 32.7). В этой вкладке вы можете указывать, нужно ли проверять носитель резервной копии по завершении резервного копирования, а также указывать необходимость и способ задания метки (заголовка) носителя резервной копии. Ниже описываются параметры этой вкладки.
- Verify backup upon completion (Проверять резервную копию по завершении). Вызывает проверку носителя резервной копии на читаемость. Проверяется только целостность копии; этот процесс не проверяет, что резервная копия содержит соответствующие данные.
- Eject tape after backup (Извлечь ленту из устройства после резервного копирования – только для ленточных устройств).Извлечение ленты из устройства по завершении резервного копирования. Этот флажок полезно использовать, если несколько приложений или пользователей осуществляют доступ к ленточным устройствам. Это позволяет сохранить вашу ленту от перезаписи другим пользователем.
- Remove inactive entries from transaction log (Удалить неактивные записи из журнала транзакций – только для резервного копирования журнала транзакций).Усечение журнала транзакций после резервного копирования.
- Check media set name and backup set expiration (Проверять имя набора носителей и дату окончания срока хранения набора резервного копирования).Указывает, что данный носитель нужно проверять и не перезаписывать, если не наступила дата окончания срока хранения.
- Backup set will expire (Срок хранения набора резервного копирования истекает – только для ленточных устройств). Позволяет вам задавать дату окончания срока хранения данного носителя.
- Initialize and label media (Инициализировать и пометить носитель – только для ленточных устройств). Позволяет вам задавать метку для данного носителя.
Рис. 32.7. Вкладка Options диалогового окна SQL Server Backup - По окончании установки параметров щелкните на кнопке OK, чтобы перейти к выполнению сконфигурированного резервного копирования.
Управление резервным копированием
Для просмотра, удаления и модифицирования запланированных вами заданий резервного копирования выполните следующие шаги:
- В левой панели Enterprise Manager раскройте папку сервера, раскройте папку Management, раскройте папку SQL Server Agent и щелкните на Jobs (Задания). Запланированные задания будут представлены в списке правой панели Enterprise Manager (рис. 32.8).
- Чтобы удалить задание, щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Delete (Удалить).
увеличить изображение
Рис. 32.8. Задания, представленные в окне Enterprise Manager - Для просмотра или модифицирования задания щелкните правой кнопкой мыши на имени этого задания и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно свойств задания Properties. Внесите свои изменения, щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK.
Резервное копирование с помощью операторов T-SQL
Использование операторов T-SQL для резервного копирования базы данных может оказаться поначалу чуть сложнее, чем использование Enterprise Manager. Но если вы относитесь к тем администраторам, которые предпочитают автоматизировать операции с помощью сценариев, этот метод будет для вас удобнее. Кроме того, оператор T-SQL BACKUP дает несколько больше возможностей, чем программа резервного копирования в Enterprise Manager. В этом разделе мы рассмотрим синтаксис и параметры оператора BACKUP. На самом деле существуют два оператора резервного копирования; выбор используемого оператора зависит от типа резервного копирования, которое вам нужно выполнить. Это следующие операторы:
- BACKUP DATABASE. Используется для резервного копирования всей базы данных либо файла или группы файлов.
- BACKUP LOG. Используется для резервного копирования журнала транзакций.
Поскольку эти два оператора обеспечивают в основном одни и те же возможности, мы будем рассматривать их вместе.
Выполнение резервного копирования
Оператор BACKUP для полного резервного копирования базы данных имеет следующий синтаксис:
BACKUP DATABASE имя_базы_данных TO устройство_резервного_копирования [ WITH необязательные параметры ]
Для этого оператора обязательными параметрами являются только имя базы данных и имя устройства резервного копирования. (Примеры операторов BACKUP можно найти во врезке "Использование оператора BACKUP" далее.)
Оператор для резервного копирования файла или группы файлов имеет следующий синтаксис:
BACKUP DATABASE имя_базы_данных имя_файла или имя_группы_файлов [,...n] TO устройство_резервного_копирования [ WITH необязательные параметры ]
Для этого оператора обязательными параметрами являются только имя базы данных, имя файла или имя группы файлов и имя устройства резервного копирования. Можно указывать несколько имен файлов или имен групп файлов, разделенных запятыми.
Оператор для резервного копирования журнала транзакций имеет следующий синтаксис:
BACKUP LOG имя_базы_данных { [ WITH \ NO_LOG | TRUNCATE_ONLY )] } | { TO устройство_резервного_копирования } [ WITH необязательные параметры ]
Для этого оператора обязательными параметрами являются только имя базы данных и параметр WITH NO_LOG или WITH TRUNCATE_ONLY либо имя устройства резервного копирования. Вы можете затем добавлять любые нужные вам параметры. Параметры NO_LOG и TRUNCATE ONLY является синонимами; оба указывают усечение журнала без создания его резервной копии.
Во всех трех указанных командах резервного копирования имя_базы_данных представляет базу данных, для которой будет создана резервная копия. Устройство_ резервного_копирования – это имя логического устройства резервного копирования или имя физического устройства. Если указано физическое устройство, то имени устройства должен предшествовать текст DISK =, TAPE = или PIPE = (в зависимости от типа устройства). Вы можете задать одно устройство или набор разделенных запятыми устройств, как это показано в следующих двух примерах:
Backup_dev_1, Backup_dev_2, Backup_dev_3 TAPE = '\\.\Tape0', TAPE = '\\.\Tape1', TAPE = '\\.\Tape2'
Необязательные параметры
В табл. 32.1 приводится список дополнительных параметров, которые можно использовать в операторе BACKUP. Если какой-либо параметр доступен для резервного копирования только базы данных или только журнала транзакций, это исключение оговаривается.
Параметр | Описание |
---|---|
BLOCKSIZE | Этот параметр указывает размер физического блока в байтах |
DESCRIPTION | Этот параметр указывает текстовое описание набора резервного копирования. Его полезно использовать для поиска нужной резервной копии, с которой будет выполняться восстановление |
DIFFERENTIAL | Этот параметр указывает разностное резервное копирование. Его можно использовать только при наличии полной резервной копии базы данных |
EXPIREDATE = дата RETAINDAYS = дни | Параметр EXPIREDATE указывает дату, когда истекает срок действия данного набора резервного копирования (и когда его можно перезаписывать). |
RETAINDAYS | указывает количество дней, соответствующих сроку действия данного набора резервного копирования |
PASSWORD = пароль | Параметр PASSWORD позволяет вам задавать пароль для резервной копии, что повышает безопасность самой резервной копии |
FORMAT | NOFORMAT | Параметр FORMAT указывает, что заголовок носителя должен быть перезаписан, делая тем самым недействительными первоначальные данные на этом носителе. Параметр NOFORMAT указывает, что заголовок носителя не должен перезаписываться |
INIT | NOINIT | Параметр INIT указывает, что набор резервной копии должен находиться в первом файле на данном носителе, причем заголовок носителя остается без изменений, но все данные на этом носителе перезаписываются; иными словами, INIT указывает перезапись всего, чт.е. на ленте. Параметр NOINIT указывает, что данный набор резервной копии добавляется к содержимому носителя. Если вы повторно используете ленты, то вам нужно использовать этот параметр |
MEDIADESCRIPTION = текст | Это текстовое поле задает описание набора носителей |
MEDIANAME= имя_носителя | Указывает имя носителя |
MEDIAPASSWORD = пароль | С помощью этого параметра вы можете указывать пароль для набора носителей |
NAME= имя_набора_резервной_копии | Этот параметр позволяет вам задавать имя набора резервной копии |
NOSKIP | SKIP | Параметр NOSKIP указывает, что прежде чем перезаписывать наборы резервных копий на данном носителе, будут проверяться даты истечения срока действия соответствующих наборов резервных копий. Параметр SKIP отключает проверку этой даты |
NO_TRUNCATE | Этот параметр запрещает усечение журнала транзакций после создания резервной копии. Используется только для резервного копирования журнала транзакций |
NOUNLOAD | UNLOAD | Параметр NOUNLOAD указывает, что после завершения резервного копирования носитель не будет выгружаться из устройства (например, не будет извлекаться лента). Параметр UNLOAD указывает, что по окончании резервного копирования носитель будет выгружен |
RESTART | Этот параметр указывает SQL Server необходимость перезапуска резервного копирования, которое было прервано |
STATS [ = процент ] | Этот параметр указывает вывод сообщения после выполнения определенного процента резервного копирования. Его полезно использовать, если вы любите следить за ходом выполнения операций |
Проследите за тем, что вы задали, – добавление резервной копии к существующим данным носителя или перезапись данных носителя, как это описано выше; выбранный вами вариант влияет на количество данных, которое можно разместить на ленте. При резервном копировании данных на уже используемое ленточное устройство без стирания этой ленты (или запрещая перезапись) вам может не хватить места на ленте. В режиме добавления программа резервного копирования будет использовать только пространство, оставшееся свободным до конца ленты.
Использование оператора BACKUP
В этом разделе мы рассмотрим пару примеров использования оператора T-SQL BACKUP. Следующий оператор используется для резервного копирования файлов данных базы данных Example:
BACKUP DATABASE Example TO Backup_Dev_1, Backup_Dev_2 WITH DESCRIPTION = "DB backup of example", STATS = 5 GO
Здесь устройства резервного копирования – это Backup_Dev_1 и Backup_Dev_2, а сообщение о состоянии будет выводиться после выполнения очередных 5 процентов резервного копирования. Отметим, что в этом примере задано описание резервной копии.
Если вы будете проверять этот пример на небольшой базе данных, такой как Northwind, то вы не увидите сообщений с приращением по 5 процентов. Это будут приращения, например, в 7 процентов, 16 процентов и т.д. Дело в том, что программа резервного копирования читает и записывает за один раз более 5 процентов от объема всех данных такой базы данных. Для наборов данных большего размера за один раз будет записываться меньше 5 процентов данных и поэтому сообщения будут появляться ожидаемым образом.
Следующий оператор используется для резервного копирования журнала транзакций базы данных Example:
BACKUP LOG Example TO Backup_Dev_3, Backup_Dev_4 WITH DESCRIPTION = "DB backup of example", STATS = 25 GO
Здесь устройства резервного копирования – это Backup_Dev_3 и Backup_Dev_4, а сообщения о состоянии будут выводиться с интервалом в 25 процентов. В результирующем наборе будет представлен процент выполненных операций, а также результаты резервного копирования. Будет указано количество скопированных страниц, сколько времени длится резервное копирование и какова скорость (Мб/с).
Управление резервным копированием
Поскольку оператор T-SQL BACKUP не выполняется под управлением Enterprise Manager и, тем самым, не выполняется под управлением SQL Server Agent, вы не можете задать расписание этого задания в операторе BACKUP . Но вы можете задать расписание для оператора T-SQL BACKUP с помощью средств планирования заданий в SQL Server. После того как составлено расписание для задания, им можно управлять точно так же, как и заданиями резервного копирования в Enterprise Manager.
Резервное копирование с помощью мастера Create Database Backup Wizard
Теперь обратимся к третьему методу выполнения резервного копирования: использование мастера Create Database Backup Wizard.
Выполнение резервного копирования
Для резервного копирования с помощью мастера Create Database Backup Wizard выполните следующие шаги.
- В окне Enterprise Manager щелкните на базе данных, для которой хотите создать резервную копию, и затем выберите из меню Tools пункт Wizards (Мастера), чтобы появилось диалоговое окно Select Wizard (Выбор мастера). В диалоговом окне Select Wizard раскройте папку Management, выберите Backup Wizard (Мастер резервного копирования) и затем щелкните на кнопке OK. Появится начальное окно мастера Create Database Backup Wizard (рис. 32.9).
Рис. 32.9. Начальное окно мастера Create Database Backup Wizard - Щелкните на кнопке Next, чтобы появилось окно Select Database to Backup (Выбор баз данных для резервного копирования) (рис. 32.10). В этом окне вы указываете базу данных для резервного копирования (на рис. 32.10 выбрана база данных Northwind).
Рис. 32.10. Окно Select Database to Backup (Выбор баз данных для резервного копирования)
Рис. 32.11. Окно Type Name and Description for Backup (Ввод имени и описания для резервной копии) - Щелкните на кнопке Next, чтобы появилось окно Type Name and Description for Backup (Ввод имени и описания для резервной копии) (рис. 32.11). Здесь вы задаете имя и описание для набора резервной копии путем ввода нужного имени в текстовом поле Name и описания в текстовом поле Description. Хорошее описание поможет вам в будущем, когда у вас будет много резервных копий.
- Щелкните на кнопке Next, чтобы появилось окно Select Type of Backup (Выбор типа резервного копирования) (рис. 32.12). Здесь вы можете выбрать тип резервного копирования (в порядке кнопок выбора): полная резервная копия, разностная резервная копия или резервная копия журнала транзакций. На рис. 32.12 выбрано полное резервное копирование.
Рис. 32.12. Окно Select Type of Backup - Щелкните на кнопке Next, чтобы появилось окно Select Backup Destination and Action (Выбор местоположения резервной копии и действия) (рис. 32.13). В секции Select backup device (Выбор устройства резервного копирования) выберите тип устройства: ленту (кнопка выбора Tape), файл (File) или определенное устройство резервного копирования (Backup device), и при необходимости укажите в соответствующем поле имя файла или имя устройства. В секции Properties выберите, как будет происходить запись на носитель резервной копии: путем добавления (первая кнопка выбора) или перезаписи (вторая кнопка выбора). Укажите, нужно ли извлекать ленту после резервного копирования (флажок Eject tape after backup), если вы используете ленту, и нужно ли проверять целостность резервной копии (флажок Read and verify ...). Проверка целостности имеет смысл, поскольку некачественная лента может сделать ненужной всю резервную копию. SQL Server проверяет целостность ленты, читая эту ленту и проверяя читаемость всех данных.
Рис. 32.13. Окно Select Backup Destination and Action (Выбор местоположения резервной копии и действия)Примечание. К сожалению, мастер Create Database Backup Wizard позволяет вам выбрать только одно устройство резервного копирования, что может резко повлиять на производительность резервного копирования. (Cм. раздел "Улучшение характеристик резервного копирования" далее.) По этой причине использование Enterprise Manager может оказаться предпочтительнее мастера Create Database Backup Wizard. - Щелкните на кнопке Next, чтобы появилось окно Backup Verification аnd Scheduling (Проверка резервной копии и создание расписания) (рис. 32.14). Здесь вы можете задать проверку меток носителей и дат окончания срока действия. (См. раздел "Резервное копирование с помощью Enterprise Manager".) Вы можете также запланировать резервное копирование на определенные моменты в будущем с помощью диалогового окна Edit Schedule, как это описано выше в этой лекции.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Create Database Backup Wizard (Завершение работы мастера создания резервной копии базы данных) (рис. 32.15). Проверьте информацию в текстовом поле и щелкните на кнопке Finish, чтобы запустить резервное копирование.
Рис. 32.14. Окно Backup Verification and Scheduling (Проверка резервной копии и создание расписания)
Рис. 32.15. Окно Completing the Create Database Backup Wizard (Завершение работы мастера создания резервной копии базы данных)
Управление резервным копированием
С помощью мастера Create Database Backup Wizard вы можете только выполнять резервное копирование или создавать задание на резервное копирование (которое запускается по расписанию). Создав задание, вы должны использовать для управления этим заданием Enterprise Manager или оператора T-SQL. (Об управлении заданиями см. раздел "Резервное копирование с помощью Enterprise Manager" выше в этой лекции.)
Слежение за резервным копированием
При выполнении резервного копирования (с помощью Enterprise Manager, T-SQL или мастера Create Database Backup Wizard) сохраняется запись об этом резервном копировании. Эта запись сохраняется в виде строки в таблице backupfile базы данных msdb. Во время восстановления данная информация используется, чтобы определить, когда было выполнено последнее резервное копирование для базы данных. Кроме того, сохраняется такая информация, как идентификатор набора резервной копии и имена файлов, сохраненных при резервном копировании. Поэтому важно выполнять периодическое резервное копирование системных баз данных, чтобы можно было при необходимости восстановить эту информацию.
Составление расписаний резервного копирования
Составление расписаний резервного копирования является весьма субъективной задачей. При разработке расписания требуется учитывать многочисленные факторы. Поскольку во время резервного копирования падает производительность системы, оно должно выполняться только в нерабочее время. Возможно, у вас будет лишь небольшое временное "окно", когда вы можете выполнять резервное копирование. В этом разделе мы предложим несколько советов, которые могут помочь вам в составлении расписания резервного копирования. Не забывайте, что хотя резервное копирование влияет на производительность системы, это критически важная операция, которая должна выполняться для защиты вашей системы от потери данных.
Рекомендации по составлению расписания
Следующие рекомендации могут помочь вам в составлении "идеального" расписания резервного копирования для вашей системы.
- Планируйте выполнение полного резервного копирования в нерабочее время.Если ваша компания не поддерживает непрерывный цикл работы (по 24 часа 7 дней в неделю), то нерабочее время наиболее подходит для резервного копирования.
- Разбейте расписание резервного копирования на несколько дней.Если у вас большая база данных и вы не успеваете выполнить резервное копирование в заданное время, разбейте операцию резервного копирования на части. Вы можете за один раз выполнить резервное копирование файла или группы файлов определенной части базы данных. Через несколько дней у вас будет выполнено резервное копирование всех данных.
- Используйте разностное резервное копирование. Если у вас нет времени, чтобы выполнять полное резервное копирование каждую ночь, создавайте разностные резервные копии в течение недели, а полную резервную копию – в выходные дни.
- Выполняйте настройку плана резервного копирования.Каждая система отличается от других систем, и каждая компания – от других компаний. Разрабатывайте расписание резервного копирования, наиболее отвечающее вашим требованиям.
Планирование операций резервного копирования
Вот несколько планов резервного копирования, которые могут помочь вам в разработке ваших собственных расписаний резервного копирования.
- Небольшая система в условиях "8 на 5" (8-часовой рабочий день 5 дней в неделю). Этот тип системы обычно позволяет выполнять полное резервное копирование каждый вечер. Журнал транзакций, видимо, нужно копировать только раз в день (в зависимости от размера журнала транзакций и количества выполненных транзакций).
- Система среднего масштаба в условиях "24 на 7". Система среднего масштаба, работающая в условиях "24 на 7" не позволяет выделить слишком много времени для резервного копирования. Однако в системе такого масштаба у вас, скорее всего, есть возможность выполнения резервного копирования в выходные дни. В следующей таблице показано, как может выглядеть расписание резервного копирования для компании среднего масштаба.
Понедельник Разностное резервное копирование базы данных Вторник Разностное резервное копирование базы данных Среда Разностное резервное копирование базы данных Четверг Разностное резервное копирование базы данных Пятница Разностное резервное копирование базы данных Суббота Разностное резервное копирование базы данных Воскресенье Полное резервное копирование базы данных Все дни Резервное копирование журнала транзакций по необходимости - Крупная система в условиях "24 на 7" В очень крупных системах может не оказаться возможности полного резервного копирования хотя бы в один из дней недели. Компромиссное решение – разбить полное резервное копирование на несколько дней, как это показано в следующей таблице. (В приведенном расписании полное резервное копирование выполняется за два дня – в субботу и воскресенье.)
Понедельник Разностное резервное копирование базы данных Вторник Разностное резервное копирование базы данных Среда Разностное резервное копирование базы данных Четверг Разностное резервное копирование базы данных Пятница Разностное резервное копирование базы данных Суббота Полное резервное копирование групп файлов Воскресенье Полное резервное копирование групп файлов Все дни Резервное копирование журнала транзакций по необходимости
Эта информация дает вам представление о том, как планировать резервное копирование. Поскольку все системы и требования этих систем отличаются друг от друга, только вы сами можете решить, как наилучшим образом спланировать расписание вашего резервного копирования.
Улучшение характеристик резервного копирования
С помощью нескольких простых методов вы можете улучшить как производительность, так и характеристики выполнения резервного копирования. В этом разделе вы найдете рекомендации, позволяющие повысить производительность, а также улучшить характеристики резервного копирования в других отношениях.
Повышение производительности резервного копирования
Повышение производительности резервного копирования является важной темой, поскольку это позволяет сократить время, в течение которого снижается производительность SQL Server (из-за параллельного выполнения операции резервного копирования). Использование следующих методов поможет в повышении производительности резервного копирования и (в некоторых случаях), поможет также повысить производительность процесса восстановления. (О восстановлении базы данных см. лекцию 33.)
- Используйте несколько устройств резервного копирования. Использование нескольких устройств резервного копирования позволяет SQL Server выполнять некоторые операции резервного копирования параллельно. SQL Server осуществляет это путем распределения резервной копии между несколькими устройствами. Для этого SQL Server создает несколько потоков, исходя из количества файлов данных и количества устройств резервного копирования. Производительность резервного копирования также повышается за счет дополнительных потоков, используемых для записи на эти устройства. Параллельное выполнение операций снижает суммарное количество времени, необходимое для этих операций, особенно в многопроцессорной системе. Этот метод позволяет повысить производительность резервного копирования, а также процесса восстановления.
- Используйте несколько файлов данных в базе данных.Использование нескольких файлов данных меньшего размера вместо одного большого файла позволяет SQL Server выполнять значительную часть резервного копирования параллельно. Этот метод позволяет повысить производительность резервного копирования, а также процесса восстановления.
- Используйте несколько сегментов локальной сети для резервного копирования. Распределяя резервное копирование между несколькими сегментами локальной сети, вы можете увеличить долю пропускной способности сети, доступную для резервного копирования. Два сегмента локальной сети увеличивают пропускную способность вдвое по сравнению с одним сегментом, три сегмента – втрое, и т.д.
- Выполняйте резервное копирование поэтапно.Чтобы повысить производительность резервного копирования, вы можете выполнять резервное копирование на диск, а затем копировать файлы дисковой резервной копии на ленту. Этот метод повышает производительность, поскольку операции на диске выполняются быстрее, чем на ленте, и это позволяет вам держать несколько последних резервных копий на диске. Этот метод повышает производительность процесса восстановления только для файлов резервного копирования, оставшихся на диске.
- Используйте разностные резервные копии. Разностное резервное копирование повышает производительность каждого резервного копирования, но если вы используете его, то восстановление всей базы данных занимает намного больше времени (см. лекцию 33). Если у вас недостаточно времени для полного резервного копирования, этот метод может стать для вашей системы наилучшим решением. Если восстановление данных требуется редко, то это, возможно, приемлемый компромисс.
Дополнительные рекомендации
Следующие рекомендации по выполнению резервного копирования, возможно, применимы, а возможно, неприменимы к вашим условиям.
- Сохраняйте резервные копии вне рабочего места. Если вы храните резервные копии вне рабочего места, то они, возможно, останутся целы после таких катастроф, как пожар или затопление водой. Данные резервных копий намного важнее, чем сами компьютерные системы.
- Проверяйте резервную копию. Резервная копия не будет вечно в хорошем состоянии. Ленты могут портиться, особенно если вы многократно используете одни и те же ленты. Проверяя резервную копию (хотя бы время от времени), вы будете знать, что лента в хорошем состоянии.
- Не используйте один и тот же носитель каждый день. Используя один и тот же носитель каждый день, вы не сможете восстановить данные, удаленные за несколько дней до вашей попытки восстановления. Чередуйте ленты с резервными копиями, чтобы иметь возможность восстановления информации хотя бы за несколько дней.
- Ведите запись того, как происходит резервное копирование. Вы должны документировать, как выполняется резервного копирования и как восстановить систему при необходимости. Помните, вы не всегда будете на месте, чтобы самому восстановить систему.
- Создавайте резервные копии системных таблиц. Не забывайте периодически выполнять резервное копирование системных баз данных, таких как master и msdb.
Эти рекомендации помогут вам в разработке вашей собственной стратегии резервного копирования. Каждая система имеет свои отличия, и потребности каждой компании тоже отличаются. И снова скажем, что вы должны разрабатывать стратегию, которая подходит именно для вас.
Заключение
В этой лекции вы узнали, как происходит журнальное протоколирование в SQL Server и как использовать контрольные точки, чтобы сократить время, необходимое для восстановления базы данных. Вы ознакомились с основами резервного копирования в SQL Server и с отличиями между полным и разностным резервным копированием и между резервным копированием базы данных и журнала транзакций. Вы также узнали, как составлять расписание резервного копирования и улучшать характеристики резервного копирования. В лекции 33 мы продолжим изучение резервного копирования, восстановления и воспроизведения базы данных. Вы узнаете, как восстанавливать базу данных и как планировать восстановление после аварии.
Лекция 33. Восстановление и воспроизведение базы данных
В лекции 32 вы узнали о том, насколько важно выполнять резервное копирование вашей системы и как создавать резервные копии. В этой лекции мы продолжим тему защиты базы данных, исходя из материала предыдущей лекции. Вы узнаете, как восстанавливать базу данных, как планировать восстановление на случай аварии; мы рассмотрим более подробно, как происходит воспроизведение базы данных. Как вы увидите, тип выполненного резервного копирования влияет на то, как выполняется восстановление. Кроме изучения методов восстановления и воспроизведения базы данных, вы ознакомитесь с понятием доставки журнала транзакций (log shipping). Это новое средство, введенное в Microsoft SQL Server 2000, позволяющее создавать резервную копию вашей базы данных на другом сервере путем использования журнала транзакций исходного сервера.
Методы восстановления
Как уже говорилось, тип выполненного резервного копирования влияет на характер операции восстановления. В этом разделе вы узнаете, как выполнять восстановление из полной резервной копии, из разностной резервной копии, а также из резервных копий журнала транзакций.
Восстановление из полной резервной копии
Восстановление из полной резервной копии – это довольно простой процесс: вы просто восстанавливаете файлы резервной копии с помощью SQL Server Enterprise Manager или операторов Transact-SQL (T-SQL). Инструкции по восстановлению данных с помощью этих двух методов приводятся далее в данной лекции. Если вы планируете восстановление из разностных резервных копий после восстановления из полной резервной копии, то не забывайте создавать резервную копию текущего журнала транзакций (см. раздел "Восстановление из резервных копий журнала транзакций" далее в этой лекции), и задавать параметр NORECOVERY, когда выполняете восстановление.
Восстановление из разностной резервной копии
Для восстановления из разностной резервной копии вы должны сначала выполнить восстановление из полной резервной копии и затем – из всех разностных резервных копий, созданных вслед за последней полной резервной копией. Напомним, что разностная резервная копия используется для резервного копирования информации, которая изменилась с момента последнего полного или разностного резервного копирования. Не забудьте использовать параметр NORECOVERY (за исключением случая восстановления самого последнего файла резервной копии, для которого вы будете использовать параметр RECOVERY ). Если у вас выполняется восстановление из резервных копий журналов транзакций в дополнение к разностной резервной копии, то вы должны также выполнить резервное копирование текущего журнала и применять все измененные файлы журнала, как это описано в следующем разделе.
Восстановление из резервных копий журнала транзакций
Чтобы выполнить воспроизведение для возврата базы данных к состоянию, в котором она находилась непосредственно перед отказом системы, вы должны сначала восстановить файлы данных из последней полной резервной копии и затем восстановить изменения, внесенные в базу данных после этого резервного копирования. Чтобы восстановить эти изменения, вам нужно восстановить все резервные копии журнала транзакций, созданные до момента отказа.
Чтобы вы не потеряли ни одной из самых последних транзакций, вы должны сначала сохранить текущий журнал. Если вы забудете сохранить текущий журнал, то потеряете последние изменения, записанные в журнал транзакций, поскольку операции восстановления перезаписывают журнал транзакций.
Чтобы использовать журналы транзакций для восстановления базы данных к состоянию, в котором она находилась непосредственно перед моментом отказа, выполните следующие основные шаги, используя методы, которые вы изучили в лекции 32.
- Выполните резервное копирование текущего активного журнала транзакций, используя параметр NO_TRUNCATE.
- Восстановите последнюю полную резервную копию.
- Восстановите все разностные резервные копии для возврата базы данных к состоянию, в котором она находилась при создании последней резервной копии.
- Восстановите все резервные копии журнала транзакций, созданные после записи последней разностной резервной копии, для воспроизведения всех транзакций, выполненных с момента создания этой последней резервной копии.
- Восстановите резервную копию журнала транзакций, которую вы создали на шаге 1, чтобы вернуть базу данных к состоянию, в котором она находилась непосредственно перед отказом системы.
Восстановление базы данных в режиме воспроизведения BULK_LOGGED
Если ваша база данных работает в режиме воспроизведения BULK_LOGGED, то вы должны повторно выполнить любые минимально протоколированные в журнале операции, если это восстановление необходимо. К этим операциям относятся SELECT...INTO, BULK COPY, BCP и некоторые операции CREATE INDEX, а также текстовые операции, о которых говорилось в предыдущей лекции. Если это налагает на вас непосильную нагрузку, не задавайте для вашей базы данных режим BULK_LOGGED.
Выполнение операции восстановления базы данных
Как уже говорилось, вы можете выполнять операцию восстановления с помощью Enterprise Manager или операторов T-SQL – оба метода дают одинаковые результаты. В отличие от операций резервного копирования, в SQL Server нет мастера для операций восстановления.
Использование Enterprise Manager для операции восстановления
Для операции восстановления с помощью Enterprise Manager выполните следующие шаги.
- В окне Enterprise Manager щелкните правой кнопкой мыши на имени базы данных, которую хотите восстановить, укажите в контекстном меню пункт All Tasks (Все задачи) и затем выберите команду Restore database (Восстановить базу данных), чтобы появилось диалоговое окно Restore database (рис. 33.1).
Рис. 33.1. Вкладка General диалогового окна Restore database (Восстановление базы данных) - Вверху вкладки General (Общие) находится раскрывающийся список Restore as database (Восстановить как базу данных), где вы можете указать, в какой базе данных будет восстановлена резервная копия. На рис. 33.1 показано, что выбрана база данных Example.
От вас не требуется непосредственное восстановление какой-либо базы данных; на самом деле, когда вам действительно потребуется восстанавливать базу данных, вы будете использовать другое имя базы данных. Например, предположим, что пользователь случайно удалил таблицу. Если бы вы восстанавливали всю базу данных, то вам пришлось бы заменить все данные более ранними данными. Вместо этого вы можете восстановить эти данные в базе данных под другим именем, извлечь из нее соответствующую таблицу и воспроизвести эту таблицу в реальную базу данных.
- Далее укажите тип операции восстановления: Database (База данных), Filegroups or files (Группа файлов или файл) или From device (Из устройства). Вариант Database позволяет задать базу данных для восстановления. Вариант Filegroups or files позволяет задать для восстановления группы файлов или файлы. Параметр From device позволяет указать устройство, с которого будет выполняться восстановление, а тип восстановления будет определяться содержимым этого устройства. На рис. 33.1 выбран вариант Database.
- В секции Parameters (Параметры) вы можете задать, нужно ли показывать резервные копии других баз данных (для восстановления с резервной копии другой базы данных), указать, какая резервная копия должна восстанавливаться первой (если имеется набор из нескольких резервных копий), и задать восстановление данных к состоянию, в котором они находились на определенный момент времени (флажок Point-in-time restore). Например, если вы случайно удалили таблицу в 12:01, то вам нужно использовать флажок Point-in-time restore для восстановления базы данных к состоянию, в котором она находилась на 12:00, т.е. непосредственно перед удалением таблицы. Поскольку у вас имеется список всех резервных копий, то вы можете выбрать для использования одну из них. От вас не требуется, чтобы вы выполняли восстановление только с последней резервной копии.
В диалоговом окне Restore database вы можете также выделить набор резервного копирования и затем просмотреть его свойства, щелкнув на кнопке Properties (Свойства). Пример окна Backup Set Properties (Свойства набора резервного копирования) показан на рис. 33.2.
Рис. 33.2. Окно Backup Set Properties (Свойства набора резервного копирования) - Щелкните на кнопке OK, чтобы вернуться во вкладку General диалогового окна Restore database, и щелкните на кнопке выбора Filegroups or files, чтобы окно имело несколько иной вид (рис. 33.3). На рисунке представлены все резервные копии файлов и групп файлов базы данных Example. Для просмотра свойств резервной копии файла или группы файлов выделите эту резервную копию и щелкните на кнопке Properties.
Рис. 33.3. Вкладка General диалогового окна Restore database после щелчка на кнопке Filegroups or files - Теперь щелкните на кнопке From device (рис. 33.4). Как уже говорилось, этот вариант используется, чтобы выбрать определенное устройство резервного копирования, с которого будет выполняться восстановление. Выбрав этот вариант, вы должны вручную выбрать набор резервного копирования и затем указать, что будет восстанавливаться: полная копия (Database – complete), разностная копия (Database – differential), журнал транзакций (Transaction log) или файл или группа файлов (File or filegroup). Вы можете также указать, чтобы SQL Server прочитал информацию набора резервного копирования и сохранил ее вместе с другой информацией журнала резервного копирования в базе данных msdb. Затем вы сможете использовать информацию об этой резервной копии, если захотите выполнить восстановление базы данных.
- Щелкните на вкладке Options (Параметры) диалогового окна Restore database (рис. 33.5). Вверху этой вкладки вы увидите три флажка. Установка флажка Eject tapes after restoring each backup (Извлекать ленты после восстановления каждой резервной копии) гарантирует, что лента не останется в ленточном устройстве и не будет перезаписана. Установка флажка Prompt before restoring each backup (Запрос перед восстановлением каждой резервной копии) позволяет вам отменить свое решение о восстановлении из резервной копии. И установка флажка Force restore over existing database (Принудительное восстановление в существующую базу данных) позволяет вам перезаписать существующую базу данных восстановленной базой данных. В этой вкладке вы можете также восстановить базу данных под другим именем, что может оказаться полезным, если вы хотите сохранить исходную базу данных.
Рис. 33.4. Вкладка General диалогового окна Restore database после щелчка на кнопке выбора From device
Рис. 33.5. Вкладка Options диалогового окна Restore databaseОстальные параметры (кнопки выбора) позволяют вам указывать, в каком состоянии следует оставить базу данных по завершении восстановления.- Leave database operational. No additional transaction logs can be restored (Оставить базу данных в рабочем состоянии. Восстановление дополнительных журналов транзакций невозможно). Этот вариант не допускает никакого дополнительного восстановления с разностных резервных копий или резервных копий журнала транзакций. При этом для восстановления фактически устанавливается флаг RECOVERY. При выборе этого варианта вы не можете восстанавливать резервные копии журнала транзакций.
- Leave database nonoperational but able to restore additional transaction logs (Оставить базу данных в нерабочем состоянии, но с возможностью восстановления дополнительных журналов транзакций). При этом варианте для восстановления устанавливается флаг NORECOVERY. При установке этого флага вы можете запускать дальнейшее восстановление с разностных резервных копий или резервных копий журнала транзакций. База данных находится в нерабочем состоянии, а это означает, что пользователи не имеют доступа к этой базе данных, пока вы не закончите все восстановление.
- Leave database read-only and able to restore additional transaction logs (Оставить базу данных доступной только по чтению и с возможностью восстановления дополнительных журналов транзакций). Этот вариант также указывает установку флага NORECOVERY для восстановления, и вы можете выполнять восстановление с разностных резервных копий или резервных копий журнала транзакций. В отличие от предыдущего варианта эта кнопка выбора позволяет пользователям осуществлять доступ к базе данных по чтению с одновременным выполнением операции восстановления.
- По окончании установки этих параметров щелкните на кнопке OK, чтобы начать операцию восстановления. Вы будете получать информацию о ходе операции восстановления в окне сообщения, содержащем строку состояния (рис. 33.6). По окончании этой операции вы увидите статусное окно, информирующее вас о результате восстановления (успешное или неуспешное).
Рис. 33.6. Окно с информацией о ходе восстановления Restore Progress
Использование T-SQL для выполнения операции восстановления
Оператор T-SQL RESTORE действует аналогично оператору BACKUP (см.лекцию 32). Подобно оператору BACKUP, сначала оператор RESTORE относительно труден для использования, но некоторые DBA предпочитают включать свои административные процедуры в сценарии SQL для многократного запуска. И, подобно оператору BACKUP, оператор RESTORE предоставляет несколько больше возможностей, чем использование Enterprise Manager.
В этом разделе мы рассмотрим синтаксис оператора RESTORE и различные параметры этого оператора. Оператор RESTORE имеет две следующие формы.
- RESTORE DATABASE. Восстановление всей базы данных либо файла или группы файлов
- RESTORE LOG. Восстановление журнала транзакций
Как видите, выбор оператора зависит от типа выполняемой вами операции восстановления. Поскольку большинство параметров этих операторов совпадает, мы будет рассматривать все параметры для обоих типов восстановления (база данных и журнал) в одном списке далее.
Оператор RESTORE
Оператор RESTORE для полного восстановления базы данных имеет следующий синтаксис:
RESTORE DATABASE имя_базы_данных [ FROM устройство_резервного_копирования ] [ WITH необязательные параметры ]
Для этого оператора обязательными параметрами являются только имя базы данных и местоположение резервной копии.
Оператор восстановления файла или группы файлов имеет следующий синтаксис:
RESTORE DATABASE имя_базы_данных [FILE = имя_файла ] [FILEGROUP = имя_группы_файлов ] [ FROM устройство_резервного_копирования ] [ WITH необязательные параметры ]
Для этого оператора обязательными параметрами являются только имя базы данных, имя файла или группы файлов и местоположение резервной копии.
Оператор RESTORE для восстановления журнала транзакций имеет следующий синтаксис:
RESTORE LOG имя_базы_данных [ FROM устройство_резервного_копирования ] [ WITH необязательные параметры ]
Во всех этих операторах имя_базы_данных представляет базу данных, для которой будет выполнено восстановление. Устройство_резервного_копирования – это имя логического устройства резервного копирования или имя физического устройства. Если указано физическое устройство, то имени устройства должен предшествовать тип устройства, т.е. DISK =, TAPE = или PIPE =. Вы можете задать одно или несколько устройств. (Имена нескольких устройств разделяются запятыми.)
Необязательные параметры
В табл. 33.1 приводится список дополнительных параметров, которые можно использовать в оператореRESTORE. Как вы увидите, эти параметры обеспечивают высокий уровень гибкости при выполнении операций восстановления. (Один из параметров доступен только для восстановления журнала транзакций, что отмечено в описании.)
Параметр | Описание |
---|---|
RESTRICTED_USER | Задает ограничение доступа к вновь восстановленной базе данных, чтобы разрешать доступ только ролям db_owner, dbcreater и sysadmin |
FILE = номер_файла | Указывает используемый набор резервной копии, если носитель содержит более одного набора. Например, если задать значение 2, то будет использоваться второй набор резервной копии на данном носителе |
PASSWORD = пароль | Указывает пароль для набора сохранения |
MEDIANAME = имя_носителя | Указывает имя носителя |
MEDIAPASSWORD = пароль | Указывает пароль, который был присвоен этому набору носителей |
MOVE 'имя_логического_файла' TO 'имя_файла_ОС' | Изменяет местоположение восстанавливаемого файла, например: MOVE 'Northwind' TO 'D:\data\Northwind.mdf'. Вы можете использовать этот параметр, если выполняете восстановление на новом диске, поскольку старый диск непригоден |
NORECOVERY | RECOVERY |STANDBY = файл_отката | Параметр NORECOVERY указывает, что воспроизведение транзакций (откат или повторное исполнение) не будет выполняться после восстановления. Использование этого параметра необходимо, если вы будете продолжать восстановление с других резервных копий (разностных или журнала транзакций). Используемый по умолчанию параметр RECOVERY указывает, что будет выполнена операция воспроизведения, причем будет выполнен откат всех нефиксированных изменений. Параметр STANDBY указывает, что на случай отмены операции воспроизведения будет создан файл отката |
KEEP_REPLICATION | Указывает, что будут сохранены параметры репликации, если база данных восстанавливается на издателе |
NOUNLOAD | UNLOAD | Параметр NOUNLOAD указывает, что после операции восстановления носитель не будет выгружаться из устройства (например, лента с резервной копией не будет перемотана в начало или извлечена). Параметр UNLOAD (принятый по умолчанию) указывает, что по окончании операции восстановления носитель будет выгружен |
REPLACE | Указывает, что SQL Server будет восстанавливать файлы данных, даже если эти файлы уже существуют. Существующие файлы данных будут удалены и записаны снова. Если вы не задали параметр REPLACE, то SQL Server проверяет, существует ли уже база данных, которую вы указали. Если она существует, то операция восстановления не выполняется. Эта мера предосторожности помогает избежать непреднамеренного восстановления поверх существующей базы данных |
RESTART | Указывает, что SQL Server должен перезапускать операцию восстановления, если она была прервана |
STATS [ = процент ] | Указывает вывод сообщения после выполнения определенного процента операции восстановления. Его полезно использовать, если вы хотите следить за ходом выполнения операций |
PARTIAL | Указывает, что нужно выполнить частичное восстановление |
STOPAT = дата_время | Указывает, что базу данных следует восстановить (только восстановление журнала к состоянию, в котором она находилась на дату, транзакций) указанную значением дата_время |
STOPATMARK = 'метка' | Указывает, что операция восстановления выполняется, пока не встретится указанная метка |
STOPBEFOREMARK = 'метка' | Указывает, что операция восстановления заканчивается непосредственно перед указанной меткой |
Использование оператора RESTORE
В этой врезке мы рассмотрим несколько примеров использования оператора T-SQL RESTORE.
Следующий оператор восстанавливает файлы данных для базы данных Example:
RESTORE DATABASE Example FROM Backup_Dev_1, Backup_Dev_2 WITH NORECOVERY, STATS = 5 GO
Следующий оператор восстанавливает журнал транзакций для базы данных Example:
RESTORE LOG Example FROM Backup_Dev_3, Backup_Dev_4 WITH NORECOVERY, STATS = 5, UNLOAD GO
На экран будет выводиться процент выполнения операции, а также результаты восстановления. Будет указано количество восстановленных страниц, сколько времени длится восстановление и какова скорость (Мб/с).
Вы можете также восстановить эту базу данных с помощью следующего оператора:
RESTORE LOG Example WITH RECOVERY GO
Вы снова увидите статистику, относящуюся к операции восстановления.
Планирование воспроизведения на случай аварии
Для увеличения времени работоспособности вашей системы недостаточно использовать кластеризацию ваших серверов (см. лекцию 12) или использовать RAID (см. лекцию 5) – вы должны также планировать воспроизведение на случай аварии до того, как она наступила. Вам необходимо знать, как выполняется качественное резервное копирование и восстановление, когда они требуются, но вы должны быть также готовы к воссозданию вашей системы с самого начала, если возникнет такая необходимость. Эта подготовка означает документирование и планирование. Кроме того, возможно, вам потребуется для обеспечения достаточного уровня восстанавливаемости использовать новое средство SQL Server 2000, которое называется доставкой журнала транзакций (log shipping). Это средство позволяет применять журналы транзакций основной системы к резервным системам.
Как DBA вы должны разработать план обеспечения максимального времени работоспособности вашей системы. Этот план должен включать следующие составляющие.
- Документирование текущей конфигурации.
- Создание отказоустойчивой среды.
- Подготовка к немедленному восстановлению.
- Документирование плана воспроизведения базы данных.
Все эти шаги предусматривают планирование и/или создание документации. Часто бывает так, что план воспроизведения не документируется, и только разработчик плана способен выполнить его, что может иметь катастрофические последствия, если этот человек отсутствует.
Документирование текущей конфигурации
Если шаги создания вашей текущей конфигурации недостаточно документированы, то возможны проблемы, когда требуется перестроение вашей системы или даже когда к системе добавляется новое оборудование.
Документирование текущей конфигурации позволяет вам быстрее воссоздавать, реинсталлировать и реконфигурировать систему. Проследите за тем, чтобы была включена следующая информация.
- Конфигурация оборудования. Включите типы и количество элементов оборудования, конфигурацию матриц RAID и другие подробности конфигурации.
- Инсталлированные программные продукты. Включайте полную информацию обо всем программном обеспечении, инсталлированном на данном сервере.
Создание отказоустойчивой среды
Как вы уже видели в лекции 5, использование отказоустойчивых томов RAID-матриц значительно снижает вероятность отказа системы. Диски являются механическими компонентами и, как таковые, подвержены износу. Использование отказоустойчивого тома, возможно, избавит вас от необходимости реинсталляции операционной системы и SQL Server и восстановления системы с резервных копий, что может оказаться дорогостоящим процессом, отнимающим много времени (дорогостоящим в смысле трудозатрат, а также потерь дохода, связанных с выходом системы из строя).
При отказе одного из отказоустойчивых дисков заменяйте его по возможности быстрее. В конце концов, может отказать и второй диск, а некоторые уровни RAID могут выдержать потерю только одного диска. Подготовьте запасные компоненты и будьте готовы использовать их.
Подготовка к немедленному восстановлению
Будьте готовы к немедленному восстановлению базы данных. Резервные копии следует хранить вне рабочего места, чтобы сохранить их от катастроф, таких как пожар или затопление, но вы должны также держать под рукой дубликаты последних резервных копий, поскольку вам не всегда удастся быстро получить резервные копии, хранящиеся вне рабочего места. Использование промежуточной секции резервного копирования является распространенным способом хранения последних резервных копий по месту, а также повышения производительности резервного копирования и восстановления. Промежуточная секция резервного копирования находится в вашей сети и состоит из дисков, на которых сохраняются последние резервные копии баз данных и журналов транзакций. При необходимости восстановления вам не нужно использовать ленты, доставляя их из хранилища, находящегося вне рабочего места, – вы можете немедленно начать восстановление. Этот метод полезно использовать, если вам требуется немедленное восстановление, но он может оказаться достаточно дорогостоящим, поскольку вы должны выделять дополнительные ресурсы оборудования для хранения резервных копий. Вы должны оценить ваш бюджет и ваши потребности, чтобы определить, насколько осуществимо использование промежуточной секции резервного копирования в ваших условиях.
Документирование плана восстановления базы данных после аварии
Поскольку вас может не оказаться на месте, когда потребуется восстановление после аварии, вы должны тщательно документировать план восстановления базы данных и предоставить доступ к этой информации другим сотрудникам, чтобы они тоже могли при необходимости восстановить систему. План восстановления базы данных на случай аварии может также оказаться полезным напоминанием, если вы давно не выполняли восстановление. В любом случае документированная копия плана восстановления базы данных облегчит выполнение процесса восстановления.
Доставка журнала (Log Shipping)
Средство доставки журнала (Log Shipping) SQL Server 2000 позволяет создать резервную систему и поддерживать ее на уровне текущего состояния базы данных путем применения журналов транзакций к этой резервной системе. Резервная система поддерживается в постоянном режиме воспроизведения с непрерывным применением журналов транзакций к этой системе. Хотя эта система находится в режиме воспроизведения, запросы по чтению все же допускаются, что позволяет вам использовать резервную базу данных для задач отчетности.
В случае катастрофического отказа на основном сервере резервный сервер можно быстро и легко преобразовать в новый основной сервер. Это средство уже использовалось многими при работе с SQL Server 7, но теперь оно официально поддерживается фирмой Microsoft с добавлением средств упрощения работы. К этим средствам относятся создание и поддержка резервных систем с помощью мастера плана обслуживания базы данных Database Maintenance Plan Wizard и агента SQL Server Agent.
Заключение
На этом мы заканчиваем рассмотрение операций резервного копирования, восстановления и воспроизведения баз данных. Вы узнали, как эффективно выполнять резервное копирование и восстановление системы и как выполняется воспроизведение в SQL Server. Вы видели, как выполнять эти операции с помощью Enterprise Manager и операторов T-SQL. В этой лекции описаны операции восстановления, а также подготовка критически важного плана восстановления на случай аварии. Помните, что защита системы является одной из главных обязанностей DBA.
Лекция 34. Управление пользователями и системой безопасности
В этой лекции вы узнаете, как управлять пользователями и системой безопасности в среде Microsoft SQL Server 2000. Вместе с планированием резервного копирования и восстановления, определением состава системы и управлением дисковым пространством управление системой безопасности является одной из наиболее характерных задач для администратора баз данных (DBA). Это также одна из наиболее важных задач, которые должен выполнять DBA. Если пренебречь вопросами безопасности системы, это может привести к потере или порче данных.
Эта лекция охватывает ряд тем, относящихся к управлению пользователями и системой безопасности. Вы узнаете о том, как создавать пользовательские login-записи* (пользовательские учетные записи подключения к SQL Server) и управлять ими, а также о режимах аутентификации; кроме того, вы узнаете об идентификаторах пользователей. Пользовательская login-запись (user login) используется для аутентификации доступа к SQL Server. Она может аутентифицироваться через систему Microsoft Windows NT, Windows 2000 или SQL Server. Идентификатор пользователя (user ID) используется, чтобы присваивать пользовательские полномочия для доступа к определенным объектам в отдельных базах данных. Идентификаторы пользователей связаны с пользовательскими учетными записями и могут содержать (или не содержать) одно и то же имя, как вы увидите далее. Вы также узнаете о типах полномочий, которые могут быть присвоены в SQL Server, а также об их использовании. Кроме того, вы узнаете, как использовать роли для более простого управления пользователями. И, наконец, вы узнаете о важном средстве в SQL Server 2000, которое называется делегированием учетной записи безопасности. К концу этой лекции вы получите знания, необходимые для управления пользовательскими login-записями и системой безопасности.
Создание и администрирование пользовательских login-записей
Начнем изучение средств управления пользователями и системой безопасности с рассмотрения пользовательских login-записей. В этом разделе мы опишем сначала, почему так важны login-записи, и рассмотрим методы аутентификации, которые можно использовать для поддержки login-записей. Затем мы рассмотрим три метода создания login-записей: использование SQL Server Enterprise Manager, использование Transact-SQL (T-SQL) и использование мастера создания учетных записей Create Login Wizard. И, наконец, мы увидим, как использовать Enterprise Manager и T-SQL для создания новых пользовательских login-записей.
Зачем нужно создавать пользовательские login-записи?
Пользовательские login-записи позволяют вам защищать свои данные от преднамеренного или непреднамеренного модифицирования несанкционированными (неавторизованными) пользователями. С помощью пользовательских login-записей SQL Server может аутентифицировать отдельных авторизованных пользователей. Каждой пользовательской login-записи присваивается уникальное имя и пароль. Каждому пользователю присваивается его собственная учетная login-запись для входа в SQL Server. Без пользовательских login-записей для всех соединений с SQL Server использовался бы один и тот же идентификатор, а это означает, что вы не могли бы создавать различные уровни безопасности для тех, кто осуществляет доступ к базе данных.
Вы можете создавать различные уровни безопасности, предоставляя различным учетным login-записям различные полномочия для доступа к объектам и выполнения функций. Вы можете также шифровать определенные объекты базы данных, такие как хранимые процедуры и представления, чтобы скрывать их определения от неавторизованных пользователей. Кроме того, используя пользовательские login-записи, вы можете разрешать вставку и обновление информации в определенных таблицах базы данных только некоторым пользователям и предоставлять доступ к этим таблицам по чтению основной массе пользователей.
Чтобы увидеть, как осуществляется ограничение доступа к данным с помощью пользовательских login-записей, вернемся к примеру, впервые представленному в лекции 18, где показано использование представлений для ограничения доступа к критически важным данным. Предположим, что у нас имеется таблица Employee, содержащая информацию о сотрудниках, включая имя каждого сотрудника, номер телефона, номер офиса), должность, заработную плату, надбавку и т.д. Чтобы воспрепятствовать доступу определенных пользователей к конфиденциальным данным этой таблицы, сначала нужно создать представление, содержащее только общедоступные данные, такие как имена сотрудников, номера телефонов и номера офисов. Затем, реализуя пользовательские login-записи, вы можете ограничить доступ к исходной таблице, разрешив при этом доступ всех пользователей к представлению. Но если не использовать возможности пользовательских login-записей, то любой пользователь будет иметь доступ и к представлению, и к таблице, что лишает смысла использование этого представления.
Режимы аутентификации
Для доступа к SQL Server можно использовать два режима аутентификации: режим аутентификации Windows (Windows Authentication) и режим смешанной аутентификации (Mixed Mode Authentication). В первом случае аутентификация пользователя осуществляется операционной системой Windows. Затем SQL Server использует аутентификацию этой операционной системы, чтобы определить, какие пользовательские полномочия можно применять в каждом случае. В смешанном режиме аутентификацию пользователя осуществляют как Windows NT/2000, так и SQL Server. Для доступа к SQL Server вы должны в любом случае сначала осуществить вход по учетной записи Windows NT/2000, поэтому при выборе режима аутентификации вы должны решить, нужно ли вам использовать аутентификацию SQL Server в дополнение к аутентификации Windows. Рассмотрим каждый из этих режимов аутентификации более подробно. Ниже в этом разделе вы узнаете, как реализовать оба этих режима.
Аутентификация в Windows
Как уже говорилось, при аутентификации с помощью Windows обеспечение безопасности для SQL Server осуществляет с помощью учетных записей система Windows NT/2000. При подсоединении пользователя к Windows NT/2000 эта система проверяет подлинность пользователя по его учетной записи. SQL Server "убеждается" в том, что пользователь был проверен системой Windows NT/2000, и разрешает доступ, основываясь на этой аутентификации. Для этого используется интеграция процесса проверки login-записей SQL Server с процессом проверки учетных записей в Windows. Атрибуты безопасности на уровне сети проверяются с помощью сложного процесса шифрования, обеспечиваемого в Windows NT/2000. После аутентификации операционной системой в этом режиме дальнейшая аутентификация для доступа к SQL Server уже не требуется. Для доступа к SQL Server вы должны только указать свой пароль доступа к Windows NT/2000.
Режим аутентификации Windows считается более надежным методом, чем режим смешанной аутентификации, за счет использования дополнительных средств безопасности. Это защищенная проверка и шифрование паролей, аудит, поддержка сроков действия паролей, минимальная длина паролей и автоматическое блокирование учетных записей после определенного количества безуспешных попыток входа.
Режим смешанной аутентификации
В режиме смешанной аутентификации пользователи могут осуществлять доступ к SQL Server с помощью аутентификации в Windows или аутентификации в SQL Server. При соединении, осуществляемом в этом режиме из незащищенной системы, SQL Server аутентифицирует данные входа, проверяя, имеется ли учетная login-запись для пользователя, запрашивающего вход. SQL Server осуществляет аутентификацию по этой учетной login-записи путем сравнения имени и пароля пользователя, подсоединяющегося к SQL Server, с информацией учетной login-записи, хранящейся в базе данных. Если для этого пользователя не создана учетная login-запись или пользователь неверно указал имя или пароль, то SQL Server не разрешает доступ.
Режим аутентификации Windows недоступен, если SQL Server работает под управлением Windows 95/98, поэтому вы должны применять на этих платформах аутентификацию SQL Server (указывая режим смешанной аутентификации). Кроме того аутентификация SQL Server требуется для Web-приложений (с помощью Microsoft Internet Information Server), поскольку пользователи этих приложений, скорее всего, находятся не в том же домене, где сервер, и поэтому для них нельзя использовать систему безопасности Windows. Для других приложений также может потребоваться аутентификация SQL Server: некоторые разработчики предпочитают использовать для своих приложений систему безопасности SQL Server, поскольку это упрощает обеспечение безопасности их приложений. Если приложения используют систему безопасности SQL Server (в доверенной сети), то разработчики этих приложений не обязаны обеспечивать аутентификацию внутри самих приложений, что упрощает их работу.
Задание режима аутентификации
Чтобы задать режим аутентификации, выполните следующие шаги.
- Откройте окно Enterprise Manager. В левой панели щелкните правой кнопкой мыши на имени сервера, содержащего базу данных, для которой вы хотите задать режим аутентификации, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties. Щелкните на вкладке Security (Безопасность) (рис. 34.1).
- В этой вкладке вы можете выбрать как режим аутентификации, так и служебную учетную запись для запуска SQL Server. В секции Security выберите режим аутентификации: кнопка выбора SQL Server and Windows NT/2000 (смешанный режим) или Windows NT/2000 only (только Windows). Вы можете также задать уровень аудита входов по учетным записям. Соответствующая кнопка выбора определяет, какой тип аудита будет выполняться для входов (если вообще будет выполняться). Имеется четыре следующих уровня:
- None (Нет). Аудит входов не выполняется. Это вариант, принятый по умолчанию.
- Success (Успешный вход).Регистрируются все успешные попытки входа.
- Failure (Безуспешный вход).Регистрируются все безуспешные попытки входа.
- All (Все).Регистрируются все попытки входа.
Рис. 34.1. Вкладка Security (Безопасность) окна SQL Server PropertiesПримечание. Уровень аудита – это свойство базы данных. Определенный уровень аудита будет применяться ко всем входам. - В секции Startup service account (Служебная учетная запись для запуска SQL Server) нужно указать, какую учетную запись Windows NT следует использовать при запуске службы SQL Server. Вы можете использовать встроенную учетную запись локальной системы (System account) или указать определенную учетную запись, такую как Administrator, и пароль. Щелкните на кнопке OK для подтверждения своих установок.
Login-записи и пользователи
В нескольких следующих разделах вы узнаете, как создавать login-записи и пользователей. Но прежде чем приступить к этому процессу, вы должны четко разобраться в таких понятиях, как учетные записи и пользователи. В этом разделе дается краткое описание этих двух терминов.
Как уже говорилось, пользовательская учетная запись Windows NT/2000 может потребоваться для подсоединения к базе данных. Независимо от используемого режима аутентификации (аутентификация Windows NT/2000 или режим смешанной аутентификации) учетная запись, которую вы используете для подсоединения к SQL Server, называется login-записью SQL Server (учетной записью подключения к SQL Server). Кроме этой учетной записи, каждая база данных имеет набор пользовательских учетных псевдозаписей, присвоенных этой базе данных. Эти учетные псевдозаписи являются алиасами (альтернативными именами) для учетных login-записей SQL Server. Например, в базе данных у вас может быть пользователь с именем manager, связанный с login-записью guest, а база данных pubs может иметь пользователя с именем manager, связанного с login-записью sa. По умолчанию учетная login-запись SQL Server не имеет связанного с ней идентификатора пользователя (user ID); тем самым она не содержит никаких полномочий доступа.
Создание login-записей SQL Server
Вы можете выполнять большинство административных задач SQL Server, используя один из нескольких методов, и задача создания пользовательских login-записей не является исключением из этого правила. Как уже говорилось, вы можете создать login-запись, используя один из трех методов: с помощью Enterprise Manager, с помощью T-SQL или с помощью мастера создания login-записей Create Login Wizard. В этом разделе вы узнаете, как создавать login для SQL Server с помощью каждого их этих методов.
Использование Enterprise Manager для создания login-записей SQL Server
Чтобы создать login-запись для SQL Server с помощью Enterprise Manager, выполните следующие шаги.
- В левой панели Enterprise Manager раскройте группу серверов, раскройте сервер и затем раскройте папку Security. Щелкните правой кнопкой мыши на Logins и выберите из контекстного меню New Login (Создать login-запись), чтобы появилось окно свойств login-записи SQL Server Login Properties (рис. 34.2). В текстовом поле Name вкладки General введите имя login-записи. Если вы используете аутентификацию Windows, то это должно быть допустимое имя учетной записи Windows NT или Windows 2000. При этом в текстовом поле Domain (Домен) нужно указать домен Windows NT или Windows 2000. В секции Default (По умолчанию) укажите принятую по умолчанию базу данных и язык, который будет использоваться пользователем. В секции Authentication (Аутентификация) укажите, какая аутентификация будет использоваться: по учетной записи Windows NT или Windows 2000 (кнопка выбора Windows NT Authentication) или аутентификация в SQL Server (кнопка выбора SQL Server Authentication). Во втором случае будет использоваться смешанный режим аутентификации.
- Щелкните на вкладке Server Roles (Роли сервера) (рис. 34.3). В этой вкладке вы можете указать, какие роли на сервере сможет выбирать новая login-запись; для этого вы должны выбрать эти роли из списка ролей, доступных для данного пользователя. Щелкая на кнопке Properties, вы можете просматривать и модифицировать выбранную вами роль. (Роли описываются в разделе "Администрирование ролей баз данных" далее.)
Рис. 34.2. Вкладка General окна SQL Server Login Properties
Рис. 34.3. Вкладка Server Roles (Роли сервера) окна SQL Server Login Properties - Щелкните на вкладке Database Access (Доступ к базе данных) (рис. 34.4). В этой вкладке вы можете указывать, к каким базам данных получит полномочия доступа данный пользователь. (О полномочиях доступа см. раздел "Администрирование полномочий доступа к базам данных" далее.) Вы можете выбрать несколько баз данных и ролей, имеющих доступ к этим базам данных.) Щелкнув на кнопке Properties, вы можете просматривать свойства ролей для баз данных и управлять ими.
Рис. 34.4. Вкладка Database Access (Доступ к базе данных) окна SQL Server Login Properties - По окончании установки параметров сохраните login-запись, щелкнув на кнопке OK. Чтобы увидеть эту login-запись в списке других login-записей, щелкните на вкладке Logins в Enterprise Manager. Login-записи появятся в правой панели.
Использование T-SQL для создания login-записей
Для создания login-записи с помощью T-SQL используется хранимая процедура sp_addlogin или хранимая процедура sp_grantlogin. Хранимая процедура sp_addlogin позволяет только добавлять аутентифицированного в SQL Server пользователя к базе данных SQL Server. Хранимая процедура sp_grantlogin позволяет добавлять пользователя, аутентифицированного в системе Windows NT/2000.
Хранимая процедура sp_addlogin имеет следующий синтаксис:
sp_addlogin [ @loginame = ] 'имя_login-записи' [ , [ @passwd = ] 'пароль' ] [ , [ @defdb = ] 'база данных' ] [ , [ @deflanguage = ] 'язык' ] [ , [ @sid = ] 'sid' ] [ , [ @encryptopt = ] 'параметр_шифрования' ]
Используются следующие необязательные параметры.
- пароль. Указывает пароль login-записи для SQL Server. Значение по умолчанию – NULL.
- база данных. Указывает базу данных по умолчанию для login-записи. Значение по умолчанию – master.
- язык. Указывает язык по умолчанию для login-записи. Значение по умолчанию – текущий язык для SQL Server.
- sid. Указывает идентификатор безопасности (SID), который является уникальным идентификационным номером. Если вы не указываете какое-либо значение, то он генерируется для вас системой. Параметр sid обычно не генерируется пользователями, но администраторы используют sid в ряде ситуаций. Когда DBA выполняет задачи поиска и устранения проблем, sid может потребоваться, чтобы определить проверяемую login-запись. Параметр sid является внутренним идентификатором для login-записи.
- параметр_шифрования.Указывает, будет ли шифроваться пароль в системных таблицах. Значение по умолчанию – NULL, означающее, что пароль будет шифроваться. Значение skip_encryption (пропустить шифрование) означает, что пароль не будет шифроваться. Если указать значение skip_encryption_old, то пароль, зашифрованный в более ранней версии SQL Server, не будет шифроваться еще раз. Вам следует изменять значение по умолчанию, только если вы хотите избежать шифрования пароля в системных таблицах.
Ниже приводится простой пример добавления login-записи:
EXEC sp_addlogin 'PatB'
Не забудьте использовать ключевое слово EXEC перед именем хранимой процедуры.
Ниже приводится более сложный пример добавления login-записи:
sp_addlogin 'SharonR', 'mypassword', 'Northwind', 'us_english'
Эта команда создает пользователя с именем SharonR и паролем "mypassword." По умолчанию будет использоваться база данных Northwind, и язык по умолчанию – U.S. English. В обычном случае вы должны предоставить создание идентификатора безопасности (SID) SQL Server вместо самостоятельного создания этого идентификатора.
Хранимая процедура sp_grantlogin имеет следующий синтаксис:
sp_grantlogin 'имя_login-записи'
Ниже показан пример использования хранимой процедуры sp_grantlogin:
EXEC sp_grantlogin 'MOUNTAIN_DEW\DickB'
"DickB" – имя учетной записи Windows NT или Windows 2000, "MOUNTAIN_DEW" – имя системы.
Добавив эти login-записи, вы можете просматривать их в Enterprise Manager. Для этого щелкните на папке Logins в левой панели.
Использование мастера Create Login Wizard
Чтобы создать login-запись для SQL Server с помощью мастера Create Login Wizard, выполните следующие шаги.
- В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера. В меню Tools выберите пункт Wizards (Мастера). В появившемся диалоговом окне Select Wizard (Выбор мастера) раскройте папку Database, щелкните на Create Login Wizard (рис. 34.5) и затем щелкните на кнопке OK. Появится начальное окно мастера Create Login Wizard (рис. 34.6).
- Щелкните на кнопке Next (Далее), чтобы появилось окно Select Authentication Mode for This Login (Выбор режима аутентификации для данной login-записи) (рис. 34.7). В этом окне вы указываете, какой режим аутентификации будет использоваться, – аутентификация Windows (первая кнопка выбора) или аутентификация в SQL Server (Смешанный режим).
Рис. 34.5. Окно Select Wizard
Рис. 34.6. Начальное окно мастера Create Login Wizard - Щелкните на кнопке Next, чтобы появилось окно Authentication with Windows NT (Аутентификация с помощью Windows) или Authentication With SQL Server (Аутентификация с помощью SQL Server), – в зависимости от режима аутентификации, выбранного вами на шаге 2. На рис. 34.8 показан второй вариант. В этом окне вы задаете Login ID (идентификатор login-записи) и пароль. Если у вас выбран вариант Windows NT Authentication, то вам нужно ввести имя в домене и имя пользовательской учетной записи для аутентификации.
Рис. 34.7. Окно Select Authentication Mode for This Login (Выбор режима аутентификации для данной login-записи)
Рис. 34.8. Окно Authentication with SQL Server (Аутентификация с помощью Windows) - Щелкните на кнопке Next, чтобы появилось окно Grant Access to Security Roles (Предоставление доступа ролям безопасности) (рис. 34.9). В этом окне вы можете выбрать роли базы данных, которые будут присвоены данной login-записи.
- Щелкните на кнопке Next, чтобы появилось окно Grant Access to Databases (Предоставление доступа к базам данных) (рис. 34.10). В этом окне вы можете выбрать базы данных, к которым будет иметь доступ эта login-запись.
- Щелкните на кнопке Next, чтобы появилось окно Completing the Create Login Wizard (Завершение работы мастера) (рис. 34.11), где вы можете увидеть в текстовом поле сводку информации. Для внесения каких-либо изменений щелкните на кнопке Back (Назад) или щелкните на кнопке Finish (Готово), чтобы создать login-запись.
Рис. 34.9. Окно Grant Access to Security Roles (Предоставление доступа ролям безопасности)
Рис. 34.10. Окно Grant Access to Databases (Предоставление доступа к базам данных)
Рис. 34.11. Окно Completing the Create Login Wizard (Завершение работы мастера)
Создание пользователей SQL Server
Вы можете создавать пользователей SQL Server с помощью Enterprise Manager или T-SQL. (В SQL Server нет мастера, с помощью которого можно выполнять этот процесс.) В этом разделе вы узнаете, как использовать оба этих метода для создания пользователей SQL Server. Напомним, что пользователь SQL Server определяется для определенной базы данных, а полномочия доступа к этой базе данных присваиваются определенной пользовательской login-записи. Идентификатор пользователя (user ID) SQL Server можно рассматривать как аналог login-записи SQL Server, но они не обязательно имеют одинаковые имена.
Использование Enterprise Manager для создания пользователей
В отличие от login-записей SQL Server, которые создаются из папки Security в Enterprise Manager, пользователи SQL Server создаются из папки определенной базы данных в левой панели Enterprise Manager. Для создания пользователей с помощью Enterprise Manager выполните следующие шаги.
- Щелкните правой кнопкой мыши на базе данных, в которой должен быть создан пользователь, укажите в контекстном меню команду New (Создать) и затем выберите пункт Database User (Пользователь базы данных), чтобы появилось окно свойств Database User Properties (рис. 34.12).
Рис. 34.12. Окно Database User Properties (Свойства пользователя базы данных)В раскрывающемся списке Login name введите допустимое имя login-записи SQL Server и в текстовом поле User name введите имя нового пользователя. Затем укажите роли для базы данных, членом которых будет новый пользователь; для этого установите соответствующие флажки в списке Database role membership (Участие в ролях базы данных). Как будет показано ниже в этой лекции, присваивая полномочия этим ролям, вы можете применять эти полномочия к данному пользователю. - Щелкните на кнопке Properties, чтобы появилось окно Database Role Properties (Свойства роли базы данных) (рис. 34.13). В этом окне вы можете модифицировать выбранную вами роль базы данных. Эта задача описывается в разделе "Администрирование ролей баз данных" далее.
Рис. 34.13. Окно Database Role Properties (Свойства роли базы данных) - По окончании два раза щелкните на кнопке OK, чтобы создать пользователя базы данных.
Использование T-SQL для создания пользователей
Чтобы использовать T-SQL для создания пользователей базы данных, нужно выполнить хранимую процедуру sp_adduser. Эту хранимую процедуру можно запустить из ISQL или OSQL с использованием следующего синтаксиса:
sp_adduser [ @loginame = ] 'имя_login-записи' [ , [ @name_in_db = ] 'пользователь' ] [ , [ @grpname = ] 'группа' ]
Имя_login-записи – это имя учетной login-записи SQL Server, которое является обязательным параметром. Переменная пользователь – это имя нового пользователя, и группа – это группа или роль, к которой будет принадлежать новый пользователь. Если значение параметра пользователь не указано, то оно совпадает со значением параметра имя_login-записи.
С помощью следующей команды создается новый пользователь базы данных с именем JackR и учетной записью Windows NT или Windows 2000 FORT_WORTH\ DB_User:
sp_adduser 'FORT_WORTH\DB_User', 'JackR'
"FORT_WORTH" – имя системы или домена. "DB_User" – имя учетной записи Windows NT или Windows 2000.
Администрирование полномочий доступа к базам данных
Полномочия используются для управления доступом к объектам баз данных; они указывают, какие пользователи могут выполнять определенные операции с базой данных. Вы можете задавать полномочия на уровне сервера и на уровне базы данных. Полномочия на уровне сервера используются для того, чтобы администраторы баз данных (DBA) могли выполнять административные задачи для баз данных. Полномочия на уровне базы данных используются для того, чтобы разрешать или запрещать доступ к объектам и операторам базы данных. В этом разделе мы рассмотрим типы полномочий и способы их присваивания.
Полномочия на уровне сервера
Как уже говорилось, полномочия на уровне сервера присваиваются DBA и позволяют им выполнять задачи администрирования. Эти полномочия определяются по фиксированным ролям сервера. Пользовательским login-записям могут быть присвоены фиксированные роли на сервере, но эти роли нельзя модифицировать. (Роли на сервере описываются в разделе "Использование фиксированных ролей на сервере" далее.) К полномочиям на сервере относятся полномочия SHUTDOWN, CREATE DATABASE, BACKUP DATABASE и CHECKPOINT. Полномочия на сервере используются только для авторизации DBA, чтобы они могли выполнять административные задачи; их не нужно модифицировать или предоставлять отдельным пользователям.
Полномочия на уровне объектов базы данных
Полномочия на уровне объектов базы данных – это класс полномочий, которые предоставляются для доступа к объектам базы данных. Полномочия доступа к объектам необходимы для доступа к таблице или представлению с помощью таких операторов, как SELECT, INSERT, UPDATE и DELETE. Полномочия доступа к объектам также требуются для использования оператора EXECUTE, который применяется для запуска хранимых процедур. Для присваивания полномочий доступа к объектам используются Enterprise Manager и операторы T-SQL.
Использование Enterprise Manager для присваивания полномочий доступа к объектам
Чтобы использовать Enterprise Manager для предоставления полномочий доступа к объектам базы данных, выполните следующие шаги.
- Раскройте группу серверов, раскройте сервер, раскройте базу данных, для которой хотите присвоить полномочия, и щелкните на папке Users (Пользователи). В правой панели появится список пользователей. Щелкните правой кнопкой мыши на имени пользователя и выберите из контекстного меню пункт Properties, чтобы появилось диалоговое окно Database User Properties (рис. 34.14).
Рис. 34.14. Окно Database User Properties - Щелкните на кнопке Permissions (Полномочия), чтобы появилось окно Database User Properties (рис. 34.15).
Рис. 34.15. Вкладка Permissions окна Database User PropertiesДля вызова этой вкладки вы можете также щелкнуть правой кнопкой мыши на имени данного пользователя, указать в контекстном меню пункт All Tasks (Все задачи) и выбрать пункт Manage Permissions (Управление полномочиями). В этой вкладке вы можете управлять полномочиями, присваиваемыми данному пользователю. Чтобы присвоить этому пользователю полномочия доступа к объектам внутри базы данных, установите нужные флажки в колонках SELECT, INSERT, UPDATE, DELETE, EXEC и DRI окна списка. ("DRI" – сокращение от "declarative referential integrity" – описательная целостность на уровне ссылок.) В колонке Object (Объект) содержится список объектов. Вы можете использовать кнопки выбора вверху этого окна, чтобы включить в список все объекты (первая кнопка выбора) или только те объекты, к которым уже имеет полномочия доступа данный пользователь.
Использование T-SQL для присваивания полномочий доступа к объектам
Чтобы использовать T-SQL для присваивания какому-либо пользователю полномочий доступа к объектам, вы должны выполнить оператор GRANT. Этот оператор имеет следующий синтаксис:
GRANT { ALL | полномочия } [ колонка ON {таблица | представление} ] | [ ON таблица(колонка) ] | [ ON представление(колонка) ] | [ ON { хранимая_процедура | расширенная_процедура } ] TO учетная_запись_безопасности [ WITH GRANT OPTION ] [ AS { группа | роль } ]
Параметр учетная_запись_безопасности может быть представлен одним из следующих типов учетных записей:
- Пользователь SQL Server.
- Роль SQL Server.
- Пользователь Windows NT или Windows 2000.
- Группа Windows NT или Windows 2000.
Использование ключевого слова GRANT OPTION позволяет пользователю или пользователям, указанным в данном операторе, предоставлять указанный тип полномочий другим пользователям. Это может оказаться полезным, если вы предоставляете полномочия другим DBA. Однако GRANT OPTION следует использовать с осторожностью.
Необязательный параметр AS указывает, кто имеет право на выполнение этого оператора GRANT. Право на выполнение оператора GRANT должно быть конкретно предоставлено пользователю или роли.
Ниже приводится пример использования оператора GRANT:
GRANT SELECT, INSERT, UPDATE ON Customers TO MaryW WITH GRANT OPTION AS Accounting
Параметр AS Accounting используется потому, что роль Accounting имеет полномочия на предоставление полномочий по таблице Customers. Ключевое слово GRANT OPTION позволяет пользователю MaryW предоставлять указанные полномочия другим пользователям.
Использование T-SQL для отзыва полномочий по объектам
Для отзыва полномочий какого-либо пользователя по объектам вы можете использовать оператор T-SQL REVOKE. Оператор REVOKE имеет следующий синтаксис:
REVOKE [ GRANT OPTION FOR ] { ALL [ PRIVILEGES ] | полномочия } [ колонка ON {таблица | представление} ] | [ ON таблица(колонка) ] | [ ON представление(колонка) ] | [ ON { хранимая_процедура | расширенная_процедура } ] { TO | FROM } учетная_запись_безопасности [ CASCADE ] [ AS { группа | роль } ]
Параметр учетная_запись_безопасности может быть представлен одним из следующих типов учетных записей:
- Пользователь SQL Server.
- Роль SQL Server.
- Пользователь Windows NT или Windows 2000.
- Группа Windows NT или Windows 2000.
Ключевое слово GRANT OPTION FOR позволяет вам отзывать полномочия, которые вы предоставили с помощью ключевого слова GRANT OPTION, а также отзывать указанные здесь полномочия. Необязательный параметр AS указывает, кто имеет право на выполнение этого оператора REVOKE.
Ниже приводится пример использования оператора REVOKE:
REVOKE ALL ON Customers FROM MaryW
Оператор REVOKE ALL выполнит отзыв всех полномочий, которые имеет пользователь MaryW по таблице Customers.
Полномочия на использование операторов для баз данных
Кроме полномочий доступа к объектам баз данных, вы можете также предоставлять полномочия на использование операторов. Полномочия доступа к объектам позволяют пользователям выполнять доступ к существующим объектам базы данных, в то время как полномочия на использование операторов позволяют им создавать объекты баз данных, включая базы данных и таблицы. Можно предоставлять следующие полномочия на использование операторов.
- BACKUP DATABASE. Позволяет пользователю выполнять оператор BACKUP DATABASE.
- BACKUP LOG. Позволяет пользователю выполнять оператор BACKUP LOG.
- CREATE DATABASE. Позволяет пользователю создавать новую базу данных.
- CREATE DEFAULT. Позволяет пользователю создавать значения по умолчанию, которые можно присвоить колонкам.
- CREATE PROCEDURE. Позволяет пользователю создавать хранимые процедуры.
- CREATE RULE. Позволяет пользователю создавать правила.
- CREATE TABLE. Позволяет пользователю создавать новые таблицы.
- CREATE VIEW. Позволяет пользователю создавать новые представления.
Вы можете предоставлять полномочия на использование операторов с помощью Enterprise Manager или T-SQL.
Использование Enterprise Manager для предоставления полномочий на использование операторов
Чтобы использовать Enterprise Manager для предоставления полномочий на использование операторов для баз данных какому-либо пользователю, выполните следующие шаги.
- Раскройте группу серверов, раскройте сервер и затем раскройте папку Databases. Щелкните правой кнопкой мыши на имени базы данных, для которой хотите присвоить полномочия, и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties для этой базы данных (рис. 34.16).
Рис. 34.16. Окно Properties для базы данных - Щелкните на вкладке Permissions (рис. 34.17). Здесь вы можете присваивать полномочия на использование операторов пользователям и ролям, имеющим доступ к этой базе данных. Флажки в колонках определяют соответствующие полномочия на использование операторов и список колонки User/Role (Пользователь/Роль) содержит пользователей и роли, которые имеют доступ к этой базе данных.
Рис. 34.17. Вкладка Permissions окна Properties базы данных
Использование T-SQL для предоставления полномочий на использование операторов
Для предоставления полномочий на использование операторов какому-либо пользователю с помощью T-SQL применяется оператор GRANT. Этот оператор имеет следующий синтаксис:
GRANT { ALL | оператор } TO учетная_запись_безопасности
Пользователю могут быть предоставлены полномочия на использование операторов CREATE DATABASE, CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, BACKUP DATABASE и BACKUP LOG, описанных выше в этой лекции. Например, чтобы предоставить полномочия на использование операторов CREATE DATABASE и CREATE TABLE пользовательской учетной записи JackR, используйте следующий оператор:
GRANT CREATE DATABASE, CREATE TABLE TO 'JackR'
Как видите, добавление полномочий на использование операторов в пользовательскую учетную запись не представляет каких-либо сложностей.
Использование T-SQL для отзыва полномочий на использование операторов
Вы можете использовать оператор T-SQL REVOKE для удаления из пользовательской учетной записи полномочий на использование операторов. Этот оператор имеет следующий синтаксис:
REVOKE { ALL | оператор } FROM учетная_запись_безопасности
Например, для удаления из учетной записи пользователя JackR только полномочий на использование оператора CREATE DATABASE используйте следующий оператор:
REVOKE CREATE DATABASE FROM 'JackR'
Как видите, удаление полномочий на использование операторов из пользовательской учетной записи не представляет каких-либо сложностей.
Администрирование ролей баз данных
Вы можете упростить задачу управления многими полномочиями для многих пользователей путем использования ролей для баз данных. Роли баз данных используются, чтобы предоставлять группам пользователей одни и те же полномочия доступа к базам данных без необходимости присваивания этих полномочий по отдельности. Вместо присваивания отдельных полномочий отдельным пользователям вы можете создать роль, представляющую полномочия, используемые группой пользователей, и затем присвоить их этой группе.
Обычно роли создаются для определенных рабочих групп, классов работ или задач. При этом подходе новые пользователи могут становиться членами одной или нескольких ролей баз данных, исходя из заданий, которые они будут выполнять. Например, роли можно определять для классов работ, таких как счета кредиторов, проектирование и использование людских ресурсов. Если пользователь включается в один из этих отделов или групп, то он просто становится членом (участником) роли, созданной для этой группы. Пользователь может быть членом одной или нескольких ролей, но это не является обязательным требованием. Кроме участия в какой-либо роли базы данных, пользователю можно также присваивать отдельные полномочия.
Создание и модифицирование ролей
Для выполнения задач создания и модифицирования ролей баз данных используются те же средства, что и для выполнения большинства задач, относящихся к администрированию баз данных: Enterprise Manager или операторы T-SQL. (В SQL Server нет мастера для этих задач.) Используя любое из этих средств, вы должны выполнить следующие задачи при реализации роли.
- Создать роль базы данных.
- Предоставить полномочия этой роли.
- Назначить пользователей-участников этой роли.
Просматривая свойства роли, вы увидите как полномочия, предоставленные этой роли, так и пользователей, назначенных для этой роли.
Использование Enterprise Manager для администрирования ролей
Для создания ролей базы данных с помощью Enterprise Manager выполните следующие шаги.
- Раскройте группу серверов, раскройте сервер и затем раскройте папку Databases. Щелкните правой кнопкой мыши на имени базы данных, в которой хотите создать роль (мы будем использовать для данного примера Northwind), укажите в контекстном меню команду New и затем выберите пункт Database Role (Роль базы данных). Альтернативный способ – раскрыть базу данных, щелкнуть правой кнопкой мыши на Roles (Роли) и выбрать из контекстного меню пункт New Database Role (Создать роль базы данных). При любом способе появится окно Database Role Properties (Свойства роли базы данных) (рис. 34.18).
Рис. 34.18. Окно Database Role Properties (Свойства роли базы данных) - Задайте описательное имя для роли в текстовом поле Name – выберите имя, которое поможет вам вспомнить назначение этой роли. На рис. 34.18 показано имя Accounts Payable (Счета кредиторов), выбранное для этой роли.
- Чтобы назначить пользователей для этой роли, щелкните на кнопке Add (Добавить). Появится список пользовательских учетных записей, имеющих доступ к соответствующей базе данных (рис. 34.19). Выберите пользователей, которых хотите назначить для этой роли. Для отмены выбора просто щелкните еще раз на имени соответствующего пользователя. По окончании выбора членов роли щелкните на кнопке OK, после чего произойдет создание данной роли. Произойдет возврат в окно Enterprise Manager.
Рис. 34.19. Диалоговое окно Add Role Members (Добавление членов роли) - Чтобы задать полномочия для данной роли, откройте окно Database Role Properties. Для этого раскройте папку Roles, щелкните правой кнопкой мыши на имени роли и выберите из контекстного меню пункт Properties. Затем щелкните на кнопке Permissions, чтобы появилось окно Database Role Properties – Northwind (рис. 34.20).
Рис. 34.20. Окно Database Role Properties – Northwind
В этом окне вы можете присваивать данной роли различные полномочия доступа к объектам базы данных, содержащей эту роль. Для этого установите нужные флажки в окне списка. Объекты базы данных приводятся в списке колонки Object. Вы можете использовать кнопки выбора вверху этого окна, чтобы включить в список все объекты (первая кнопка выбора) или только те объекты, к которым уже имеет полномочия доступа данная роль. Назначив данную роль какому-либо пользователю, вы предоставляете этому пользователю все полномочия, присвоенные данной роли.
После создания роли вы можете модифицировать ее в окне Database Role Properties. Чтобы модифицировать роль, выполните шаги, используемые для добавления полномочий к роли. Вы можете добавлять или удалять пользователей и полномочия в окне Database Role Properties.
Использование T-SQL для администрирования ролей
Вы можете также создавать роли с помощью хранимой процедуры sp_addrole. Эта хранимая процедура имеет следующий синтаксис:
sp_addrole [ @rolename = ] ''роль' [ , [ @ownername = ] 'владелец' ]
Например, добавить роль с именем readonly к базе данных Northwind, используйте следующий оператор T-SQL:
USE Northwind GO sp_addrole 'readonly' , 'dbo' GO
Оператор USE Northwind указывает Northwind как текущую базу данных. Если не указать базу данных, то роль будет создана в базе данных, принятой у вас по умолчанию.
Эта хранимая процедура только создает роль. Чтобы добавить полномочия к этой роли, используйте описанный выше оператор GRANT. Для удаления полномочий из роли используйте оператор REVOKE, также описанный выше в этой лекции.
Например, чтобы добавить в роль readonly полномочия типа SELECT по таблицам Employees, Customers и Orders, используйте следующий оператор GRANT:
USE Northwind GO GRANT SELECT ON Employees TO readonly GO GRANT SELECT ON Customers TO readonly GO
Чтобы добавить пользователей к этой роли, используйте хранимую процедуру sp_addrolemember. Хранимая процедура sp_addrolemember имеет следующий синтаксис:
sp_addrolemember 'роль', 'учетная_запись_безопасности'
Следующий оператор добавляет пользователя к роли readonly:
USE Northwind GO sp_addrolemember 'readonly' , 'Guest' GO
Использование фиксированных ролей на сервере
Во время инсталляции SQL Server создается ряд заранее определенных ролей, которые применяются на уровне сервера. Эти фиксированные роли на сервере используются для предоставления полномочий DBA; они могут содержать как полномочия на уровне сервера, так и полномочия доступа к объектам и операторам. Ниже приводится список этих ролей.
- bulkadmin. Позволяет выполнять массовые вставки.
- dbcreator. Позволяет создавать и изменять базы данных.
- diskadmin. Позволяет управлять файлами на дисках.
- processadmin. Позволяет управлять процессами SQL Server.
- securityadmin. Позволяет управлять login-записями и создавать полномочия доступа к базам данных.
- serveradmin. Позволяет задавать любые параметры сервера и закрывать базу данных.
- setupadmin.Позволяет управлять связанными серверами и процедурами запуска.
- sysadmin.Позволяет выполнять любые операции на сервере.
Присваивая пользовательские учетные записи фиксированным ролям на сервере, вы позволяете пользователям осуществлять административные задачи, полномочия на выполнение которых имеют эти роли. В зависимости от ваших потребностей это может оказаться предпочтительнее использования всеми DBA одной и той же административной учетной записи. Подобно ролям для баз данных фиксированные роли на уровне сервера намного проще поддерживать, чем отдельные полномочия, но фиксированные роли нельзя модифицировать. Вы можете добавить пользователя к фиксированной роли, выполнив следующие шаги.
- В окне Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Security и затем щелкните на Server Roles (Роли на сервере). Щелкните правой кнопкой мыши на фиксированной роли, к которой хотите добавить пользователя, и выберите из контекстного меню пункт Properties. Появится окно Server Role Properties (Свойства роли на сервере) (рис. 34.21).
Рис. 34.21. Окно Server Role Properties (Свойства роли на сервере) - Чтобы добавить к этой роли пользовательскую учетную запись, сначала щелкните на кнопке Add. Появится диалоговое окно Add Members (рис. 34.22), где вы можете выбрать новых участников роли.
Рис. 34.22. Диалоговое окно Add Members - Выбрав пользователей, которых хотите добавить к данной фиксированной роли, щелкните на кнопке OK. Произойдет возврат в окно Server Role Properties. Щелкните на кнопке OK, чтобы добавить пользователя к данной роли.
Делегирование учетной записи безопасности
SQL Server 2000 использует средства безопасности Windows 2000 с помощью модели безопасности Kerberos. (Информацию о модели безопасности Kerberos см. в лекции 2.) SQL Server 2000 использует протокол Kerberos для поддержки взаимной аутентификации между клиентом и сервером. Это позволяет передавать "верительные данные" клиента между компьютерами, чтобы этот клиент мог подсоединяться к нескольким серверам; при доступе к новому серверу этот сервер может продолжать работу с помощью верительных данных клиента. Это совместное использование верительных данных называется делегированием учетной записи безопасности.
Рассмотрим пример делегирования учетной записи безопасности. Предположим, что клиент подсоединяется к серверу ServerA как NTDOMAIN\AlexR, а ServerA подсоединяется к серверу ServerB. Тем самым ServerB "знает", что подсоединение осуществляется с помощью учетной записи системы безопасности NTDOMAIN\AlexR. Это позволяет клиенту обойтись без регистрации на сервере ServerB.
Если вы хотите использовать делегирование учетной записи безопасности, то все серверы, к которым вы подсоединяетесь, должны работать под управлением Windows 2000 с активизированной поддержкой Kerberos, а вы должны использовать службы Active Directory. Для делегирования работы в службах Active Directory должны быть установлены следующие параметры.
- Account is sensitive and cannot be delegated (Учетная запись является критически важной и не может быть делегирована). Этот параметр нельзя устанавливать, если пользователь запрашивает делегирование.
- Account is trusted for delegation (Учетная запись является доверяемой для делегирования). Этот параметр должен быть установлен для служебной учетной записи SQL Server 2000.
- Computer is trusted for delegation (Компьютер является доверяемым для делегирования).Этот параметр должен быть установлен для сервера, на котором выполняется один из экземпляров SQL Server 2000.
Конфигурирование SQL Server
Прежде чем использовать делегирование учетных записей безопасности, вы должны сконфигурировать SQL Server, чтобы он допускал делегирование. Делегирование вызывает взаимную аутентификацию. Чтобы можно было использовать делегирование учетных записей безопасности, SQL Server 2000 должен иметь SPN-имя (Service Principal Name), назначенное администратором учетных записей домена Windows 2000. SPN-имя должно быть присвоено служебной учетной записи сервера SQL Server на данном компьютере. SPN-имя необходимо для проверки того, что SQL Server верифицирован на определенном сервере и по определенному адресу порта (socket) администратором учетных записей домена Windows 2000. Администратор вашего домена может задать SPN-имя для SQL Server с помощью утилиты Setspn, входящей в комплект Windows 2000 Resource Kit. Чтобы создать SPN-имя для SQL Server, запустите следующий оператор:
setspn -A MSSQLSvc/Host:port serviceaccount
Вот пример использования этого оператора:
setspn -A MSSQLSvc/MyServer.MyDomain.MyCompany.com sqlaccount
Чтобы использовать делегирование учетных записей безопасности, вы должны также использовать TCP/IP. Вы не можете использовать именованные каналы (named pipes), поскольку SPN-имя указывает определенный порт (socket) TCP/IP. Если вы используете несколько портов, то должны иметь SPN для каждого порта.
Вы можете активизировать делегирование с помощью учетной записи LocalSystem. SQL Server выполнит саморегистрацию при запуске службы и автоматически зарегистрирует SPN-имя. Этот вариант проще, чем активизация с помощью пользовательской учетной записи в домене. Однако при закрытии SQL Server SPN-имена будут лишены регистрации для учетной записи LocalSystem. Чтобы активизировать делегирование под учетной записью LocalSystem, выполните следующий оператор в утилите Setspn:
setspn -A MSSQLSvc/Host:port serviceaccount
Заключение
В этой лекции вы узнали об управлении пользователями и системой безопасности SQL Server. Вы узнали, как используются учетные записи подключения (login-записи) и учетные записи пользователей базы данных, чтобы осуществлять доступ к базе данных, как создавать login-записи и пользователей баз данных, а также управлять ими. Вы также узнали, как упростить управление пользователями с помощью ролей базы данных, полномочия которых можно присваивать группе пользователей и модифицировать их из одной точки. Вы также узнали о специальной группе ролей, которые называются фиксированными ролями на сервере и используются для предоставления административных полномочий пользователям и DBA. И, наконец, мы рассмотрели улучшенное средство безопасности, включенное в SQL Server 2000, которое позволяет передавать защищенным образом учетные записи безопасности между серверами в среде Windows 2000. В лекции 35 вы узнаете о хранимых процедурах SQL Server и оптимизации ваших запросов.
Лекция 35. Использование SQL Query Аnalyzer и SQL Profiler
В этой лекции мы продолжим изучение хранимых процедур, которое начали в лекции 21. Вы узнаете, как анализировать хранимые процедуры и другие операторы T-SQL с помощью анализатора запросов Microsoft SQL Server Query Analyzer и профайлера SQL Server Profiler. Из этого анализа вы сможете определять, насколько эффективны операторы T-SQL. Эффективный запрос SQL Server использует подходящую последовательность операций и подходящие индексы для снижения количества обрабатываемых строк и минимизации количества операций ввода-вывода.
Используя Query Analyzer, вы можете видеть план исполнения, выбранный для оператора T-SQL оптимизатором запросов SQL Server. Оптимизатор запросов – это внутренний модуль, который ищет наилучший план исполнения для каждого оператора T-SQL. Оптимизатор запросов анализирует каждый оператор T-SQL, просматривает ряд возможных планов исполнения и выполняет оценку "стоимости" каждого плана с точки зрения требуемых ресурсов и времени обработки. Выбирается план с наименьшей стоимостью. Стоимость каждого плана определяется на основе имеющейся статистики, которая собрана системой и может оказаться устаревшей. Поскольку вы можете знать больше о вашей базе данных и ваших данных, чем оптимизатор запросов, то, возможно, вам удастся создать план, который окажется лучше, чем у оптимизатора запросов. Используя информацию, которую выдает Query Analyzer, вы можете определить, будет ли эффективным план оптимизатора запросов для определенного оператора, и если нет, то вы можете попытаться оптимизировать данный оператор, модифицируя его или используя подсказку SQL. В этой лекции вы узнаете, как оптимизировать операторы T-SQL, что будет дополнением к изучению использования Query Analyzer.
Используя Profiler, вы можете анализировать операции внутри вашей системы SQL Server, чтобы определять, какие операторы SQL и хранимые процедуры используют излишние системные ресурсы. Обладая этой информацией, вы можете сосредоточить свои усилия по настройке в первую очередь на этих операторах и хранимых процедурах. Кроме описания того, как использовать Profiler, в этой лекции также показано, как наиболее эффективно использовать информацию, получаемую с помощью Profiler.
Использование SQL Query Аnalyzer
Утилита Query Analyzer поставляется вместе с Microsoft SQL Server 2000 взамен Interactive SQL for Windows (ISQL/W) как графический пользовательский интерфейс (GUI) SQL, но вы, возможно, обратили внимание, что утилита Query Analyzer представлена как isqlw.exe в диспетчере задач. Вы можете использовать Query Analyzer для обработки операторов T-SQL и просмотра результатов этих операторов. Query Analyzer можно также использовать как средство отладки для оценки плана исполнения, который генерируется оптимизатором запросов для вашего оператора T-SQL.
Выполнение операторов T-SQL
Выполнение операторов T-SQL и вывод результатов этих операторов являются основными возможностями Query Analyzer. Чтобы использовать Query Analyzer для выполнения оператора T-SQL, выполните следующие шаги.
- Щелкните на кнопке Start (Пуск), укажите Programs, укажите Microsoft SQL Server и затем выберите Query Analyzer. Появится диалоговое окно Connect to SQL Server (Подсоединение к SQL Server) (рис. 35.1). Это диалоговое окно используется для соединения с системой SQL Server.
Рис. 35.1. Диалоговое окно Connect to SQL Server (Подсоединение к SQL Server) - Введите имя сервера в комбинированном поле с раскрывающимся списком. Это может быть имя локального сервера или удаленного сервера. На рис. 35.1 в этом поле введена точка (.). Ввод точки указывает, что вы хотите подсоединиться к локальному серверу. Установка флажка непосредственно под полем SQL Server указывает, что вы хотите запустить SQL Server, если он еще не запущен. В секции Connect using (Подсоединяться с использованием) выберите метод аутентификации, который хотите использовать для подсоединения к SQL Server. Если выбрать вариант Windows NT authentication (Аутентификация Windows), то вам не нужно указывать имя пользователя или пароль, поскольку для аутентификации доступа к SQL Server будет использоваться учетная запись Microsoft Windows 2000. Если выбрать вариант SQL Server authentication (Аутентификация в SQL Server), то для доступа к SQL Server нужно указать имя пользователя SQL Server (Login name) и пароль (Password).
- Щелкните на кнопке OK для подсоединения к указанному серверу SQL и для запуска Query Analyzer. При первоначальном появлении окна Query Analyzer видны только панель Query и панели навигации, но этот вид изменяется, как только вы начинаете запускать операторы T-SQL. Разверните панель Query для заполнения всей правой стороны окна Query Analyzer (рис. 35.2). В раскрывающемся списке панели инструментов выберите базу данных, в которой хотите запускать запросы. На рис. 35.2 выбрана база данных master. Для нашего примера щелкните на направленной вниз стрелке и выберите Northwind.
- После выбора базы данных введите в правой панели оператор T-SQL – в данном случае – SELECT * FROM Customers. Теперь у вас появляется несколько возможностей. Вы можете проверить синтаксис данного оператора T-SQL, щелкнув на кнопке Parse Query (Синтаксическая проверка запроса) в панели инструментов (синяя пометка ["галочка"]), или можете запустить оператор, щелкнув на кнопке Execute Query (Выполнить запрос) (зеленый треугольник, указывающий вправо). Вы можете остановить выполнение запроса, щелкнув на кнопке Cancel Executing Query (Отменить выполнение запроса) (квадрат). На рис. 35.3 показан выполненный запрос по таблице Customers базы данных Northwind.
После запуска оператора T-SQL утилита Query Analyzer создает панель с возможностью вертикальной и горизонтальной прокрутки для просмотра результатов, как это показано на рис. 35.3. Query Analyzer можно также использовать как средство, помогающее вам в настройке ваших операторов T-SQL, как мы увидим в разделе "Оптимизация операторов T-SQL" ниже в этой лекции.
увеличить изображение
Рис. 35.2. Окно Query Analyzer
увеличить изображение
Рис. 35.3. Выполненный запрос в панели Query Analyzer
Просмотр планов исполнения и модифицирование операторов T-SQL
Как уже говорилось, вы можете также использовать Query Analyzer для просмотра плана исполнения, выбранного оптимизатором запросов для оператора T-SQL. Это средство позволяет определить, насколько эффективен ваш оператор T-SQL и какие пути выбраны для исполнения и доступа к данным. Вы можете затем внести изменения в этот оператор T-SQL и схему базы данных и затем определить, как это влияет на производительность. Чтобы использовать Query Analyzer для просмотра оценочного плана исполнения, выполните следующие шаги.
- В окне Query Analyzer введите оператор T-SQL, чтобы выполнить его оценку с помощью Query Analyzer, как это описано выше, и затем щелкните на кнопке Display Estimated Execution Plan (Отобразить оценочный план исполнения) (кнопка справа от раскрывающегося списка выбора базы данных) или нажмите клавиши Ctrl+L. Появится панель Estimated Execution Plan (рис. 35.4). В этой панели запрос представлен в графическом виде; показана также "стоимость" каждой операции. Здесь также показан метод доступа к данным. В панели (рис. 35.4), появляется имя индекса Customers.PK_Customers, а это означает, что для доступа к данным используется кластеризованный индекс Customers.PK_Customers.
увеличить изображение
Рис. 35.4. Панель Estimated Execution Plan - Панель Estimated Execution Plan предоставляет доступ к дополнительным данным об операциях, показанных в этой панели. Чтобы увидеть эти дополнительные данные для любой операции, задержите указатель мыши на значке этой операции. Появится всплывающее окно, содержащее дополнительные данные (рис. 35.5).
увеличить изображение
Рис. 35.5. Просмотр дополнительных данных об операцииЭто всплывающее окно содержит следующую информацию:- Physical operation/Logical operation (Физическая операция/Логическая операция). Операции, выполняемые данным запросом, такие как индексное сканирование, связывание (join), агрегирование и т.д. Если физический оператор представлен красным цветом, это означает, что оптимизатор запросов выдал предупреждение и вы должны внести исправления в ваш оператор T-SQL.
- Estimated row count (Оценка количества строк). Количество строк, которое (по оценке Query Optimizer) будет выбрано данной операцией.
- Estimated Row Size (Оценка размера строк). Оценка размера считываемых строк в байтах.
- Estimated I/O cost/Estimated CPU cost (Оценка стоимости ввода-вывода/Оценка стоимости ЦП). Оценка ресурсов ввода-вывода и времени процессора, которые будут использоваться этой операцией. Меньшее значение соответствует большей эффективности оператора T-SQL
- Estimated number of executes (Оценка количества выполнений).Приблизительное количество выполнений данной операции во время выполнения данного оператора T-SQL.
- Estimated cost (Оценка стоимости). Стоимость операции по оценке оптимизатора запросов. Эта стоимость показана в процентах от полной стоимости данного оператора T-SQL.
- Estimated subtree Cost (Оценка стоимости поддеревьев). Оценка стоимости выполнения предыдущих частей и данной части оператора T-SQL. Если имеется несколько поддеревьев, то это средство позволяет просматривать стоимость выполнения каждого поддерева.
- Argument (Параметры). Параметры, используемые данным оператором T-SQL.
Далее мы рассмотрим некоторые более сложные примеры использования Query Analyzer. Эти примеры также показывают влияние неэффективных операторов T-SQL на снижение производительности за счет увеличения времени отклика и использования системных ресурсов, которые могли бы использоваться другими процессами. Сначала мы рассмотрим пример использования Query Analyzer для просмотра и модифицирования плана исполнения оператора T-SQL. Как уже говорилось, за счет модифицирования ваших операторов T-SQL вам, возможно, удастся получить для них более высокую производительность. Во многих случаях вы можете создать более эффективный и при этом функционально эквивалентный оператор T-SQL. Затем мы будем рассматривать все более сложные оценочные планы исполнения для нескольких типов операторов T-SQL.
В примерах остальной части этого раздела используется таблица Orders базы данных Northwind. Посмотрим, как организована эта таблица. Когда мы будем рассматривать примеры, эта информация поможет нам определить, насколько приемлемым является план исполнения, выбранный оптимизатором запросов. Таблица Orders имеет кластеризованный индекс с именем PK_Orders по колонке OrderID и восемь других индексов, что показано в диалоговом окне Manage Indexes (Управление индексами) (рис. 35.6).
Рис. 35.6. Диалоговое окно Manage Indexes (Управление индексами)
Для доступа к этому окну с помощью Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Databases, раскройте базу данных Northwind и щелкните на папке Tables. Щелкните правой кнопкой мыши на таблице Orders в правой панели, укажите в контекстном меню All Tasks (Все задачи) и затем выберите Manage Indexes. Или просто выберите пункт Manage Indexes из меню Tools окна Query Analyzer и затем выберите из раскрывающегося меню таблицу Orders.
Просмотр плана для оператора SELECT и модифицирование этого оператора
В этом разделе мы рассмотрим запрос информации по заказам (orders), помещенным сотрудником (employee), идентификационный номер которого (employee ID) равен 4. Вот этот запрос:
SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders WHERE EmployeeID = 4
В данной организации каждый сотрудник обрабатывает небольшую часть от всех заказов, поэтому вы, вероятно, предполагаете, что SQL Server будет использовать при обработке этого запроса индекс EmployeeID. Вместо этого Query Analyzer информирует вас, что SQL Server будет использовать доступ с помощью кластеризованного индекса PK_Orders (рис. 35.7).
увеличить изображение
Рис. 35.7. Панель Estimated Execution Plan, где показано, что будет использоваться кластеризованный индекс PK_Orders
Чтобы оптимизатор запросов использовал вместо этого индекс EmployeeID, вы можете использовать подсказку в операторе SELECT, как показано в следующем операторе. (См. раздел "Использование подсказок" далее.)
SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders WITH (INDEX(EmployeeID)) WHERE EmployeeID = 5
Включая в команду эту дополнительную информацию, вы указываете оптимизатору запросов, что нужно использовать нужный вам план исполнения, а не тот, что был выбран для вас оптимизатором. На рис. 35.8 показана панель Estimated Execution Plan с измененным планом. Как видно из представленного в панели метода доступа, индекс EmployeeID будет использоваться в качестве входного параметра для процесса поиска по закладкам (bookmark lookup), который выполнит затем выборку данных из базы данных. (Процесс поиска по закладкам ищет внутренний идентификатор для строки данных.)
увеличить изображение
Рис. 35.8. Панель Estimated Execution Plan с измененным планом
Оптимизатор запросов является эффективным инструментом, который постоянно обновляет статистику, чтобы выбрать наилучший план исполнения. Но поскольку вы хорошо представляете себе вашу организацию и ваши данные, то в некоторых случаях вы осведомлены лучше, чем оптимизатор запросов, чтобы выбрать лучший план исполнения.
Просмотр плана для операции связывания
Выполнение какой-либо операции связывания (join) включает в себя намного больше процессов, чем будет показано в панели Estimated Execution Plan ниже в этой лекции. Операция связывания выполняет доступ к нескольким таблицам, сопровождаемый связыванием (объединением) считываемых данных. (Операции связывания рассматриваются в лекции 14.) Вот пример оператора с операцией связывания:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, LastName, OrderDate FROM Orders JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
Сюда включен оператор SQL-92 JOIN. Использование этого оператора является рекомендованным способом связывания в SQL Server 2000. В следующем операторе используется более традиционный синтаксис связывания, который по-прежнему поддерживается в SQL Server:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, LastName, OrderDate FROM Orders, Employees WHERE Orders.EmployeeID = Employees.EmployeeID
Любой из этих операторов T-SQL связывает таблицы Orders и Employees по колонке EmployeeID. Результирующий оценочный план исполнения показан на рис. 35.9.
увеличить изображение
Рис. 35.9. Операция связывания, показанная в панели Estimated Execution Plan
В этой панели видно, какое из двух поддеревьев имеет более высокую стоимость. Вы также видите тип планируемой операции связывания. SQL Server поддерживает несколько операций связывания, включая хеш-связывание, связывание вложенных цепочек и связывание слиянием. При использовании комплексной операции связывания план исполнения может оказаться очень сложным. (Query Analyzer регулирует размер панели Estimated Execution Plan, чтобы вместить нужно количество ветвей.) Поскольку нашей целью является сокращение времени ЦП и количества операций ввода-вывода, вам нужно попытаться определить, можно ли выбрать лучший план исполнения. В некоторых случаях вы можете применить подсказку, указывающую использование определенного индекса, сокращая тем самым время использования ЦП и интенсивность операций ввода-вывода. Вы можете также использовать подсказки в операциях связывания таблиц. Для запроса (рис. 35.9), возможно, выбран наилучший план исполнения, поскольку в предложении FROM связывание является единственной операцией.
Просмотр плана для операции агрегирования
Показанный здесь оператор T-SQL выполняет не только операцию связывания, но также операцию агрегирования:
SET QUOTED_ IDENTIFIER ON GO SELECT CustomerID, SUM("Order Details".UnitPrice) FROM Orders JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID GROUP BY CustomerID
Панель Estimated Execution Plan для этой комплексной операции показана на рис. 35.10.
увеличить изображение
Рис. 35.10. Операция агрегирования, представленная в панели Estimated Execution Plan
Просмотр плана для хранимой процедуры
Для просмотра плана исполнения хранимой процедуры нужно просто вызвать эту хранимую процедуру из окна Query Analyzer. В панели Query Analyzer будет выведен оценочный план вызванной вами хранимой процедуры. На рис. 35.11 показан план для процедуры sp_who. (Отметим, что план исполнения этой широко используемой хранимой процедуры очень сложен.) Вы можете просматривать план исполнения хранимой процедуры, не зная, какие операторы T-SQL образуют эту процедуру.
увеличить изображение
Рис. 35.11. План исполнения хранимой процедуры, показанный в панели Estimated Execution Plan
Использование браузера объектов
Браузер объектов (Object Browser) – это расширение в Query Analyzer, включенное в SQL Server 2000. Запустив Query Analyzer, вы увидите браузер объектов в левой части этого окна. Браузер объектов разбит на две секции: секция объектов баз данных и секция общих объектов (Common objects). В секции объектов баз данных вы можете выполнять перемещение по объектам, таким как таблицы и представления. В секции общих объектов обеспечивается удобный доступ к системным объектам и функциям. Вам нужно выполнить просмотр в браузере объектов, чтобы выяснить, какую информацию он содержит, и затем определить, что вы можете использовать.
Объекты базы данных
Верхняя секция браузера объектов содержит объекты баз данных. Вы сразу видите базы данных по умолчанию и любые созданные вами базы данных под обозначением системы SQL Server, которой они принадлежат. Чтобы увидеть информацию, которая содержится в браузере объектов, нужно просто раскрыть объекты. Раскроем базу данных Northwind и затем раскроем папку User Tables (Пользовательские таблицы). Вы увидите таблицы базы данных Northwind (рис. 35.12).
увеличить изображение
Рис. 35.12. Просмотр таблиц в браузере объектов
Затем вы можете раскрывать определенные пользователем таблицы и затем раскрывать папки, содержащие информацию о колонках, индексах, ограничениях, зависимостях и триггерах. На рис. 35.13 раскрыта таблица Orders. Вы можете также раскрывать соответствующие папки для просмотра информации о системных таблицах, представлениях, хранимых процедурах, функциях и определенных пользователем типах данных.
Доступ к информации базы данных внутри Query Analyzer – очень удобное средство, поскольку это позволяет создавать операторы SQL и хранимые процедуры без необходимости поиска информации об объектах вне Query Analyzer. Вы можете не только просматривать информацию в браузере объектов, но также редактировать объекты, перемещать объекты методом "drag and drop" и даже формировать сценарии создания и модифицирования объектов. Это еще более расширяет функциональные возможности Query Analyzer.
Секция Common Objects
Нижняя часть браузера объектов – это папка с именем Common Objects (Общие объекты) (рис. 35.14).
увеличить изображение
Рис. 35.13. Раскрытие таблицы в браузере объектов
увеличить изображение
Рис. 35.14. Раскрытие папки в секции Common objects (Общие объекты) браузера объектов
Внутри этой папки находятся папки, содержащие информацию о таких объектах, как функции конфигурирования, функции курсоров, функции даты и времени, а также математические функции. Тем самым вы получаете простой доступ к функциям без необходимости поиска их синтаксиса.
Если раскрыть какую-либо папку в этой секции, то вы увидите соответствующие функции этой папки (функции конфигурирования на рис. 35.14). Вы можете перетаскивать эти функции в панель запросов или, поместив курсор мыши поверх функции, вы можете видеть ее краткое описание. Это удобно для обработки эпизодических запросов.
Кроме доступа к глобальным переменным, вы имеете доступ к вызовам других полезных функций, таких как математические и строковые функции. Продолжая раскрывать объекты, вы можете получать, например, информацию о параметрах этих функций. На рис. 35.15 показана папка Parameters (Параметры) раскрытой математической функции.
увеличить изображение
Рис. 35.15. Просмотр параметров в браузере объектов
Использование SQL Profiler
В дополнение к использованию Query Analyzer для поиска неэффективных операторов T-SQL вы можете также использовать утилиту SQL Server Profiler. Profiler позволяет наблюдать за всеми операторами T-SQL, которые выполняются в системе, с графическим отображением информации об этих операторах. Profiler также предоставляет возможности сортировки и фильтрации, которые можно использовать для выявления операторов T-SQL, использующих основную часть ресурсов ЦП и ввода-вывода. Обладая этой информацией, вы можете определять, каким операторам T-SQL уделить основное внимание для их настройки. Операторы T-SQL, которые вызываются из приложения, можно просматривать в Profiler; при этом вам не требуется доступ исходному коду самого приложения.
Утилита Profiler в SQL Server 2000 действует аналогично утилите Profiler в SQL Server 7, но она содержит некоторые улучшения. Одним из полезных дополнений является шаблон трассировки (trace template), который можно использовать для создания файлов трассировки. (Трассировку нужно по-прежнему создавать до того, как вы сможете использовать ее для мониторинга операций SQL Server.) В SQL Server трассировки должны были создаваться вручную.
Для вызова утилиты Profiler и запуска трассировки выполните следующие шаги.
- Щелкните на кнопке Start, укажите пункт Programs, укажите Microsoft SQL Server и затем выберите Profiler. При первоначальном открытии окна Profiler оно будет пустым. Не будет открыто ни одной панели, и не будет выполняться никакого профилирования в SQL Server.
- Чтобы начать создание профилирование, вы должны выбрать для выполнения существующий шаблон трассировки или создать новый шаблон трассировки для выполнения. (Процесс запуска описан на шаге 4.) SQL Server 2000 Profiler предоставляет для выбора целый ряд шаблонов трассировки. Использование этих шаблонов трассировки может сэкономить вам много времен, поскольку вам не нужно создавать трассировку с самого начала. Чтобы увидеть список шаблонов трассировки, щелкните на меню File (Файл), укажите команду Open (Открыть) и выберите пункт Trace Templates (Шаблоны трассировки), чтобы появилось диалоговое окно Open (рис. 35.16).
Рис. 35.16. Диалоговое окно Open со списком шаблонов трассировкиИмеются следующие шаблоны трассировки, поставляемые вместе с SQL Server.- SQLServerProfilerSP_Counts.tdf. Подсчитывает количество запущенных хранимых процедур. Результаты группируются по именам хранимых процедур и содержат количество запусков соответствующей процедуры.
- SQLServerProfilerStandard.tdf. Собирает общую информацию о соединениях, выполненных хранимых процедурах и пакетах SQL в порядке их выполнения.
- SQLServerProfilerTSQL.tdf. Собирает информацию обо всех операторах T-SQL в порядке их поступления в SQL Server от пользователей. Эта трассировка содержит просто операторы T-SQL и моменты времени их запуска.
- SQLServerProfilerTSQL_Duration.tdf. Выводит запущенные операторы T-SQL, а также время (в миллисекундах), которое потребовалось для выполнения этих операторов.
- SQLServerProfilerTSQL_Grouped.tdf. Собирает данные, аналогичные тому, что собирает SQLServerProfilerTSQL, но группирует операторы по пользователям, запустившим эти операторы.
- SQLServerProfilerTSQL_Replay.tdf. Предоставляет подробную информацию о запускавшихся операторах T-SQL. Эта трассировка содержит данные, которые можно использовать для воспроизведения операторов T-SQL в Query Analyzer.
- SQLServerProfilerTSQL_SPs.tdf . Выводит указанные хранимые процедуры, а также команды T-SQL внутри этих процедур. Результаты выводятся в порядке выполнения.
- SQLServerProfilerTuning.tdf. Собирает данные о хранимой процедуре и выполнении пакета SQL.
- Для запуска трассировки щелкните на File, укажите команду New (Создать) и затем выберите пункт Trace (Трассировка). Появится диалоговое окно Connect to SQL Server (рис. 35.17). В этом диалоговом окне выберите систему SQL Server для трассировки и затем щелкните на кнопке OK.
Рис. 35.17. Диалоговое окно Connect to SQL Server - Появится окно Trace Properties (Свойства трассировки) (рис. 35.18). Во вкладке General (Общие) вы можете ввести имя трассировки (поле Trace name) и выбрать шаблон трассировки (trace template), чтобы использовать его как отправную точку. Для данного примера выберите шаблон SQLServerProfilerTSQLDuration. В нижней части вкладки вы можете указать, где хотите сохранять трассировку – в файле (Save in file) и/или в таблице SQL Server (Save in table). Если не установлен ни один из этих флажков, то результаты трассировки будут выводиться только на экран. Кроме того, вы можете задать время окончания трассировки (флажок и поле Enable trace stop time). Это может оказаться очень полезным для долговременных трассировок.
Рис. 35.18. Вкладка General окна Trace Properties (Свойства трассировки) - Далее щелкните на вкладке Events (События) (рис. 35.19).
Рис. 35.19. Вкладка Events (События) окна Trace PropertiesВ этой вкладке вы можете выбрать одно или несколько событий, которые будут отслеживаться в данной трассировке. Можно отслеживать целый ряд классов (категорий) событий и конкретных событий. В окне списка Available event classes (Имеющиеся классы событий) содержатся такие классы событий, как Cursors (Курсоры), Errors and Warnings (Ошибки и предупреждения), Locks (Блокировки), Objects (Объекты), Scans (Сканирования), SQL Operators (Операторы SQL), Stored Procedures (Хранимые процедуры), Transactions (Транзакции) и TSQL. - После выбора событий, трассировку которых вы хотите выполнять, щелкните на вкладке Data Columns (Колонки данных) (рис. 35.20). В этой вкладке укажите, сбор каких данных будет выполняться во время данной трассировки. В эти данные можно включать время окончания, идентификатор объекта и т.д.
Рис. 35.20. Вкладка Data Columns (Колонки данных) окна Trace Properties - Щелкните на вкладке Filters (Фильтры) (рис. 35.21). В этой вкладке вы можете указывать, нужно ли, чтобы утилита Profiler включала или исключала определенные события. Например, вам следует исключить трассировку самой утилиты Profiler. (Это установка по умолчанию.) Исключая процессы SQL Server, вы делаете окно Profiler менее насыщенным и более удобным для чтения.
- По окончании установки параметров щелкните на кнопке Run для запуска данной трассировки. Если вы внесли какие-либо изменения в шаблон трассировки, то рекомендуется сохранить этот модифицированный шаблон трассировки под другим именем с помощью команды Save As меню File. После запуска трассировки в окне Profiler будут выводиться события по мере их возникновения. В соответствии с шаблоном трассировки, выбранным в этом примере, события будут сортироваться по длительности (в миллисекундах). На рис. 35.22 показано окно Profiler с результатами трассировки.
Рис. 35.21. Вкладка Filters (Фильтры) окна Trace Properties
увеличить изображение
Рис. 35.22. Выполняемая трассировка
Оптимизация операторов T-SQL
В предыдущих разделах вы изучали, как следить за выполнением операторов T-SQL с помощью утилиты Profiler и как определять план исполнения и метод доступа к данным с помощью Query Analyzer. Мы также рассматривали простой пример модифицирования оператора T-SQL для улучшения его производительности. Используя эти средства, вы можете теперь модифицировать многие типы операторов T-SQL, чтобы улучшить показатели их выполнения. В этом разделе мы рассмотрим несколько способов оптимизации операторов T-SQL, чтобы повысить их производительность или чтобы они использовали меньше системных ресурсов.
Оптимизация плана исполнения
Модифицирование плана исполнения может оказаться трудным делом, а создание лучшего плана исполнения, чем у оптимизатора запросов, может оказаться еще более трудным делом. Наиболее вероятны улучшения от внесения изменений в план исполнения операторов JOIN, GROUP BY, ORDER BY и UNION. Вы можете легко модифицировать эти операции, пробуя различные подсказки и просматривая результаты (см. раздел "Использование подсказок" далее). Изменяя подсказку и просматривая результаты в окне Query Analyzer, вы, возможно, найдете более эффективный вариант выполнения оператора.
К сожалению, не существует какого-либо единого подхода к настройке операторов T-SQL для получения более высокой производительности. Поскольку каждая база данных уникальна и каждое приложение отличается от других приложений, модификации должны выполняться для каждого конкретного случая.
Выбор метода доступа к базе данных
Как уже говорилось выше в этой лекции, методы доступа к данным – это, по сути, объекты, используемые системой SQL Server при выборке данных из базы данных. Анализируя свою базу данных и данные, которые она содержит, вам, возможно, удастся оптимизировать метод доступа к данным, когда целью оптимизации является снижение количества операций ввода-вывода.
Модификации метода доступа к данным, как и модификации плана исполнения, должны выполняться для каждого конкретного случая. Следующие рекомендации помогут вам в выборе более эффективного метода доступа к данным.
- Используйте наиболее подходящий индекс.Использование наиболее подходящего индекса для операции является необходимым условием достижения наиболее высокой производительности. Наиболее подходящий индекс для определенной операции – это индекс, позволяющий наиболее быстро находить данные с использованием наименьшего числа операций ввода-вывода. Вы можете определить наиболее подходящий индекс, исходя из знания особенностей вашей базы данных и ее данных или используя утилиту Query Analyzer. Эта утилита позволяет вам опробовать различные сценарии, чтобы определить индекс, который позволяет считывать минимальное количество строк. (Напомним, что Query Analyzer просто оценивает количество возвращаемых строк; чтобы определить точное количество строк, вы должны использовать Profiler.)Примечание.Как уже говорилось в лекции 17, индексы очень важны для SQL Server, но они могут приводить к снижению производительности при неверном использовании. Следите за количеством индексов на одну таблицу – особенно при большом количестве операций для операторов INSERT, UPDATE и DELETE. Излишнее количество индексов приводит к снижению производительности для операций этого типа, поскольку модифицирование индексов сопряжено с дополнительной нагрузкой на систему.
- Используйте охватывающие (covering) индексы. Использование охватывающих (covering) индексов, возможно, позволит вам обойтись без операции ввода-вывода в процессе поиска данных (см. лекцию 17). Вместо доступа к соответствующей таблице вам, возможно, удастся считывать необходимые данные из самого индекса.
- Снижайте количество возвращаемых строк.Определите, насколько необходимы те или иные данные, возвращаемые в результате запросов. Модифицируйте запросы T-SQL, чтобы в них выполнялся доступ только к необходимым данным. Не считывайте строки, которые будут затем отброшены. Снижение количества строк, считываемых из базы данных, может быть достигнуто в результате повышения селективности запроса.
Использование подсказок
Вы можете изменять метод доступа к данным и план исполнения, модифицируя сам оператор T-SQL, но в случае ошибок этот метод может нарушить функциональные требования к данному оператору T-SQL. Более надежным методом оптимизации операторов T-SQL является использование подсказок. С помощью подсказок вы можете указывать оптимизатору запросов, какие операции он должен выполнять и какие объекты он должен использовать. В этом разделе вы узнаете о различных подсказках SQL Server и об их использовании.
Подсказки операций связывания
Подсказки операций связывания (join hints) используются, чтобы указывать оптимизатору запросов типы операций связывания, которые он должен выполнять. (Если в запросе не указано никакого типа, то оптимизатор запросов выбирает тип самостоятельно.) В SQL Server вы можете выполнять связывание вложенных цепочек, хеш-связывание, связывание слиянием и удаленное связывание. Вы указываете метод связывания с помощью следующих подсказок.
- LOOP. Указывает связывание вложенных цепочек. При этом типе связывания для каждой строки внешней таблицы проверяется каждая строка внутренней таблицы на совпадение значений указанных полей.
- HASH. Указывает хеш-связывание. При этом типе связывания одна таблица преобразуется как хеш-таблица. Другая таблица сканируется по одной строке, и для поиска совпадений используется хеш-функция.
- MERGE. Указывается связывание с сортировкой слиянием. При этом типе связывания сортируется каждая таблица, и затем каждая строка каждой таблицы сравнивается с соответствующей строкой в убывающем порядке.
- REMOTE. Указывает удаленное связывание. При этом типе связывания хотя бы одна их участвующих таблиц является удаленной.
Рассмотрим пример использования подсказки для операции связывания. Мы используем пример из раздела "Просмотр плана для операции связывания" выше в этой лекции и укажем следующую хеш-подсказку:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, LastName, OrderDate FROM Orders, Employees WHERE Orders.EmployeeID = Employees.EmployeeID OPTION (HASH JOIN)
Если вы решили использовать для связывания синтаксис SQL-92, то можете задать тип связывания, также используя подсказку. Применяя синтаксис SQL-92, вы могли бы переписать предыдущий запрос следующим образом:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, LastName, OrderDate FROM Orders INNER HASH JOIN Employees ON (Orders.EmployeeID = Employees.EmployeeID)
Использование подсказок для связывания является достаточно сложной темой, и не существует никаких правил, указывающих, когда использовать подсказки для связывания. Существует много причин для выбора определенной операции связывания, таких как предикаты, размер каждой таблицы при связывании и количество таблиц, участвующих в операции связывания. Чтобы определить, нужно ли изменять операцию связывания, лучше всего опробовать каждый тип связывания в Query Analyzer и посмотреть, какой из них дает меньшую стоимость. Но обычно наилучший способ для операции связывания выбирает оптимизатор запросов.
Подсказки для запросов
Подсказки для запросов используются для указания того, как следует выполнять определенные операции запроса. Подсказки для запросов разбиты на три категории: GROUP BY, UNION и остальные.
Подсказки GROUP BY. Следующие подсказки указывают, как следует выполнять операции GROUP BY или COMPUTE.
- HASH GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться хеш-функция
- ORDER GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться операция сортировки.
Используя пример GROUP BY из раздела "Просмотр плана для операции агрегирования" выше в этой лекции, мы можем указать с помощью подсказки, как должна выполняться операция HASH GROUP BY:
SELECT CustomerID, SUM(OrderDetails.UnitPrice) FROM Orders, OrderDetails GROUP BY CustomerID OPTION (HASH GROUP)
Подсказки UNION. Следующие подсказки используются для указания того, как следует выполнять операции UNION.
- MERGE UNION. Для выполнения операции UNION используется операция MERGE.
- HASH UNION. Для выполнения операции UNION используется хеш-функция.
- CONCAT UNION. Для выполнения операции UNION используется функция конкатенации.
Вот пример использования подсказки CONCAT UNION:
SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM orders WHERE CustomerID = 'TOMSP' UNION SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM orders WHERE EmployeeID = '4' OPTION (CONCAT UNION)
К сожалению, не существует какой-либо "секретной формулы", которую можно использовать для определения наиболее подходящей операции UNION в вашей ситуации. И здесь лучше всего использовать Query Analyzer для опробования различных подсказок UNION, чтобы посмотреть, какая из них дает наилучшую стоимость. Обычно наилучшую стратегию для операций UNION определяет оптимизатор запросов SQL Server.
Остальные подсказки.Следующие подсказки можно использовать для выполнения различных запросных операций.
- FORCE ORDER. Указывает, что доступ к таблицам должен выполняться в том же порядке, как они представлены в запросе. По умолчанию SQL Server может изменять порядок следования таблиц.
- ROBUST PLAN. Указывает, что оптимизатор запросов должен быть готов к максимально возможному размеру строк. Вот пример использования этой подсказки:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName, LastName, OrderDate FROM Orders, Employees WHERE Orders.EmployeeID = Employees.EmployeeID OPTION (ROBUST PLAN)
Подсказки для таблиц
Подсказки для таблиц используются, чтобы управлять способом доступа к таблицам.
Здесь описаны две подсказки для таблиц.
- FAST n.Заменяет FASTFIRSTROWS, сохраненную для обратной совместимости. Эта подсказка указывает SQL Server, что нужно оптимизировать выборку n первых строк данных.
- INDEX = имя_индекса. Указывает оптимизатору запросов, что нужно использовать указанный индекс, когда имеется такая возможность. В одном из первых примеров этой лекции показано, как использовать подсказку INDEX. Мы повторяем здесь этот пример:
SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM orders WITH (INDEX = EmployeeID) WHERE EmployeeID = 5 OPTION (FAST 10)
Квалификатор WITH не является обязательным.
Подсказка INDEX = EmployeeID указывает, что должен использоваться индекс EmployeeID. Если указана подсказка FAST 10, то SQL Server будет оптимизировать выборку первых 10 строк (если возможно) и затем будет возвращать остальные строки.
Заключение
В этой лекции вы узнали, как использовать Query Analyzer для определения плана исполнения и методов доступа к данным, наиболее подходящих для данного запроса. Кроме того, вы узнали, как использовать Profiler для просмотра операторов T-SQL, которые выполняются в вашей системе, и как запускать трассировки, чтобы определить наличие некоторых операторов T-SQL, возможно, вызывающих проблемы производительности. Вы также узнали, как оптимизировать план исполнения и методы доступа к данным, исходя из структуры вашей базы данных и ваших данных. И, наконец, вы узнали, как использовать подсказки для указания того, что должен использоваться определенный план исполнения или метод доступа к данным. В лекции 36 эта тема будет развита: вы узнаете о проблемах производительности и способах их разрешения.
Лекция 36. Разрешение наиболее распространенных проблем производительности
На протяжении всего этого курса вы узнавали о средствах, которые можете использовать, и параметрах, которые можете регулировать для поиска и разрешения определенных проблем производительности. Например, в предыдущей лекции вы узнали, как выявлять проблемы, связанные с вашими операторами T-SQL и хранимыми процедурами, и как настраивать эти операторы и процедуры для получения оптимальной производительности. Назначение этой лекции – помочь вам легко находить информацию, необходимую для разрешения различных типов проблем производительности. В ней дается обзор связанных с производительностью тем, которые были изложены в других лекциях, даются ссылки на предыдущие лекции, где рассматриваются процедуры производительности, и приводится некоторая дополнительная информация о мониторинге производительности и настройке системы
Мы начнем с краткого описания термина "узкое место". Затем мы рассмотрим, как использовать Microsoft Windows 2000 System Monitor (Performance Monitor в Microsoft Windows NT) и Microsoft SQL Server Enterprise Manager, чтобы определить наличие какой-либо проблемы производительности. Затем мы рассмотрим, как разрешать целый ряд проблем производительности, возникающих на различных уровнях, включая уровень приложений, уровень SQL Server, уровень операционной системы и уровень оборудования. В этой лекции дается обзор правил, используемых для планирования мощности системы (они описаны в лекции 6), поскольку вы можете использовать их для анализа существующей системы, чтобы определить необходимость в дополнительном оборудовании для повышения производительности. И, наконец, мы рассмотрим несколько параметров конфигурирования SQL Server, описанных в предыдущих лекциях, чтобы вы могли регулировать их для изменения способа работы системы.
К концу этой лекции вы будете готовы к выявлению узких мест, снижающих производительность, и определению их причин. Вы не всегда сможете разрешить проблемы производительности, но большинство из них поддаются разрешению, если у вас есть для этого время и ресурсы.
Что такое узкое место?
Термин "узкое место" (bottleneck) обычно используется при рассмотрении вопросов производительности программного обеспечения и оборудования; он относится к ограничивающему производительность состоянию, вызванному каким-либо компонентом или набором компонентов. Например, подсистема ввода-вывода с недостаточной мощностью может создавать ощутимый эффект узкого места: она может замедлять работу всей системы. (См. раздел "Подсистема ввода-вывода" далее в этой лекции.)
Почти любой компонент, действующий в системе, может потенциально стать причиной узкого места. Узкое место может быть вызвано одним компонентом, таким как отдельный диск, набором компонентов, таким как подсистема ввода-вывода, или сочетанием различных компонентов. Например, предположим, что вы обнаружили узкое место, причиной которого является подсистема ввода-вывода, и разрешаете эту проблему путем добавления дисков для поддержки нужного количества операций ввода-вывода, возникающих в системе (аппаратное решение), путем оптимизации неэффективных запросов для снижения количества операций ввода-вывода (программное решение) или применяя оба метода. Разрешив проблему ввода-вывода, вы можете обнаружить наличие узкого места, связанного, например, с ЦП, что потребует увеличения скорости или количества ЦП.
Выявление проблемы
Чтобы определить наличие проблем в вашей системе, вам нужно сначала выполнить некоторые общие исследования по производительности системы. Например, определите, не сталкиваются ли пользователи с проблемой медленного отклика (время отклика больше ожидаемого), когда они выполняют запросы и модификации базы данных. Это характерный симптом проблемы производительности или узкого места. Например, вы можете обратить внимание, что при выполнении определенного запроса все другие операции, запущенные в данной системе, выполняются медленнее, чем обычно. Поэтому вы постараетесь оптимизировать этот запрос или выполнять его, когда меньшее число пользователей выполняет доступ к системе.
Еще одним способом выявления проблемы является периодическое тестирование и мониторинг системы. Для этого вы можете использовать разнообразные средства, включая Windows 2000 System Monitor и SQL Server Enterprise Manager. В данном разделе вы узнаете, как использовать эти два инструмента для обследования состояния вашей системы. Вы также ознакомитесь с хранимой процедурой sp_who которую можете использовать для мониторинга активных процессов SQL Server.
System Monitor
В состав Windows 2000 System Monitor включены не только счетчики Windows 2000, но также счетчики SQL Server. Эти счетчики следят за характеристиками системы, такими как процент использования ЦП или коэффициент попадания в кэш-память для SQL Server (счетчик Cache hit ratio), которые помогают определять, что происходит с вашей системой. (Информация о конкретных счетчиках производительности приводится на протяжении всей этой лекции.) Вы можете следить за результатами мониторинга в режиме реального времени или можете протоколировать данные в файле и просматривать их позже.
Чтобы использовать System Monitor для мониторинга вашей системы, выполните следующие шаги.
- Щелкните на кнопке Start (Пуск), укажите пункт Programs, укажите Administrative Tools (Администрирование) и затем выберите пункт Performance (Производительность), чтобы появилось окно System Monitor
- Укажите, щелкнув на соответствующей кнопке панели инструментов, в какой форме вы хотите просматривать данные: в виде графика, отчета, гистограммы или в файле журнала (для ранее сохраненных данных). На рис. 36.1 показано графическое окно в System Monitor. Если вы решите просматривать файл журнала, то появится диалоговое окно для выбора файла, который нужно открыть.
- Чтобы добавить какой-либо счетчик для просмотра в окне Performance, щелкните на знаке "плюс" в панели инструментов. Появится диалоговое окно Add Counters (Добавление счетчиков) (рис. 36.2). Щелкните на кнопке выбора Use local computer counters (Использовать счетчики локального компьютера), чтобы просматривать счетчики локальной системы, или щелкните на кнопке выбора Select counters from computer (Выбрать счетчики с компьютера) и выберите из раскрывающегося списка под этой кнопкой выбора имя удаленного компьютера для просмотра счетчиков этого компьютера.
Рис. 36.1. Окно Windows 2000 Performance
Рис. 36.2. Диалоговое окно Add Counters (Добавление счетчиков) - Выберите объект System Monitor из раскрывающегося списка Performance object (Объект производительности). Эти объекты представляют компоненты системы. Счетчики для выбранного вами объекта появляются затем в окне списка в нижнем левом углу диалогового окна. Если вы хотите просматривать все счетчики для выбранного объекта, щелкните на кнопке выбора All counters (Все счетчики). Если вы хотите следить только за определенными счетчиками, щелкните на кнопке выбора Select counters from list (Выбор счетчиков из списка) и выберите нужные счетчики из списка. Для определенных счетчиков существует несколько экземпляров; эти экземпляры представлены в окне списка в нижнем правом углу диалогового окна. Щелкните на кнопке выбора Select instances from list (Выбор экземпляров из списка), если хотите выбрать для просмотра определенные экземпляры, или щелкните на кнопке выбора All instances (Все экземпляры) для просмотра всех экземпляров.
- Щелкните на кнопке Add (Добавить). Счетчик или счетчики, которые у вас выбраны, будут добавлены в окно System Monitor. (Если выбрано несколько экземпляров какого-либо счетчика, то будут добавлены все выбранные экземпляры.) Затем вы можете продолжить добавление счетчиков. Щелкните на кнопке Close, когда будете готовы вернуться в окно Performance. Теперь вы сможете просматривать данные производительности, получаемые с помощью счетчиков. На рис. 36.3 показано графическое представление результатов, возвращаемых тремя счетчиками: Context Switches/sec (Переключение контекста/сек), Total Server Memory (KB) (Общая память сервера, Кб) и %Processor Time (Процент использования процессора).
увеличить изображение
Рис. 36.3. System Monitor в действии
Для сохранения данных производительности в файле журнала выполните следующие шаги:
- Раскройте Performance Logs and Alerts (Журналы производительности и оповещения) в левой панели окна Performance. Щелкните правой кнопкой мыши на Counter Logs (Журналы счетчиков) и выберите из контекстного меню пункт New Log Settings (Новый набор параметров журнала). Появится диалоговое окно New Log Settings. Здесь нужно ввести имя вашего набора параметров журнала (рис. 36.4). Для продолжения щелкните на кнопке OK.
Рис. 36.4. Диалоговое окно New Log Settings (Новый набор параметров журнала) - Появится окно с именем вашего нового файла журнала. Во вкладке General (Общие) щелкните на кнопке Add. В появившемся диалоговом окне Add Counters выберите счетчики, которые хотите протоколировать в журнале, в соответствии с шагами 3-5 предыдущего описания того, как System Monitor используется для мониторинга вашей системы. Во вкладке General вы можете также изменять имя файла журнала и указывать, насколько часто нужно выполнять выборку данных производительности.
- Щелкните на вкладке Log Files (Файлы журналов), чтобы задать дополнительные свойства файла журнала. На рис. 36.5 показаны параметры для файла, у которого в конец имени будет добавляться дата и который будет создаваться как двоичный файл.
Рис. 36.5. Вкладка Log Files (Файлы журналов) окна нового файла журнала - Щелкните на вкладке Schedules (Расписание). В этой вкладке вы назначаете время начала и окончания для этого файла журнала. Вы можете также выбрать запуск нового журнала или запуск какой-либо команды после закрытия текущего файла журнала.
- Щелкните на кнопке OK, чтобы закрыть данное окно и сохранить информацию о вашем файле журнала. Если у вас выбран немедленный запуск журнала, он начнет заполняться, когда вы щелкнете на кнопке OK. Запись для этого файла журнала появится в окне Performance (рис. 36.6).
Для проверки состояния вашей системы вам следует регулярно использовать System Monitor. Удобно использовать мониторинг по ежедневному или еженедельному графику, поскольку это позволяет вам знать особенности системы и, тем самым, распознавать необычные события. Рекомендуется также сохранять данные производительности в файле журнала для последующего просмотра, поскольку данные файла журнала удобно использовать для сравнения данных производительности до и после внесения изменений в систему, чтобы определить влияние этих изменений. Вы можете также использовать журналы, чтобы определять, как изменяется активность пользователей и системы изо дня в день. Например, вы можете заметить, что в последние несколько дней месяца активность пользователей намного выше, чем в другие периоды. Вам нужно убедиться, что ваша система способна справляться с пиковой нагрузкой в эти дни.
увеличить изображение
Рис. 36.6. Окно System Monitor, где показана запись для нового журнала счетчиков
Enterprise Manager
Кроме использования Enterprise Manager для автоматизации повседневных административных функций вы можете использовать его как средство, помогающее в мониторинге процессов и блокировок SQL Server. (О блокировках см. лекцию 19.) Например, вы можете собирать данные о том, какие процессы используют блокировки и какие объекты блокируются (объект в данном случае – это таблица, база данных или временная таблица). Для просмотра этой информации выполните следующие шаги.
- В окне Enterprise Manager раскройте Microsoft SQL Server, раскройте SQL Server Group, раскройте сервер, раскройте папку Management и раскройте папку Current Activity (рис. 36.7). Папка Current Activity (Текущие операции) содержит три папки: Process Info (Информация о процессах), Locks/Process ID (Блокировки/Идентификаторы процессов) и Locks/Object (Блокировки/Объекты).
- Щелкните на папке Process Info, чтобы увидеть следующую информацию: имена пользователей, подсоединенных в данный момент к SQL Server (колонка User); идентификатор процесса пользователя (Process ID); состояние процесса пользователя (running [выполняется], sleeping [неактивное состояние] или background [фоновый режим]); базу данных, к которой подсоединен каждый пользователь (Database); команды (Commands) и приложения (Application), выполняемые каждым пользователем; время ожидания (Wait time), то есть время, которое ждет пользователь, пока не получит доступ к какому-либо ресурсу; показатели использования ЦП, физического ввода-вывода и памяти каждым процессом; и состояние блокировки каждого процесса (блокирует ли данный процесс другие процессы или блокирован другими процессами). Чтобы увидеть всю эту информацию, вам придется выполнить прокрутку вправо. На рис. 36.8 показана часть этой информации.
увеличить изображение
Рис. 36.7. Раскрытая папка Current Activity (Текущие операции) в окне Enterprise Manager
увеличить изображение
Рис. 36.8. Информация папки Process Info (Информация о процессах) в окне Enterprise Manager - Щелкните на папке Locks / Process ID для просмотра в правой панели списка системных идентификационных номеров процессов (SPID) для текущих активных процессов (рис. 36.9). Дважды щелкните на каком-либо из SPID-номеров в правой панели, чтобы появилось диалоговое окно Process Details (Подробности процесса) (рис. 36.10). В этом диалоговом окне показан последний оператор
T-SQL, выполненный выбранным процессом.
увеличить изображение
Рис. 36.9. SPID-номера, показанные в панели Locks / Process ID
Рис. 36.10. Диалоговое окно Process Details - Раскройте папку Locks / Process ID для просмотра в левой панели SPID-номеров текущих процессов (рис. 36.11).
- Щелкните на каком-либо SPID-номере в левой панели, чтобы увидеть информацию о блокировках для этого процесса в правой панели (рис. 36.11). В эту информацию включен тип блокировки (Lock type), режим блокировки (Mode), состояние блокировки (Status) и владелец блокировки (Owner). Может быть указан один из следующих типов блокировки.
- RID. Блокировка строк.
- KEY.Блокировка строк внутри индекса.
- PAG. Блокировка страницы данных или индекса.
- EXT. Блокировка экстента.
увеличить изображение
Рис. 36.11. Раскрытая папка Locks / Process ID - TAB. Блокировка таблицы, включая все страницы данных и индекса для этой таблицы.
- DB. Блокировка базы данных.
- S. Разделяемая блокировка.
- X. Монопольная блокировка.
- U. Блокировка изменений.
- BU. Блокировка массовых изменений.
- IS. Разделяемая блокировка намерения.
- IX. Монопольная блокировка намерения.
- SIX. Монопольная разделяемая блокировка намерения.
- Sch-S. Блокировка схемы для компилирования запросов.
- Sch-M. Блокировка схемы для операций языка DDL.
- GRANT. Означает, что данная блокировка была предоставлена выбранному процессу.
- WAIT. Означает, что данный процесс блокирован другим процессом и ожидает получения блокировки.
- CNVT. Означает, что данная блокировка преобразована в другой тип блокировки.
- Раскройте папку Locks / Object, чтобы увидеть список текущих блокированных объектов (рис. 36.12). Могут быть блокированы такие объекты, как таблицы, временные таблицы, базы данных и т.д.
увеличить изображение
Рис. 36.12. Раскрытая папка Locks / Object - Щелкните на имени блокированной базы данных или таблицы, чтобы увидеть в правой панели информацию о ее блокировке (рис. 36.13). Здесь показана та же информация, что и при щелчке на каком-либо SPID-номере в папке Locks / Process ID, только с другой "точки зрения".
увеличить изображение
Рис. 36.13. Просмотр информации о блокировке для объекта
Хранимая процедура sp_who
Вы можете также просматривать информацию об активных процессах, запустив следующую команду в Query Analyzer или с помощью OSQL:
sp_who active GO
Результаты выполнения этой команды в Query Analyzer показаны на рис. 36.14. Если какой-либо процесс блокирован, то в колонке "blk" показан SPID-номер процесса, который его блокирует.
увеличить изображение
Рис. 36.14. Пример результатов запуска sp_who active
Если пользователи жалуются, что их транзакции выполняются медленно, вы можете запустить эту команду для поиска блокировок. Вы будете много раз сталкиваться с ситуацией, когда большинство блокированных процессов блокировано одним процессом, а определив этот процесс, вы сможете определить, почему он так долго удерживает блокировки.
Вам следует время от времени выполнять мониторинг блокировок, чтобы выявлять процессы, которые удерживают блокировку слишком долго, и процессы, которые бывают блокированы слишком часто (находятся в состоянии WAIT ) из-за монопольных блокировок или блокировок по таблицам, которые удерживаются другими процессами. Но обычно в случае проблемы блокировки ваши пользователи будут жаловаться на слишком большое время отклика. Если блокирование возникает слишком часто или длится слишком долго, то вам потребуется определить, какие процессы удерживают монопольные блокировки или блокировки по таблицам (что может быть причиной блокирования), и выполнить мониторинг операторов SQL Server, которые запускают эти процессы. Затем попытайтесь оптимизировать, если возможно, эти операторы, чтобы они быстрее освобождали эти блокировки и не захватывали монопольные блокировки по таблицам. Обычно для выполнения процесса требуется больше времени, если этому процессу приходится ждать освобождения какой-либо блокировки. Поэтому снижение конкуренции блокировок может способствовать сокращению времени отклика.
Наиболее характерные узкие места, снижающие производительность
Теперь, узнав, как использовать средства мониторинга производительности, такие как System Monitor, Enterprise Manager, Query Analyzer и Profiler, вы готовы к тому, чтобы справляться с проблемами узких мест, снижающих производительность. В этом разделе мы рассмотрим некоторые из наиболее характерных узких мест, снижающих производительность, и различные решения этих проблем. Многие из этих узких мест тесно связаны друг с другом, и одно узкое место может "маскироваться" под другое. Вы должны искать как аппаратные, так и программные узкие места, поскольку причиной многих проблем производительности являются комбинации узких мест. Причиной аппаратных узких мест могут становиться такие компоненты оборудования, как ЦП, память и подсистема ввода-вывода; причиной программных узких мест могут становиться приложения SQL Server и операторы SQL. Мы рассмотрим подробнее каждый из этих типов проблем в следующих разделах.
Центральный процессор (ЦП)
Одной из наиболее распространенных проблем производительности является просто недостаток мощности. Процессорная мощность системы определяется количеством, типом и скоростью центральных процессоров (ЦП) в этой системе. Если вашей системе недостает мощности ЦП, то она не может достаточно быстро обрабатывать транзакции, как это требуется пользователям. Чтобы использовать System Monitor для определения процента использования ЦП, проверяйте счетчик %Processor Time объекта Processor. (Выберите все экземпляры ЦП, если у вас многопроцессорная система.) Если ваши ЦП работают с загрузкой 75% или выше в течение длительных периодов времени (75 % – желательный максимум согласно правилам лекции 6), то в вашей системе, скорее всего, имеется проблема узкого места, связанного с ЦП. Если вы постоянно видите процент использования ЦП не ниже 60 %, то вам, видимо, поможет добавление более быстрых ЦП или увеличение количества ЦП.
Выполните мониторинг других характеристик системы, прежде чем увеличивать мощность ЦП. Например, если ваши операторы SQL сформированы неэффективно, то ваша система, видимо, выполняет намного больше операций обработки, чем это требуется, и оптимизация этих операторов, возможно, снизит степень использования ЦП. Или, предположим, что коэффициент попадания в кэш-память (счетчик Cache hit ratio) для кэша данных SQL Server ниже 90 %. Возможно, вы должны добавить память для кэша данных (увеличив значение параметра max server memory или добавив физическую память к системе). Это позволит увеличить количество данных, помещаемых в кэш, и, тем самым, снизить объем дисковых физических операций ввода-вывода, что приведет к снижению процента использования ЦП, поскольку на обработку запросов ввода-вывода будет уходить меньше времени. Вы можете иногда повышать производительность системы, просто за счет добавления процессоров, особенно в том случае, если вы начинаете работу с однопроцессорной системы. Однако не все приложения допускают масштабирование на многопроцессорные системы. SQL Server предусматривает масштабирование, но не все операторы SQL, которые могут у вас использоваться, допускают масштабирование. На одном ЦП будет одновременно выполняться только один процесс, и одного ЦП достаточно для одного оператора SQL Server. Чтобы повысить производительность за счет использования нескольких процессоров, ваша система SQL Server должна параллельно выполнять несколько операторов, которые могут одновременно обрабатываться на различных ЦП.
Обычно вы можете почти всегда повысить производительность за счет использования большего количества более быстрых ЦП. Однако в некоторых случаях при добавлении более быстрых ЦП вы должны увеличить память и мощность ввода-вывода, чтобы другие компоненты не стали причиной узкого места. Например, если у вас сначала была проблема узкого места из-за ЦП и вы разрешили эту проблему, добавив еще один ЦП, то ваша система, видимо, сможет выполнять больше работы, что приведет к увеличению количества дисковых операций ввода-вывода. В результате может возникнуть проблема узкого места из-за дисковой подсистемы ввода-вывода. Кроме того, убедитесь, что новые процессоры, которые вы хотите добавить, имеют кэш уровня 2 (Level 2 [L2]). Чем больше кэш ЦП, тем выше производительность, особенно в многопроцессорной системе.
Если вы действительно решили увеличить процессорную мощность, то можете добавить новые ЦП или заменить существующие ЦП на более мощные. Например, если в вашей системе два ЦП, но ее можно расширить до четырех ЦП, добавьте еще два ЦП того же типа или установите четыре новых, более быстрых ЦП. Если ваша система уже содержит максимальное количество ЦП и вам нужно увеличить процессорную мощность, постарайтесь получить более быстрые ЦП для их замены. Например, предположим, что у вас четыре ЦП, работающих со скоростью 200 МГц. Вы можете заменить их четырьмя ЦП со скоростью 500 МГц. Более быстрые ЦП способствуют сокращению времени обработки.
Память
Количество памяти, доступной SQL Server, является одним из наиболее критичных факторов для производительности SQL Server. Важным фактором является также соотношение между памятью и мощностью подсистемы ввода-вывода. Например, в системах с большой интенсивностью операций ввода-вывода больший объем памяти, который может использовать SQL Server для кэша данных, позволяет выполнять меньшее количество физических операций ввода-вывода. Это происходит потому, что данные считываются не с диска, а из кэша данных. SQL Server использует сложную кэш-систему для повышения производительности всей системы; максимально увеличивается доступ к данным в памяти и сводится к минимуму доступ к данным на дисках. Чем больше данных, считываемых из памяти, тем выше производительность вашей системы. Доступ к памяти осуществляется намного быстрее, чем доступ к диску.
В некоторых случаях недостаточное количество памяти может приводить к узкому месту за счет диска из-за увеличения количества дисковых физических операций ввода-вывода, связанного с тем, что система не может эффективно использовать кэш. Чтобы увидеть, сколько системной памяти использует SQL Server, запустите System Monitor, чтобы проверить счетчик общей памяти сервера Total Server Memory (KB) для объекта SQL Server: Memory Manager. Если SQL Server не использует ожидаемого количества памяти, то вам, возможно, требуется изменить параметры конфигурирования памяти, описанные в разделе "Параметры конфигурирования SQL Server" ниже в этой лекции.
Чтобы определить, хватает ли кэш-памяти для SQL Server, используйте System Monitor, чтобы проверить счетчик Buffer Cache Hit Ratio объекта SQL Server: Buffer Manager. Общее правило состоит в том, что счетчик Cache hit ratio должен давать значения не меньше 90%. Увеличьте размер памяти для кэша, если этот показатель меньше 90%. Отметим, что в некоторых системах счетчик Cache hit ratio никогда не достигает 90% из-за особенностей используемого приложения. Это может быть в случаях, когда повторное использование страниц данных происходит редко и система часто очищает страницы данных в кэше для размещения новых страниц.
Подсистема ввода-вывода
Узкие места, возникающие в подсистеме ввода-вывода, – это наиболее распространенные проблемы оборудования для систем баз данных. Плохо сконфигурированные подсистемы ввода-вывода уступают по своему влиянию на производительность только неэффективным операторам SQL. К счастью, проблемы подсистемы ввода-вывода относятся к тем проблемам производительности, которые наиболее легко поддаются разрешению. Во многих случаях добавление дисков полностью устраняет эти проблемы.
Проблема подсистем ввода-вывода возникает вследствие ограниченности количества операций, которые можно выполнять на диске; например, определенный дисковод может выполнять не более 85 операций ввода-вывода с произвольным доступом в секунду. При слишком большой нагрузке на диски операции ввода-вывода на этих дисках поступают в очередь, что приводит к большим задержкам ввода-вывода для SQL Server. Эти большие задержки могут приводить к более длительному удерживанию блокировок или к простаиванию потоков, ожидающих освобождения какого-либо ресурса. В конечном итоге снижается производительность системы в целом, что, в свою очередь, раздражает пользователей, которые жалуются, что их транзакции выполняются слишком долго.
В большинстве случаев проблемы производительности подсистем ввода-вывода возникают потому, что был неправильно спланирован состав соответствующей подсистемы ввода-вывода. О планировании состава системы см. лекции 5 и 6, но мы все же дадим здесь краткий обзор этой темы.
Планирование состава (sizing) подсистемы ввода-вывода необходимо, как уже говорилось, из-за ограниченности количества операций ввода-вывода в секунду, которые могут выполняться одним дисководом. Если на диске выполняются преимущественно последовательные операции ввода-вывода, как это происходит с журналом транзакций, то он может осуществлять, например, более 150 операций в секунду без какой-либо перегрузки. (Как уже говорилось, перегрузки приводят к длительным задержкам.) С другой стороны, если на диске выполняются операции ввода-вывода с произвольным доступом, что характерно для файлов данных, то его производительность может составлять только 85 операций в секунду. При высоких требованиях к вводу-выводу все более возрастает время задержек.
Чтобы определить, не перегружены ли ваши диски, выполняйте мониторинг счетчиков объектов PhysicalDisk и LogicalDisk в System Monitor. Эти счетчики (некоторые из них описаны более подробно ниже в этом разделе) выполняют сбор данных об интенсивности физических и логических операций ввода-вывода на диске, таких как число операций чтения и записи в секунду. Эти счетчики активизируются во время инсталляции операционной системы, но вам следует знать, как их активизировать и отключать. Они используют системные ресурсы, такие как время ЦП, когда они собирают статистику, поэтому вам следует активизировать их, только если вам нужен мониторинг ввода-вывода в системе. Чтобы активизировать или отключить эти счетчики, вам нужно активизировать или отключить оператор Windows NT/2000 DISKPERF.
Чтобы определить, активизирован ли оператор DISKPERF, запустите следующий оператор в командной строке:
diskperf
Если DISKPERF активизирован, то появится следующее сообщение: "Physical Disk Performance counters on this system are currently set to start at boot" (Счетчики производительности физических дисков в этой системе в настоящее время установлены для запуска при загрузке системы). Если DISKPERF отключен, то появится следующее сообщение: "Both Logical and Physical Disk Performance counters on this system are now set to never start" (Оба счетчика производительности [для логического и физического диска] не будут запускаться).
Чтобы активизировать оператор DISKPERF, если он отключен, введите следующий оператор в командной строке:
diskperf -Y
Чтобы отключить DISKPERF, запустите следующий оператор:
diskperf -N
Чтобы начали действовать изменения, внесенные DISKPERF, вы должны перезагрузить компьютер. Чтобы увидеть другие параметры для DISKPERF, введите следующий оператор:
diskperf ?
Особенно важны счетчики Disk Writes/Sec (Число операций записи/сек), Disk Reads/Sec (Число операций чтения/сек), Avg. Disk Queue Length (Средняя длина очереди на диск), Avg. Disk Sec/Write (Среднее время одной операции записи) и Avg. Disk Sec/Read. (Среднее время одной операции чтения). Эти счетчики помогают вам определить, не перегружена ли ваша дисковая подсистема. Эти счетчики включены в оба объекта – PhysicalDisk и LogicalDisk. Чтобы получить подробное описание информации, которую предоставляют эти счетчики, щелкните на кнопке Explain (Объяснить) в диалоговом окне Add Counters, когда вы добавляете соответствующий счетчик в System Monitor.
Рассмотрим пример использования этих счетчиков. Предположим, вы считаете, что у вас имеется проблема узкого места подсистемы ввода-вывода. Вам следует проверить счетчики Avg. Disk Sec/Transfer (Средняя длительность одной передачи на диске), Avg. Disk Sec/Read и Avg. Disk Sec/Write объекта PhysicalDisk, поскольку они отражают задержку (ожидание) на диске (время, которое требуется диску для выполнения операции чтения или записи), а повышение длительности задержки является признаком того, что у вас перегружены дисководы или дисковая матрица. Общее правило состоит в том, что нормальные показания этих счетчиков должны составлять от 1 до 15 миллисекунд (от 0,001 до 0,015 секунды), но вам не следует беспокоиться, если в периоды пиковой нагрузки задержка составит 20 миллисекунд (0,020 секунды). Но если значения более 20 миллисекунд, то в вашей системе явно имеется проблема производительности, связанная с подсистемой ввода-вывода.
Вы должны также проверять счетчики Disk Writes/Sec и Disk Reads/Sec. Предположим, эти счетчики показывают, что на диске выполняется 20 операций записи и 20 операций чтения в секунду, то есть всего 40 операций ввода-вывода в секунду, а мощность диска составляет 85 операций ввода-вывода в секунду. И если в то же самое время диск дает большие задержки, то, возможно, это говорит о неисправности данного диска. А теперь предположим, что на этом диске выполняется 100 операций в секунду и длительность задержек составляет 20 миллисекунд или больше. В этом случае вам требуется увеличить количество дисков, чтобы повысить производительность.
Чтобы определить, сколько операций ввода-вывода выполняет ваша система, когда вы используете RAID-матрицу, разделите количество операций ввода-вывода в секунду, которое вы видите в System Monitor, на количество дисков этой матрицы, и умножьте на дополнительный коэффициент для матрицы RAID. В табл. 36.1 приводится количество физических операций, генерируемых для чтения и записи при использовании технологии RAID.
Уровень RAID | Чтение | Запись |
---|---|---|
0 | 1 | 1 |
1 или 10 | 1 | 2 |
5 | 1 | 4 |
Обычно наилучшим способом устранения узкого места подсистемы ввода-вывода является просто добавление дисков. Но не забудьте проверить другие возможные причины узкого места в подсистеме ввода-вывода, такие как низкое значение коэффициента попадания в кэш и транзакции, в которых выполняется больше операций ввода-вывода, чем это необходимо. (Как уже говорилось, в большинстве случаев коэффициент попадания в кэш меньше 90% считается слишком низким.) Если вы нашли узкое место подсистемы ввода-вывода, посмотрите указания в лекции 6, чтобы определить количество дисков, необходимое вашей системе.
Неисправные компоненты
Время от времени в вашей системе могут возникать проблемы из-за неисправных компонентов. Если компонент не отказал полностью, но постепенно ухудшает свою работу, то такую проблему бывает трудно обнаружить. Поскольку эти проблемы принимают различные формы и сложны для разрешения, в данном курсе не предусмотрено их подробное изложение. Вместо этого мы рассмотрим лишь несколько основных рекомендаций для выявления проблем неисправных компонентов.
- Сравнивайте однотипные диски и дисковые массивы.Просматривая статистику в System Monitor, сравнивайте аналогичные компоненты. Например, если вы заметили, что два диска выполняют приблизительно одинаковое число операций ввода-вывода, но имеются различные задержки, то на более медленном диске, возможно, имеется проблема.
- Следите за световыми индикаторами. Сетевые концентраторы обычно имеют индикаторы конфликтных ситуаций. Если вы заметили, что определенный сегмент сети имеет необычно высокое число конфликтов, это может быть признаком неисправного компонента, – возможно, сетевой платы или сетевого кабеля.
- Изучайте вашу систему.Чем больше времени вы потратите на изучение своей системы, тем лучше вы будете разбираться в ее особенностях. Постепенно вы начнете понимать, когда в системе происходит что-то необычное.
- Используйте System Monitor. Это хороший способ наблюдения за поведением системы на регулярной основе.
- Читайте журналы событий. Примите за правило регулярно просматривать журналы системы и приложений SQL Server и Windows 2000 Event Viewer. Просматривайте эти журналы ежедневно для выявления проблем до того, как они выйдут из-под вашего контроля.
Приложения
Еще одним компонентом системы, который обычно вызывает проблемы производительности, являются приложения SQL Server. Причиной этих проблем может быть код самого приложения или операторы SQL, которые запускаются из этого приложения. В этом разделе даются советы и рекомендации разрешения проблем производительности, относящихся к приложениям SQL.
Оптимизируйте планы исполнения
Вы видели в лекции 35, насколько важно выбрать наилучший план исполнения и метод доступа к данным для запроса. К сожалению, не существует какой-либо "особой формулы" определения наилучшего плана. SQL Server автоматически выбирает план исполнения, который определяется как наилучший план оптимизатором запросов. Вы можете использовать различные типы подсказок в ваших запросах, включая подсказки на уровне запросов, подсказки для таблиц и подсказки для операций связывания. Ознакомившись с этими подсказками, вы, вероятно, сможете аналитически определять наилучший план для запроса. Обычно требуется просмотреть несколько планов, прежде чем выбрать наиболее приемлемый.
Используйте индексы осмысленно
Правильное использование индексов является критически важным для получения высокой производительности (см лекции 17 и 35). Для поиска нужных данных с помощью индекса может потребоваться всего лишь 10–20 операций ввода-вывода, в то время как для поиска нужных данных путем сканирования таблиц могут потребоваться тысячи или миллионы операций ввода-вывода. Однако индексы следует использовать с осторожностью. Напомним, что при модифицировании данных таблицы с помощью оператора INSERT, UPDATE или DELETE происходит автоматическое обновление индекса или индексов, связанных с этими данными, что требует выполнения соответствующих операций ввода-вывода в дополнение к операциям непосредственного модифицирования таблицы. Следите за тем, чтобы не создавать слишком много индексов; иначе дополнительная нагрузка, связанная с поддержкой этих индексов, будет приводить к снижению производительности.
Используйте хранимые процедуры
Хранимые процедуры используются для выполнения пакета заранее откомпилированных операторов SQL на сервере (см.лекцию 21). Вызов хранимых процедур из ваших приложений вместо вызова отдельных операторов SQL способствует повышению производительности как за счет повторяемого использования операторов SQL на сервере, так и за счет сильного снижения сетевого трафика. Снижение количества данных, передаваемых между клиентами и серверами, происходит за счет того, что хранимая процедура находится на сервере, а вы можете программировать обработку и фильтрацию данных в хранимой процедуре, а не в приложении.
Параметры конфигурирования SQL Server
SQL Server 2000 является практически самонастраиваемой системой, но вы все же можете изменять способ работу вашей системы, модифицируя значения определенных параметров конфигурирования. В этом разделе вы узнаете, как конфигурировать эти параметры и как они влияют на работу вашей системы. Скорее всего, вам не потребуется изменять эти параметры, но знание их возможностей позволяет вам решать, нужно ли вам их изменение. Вы можете конфигурировать эти параметры с помощью Enterprise Manager или с помощью хранимой процедуры T-SQL sp_configure.
Чтобы использовать Enterprise Manager, щелкните правой кнопкой мыши на имени сервера, который вы хотите конфигурировать, и выберите из контекстного меню пункт Properties (Свойства), чтобы появилось окно SQL Server Properties. Это окно содержит девять вкладок, и каждая вкладка содержит параметры, которые вы можете конфигурировать. Эти вкладки и соответствующие параметры описаны в следующих разделах.
Используя sp_configure для конфигурирования этих параметров, вы должны помнить, что определенные параметры считаются дополнительными (advanced options). (В следующих разделах указывается, какие параметры являются дополнительными.) Для изменения какого-либо дополнительного параметра с помощью sp_configure вы должны задать для параметра show advanced options (показать дополнительные параметры) значение 1 (активизировать). Для этого параметра по умолчанию задано значение 0 (деактивизировать). (Этот параметр не оказывает влияния на дополнительные параметры, если вы используете Enterprise Manager.) Чтобы активизировать параметр show advanced options, используйте следующий оператор:
sp_configure "show advanced options", 1 GO
Обычно для установки любого параметра с помощью sp_configure используется следующий синтаксис:
sp_configure "имя параметра", значение
Параметр affinity mask
Параметр affinity mask (маска "родственности") используется, чтобы указывать, на каких ЦП могут выполняться потоки SQL Server в многопроцессорной среде. Значение 0 (принятое по умолчанию) указывает, что родственность потоков определяется алгоритмами планировщика Windows 2000. Ненулевое значение задает битовую маску, определяющую ЦП, на которых могут выполняться потоки SQL Server. Десятичное значение 1 (или двоичное значение маски 00000001) указывает, что может использоваться только ЦП 1; значение 2 (или 00000010) указывает использование только ЦП 2; 3 (или 00000011) указывает использование ЦП 1 и ЦП 2, и т.д.
Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать для параметра show advanced options значение 1. Вы можете также конфигурировать параметр affinity mask с помощью Enterprise Manager. Для этого щелкните на вкладке Processor (Процессор) в окне SQL Server Properties и в секции Processor Control (Управление процессорами) установите флажки перед каждым ЦП (CPU), который хотите использовать для SQL Server. Щелкните на кнопке Apply (Применить) и затем щелкните на кнопке OK, чтобы сохранить данное изменение. Чтобы это изменение начало действовать, вы должны закрыть и перезапустить SQL Server.
В системе, выделенной только для SQL Server, вы должны задать такое значение параметра affinity mask, чтобы использовать для SQL Server все ЦП. В системе, которая не полностью выделена для SQL Server (то есть содержит другие процессы, которым требуется время ЦП) вам, возможно, потребуется задать такую маску, чтобы для SQL Server использовались все ЦП, кроме одного.
Параметр lightweight pooling
Параметр lightweight pooling (упрощенная организация пула) используется чтобы сконфигурировать SQL Server для использования упрощенных потоков (или "волокон" – fibers). Использование "волокон" может снизить количество переключений контекста за счет того, что планирование процессов выполняет SQL Server (а не планировщик Windows NT или Windows 2000). Если ваше приложение выполняется в многопроцессорной системе и вы видите много переключений контекста, то можете попытаться задать для параметра lightweight pooling значение 1, которое активизирует упрощенную организацию пула, и затем снова выполнить мониторинг количества переключений контекста, чтобы убедиться в снижении этого количества. Значение по умолчанию – 0 (запрещение использования "волокон").
Параметр lightweight pooling относится к группе дополнительных параметров, поэтому его можно конфигурировать с помощью sp_configure, если для параметра show advanced options задано значение 1. Вы можете также конфигурировать lightweight pooling с помощью Enterprise Manager. Щелкните на вкладке Processor в окне SQL Server Properties и в секции Processor Control установите флажок Use Windows NT Fibers (Использовать "волокна" Windows NT) для его активизации или сбросьте этот флажок для деактивизации параметра. Щелкните на кнопке Apply, щелкните на кнопке OK и затем закройте и перезапустите SQL Server, чтобы этот параметр начал действовать.
Параметр max server memory
SQL Server динамически выделяет память. Чтобы задать максимальное количество памяти (в мегабайтах), которое SQL Server может выделить для буферного пула, вы можете использовать параметр max server memory (максимальная память для сервера). Поскольку SQL Server требуется определенное время для освобождения памяти, если у вас есть другие приложения, которым периодически нужна память, то для параметра max server memory можно задать такое значение, чтобы SQL Server оставлял определенную часть памяти свободной для других приложений. Значение по умолчанию – 2147483647 – означает, что SQL Server будет забирать у системы максимально возможное количество памяти, динамически освобождая память, когда она требуется другим приложениям, и снова захватывая память, когда эти приложения освобождают ее. Это рекомендованное значение для выделенной системы SQL Server. Если вы хотите изменить это значение, рассчитайте максимальный объем памяти, который вы можете предоставить SQL Server, вычитая из полного объема физической памяти количество памяти, необходимое для Windows 2000, а также для любых приложений, не относящихся к SQL Server.
Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Для задания этого параметра с помощью Enterprise Manager щелкните на вкладке Memory (Память) в окне SQL Server Properties и используйте движок Maximum (MB) (Максимум [Мб]). Затем щелкните опцию Dynamically Configure SQL Server Memory (Динамическое конфигурирование памяти SQL Server). Этот параметр начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server. (Если щелкнуть опцию Use A Fixed Memory Size [Использовать фиксированный размер памяти], то SQL Server выделит память до указанного объема и затем уже не будет освобождать память.)
Параметр min server memory
Параметр min server memory (минимальная память для сервера) используется для указания минимального количества памяти (в мегабайтах), которое должно выделяться для буферного пула SQL Server. Устанавливать этот параметр полезно в системах, где SQL Server, возможно, резервирует слишком много памяти для других приложений. Например, в среде, где данный сервер используется для служб печати и файловых служб, а также для служб базы данных, SQL Server должен "уступать" слишком много памяти другим приложениям. Это приводит к увеличению времени отклика для пользователей. Значение по умолчанию min server memory равно 0, что позволяет SQL Server динамически забирать и освобождать память. Это рекомендованное значение, но вам может потребоваться его изменение, если ваш сервер не полностью выделен для SQL Server.
Этот параметр относится к группе дополнительных параметров, поэтому для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Вы можете также сконфигурировать его с помощью Enterprise Manager. Щелкните на вкладке Memory (Память) в окне SQL Server Properties, используйте движок Minimum (MB) (Минимум [Мб]) и затем щелкните опцию Dynamically Configure SQL Server Memory. Этот параметр начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server.
Параметр recovery interval
Вы можете использовать параметр recovery interval (интервал восстановления), чтобы определить максимальное количество минут, которое может потратить система для восстановления после аварии. SQL Server использует значение этого параметра и специальный встроенный алгоритм, определяя, насколько часто следует автоматически создавать контрольные точки, чтобы восстановление занимало только указанное количество минут. SQL Server определяет длительность интервала между контрольными точками в соответствии с объемом работы, выполняемой в системе. Если выполняется много работы, то контрольные точки создаются чаще, чем при небольшом объеме работы. Чем меньше объем выполняемой работы, тем меньше времени требуется SQL Server для восстановления после аварии. И чем больше заданный интервал восстановления, тем больше будет интервал между контрольными точками.
Увеличение интервала восстановления повышает производительность системы за счет снижения количества контрольных точек. (При создании контрольной точки выполняется большое число операций записи на диск, что может несколько замедлять выполнение транзакций пользователей.) Но при этом также увеличивается количество времени, которое SQL Server потратит на восстановление. Значение по умолчанию равно 0, указывая на то, что этот интервал будет определять для вас SQL Server и время восстановления будет составлять примерно 1 минуту. Увеличивайте параметр recovery interval на свое усмотрение. Значение от 5 до 15 (минут) находится в обычных пределах, но ваш выбор зависит только от вашего согласия, чтобы пользователи ждали от 5 до 15 минут для восстановления базы данных в случае аварии системы. Обычно значение параметра recovery interval требуется увеличить, чтобы снизить частоту создания контрольных точек, предоставляя пользователям возможность более свободного выполнения операций ввода-вывода для их транзакций без прерывания.
Параметр recovery interval входит в группу дополнительных параметров: для его конфигурирования с помощью sp_configure вы должны задать значение 1 для параметра show advanced options. Вы можете задать этот параметр с помощью Enterprise Manager, щелкнув на вкладке Database Settings (Параметры базы данных) окна SQL Server Properties и задав нужное значение в поле-счетчике Recovery Interval (min). Изменение этого параметра начинает действовать сразу – без необходимости закрытия и повторного запуска SQL Server.
Заключение
В этой лекции вы узнали о некоторых проблемах производительности, с которыми можете столкнуться как DBA. Вы узнали, как использовать System Monitor и Enterprise Manager для мониторинга системы и выявления узких мест, влияющих на производительность. Вы также узнали, как обнаруживать и разрешать наиболее распространенные проблемы производительности системы.
Этот курс провел вас через все "как, что и почему" в администрировании SQL Server 2000. Теперь вы сможете эффективно управлять своей системой и конфигурировать ее, а также легко и эффективно выполнять задачи повседневного администрирования. Авторы надеются, что вы с удовольствием прочитали этот курс.
Дополнения
Дополнение. Приложение А. Параметры конфигурирования Microsoft SQL Server
В этом приложении дается описание параметров конфигурирования Microsoft SQL Server. Здесь также описывается, как задавать значения этих параметров.
Параметры
Вы можете задавать параметры конфигурирования одним из двух способов: путем выбора свойств в окне SQL Server Enterprise Manager или путем использования системной хранимой процедуры sp_configure. Метод задания параметров с помощью Enterprise Manager описан ниже в этом приложении. Для использования хранимой процедуры sp_configure нужно запустить следующую команду:
sp_configure 'имя_параметра', значение
Например, вы можете задать значение 200 для параметра конфигурирования max worker threads с помощью следующей команды:
sp_configure 'max worker threads', 200 Go
Параметры конфигурирования SQL Server кратко описываются в следующих разделах. Полное описание этих параметров можно найти в SQL Server Books Online.
affinity mask
Параметр affinity mask (маска "родственности") является битовой переменной, которая указывает, на каких ЦП может выполнять свою работу SQL Server. Значение 0 (принятое по умолчанию) позволяет планировщику Microsoft Windows NT/2000 определять, на каких ЦП будет работать SQL Server. Поскольку это битовая переменная, то двоичное представление этого значения определяет, какие ЦП будут использоваться. Ниже приводятся пять первых двоичных значений.
0=0000 1=0001 2=0010 3=0011 4=0100
Например, если вы используете 4-процессорную систему, то можете задать для параметра affinity mask значение 15 (1111), чтобы SQL Server работал на всех ЦП.
allow updates
Параметр allow updates (разрешить модифицирование) позволяет пользователям с соответствующими привилегиями доступа непосредственно модифицировать системные таблицы. Если для параметра allow updates задано значение 0 (принятое по умолчанию), то системные таблицы можно модифицировать только с помощью системных хранимых процедур.
awe enabled
Параметр awe enabled (активизирована awe) разрешает использовать средство расширенной памяти Address Windowing Extensions (AWE) в Microsoft Windows 2000. Если для awe enabled задано значение 1, то разрешается использование памяти свыше 4 Гб.
C2 audit mode
Параметр C2 audit mode (режим аудита уровня C2) позволяет использовать режим аудита безопасности уровня C2. При этом аудите безопасности происходит протоколирование определенных событий в SQL Server, чтобы достичь безопасности C2.
cost threshold for parallelism
Параметр cost threshold for parallelism (порог стоимости для распараллеливания) указывает стоимость, которая определяет возможность распараллеливания запросов. Если стоимость запроса в последовательном режиме превышает значение cost threshold for parallelism, то запрос распараллеливается. Значение по умолчанию равно 5.
cursor threshold
Параметр cursor threshold (пороговое значение для курсора) указывает количество строк в наборе курсора, превышение которого приводит к асинхронному созданию набора ключей данного курсора. Если количество строк меньше значения cursor threshold, то наборы ключей создаются синхронно. Значение по умолчанию, равное –1, указывает, что все наборы ключей курсора будут создаваться синхронно.
default full-text language
Параметр default full-text language (язык по умолчанию для полнотекстового поиска) указывает идентификатор языка по умолчанию, который используется в SQL Server для индексирования с целью полнотекстового поиска. Значение по умолчанию 1033 – это идентификатор для U.S. English.
default language
Параметр default language (язык по умолчанию) указывает идентификатор для языка по умолчанию, используемого в SQL Server. Значение по умолчанию 0 – это идентификатор для U.S. English.
fill factor
Параметр fill factor (коэффициент заполнения) указывает, насколько плотно SQL Server будет заполнять индексные страницы при их создании. Значение 1 указывает, что страницы будут почти пустыми; значение 100 соответствует 100% заполнению индексных страниц. Значение по умолчанию, равное 0, указывает, что страницы-листья B-дерева будут заполняться до конца, а на страницах более высокого уровня некоторая часть будет оставаться свободной.
index create memory
Параметр index create memory (память для создания индекса) указывает количество памяти, используемое для сортировок при создании индекса. Значение по умолчанию, равное 0, указывает, что это значение будет определять SQL Server.
lightweight pooling
Параметр lightweight pooling (упрощенная организация пула), для которого задается значение TRUE (1) или FALSE (0), указывает, будет ли SQL Server использовать планирование режима "волокон" (fiber mode) для снижения количества переключений контекста. Переключения контекста сопровождаются большой дополнительной нагрузкой на систему; их количество будет снижаться, если SQL Server может выполнять собственное планирование. Значение по умолчанию, равное 0, указывает, что планирование режима "волокон" (fiber mode) не будет использоваться.
locks
Параметр locks (блокировки) указывает максимальное количество блокировок, которое может быть выделено на сервере. Значение по умолчанию, равное 0, указывает, что SQL Server будет динамически захватывать и освобождать блокировки. Вы можете следить за количеством блокировок в вашей системе с помощью Performance Monitor в Windows NT или Windows 2000; если вы видите много захватов и освобождений блокировок, то вам, вероятно, требуется выделять блокировки статически. Но в большинстве случаев следует использовать значение по умолчанию, равное 0.
max degree of parallelism
Параметр max degree of parallelism (максимальная степень распараллеливания) указывает максимальное количество потоков, которые могут быть выделены для параллельного выполнения. Значение по умолчанию, равное 0, указывает, что будут использоваться все ЦП в данной системе, что делает количество потоков равным количеству ЦП в системе. Значение 1 запрещает параллельное выполнение. Поскольку распараллеливание может повысить производительность запросов, ограниченных возможностями ввода-вывода, вам, возможно, потребуется задать более высокое значение для параметра max degree of parallelism. Максимальное значение – 32.
max server memory
Параметр max server memory (максимальная память сервера) используется для задания максимального количества памяти, которое может быть динамически выделено в SQL Server. Этот параметр используется в сочетании с параметром min server memory. Количество памяти, выделяемое в SQL Server, будет находиться между значениями, заданными для параметров min server memory и max server memory. Если вы хотите зарезервировать дополнительное пространство для процессов, отличных от SQL Server, то можете использовать этот параметр. Значение по умолчанию, равное 0, указывает, что SQL Server будет выделять память автоматически.
max text repl size
Параметр max text repl size (максимальный размер для репликации) указывает максимальное количество байтов текста и данных типа image, которое можно добавить к реплицируемой колонке в одном операторе SQL.
max worker threads
Параметр max worker threads (максимальное количество потоков) указывает максимальное количество потоков Windows, которые может использовать SQL Server. Этот параметр можно изменять, чтобы предоставлять больше потоков для обработки в SQL Server. Но если SQL Server использует слишком много потоков, это приводит к перегрузке операционной системы.
media retention
Параметр media retention (хранение носителя) указывает количество дней хранения носителя резервной копии. SQL Server не перезаписывает этот носитель резервной копии, пока не пройдет указанное количество дней.
min memory per query
Параметр min memory per query (минимальная память на один запрос). Этот параметр указывает минимальное количество памяти, которое будет выделяться на один запрос. Значение по умолчанию – 1024, но вы можете задать значение от 512 байтов до 2 Гб. Задание этого параметра таким образом, чтобы при запуске запроса выделялось указанное количество памяти, может способствовать повышению производительности при больших сортировках и операциях хеширования.
min server memory
Параметр min server memory (минимальная память сервера) используется в сочетании с параметром max server memory для задания минимального и максимального количества памяти, которое будет использовать SQL Server. Значение по умолчанию, равное 0, указывает, что SQL Server будет выделять память автоматически.
nested triggers
Параметр nested triggers указывает, может ли один триггер инициировать другой триггер. Принятое по умолчанию значение 1 указывает, что это разрешено.
network packet size
Параметр network packet size (размер сетевого пакета) указывает размер входных и выходных пакетов данных SQL Server. Принятое по умолчанию значение 4096 указывает размер пакета в 4 Кб. Если у вас много больших результирующих наборов, то вам, возможно, потребуется увеличить это значение
open objects
Параметр open objects (открытые объекты) указывает максимальное количество объектов, которые можно одновременно открыть в базе данных SQL Server. Принятое по умолчанию значение равно 500, максимальное значение – 2 миллиарда.
priority boost
Значение 1 параметра priority boost (приоритетный запуск) указывает, что SQL Server запускается с более высоким, чем обычно, приоритетом планировщика Windows NT/2000. Принятое по умолчанию значение 0 запрещает запуск с более высоким приоритетом. Если задать для этого параметра значение 1, это может повысить производительность SQL Server, но другим процессам может недоставать времени ЦП. Вам следует задавать это значение, только если SQL Server является единственной программой, работающей в системе Windows NT. Изменение этого значения может вызвать проблемы, если вы не будете проявлять аккуратность. Изменяйте этот параметр под свою ответственность.
query governor cost limit
Параметр query governor cost limit (предел оценки стоимости запроса в секундах) указывает максимальное количество времени (в секундах), допустимое для выполнения запроса. Прежде чем запустить запрос, оптимизатор запросов оценивает длительность выполнения этого запроса. При соответствующих значениях этот параметр препятствует запуску слишком больших запросов.
query wait
При недостатке памяти для запуска запроса SQL Server помещает этот запрос в очередь, пока не освободятся необходимые ресурсы. По умолчанию время ожидания в 25 раз превышает стоимость запроса. Задавая параметр query wait (время ожидания), вы указываете, тем самым, значение тайм-аута.
recovery interval
Параметр recovery interval (интервал восстановления) очень важен. Значение параметр recovery interval указывает максимальное количество времени, которое может потратить SQL Server на восстановление (воспроизведение) базы данных в случае отказа системы, и, тем самым, этот параметр определяет, насколько часто будут создаваться контрольные точки. Принятое по умолчанию значение 0 указывает, что SQL Server будет определять это значение автоматически.
remote access
Параметр remote access (удаленный доступ), имеющий значения Да (1) или Нет (0), указывает, допускаются ли входы по login-записям (учетным записям подключения) из удаленных систем SQL Server. Принятое по умолчанию значение 1 разрешает удаленные входы.
remote login timeout
Параметр remote login timeout (тайм-аут удаленного входа) указывает допустимое время ожидания (в секундах) при входе по удаленной login-записи. Значение по умолчанию равно 5.
remote proc trans
При значении параметра remote proc trans, равном 1, поддерживается соблюдение ACID-свойств для удаленных транзакций, выполняемых под управлением координатора распределенных транзакций MS DTC (Microsoft Distributed Transaction Coordinator).
remote query timeout
Параметр remote query timeout (тайм-аут удаленного запроса) указывает время (в секундах), после которого удаленный запрос будет прерван по тайм-ауту. Принятое по умолчанию значение 0 указывает, что запросы не будут прерываться по тайм-ауту.
scan for startup procs
Параметр scan for startup procs (сканирование для запуска процедур), имеющий значения Да (1) или Нет (0), указывает, будет ли SQL Server выполнять автоматическое сканирование для автоматического исполнения хранимых процедур. Принятое по умолчанию значение 0 указывает, что SQL Server не будет выполнять сканирование этих хранимых процедур,
set working set size
Параметр set working set size (установить размер рабочего набора) действует совместно с параметрами min server memory и max server memory. При установке этого параметра удаление ("откачка") страниц из памяти SQL Server не допускается, даже если SQL Server простаивает. Если вы хотите, чтобы SQL Server захватывал память динамически, не задавайте для этого параметра значение 1. Принятое по умолчанию значение 0 отключает параметр set working set size.
show advanced options
Если для параметра show advanced options (показать дополнительные параметры) задано значение 1, то вы можете использовать хранимую процедуру sp_configure для показа дополнительных параметров.
two digit year cutoff
Параметр two digit year cutoff (двузначный формат года) указывает интерпретацию двузначной записи года в SQL Server. Если год, заданный двумя цифрами, меньше значения, указанного этим параметром, то это 20xx год, и если он больше, то это 19xx год. Например, если для параметра two digit year cutoff задано значение 2049 (принятое по умолчанию), то 51 будет интерпретироваться как 1951 год, а 48 – как 2048 год.
user connections
Параметр user connections (количество подсоединений пользователей) указывает максимальное количество пользователей, которые могут одновременно подсоединяться к SQL Server. По умолчанию SQL Server динамически регулирует допустимое количество подсоединений пользователей, но это динамическое регулирование создает дополнительную нагрузку. Данный параметр позволяет вам задавать статически допустимое количество подсоединений пользователей.
user options
Параметр user options (параметры для пользователей) используется, чтобы задавать глобальные значения по умолчанию для всех пользователей.
Спецификации параметров
Некоторые из только что описанных параметров относятся к группе дополнительных параметров, в то время как остальные – стандартные параметры. Некоторые параметры начинают действовать сразу, а другие начинают действовать только после перезапуска SQL Server. В табл. A.1 приводится список параметров SQL Server вместе с их классификацией и необходимостью перезапуска, чтобы соответствующий параметр начал действовать.
Параметр | Дополнительный параметр | Требуется перезапуск |
---|---|---|
affinity mask | Да | Да |
allow updates | Нет | Нет |
awe enabled | Да | Да |
C2 audit mode | Да | Да |
cost threshold for parallelism | Да | Нет |
cursor threshold | Да | Нет |
default full-text language | Да | Нет |
default language | Нет | Нет |
fill factor | Да | Нет |
index create memory | Да | Нет |
lightweight pooling | Да | Да |
locks | Да | Да |
max degree of parallelism | Да | Нет |
max server memory | Да | Нет |
max text repl size | Нет | Нет |
max worker threads | Да | Да |
media retention | Да | Да |
min memory per query | Да | Нет |
min server memory | Да | Нет |
nested triggers | Нет | Нет |
network packet size | Да | Нет |
open objects | Да | Да |
priority boost | Да | Да |
query governor cost limit | Да | Нет |
query wait | Да | Нет |
recovery interval | Да | Нет |
remote access | Нет | Да |
remote login timeout | Нет | Нет |
remote proc trans | Нет | Нет |
remote query timeout | Нет | Нет |
scan for startup procs | Да | Да |
set working set size | Да | Да |
show advanced options | Нет | Нет |
two digit year cutoff | Нет | Нет |
user connections | Да | Да |
user options | Нет | Нет |
Изменение параметров с помощью Enterprise Manager
Вы можете модифицировать значения многих параметров SQL Server с помощью Enterprise Manager. Чтобы использовать Enterprise Manager для модифицирования значений параметров, нужно сначала открыть окно свойств SQL Server Properties. Для этого нужно щелкнуть правой кнопкой мыши на имени сервера в окне Enterprise Manager и выбрать из контекстного меню пункт Properties (Свойства). В каждом из следующих разделов дается описание параметров, содержащихся в одной из вкладок окна SQL Server Properties.
Вкладка General
Первая вкладка, которую вы видите в окне свойств, это вкладка General (Общие) (см. рис. A.1). Вкладка не содержит каких-либо базовых параметров конфигурирования, которые включены в другие вкладки. Однако вы можете задать в этой вкладке несколько параметров автозапуска (флажки Autostart) и параметров запуска. (Чтобы изменить значения параметров запуска щелкните на кнопке Startup Parameters.)
Рис. A.1. Вкладка General (Общие) окна SQL Server Properties
Вкладка Memory
Вкладка Memory (Память) показана на рис. A.2. В этой вкладке вы можете задать, как SQL Server будет выделять память – динамически или будет использовать фиксированное количество памяти. Чтобы задать этот параметр, щелкните на соответствующей кнопке выбора и переместите соответствующие ползунки. Во вкладке Memory вы можете также задавать минимальное количество памяти, которое SQL Server будет использовать для одного запроса.
Рис. A.2. Вкладка Memory (Память) окна SQL Server Properties
Во вкладке Memory задаются следующие параметры конфигурирования:
- min server memory;
- max server memory;
- min memory per query
Вкладка Processor
Вкладка Processor (Процессор) показана на рис. A.3. В этой вкладке вы можете выбирать ЦП (CPU), которые может использовать SQL Server. Вы можете задать с помощью соответствующих флажков максимальное количество потоков (Maximum worker threads), приоритетное выполнение SQL Server (Boost SQL Server priority) и использование "волокон" Windows (Use Windows NT fibers). И, наконец, вы можете указать, как SQL Server будет выполнять распараллеливание запросов (секция Parallelism).
Рис. A.3. Вкладка Processor (Процесс) окна SQL Server Properties
Во вкладке Processor задаются следующие параметры конфигурирования:
- affinity mask;
- max worker threads;
- priority boost;
- lightweight pooling;
- max degree of parallelism;
- cost threshold for parallelism.
Вкладка Security
Вкладка Security (Безопасность) показана на рис. A.4. В этой вкладке не задаются какие-либо параметры настройки. Вы можете задать здесь метод аутентификации (секция Authentication), уровень аудита (Audit level) и учетную запись Windows для запуска и выполнения SQL Server.
Рис. A.4. Вкладка Security (Безопасность) окна SQL Server Properties
Вкладка Connections
Вкладка Connections (Соединения) показана на рис. A.5. Эта вкладка содержит ряд параметров, относящихся к соединениям пользователей. Здесь вы можете задать максимально допустимое количество подсоединений пользователей и уровень проверки ограничений. В секции Remote Server Connections (Соединения с удаленным сервером) вы можете разрешить использование RPC-соединений (с удаленным вызовом процедур) и выполнение распределенных транзакций, а также задать длительность тайм-аута запросов.
Во вкладке Connections задаются следующие параметры:
- user connections;
- user options;
- remote access;
- remote query timeout;
- remote proc trans.
Рис. A.5. Вкладка Connections (Соединения) окна SQL Server Properties
Вкладка Server Settings
Вкладка Server Settings (Параметры сервера) показана на рис. A.6. В этой вкладке вы можете задавать общие параметры сервера. Здесь можно задать язык по умолчанию для пользователя. Вы можете также задать параметры, разрешающие модифицирование каталога и запуск триггерами других триггеров, а также можете активизировать использование "регулятора" запросов (query governor). Вы можете также задать почтовый профиль и поддержку двузначной записи года.
Рис. A.6. Вкладка Server Settings (Параметры сервера) окна SQL Server Properties
Параметры вкладки Server Settings используются для задания следующих параметров:
- default language;
- allow updates;
- nested triggers;
- query governor cost limit;
- two digit year cutoff.
Вкладка Database Settings
Вкладка Database Settings (Параметры базы данных) показана на рис. A.7. В этой вкладке вы можете задать коэффициент заполнения (fill factor), а также параметры резервного копирования и интервал восстановления (recovery interval). Кроме того, здесь можно задать местоположение файлов по умолчанию. Это местоположение будет использоваться для создания новых баз данных, если оно не указано в команде создания базы данных.
Рис. A.7. Вкладка Database Settings (Параметры базы данных) окна SQL Server Properties
Во вкладке Database Settings задаются следующие параметры:
- fill factor;
- media retention;
- recovery interval.
Вкладка Replication
Вкладка Replication (Репликация) показана на рис. A.8. Эта вкладка используется для просмотра и задания параметров опубликования и распространения репликации. Здесь вы можете также добавить текущую систему в группу мониторинга репликации. Это позволяет группировать вашу систему с другими системами при мониторинге репликации.
Вкладка Active Directory
Вкладка Active Directory (см. рис. A.9) используется для модифицирования записей Active Directory. Вы можете добавить текущую систему в Active Directory, обновить ее статус в Active Directory или удалить эту систему из Active Directory.
Рис. A.8. Вкладка Replication (Репликация) окна SQL Server Properties
Рис. A.9. Вкладка Active Directory окна SQL Server Properties
Дополнение. Приложение B. Параметры конфигурирования Microsoft SQL Server
В Microsoft SQL Server включены объекты и счетчики, которые используются монитором производительности для мониторинга процессов в системах SQL Server. Объекты представляют ресурсы Microsoft Windows и SQL Server, и каждый объект содержит один или несколько счетчиков, которые следят за различными аспектами этого объекта. В этом приложении приводится каждый объект и его счетчики. В статье для каждого счетчика содержится краткое описание данных, возвращаемых этим счетчиком, и статьи для некоторых счетчиков содержат дополнительную информацию.
Объект SQL Server: Аccess Methods
Данный объект содержит счетчики, которые следят за различными методами и свойствами доступа к объектам. Это следующие счетчики.
- Extent Deallocations/sec. Количество экстентов в секунду, освобождаемых системой SQL Server.
- Extents Allocated/sec. Количество экстентов в секунду, выделяемых системой SQL Server.
- Forwarded Records/sec. Количество записей в серБ¤ZQV рБ¤ZQV АИџZQV 0:ўZQV XВ¤ZQV В¤ZQV @ В¤ZQV Fetches/sec.Количество страниц в секунду, возвращаемых при сканировании свободного пространства.
- FreeSpace Scans/sec.Количество сканирований в секунду, выполняемых для поиска свободного пространства, чтобы выполнить вставку записи.
- Full Scans/sec. Количество полных сканирований в секунду таблиц или индекса. Если этот счетчик показывает значение больше 1 или 2, то вам следует проанализировать свои запросы, чтобы определить, насколько необходимы эти сканирования таблиц, или выяснить, возможна ли оптимизация этих запросов.
- Index Searches/sec.Количество поисков в секунду, выполняемых в индексе. Это может быть поиск одной записи или запуск сканирования в диапазоне индексов.
- Mixed Page Allocations.Количество выделяемых страниц в секунду, которые используются для хранения первых восьми страниц, выделяемых для экстента или индекса.
- Page Deallocations/sec.Количество освобождаемых страниц в секунду.
- Page Splits/sec Количество расщеплений страниц в секунду, которые происходят в результате переполнения индексной страницы.
- Pages Allocated/sec. Количество страниц в секунду, выделяемых для индекса или хранения данных.
- Probe Scans/sec.Количество сканирований в секунду, выполняемых для непосредственного поиска строк в таблицах или индексах.
- Range Scans/sec. Количество сканирований в секунду в диапазоне индексов.
- Scan Point Revalidations/sec. Количество повторений в секунду для перепроверки точки сканирования, прежде чем продолжить сканирование.
- Skipped Ghosted Records/sec. Количество "фантомных" записей в секунду, пропущенных во время сканирования.
- Table Lock Escalations/sec.Количество повышений статуса блокировки по таблице.
- Workfiles Created/sec.Количество созданных за секунду рабочих файлов (используемых при исполнении запроса).
- Worktables Created/sec. Количество созданных за секунду рабочих таблиц (используемых операторами GROUP BY, ORDER BY и UNION ).
- Worktables From Cache Ratio. Процент рабочих таблиц, созданных с того момента, когда начальные страницы стали доступны в кэше рабочих таблиц.
Объект SQL Server: Backup Device
В этом объекте имеется один счетчик, который определяет производительность устройств резервного копирования. Каждый экземпляр этого объекта содержит свой собственный счетчик.
- Device Throughput Bytes/sec.Количество байтов в секунду, передаваемых на устройство резервного копирования во время операции резервного копирования. Это полезно для мониторинга производительности и распределения операций ввода-вывода, выполняемых на устройстве резервного копирования.
Объект SQL Server: Buffer Manager
Данный объект содержит ряд счетчиков, относящихся к буферному кэшу SQL Server. Это следующие счетчики.
- AWE Lookup Maps/sec. Количество вызовов в секунду AWE-отображений для страниц в буферном пуле. Поскольку AWE использует "окно" памяти, где содержатся реальные страницы, то требуется выполнять отображения этого окна. Этот счетчик показывает количество вызовов в секунду этих отображений.
- AWE Stolen Maps/sec. Количество вызовов в секунду AWE-отображений для страниц, захваченных из буферного пула.
- AWE Unmap Calls/sec. Количество вызовов в секунду AWE-отображений для отключения от адресного пространства. При каждом вызове можно отключать один или несколько буферов.
- AWE Unmap Pages/sec. Количество отключаемых AWE-страниц в секунду.
- AWE Write Maps/sec. Количество вызовов в секунду AWE-отображений в "черновой" буфер, вызывающих запись на диск.
- Buffer Cache Hit Ratio. Процент страниц, найденных в памяти, т.е. не требующих физической операции ввода-вывода. Это показатель того, насколько хорошо используется буферный кэш.
- Checkpoint Pages/sec. Количество страниц в секунду, записанных на диск процессом создания контрольной точки. Процесс создания контрольной точки вызывает сброс всех "черновых" страниц на диск. В результате этого процесса снижается время восстановления (воспроизведения) после отказа, и частота его запуска определяется параметром конфигурирования recovery interval (интервал восстановления). Если этот счетчик постоянно показывает высокое значение, это может быть признаком того, что в вашей системе слишком часто создаются контрольные точки. Вам следует задать частоту создания контрольных точек, исходя из ваших потребностей. Частое создание контрольных точек гарантирует быстрое восстановление; снижение частоты создания контрольных точек повышает производительность. Кроме того, этот счетчик следит за количеством страниц, записанных другими операциями, которым требуется сброс всех черновых страниц на диск.
- Database Pages. Текущее количество страниц, образующих кэш SQL Server. Поскольку буферный кэш SQL Server создается динамически, этот счетчик можно использовать как показатель размера кэша. Вы можете следить за этим счетчиком, чтобы видеть, как изменяется размер кэша во времени. Если размер кэша существенно изменяется несколько раз за день, то вам, возможно, требуется изменить размер кэша с помощью параметров min server memory (минимальная память сервера) и max server memory (максимальная память сервера). Дело в том, что при динамическом выделении и освобождении памяти используются значительные системные ресурсы, такие как ЦП и подсистема ввода-вывода.
- Free List Stalls/sec. Количество запросов в секунду, которые ждут освобождения какой-либо страницы, прежде чем продолжится их выполнение.
- Free Pages. Количество страниц по всем свободным спискам. Свободный список – это связанный список всех доступных для использования страниц. Это количество свободных (неиспользуемых, но выделенных) буферов в буферном кэше. Не стоит беспокоиться, если значение этого счетчика кажется вам слишком низким. Напомним, что SQL Server динамически создает буферы, когда они требуются.
- Lazy Writes/sec. Количество буферов в секунду, записываемых потоком откладываемой записи (lazy writer). Lazy writer освобождает черновые буферы с помощью алгоритма LRU (запись наиболее давно обрабатывавшихся страниц).
- age Life Expectancy. Оценка времени (количество секунд), в течение которого страница будет оставаться в буферном пуле, прежде чем будет записана на диск (если к ней не будет обращений).
- Page Lookups/sec. Количество запросов в секунду для поиска страницы в буферном пуле.
- Page Reads/sec. Количество запросов чтения физической страницы базы данных в секунду.
- Page Writes/sec. Количество запросов записи физической страницы базы данных в секунду.
- Procedure Cache Pages. Количество страниц, используемых для кэша процедур. В кэше процедур содержатся откомпилированные запросы.
- Readahead Pages/sec. Количество страниц в секунду, которые считывает SQL Server, прогнозируя поступление запроса пользователя. SQL Server прогнозирует поступление запросов, исходя из предыдущих запросов.
- Reserved Pages. Количество зарезервированных страниц в буферном кэше.
- Stolen Pages. Количество страниц, захваченных из буферного пула в соответствии с запросом памяти.
- Target Pages. Оптимальное количество страниц (по оценке SQL Server) в буферном пуле.
- Target Pages. Оптимальное количество страниц (по оценке SQL Server) в буферном пуле.
Объект SQL Server: Cache Manager
Этот объект используется для просмотра статистики Cache Manager. Каждый из этих счетчиков может следить за следующими экземплярами данного объекта: Adhoc SQL Plans, Misc. Normalized Trees, Prepared SQL Plans, Procedure Plans, Replication Procedure Plans и Trigger Plans. Это следующие счетчики.
- Cache Hit Ratio. Соотношение между количеством попаданий и непопаданий в кэш. Этот счетчик очень полезен, если вы хотите определить, насколько эффективно используется кэш SQL Server для вашей системы. При низком значении этого счетчика вам, возможно, требуется дополнительная память.
- Cache Object Counts. Количество кэш-объектов в кэше.
- Cache Pages. Количество 8-килобайтных страниц, используемых объектами кэша.
- Cache Use Counts/sec. Количество использований в секунду каждого типа кэш-объектов.
Объект SQL Server: Databases
Этот объект содержит набор счетчиков, которые следят за каждой базой данных в системе. Выбранный экземпляр объекта представляет базу данных, за которой вы хотите следить. Вы можете следить за базами данных master, model, msdb и tempdb, а также за базой данных Northwind, pubs и всеми базами данных, которые создаются пользователями. Это следующие счетчики.
- Аctive Transactions. Количество активных транзакций в базе данных.
- Backup/Restore Throughput/sec. Производительность активных операций резервного копирования и восстановления в секунду.
- Bulk Copy Rows/sec. Текущее количество строк в секунду, копируемых с помощью операции массового копирования.
- Bulk Copy Throughput/sec. Текущее количество килобайтов в секунду, копируемых с помощью операции массового копирования.
- Data File(s) Size (KB). Суммарный размер (в Кб) всех файлов данных в базе данных.
- DBCC Logical Scan Bytes/sec. Интенсивность логических операций чтения при сканировании для команд DBCC.
- Log Bytes Flushed/sec. Количество байтов журнала в секунду при сбросе на диск.
- Log Cache Hit Ratio.Процент операций чтения журнала, выполненных из кэша журнала.
- Log Cache Reads/sec. Количество операций чтения кэша журнала в секунду.
- Log File(s) Size (KB). Суммарный размер файла или файлов журнала в килобайтах.
- Log File(s) Used Size (KB). Текущий суммарный объем пространства, используемого в файле или файлах журнала.
- Log Flush Wait Time. Суммарное время ожидания для сбросов журнала на диск (в миллисекундах).
- Log Flush Waits/sec. Количество ожиданий в секунду для сбросов журнала на диск.
- Log Flushes/sec. Количество сбросов журнала на диск в секунду.
- Log Growths. Количество увеличений журнала, т.е. сколько раз происходило самостоятельное расширение журнала.
- Log Shrinks. Количество уплотнений журнала, т.е. сколько раз происходило самостоятельное уплотнение журнала.
- Log Truncations. Количество усечений журнала, выполненных для соответствующей базы данных.
- Percent Log Used. Процент используемой части журнала.
- Repl. Pending Xacts. Количество ожидающих транзакций репликации в базе данных.
- Repl. Trans. Rate. Количество транзакций репликации в секунду.
- Shrink Data Movement Bytes/sec. Скорость перемещения данных с помощью операции autoshrink или команды DBCC.
- Transactions/sec. Количество транзакций в секунду для базы данных. Этот счетчик показывает интенсивность операций в вашей системе. Чем выше это значение, тем больше операций происходит в системе.
Объект SQL Server: General Statistics
Счетчики этого объекта дают вам некоторую общую информацию о подсоединениях пользователей к SQL Server. Это следующие счетчики.
- Logins/sec. Количество входов по login-записям в секунду.
- Logouts/sec.Количество выходов в секунду.
- User Connections. Текущее количество подсоединенных пользователей. Этот счетчик полезно использовать, поскольку он указывает точное количество подсоединенных пользователей.
Объект SQL Server: Latches
Этот объект используется для показа статистики по защелкам. Защелки (latches) – это внутренние механизмы блокирования, используемые в SQL Server. Данный объект дает информацию по этим внутренним защелкам и содержит следующие счетчики.
- Average Latch Wait Time (ms). Среднее время ожидания механизма защелки потоком SQL Server (в миллисекундах). Большое значение указывает, что ваша система, возможно, подвержена серьезным проблемам конкуренции потоков.
- Latch Waits/sec. Количество ожиданий механизма защелки в секунду. Большое значение указывает, что в вашей системе имеется высокий уровень конкуренции за ресурсы.
- Total Latch