• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Carlton doe. administering informix dynamic server. building the foundation
 

Carlton doe. administering informix dynamic server. building the foundation

on

  • 4,398 views

Informix Stuff

Informix Stuff

Statistics

Views

Total Views
4,398
Views on SlideShare
4,393
Embed Views
5

Actions

Likes
0
Downloads
27
Comments
0

3 Embeds 5

http://www.slashdocs.com 3
http://www.slideshare.net 1
http://www.docseek.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Carlton doe. administering informix dynamic server. building the foundation Carlton doe. administering informix dynamic server. building the foundation Document Transcript

    • Основы администрирования Informix Dynamic ServerБлагодарностиЯ не могу поверить, что окончил еще одну книгу. Всякий раз я говорил себе, что вот она –последняя книга, и вот сейчас я закончил писать эту книгу и начал следующую.Прежде всего, хочу поблагодарить вас за покупку. Есть другие книги, которые вы моглиприобрести, но ваш выбор пал на эту. Я могу предположить, что вы купили книгу за своиденьги, а не за счет компании. В этом случае я особенно благодарен. В любом случаенадеюсь, что книга пригодится вам как источник ответов на вопросы и для лучшегопонимания работы Informix Dynamic Server. Окидывая взглядом промежуток времени с конца 90-х годов по сегодняшний день, могусказать, что это были прекрасные годы. Компания Informix была приобретена IBMСообщество Informix выжило и сейчас процветает. Informix расцвел благодаря IBM,Группа разработки IDS сконцентрирована на создании самого лучшего сервера БД длясуществующих и будущих заказчиков. Это БД-эквивалент выражения «если вы создадите,они придут». Как я писал в предисловии к моей небольшой книге о IDS 11.10, я оченьгорд, что могу представить работу этой группы. Они создали новые возможности, такиекак MACH-11 и значительное повышение производительности, одновременно облегчивадминистрирование сервера. Я восхищаюсь тем, что будет сделано в новых релизах инасколько лучше станет сервер. Я решил написать эту книгу и ее продолжение, поскольку IBM активно продвигает IDSна рынке. Активные и потенциальные пользователи, а также другие компании-разработчики знают, что IDS возвращается. Я хочу внести свою лепту в поддержку и ростсообщества IDS.Написание книги – нелегкая задача, даже если вы делали это неоднократно. Были ибессонные ночи, и бесконечные вздохи, когда я пытался заставить себя взглянуть вмонитор и написать хотя бы страницу. Иногда казалось, что слова сами срываются спальцев, и я силой заставлял себя пойти спать, чтобы утром добраться до работы.К счастью, мне помогали многие люди. Рискуя забыть кого-то, я все-таки хочупоблагодарить тех, кто сделал выход этой книги возможным. Прежде всего хочу поблагодарить инженеров Informix, которые отвечали на мои вопросыи оказывали техническую поддержку, особенно John Miller, Jonathan Leffler, Jacques Roy,Scott Pickett, Mark Jamison, Guy Bowerman, Amit Dandekar, Charles Gonsalves, Paul-JohnTo.За техническое редактирование спасибо Edgar Sanchez, Mark Jamison, Sudhir Katke, RandyHouse, Suma Vinod, Sanjit Chakraborty Я всегда буду в долгу у Jacques Roy за его работу. Он написал Java-методы определенияразмера таблиц. Спасибо Jerry Keesee за то, в своем плотном графике он нашел время и написалпредисловие к книге, а также за помощь, которую он мне всегда оказывал. Susan Visser из IBM Publishing всегда была стойким защитником книг по IDS, благодаряей вышли мои книги по Informix, в том числе и эта. Cathy Elliott – волшебница из мираIBM Marketing. Она всегда оказывала мне всю возможную поддержку, как и MichaelSpano – мой менеджер. Мне также помогали многие люди из International Informix Users Group (IIUG), особенноLester Knutsen, Walt Hultgen, Stuart Litel, Cindy Lichtenauer, Alexander Koerner и многиедругие. Если вы с легкостью прочтете книгу, обязательно скажите спасибо Katie Tipton. Яработал со многими редакторами, но Katie – лучшая. Она отредактировала многие мои
    • бессвязные мысли и логические пробелы в рукописи и исправила синтаксические ошибки,пропущенные мной и техническими редакторами. Jeff Phillips разработал обложку книги и не говорите мне, что обложка не важна.И, конечно, отдельное спасибо моей семье СодержаниеПредисловиеО книгеЧасть 1 Введение в Informix Dynamic Server Что такое Informix Dynamic Server Модель Informix Dynamic Server Основные термины ЗаключениеЧасть 2 Введение в расширяемость Что такое расширяемость и зачем вам это нужно Расширяемые типы данных Преобразования Определенные пользователем процедуры и агрегаты Функциональные индексы Датаблейды, блейдлеты и другие дополнения ЗаключениеЧасть 3 Подготовка к инициализации Логический дизайн базы данных Вычисление размеров таблиц Вопросы, связанные с жестким диском Что использовать для db-пространств – выделенные файлы или сырые устройства Вопросы проектирования db-пространств Настройка ядра Стратегии архивирования Установка окружения Вопросы, связанные с несколькими экземплярами сервера ЗаключениеЧасть 4. Установка и инициализация IDS Установка или обновление сервера Изменение конфигурационных параметров Первый запуск экземпляра Системные базы данных
    • ЗаключениеЧасть 5 Основные задачи администратора Утилиты администрирования Informix Изменение рабочих режимов Изменение режимов логирования Управление db- и BLOB-пространствами Создание, перемещение и изменение размеров логов. Автоматический запуск и останов IDS Управление доступом и безопасность Отстрел пользовательской сессии ЗаключениеЧасть 6 Создание окружения базы данных Утилита dbaccess Режимы логирования базы данных Создание базы данных Создание и партиционирование(partitioning) таблиц и индексов Ограничения, ссылочная целостность и индексы Внесение информации в базу данных Конкурентность и уровни изоляции Некоторые интересные SQL-запросы Утилита dbschema ЗаключениеЧасть 7 Архивирование и восстановление Стратегии архивирования Архивирование логического журнала Устройства для архивирования Как работает процесс архивирования Опции восстановления Использование утилиты ontape Использование ON-Bar и Informix Storege Manager Archecker и проверка архивов Использование Table-level restore ЗаключениеЧасть 8 Мониторинг экземпляра Новый интерфейс системного администрирования Утилиты командной строки Мониторинг системы и экземпляра с помощью ОАТ ЗаключениеПриложение
    • Вступительное словоЕсли вы держите в руках эту книгу, это значит, что вы открываете или уже открыли длясебя самый лучший OLTP-сервер БД. Я не могу назвать себя беспристрастным, так как я –начальник группы разработки Informix, но приобретенная квалификация позволяет мнеоценит инновации, внедренные в каждую часть этого замечательного продукта. Напротяжении последних 15-ти лет я имел счастье работать с наиболее талантливымиинженерами, сотрудниками поддержки, техническими писателями и полевымиспециалистами. За последние десятилетия технологии и аппаратное обеспечениеразвивались экспоненциально. Стали реальностью SOA, Web 2.0 и 3-D Интернет. Накаждом витке развития эта прекрасная группа инженеров и архитекторов предвосхищалитребования вашего бизнеса, а также совершенствовали базовые возможности продукта.Эта книга – портал в инновации и функциональность Informix с учетом последнихусовершенствований и обновлений. Многолетний опыт автора позволяет ему показатьчеткую перспективу развития Informix. Я знаю Карлтона на протяжении 10 лет. За это время он написал несколько прекрасныхкниг по IDS. В Карлтоне присутствует уникальная комбинация глубоких знаний Informixи таланта писателя и преподавателя. Эта книга – прекрасный ресурс и для существующих,и для новых пользователей Informix. Карлтон использует пошаговый подход в раскрытиивозможностей Informix – инициализация и инсталляция, архивирование и мониторинг. Вкнигу также включена информация о последних нововведениях в Informix – вплоть дотекущего 11-го релиза. С самого начала в разработку Informix было положено стремление предоставитьпользователям OLTP-возможности уровня Enterprise на основе архитектуры сминимальными затратами на администрирование. Другие могут обещать такое, мы ужесделали! Архитектура Informix обеспечивает производительность, возможность созданиявстраиваемых решений, масштабируемость с минимальными затратами наадминистрирование. Правильный выбор сервера БД может дать значительныепреимущества, и когда принятие решения базируется на технических возможностях, тоInformix – выбор лидеров. Возможно, вы даже не знаете, насколько широко используетсяInformix в мире. Под управлением Informix работают базы данных магазинов,совершаются он-лайновые банковские транзакции и проводится авторизация кредитныхкарт. Informix используется в службе «911», для бронирования авиабилетов, в системахGPS-навигации, телефонных маршрутизаторах, его применяют Konkan Railway в Индии,финансовые учреждения Китая, крупнейший поставщик молочных продуктов НовойЗеландии. Есть также множество других приложений, но о них я не могу рассказать.Благодаря своей надежности Informix используется для создания mission-criticalприложений. Есть возможность создавать приложения 24х7 с надежностью 99.999 ивыполнять масштабирование системы на недорогом аппаратном обеспечении. IDS 11выводит Informix на новый уровень надежности и масштабируемости: кластеры активный-активный могут разделять один диск, есть возможность управлять географическиудаленными репликами. Для управления этим функционалом есть понятные GUI-инструменты, позволяющие заказчикам масштабировать систему без сложных аддонов.Редакции Informix есть для всех популярных ОС – Linux, UNIX, Windows, Linux дляzSeries и даже для Mac OS X. Наши заказчики и партнеры работают вместе с нами надформированием направлений развития продукта. Написанием этой книги Карлтон выполнил значительную работу по изложению основадминистрирования Informix в понятном виде. Он преподносит подарок всем энтузиастамInformix. Наслаждайтесь книгой. Я надеюсь информация, представленная в книге,поможет вам еще раз взглянуть на работу сообщества Informix. Jerry Keesee, начальник отдела разработки Informix
    • О книге.Поскольку вы читаете книгу, я могу предположить, что вы или администратор базыданных (DBA) , или отвечаете за обслуживание окружения базы данных под управлениемInformix Dynamic Server (таких людей я называю администраторами Dynamic Server -DSA). Я не знаю, новичок ли вы в этой работе или уже имеете опыт, и какой именно.Возможно, вы работали с другими СУБД под UNIX, а сейчас хотите установить иадминистрировать IDS. Если да, то вы откроете для себя новый мир. Или вы в первый разиспользуете промышленный сервер , а до этого работали с простыми СУБД. Выустанавливаете IDS, поскольку вам нужны надежность, функциональность, скорость, ихотите знать, что делать дальше. Вы тоже открываете для себя новый мир. Если вы похожи на меня, то, наверное, открытие коробки с дистрибутивом IDS было ивозбуждающим, и пугающим. Когда в мои руки попало то, что известно, как самыйбыстрый и архитектурно правильный сервер на рынке, я был возбужден. Мне нетерпелось установить его и оценить производительность. Одновременно я посетил сайтInformix и был устрашен количеством и размером документации. Поверхностный поисквыявил 32 книги и около 9000 страниц только по серверу без учета дополнительныхпродуктов типа DataBlades. Неужели сервер был настолько сложным, что требовалсятакой объем документации? На этот вопрос можно ответить и «да», и «нет». Да, сервер Informix сложнее, чем другиеСУБД, представленные сегодня на рынке, и имеет больше опций. С другой стороны длязапуска и настройки сервера нет необходимости изучать всю документацию. Вдокументации приведено подробное описание того, как работает сервер и почему онработает именно так. Документация IDS подробна , доступна для понимания изаслуживает изучения. Структура книгиВ книге я попытался соединить сухие сведения из документации и реальную жизнь.Расположение тем, как мне кажется, соответствует логическому порядку работы сокружением базы данных. Сначала вы спроектируете окружение, затем создадите инаполните его. Будете выполнять архивирование данных, мониторить и настраиватьсервер. Это самые важные задачи, и каждая из них разобрана в соответствующей части. Книга не ставит целью объяснить механизмы работы Informix, вместо этого онапредназначена для помощи в запуске и управлении СУБД. В книге описаны основные исамые важные задачи администратора, которые выполняются регулярно. В следующейкниге «Administering Informix Dynamic Server; Advanced Topics » мы поговорим орепликации, высокой доступности, распределенных транзакциях и других темах, ккоторым необходимо подробное объяснение. Надеюсь, что вы приобретете и вторуюкнигу. Предполагаемая аудитория.Книга написана в расчете на новичков в Informix, а также на тех, кто переходит с раннихверсий. Я старался избегать объяснений на уровне битов и байтов. Если вам необходимопонимать работу сервера на таком уровне, стоит обратиться к руководствуадминистратора IDS и другой документации сервера. Большинство того, что описано вкниге, есть в официальной документации, поэтому не думайте, что книга сможет еезаменить. Не стоит, однако, полагать, что книга представляет собой обзор документации.Приведенные в книге рекомендации являются результатом долгой работы с Informix. Вофициальной документации этого нет. При написании книги я руководствовался одним важным предположением – я полагаю,что вы знаете концепции реляционных баз данных, а также что такое таблицы, столбцы идругие компоненты реляционной БД.к этим основам вы сможете добавить знаниеобъектно-ориентированных возможностей Informix.
    • Краткое содержаниеЧасть 1 – Введение в Informix Dynamic ServerЗдесь рассказывается о структуре IDS, а также представлены и объяснены ключевыеслова, используемые в книге.Часть 2 – Введение в расширяемостьЭта часть посвящена объектно-ориентированным возможностям Informix Dynamic ServerЧасть 3 – Подготовка к инициализацииЗдесь затронуто множество вопросов по планированию окружения IDS. Разговор, вомногом, ведется обобщенно, поскольку нет общих правил построения окружения БД. Вконце объясняется, какие переменные окружения и файлы необходимо установить и какэто сделать.Часть 4 – Установка и инициализация IDSВ этой части описаны все необходимые для создания экземпляра или окружения БД шагии переменные. Даны рекомендации по значениям самых критичных конфигурационныхпараметров. В конце приведены данные о системных базах данных IDS. Эта часть болееконкретна, в отличии от предыдущих.Часть 5 – Основные задачи администрирования.Здесь мы поговорим о основных ежедневных задачах администрирования экземпляра: одобавлении и освобождении дискового пространства, запуске и остановке экземпляра,отстреле пользовательских сессий. Также в этой части представлены графическиеинструменты администрирования.Часть 6 – Создание окружения базы данных.Обсуждаются вопросы создания БД и наполнения ее данными: партиционирование таблици индексов, логирование, а также некоторые специфические для Informix SQL-запросы,знать которые будет весьма полезно.Часть 7 – Архивирование и восстановлениеОдна из самых малопривлекательных, но необходимых работ – архивирование БД наленту или диск. Мы поговорим о различных стратегиях архивирования, их преимуществахи недостатках. Я расскажу, как Informix может выполнять moment-in-time архивированиеи восстановление, без необходимости останавливать экземпляр. Подробно рассказываетсяо использовании утилиты ontape и комплекта утилит ON-Bar совместно с InformixStorage Manager (ISM)Часть 8 – Мониторинг экземпляраНа протяжении всей книги вы будете встречать вывод данных мониторинговымиутилитами Informix. В этой части мы сосредоточимся на работе с этими утилитами ипоговорим, что необходимо мониторить в первую очередь. В большинстве своем речь
    • будет идти о утилитах командной строки и функциональности, доступной в новомсредстве – Open Admin Tool (OAT) для Informix Соглашения, принятые в книгеВ книге использованы следующие соглашения:  Каждая часть начинается со списка тем, которые будут обсуждаться  Каждая часть заканчивается заключением, где приведены наиболее важные сведения, которые вам необходимо заполнить, а также говорится о том, какие вопросы будут обсуждаться в следующей части  Зарезервированные слова в примерах кода не выделены заглавными буквами, так как я считаю, что такое выделение только мешает читать код. Лично я использую заглавные буквы только в комментариях к исходным текстам, когда хочу привлечь внимание к важному месту.  Иногда вы будете видеть символ обратного слеша (). Он используется как маркер продолжения в примерах, которые разбиты на несколько частей. В действительности вам будет необходимо вводить все инструкции одной строкой.  На протяжении книги дополнительная информация будет выделяться с помощью специальных знаков.
    • Введение в Informix Dynamic ServerВ этой части  Архитектура сервера  Определение ключевых терминовВ независимости от того, новичок ли вы в Informix или переходите с младших версий вамнеобходимо знать как управлять сервером и использовать его функциональность. Цель этой книги – сделать процесс обучения более легким путем выделения того, чтовам необходимо знать для конфигурирования, запуска и настройки окружения БД. IDS.Хотя на первый взгляд Informix Dynamic Server может показаться похожим на другиеСУБД, он очень сильно другой. Вскоре вы убедитесь, что он более стабилен и надежен,проще управляем, чем другие сервера. В книге основное внимание уделяется IDS 11, который в чем-то похож на младшиеверсии сервера, а в чем-то радикально от них отличается. IDS 11 построен на полностьюмодифицированной архитектуре, которая была представлена в версии IDS 9.1. Несмотряна все изменения, сервер администрируется во многих случаях так, как и прежде Сегодня IDS - не «классический» сервер БД, скорее это «объектно-реляционный»сервер. Сервер включает в себя высокопроизводительное ядро, разработанное в начале1990-х годов (и постоянно улучшаемое) для использования преимуществ симметричноймногопроцессорной (symmetric multiprocessing SMP) и параллельной обработки (massivelyparallel processing MPP). Самым большим улучшением было внедрение в сервер объектно-ориентированного функционала в 1995 году, что предоставило разработчикам иадминистраторам новые возможности по моделированию баз данных и управлениюданными. На сегодня IDS предоставляет значительно больше возможностей посравнению со стандартным реляционным сервером БД. В этой части рассмотренаархитектура сервера и ее три основных компонента. Мы познакомимся со специальнойтерминологией Informix. После прочтения вы поймете, почему сервер получил свое имя,что такое поток, и из каких фундаментальных частей состоит сервер. Чтение книгипредполагает, что вы знакомы с языком SQL и концепциями реляционных и объектно-ориентированных баз данных. В изложении я не буду спускаться до уровня битов ибайтов; если вам необходим такой уровень подробности – обратитесь к официальнойдокументации продукта или посетите веб-сайт IBM.Что такое Informix Dynamic Server?Informix Dynamic Server – сервер баз данных или, пользуясь маркетинговым новоязом,«объектно-реляционная система управления базами данных» (object-reletional databasemanagement system ORDBMS). Сервер может работать как со стандартными(реляционными) типами данных (числа, символы), так и с объектно-ориентированными.Эта технология является расширением возможности сервера хранить данные не-ASCII вBLOB-объектах. Сегодня IDS позволяет значительно больше, чем просто писать байтовыйпоток на диск, как это происходит с BLOB. Используя соответствующие функции, выможете не только хранить «объект», но и искать в нем, изменять что-то и, вообще,выполнять любую операцию, имеющую смысл для этого «объекта» и поддерживаемуюфункцией. Этот новый функционал обычно называется расширяемость (extensibility). В общем случае задачей сервера БД является обеспечение такой обработки данных(хранение, изменение, удаление), которая защищает данные от компрометации илиизменения вне правил, установленных администратором. В IDS включены логические ифизические механизмы выполнения этих задач.
    • С логической точки зрения IDS обеспечивает возможность установить правила и условияне только для столбца в таблице, но и для определения места хранения строки на диске.Вы можете указать условия изменения или удаления элементов строки. Для выполненияразличных действий над БД можно использовать хранимые процедуры. С физической токи зрения IDS хранит набор логов, где записаны изменения в данных, ипредоставляет механизм блокировок для поддержания целостности данных. Дляминимизации простоя в случае поломки оборудования, балансирования нагрузки, обменаданными между различными БД сервер БД позволяет создавать копию всего окруженияБД или его части на том же физическом сервере или на отдельном сервере. IDS позволяетвыполнять архивирование и восстановление БД. Для отката пользовательской ошибки выможете выполнить восстановление БД на конкретный момент времени. Недавно в сервербыла добавлена возможность восстановления архива, сделанного на одном физическомсервере, на другом физическом сервере даже в том случае, когда сервера используютразные ОС. Informix Dynamic Server разработан на основе динамической масштабируемойархитектуры (Dynamic Scalable Architecture DSA) и позволяет эффективно использоватьвозможности современных компьютеров – многопроцессорность и большой объемпамяти. Исследования показывают, что при добавлении в компьютерных ресурсов(например, установка второго процессора) производительность Informix растет линейно. Основой DSA является распараллеливание процесса (process parallelization) ,илипараллельная обработка похожих задач. На рисунке 1.1. показана принципиальная схемаработы такого процесса Рисунок 1.1 Принципиальная схема параллельного выполнения запросаНа рисунке показано, как запрос может выполняться параллельно. Сначала происходитнесколько операций чтения с диска. Затем над результатами этого шага выполняютсяфункциональные операции. На каждом шаге данных, которые необходимо обработать,становится меньше,и результаты выполнения операции объединяются с результатамивыполнения всех операций на этом уровне. Наконец, сервер возвращает результирующий
    • набор данных клиентскому приложению. Этот алгоритм обработки запроса выполняетсябыстрее, чем последовательный, когда ожидается выполнение каждогошага передначалом следующего. Кроме выполнения клиентских запросов, IDS также распараллеливает выполнениеадминистративных операций – построение индексов, обновление статистики, проверку и,при необходимости, восстановление после сбоя. Такая функциональность Informixтребует мониторинга и настройки. Как администратор сервера, вы должны установитьнеобходимые ограничения на параллельную обработку запросов. Более подробно об этомбудет говориться в моей следующей книге «Administering Informix Dynamic Server,Advanced Topics». Архитектура IDS позволяет динамически выделять и освобождать необходимые ресурсы«железного» сервера. Например, вы можете сконфигурировать IDS на использованиех МБт оперативной памяти, у блокировок и т.п. При увеличении нагрузки IDS попробуетвыделить себе больше необходимых системных ресурсов. Вы можете ограничитьмаксимальное количество ресурсов, которые IDS может получить. Большинство конфигурационных параметров IDS может быть изменено и в тот момент,когда сервер обрабатывает пользовательские транзакции. IBM дорабатывает этувозможность в каждом новом релизе сервера, и сейчас эта работа близка к завершению. Именно возможность управлять необходимыми ресурсами и администрировать сервербез перезапуска характеризуются словом «dynamic». В дополнение к объектно-ориентированной технологии IDS предоставляетфункциональность, которая позволяет эффективно интегрировать прямо в базу данныхновые и сложные типы данных. Это могут быть геодезические данные, аудио/видео, XMLи другие пользовательские типы. IDS является нейтральным к используемым средствам разработки и поддерживаетмножество инструментов разработчика под управлением Linux, UNIX, Mac OS X,Microsoft Windows.Модель Informix Dynamic ServerАрхитектура сервера БД во многом определяет его производительность,масштабируемость, возможность поддерживать новые типы данных. Почти всесовременные серверы БД построены на устаревшей модели, которая предполагает запускотдельного процесса для выполнения запросов каждого пользователя. Эта архитектурахорошо работала, если размер БД и количество пользователей были невелики. Сегоднятакие сервера БД запускают сотни, а иногда и тысячи, процессов, управлением которомизанимается ОС. Система с одним ЦП может обрабатывать один процесс в квант времени, затем онапереключается на другой и так далее. Поэтому процесс пользователя вынужден ждать,когда ОС снова даст ему выполняться. Масштабирование таких систем не зависит отпрограммной составляющей, а зависит только от скорости процессора. Как я упомянул впредыдущем разделе, архитектура Informix (DSA)специально создана для работы снесколькими процессорами и большими объемами оперативной памяти. DSA включает всебя встроенную многопоточность и распараллеливание, динамическое управлениепамятью. Основными элементами архитектуры Informix Dynamic Server являются:  Процессорный компонент  Разделяемая память  Дисковый компонентДавайте рассмотрим каждый из них.
    • Процессорный компонентIDS обеспечивает возможность масштабировать окружение БД путем настройки пулапроцессов сервера БД – виртуальных процессоров(VPs). В следующей книге мырассмотрим механизмы работы этих процессоров. Как можно увидеть на рисунке 1.1., IDSразбивает пользовательские запросы на отдельные подзадачи (сканирование таблиц,объединение, группировка, сортировка), каждая из которых обрабатывается виртуальнымпроцессором. Виртуальные процессоры очень похожи на обычные ЦП тем, как онипланируют пользовательские запросы и управляют ими. На рисунке 1.2 показано, какработает пул виртуальных процессоров IDS Рисунок 1.2 Пул виртуальных процессоров IDS Поток – это отдельная задача в процессе сервера БД. Множество потоков можетвыполняться одновременно, в параллель, в пуле виртуальных процессоров. В отличие отоднопоточного движка, где каждая задача выполняется в свой квант времени,виртуальные процессоры IDS являются многопоточными. Если какой-то поток ждетресурса или окончил свою работу, то виртуальный процессор сразу переключается навыполнение следующего потока. Таким образом максимально используются ресурсы ЦП.Эта возможность IDS называется «fan-in parallelism» и проиллюстрирована на рисунке 1.3
    • Рисунок 1.3 «Fan-in parallelism»Пользовательский запрос может быть распределен между несколькими виртуальнымипроцессорами. Например, если выполняется многотабличное объединение (multitable join),сервер БД разделит задачу на несколько подзадач, каждая из которых будет выполнятьсяна своем виртуальном процессоре. На рисунке 1.4 приведена иллюстрация этойвозможности, которая называется «fan-out parallelism». Рисунок 1.4 «Fan-out parallelism»
    • Суммарный эффект от этих двух типов распараллеливания – за единицу временивыполняется больше операций. Иными словами, сервер БД работает быстрее. Поскольку потоки не привязаны к виртуальным процессорам, IDS выполняетдинамическое балансирование нагрузки. Виртуальные процессоры можно объединять вгруппы, оптимизированные для выполнения какой-то конкретной задачи. Иллюстрацияэтого факта приведена на рисунке 1.5, где показаны виртуальные процессоры,оптимизированные для операций с ЦП, ввода/вывода, связи, административных задач. Рисунок 1.5 Виртуальные процессоры IDS, оптимизированные для выполненияотдельных функций.Виртуальные процессоры IDS имеют средства мониторинга, позволяющие отследитьдеятельность пользователей и сервера БД. В однопоточных серверах БД каждая операцияпредставляет собой независимый процесс в ОС со своими стеком данных, кэшеминструкций, что затрудняет мониторинг того, что происходит в сервере БД. В IDSпредусмотрены утилиты onstat и oncheck , которые позволяют легко увидеть, кто и чтоделает и как это влияет на систему. Вы можете сконфигурировать необходимое количество ВП каждого класса, а такжеопределить специальные ВП (определенные пользователем ВП). Эти ВП выполняютсяизолированно от ядра сервера, поэтому некорректно функционирующийпользовательский ВП не сможет привести к падению сервера. При необходимости можноизменять количество и тип ВП в то время, когда БД находится в on-line, например, приповышении нагрузки на сервер. В UNIX, Linux, Mac OS X использование многопоточныхвиртуальных процессоров значительно снижает количество процессов ОС, и какрезультат, вызывает меньше переключений контекста. В Windows ВП реализованы какпотоки и используют многопоточные возможности ОС. Поскольку IDS имеетсобственные возможности поддерживать несколько потоков для обслуживания
    • клиентских запросов, то ему нужно меньше потоков Windows, что снижает затраты ОС науправление потоками. Поскольку IDS полностью использует возможности ЦП, то ему нужно меньшеаппаратных мощностей, чем другому серверу БД. В исследованиях выявлено, что чтобыдостичь той же производительности, что и однопоточный или процессо-ориентированныйсервер БД, IDS необходимо 25-40 % ресурсов Такие возможности IDS позволят вамсэкономить некоторые деньги на закупке и обслуживании оборудования.Разделяемая памятьПоскольку все задачи сервер выполняет с помощью ВП, то и память сервера БДконсолидирована. Этот большой блок разделяемой памяти предоставляет IDSвозможность быстро пересылать данные между виртуальными процессорами, а такжепозволяет пользовательским приложениям получить данные прямо из памяти, если онитам есть по запросу другого пользователя, а не дергать лишний раз диск. Память внутриэтого блока многократно используется для обслуживания пользовательских запросов.Например, когда сессия пользователя заканчивается, потоко-специфичная память этойсессии очищается и может быть использована в другой сессии. Если для обслуживанияпользователей серверу БД необходимо больше памяти, он запрашивает у ОСдополнительную память. Предельный объем памяти, доступной серверу БД, указываетсяво время конфигурирования IDS. Когда дополнительная память больше не нужна, онаосвобождается. Динамическое управление памятью позволяет избежать проседанияпроизводительности сервера БД при увеличении нагрузки. Освобожденная памятьвозвращается под управление ОС и может быть использована другими процессами. Разделяемая память IDS состоит из четырех частей:  Резидентная часть  Виртуальная часть  Коммуникационная часть  Часть виртуального расширенияКогда стартует окружение БД, выделяются, по крайней мере, две частипамяти(управляются конфигурационными параметрами разделяемой памяти иподключений). В Части 4 описаны конфигурационные параметры разделяемой памяти.Ниже кратко описаны части разделяемой памяти IDSРезидентная частьЭта часть содержит, кроме всего прочего, общую информацию об окружении БД ибуферный пул. Также в этой части памяти размещены некоторые общесистемныеструктуры, системные таблицы, содержащие данные о чанках, db-пространствах,блокировках, транзакциях, зеркалах, пользовательских соединениях, буферы физическогои логического журнала. Информация из системных таблиц доступна через интерфейсмониторинга системы (System Monitoring Interface см Часть 4 ). В резидентной частиразделяемой памяти также располагается буфер репликации HDR (если она запущена).Подробно о репликации HDR смотрите в моей следующей книге. Самую большую часть резидентной области занимают регулярные буферы,используемые для хранения данных, используемых пользовательскими приложениями. Взависимости от характера операций в БД эти буферы могут помочь снизить количествоопераций дискового ввода/вывода. Когда пользовательское приложение запрашиваетнекоторые данные, сервер сначала пытается найти их в этих буферах. Увеличение размерапула буферов может сниить количество дисковых операций и тем самым поднять общуюпроизводительность системы, особенно для OLTP-приложений. В пуле буферов IDSхранит часто используемые индексные и табличные данные. Для хранения применяется
    • рейтинговая система. Когда некоторый элемент используется, его рейтинг повышается.Часть буферов хранит часто используемые данные, а другая часть – реже используемые.Для клиентского приложения такая сегментация данных абсолютно прозрачна. Когдаданные запрашиваются реже, они перемещаются из буфера часто используемых в буферреже используемых. В версиях IDS до 10 все буферы в зависимости от версии ОС имели размер 2 Кб или 4КБ. Размер буфера совпадал с размером страницы диска. В IDS 10 появилась возможностьсоздавать db-пространства с разным размером страниц. Максимальный размер страницыравен 16 КБ. Для каждого размера страницы может существовать только один пулбуферов, поэтому если вы создадите три db-пространства с размером страницы 8 КБ, онибудут делить один 8 КБ пул буферов. Для управления буферами используются конфигурационные параметры BUFFERPOOL,BUFFERS, LRU и некоторые другие. Сервер БД может самостоятельно управлять этипараметрами. Поскольку в резидентной части разделяемой памяти хранятся пользовательские данные,эта часть памяти существует всегда.Виртуальная частьСодержит стеки потоков, а также пулы памяти для следующих операций и данных  Сортировки данных  Кэширования словарей БД, содержащих информацию о таблицах и индексах БД  Кэширования данных из функций, определенных пользователем  Пула больших буферов для ВП асинхронного ввода/вывода (AIO VP)  Хранения откомпилированных версий хранимых процедур  «Глобального» пула  Некоторых таблиц мониторинга окружения.В виртуальном разделе также хранятся кэшированные планы для оптимизатора IDS. Вбольшинстве OLTP-приложений в течении операционного дня выполняются одинаковыеSQL-запросы с немного разными условиями (например, в запросе меняетсяидентификационный номер контрагента). Для выполнения запроса сервер БД строит план,как быстрее всего получить требуемые данные. Если данные уже находятся в буфере, тоони считываются оттуда, если нет, то требуется обращение к диску. В этом случаеоптимизатор строит план выполнения запроса. Оптимизатор ищет подходящий индекс(если есть), строит список db-пространств, которые необходимо просмотреть и т.д. Этотпроцесс незаметен для пользователей, но от него зависит время отклика системы. Informix имеет механизм кэширования плана. В кэше может храниться план выполнениязапроса для использования этого плана последующими такими же запросами. Эта областьпамяти хранит сам SQL-запрос и информацию, необходимую оптимизатору для быстроговыполнения запроса. Вы можете сконфигурировать размер кэша и время попадания планав кэш (например, после выполнения двух запросов). В большинстве случаев, чтобы нехранить в кэше план одиночного запроса, план помещается в кэш после выполнениязапроса три или более раз. Если вам необходимо обновить планы выполнения запросов,вы можете очистить кэш. Например, это можно сделать после выполнения командыupdate statistics. Еще один интересный элемент виртуальной части – пул больших буферов. Предыдущиеверсии сервера имели два типа буферов – регулярные и большие. Регулярные буферыбыли очень похожи на буферы, хранимые в резидентной части разделяемой памяти.Большой буфер имел размер 8 страниц и использовался для буферирования большихпоследовательных объектов, например, блобов. В последней версии IDS для каждого AIO ВП (ВП асинхронного ввода/вывода)выделяется большой буфер. Размер буфера определяется ОС, но он значительно больше,
    • чем в предыдущих версиях IDS. Буфер такого размера полезен при выполнении обработкиконтрольной точки (checkpoint) и для чтения большого объема данных при выполнениисложных аналитических запросов. После того, как данные помещены в большой буфер,для использования они перемещаются в буферный пул в резидентной части памяти.BLOB-объекты Informix читает и пишет через большой буфер, а не через резидентнуючасть памяти. Ниже в этой части мы рассмотрим уже использованную терминологию –страница данных, контрольная точка, BLOB. В зависимости от выполняемых сервером задач, объем виртуальной части памяти можетменяться. Как я говорил выше, это динамическая часть памяти. Начальный размервиртуальной части памяти настраивается конфигурационным параметромSHMVIRTSIZE. Параметр SHMADD определяет размер дополнительно запрашиваемойпамяти, а параметр SHMTOTAL указывает, сколько всего разделяемой памяти можетзапросить сервер. Виртуальная часть разделяемой памяти существует при работе любого сервера Informix.Коммуникационная частьСуществует только в том случае, если настроено соединение с сервером черезразделяемую память. Вы должны определить каждый необходимый вам протоколсоединения с сервером IDS. Если вы включите протокол соединения через разделяемуюпамять, приложения, выполняющиеся на одном железном сервере с IDS, будутсоединяться с Informix через разделяемую память. В части 4 мы рассмотрим возможныепротоколы соединения с сервером и параметр NETTYPE. В двух словах, прииспользовании сетевых протоколов для связи с IDS обмен данными между сервером иприложением идет через глобальный пул виртуальной части разделяемой памяти.Часть виртуального расширенияЭта часть разделяемой памяти выполняет две функции. Здесь UDVP (определенныйпользователем ВП) выполняет DataBlade или определенную пользователем функцию(UDR). Такой подход защищает сервер от падения из-за «кривой» UDR. Наличие этогораздела разделяемой памяти зависит от конфигурации сервера БД.Дисковый компонентВ большинстве инсталляций IDS на UNIX и UNIX-подобных ОС сервер БД управляетобменом с дисками самостоятельно без участия ОС. В большинстве случаев данныехранятся на разделах диска без файловой системы – так называемые, сырые устройства(raw disk space). Данные с таких разделов читаются и пишутся с использованием прямогодоступа к памяти (direct memory access DMA) и последовательного доступа к сырымустройствам (raw sequential access method RSAM). Механизм RSAM обеспечиваетбольшую, по сравнению с использованием файловой системы UNIX, производительность.Если ОС поддерживает механизм асинхронного ввода/вывода (KAIO), топроизводительность вырастает еще больше. KAIO – это возможность процессаодновременно выполнять несколько операций дискового ввода/вывода без необходимостиожидать отклика от подсистемы ввода/вывода. База данных может быть размещена в файлах ОС (выделенное пространство cookedspace). Использование выделенных файлов не гарантирует, что они будут расположенына диске последовательно. Вы должны исходить из предположения, что не будут. Этаособенность выделенных файлов влияет на производительность работы с диском. Некоторые операционные системы (типа Windows) для записи /чтения файловиспользуют небуферизированный и некешированный ввод/вывод. Из этого факта следуетвывод: использование сырого диска под Windows выигрыша в производительности непринесет. С версии IDS 11 поддержка небуферизированного ввода/вывода средствами ОСпереносится и на другие операционные системы. Эта функциональность может
    • обеспечить производительность, сопоставимую с производительностью сырого диска, прииспользовании файловых чанков и db-пространств. Ради справедливости скажу, что этотфункционал IDS не является уникальным. Некоторые серверы БД поддерживаютхранение Баз данных только в выделенных файлах, другие поддерживают и выделенныефайлы, и сырые диски. У IDS есть очень полезная возможность – распределять данные надиске в соответствии с некоторыми правилами. Informix поддерживает несколько схемпартиционирования данных. Наличие такого функционала также повышает доступностьданных, улучшает управляемость хранением старых данных (это называется data life-cyclemanagement – управление жизненным циклом данных). В Informix диск представлен некоторыми физическими и логическими свойствами. дляпонимания этого я ниже ввожу необходимую терминологию. В Части 3 мы болееподробно поговорим о дисковом компоненте.Основные термины. На протяжении книги я буду использовать некоторые фразы и слова, которые или имеютсмысл только для Informix Dynamic Server, или трактуются в нем не так, как в другихсерверах БД. Поэтому перед тем, как двинуться дальше, давайте определимся сключевыми терминами. Для избежания двусмысленности, я буду стараться использоватьтолько правильные термины и избегать компьютерного сленга. В книге я буду постоянно обращаться к «экземплярам» и иногда к «серверу БД». Сервер БД – это откомпилированный исходный код, на использование которого выприобрели лицензию и установили на физический сервер; это Informix Dynamic Server.Этот сервер имеет утилиты и программы для создания, администрирования сервера иподключения к нему клиентских приложений. Вам, возможно, вообще не придетсяадминистрировать и настраивать сам сервер. При правильной настройке файловойсистемы и переменных окружения на физический сервер можно установить нескольковерсий IDS, о чем мы подробно поговорим в части 3. Экземпляр – уникальное рабочее окружения или окружение времени выполнения,используемое для хранения набора баз данных, к которым могут иметь доступ (или неиметь) конечные пользователи. До этого момента в книге вместо термина «экземпляр»использовался термин «окружение базы данных». Экземпляры и базы данныхнастраиваются для достижения необходимой производительности. Изменения рабочегоокружения базы данных проводятся на уровне экземпляра. Физический сервер, накоторый установлен сервер БД, может поддерживать несколько экземпляров. Каждыйэкземпляр обладает своим набором конфигурационных параметров, памятью и дисковымпространством.Физические элементыЧтобы понять, как физические элементы объединяются в логические структуры, давайтерассмотрим рисунок 1.6. на нем сплошные линии соответствуют физическим элементам, апунктирные – логическим.
    • Рисунок 1.6. Физические и логические структуры экземпляра IDSБазовый физический элемент экземпляра называется страница данных или простостраница. Страница данных имеет фиксированный размер, называемый размеромстраницы; размер страницы – минимальный объем данных, который может быть записанна диск или считан с диска. Как я говорил выше, в зависимости от версии ОС размерстраницы может составлять 2 КБ или 4 КБ. Большинство утилит мониторинга иадминистрирования IDS выводят информацию об использовании дискового пространствав страницах, а не в килобайтах или мегабайтах. Для приведения этих данных к мегабайтамнеобходимо количество страниц умножить на 2 (4,6,8,12,16). Самый маленький дисковый компонент, который вы можете администрировать,называется чанк. С физической точки зрения чанк – это обычно целый дисковый раздел,хотя может быть и меньше раздела, но обязательно должен быть логически непрерывным(подробнее смотрите часть 5). Если для хранения данных вы используете выделенныефайлы, то чанк представляет собой обычный плоский файл. С логической точки зрениячанк представляет собой набор страниц данных и является базовым элементом длясоздания db-пространств и добавления в них дополнительного пространства. DB-пространство – логический набор из одного или более чанков, созданных на одномили нескольких физических дисках. В db-пространствах хранятся таблицы баз данных.Если вы не сконфигурировали параметры, определяющие сортировку и упорядочениерезультатов выборки в памяти, то эти операции проводятся с использованием диска. DB-пространства не могут разделяться между несколькими экземплярами, а физический диск,на котором расположены чанки, может содержать чанки, принадлежащие другим db-пространствам или экземплярам, расположенным на том же физическом сервере (см.рисунок 1.7)
    • Рисунок 1.7. Пересечение чанков db-пространств нескольких экземпляровКаждый из трех дисков, показанных на рисунке разделен на четыре раздела. Эти разделы(или чанки) использовались для создания db-пространств трех экземпляров сервера(danube, madeira, sarthe). DB-пространство Danube_1 создано из чанков ,расположенных наразных дисках (диск 2 и диск 3). В процессе создания db-пространства вы должны указать его первый чанк. Потом, принеобходимости вы можете добавить чанки в db-пространство, а также удалить их.Начальный чанк db-пространства не может быть удален; вы должны удалить все db-пространство и выполнить полное архивирование базы данных. Итак, экземпляр – это автономное пространство для обработки данных, состоящие из db-пространств, где хранятся базы данных, временных пространств и предварительноскомпилированных функций (хранимые процедуры и определенные пользователемфункции). Как вы увидите ниже, экземпляр имеет имя, под которым он известен в сети, иконфигурационные параметры, определяющие, как работает этот экземпляр.Элементы экземпляра.Экземпляр содержит в себе несколько структур данных, от которых зависит его работа. Корневое db-пространство(rootdbs) – это сердце экземпляра. Это db-пространствосодержит всю информацию об экземпляре и, кроме того, может использоваться длявыполнения некоторых операций, если в других db-пространствах экземпляра для этихопераций не хватает места. Повреждение корневого db-пространства приводит кнедоступности всего экземпляра; это же справедливо и для логического и физическогожурнала.Физический журнал содержит исходные образы страниц. Журнал используется в томслучае, если необходимо отменить изменения, внесенные в данные.Логический журнал содержит исходные образы страниц, а также в него записываютсяизменения данных и фиксируется, были ли эти изменения записаны на диск.Без этих двух журналов экземпляр не работает.Термины баз данныхНаверное, вы уже представляете, что такое реляционная база данных. Вы понимает, чтоданные хранятся в столбцах и что набор столбцов образует строку. Строки группируютсяв таблицы и на основе ключевых или важных столбцов для ускорения поиска данныхмогут быть построены индексы. Кроме числовых и символьных типов данных, общих для всех реляционных СУБД, выможете использовать «нестандартные» или, в терминологии IDS, расширенные типыданных. Вы можете создавать типы данных, необходимые именно вашему приложению.Так как IDS поддерживается объектно-ориентированный подход, элементы, от столбца дотаблицы, могут иметь поддержку наследственности и другого функционала, недоступного
    • в чистой реляционной СУБД. Используя эту возможность, можно использоватьтрадиционные элементы данных новыми методами, недоступными в реляционной моделиданных. В IDS также включены большие двоичные объекты (binary large objects) или BLOB-ы.Существует два типа BLOB-ов – простые и смарт-BLOBы (simple and smart). ПростыеBLOBы являются с точки зрения сервера черным ящиком. Смарт-BLOBы состоят изтипов данных, которыми сервер БД может манипулировать, используя функционал,добавленный в экземпляр. Этот функционал может браться из DataBlade, bladelet иливашей собственно определенной пользователем функции (UDR). Ниже мы рассмотримэтот вопрос более подробно. Преимущество BLOBов в том, что большие объемы данныхмогут хранится одним непрерывным блоком без разбиения их на куски фиксированнойдлины. BLOB-объекты могут храниться в специально настроенных db-пространствах(BLOB-пространства). Как и в случае с BLOB-объектами, существует два типа BLOB-пространств – простые BLOB-пространства (обычно называются BLOB-пространства) исмарт BLOB-пространства. BLOB-пространства не слишком отличаются от обычных db-пространств, особенно сейчас, когда появилась возможность создавать обычные db-пространства с разным размером страницы. BLOB-пространства были первыми db-пространствами с переменным размером страницы, то давало возможность хранить BLOBна одной BLOB-странице. Смарт-BLOBы отличаются тем, что их хранение и извлечениеуправляется с помощью метаданных, хранимых в смарт BLOB-пространстве. В части 5 мыпоговорим о создании обоих типов BLOB-пространств. BLOB-объекты делятся на два больших типа – текстовые и двоичные. Текст-ориентированные BLOBы представляют собой документы в некоторой форме. Я работал синсталляциями Informix, где в BLOB-ах хранились документы вместе с контрольнымикодами. Когда из таблицы выбиралась строка, BLOB-столбец этой строки передавался какпараметр скрипту, который запускал программу обработки текста. Для сохранениядокумента в БД пользователь запускал макрос, который записывал документ обратно вбазу (используя SQL-команду insert или update). Таким же образом можно работать и сдвоичными BLOBами. Двоичными BLOBами являются оцифрованные звук и видео,картинки и т.п. Интерпретацией информации из двоичных BLOBов должно заниматьсяклиентское приложение. Как говорилось выше, таблицы с данными хранятся в db-пространствах, состоящих изчанков. Чанки могут располагаться на сырых устройствах – дисковых разделах безфайловой системы и в выделенных файлах. Физические сегменты, выделяемые для хранения данных таблицы, называютсяэкстентами. Ориентируясь на ожидаемое количество строк в таблице, вы можетевыделить экстент достаточного размера для хранения данных таблицы в логическинепрерывном пространстве. Если база хранится в выделенных файлах, экстент не будетфизически непрерывным, а если на сырых устройствах, то будет. Когда табличный экстент заполняется данными и требуется дополнительное место,сервер выделяет таблице новый экстент. Если в db-пространстве находится несколькотаблиц, то новый экстент может не быть добавлен сразу вслед за заполненным. Нарисунке 1.8 показан случай разделения экстентов одной таблицы экстентами другихтаблиц.
    • Рисунок 1.8 Пересечение табличных экстентовБольшое количество пересекающихся экстентов неблагоприятно влияет напроизводительность чтения данных. В части 8 мы рассмотрим команду, котораяпозволяет узнать о количестве пересечений экстентов в db-пространстве. Таблица можеткак находится целиком в одном db-пространстве, так и быть распределена по разным db-пространствам. Такой процесс называется фрагментированием или партиционированиемтаблицы. Таблица – не единственный объект, который можно фрагментировать, индексытакже имеют опции фрагментирования. Грамотное фрагментирование таблиц и индексовможет существенно улучшить производительность сервера. В части 5 мы детальнопоговорим о фрагментировании таблиц и индексов.Типы окружения базы данных.Окружения базы данных разделяют на две большие категории. OLTP-системыхарактеризуются большим количеством операций чтения/записи, обслуживают большоеколичество пользователей, выполняющих однотипные операции в базе данных иобеспечивают минимальное время отклика. Большинство бизнес-приложений являютсяименно OLTP-приложениями, например, системы обработки заказов. IDS прекрасноподходит для работы в качестве OLTP-сервера.OLAP-, или DSS-системы характеризуются гораздо меньшим количеством пользователей,однако, эти пользователи выполняют сложные запросы, часто за большие интервалывремени и не так требовательны ко времени отклика системы. Хотя IDS в наибольшейстепени подходит для OLTP, многие заказчики используют его и в DSS, из-за наличиямасштабируемости, расширенных типов данных, производительности и небольших затратна администрирование.ТранзакцииИногда необходимо, чтобы в базе данных выполнился или весь набор операций, или невыполнилось ничего. Такая группа операций называется транзакцией. Типовым примеромтранзакции является перечисление денег в банке. Предположим, что вы хотитеперечислить деньги со счета на счет. В этом случае деньги должны быть сняты с одногосчета, а затем зачислены на другой счет. Если одна из этих операций завершитсянеудачно, то должны быть откачены обе. Когда я объяснял концепцию корневого db-пространства, то упоминал о том, что серверотслеживает операции в базе данных, используя два компонента на диске – физический и
    • логический журнал. Физический журнал содержит исходный образ данных, которыебудут изменяться. Когда данные модифицируются или удаляются, сервер записывает этиизменения в логический журнал. Если вернуться к нашему банковскому примеру, можносказать, что когда обе операции выполнены, то транзакция зафиксирована(committed).Исходные значения и их изменения записаны в текущий логический журнал и транзакцияпомечена как завершенная. Если произошла ошибка, то сервер откатывает(roll back)транзакцию и использует данные физического журнала для восстановления исходныхданных.Контрольные точки (checkpoints)Данные, находящиеся в разделяемой памяти, должны периодически записываться на диск.Это необходимо для сохранения целостности данных. В некоторых случаях данныезаписываются на диск автоматически в конце выполнения задачи; в других случаях записьосуществляется как часть обработки контрольной точки (checkpoint). Во время обработкиконтрольной точки данные на диске обновляются так, чтобы соответствовать данным,находящимся в разделяемой памяти. В предыдущих версиях IDS во время обработкиконтрольной точки остальные операции в базе приостанавливались на короткое время; этобыло необходимо для корректной обработки критически важных данных экземпляра и длязаписи данных на диск. В версии IDS это время значительно уменьшено. Пользователи недолжны заметить прерывание в работе экземпляра. После завершения обработки контрольной точки сервер находится в логическицелостном состоянии (logically consistent state). Более детально об обработке контрольнойточки мы поговорим в следующей книге.ЗаключениеВ этом разделе дано общее описание архитектуры Informix Dynamic Server и приведенобзор основных терминов, относящихся к Informix. После прочтения вы должны знать отрех основных компонентах архитектуры IDS, как сервер работает с разделяемой памятьюи что содержит каждая часть разделяемой памяти. Вам должна быть понятна основнаятерминология, разница между сервером и экземпляром, а также, что такое чанк и db-пространство, в чем разница между OLTP и DSS, что такое BLOBы и контрольные точки. Я несколько раз отмечал, что IDS отличается от остальных серверов БД с точки зренияиспользуемой архитектуры и функциональной перспективы. В этой части рассказывалосьо архитектурных отличиях. В части 2 мы поговорим на функциональныхусовершенствованиях, доступных в IDS в результате интеграции объектно-ориентированного подхода к БД Illustra с динамически масштабируемой архитектуройIDS.
    • Часть 2 Введение в расширяемостьВ этой частиЧто это такое и зачем оно надоНовые объекты базы данных и как их использоватьВ 1995 году произошли два события, на которые в Informix возлагали надежду, что онивознесут компанию на первое место на рынке СУБД. Первое событие – начало всеобщегодоступа к Интернет. Технология World Wide Web, разработанная в CERN, начала своеглобальное распространение и люди начали изучать новые пути получения информации.Второе событие – компания Informix внесла серьезные обновления в Informix DynamicServer. Продукт, получивший название Universal Server, рассматривался в качестверодоначальника следующего семейства серверов БД, разработанных и оптимизированныхдля «поколения Интернет». Universal Server был результатом долголетнего проекта пообъединению объектно-ориентированной БД, разработанной Майклом Стоунбрекером(Michael Stonebraker) в проекте Illustra Server, и динамической масштабируемойархитектуры IDS. В последующие год или два другие компании выпустили нечтоподобное, но в их случае все ограничилось объектно-ориентированным именованиемфункций, которые по прежнему работали с данными, используя стандартные реляционныеоперации. Informix провел восхитительную демонстрацию возможностей. В базу могли бытьзагружены фотографии, видео, аудио, и их можно было обрабатывать как объекты базы(например, получать запросом цвет, тип фигуры), не прибегая к хранению метаданныхобъекта в текстовых столбцах. Были возможности по автоматической генерации Web-страниц из базы данных, без необходимости писать статические HTML-страницы.Будущее представлялось мультимедийным (мое примечание - типа великого гула о Web2.0)Прошло 10 лет. Вычислительный ландшафт поменялся. Графические и Web-интерфейсыстали нормой и там, где это необходимо, мультимедийными. В продаже предлагаетсяUniversal Server со всеми своими плюшками. К моменту, когда вы будете держать этукнигу в руках, срок поддержки IDS 7 подойдет к концу, и вы не сможете приобрестистрого реляционную версию сервера. Для всех возможных целей IDS 11 гораздо быстрее,чем IDS 7, поэтому нет смысла оставаться на старой версии. Вы можете сказать, чтоновый функционал вам абсолютно не нужен и вам достаточно стандартных типов данных.Я вам возражу, что, хотя в IDS добавили расширенную поддержку аудио/видео и прочихсложных типов данных, объектно-реляционная технология предоставляет впечатляющиевозможности и при работе со стандартными типами данных. IDS позволяет вамиспользовать стандартные типы данных способами, недоступными для стандартныхреляционных серверов. В этой части поясняется, что такое «расширяемость» в понимании Informix DynamicServer, рассмотрены ее компоненты и методы использования в приложениях.Что это такое и зачем оно надоТекущая версия IDS представляет собой интеграцию двух уникальных технологий.Началось все с правительственного агентства, которое занималось сложным анализом.Вес стандартные данные хранились в базе данных под управлением Informix, а «сложные»данные (всякие научные снимки) – в объектно-ориентированной БД. Объектно-
    • ориентированным окружением был Illustra Server, разработанный МайкломСтоунбрейкером (Michael Stonebraker) – пионером в области объектных баз данных.Ему удалось создать промышленный сервер, где элементы данных были не статическим, аимели объектно-ориентированные свойства, такие как наследование, что позволялосоздать новый тип данных на основе старого и добавить к новому типу свойства, которыхне было у старого. Сервер мог работать с новым типом данных, используя написанные дляэтого типа функции, а не выгружать такой объект во внешнее приложение. Именно так вагентстве использовался Illustra Server: для хранения информации были созданыспециальные типы данных и написаны функции их обработки. Наличие этих функцийпозволило использовать для обработки данных стандартные SQL –операторы и проводитьобработку непосредственно на мощном сервере, а не на клиентском ПК. На тот момент IDS не хватало возможностей манипулирования со сложными типамиданных, но он был самым быстрым сервером для выполнения стандартных операций сданными. Illustra Server выполнял стандартные операции значительно медленнее, нообладал объектным функционалом. В результате агентство ежедневно занималосьобъединением данных, хранимых в базах под управлением двух серверов. Заказчики нестеснялись высказывать свои пожелания касательно разработки одного продукта, вкотором было бы сосредоточено все лучшее из этих двух серверов. Informix приобрелIllustra и начал многолетний проект по интеграции этой технологии в DSA. На данный момент Informix является лидером на рынке СУБД по объектно-ориентированным возможностям. Некоторые игроки на рынке СУБД заявляют, что у нихтоже есть такие возможности, но из руководств по эти продуктам следует, что в этихсерверах используются стандартные хранимые процедуры и представления для созданиявидимости, что элементы данных обладают объектно-ориентированными возможностями.В другом случае производители СУБД разработали дополнительные серверные продукты,которые устанавливаются в дополнение к реляционному серверу и обмениваются с нимданными через API, что ведет к снижению общей производительности имасштабируемости системы. Итак, что такое расширяемость? Расширяемость – это возможность «расширить»функциональность сервера по манипулированию данными. Эта возможность включает всебя создание типов данных, которые наиболее точно описывают эти данные, процедурманипулирования этими данными, наследования характеристик, перегрузки функций,полиморфизма и т.д. наличие такой функциональности дает возможность разработчикам иадминистраторам создавать базы данных и приложения по управлению данными согласнобизнес-правилам. Когда данные создаются и хранятся согласно бизнес-правилам,приложения могут использовать эти данные более эффективно, что ведет к более быстройразработке таких приложений, уменьшению ошибок, лучшей производительности. Имеявозможность создавать собственные типы данных, вы можете решать проблемы, которыерешаются стандартными методами крайне неэффективно или не решаются вообще. Правильное использование этой технологии подразумевает, что разработчик иадминистратор могут научиться мыслить по-другому. Они должны быть способны видетьданные и сточки зрения реляционной алгебры, и с точки зрения бизнеса. Например,реляционные правила рекомендуют хранить данные о заказе в разных таблицах, но еслибизнес рассматривает эти данные как один объект, то в базе лучших их хранить именнокак один объект. Разработчика и администраторам следует использовать этивозможности, а не рассматривать сервер БД только как место хранения данных. Сегодня термин «портируемость» повторяют как мантру, предполагая, что всю работу сданными должно выполнять конечное приложение, а сервер БД рассматривают какхранилище данных, которые не нужны в данный момент. При таком раскладе серверу БДуделяют очень мало внимания или не уделяют вообще. Такой подход обеспечиваетгарантии постоянной занятости для разработчиков клиентских приложений, но приводит кмассе проблем – увеличению времени разработки приложений, снижению
    • производительности, поскольку многие операции выполняются не на мощном сервере, ана клиентском ПК, экспоненциальному увеличению сетевого трафика и т.д. правильноеиспользование возможностей IDS может значительно уменьшить количество такихпроблем, а то и вообще избежать их. Расширяемость – стандартная возможность IDS, но она вам не навязывается. Если онавам не нужна – не используйте. Расширяемость предназначена не только длямультимедийных приложений, она может использоваться и в «стандартных»приложениях. Давайте рассмотрим пример.Задачи, решаемые с помощью расширяемости , — организационная диаграмма.Рисунок 2.1 иллюстрирует типичный для многих организаций вопрос – кто комуподчиняется. Рисунок 2.1. Аналоговое представление структуры подчиненности департаментаПредставление в таком формате удобно и позволяет быстро определить, кто комуподчиняется. но обрабатывать такую структуру данных с помощью стандартной базыданных очень-очень сложно. Стандартные правила моделирования разрешают толькоотношение главный-подчиненный (master-detail), которое прекрасно срабатывает в случаепрезидента компании, но не работает на уровне вице-президента и ниже, так как на этомуровне и ниже мастер-запись является частью подчиненной записи мастер-записи болеевысокого уровня. Для решения этой проблемы в таблице используют внешний ключ наэту же таблицу, например, так:create table employee ( employee_id serial unique, manager_id integer primary key, … )foreign key (employee_id) references manager_id
    • А затем разработчики клиентского приложения получают увлекательную задачу –придумать метод доступа к таким данным. Разработчики имеют две возможности –использовать рекурсивный обход дерева или обработку множеств. Если использовать рекурсивный подход, то программа должна уметь генерироватьдинамический SQL для выбора лиц, подчиненных указанному менеджеру, затем длявыбора подчиненных этих подчиненных и т.д. Отдельный SQL-запрос крайне прост:select employee_name, employee_id from employee where manager_id=?Такой подход серьезно просаживает производительность, поскольку с увеличениемколичества уровней вложенности время выполнения запроса растет экспоненциально.Кроме того, программа должна хранить промежуточные результаты на каждой итерации,а в конце объединить их все. Подход, ориентированный на работу с множествами значительно лучше. В этом случаепрограмма должна динамически генерировать примерно такие запросы для каждогоуровня иерархии в организации:select count(*) from employee e1, employee e2, employee e3, employee e4, employee e5 where e5.manager_id=? and e4.manager_id=e5.employee_id and e3.manager_id=e4.employee_id and e2.manager_id=e3.employee_id and e1.manager_id=e2.employee_idс каждым новым уровнем вложенности сложность запроса возрастает ипроизводительность падает. Короче говоря, ни тот, ни другой подход не обеспечиваютбыстроты и эффективности.Используя средства расширения IDS, мы можем представить данные именно в такомиерархическом формате. Чтобы это сделать, нам надо зарегистрировать в системе NodeDataBlade. После этого, нам станет доступен новый тип данных (node) и набор процедурдля работы с ним. Новый тип будет использоваться в базе данных точно также, как ивстроенные типы данных. Используя тип данных node и поддержку сервером длинных имен объектов, мы можемдобавить столбец employee_reporting_structure в таблицу employee. В этом столбцемогут храниться данные о позиции сотрудника в организации, и такой ключ может бытьиспользован для поиска связей между сотрудниками:create table employee( employee_id serial, employee_reporting_structure node primary key … … );На рисунке 2.2. представлена иллюстрация такого подхода
    • Рисунок 2.2 Использование DataBlade-а node для моделирования иерархических данных.Как видно из рисунка, каждый элемент структуры имеет свой уникальный идентификатор.Смежные уровни представляют собой связь начальник-подчиненный. Значение 1.4.3.4означает, что сотрудник №4 отчитывается перед менеджером №3, у которого, в своюочередь, начальник – это менеджер №4, а у менеджера №4 начальником являетсяменеджер №1. При такой постановке задачи вопрос о подчиненности объектов становитсятривиальным: какой из них больше. Является ли один объект прародителем, родителем,потомком другого? На этот вопрос ответят функции ,включенные в состав NodeDataBlade. Для поиска начальника любого сотрудника в организации будетиспользоваться запрос типа такого:select ischild() from employee where employee_reporting_structure= (select employee_reporting_structure from employee where employee_id=input_value)Другие функции позволят вам добавлять уровни, разделять, получать список элементовопределенного уровня и т.д. Тип данных node может быть проиндексирован,следовательно, операции с ним будут иметь линейную производительность. Это один из примеров, демонстрирующий, как расширяемость может помочь решитьзадачи, трудно решаемые на классическом реляционном сервере. Используяфункциональность IDS, вы можете решать бизнес-задачи, решать которые раньше былоневозможно или очень тяжело. Теперь давайте рассмотрим некоторые аспекты объектно-реляционной технологии IDS.Начнем с расширенных типов данных.Расширенные типы данных.Как можно увидеть на рисунке 2.3 в Informix типы данных разделяются на две большиеветви – встроенные типы и расширенные типы.
    • Рисунок 2.3. Дерево типов данных IDSВетвь встроенных типов инкапсулирует стандартные типы данных, которыеподдерживаются всеми серверами БД. Расширенные типы данных разделены на несколькотипов, в зависимости от их функциональности. В последующих разделах мы рассмотримэти типы подробнее.Реляционные типы данных.В левой части рисунка 2.3 представлены реляционные типы данных, с которыми в,наверняка, знакомы,: character, varchar, integer, float, decimal и т.д. в них нет ничегоуникального. Целочисленные типы данных имеют размер от 2 байт (small integer) до 8байт (integer) и могут представлять числа в диапазоне от –9,223,373,036,854,775,807 до9,223,372,036,854,775,807. полагаю, что такого диапазона хватит для хранения номерзаказов и идентификаторов покупателей. Для обеспечения уникальности на столбец типаbigserial и serial необходимо наложить ограничение уникальности (unique constraint). Втаблице одновременно может столбец и bigserial и serialСимвольные данные бывают двух типов – длиной до 255 символов(varchar) или до2Кбайт(lvarchar). Тип varchar может индексироваться, а lvarchar – нет. В IDS также естьрасширения для этих типов данных. С помощью указания длины N строки типlvarchar(N) в зависимости от ОС может хранить до 32 Кбайт символьных данных.Хранение символьных данных такой длины в символьном столбце является предметовпостоянных споров. Я считаю, что в этом случае предпочтительнее использовать smartBLOB, который может индексироваться. Я полагаю, что создание индекса для 32Кбайтного символьного столбца – не лучший подход, но решать вам. Для хранения даты и времени используется тип данных datetime. Применяется такжеподход, основанный на хранении интервала времени между двумя значениями даты и/иливремени. Типы decimal и float характеризуются точностью до и после точки и т.д.Расширенные типы данныхНекоторые из этих типов могут вас смутить, особенно если знать, что они могутвкладываться друг в друга.Комплексные типы данныхЕсли попытаться объяснить назначение этих типов данных в двух словах, то можносказать так: они позволяют хранить повторяющиеся наборы значений в одном столбце исвернуть таблицу в один столбец.
    • Тип данных строка (row data type)Этот тип данных похож на структуру (struct) в языке С. Используя этот тип, вы можетесгруппировать логически связанные элементы в один столбец. Иначе говоря, можносвернуть таблицу в строку. Строка может быть именованной и неименованной (namedrow, unnamed row) Именованная строка существует на уровне базы данных, как иреляционные типы, которые вам более известны. Именованная строка можетиспользоваться для создания таблицы, состоящей из одного столбца, а может быть однимиз нескольких столбцов в таблице. В листинге 2.1. приведен пример использованияименованных строк.create row type name_t ( fname varchar(20), lname varchar(20) );create row type address_t ( street_1 varchar(20), street_2 varchar(20), city varchar(20), state char(2), zip char(9) );create table student ( student_id serial, name name_t, address address_t, company varchar(30) ); Листинг 2.1. Пример использования именованных строк.В этом примере создано две именованных строки. Такой подход может использоваться вбазе данных там, где необходимо хранить набор данных сгруппированным. Например,вам необходимо создать модуль для управления школой, где будет информация обучениках и уроках. Вы можете создать таблицу student и использовать именованныестроки, как показано в Листинге 2.1 Неименованные строки менее типизированы и могут использоваться только в таблице,для которой они определены. Они не могут использоваться для создания таблицы,состоящей из одного столбца. В Листинге 2.2. приведен пример.row (a int, b char(10))row (x int, y char(10))create table part (part_id serial, cost decimal, part_dimensions row (length decimal, width decimal, height decimal,
    • weight decimal (6,2))); Листинг 2.2. Пример неименованных строк.Два типа данных row, использованные в этом примере, функционально идентичны,несмотря на различие в именах. Если тип данных «неименованная строка» используется вразных таблицах, то имена переменных этого типа могут быть одинаковы. Если тип«неименованная строка» используется более чем в одной таблице, то лучше перейти отнеименованных строк к именованным. В последней части листинга приведен пример создания таблицы part, в которойнекоторые физические характеристики предмета хранятся в неименованной строке part-dimension.Тип данных «строка»(row) может содержать данные практически всех других типов,включая расширенные типы. В этом типе данных не могут содержаться данные типаserial (4- и 8-ми байтовые).С точки зрения разработчика приложений тип данных строка имеет как преимущества, таки недостатки. Рассмотрим преимущества. Во-первых, с точки зрения бизнеса этот типданных интуитивно понятен. Например, если вы используете некоторые данные как одноцелое, то и моделировать их так удобнее. С точки зрения приложения такой подходуменьшает количество SQL-операторов, необходимых для манипулирования отдельнымичастями логического элемента. С другой стороны, кода меньше, но он сложнее. Состороны администратора тип данных «строка» требует умения предвидеть, посколькуданные этого типа нельзя преобразовать в другой тип (вы можете это сделать, например,для символьных и числовых типов), а можно только удалить и создать заново. В Листинге 2.3 приведен пример SQL-команд, выполняемых из dbaccess, для управленияданными в таблице, скрипт создания которой приведен в Листинге 2.1insert into student values (0, row(“John”,”Doe”)::name_t, row(“1234 Main Street”,””,”Anytown”,”TX”, “75022”):address_t,”Big Co.”);select * from student where name.lname matches “Doe”; student_id 1234 (?????) name row (‘John’,’Doe’) address row (‘1234 Main Street’,’’,’Anytown’,’TX’,’75022’) company Big Co.Для операции вставки необходимо сделать два уточнения:  Ключевое слово row показывает, что следующие за ним данные будут вставлены в элемент типа данных row.  Имя, указанное после данных, (в примере ::name_t), используется для преобразования данных в требуемый тип. Ниже мы подробно рассмотрим вопросы преобразования данных.Второй запрос является примером выборки данных по фильтру, включающему элементытипа row. Обратите внимание на использование «точечной» записи для уточнениянеобходимых элементов. Если элемент row используется внутри другого типа данных, тоиспользуется «трехточечная» запись:
    • create row type name_t (fname varchar(20), lname varchar(20));create row type address_t (street_1 varchar(20), street_2 varchar(20), city varchar(20), state char(2), zip char(9));create row type studentinfo_t (name name_t, address address_t);create table student (student_id serial, name_address studentinfo_t, company varchar(30));insert into student values (0, row (row(“John”,”Doe”)::name_t, row(“1234 Main Street”,””,”Anytown”,”TX”,”75022”)::address_t )::cust_t, ”Big Co”);select * from student where name_address.name.lname matches “Doe”;student_id 1234name_address row(row(‘John’,’Doe’), row(‘1234 Main Street,’ ‘,’Anytown’,’TX’,’75022’))company Big Co Листинг 2.4. Доступ к элементам именованной строкиКак я говорил выше, нельзя модифицировать определения типа данных row, ихнеобходимо удалить и пересоздать. Для удаления определения именованной строкииспользуется ключевое слово restrict.drop row type studentinfo_t restrict;Тип данных «Коллекция»На следующей ветви дерева расширенных типов находятся три разных типа «коллекция».Тип коллекция позволяет хранить несколько элементов одного типа данных в столбце.Чтобы понять общую идею такого типа данных, - вспомните о массиве. В коллекцииможно хранить практически любой тип данных, включая расширенные типы. В коллекциине могут содержаться типы данных serial (4- и 8-ми байтовые), byte,text. Максимальныйразмер коллекции составляет 32 Кбайта, что ограничивает коллекцию в качествехранилища BLOB-объектов. Коллекции обычно применяют тогда, когда элемент данныхбесполезен без остальных элементов коллекции (например, в коллекции можно хранитьсписок очков в гольфе, список задач и т.п.)
    • В IDS существует три типа коллекций: set, multiset, list. Они отличаются толькоподдержкой уникальности элемента коллекции, как показано в таблице 2.1. Имя типа Описаниеset Гарантируется уникальность элемента коллекции, порядок не определяется set {“apple”,”orange”,”grapefruit”,”plum”}multiset Не гарантируется ни уникальность, ни порядок multiset {“apple”,”orange”,”grapefruit”,”apple”,”plum”,”grapefruit”}list Гарантируется порядок, но не уникальность list {“apple”,”apple”,”grapefruit”,”grapefruit”,”orange”,”plum”} list {“apple”,”grapefruit”,”tangerine”,”apple”,”orange”,”plum”} Таблица 2.1. Типы данных «коллекция» и их характеристикиКак видно из описания списка, термин «порядок» не применим к элементам списка всмысле их типов (числовой, символьный), а только в смысле того, что порядок появленияэлементов соблюдается. Элементы списка нумеруются с единицы. Обратите внимание,что элементы списка указываются внутри фигурных скобок ({}). Коллекции не могутсодержать в себе null-значений. Поэтому, если вы планируете использовать коллекцию, незабудьте в определении соответствующего столбца указать not null. Второй интересныйфакт состоит в том, что если попробовать вставить в set уже имеющееся в нем значение,то оно не будет вставлено и код ошибки тоже не будет сгенерирован.Прдолжая наш пример из прошлого раздела, давайте используем коллекцию для созданиятаблицы, в которой хранится информация о предметах. Код приведен в Листинге 2.5create table class( class_id serial, class_name varchar(6), description lvarchar, prereqs set(varchar(20) not null));insert into class values(300, “Performance and Tuning”, “Covers advanced information on tuning Informix Dynamic Server”, (set{“Relational Database Design”, ”Basic SQL Programming”}));select * from class where (“Advanced SQL Programming”) in prereqs; Листинг 2.5. операции с типом данных «коллекция»Первый оператор SQL используется для создания таблицы, а второй – для занесения в неезаписи. Синтаксис похож на синтаксис использования именованной строки: вамнеобходимо определить тип коллекции, куда будут вставляться элементы. В операцияхSQL с коллекциями можно использовать либо предикаты, либо ключевое слово in(какпоказано в третьем запросе Листинга 2.5). Если язык программирования поддерживаетмассивы, то «коллекции» можно складывать в переменные типа «массив». Если выиспользуете IBM Informix 4GL, то можете для хранения «коллекций» создать переменныетипа set, multiset, list. Вернемся к нашему примеру и предположим, что в списке требований к курсу быладопущена ошибка. Например, студенту, кроме вышеперечисленных курсов, необходимо
    • пройти еще «Advanced SQL programming». Вы не можете модифицировать одни илинесколько элементов коллекции – необходимо переписать все значения. Это можносделать или напрямую, или с использованием переменной (показано в Листинге 2.6)update class set prereqs=(set {“Relational Database Design”, “Advanced SQL Programming”, “Basic SQL Programming”})where class_id=300;update class set prereqs=set_char where class_id=300; (???????) Листинг 2.6. изменение переменной типа «коллекция»С точки зрения разработки структуры базы, коллекции дают возможность хранить записитипа «мастер-деталь» в одной таблице. Основные потребители такого функционала –финансовые, производственные, научные организации. Например, в одной большойторговой компании торговая информация за день хранится в коллекции, котораянаходится в столбце таблицы торговых дней. В промышленных организациях коллекциииспользуются для хранения в них данных, получаемых с систем мониторинга. Вколлекции можно хранить элементы заказа.Определенные пользователем типы.Давайте переместимся к самой правой ветке дерева расширенных типов и рассмотримтипы данных, определенные пользователем. Эти типы данных довольно контрастные –одни легко использовать, другие требуют больше внимания.Исключительные типы данных (distinct data types)Тип distinct получается из встроенного типа данных и является примером принципанаследования. Хотя этот тип данных и наследует все свойства базового типа, но имеетсвое уникальное имя, которое отличает его от других, «подобных» типов. Сервер отделяетбазовый тип и distinct-тип друг от друга и требует явного приведения типов. Посколькуdistinct-тип отличается от встроенного типа, вы можете для этого типа создаватьопределенные пользователем процедуры, правила преобразования, и они не затронутбазовый тип. В объектно-ориентированном программировании это называется перегрузка. Для иллюстрации использования distinct-типов предположим, что нам необходиморазработать модуль БД по продаже сувениров в Европе. Расчеты могут производится вдолларах или евро. Таблица продаж имеет такой вид:create distinct type dollar as decimal;create distinct type euro as decimal;create table sales( sku int, sales_date datetime year to second, us_sales dollar, euro_sales dollar);В этом случае мы создали два типа distinct, наследующие характеристики типа данныхdecimal. Занесем в таблицу данные:
    • insert into sales values(1234,current,15.0::dollar,0::euro);insert into sales values(5678,current,0::dollar,75.0::euro);insert into sales values(1234,current,84.75::dollar,0::euro);Обратите внимание на использование двойного двоеточия (::) для преобразования данныхв необходимый тип. В конце дня менеджер хочет узнать, на сколько денег было продано каждого товара. Онвыполняет запрос:select sku,(sum(us_sales)+sum(euro_sales)) from sales where date(sales_date)=today group by 1;выполнение запроса завершится такой ошибкой:error: 674 - routine (plus) cannot be resolvedПочему это произошло? С точки зрения менеджера обе суммы должны складываться,поскольку это обычные числа. Но с точки зрения сервера это разные типы данных,поэтому сервер не знает, как складывать типы данных euro и dollar.Из этого примера можно увидеть полезность distinct-типов: предупреждение логическихошибок вычислений и возможность определить тип данных, который соответствуетхарактеру данных, которые в нем хранятся. С точки зрения логики некорректносуммировать деньги в разной валюте. Сначала необходимо преобразовать одну валюту кдругой по соответствующему курсу. С точки зрения бизнеса удобно, чтобы наименование типа данных несло информацию отом, что хранится в столбце этого типа данных. Вернемся к исходной задаче. Нормальножелать, что менеджер получит свой отчет по ежедневным продажам без необходимостиписать неестественный SQL-запрос. Этого можно достичь несколькими путями. Сейчасмы обсудим первый метод, а в разделе о преобразовании данных – второй. Базовой возможностью distinct-типов является наследование, поэтому когда тыопределяем тип dollar, используя в качестве основы для него тип decimal, то тип dollarнаследует функции для манипулирования с decimal (sum(),plus() и т.д.). Зная это, намнеобходимо преобразовать один из типов (dollar или euro) в другой. Для этого можносоздать хранимую процедуру или определенную пользователем функцию, которая будетпреобразовывать евро в доллары или доллары в евро. Этот подход продемонстрирован вЛистинге 2.7create function dlr_to_euro(parm1 dollar) returning euro specific usd_to_euro; return (parm1::decimal*0.804)::euro;end function;create function euro_to_usdlr(parm1 euro) returning dollar specific euro_to_usd; return (parm1::decimal/1.346)::dollar;end function;
    • select sku,(sum(us_sales)+sum(euro_to_usdlr(euro_sales))::dollar) from sales where date(sales_date)=today group by 1; Листинг 2.7. Использование определенных пользователем функций для работы с Типами данных distinctВ реальном приложении необходимо курс пересчета получать в реальном времени, а нежестко фиксировать.Непрозрачные типы данных (Opaque data types)Тип данных opaque – это заменить(wildcard) других типов данных. Если типов данныхсервера недостаточно для моделирования и хранения ваших данных, вы можете создатьсвой собственный opaque(непрозрачный) тип данных. Эти типы данных похожи напростые BLOB-ы. Сервер БД не имеет представления о структуре таких данных и как имиманипулировать. С точки зрения сервера, это просто «значение», которое не может бытьразделено на составляющие. Из этого следует вывод, что вы должны определитьхарактеристики типа данных и написать процедуры работы с ним. Для определения типа данных используются структуры С или Java, а манипулированиеopaque-данными производится с помощью процедур, написанных на С или Java изарегистрированных в сервере БД. Opaque-типы данных могут иметь фиксированный илипеременный размер (с ограниченным максимальным размером). Максимальный размерэтого типа данных составляет 32 Кбайта. Если вам необходимо, чтобы тип данных имелбольший размер, - используйте смарт-BLOBы. Данные opaque-типа должны быть отформатированы в соответствии с требованиями ОС,которая управляет сервером. При создании opaque-типа данных необходимо определитьграницу выравнивания (alignment boundary). В таблице 2.2 приведены возможныезначения границы выравнивания. Таблица 2.2. Границы выравнивания типа данных opaque Граница Описание выравнивания 1 однобайтовые структуры 2 Структуры, похожие(resemble) на unsigned small integer 3 Структуры, похожие(resemble) на unsigned integer 4 Структуры, похожие(resemble) на тип данных double dataПо умолчанию используется граница выравнивания 4 байта. В отличие от других типов данных, которые получаются целиком или частями,определенная пользователем функция получает указатель на данные opaque-типа. Этопохоже на работу с BLOB-объектами, когда в столбце хранится не BLOB, а указатель наего расположение в BLOB-пространстве. Исключение из этого правила такое – типданных имеет размер 4 байта и создан с использованием флага PASSEDBYVALUE. При подготовке к созданию типа opaque, необходимо сначала создать изарегистрировать определенные пользователем функции (UDR) для ввода/вывода,удаления данных этого типа ,манипулирования ими (сложение, вычитание и другие
    • применимые операции), агрегирования (если применимо), расчета статистики дляоптимизатора IDS и т.д. В листинге 2.8. приведен пример создания opaque-типовcreate function mytype_in (lvarchar) returning my_type with (not variant);external name “/funcs/my_type.so”language Cend function;create opaque type my_type(internallength=variable,maxlen=1024,aligment=1,cannothash); Листинг 2.8. пример создания типов opaqueПреобразование типов (casting)Надеюсь, вы убедились, что объектно-ориентированные возможности IDS полезны. Онимогут прекрасно подходить для построения модели данных, но их применение в реальныхприложениях – это совсем другая история. Если типы данных не могут использоватьсясовместно друг с другом, то лучше их не использовать. Для решения задачпреобразования данных друг в друга используется объектно-ориентированнаявозможность, которая называется преобразование типов (casting). Преобразование типов преобразует данные одного типа к данным другого типа так,чтобы над ними можно было проводить необходимые операции. В реляционном серверевы тоже используете преобразование типов, хотя, возможно, и не знаете об этом. Именновозможности преобразования типов позволяют вставить данные integer в столбец decimalили числовой тип данных в столбец character. Если преобразование типов невозможно,например, нельзя преобразовать символьный тип данных в числовой, сервер вернетошибку преобразования типов. Использование преобразования типов данных не являетсяобязательным. Преобразования типов могут быть перегружены. Вы можете создаватьправила преобразования типов для всех типов данных, кроме коллекций, BLOBов инеименованных строк. Давайте рассмотрим два типа преобразования: явное и неявное.Неявное преобразование типов. Неявное преобразование типов - одно из тех действий, которое выполняется присоединении между собой неодинаковых типов, например, при попытке сложить доллары севро. С неявным преобразованием надо быть осторожным, поскольку оно может привестик получению неправильных результатов. Выше мы рассматривали пример с продажейсувениров за доллары и евро. Первая попытка получить отчет по продажам за деньзакончилась неудачно из-за ошибки преобразования типов. Альтернативное решение –приведение типов (см. Листинг 2.9)select sum(us_sales)+sum(euro_sales) from sales where date(sales_date)=today; #674 Routine(plus) cannot be resolved;create implicit cast (euro as dollar);select sum(us_sales)+sum(euro_sales) from sales where date(sales_date)=today;
    • (expression) 120.00 Листинг 2.9. Использование преобразования типов.Выражение create cast предписывает серверу обрабатывать в математических операцияхтип euro как тип dollar. Теперь SQL-запрос будет выполнен без ошибки. Проблемарешена? К сожалению нет: с математической точки зрения вес правильно (50+70=120), но70 евро не соответствуют 70 долларам. Чтобы запрос возвращал правильные данные намнеобходимо обеспечить перевод евро в доллары по соответствующему курсу с помощьюфункции, описанной выше в этом разделе.drop cast (euro as dollar);create implicit cast (euro as dollar with euro_to_usdlr);select sum(us_sales)+sum(euro_sales) from sales where date(sales_date)=today;(expression) 80.00Обратите внимание, что сначала сумма продаж в евро передается в функциюeuro_to_usdlr. Полученный из функции результат трактуется как число типа данныхdollar, и перегруженная функция plus может сложить два значения типа dollar. Правильносозданные неявные преобразования могут помочь не менять клиентское приложение приизменении объектов БД.Явные преобразования типов.Сила неявного преобразования типов – немедленность и бесшумность – одновременноявляется и слабостью. Иногда один тип данных может быть однозначно преобразован внесколько типов данных и необходимо динамически определить подходящий тип. В этомслучае используется явное преобразование типов.Вы могли видеть явное преобразование типов в предыдущих примерах, хотя там явно неговорилось об этом. Два нижеприведенных примера показывают, как явно привестизначение my_param к типу данных new_type my_param::new_type my_param cast as new_typeВ другой части программы может оказаться необходимым преобразовать значениеmy_param к типу данных really_new_type. Преобразование типов «по требованию» -отличительная особенность явного преобразования типов данных. Как и в случае неявногопреобразования, вы можете предопределить правила явных преобразований на уровнеэкземпляра, и не будет необходимости включать правила преобразования типов вприложение. Давайте, например, предположим, что нам необходимо переделать нашмодуль продажи сувениров, поскольку компания по продаже сувениров была купленакем-то. Новые владельцы хотят видеть отчет по продажам в долларах, а продажи в европересчитать в японские иены. Чтобы удовлетворить последнее пожелание правиланеявного преобразования удаляются и создается distinct-тип yen. Рассмотрим теперьЛистинг 2.10
    • select sum(us_sales)+sum(euro) from sales where date(sales_date)=today;#674 Routine (plus) cannot be resolvedexecute my_function(in_1) returning yen select sum(euro_sales)/yen_value from …#674 Routine (divide) cannot be resolvedcreate explicit cast (euro as dollar)create explicit cast (euro as yen)select sum(us_sales)+sum(euro) from sales where date(sales_date)=today;#674 Routine (plus) cannot be resolvedexecute my_function(in_1) returning yenselect sum(euro_sales)/yen_value from …#674 Routine (divide) cannot be resolved Листинг 2.10 Функциональные отличия в явных преобразованиях.Почему ничего не работает? Созданы все правила для преобразования типов. Почему невыполняется преобразование? Явные преобразования, в независимости от того, как ониопределены, не вызываются сервером БД автоматически. Необходимое явноепреобразование должно быть вызвано. Смотрите пример Листинг 2.11drop cast (euro as dollar);drop cast(euro as yen);select sum(us_sales)+sum(euro_sales)::dollar from sales where date(sales_date)=today;(expression) 120.00create explicit cast (euro as dollar with euro_to_usdlr);create explicit cast (euro as yen with euro_to_yen);select sum(us_sales)+sum(euro_sales)::dollar from sales where date(sales_date)=today;(expression) 80.00execute my_function(in_1) returning yenselect euro_sales cast as yen/yen_value from …(expression) 2400.65 Листинг 2.11 Использование явного преобразования типов.Первые два выражения удаляют существующие преобразования типа euro. В следующемвыражении сумма продаж в евро преобразуется к типу данных dollar, а затем выполняетсясуммирование двух долларовых величин. К сожалению, результат этой операции
    • неправилен, поскольку не выполняется «обмен валюты по курсу». Следующие выраженияиспользуются для создания явных преобразований типов с учетом курса обмена. Теперьданные euro_sales могут быть пересчитаны в евро или доллары с минимальнымиизменениями в клиентском приложении. Сервер БД распознает выражение euro_sales castas yen и вернет правильный результат.Определенные пользователем функции и агрегаты.Определенные пользователем функции и определенные пользователем агрегаты (UDA –user-defined aggregates) – это расширения программирования на стороне сервера. Онидоступны в Informix уже много лет. В ранних версиях эти средства программированиябыли ограничены хранимыми процедурами, написанными на языке SPL (stored procedurelanguage – язык написания хранимых процедур). IDS 11 также поддерживает SPL.Принципы написания процедур не изменились – после создания процедуры оптимизаторразбирает ее и хранит план выполнения в системных таблицах экземпляра. В IDS 11 SPLбыл расширен – добавлены циклы, метки циклов, выход из цикла и выражение goto. Начиная с версии Informix Dynamic Server 9.1, можно писать «внешние» процедуры,которые регистрируются в экземпляре и выполняются как хранимые процедуры илидругие части двоичного кода сервера. Такие внешние функции могут быть написаны на Сили Java и выполнять более сложную обработку данных, чем хранимые процедуры наSPL. В документации Informix Dynamic Server определенные пользователем процедуры иопределенные пользователем функции иногда объединяются под названием«определенные пользователем агрегаты». С точки зрения конечного приложенияпроцедуры и функции различаются по количеству возвращаемых параметров. Дляобозначения процедур и функций мы будем использовать общий термин UDR.UDR, написанные на Java, должны быть скомпилированы в jar. После регистрациифункции в экземпляре содержимое jar-файла копируется в smart BLOB-пространство ивыполняется с использованием HotSpot Java Virtual Machine (JVM). UDR, написанные наС, должны быть скомпилированы в объектный вид (filename.so) и помещены в каталог,путь к которому определен в конфигурационном параметре DB_LIBRARY_PATH.UDR должны быть написаны максимально кратко и точно, Если тратится много временина выполнение кода UDR, то производительность экземпляра может существенноснизиться. При создании UDR обязательно необходимо предусмотреть обработку ошибок,используя конструкцию raise exception и другие встроенные функции. Поскольку UDRмогут перегружать другие UDR и/или встроенные функции, хорошей практикой являетсяиспользование при определении UDR специфичного имени или псевдонима. Например,можно создать такие перегруженные UDR с разными сигнатурами:create function comp_val(in_1 dollar,in_2 aus_dollar) …create function comp_val(in_1 aus_dollar,in_2 euro) …create function comp_val(in_1 euro, in_2 aus_dollar) …Сигнатура UDR – это комбинация имени функции/процедуры и ее параметров. Когдапроисходи вызов UDR, сервер определяет типы передаваемых параметров и решает,
    • какую из перегруженных UDR выполнять. Использование UDR предполагает или еевызов по полной сигнатуре, или, если вы такой же ленивец, как я, через псевдоним (alias):create function comp_val(euro,aus_dollar) returning aus_dollar, specific euro_to_ausdlr..Удалить функцию можно двумя способами:drop function plus(euro,aus_dollar);drop specific function euro_to_ausdlr;Хотя примеры выполняют одно действие, использование псевдонима позволяет избежатьдлительного стучания по клавиатуре, особенно если у функции длинная сигнатура. Некорректная UDR может привести к аварийной остановке сервера(crash). Дляуменьшения этой опасности IDS предоставляет возможность создания определенныхпользователем виртуальных процессоров(UDVP – user-defined virtual processor). Послесоздания одного или нескольких таких процессоров можно указать серверу выполнятьUDR только на этих процессорах, что значительно уменьшит вероятность аварийнойостановки сервера. В Листинге 2.12 приведен пример:VPCLASS finance_vp, num=2 # vp for finance UDRs (ВП для финансовых UDR)илиonmode –p +2 finance_vpcreate function comp_val(dollar,aus_dollar) returning aus_dollar specific dollar with class=”finance_vp” external_name ‘/usr/Informix/shared_lib/comp_functions.so’ language C not variantend function;Листинг 2.12 Использование определенных пользователем ВП для защиты от кривонаписанных UDRВ этом примере показаны два метода создания UDVP. Первый требует изменения файла$ONCONFIG и перезапуска экземпляра, а второй выполняется, когда экземплярнаходится в режиме он-лайн и обрабатывает данные. После создания UDVP создается ирегистрируется функция, причем при регистрации указывается, что функция выполняетсятолько на виртуальном процессоре finance_vp. Определенные пользователем виртуальные процессоры находятся в отдельном отсистемных ВП адресном пространстве. Если UDR написана некорректно, ее негативноевлияние ограничится только UDVP и не затронет ядро сервера. По умолчанию UDR являются однопоточными, но они могут быть распараллелены привыполнении нескольких условий, включая следующие:
    •  Включено распараллеливание PDQPRIORITY>1  При регистрации UDR указано ключевое слово parallelizable  UDR на С и Java используют вызовы потокобезопасных API Parallel Database Query(PDQ)  Сложные типы данных не используются в качестве входных и выходных параметров  Сканы будут выполняться в нескольких партициях таблицы (data scans will search multiple table partitions)  UDR не являются функциями-итераторами, а выполняются один раз и завершаютсяЕсли вы ошиблись при регистрации UDR, ошибку можно исправить используя SQL-команду alter function: alter function bigger (int, int) with (add parallelizable, add class=”math_vps”);Для мониторинга работы UDR используется утилита onstat и другие.Определенные пользователем агрегаты (UDA) Это специальные UDR для выполнения агрегации, которая не поддерживаетсявстроенными функциями сервера. Как вы знаете Informix поддерживает sum(), divide(),mod() и другие математические функции для встроенных типов данных. Эти функции неработают для определенных пользователем типов данных, их может оказатьсянедостаточно для хитрого агрегирования или в случае, когда необходимо агрегированиеданных встроенных и расширенных типов. Примером определенного пользователем агрегата может быть последовательностьФибоначчи. Ее значения получаются так: два соседних элемента складываются иобразуют третий, затем третий элемент складывается со вторым и получается четвертый,четвертый суммируется с третьим, и получается пятый и т.д: 0,1,2,3,5,8,13,21,34,55,89,144… Последовательность ФибоначчиНапример, для каких то целей может потребоваться вычислить члены последовательностиФибоначчи, имея начальное значение и количество итераций. Именно в таком случаецелесообразно использовать UDA. Создание UDA сложнее, чем создание UDR. ОбычноUDA являются итеративными и состоят из четырех модулей, которые выполняютследующие функции:  Инициализация – выделение и инициализация ресурсов сервера для использования их в функции  Итерация – увеличение числа строк и выполнение необходимых математических расчетов.  Комбинация – прибавление вычисленного значения к возвращаемому из функции результату.  Финализация - возвращение значений и освобождение ресурсов сервера.
    • Обычно UDA пишут на С или Java, особенно если в вычислениях используются научныеи/или статистические расчеты и для получения новых значений используются внешниепроцедуры. Расчеты такого типа сложно писать на SPL.Функциональные индексы.Индексы -это указатели на месторасположения данных. Informix может создаватьиндексы по одному или нескольким столбцам. В реляционном сервере БД индексысоздаются на основе значений, находящихся в одном или нескольких столбцах. Однако,не все операции с данными основаны на абсолютных значениях этих данных. Некоторыеданные лучше представлять в виде отношения, процентного значения и т.д. В IDS в такомслучае вы можете использовать функциональный индекс. Предположим, что необходимо работать с данными, которые представляют собойвзвешенное отношение данных из трех столбцов. Тогда можно создать индекс по этомуотношению таким образом: написать, скомпилировать и зарегистрировать UDR,вычисляющую это отношение. Затем можно создать индекс:create index ix_w8ed_ratio(build_ratio(col3,col5,col10))Функциональные индексы также используются для создания вторичных методовдоступа(secondary access methods) или алгоритмов сравнения величин. Большинствоиндексов обрабатываются одним из двух стандартных алгоритмов:  В-дерево (B-tree) – данные равны, больше чем, меньше чем, меньше или равны, больше или равны  R-дерево(R-tree) – данные состоят из одного из двух элементов: 1. многоразмерные(multidimensional) – данные в нескольких измерениях, например, географические (широта, долгота, высота), комбинация нескольких независимых элементов в многоразмерное представление; например, можно создать функциональный индекс одежды на основе ее цвета, материала, из которого она изготовлена, производителя, дизайнера и т.д. 2. диапазонные. Например, диапазон широт между двумя граничными значениями, диапазон времени между двумя событиями.Если этих методов доступа недостаточно или они не обеспечивают необходимойпроизводительности, вы можете создать свою собственную схему индексирования изарегистрировать ее в экземпляре. Именно так поступила компания-партнер CoppereyeLTD. Ее сотрудники разработали новый метод индексирования реляционных данных,который значительно уменьшает время построения индекса без снижения егопроизводительности. В Coppereye был создан DataBlade, который при установкеперегружает многие встроенные функции работы с индексами. Для использованияалгоритма Coppereye, DBA при создании индекса должен указать алгоритм его обработкиcreate index ix_myindexon table_a(col2,col3) using coppereye;
    • DataBlade-ы, Bladelet-ы и прочие дополнения.Как вы смогли убедиться, объектная функциональность IDS дает вам возможностьхранить и обрабатывать данные путем, который максимально подходит вашему бизнес-окружению. Некоторые вендоры используют эти возможности для создания наборов UDR,сообщений об ошибках, алгоритмов приведения типов. Эти наборы носят наименованиеDataBlade-ов. Они предназначены для решения широкого круга задач: выше я ужеупоминал о схеме индексирования Coppereye, также есть DataBlade-ы по обработкебиометрических данных, аудио и видео и так далее. Enterprise редакция IDS 11 включает всебя лицензию на использование нескольких DataBlade-ов. Более мелкие функциональные расширения IDS называются Bladelet-ами и могут бытьбесплатно загружены с веб-сайтов International Informix User’s Group (IIUG) и IBMdeveloperWorks (http://www.iiug.org, http://www.ibm.com/developerworks). Полсерегистрации Bladelet-а или DataBlade-а его функциональность становится доступна черезSQL, SPL или вызовы API. DataBlade-ы и Bladelet-ы устанавливаются на уровне экземпляра, обычно в каталог$INFORMIXDIR/extend, и регистрируются в каждой базе данных, где требуетсяиспользовать их функциональность. Определение функций, типов данных и другихкомпонентов DataBlade-а или Bladelet-a хранится в системных таблицах БД(sysprocbody) .При удалении Bladelet-а из БД данные о Bladelet-е удаляются из этой таблицы.ЗаключениеНа протяжении многих лет сервера БД были критическими элементами инфраструктурыИТ. При выборе сервера основное влияние уделялось скорости его работы ифункциональности. Сегодня ситуация изменилась. Я не хочу сказать, что сервера БДперестали быть важными, но фокус находится на приложениях и языках разработки. Этиэлементы привлекают пользователей флэш-графикой, громкими названиями иобещаниями поменять инфраструктуру ИТ за ночь, естественно, в лучшую сторону.Сервера БД рассматриваются как что-то скучное м пригодное только для хранения ивыдачи данных по запросу, написанному на модном языке. С точки зрения разработчиканеобходимо использовать только самый базовый функционал сервера, поскольку этотразработчик может перейти на другой язык (который обещает спасти мир), а тот не будетподдерживать специфичного функционала сервера, а только базовые конструкцииselect,insert,update,delete. По моему мнению, это в корне неправильный подход. Сервера БД отличаются, иотличаются значительно. IDS позиционируется на рынке как уникальный сервер,объединяющий скорость обработки данных с расширяемостью, позволяющейобрабатывать данные с учетом бизнес-логики. Определенные пользователем типы данныхи функции, Bladelet-ы и DataBlade-ы могут быть добавлены к серверу для расширения егофункционала. Используя эти возможности, вы можете сократить время разработкиприложений. Использование этих возможностей IDS предполагает, что вы измените своиподходы к моделированию и разработке баз данных. Например, я считаю, что необходимоширокого использовать distinct-типы данных. Это практика поможет предупредитьошибки в вычислениях. Сейчас вы готовы к более подробному рассмотрению установки и запуска экземпляраIDS. В части 3 мы рассмотрим вопросы, которые необходимо решить перединициализацией экземпляра. Разговор во многом будет общий, поскольку в этой сфереочень мало четких правил. У каждой установки свои уникальные условия ипредъявляемые к ней требования, которые определяют, как экземпляр создается иуправляется.
    • Часть 3. Подготовка к инициализацииВ этой части:  общие вопросы проектирования базы данных  вопросы конфигурации жестких дисков  введение в стратегии архивирования  установка необходимых переменных окружения  подготовка к резидентностиЭта часть охватывает широкий круг вопросов, на которые необходимо дать ответы перединициализацией экземпляра Informix и созданием базы данных. Мы обсудим вопросыпроектирования базы данных, выбора размера таблицы, конфигурирования жесткихдисков, стратегии архивирования, переменные окружения. После прочтения раздела выбудете готовы подготовить вычислительную среду для установки Informix Dynamic Server.Большинство вопросов, которые мы будем обсуждать, очень субъективны и для многих изних нет четких рекомендаций. Ваши приложения и базы во многом уникальны и чтоподходит для одной может быть абсолютно бесполезно для другой. Именно вам,администратору БД, выбирать, что лучше всего подойдет в вашей ситуации. Администрирование сервера БД – сплав науки и искусства. Производительность сервераво многом зависит от способности администратора правильно настроить экземпляр.Нужно сказать, что IDS с каждым выпуском становится более автоматизированным исамонастраиваемым. Хотя сервера БД никогда не смогут работать полностью безадминистратора, IDS старается максимально приблизиться к этой цели. Заключительное слово перед тем, как мы начнем: перед установкой IDS прочтитедокументацию на диске, которая содержит замечания по выпуску, а также рекомендациипо настройке ОС для запуска IDS. В последнем релизе для Linux, UNIX, MacOS документация, в отличие от предыдущихверсий, доступна без установки сервера. После распаковки дистрибутива, она доступна вкаталоге Server/doc. После инсталляции документация доступна в каталоге$INFORMIXDIR/release/en_us/0333 для варианта США/английский язык. В случаедругого языка или страны подкаталог в каталоге release будет отличаться.Логические вопросы проектирования базы данных. Перед установкой нового экземпляра рекомендуется потратить достаточно времени дляпроектирования окружения экземпляра и баз данных, которыми будет управлятьэкземпляр. Необходимо представлять себе требуемую общую производительность, размербазы данных и таблиц, взаимодействие таблиц, как будет производится фрагментированиетаблиц и индексов, каково допустимое время восстановления. Мой опыт подсказывает,что правильно учесть все необходимое с первого раза практически невозможно. Давайте рассмотрим проектирование базы данных. Нужно знать не только, сколькотаблиц будет в базе данных, но и как эти таблицы будут взаимодействовать между собой.Также неплохо знать, какой ожидается рост размеров таблиц, поскольку от этого будетзависеть проектирование дисковой структуры. От предполагаемого размера таблицзависит их размещение в db-пространстве и схема фрагментирования. В свою очередь, отрешения этого вопроса зависит количество создаваемых db-пространств, количесвтонеобходимых жестких дисков и методы защиты от их сбоя. Второй фактор, влияющий на проектирование и размещение таблиц, - характерприложений, которые будут взаимодействовать с базой данных. Будут они выполнятьинтенсивное обновление или чтение? Какой характер самых популярных запросов? Будут
    • ли пользователи иметь доступ к базе данных с помощью инструментальных средств? Еслида, то как защитить таблицы и строки? Лучший путь учесть все факторы и условия – этопостроить функциональный план разработки всего приложения. Эта задача включает всебя анализ требований к производительности и различных существующих ограничений.Для начала надо ответить на такие вопросы:  какую информацию должны видеть конечные пользователи и как она будет отображаться  какие типы данных будут храниться в базе данных  как приложение будет получать данные  как данные будут вводиться, изменяться и удаляться. Когда и как это будет происходить  какой отрезок времени считается приемлемым для выполнения операции в базе данных  какой объем данных будет использоваться для первоначального заполнения таблиц  как будет возрастать размер таблицНекоторые люди называют этот процесс «интим с данными». Как администратор БД выдолжны знать ответы на эти вопросы, чтобы при необходимости помочь разработчикам иадминистрировать сторонние приложения.При покупке стороннего ПО администратор должен представлять ответы навышеперечисленные вопросы. Как и у любого другого разработчика, у вендора естьсильные и слабые стороны. Сильная сторона – возможности приложения (иначе бы выего не опкупали). Однако у вендора не всегда есть возможность создать окружение БД,наиболее подходящее для приложения. Вы можете улучшить скорость работыприложения путем получения максимума информации о дизайне базы данных и о том, какприложение работает с этой базой данных. После того, как приложение установлено, посмотрите размер, месторасположение иколичество db-пространств. В зависимости от ваших аппаратных ресурсов мы можетепересмотреть местоположение таблиц и схему их фрагментирования для достижениябольшей производительности. Кроме того, стоит мониторить проводимые в БДоперации. Настройка производительности может проводиться на уровне экземпляра илиSQL-запросов к БД. Версии IDS 10 и старше позволяют регистрировать директивыоптимизатору SQL для запросов, к которым у вас нет доступа для их модификации. Привыполнении запроса сервер учитывает эти директивы. IDS 11 включает в себявозможность определять самые медленные и дорогостоящие запросы, поэтому вы сразуможете увидеть, над чем необходимо работать. Короче говоря, не прислушивайтесьтолько к советам вендора по установке и настройке приложения.На основе знаний о взаимосвязи таблиц, размерах их возможного роста вы можетепринять решение о дисковой конфигурации сервера. Логический дизайн базы данных –основа проектирования базы данных на физическом уровне: где размещать таблицы,какую избрать схему фрагментирования. Знание того, как приложение работает с БДпозволит вам определить режим ведения логического журнала и его архивирования. Приинициализации экземпляра также могут быть установлены предварительные размерыразделяемой памяти и других конфигурационных параметров.Вычисление размеров таблиц.При использовании неформатированного дискового раздела (сырое пространство) наLinux/UNIX сервер Informix выделяет дисковое пространство для таблиц путем созданияна этом разделе непрерывных секций для db-пространств. Размер db-пространств
    • указывает администратор БД. Такой подход ведет к уменьшению количества движенийголовок дисков и времени чтения таблиц. Вместо того, чтобы обращаться к различнымчастям диска, головка движется в непрерывных разделах диска. Одним из следствийявляется повышение производительности. Если для хранения таблицы требуется больше места, сервер попробует выделить местотак близко, как это возможно, и выполнит логическое объединение пространств, занятыхэтой таблицей. Иногда сервер может выделить пространство в смежной с таблицейобласти диска: оба пространства для таблицы образуют непрерывную область. Это ведет кповышению производительности чтения. В db-пространствах, где содержится более одной таблицы, не всегда возможно выделитьдля таблицы дополнительное смежное пространство, что приводит к пересечению таблиц.На рисунке 3.1 приведена графическая иллюстрация. Рисунок 3.1. Пересечение таблиц в db-пространствеКак можно себе представить, через некоторое время части таблицы – табличные экстенты(table extents) – могут оказаться распределенными по всему db-пространству. В этомслучае сервер БД должен создавать указатели на размещение частей таблицы в db-пространстве, следовательно, часть ресурсов ЦП тратиться на обслуживание такихсписков-указателей. Кроме того, снижается производительность ввода/вывода, посколькувремя тратится на перемещение читающей головки по всему диску. Для систем, где db-пространства размещаются на форматированных файловых системах(в выделенных файлах), вышеприведенные размышления не полностью применимы,поскольку вы не можете контролировать, в какую часть плоского файла, где расположенчанк и/или db-пространство, система будет записывать блок данных. Будьте уверены, чтоблоки данных будут записаны не строго последовательно, и будет наличествоватьпересечение таблиц. Это повлечет снижение производительности дискового ввода/вывода,но преимущества размещения db-пространств в выделенных файлах перекрывают этотнедостаток. При использовании выделенных файлов, операционная система управляетуказателями на части db-пространства, хотя это не полностью снимает с сервера БДзадачи управления месторасположением данных: сервер не занимается обслуживаниемфизических ссылок, но продолжает заниматься обслуживанием логических ссылок. Такаяработа сервера БД может понизить эффективность использования ЦП в случае, есликоличество экстентов таблицы достигает большого числа. Вы можете повлиять на пересечение таблиц путем вычисления того, сколькопространства необходимо выделить для таблицы при ее создании и после некоторого
    • времени. При работе с ранними версиями IDS я использовал следующие правила длявычисления размеров таблиц: - начинаем с начального количества строк в таблице и прибавляем к ним ожидаемое количество строк за следующие шесть месяцев. - полученное количество строк используем для расчета размера начального экстента таблицы - ожидаемое количество строк за следующие шесть месяцев используем для расчета размера следующего экстента.При расчете размера следующего экстента я делил не на 7, как советует документация, ана 6. Хотя это и приводит к увеличению размера экстента, но зато уменьшаетсяколичество экстентов в таблице. Я рекомендую использовать именно 6-ти месячный период, поскольку, во-первых, у васбудет достаточно времени для конфигурирования, а во-вторых, на протяжении этоговремени вы сможете собрать более надежную статистику. Другое преимущество этогопериода состоит в том, что некоторые таблицы растут быстрее, чем планировалось, и,поскольку вы выбрали размер экстента больше, то будете иметь и больше времени дляпересмотра базы данных. В результате, таблица не начнет быстро размазываться поразным экстентам. В критической ситуации вы можете переместить таблицу в большееdb-пространство. Такая же стратегия применяется и наши дни, хотя она и усложняется в том случае, есличасти таблицы размещены в разных db-пространствах или если индексы таблицынаходятся в другомdb-пространстве. Используя приложение (или его версию в форматеPDF с сайта поддержки книги), вы можете рассчитать размер таблицы в случае, когда неиспользуется фрагментация таблицы. Если вы используете фрагментирование таблицыили размещение индексов таблицы в другом db-пространстве, то необходимоиспользовать другой подход для вычисления размера таблицы. Давайте кратко обсудим фрагментирование таблиц (подробно смотрите часть 6).Фрагментирование таблицы – возможность разместить части таблицы, в зависимости отнекоторого условия, в различных db-пространствах. Для фрагментирования таблиц можетиспользоваться два алгоритма. Алгоритм round-robin используется для равномерногоразмещения строк таблицы по всем ее фрагментам. Фрагментирование по выражениюиспользуется для точного указания db-пространства, в которое будет помещена строкатаблицы. В случае использования фрагментирования по выражению при изменениистолбца, который участвует в выражении фрагментирования, строка будет перемещена всоответствующее db-пространство. Использование фрагментирования по выражениюможет существенно повысить производительность системы. Возможность фрагментировать индексы означает, что:  индексы могут размещаться в том же db-пространстве (db-пространствах), что и таблица (индекс «прикреплен»)  индексы могут быть «полуоткрепленными» (semidetached)  быть полностью отдельными и размещаться в других db-пространствах. В этом случае используется логическое выражение, как и для фрагментирования таблицПолуоткрепленный индекс имеет схему фрагментирования, которая включает в себя и тоdb-пространство, где была создана таблица, к которой он относится. Отдельный индекснаходится в db-пространстве, отличном от db-пространства таблицы. При создании схемыфрагментирования индексов вы можете использовать комбинации и значения индексныхключей, но для индексов нельзя указать размер экстента. При вычислении размера экстента фрагментированных таблиц примите во внимание,что вы можете указать только одно множество размеров экстентов для таблицы. Для всехфрагментов таблицы, вне зависимости от схемы фрагментирования, начальный размер
    • экстента будет одинаковым. Когда для фрагмента таблицы требуется дополнительноеместо, сервер БД пробует выделить дисковое пространство, размер которого указан впараметре next size. Если используется схема фрагментирования round-robin, то вседополнительное пространство будет выделено для всех фрагментов таблицыодновременно. Такой подход имеет смысл, поскольку все фрагменты таблицы хранятодинаковый объем данных. Поэтому, когда вы рассчитываете размер экстента длятаблицы, фрагментированной по алгоритму round-robin, используйте методику расчетадля нефрагментированной таблицы. После получения размера начального и следующегоэкстента, разделите эти размеры на число фрагментов, которые вы планируетеиспользовать.Если используется алгоритм фрагментирования round-robin, не забудьте перенестииндексы таблицы в другое db-пространство. В Части 6 я объясню, почему это такважно.Если вы используете фрагментирование по выражению, то дополнительное место дляфрагмента таблицы будет выделяться только тогда, когда он полностью заполнен. Прифрагментировании таблицы по выражению некоторые фрагменты таблицы могут иметьразмер больший, чем другие. При выборе размера следующего экстента таблицы выможете посмотреть только на размер самых больших фрагментов таблицы и выбратьбольшой размер экстента. Но большой размер экстента может переполнить db-пространство, если этот экстент понадобится для маленького используемого редкофрагмента таблицы. В этом случае большая часть пространства просто пропадет. Именно по этой причине рекомендуется помещать большие фрагменты таблицы вотдельные db-пространства и использовать небольшое значение параметра next size. Дляменее часто используемых фрагментов таблиц будут выделяться экстенты меньшегоразмера. Хотя при таком подходе для часто используемых фрагментов таблицы будетвыделяться больше экстентов, но поскольку эти фрагменты хранятся в отдельных db-пространствах, явления пересечения экстентов для этих фрагментов не будет. Как рассчитать размер экстента для фрагментированной таблицы? Большие по размеруфрагменты необходимо разместить в отдельных db-пространствах, где нет других таблиц;маленькие фрагменты можно поместить в db-пространство с другими таблицами. Длявыбора размера экстента используйте ожидаемое количество строк для самогомаленького фрагмента таблицы. Еще одно замечание о фрагментировании по выражению. Необходимо принимать вовнимание количество доступных дисков и его возможное противоречие со схемойфрагментирования, которая базируется только на бизнес-требованиях. Решение офрагментировании индексов принимается на основе требований к приложению. OLAP-приложения, выполняющие последовательное сканирование таблицы, менеечувствительны к индексам, чем OLTP-приложения. Если индексы размещаются в одномили нескольких db-пространствах, сервер БД автоматически вычисляет размер экстентовдля этих индексов. Размер экстента для индекса вычисляется с учетом размера экстентасоответствующей таблицы и размера индексного ключа. Учтите, что прифрагментировании индекса, размер индексной строки увеличивается на 4 байта накаждый ключ.Вопросы, связанные с жесткими дисками.Один из первых вопросов, который я задаю перед началом новой инсталляции Informixили изменением в работающей системе, это «как база данных распределена по дискам».Используется ли зеркалирование средствами ОС или сервера, применяется ли RAID-массив или диски просто подключены к различным SCSI-контроллерам. Это совсем небессмысленный вопрос. Например, массивы хранения (storage arrays) могут подключаться
    • к серверу напрямую или через сеть, могут быть сконфигурированы с поддержкойаппаратного зеркалирования или без нее. Не нужно забывать о возможности создатьпрограммный RAID-массив средствами ОС или сторонними программами. Все этиварианты конфигурирования жестких дисков могут повлиять на производительность инадежность работы IDS. в зависимости от требований к производительности инадежности системы вы можете выбрать ту или иную конфигурацию жестких дисков.Здесь нет одного готового ответа на все случаи жизни, но есть несколько определяющихправил.Первое правило. Вне зависимости от конфигурации дисков, где размещены чанки и db-пространства, диски, на которых находятся корневое db-пространство, физический илогический журналы, должны быть тем или иным образом защищены от аппаратногосбоя (можно использовать зеркалирование на уровне сервера БД, программный илиаппаратный RAID). Ниже мы обсудим различные схемы конфигурирования жесткихдисков.ЗеркалированиеПрограммное зеркалирование данных – ваш первый выбор; оно обеспечивается InformixDynamic Server самостоятельно. Вы можете зеркалировать чанки и db-пространстваэкземпляра. Хотя зеркала функционируют асинхронно, но сервер БД ждет сигналазавершения записи и от зеркала, и от первичного диска. Такое поведение сервера можетснизить производительность. Использование зеркалирования Informix имеет дванедостатка. Первый – снижение скорости работы экземпляра. Операции записи в этомслучае контролируются центральным процессором и виртуальными процессорамиасинхронного ввода/вывода (AIO VPs). Эти задачи должны быть скоординированы сдругими, которые выполняются этими ВП. В предыдущих версиях IDS ВП асинхронноговвода/вывода определялись статически, и если эти процессоры были заняты, процедурызаписи зеркальных данных должны были ждать освобождения ВП. Начиная с IDS 11.10,сервер динамически конфигурирует дополнительные ВП асинхронного ввода/вывода.Хотя общий вывод и говорит, что аппаратное зеркалирование работает быстрее, чемпрограммное, но и в этом случае производительность сильно зависит от контроллера,который осуществляет операции записи. Второй недостаток зеркалирования средствами Informix – это невозможностьзеркалировать отдельный чанк db-пространства, вы должны зеркалировать все db-пространство. Несколько лет назад покупка диска для хранения зеркальной копии былодорогим удовольствием. Сегодня цены значительно снизились. Но повысились итребуемые объемы дисков, поэтому нельзя сказать, что зеркалирование стало дешевле,чем в старые добрые времена, когда диски стоили по доллару за мегабайт. Теперь поговорим о преимуществах. Поскольку именно сервер БД контролирует записьна диск, по коду возврата операции записи он может решить, что делать при сбоеоперации записи. Например, передать данные об ошибки приложению или аппаратномуконтроллеру. Второе преимущество – улучшенная производительность. Сервер может использоватьзеркальные копии для чтения данных наряду с первичными дисками. Эта технологияносит название расщепляющее чтение(split read). В OLAP-ориентированных БД, гдемного последовательных операций чтения, расщепляющее чтение позволяет выполнятьсканирование таблиц параллельно, что приводит к ускорению выполнения запроса.Необходимо отметить, что зеркалирование позволяет защитить данные от механическогосбоя оборудования.RAIDВ последние несколько лет дисковые массивы (storage arrays) стали стандартом де-фактодля хранения данных в больших и не очень компаниях. Массивы бывают самые
    • разнообразные – от простого набора дисков, подключенного к контроллеру на платесервера до очень сложных сетевых серверов, снабженных механизмом автоматическогоархивирования и восстановления дисков. Из-за физических размеров жестких дисков (х, удюймов) существует ограничение и на размер таких массивов – надо иметь возможностьпротащить массив в дверь. Обычно массивы оснащаются очень большими по объемужесткими дисками. Все массивы обеспечивают один или несколько уровней RAID для создания логическихэлементов хранения (logical units LUN). Здесь необходимо сказать о таком моменте: еслиLUN созданы на основе одних и тех же дисков в массиве, это может привести кснижению производительности работы системы из перегрузки ввода/вывода. Корме того,перед созданием на этих дисках db-пространств необходимо знать и характеристикиRAID.Использование RAID подразумевает объединение нескольких физических дисков вRAID-массивы, которые на уровне ОС видно как один большой диск (LUN). ИспользуяRAID, можно разделять данные по дискам или защищать данные от сбоя путем храненияна других дисках зеркальной копии или корректирующих кодов. В некоторых случаяхможно делать и то, и это. В случае аппаратного сбоя правильно настроенный RAIDпозволяет восстановить данные: после замены неисправного диска данные будутвосстановлены на новый исправный диск. Для достижения необходимо уровня устойчивости к сбоям необходимо обеспечитьизбыточность для всего массива. Сюда включаются резервные источники питания,дисковые контроллеры, резервное питание кэша контроллера и т.п. В спецификациях уровней RAID есть некоторые неопределенности, поэтому реализацииуровней RAID от разных производителей могут слегка различаться. Хотя существует 7уровней RAID, большинство производителей предлагает реализацию RAID 0,1,2,3,5,6-уровней. Некоторые производители также поддерживают уровень 0+1 или 10, которыйявляется комбинацией уровней 0 и 1. Для более детального знакомства с теориейпостроения RAID можно почитать книжку «The RAIDbook» Пола Массигла (PaulMassiglia). Для большинства БД-приложений наиболее подходящими являются уровни 0,1 и их комбинация. Если критичными являются не скорость дисков, а использование ихобъема, стоит подумать об использовании RAID 5, который также применяется припостроении витрин данных. Теперь давайте рассмотрим основные уровни RAIDдетальнее.RAID 0В RAID 0 (см. рис. 3.2) данные разбиваются на полосы между двумя или большимколичеством дисков; это похоже на алгоритм фрагментирования round-robin
    • Рисунок 3.2 RAID 0Основное преимущество RAID 0 – ускорение доступа к данным при обработке большихобъемов данных. Когда серверу необходимо найти строку данных, поиск ведется на всехдисках массива, и поскольку на каждом диске находится определенная часть данных,строка найдется быстрее, чем в случае использования одного большого диска. При использовании RAID 0, в отличие от фрагментирования по алгоритму round-robin,вы не можете быть уверены, что строка данных целиком находится на одном из дисковмассива. Ее элементы могут быть размещены на разных дисках массива, что можетпривести к неприятностям в случае сбоя одного из дисков массива. В отличие отфрагментирования по выражению, вы не можете указать, как распределять данные междудисками. Поиск строки ведется по всем дискам. Поскольку в RAID 0 дискиопрашиваются синхронно, это может привести к задержкам в высоконагруженных OLTP-системах, так как контроллер будет ждать от всех дисков отчета о каждой операциичтения/записи. В OLAP-системах использование RAID 0 производительность можетувеличиться, поскольку в этих системах обрабатываются большие объемы данных. Выбор между фрагментированием по алгоритму round-robin и использованием RAID 0надо делать после серии тестов в вашем окружении. Но при выборе не рассматривайте вкачестве аргумента только скорость доступа к данным. Примите во внимание такжевозможность управлять данными на логическом уровне с помощью команды alterpartition. Гораздо легче понять размещение данных в базе данных или таблице спомощью отчета dbschema, чем пересматривать конфигурации экраны RAID. Будьте осторожны. RAID 0 не обеспечивает защиты от сбоев: если какой-то дискмассива выйдет из строя – все данные на массиве будут утеряны.Уровень 1RAID 1 – это просто зеркалирование диска. Этот уровень обеспечивает максимальнуюдоступность данных, но является самым дорогим в реализации.
    • Рисунок 3.3 RAID 1. Зеркалирование данных дисковВ аппаратных реализациях RAID 1 контроллеры RAID мониторят коды возврата отдисков (успешность/неуспешность операции). Если контроллер получает данные,которые он определяет, как сбой диска, то диск выключается из обслуживания, аоставшийся диск продолжает функционировать. При выборе производителя RAID незабудьте уточнить, функционирует ли зеркальный диск синхронно или асинхронно,поскольку это оказывает влияние на производительность. Некоторые производителиподдерживают не только зеркалирование 1:1, но и зеркальную замену (mirror spare). Этазамена является суррогатным зеркальным диском для «выжившего» диска в зеркальнойпаре и обеспечивает зеркалирование даже в случае сбоя одного диска. Теоретически и взависимости от того, сколько дисков вы объединили в массив RAID 1, вы сможетезаменить сбойный диск и восстановить зеркалирование. Некоторые производителипозволяют сконфигурировать более одного диска зеркальной замены, что повышаетнадежность массива. Не забывайте тестировать производительность RAID 1 и зеркалирования средствамиInformix. Одно из основных преимуществ аппаратных RAID – возможность «горячейзамены» дисков: вы можете вытащить поврежденный диск из массива и поставить на егоместо исправный без остановки сервера или RAID-массива. Но эту возможностьобязательно необходимо протестировать перед применением – работает ли она, какнеобходимо, и не приводит ли ее использование к сбою работы всего массива. Если выдля замены сбойного диска останавливаете сервер, то можете сберечь деньги, используязеркалирование средствами Informix. Но использование RAID 1 может принести в вашейситуации и увеличение производительности.Уровень 0+1/10На рисунке 3.4 представлена графическая иллюстрация этого уровня RAID: этот уровеньпредполагает зеркалирование RAID 0.
    • Рисунок 3.4 RAID 0+1 Зеркалирование чередующихся данных.Этот уровень RAID позволяет объединить преимущество RAID 0 в скорости спреимуществом RAID 1 в надежности. Так как это «неофициальный» уровень RAID, егореализации могут быть самые разнообразные. Поэтому перед использованием этогоуровня необходимо выполнить набор тестов для проверки скорости работы исовместимости его с вашим окружением.Уровни 5 и 6Это самые популярные и самые медленные уровни RAID. Эти уровни RAID можноприменять, если скорость доступа не является критической величиной и когдабольшинство операций в базе являются операциями чтения, а не записи. Уровни 5 и 6 практически идентичны: для хранения данных используется 75%дискового пространства, а оставшиеся 25% предназначены для хранения контрольныхкодов, рассчитанных по специальному алгоритму коррекции ошибок (код Хемминга). Нарисунках 3.5 и 3.6 приведена графическая иллюстрация RAID 5 и RAID 6. В RAID 5 биты четности отдельного диска размещены на всех остальных дискахмассива. В RAID 6 на дисках массива записывается не только информация о четности, нои второй набор контрольных битов, инверсный первому. Это позволяет массивуоставаться работоспособным даже после выхода из строя двух дисков. Скоростьдискового ввода/вывода при использовании этих уровней RAID мала из-за того, чтозаписывается не только информация на целевой диск, но и информация о четности на всеостальные диски. Преимущество RAID-массивов этих уровней состоит в том, что ихиспользование обеспечивает неплохую сохранность данных и требует меньше дисковогопространства, чем использование RAID 1. При использовании RAID 5/6 желательноиметь контроллер с большим объемом кэш-памяти. Это требование увеличиваетстоимость реализации массива.Программные RAIDНекоторые возможности аппаратных RAID можно получить путем использованиявозможностей ОС. Обычно ОС поддерживает RAID 0,1,5. технология программных RAIDимеет много недостатков. Один из основных - необходимые вычисления проводятсяцентральным процессором сервера, а не специальным процессором RAID-контроллера.
    • Это значит, что ресурсы процессора тратятся не на работу сервера БД и обработкупользовательских запросов, а на расчет корректирующих кодов. В отличие от аппаратныхрешений, программные решения не допускают горячей замены сбойных дисков, поэтомудля замены такого диска необходимо останавливать сервер.Что выбрать?Что вам следует выбрать из всего этого многообразия? Ответ зависит от вашихприоритетов и финансовых возможностей. Если важна высокая доступность –используйте RAID 1 или зеркалирование Informix. Для большей производительностиопераций, работающих с большими блоками данных, например, для OLAP, и в случаеесли вы готовы пожертвовать надежностью в пользу скорости, используйте RAID 0. Есливы, как обычно, хотите и скорости работы и защиты от сбоя, выбирайте RAID-контроллер, который поддерживает RAID 10. если стоимость важнеепроизводительности, смотрите в сторону RAID 5,6. А если стоимость являетсяосновополагающим фактором, используйте программный RAID средствами ОС.Что использовать для db-пространств: выделенные файлы или сыроепространство?В части 1 говорилось, что исторически под UNIX/Linux db-пространства создавались насырых дисках (неформатированное дисковое пространство). Потом быстрое развитиедисковых массивов позволило многим заказчикам начать использование файлов дляхранения чанков и db-пространств. Раньше была разница в производительности сервераБД при использовании сырых устройств и выделенных файлов. Это объясняется тем, чтозапись в файл и чтение из него выполнялось средствами ОС. В IDS 11 добавлен новыйконфигурационный параметр DIRECT_IO, установка которого позволяет серверу писатьпрямо в файлы, где хранятся чанки и db-пространства. Использование этой возможностипозволяет достичь производительности, сопоставимой с производительностью прииспользовании сырого пространства. Эта возможность является платформо-зависимой,поэтому перед ее использованием проконсультируйтесь с документацией по вашейверсии Informix. При использовании этой опции не забывайте об ограничениях ОС ифайловой системы на размер файла. Кроме того, учтите, что дополнительноепространство для файлов будет выделяться средствами ОС, и это пространство не будетнепрерывным (в отличие от использования сырого пространства). Определить, приведетли необходимость в дополнительном поиске по диску к замедлению работы системы –это ваша задача. Я полагаю, что нет. Заключительные мысли по этой теме. При создании файлов для чанков в Windows,обязательно соблюдайте соглашения об именовании файлов (мы их рассмотрим чутьпозже). Хотя возможно в рамках экземпляра использовать и выделенные файлы, и сырыеустройства, но делать этого не следует. Если поддержкой вашей системы занимаетсянепрофессиональная команда, то в этом случае безопаснее использовать сырые диски,поскольку в таком случае невозможно будет удалить файлы базы данных из-за ошибки вкоманде rm. Кроме того, малоквалифицированный инженер поддержки вряд ли полезетмонтировать или форматировать сырые диски. Я не хочу говорить, что сырые дискиполностью снимут вышеизложенную проблему, но их использование может снизить рискповреждения базы данных.Использование символических ссылокНеважно, используете ли вы файлы или сырые устройства на сервере под управлениемUNIX/Linux, но при передачи пути к ним в утилиты командной строки, приредактировании конфигурационных файлов, при вызове административных API-функцийвам следует использовать не полный путь к этим устройствам/файлам, а символическиессылки на них. Есть несколько причин использовать символические ссылки. Первая –
    • возможность перенести окружение на другие диски или на другой сервер. Сейчас ярасскажу случай из собственной практики, почему использование символических ссылокпредпочтительнее. Однажды я работал с экземпляром, где использовались именаустройств из схемы разбиения диска. В один прекрасный момент диск поломался, и язаменил его диском такой же модели, но на котором было меньше свободногопространства, чем на оригинальном. Поскольку в окружении использовались именаустройств, а второго запасного диска не было, я был вынужден использовать этот. Ксчастью, хотя на диске было меньше свободного места, но последний разделоригинального диска не использовался для хранения чанков. Если бы мы использовалисимволические ссылки и мне нужен был последний раздел диска, то я бы поступил так:откусил бы кусок необходимого мне пространства от другого диска или бы объединилдва физических диска в один логический, а затем отредактировал бы символическуюссылку, чтобы она указывала туда, где я создал новое пространство. Эти мероприятия неповлияли бы на экземпляр. Нужно ли вам переместить базу данных из одной частимассива в другую или сменить формат диска (например, перенести базу на RAID 0) – влюбом случае использование символических ссылок сделает этот процесс проще,особенно если используется зеркалирование средствами Informix. Процесс состоит изнескольких шагов:  сконфигурировать новые диски  отключить зеркалирование  пересоздать символические ссылки на зеркальные копии так, чтобы эти ссылки указывали на новые диски  включить зеркалирование и дождаться восстановления  теперь зеркальная копия восстановлена. Повторить шаги для первичных чанковЕсли вы переезжаете на новый сервер, которого достаточно для корректноговосстановления БД, то использование символических ссылок позволит избежать проблем,связанных с дисками и лентами. Создайте ту же структуру каталогов, как и на исходномсервере, создайте необходимые символические ссылки и выполните восстановление изархива (в части 7 мы рассмотрим второй метод изменения местонахождения устройств,который называется «перенаправленное восстановление» (redirected restore) ). Второепреимущество символических ссылок – возможность соблюдать соглашения поименованию. Символические ссылки дают возможность проще анализироватьфизическую реализацию дизайна окружения. Поскольку команда onstat –d возвращаетпуть к устройствам, на которых созданы чанки, использование символических ссылок спонятными именами может упростить администрирование системы, и вам не придетсясмотреть на такое: /dev/rdsk/c0b0t2d0s5. Создать символические ссылки очень просто. Ниже скажу, что при установке сервера, ясоздаю подкаталог devices. В этом подкаталоге создаю подкаталоги для каждогоэкземпляра, который будет работать на этом сервере. Для всех чанков экземпляра всоответствующем каталоге создаются символические ссылки. Для созданиясимволической ссылки применяется такой синтаксис: ln –s имя_устройства желаемое_символическое_имяДавайте, например, создадим в каталоге /opt/IBM/Informix/devices/styx символическуюссылку styx_chnk_1 на сырое устройство. ln –s /dev/rdsk/c3b0t4d0s3 styx_chnk_1 Обязательно не забудьте выставить права на устройства, на которые указываютсимволические ссылки. Для установки владельца и группы используются команды chown
    • и chgrp. Владельцем устройств, которые используются экземпляром Informix, долженбыть пользователь и группа informix. Права на файл должны быть 660 или rw-rw----.Работа с выделенными файламиПроцесс создания и использования выделенных файлов в Linux, Mac OS X, UNIX несложен. Перейдите в каталог, где вы хотите создать файл, и для создания файлаиспользуйте команду touch. Установите владельца, группу и права доступа так, какуказано в предыдущем разделе. В листинге 3.1 показан процесс создания несколькихфайлов, которые будут использоваться для хранения db-пространств экземпляра/## cd /ifmx_data/tagus# touch r_dbs chnk1## chmod 660 r_dbs chnk1# chown informix r_dbs# chgrp informix r_dbs## chown informix:informix chnk1# ls –lrw-rw---- informix informix 18:34 0 r_dbsrw-rw---- informix informix 18:34 0 chnk1 Листинг 3.1. создание выделенных файлов для экземпляраКогда вы используете файл для создания чанка или db-пространства, файл будетрасширяться до размера, указанного при создании db-пространства или чанка. Незабудьте, что на расширение файла будут влиять параметры ядра. В документации насервер есть рекомендации по настройке ОС для поддержки больших файлов. Не забудьтепрочитать эти рекомендации и инструкции по настройке ОС. После создания выделенныхфайлов вы можете обращаться к ним по символической ссылке, как это было показаноранее. В Windows-версиях IDS вы обязаны следовать соглашению по именованию иразмещению файлов для чанков и db-пространств. Более подробно мы поговорим об этомв части 5.Вопросы проектирования db-пространств.Процесс создания чанков и db-пространств на дисках , а затем размещения в них таблицна 2/3 является наукой, а на оставшуюся треть – это пробы и ошибки. Я обращал на этоваше внимание в начале раздела, когда говорил о важности логического проектированиябазы данных. Типы и частота запросов DML, количество и размер таблиц в базе,допустимая гранулярность восстановления – все это повлияет на то, сколько db-пространств вы создадите и как они будут организованы. Основная цель при переходе слогического уровня на физический – равномерно распределить нагрузку ввода/выводамежду всеми дисками в системе. Администраторов массивов заставляют бороться замаксимальное использование дискового пространства и минимальное администрированиемассива. С их точки зрения это значит создание массива RAID 5 или RAID 6 из всехдисков системы. Часто контроллеры RAID имеют большую память, но с точки зренияInformix это бесполезно. Дизайн RAID требует участия всех дисков в операцияхввода/вывода. Если на массиве создано 5-10 LUN, ввод/вывод в эти LUN будетсериализован. Сервер держит наиболее часто используемые данные в своем буфере
    • памяти, скорость доступа к которому значительно больше, чем скорость доступа кмассиву. Сервер даже выполняет упреждающее чтение, если план запроса показываетнеобходимость в последовательном чтении. Единственное место, где наличие памятиконтроллера является плюсом - это операции записи. Вместо ожидания завершенияоперации ввода/вывода данные помещаются в кэш-память контроллера и экземплярувозвращается ответ, что запись завершена. В этом случае крайне важным являетсяналичие нескольких уровней защиты кэш-памяти контроллера. В противном случае раноили поздно данные будут в несогласованном виде, когда транзакция подтверждена, ноданные из кэш-памяти не были записаны на диск. Хотя это и крайне сложно, попробуйте заставить администраторов массива выделить для базы данных отдельные диски, а затем попытайтесь сделать так, чтобы одному физическому диску соответствовал один логический. Если вы создадите много чанков на нескольких больших дисках, вам не удастся полностью распараллелить дисковый ввод/вывод. Можно попробовать купить более старые модели систем хранения с дисками меньшего объема. Это может обойтись дешевле и помочь вам избежать конкуренции дискового ввода/вывода. В конце обсуждения давайте представим, что мы живем в идеальном мире и можем администрировать дисковые массивы так, как захотим. Не будут еще раз напоминать, насколько важно в OLTP-системе помещать наиболее активно используемые таблицы или их фрагменты в db-пространства на отдельных дисках или на дисках, где хранятся db- пространства с малоиспользуемыми таблицами. Это же утверждение справедливо и для индексов. При использовании сырых разделов старайтесь помещать db-пространства с активно используемыми таблицами ближе к центру диска. При использовании зеркалирования сторонними средствами или средствами IDS не только держите исходные данные и их зеркальные копии на разных дисках, но и подключите эти диски к разным контроллерам. Это наука. После того, как будут настроены и запущены экземпляр, база данных и клиентское приложение, вы увидите, насколько теория была близкой к практике и сможете внести необходимые изменения. Здесь приходится идти методом проб и ошибок. На помощь в этой работе придет гибкость IDS. используя фрагментирование по выражению вы можете безболезненно разнести таблицу по разным db-пространствам и сбалансировать нагрузку по вводу/выводу. С версии IDS 10 для административных целей создавать несколько фрагментов таблицы в одном или нескольких db-пространствах. Разработчики Informix рекомендуют соответствие чанков db-пространствам 1:1 (не очень ясно. Наверное, понимать так, что db-пространство должно состоять из одного чанка. IDS development recommends a 1:1 correspondence of disk chunks to dbspaces ). Некоторые идут дальше и рекомендуют класть в db-пространство или несколько маленьких таблиц, или фрагмент одной большой таблицы. Если учесть новые возможности архивирования/восстановления и наличие параметра DATASKIP, такая рекомендация имеет смысл. Установка параметра DATASKIP позволяет экземпляру функционировать даже если db- пространства находятся оффлайн, если это только не корневое db-пространство или db- пространства, содержащие физический журнал или любой из логических журналов. По- прежнему будут доступны запросы к таблице, фрагменты которой хранятся в отключенных db-пространствах. Конечно, данные из отключенных db-пространств получить будет невозможно и приложению будет возвращена ошибка, сигнализирующая о том, что часть данных находится в отключенных db-пространствах. IDS поддерживает возможность «теплого восстановления» некритичных db- пространств. Вы можете восстановить оффлайн db-пространства не останавливая экземпляр. В части 7 мы рассмотрим подробно процесс архивирования и восстановления. Если вы следуете рекомендации по взаимному соответствию чанк-db-пространство (1:1 chunk-to-dbspace recommendation ) и рекомендациям по расположению таблиц в db-
    • пространствах, то в случае сбоя всего db-пространства недоступными будут фрагментбольшой таблицы или несколько маленьких таблиц. Все это можно восстановить заотносительно короткое время. Еще одно замечание – не экономьте на предполагаемых размерах db-пространств. Кактолько вы начнете работать в новом окружении, обязательно начнетсянепредусмотренный рост таблиц или потребуется хранить новые элементы данных. Явидел много компаний, где дисковые массивы закупались без расчета будущего роста.Через некоторое время складывалась ситуация, где надо было или удалять часть данных,или закупать дополнительное оборудование, или мирится с замедлением дисковоговвода/вывода. С точки зрения долговременной перспективы всегда дороже не думать овозможном росте.Настройка ядраКак я говорил в части 1, в IDS обработка данных и пользовательских запросовпроизводится с помощью виртуальных процессоров, в частности, CPU, AIO ВП. Каждыйиз этих ВП представляет собой процесс операционной системы UNIX, Mac OS X, Linux.Эти процессы являются многопоточными, поэтому используют много системныхресурсов. Если на физическом сервере планируется запускать несколько экземпляровIDS, надо настроить сервер для высоконагруженного окружения. В частности надо отконфигурировать параметры разделяемой памяти и процессов.Экземпляру для каждого ВП требуется семафор и подсоединение к разделяемой памяти. Необходимо также сконфигурировать «наборы» семафоров. На каждые 100пользовательских сессий в разделяемой памяти требуется такой набор. Также необходимнабор семафоров для каждой группы из 100 или меньше ВП. На физическом сервере, где работает один экземпляр Informix проверьте, что параметрядра SHMMAX (или подобный) установлен так, что вы сможете выделить на один блокпамяти больше, чем максимально требует экземпляр. На сервере, где выполняетсянесколько экземпляров IDS, значение параметра SHMMAX должно превышатьсуммарное количество памяти, требуемой всеми экземплярами сервера. При использовании выделенных файлов необходимо проверить параметры ulimit,буферов ввода/вывода ФС. Как говорилось выше, набор документов по инсталляции для UNIX, Linux, Mac OS Xдоступен в каталоге SERVER/doc. После установки полный набор документации,замечаний к выпуску и т.п находится в подкаталоге release каталога $INFORMIXDIR. Особое внимание обратите на документ ids_machine_notes_versionnum, где versionnum– версия вашего IDS. этот документ есть в формате обычного текста и в формате HTML.В этом файле указаны параметры настройки ядра для вашей ОС, техническиеспецификации на $SQLHOSTS и другие конфигурационные файлы, список патчей наОС, которые использовались разработчиками, описание нововведений в версии и т.п. Обязательно посмотрите параметры настройки ядра. Группа разработки IDS даетрекомендации по ним на основе конфигурирования и тестирования продукта во время егоразработки и проверки. Использование средств мониторинга системы поможет вамувидеть, насколько рекомендуемые параметры применимы в вашем окружении. Можетоказаться необходимым внесение изменений вэти параметры для достижения большейпроизводительности. Это тоже часть изучения Informix Dynamic Server.Стратегии архивирования.Один из важных вопросов проектирования – как и когда вы будете архивироватьэкземпляры IDS (в том числе журналы). Эти архивы спасут вас от двух проблем, токоторых не убережет никакой RAID – от кривого пользовательского ввода и от полногоразрушения RAID по какой-либо причине. Прежде, чем мы начнем обсуждать стратегииархивирования, необходимо сделать важное замечание по истории Informix. С самого
    • начала IDS имел возможность делать полный или инкрементальный архив в то время,когда экземпляр был он-лайн и полностью функционировал. Эта возможность IDSсущественно упрощает жизнь администратора. В IDS есть две программы для архивирования и восстановления, каждая со своимисильными и слабыми сторонами. Программа ontape используется с самой первой версии сервера Informix и используетсямногими крупными и мелкими компаниями, несмотря на то, что появились различныеальтернативы. В версиях до IDS 10 ontaoe требовала ответов на приглашение во времяархивирования, что затрудняло автоматизацию операций, сейчас этот вопрос неактуален.Программа архивирует весь экземпляр, начиная с 0-го чанка и до последнего чанка. В последних версиях функциональность ontape была расширена. Программа все равнопроизводит архивирование всего экземпляра, но восстановление можно вести на уровнеdb-пространств. Если db-пространство не содержит критичных для функционированияэкземпляра элементов (корневое db-пространство, физический журнал или какой-либо излогических журналов), восстановление такого db-пространства может проводится в товремя, когда экземпляр находится он-лайн. Программа ontape поддерживает несколькотипов ленточных устройств. Это 4-миллиметровые и 8-миллиметровые стримеры DAT-картриджи и четвертьдюймовые стримеры (QIC), подключенные напрямую кфизическому серверу. Не поддерживаются ленточные библиотеки (autochangers,jukeboxes). В IDS 10, IDS 11 ontape может архивировать данные и на диск. Этиусовершенствования мы обсудим в части 7.В случае крайней необходимости вы можете архивировать данные на удаленныеустройства, расположенные на других системах, но делать так не рекомендуется.Сообщения от удаленной системы о закрытии устройства в конце архивирования неприходит, поэтому процесс архивирования корректно не заканчивается, и его надоостанавливать руками. Например, архивирование логических журналов на удаленное устройство остановитсяпосле архивации первого журнала. Команда ontape –c не получит подтверждения озаписи первого журнала на диск, следовательно после заполнения второго журналапроцесс архивирования оставит этот журнал на диске, поскольку первый журнал еще незаписан на ленту. В конечном итоге это приведет к заполнению всех журналов, если вытолько не включили динамическое создание журналов. А включенное динамическоесоздание журналов приведет к заполнению диска незаархивированными журналами.Для архивирования и восстановления может также применяться набор программ ON-Bar.Этот комплекс состоит из двух компонентов: ON-Bar API и Informix Server Manager(ISM) –системы управления лентой, которая взаимодействует с API. Перед IDS 10 ON-Bar была предпочтительным выбором для автоматических операций архивирования, но вIDS 11 функциональность ontape была расширена. Выбирать вам. Обе программыявляются прекрасным выбором. С помощью ON-Bar ISM или стороннего приложения вы можете выполнять частичное(warm) и полное архивирование и восстановление экземпляра есть возможностьвыполнить восстановление базы на определенный момент времени. Архивирование ивосстановление может выполняться в несколько потоков и на несколько устройств, чтоуменьшает время архивирования и восстановления. В IDS 11 в ON-Bar добавлендополнительный функционал. Мы обсудим его в части 7. Ниже приведены некоторые замечания, которые необходимо принять во внимание приразработке стратегии архивирования. Хотя я использую термин «база данных», эти жерассуждения применимы и к экземпляру
    •  насколько критичны данные? Естественно все данные необходимы, иначе зачем их архивировать, но какое время допустимо на восстановление?  Сможете вы восстановить данные? Какие затраты необходимы ?  Каково допустимое время полного восстановления? Каково допустимое время восстановления db-пространства, содержащего часть важной таблицы или набор статических справочных таблиц?  How important is it that you can recover to an approximate moment in time?Ответы на эти вопросы определят, будете ли вы архивировать логические журналы наленту, как часто вы будете архивировать экземпляр и какой уровень архива будетеиспользовать. Эти решения также повлияют на проектирование db-пространств(количество db-пространств, их размер, размещение таблиц по db-пространствам). Мыподробно обсудим эти вопросы в части 7. На эти же вопросы необходимо будет ответить при настройке репликации. О настройкерепликации мы поговорим во второй книге. Настройка окружения.Перед запуском инсталлятора Informix необходимо создать или изменить некоторыефайлы и установить некоторые переменные окружения. Я ограничусь рассмотрениемнастроек сервера. С точки зрения клиента существует много путей подключения ксерверу. Для не-UNIX клиентов необходимо настроить драйвер ODBC или JDBC.Корректная настройка драйвера включает в себя установку имени экземпляра, именифизического сервера, номера порта для соединения и некоторых других переменных.Настройку клиента оставляю на упражнение читателюПодготовка места инсталляцииКак сказал Король Белому Кролику в «Алиса в стране чудес»: «Начнем сначала». Напервом шаге необходимо определиться, куда ставить сервер и как организовать структурукаталогов для безболезненного администрирования, обновления. Я имею своипредставления об этом вопросе на основе многолетнего опыта администрирования IDS ирешения проблем многих заказчиков. Нижеприведенные советы справедливы для UNIX,Linux, Mac OS X . Windows имеет свои принципы администрирования. По моему мнениюнеобходимо вынести столько компонент, сколько возможно, из каталога двоичныхфайлов $INFORMIXDIR. В $INFORMIXDIR необходимо устанавливать толькодвоичные файлы сервера и DataBlade’ов. Вес остальное желательно вынести в отдельныекаталоги, как показано на Рис. 3.7
    • Рисунок 3.7. Рекомендованная структура каталогов для установки IDSВ примере сервер БД устанавливается согласно общим стандартам IBM в каталог/opt/IBM/product_name. Для каждого отдельного релиза (10, 11.50) создан отдельныйкаталог, так что на сервере может работать более одной версии. Эта же структураупрощает миграции между различными версиями.На Mac OS X директория для установки по умолчанию /Applications/IBM/Informix. Выможете выбрать следовать ли соглашению Mac OS X по установке программ илииспользовать каталог /opt. Если кроме серверов Mac OS X вы поддерживаете сервера надругих ОС, я рекомендую проводить установку в каталог /opt. Это сделаетпереносимыми ваши скрипты и другие утилиты. Если вы новичок в IDS, то лучшеследуйте соглашениям Mac OS X /Applications/IBM/Informix. Каталог scripts содержит в себе административные скрипты архивирования, управления логическими журналами, внешние программы ALARMPROGRAM, задачи и т.п В каталоге devices находятся подкаталоги каждого экземпляра, сконфигурированного на физическом сервере. В примере на сервере сконфигурированы экземпляры koetari, odra. В подкаталогах хранятся символические ссылки на физические устройства (диск и стример), сконфигурированные для экземпляра. В отдельные каталоги я при необходимости устанавливаю Informix Server Administrator(ISA) или Open Admin Tool. Все журналы экземпляров я складываю в один каталог, что позволяет быстро находитьвсю необходимую информацию. Чтобы не запутаться в том, какому экземплярупринадлежит журнал, я использую соглашение по именованию журналов. Журналыдвухнедельной давности с помощью скрипта из каталога scripts перемещаются вподкаталог old_logs. Каталог backups я часто выношу в отдельную файловую систему. Для архивов такжеиспользуется соглашение по именованию. Через некоторое время, в соответствии сбизнес-правилами, архивы удаляются с файловой системы с помощью скрипта из каталогаscripts.
    • В каталоге shared_libs находятся объектные файлы определенных пользователемпроцедур (UDR), написанных на С. При такой структуре каталогов легко переходить между версиями Informix. Я могуизменить переменную среды $INFORMIXDIR с /opt/IBM/Informix/10 на/opt/IBM/Informix/11_50 и наоборот. Обязательно учтите, что кроме переменной$INFORMIXDIR необходимо отредактировать $SQLHOSTS и $ONCONFIG. Вышеприведенный подход прекрасно работает на Linux, Mac OS X, UNIX, но наWindows это не совсем так из-за ограничений, накладываемых использованиемсистемного реестра. В настоящее время некоторые пути жестко закодированы впрограмме установки и не могут быть изменены. Я надеюсь, что в следующих выпускахIDS эти ограничения будут сняты.Требуемые файлыЕсли исключить символические ссылки на чанки и ленточные устройства, то перединициализацией IDS необходимо отредактировать три файла. Первый из них получаетсяпутем редактирования шаблона $INFORMIXDIR/etc/onconfig.std. Для двух других:$INFORMIXDIR/etc/sqlhosts и /etc/services шаблона нет. Давайте подробнее рассмотримэти файлы, а заодно и некоторые переменные окружения. Которые необходимоустановить.Файл $ONCONFIGВ файле хранятся параметры, необходимые для создания структур разделяемой памятиэкземпляра. В нем также находятся данные о наиболее важных физических устройствах,необходимых серверу для инициализации или восстановления, и параметры ,необходимые для работы дополнительной функциональности экземпляра (репликацияданных, кэширование выражений SQL и .т.п). для каждого экземпляра Informix нафизическом сервере должен быть создан отдельный файл $ONCONFIG. Шаблон этого файла называется onconfig.std и при корректной установке IDS находитсяв каталоге $INFORMIXDIR/etc. Для того, чтобы использовать этот файл, вы должныскопировать его в тот же каталог под уникальным именем. Имя может быть любое, нобольшинство администраторов в имени файла используют слово «onconfig». Я обычноназываю файл onconfig.instance_name, где instance_name – полное или сокращенное имяэкземпляра, параметры которого хранятся в файле. Например, при написании книги яиспользовал для именования экземпляров названия рек – Amazon, Columbia, Kern, Styx.Файлы $ONCONFIG для этих экземпляров называются onconfig.ama, onconfig.col и т.д. вЧасти 4 я подробно объясню значение некоторых параметров $ONCONFIG.Важно не изменять права доступа к файлу $ONCONFIG: просто скопируйте правадоступа с шаблона onconfig.std. также не удаляйте и не изменяйте шаблон onconfig.std.Если файл $ONCONFIG доступен для записи и кто-то туда запишет чего-нибудьлишнего, при последующем переходе из режима оффлайн экземпляр может просто незапуститься. Начиная с IDS 10 сервер проверяет права доступа к этому и ещенескольким критическим файлам, и если права установлены некорректно – сервервыбрасывает ошибку. Когда вы первый раз запускаете экземпляр – файл $ONCONFIG необходимоотредактировать. Во время функционирования экземпляра вам, возможно, такжепотребуется его редактировать. При редактировании будьте очень внимательны иосторожны. Одна опечатка может привести к разрушению экземпляра.В Windows во время инициализации экземпляра у вас нет возможности поменять имяфайла $ONCONFIG. Процесс инсталляции и инициализации создает копию файла подуникальным именем – имя примерно соответствует правилам именования, которыми я
    • пользуюсь, но содержит полное имя экземпляра onconfig.instance_name. Вы можетепереименовать файл, но я рекомендую этого не делать. Если вы все же желаете этосделать – перезапишите значение ключа $ONCONFIG в ветке реестраHKEY_LOCAL_MACHINESoftwareInformixOnLineinstance_nameEnvironment.Перед редактированием файла обязательно сохраняйте копию старого экземпляра итолько потом перезагружайте экземпляр.Файл $SQLHOSTSФайл $INFORMIXDIR/etc/sqlhosts предназначен для соединения с сервером по сети. Ясравниваю этот файл с телефонной книгой IDS – он указывает, по какомукоммуникационному протоколу можно связаться с экземпляром. Файл используетсяклиентскими приложениями для связи с экземплярами IDS. экземпляры также используютэтот файл при проведении распределенных операций. При инсталляции сервера устанавливается шаблон этого файла sqlhosts.std. В отличие отonconfig.std, который изменять нельзя, я переименовываю этот файл в sqlhosts и изменяюв нем то, что мне нужно. В таблице 3.1 представлен формат файла – он достаточно прост. Файл представляетсобой строку из 5 полей, каждое поле отделено от другого табуляцией или пробелом. Длякаждого экземпляра или псевдонима экземпляра в файле должна быть отдельная строка. Таблица 3.1 Формат файла $SQLHOSTS Номер поля Описание 1 Имя или псевдоним экземпляра 2 Сетевое «слово» экземпляра (The nettype “word” for instance) 3 Имя физического сервера, на котором работает экземпляр. Максимальная длина – 256 символов 4 Сетевое «имя службы» или номер порта, который будет использоваться для подключения к экземпляру. Максимальная длина – 128 символов. 5 Опции подключения к экземпляруВ этой книге мы рассмотрим базовые настройки этого файла. Если вы используетеEnterprise Replication (ER), шифрование соединения или другие дополнительныевозможности, то в некоторых из этих полей необходимо сделать дополнительныенастройки. О них мы подробно поговорим во второй книге.Поле 1. Имя экземпляра.Первое поле строки содержит имя экземпляра (DBSERVERNAME) или псевдонимэкземпляра (DBSERVERALIAS). Имя должно быть уникально для всех экземпляров всети.
    • Поле 2.Сетевое «слово»Во втором поле описывается сетевой протокол и тип интерфейса, необходимые дляподключения к экземпляру. Это поле состоит из 8-символьного «слова», разделенного натри части, как показано в таблице 3.2 Таблица 3.2 Компоненты сетевого «слова» Номер Описание компонента 1 Тип сервера 2 Сетевой интерфейс 3 Сетевой протоколВ Таблице 3.3 показано, как организованы компоненты (они регистрочувствительны)сетевого «слова» и каковы их возможные значения. Таблица 3.3 Возможные значения каждого компонента сетевого «слова» Позиция Описание Возможные значения символов 1-2 Сервер on – наследие тех времен, когда сервер назывался Informix OnLine. Применяется по умолчанию для всех экземпляров ol – псевдоним для on. Обычно не используется se – IBM Informix Standard Engine dr – соединение на основе DRDA 3-5 Сетевой интерфейс ipc – интерфейс междупроцессорного взаимодействия. Используется для соединений через разделяемую память tli – интерфейс транспортного уровня soc – интерфейс сокетов
    • Таблица 3.3 Возможные значения каждого компонента сетевого «слова» Позиция Описание Возможные значения символов 6-8 Сетевой протокол tcp – протокол TCP/IP str – stream-pipe коммуникационный протокол. imc – протокол TCP/IP, используемый с сервером IBM Informix MaxConnect nmp – соединение по именованным каналам spx – протокол IPX/SPX shm – соединение через разделяемую память ssl – интерфейс защищенных сокетов (secure sockets layer SSL). Доступен в IDS 11.5 и последующихВ предыдущих версиях IDS первые два символа поля характеризуют сервер. В IDS 11обозначение dr применяется для обозначения клиентского соединения DistributedRelational Database Architecture (DRDA), а не IBM Informix Enterprise Gateway. Символы 3-5 определяют сетевой интерфейс, используемый для соединения междуклиентским приложением и экземпляром. Обратите внимание на отдельное значение дляподключений через разделяемую память (ipc). Это значение предназначено дляприложений, работающих на том же физическом сервере, что и экземпляр. Символы 6-8 определяют сетевой протокол, по которому можно связаться сэкземпляром. В Таблице 3.4. представлены возможные значения сетевого «слова» дляLinux, UNIX, Mac OS X Таблица 3.4 возможные сетевые «слова» для UNIX, Linux, Mac OS X Сетевое Описание «слово» onipcshm Соединение через разделяемую память onipcstr Stream-pipe соединение ontlitcp Протокол TCP/IP поверх интерфейса транспортного уровня (TLI) onsoctcp Протокол TCP/IP поверх интерфейса сокетов ontlispx Пртокол IPX/SPX поверх TLI-интерфейса
    • Таблица 3.4 возможные сетевые «слова» для UNIX, Linux, Mac OS X Сетевое Описание «слово» onsocimc TCP/IP соединение к серверу MaxConnect через интерфейс сокетов ontliimc TCP/IP соединение к серверу MaxConnect через TLI-интерфейс drsoctcp DRDA-соединение через TCP/IP сокеты drtlitcp DRDA-соединение через TCP/IP по TLI-интерфейсу onsocssl Зашифрованное соединение по TCP/IP через интерфейс сокетов drsocssl DRDA-соединение через интерфейс сокетов TCP/IPДля Linux/UNIX/Mac OS X/Windows версий Informix может использоваться еще односетевое «слово» onsqlmux – оно предназначено для поддержки приложений,открывающих несколько соединений к серверу БД для каждого пользователя. Например,это могут быть многопоточные приложения, которые открывают соединения к разнымбазам данных экземпляра. Использование этого сетевого «слова» позволяет снизитьадминистративные и ресурсные издержки такого типа соединений.Включение SSL требует не только активации соответствующей возможности в файле$SQLHOSTS. Подробная инструкция приведена в IBM Informix Security Guide. Крометого, прочитайте замечания по вашей платформе, поскольку эта возможностьподдерживается не всеми ОС.Поле 3. Имя хостаСодержит имя физического сервера, на котором работает экземпляр. Имя должноразрешаться через файл /etc/hosts или DNS.Поле 4. Сетевое имя службы.Значение 4-го поля зависит от сетевого «слова» экземпляра. В зависимости от интерфейсаи протокола, указанных в 3-м поле, это поле может использоваться в процессесоединения, а может и не использоваться, но в любом случае оно не должно быть пустым. При соединении через разделяемую память (onipcshm) это поле не используется, и выможете указать в качестве его значения любую произвольную уникальную строку. Для всех остальных соединений указанное в этом поле значение обычно соответствуетзначению «service name» в файле /etc/services. Это имя сервиса используется как кросс-ссылка на номер порта и протокол, которые используются для подключения к экземплярупо сети. Имя сервиса должно быть уникальным для каждого экземпляра IDS нафизическом сервере. В пределах сети это имя не должно быть уникальным, поскольку онопривязано к физическому серверу, но, чтобы не искать лишних приключений,рекомендуется все-таки делать его уникальным. Если вы не хотите вписать в это поле наименование псевдонима, можете просто указатьномер порта, но поле должно быть обязательно заполнено, и запись должна бытьуникальна в пределах физического сервера. Например, вы используете соединение черезразделяемую память или stream-pipe соединение, в этом поле для первого экземпляраможно указать placeholder, для второго – placeholder_2 и т.д.
    • Посмотрите файл /etc/services и добавьте по образцу необходимые записи для экземпляраIDS. В качестве имени сервиса в этом файле укажите сетевое «имя сервиса» из файла$SQLHOSTS, укажите номер порта, который еще не используется, и используемыйсетевой протокол. Номер порта должен быть уникальным для всей сети. На других физических серверах,которым потребуется доступ к этому экземпляру, не забудьте также указать этот номерпорта в файле /etc/services этого сервера (All other physical servers hosting instances thatneed to connect to this instance will need to use the same port number in their /etc/services file)Безопасно выбирать номер порта больше 5500, но для надежности посмотритедокументацию по вашей версии Informix на предмет возможных ограничений на номерпорта.В MacOS X 10.5.2 и старше в файле /etc/services содержится много записей о занятыхпортах. Могут быть заняты порты с номерами до 40000, 50000. Поэтому если выпланируете использовать IDS на MAC OS X обязательно сначала найдите диапазонсвободных портов, которые будут использоваться всеми остальными экземплярами. Если инсталляции на MAC OS X появились в сети позднее и случился конфликт портов,необходимо или поменять порт службы MACOS или сменить порт, который слушаетInformix. Если вы меняете порт Informix, не забудьте поменять его на всех серверах,которые обращаются к этому экземпляру.Поле 5. Опции подключения.В отличие от четырех предыдущих полей, это поле не является обязательным. Назначениеэтого поля – дать вам возможность указать специфические опции подключения кэкземпляру. Мне кажется, надо обязательно указывать одну из опций. Синтаксис указаниязначений для этого поля такой: option_letter=valueгде option_letter заменяется буквой, обозначающей определенную опцию. Для каждогоэкземпляра, если есть необходимость, вы можете указать несколько опций. Каждаяуказываемая опция должна иметь формат option_letter=value и отделяться от остальныхопций запятой или пробелом. Общая длина строки с указанием опций не должнапревышать 256 символов. В Таблице 3.5 приведены допустимые значения для этого поля Таблица 3.5 допустимые опции подключения Буква Описание опции Размер буфера (в байтах) для протокола TCP/IP b c Перенаправление соединения (connection redirection) csm Communication Support Module, используется для аутентификации e Конец определения группы серверов
    • Таблица 3.5 допустимые опции подключения Буква Описание опции Начало определения группы серверов. Используется, в основном, в g Enterprise Replication, но может быть использовано для автоматического перенаправления клиентов, определения high-availability service level agreement(SLA) i Используется для указания числового идентификатора группы серверов m Используется совместно с протоколом sqlmux r,s Настройки безопасности ОС, r – со стороны клиента, s – со стороны сервера k Определяет использование keep-aliveОпция keep-alive. Из всех опций, доступных в поле 5 файла $SQLHOSTS я рекомендуюоставить включенной опцию keep-alive (обозначается k)k=0 - опция выключенаk=1 – опция включенаЭта опция влияет на соединения по TCP/IP и IPX/SPX. При включенном keep-aliveпериодически проводится проверка связи между пользовательскими потоками экземпляраи клиентским приложением. Если от клиента не поступает ответа за определенное время,пользовательский поток уничтожается, а связанные с ним ресурсы освобождаются. Поумолчанию эта опция включена. Для выключения необходимо явно прописать k-0Опции безопасности. Две опции безопасности (r и s) позволяют контролировать, какпроверяется запрос на подключение к экземпляру. При поступлении запроса наподключение сервер проверяет, что User ID, пославшего запрос, и компьютер, с которогопослан запрос, являются «known and trusted» в сети. Если User ID, отсутствует, чтохарактерно для клиентских соединений с РС, то проверяется только компьютер, а правапользователя проверяются при обработке команды SQL сonnect. Если не указанообратное, сервер просматривает на клиенте каталоги /etc/hosts.equiv или $HOME/.rhostsдля определения может ли взаимодействие клиент/хост быть доверенным (to determinewhether the client/host relationship can be trusted). В таблице 3.6 приведены возможныезначения опций безопасности
    • Таблица 3.6 возможные значения для опции безопасности файла $SQLHOSTS Значение Описание s=3 Разрешает просмотр /etc/hosts.equiv и ~ /.rhosts на сервере(server-side lookup) s=2 Разрешает только просмотр ~ /.rhosts на сервере s=1 Разрешает только просмотр /etc/hosts.equiv на сервере s=0 Запрещает просмотр /etc/hosts.equiv и ~/.rhosts на сервере r=1 Разрешает просмотр ~/.netrc на клиенте r=0 Запрещает просмотр ~/.netrc на клиентеПроцесс проверки состоит из нескольких шагов: 1. User ID подтверждается путем проверки файла /etc/passwd на сервере. Если такой User ID есть на сервере, то он считается подтвержденным 2. Проверяется компьютер, с которого был сделан запрос. Имя клиентского компьютера должно разрешаться либо через файл /etc/hosts сервера, либо через DNS. 3. после разрешения имени клиентского компьютера, делается проверка, считает ли сервер клиентский компьютер доверенным. Если это так, то пароль не требуется 4. если для клиентского компьютера есть запись в файле /etc/hosts.equiv, то происходит подключение к экземпляру. Если записи в файле нет, то проверяется файл ~/.rhosts: есть ли в нем запись для комбинации User ID и имя компьютера. Если такая запись найдена, то осуществляется подключение к экземпляру. В противном случае запрос на подключение отвергается.Файл ~/.rhosts позволяет клиенту, который имеет учетную запись на сервере IDS и нанедоверенном компьютере, осуществлять подключение к экземпляру и базе данных безуказания пароля. Этот файл создается в домашнем каталоге пользователя на сервере.Точный формат файла вы можете посмотреть в документации на вашу ОС. Общая форматакая:user_id@remote_host_nameФайл .netrc также находится в домашнем каталоге пользователя и разрешает соединение склиентов, где User ID отличается от User ID на сервере.При создании файла .rhosts или .netrc в окружении, где используется DNS, не забудьтесоздать запись как для имени удаленного компьютера, так и для имени удаленногокомпьютера + доменный суффиксОпция безопасности определяет, уровень, до которого доходит сервер при проверке,является ли соединение разрешенным. По умолчанию применяется s=3. установка s=0предотвращает любой удаленный доступ к серверу, s=2 разрешает только соединение сопределенных user ID, s=1 предотвращает доступ с недоверенных хостов.
    • Опция «размер буфера» Позволяет настраивать размер буфера соединения TCP/IP. Поумолчанию размер буфера составляет 4096 байт. Если сервер постоянно занимаетсяпересылкой пакетов, размер которых больше(например, BLOB’ов), используйте этуопцию для указания желаемого размера пакета. Учтите, что каждое клиентскоеподключение использует свой собственный буфер. При указании размера буфера,убедитесь, что на физическом сервере достаточно памяти для обслуживания этихбуферов, экземпляров IDS и других приложений, выполняющихся на сервере. Если выукажете слишком большое значение этого параметра, то при наличии большогоколичества подключений к серверу запросы на подключение будут отвергаться.Опции «группа», «конец группы», «номер группы» Серверная группа (server group) –логическое понятие. Как db-пространство – это множество из одного или несколькихчанков, так и серверная группа – псевдоним для множества из одного или болееэкземпляров. Группы обычно используются в кластере Enterprise Replication. Могут такжеиспользоваться для автоматического перенаправления клиентов: если первый экземпляр всписке не отвечает, будет сделана попытка подключиться к другим экземплярам,указанным в списке. Каждая группа имеет свой уникальный числовой идентификатор,определяемый параметром i=number. Определение группы в файле $SQLHOSTSначинается с имени группы в первом поле (максимальная длина имени 18 символов), вовтором поле указывается слово group, в третьем и четвертом поле ставится знак – (dash).Затем указываются экземпляры. Определение группы продолжается до конца файла$SQLHOSTS, либо до указания e=parameter. В таблице 3.7 показан пример определениягруппы. Таблица 3.7 пример определения групп в файле $SQLHOSTS DBSERVERNAME Nettype Host name Service name Options er_grp_1 group - - e=tagus_net cadmus_net onsoctcp host_1 net_1 g=er_grp_1 tagus_net onsoctcp host_2 net_2 g=er_grp_1 amazon onipcshm host_3 placeholder colorado_net onsoctcp host_4 net_3 k=1,s=2 rio_grande_net ontlitcp host_5 net_5 k=1,b=5124
    • Таблица 3.7 пример определения групп в файле $SQLHOSTS DBSERVERNAME Nettype Host name Service name Options er_grp_2 group - - red_net ontlitcp host_6 net_6 green_net onsoctcp host_8 net_8 yangzi_net ontlitcp host_7 net_7 odra_net onsoctcp host_10 net_10 g=er_grp_1В таблице приведены определения двух групп – er_grp_1 состоит из экземпляровcadmus_net и tagus_net. В эту группу входит также экземпляр odra_net (членство вгруппе указано в пятом поле файла). Как видите, определение экземпляров не обязанобыть строго последовательным. Группа er_grp_2 состоит из трех экземпляров (достигнутконец файла, а экземпляр odra_net принадлежит к другой группе). Хотя я явно указал дляэкземпляров группы er_grp_1 членство в этой группе, но это не является обязательным(смотрите отсутствие такого указания для экземпляров группы er_grp_2).Опция перенаправления подключения. Серверные группы можно использовать нетолько для репликации, но также для автоматического перенаправления клиентов. Этавозможность полезна, когда один или несколько узлов определены как часть meshed ER-топологии (см. Таблицу 3.8) Таблица 3.8 Пример определения серверных групп с перенаправлением подключения DBSERVERNAME Nettype Host name Service Options name er_grp_1 group - - e=tagus_net,c=1 cadmus_net onsoctcp host_1 net_1 tagus_net onsoctcp host_2 net_2 amazon onipcshm host_3 placeholder hdr_1 group - - c=2 red_net ontlitcp host_6 net_6 green_net onsoctcp host_8 net_8 yangzi_net ontlitcp host_8 net_8В таблице определено две группы, к которым может подключаться клиент. Посколькуиспользуется meshed кластер ER-топологии, клиентское приложение может подключатьсяк любым узлам кластера. Поскольку с=1, клиент будет подключаться к случайномуэкземпляру группы. Если соединение будет неудачным, будет сделана попытка
    • подключения к другим экземплярам. В IDS 11.10 было важно, чтобы для проведенияопераций записи клиент подключался к правильному экземпляру. При указании параметрас=2 клиент сделает попытку подключиться к первому экземпляру группы. Если этотэкземпляр не работает, будет выполнена попытка подключения к остальным экземплярам.В версии 11.50 этот процесс стал ненужным, потому что операции обновления могутпроизводиться на любом экземпляре кластера MACH-11 (Multi-Active Cluster for HighAvailability). В выпуске 11.50 также введен агент Online Connection Manager and ServiceMonitor (ONCMSM). Кластер MACH-11 мы рассмотрим подробно в следующей книге.Модуль поддержки соединений (Communication Support Module CSM). ВключениеCSM позволяет шифровать связь между клиентами и серверами БД. Поддерживаютсятакие алгоритмы шифрования, как DES, Triple DES, Extended DES, AES ( размер ключа128, 192, 256 бит). Подробно мы это рассмотрим во второй книге. Заключительный совет по опциям соединения пятого поля файла $ SQLHOSTS.Разработчики IDS рекомендуют для уменьшения сетевых нагрузок указывать одинаковыйразмер коммуникационного буфера на сервере и на клиенте. При изменении опцийподключения клиентов (keep-alive, просмотр файла .netrc) эти изменения будутприменены ко всем новым соединениям. Изменение серверных параметров требуетперезапуска экземпляра.Конфигурирование $SQLHOSTS в WindowsХотя функциональность $SQLHOSTS одинакова для версий под Linux, Mac OS X, UNIX,Windows, но Windows-реализация имеет свои особенности. Она может быть еще сложнее ,если вы инсталлируете Informix в домене.Информация %SQLHOSTS% (синтаксис Windows) находится в ветке реестраHKEY_LOCAL_MACHINESOFTWAREInformix. При инсталляции сервера можноуказать, где будет располагаться эта ветка реестра: будет ли у каждого сервера своя веткаили на контроллере домена будет одна общая ветка для всех серверов. Если вы решитеиспользовать ветку, расположенную на контроллере домена, на клиентских компьютерахнеобходимо будет установить дополнительную переменную окружения. %SQLHOSTS%содержит четыре поля: пропущено поле с именем экземпляра. В таблице 3.9 приведеноописание полей Таблица 3.9 поля %SQLHOSTS% Наименование поля описание Host Имя физического сервера, на котором работает экземпляр. Максимальная длина 256 символов Options Опции подключения к экземпляру Protocol Сетевое «слово» экземпляра Service Название сетевого сервиса, используемое локальным компьютером для подключения к экземпляру. Максимальная длина 128 символов.
    • Назначение параметров практически совпадает с назначением параметров версий дляUNIX/Linux. В таблице 3.10 отмечены исключения Разница в поддерживаемом синтаксисе и опциях для %SQLHOSTS% WindowsИсключение ОписаниеСетевые протоколы, IDS для Windows поддерживает только onipcnmp, onsoctcp,сетевое «слово» drsoctcp, onsocssl, drsocssl, onsqlmuxИмя сервиса  должно быть указано в файле services, который находится в %SYSTEMROOT%windowssystem32driversetc  если для доступа к экземпляру используется соединение по именованным каналам, то в это поле необходимо внести не название сервиса, соответствующее названию в файле services, а наименование канала, созданного для соединения. Например, предположим, что вы создали канал shrdmem_to_sarthe. Тогда в %SQLHOSTS% необходимо записать имя этого канала .PIPEshrdmem_to_sartheОпции Поддерживаются только следующие s= опциибезопасности s=0 отключает просмотр hosts.equiv и ~.rhosts. Если установлено, удаленный доступ к экземпляру запрещен s=1 разрешает только просмотр файла hosts.equiv s=2 не поддерживается в версиях для Windows s=3 разрешает просмотр hosts.equiv и ~.rhosts Это значение по умолчанию.Размер В версиях для Windows влияет на размер буфера только длякоммуникационного соединений по именованным каналам (named pipe)буфераКак я уже говорил, конфигурирование окружения IDS на Windows зависит от того,инсталлируется ли сервер в домене или нет. Это особенно влияет на методыидентификации клиентов. Шайлеш Гупта (Shailesh Gupta), бывший архитектор IDS, такобъясняет аутентификацию под WindowsКогда имя пользователя передается во время соединения, сервер проверяет, совпадаютли имя пользователя и пароль. Аутентификация происходит также, как и при логинепользователя на физический сервер. Если сервер сконфигурирован на проверку учетнойзаписи через NIS или контроллер домена, то сервер БД будет проверять пользователяточно также. Возникает вопрос, откуда сервер «знает», где проверять данные пользователя – налокальном сервере или на контроллере домена. Это определяется тем, как былустановлен сервер БД. Если сервер установлен администратором, который локальнозалогинился на физический сервер (не домен), то это локальная установка и сервер БДпредполагает, что вся информация о пользователях хранится на локальном сервере. Если
    • установка проводилась администратором на контроллере домена, то такая установканазывается «доменной». В этом случае пользователи будут проверяться наконтроллерах домена. Вышеприведенное справедливо и для инструментов управления , например, для утилитыonmode. Эти утилиты предполагают, что вы являетесь членом группы domainInformix-Admin или вы пользователь domaininformix. Важно отметить, что клиент может передать имя учетной записи, даже если неиспользуется SQL-команда connect as. На клиенте достаточно иметь файл .netrc Наклиентах Windows утилиты setnet, setnet32 автоматически настраивают аналог файла.netrc Это значит, что Windows-клиенты при попытке подключения к экземпляру всегдапересылают имя пользователя и пароль. Если имя пользователя и пароль не совпадают, сервер БД проверяет, выполняется ликлиентское приложение на том же физическом сервере, что и сервер БД. В этом случаеаутентификация считается успешной. При проверке сравнивается имя клиентскогохоста с именем хоста сервера БД. Если первый и второй шаги провалились, сервер проверяет, не является ли клиентдоверенным клиентом (trusted client). Для этого сервер ищет наличие записи в файле%SYSTEMROOT% windowssystem32driversetchosts.equiv и затем в файле .rhosts вдомашнем каталоге пользователя. В Windows наличие домашнего каталога пользователяне является обязательным, поэтому файл .rhosts не просматривается. Когда в поле опций вы устанавливаете s=параметр, сервер БД устанавливает биты вслужебном флаге. Когда сервер в процессе аутентификации доходит до 3-го шага, то взависимости от установленных параметров он проверяет файл hosts.equiv или файлыhosts.equiv и ~.rhosts, или один из них, в зависимости от установленного флага. Посколькуна Windows файл ~.rhosts никогда не просматривается, то установка s=3сооветствуетустановке s=1, а установка s=2 не используется.Опция s=3 применяется по умолчанию, поэтому вам не нужно явно устанавливать ее.Установка s=0 запрещает удаленный доступ к экземпляру.Переменные среды.Для работы IDS необходимо определить несколько переменных среды. Некоторые из нихопределяют, как работает сервер БД, другие влияют на обработку им SQL-запросов.Несколько переменных являются обязательными, другие опциональны и требуютустановки только если рабочее окружение отличается от умолчаний IDS. На физическомсервере под управлением UNIX/Linux/Mac OS X, где работает экземпляр, вы можетеустановить настройки для всех пользователей в файле /etc/profile или$INFORMIXDIR/etc/informix.rc. Эти настройки могут быть перекрыты на уровнепользователи или сессии несколькими путями. В Windows настройки экземпляра хранятся в ветви реестраHKEY_LOCAL_MACHINESOFTWAREInformixOnLineinstance_nameEnvironmentВ этой ветви настраиваются значения %INFORMIXDIR%, %INFORMIXSERVER%,%SQLHOSTS% и другие. При необходимости вы можете изменять эти значения идобавлять новые (тип данных REG_SZ) . Перед изменением настроек я настойчиворекомендую остановить экземпляр. Эти настройки реестра не используются клиентскимиприложениями, которые выполняются на том же физическом сервере, что и экземпляр.Установка правильных переменных окружения может сильно зависеть от типаприложения. Вы можете изменять системные и/или личные переменные окружения,например, %INFORMIXDIR% на вкладке Environment окна System Properties (ControlPanel > System).В Windows-инсталляции Informix 11.50 в каталоге %INFORMIXDIR% находитсясценарий instance_name.cmd, предназначенный для установки переменных среды.
    • На клиентском компьютере, в зависимости от типа приложения и того, как оноподключается к экземпляру, может потребоваться установка самых разных переменныхсреды. Как я говорил выше, вы можете использовать одну универсальную ветвь%SQLHOSTS%, которая расположена на контроллере домена. В этом случае на каждомклиентском компьютере необходимо установить переменную%INFORMIXSQLHOSTS%. Эта переменная должна содержать имя сервера. Например,если %SQLHOSTS% расположен на сервере hestia, то значение переменной%INFORMIXSQLHOSTS% должно быть hestia. Ниже приведены самые важные переменные среды. Остальные я буду объяснять напротяжении книги. Полный список переменных среды для сервера и клиента вы можетепосмотреть в IBM Informix Guide to SQL:Reference.Необходимые переменныеДля инициализации экземпляра и доступа к нему должны быть установлены следующиепеременные: $INFORMIXDIR, $ONCONFIG, $INFORMIXSERVER. Также необходимомодифицировать переменную $PATH, и я рекомендую установить переменную$DBEDIT. В Informix 11 можно использовать $INFORMIXDIR и другие переменныесреды в файлах $ONCONFIG.$INFORMIXDIRВ этой переменной содержится полный путь к каталогу, где находятся двоичные файлыIDS 11. эта переменная должна быть установлена первой. Нет жестких рекомендаций, какназывать каталог установки. Вы можете иметь несколько каталогов с разными версиямиIDS (например, informix_9_4, informix_10). Для переключения между версиями вамнеобходимо будет переустановить переменные $INFORMIXDIR, $ONCONFIG,$INFORMIXSERVER и, возможно, $INFORMIXSQLHOSTS, $PATH. Переключениемежду версиями может быть необходимо для тестирования функционала или поддержкикаких-то сторонних приложений.Для пользователей, которым необходимо запускать исполняемые файлы Informix, послеустановки переменной$INFORMIXDIR необходимо добавить в PATH путь$INFORMIXDIR/binЕсли вы разрабатываете приложения на продажу, никогда не программируйте жесткопуть к установочному каталогу Informix и не полагайте, что этот каталог будетназываться Informix. Всегда считывайте переменную окружения $INFORMIXDIR. Этоже замечание справедливо и для скриптов.$ONCONFIGВ этой переменной хранится имя файла, который обычно расположен в каталоге$INFORMIXDIR/etc, и в котором записаны параметры конфигурации активногоэкземпляра. Переменная автоматически указывает на $INFORMIXDIR/etc, поэтомукорректный синтаксис для оболочек Bourne или Korn будет выглядеть примерно так:ONCONFIG=onconfig.styexport ONCONFIG$INFORMIXSERVERИмя экземпляра IDS, к которому можно подключаться. Это должно быть значениеDBSERVERNAME или одно из значений DBSERVERALIAS из файла $ONCONFIG.Установка этой переменной не означает, что приложения будут вынуждены подключатьсяименно к этому экземпляру. С помощью SQL-команды connect to
    • database_name@instance_name или строки подключения вы можете явно указатьприложению, куда надо подключаться. В IDS 11.50 при наличии ONCMSM-агентаклиенты могут подключаться к service level agreement(SLA) и получать от негоинформацию, необходимую для подключения к экземпляру, в том числе и значение$INFORMIXSERVER. Одно замечание. С технической точки зрения перед установкой экземпляра нетнеобходимости устанавливать значение $INFORMIXSERVER. Однако если этого несделать, при инициализации не будут созданы базы системного каталога. Эти базыявляются критичными для корректного функционирования экземпляра. Поэтому янастойчиво рекомендую перед инициализацией экземпляра устанавливать этупеременную.$INFORMIXSQLHOSTSВ этой переменной нет необходимости до тех пор, пока вы не меняете имя файла sqlhostsили не перемещаете его из каталога $INFORMIXDIR/etc. Файл, указанный в этойпеременной, должен иметь такой же формат, как и стандартный файл sqlhosts. Приустановке этой переменной файл $INFORMIXDIR/etc/sqlhosts не будет использоватьсядля подключения к экземпляру.$DBEDITЭту переменную не нужно обязательно устанавливать перед инициализацией, но ярекомендую это сделать, если вы, конечно, не хотите выбирать каждый раз текстовыйредактор при запуске dbaccess или I-SQL. Я устанавливаю для $DBEDIT значение vi, выможете выбрать свой любимый текстовый редактор.Другие переменные.Для определения того, как IDS обрабатывает данные и отображает их пользователю выможете установить другие переменные среды, например, $DBDATE, $DBMONEY. Этипеременные рассмотрены в IBM Informix Guide to SQL:Reference.Вопросы мультирезидентностиМультирезидентность – это поддержка запуска нескольких экземпляров IDSодновременно на компьютере. Для поддержки мультирезидентности вам не нужноустанавливать еще одну копию Informix в другой каталог: вы можете скопировать тольконеобходимые файлы и корректно установить переменные среды. Переменная $INFORMIXDIR остается неизменной. В файл $SQLHOSTS вы можетедобавить информацию, необходимую для подключения ко всем версиям IDS на этомкомпьютере. Если вам необходимо поддерживать несколько версий IDS, установленных вразные каталоги, установка переменной $INFORMIXSQLHOSTS позволит всемэкземплярам, работающим на физическом сервере, обращаться к одному файлу$SQLHOSTS. В противном случае экземпляры будут использовать файл sqlhosts изсвоего каталога $INFORMIXDIR/etc. Для каждого экземпляра необходимо создать уникальный файл $ONCONFIG и файлMSGPATH. Имя экземпляра (DBSERVERNAME), псевдоним(-ы) (DBSERVERALIAS) иномер экземпляра (SERVERNUM) должны быть уникальны для каждого экземпляра навсех серверах сети. Как я отмечал выше во всей сети должны быть уникальныDBSERVERNAME и все псевдонимы DBSERVERALIAS. Очевидно, что $ONCONFIG и $INFORMIXSERVER также уникальны для каждогоэкземпляра. Экземпляры не могут разделять дисковые чанки, если, конечно, вы неиспользуете SDS(Shared Disk Secondary) MACH-11, который доступен в версии IDS 11 истарше. Переменные MSGPATH и номер сервера я объясню в следующей части,посвященной установке и инициализации экземпляра IDS.
    • Кроме этих изменений, нет ничего сложного в запуске нескольких экземпляров на одномфизическом сервере. Первый вопрос, на который необходимо ответить, -достаточно лиаппаратных ресурсов для поддержки нескольких экземпляров. Этот вопрос особенноважен для настройки разделяемой памяти ядра и установки параметра «memory forcedresident» в файле $ONCONFIG. В части 4 мы обсудим параметр RESIDENT. Взависимости от количества устройств для архивирования может также потребоватьсяопределенное согласование архивирования логических журналов экземпляров.ЗаключениеПри создании любой новой системы необходимо тщательное планирование. InformixDynamic Server не является исключением. При подготовке к инсталляции иинициализации помните, что принятые вами решения зависят от вашей среды: неттвердых правил и решений. Вашими проводниками будут знания, опыт и интуиция. При планировании развертывания нового экземпляра IDS примите во вниманиеследующее:  При планировании получите максимально возможное количество информации о требованиях к производительности, размерах баз данных, взаимосвязях между таблицами.  Вы обязательно должны позаботиться о защите от сбоев дисков, содержащих корневое db-пространство, файлы логического и физического журнала.  При обращении к дискам и ленточным устройствам используйте символические ссылки, а не имена устройств.  При оценке размеров таблиц и db-пространств не стремитесь сэкономить несколько долларов – в конечном итоге выйдет дороже.  Для освобождения физических ресурсов сервера отключите все лишнее железо и ненужные службы ОС  При использовании мультирезидентности тщательно мониторьте системные ресурсы.В следующей части мы рассмотрим процесс инсталляции и инициализации экземпляра,конфигурационные параметры и базовые вопросы настройки экземпляра.
    • Инсталляция и инициализация IDSВ этом разделе:  Инсталляция и инициализация продукта  Установка основных конфигурационных параметров  Системные базы данных  Поддержка на сервере нескольких экземпляровВ предыдущих частях книги разговор шел, в основном, об абстрактных вещах. С этойчасти я начну обсуждать вопросы инициализации, администрирования и настройкиэкземпляра Informix Dynamic Server. Закончив фазы логического проектирования приложения и базы данных, вы готовыприступить к конфигурации и инициализации экземпляра IDS. в этой части описанпроцесс инсталляции или обновления сервера базы данных и инициализации экземпляра.Я объясню некоторые наиболее важные параметры файла $ONCONFIG и приведурекомендации по их значениям. Вы также узнаете, как создать более одного экземпляраIDS на физическом сервере. Кроме того, в этой части я расскажу о системных базахданных.Установка или обновление сервера.В IDS11 компания IBM полностью обновила и, по моему мнению, улучшила процессустановки. Одно из важных улучшений – процесс установки одинаков для версий IDS подразные ОС. Я имею в виду, что процесс установки идентичен для разных ОС нафизическом сервере. Но это не значит, что всеми версиями поддерживаются все режимыустановки: например, версия под Windows не поддерживает установку из команднойстроки. Вне зависимости от того, инсталлируете ли вы Informix впервые или проводитеобновление сервера, обязательно прочитайте замечания по релизу (release notes) и другиедокументы. В ранних версиях IDS эти документы были доступны только послеустановки, сейчас их можно прочитать перед запуском инсталлятора. В них содержатьсясистемные требования, рекомендации по настройке ядра, руководство по установке и т.п. На Linux, Mac OS X, UNIX документация расположена в каталоге$extract_location/SERVER/doc. Файл README.html в этом каталоге содержит ссылкина документы. В Windows документация находится в каталоге %extract_locationIIFdoc.Внимание: в дистрибутиве есть каталог %extract_locationdoc, но в нем содержитсятолько информация о Java Runtime Environment (JRE)Обновление с предыдущих версий.Некоторые читатели книги уже безболезненно переходят с IDS 10 на IDS 11, но яполагаю, что многие, в том числе, возможно и вы, переходят с более ранних версий IDS.Если вы смотрели последние релизы Informix, то, наверное, обратили внимание набольшое количество новых возможностей. Например, в IDS 9 были добавлены «большие»чанки, новая система управления буфером разделяемой памяти, динамические логическиежурналы, директивы оптимизатора, сырые таблицы, более эффективная системауправления индексами. В IDS 10 появились страницы с конфигурируемым размером,шифрование данных на уровне столбца, восстановление таблиц на определенный моментвремени, усовершенствования ER. Итак, как вам обновится до IDS 11 ? в зависимости от используемой версии IDS выможете обновится либо напрямую, либо через промежуточный шаг. На рисунке 4.1показан путь миграции.
    • Рисунок 4.1 Путь миграции на IDS 11Как видите почти все более-менее новые версии могут быть обновлены сразу до IDS 11.под понятие «сразу» я имею в виду, что вы можете загрузить IDS 11 на физическийсервер, остановить экземпляр, обновить двоичные файлы, перезапустить экземпляр иначать использовать IDS 11. это не намного сложнее, чем описано. В версиях, которыеневозможно обновить напрямую, отсутствуют некоторые возможности, которыенеобходимы для перехода на новую версию. Чтобы не раздувать исходные тексты, в IBMбыло принято решение не включать эти возможности в процесс миграции на IDS 11. прииспользовании таких версий Informix необходимо выполнить двухступенчатый процессмиграции. Как видите, можно обновиться с IBM OnLine 5.1x и даже с IBM Standard Engine. В случаеиспользования OnLine 5.1x сначала необходимо обновиться до IDS 7.3x, а затем до IDS 11.в случае Standard Engine прямого пути нет – самый простой и быстрый метод состоит виспользовании dbexport и dbimport для выгрузки базы и загрузки ее в экземпляр IDS 11. Я полагаю, что вы уже создали тестовую среду и проверили функционирование вашихприложений. Если вы это сделали, то можете приступать к миграции промышленныхустановок. Проблемы при миграции, в основном, возникают из-за использования слов,зарезервированных в этой версии IDS, в качестве имен объектов базы данных илипеременных. В Таблице 4.1 приведен список некоторых зарезервированных слов; он неявляется полным, полный список вы можете найти в руководстве по миграции (IBMMigration Guide). Таблица 4.1 Некоторые зарезервированные слова IDS IDS 9 IDS 10 IDS 11 avoid_execute left active password admin updating avoid_subqf locks directives save avoid_index_sj uselastcommited cache raw encryption table idssecuritylabel with collation retain hint template index_sj costfunc restart inactive test inserting cross right inline typeid references full selconst inout typename sampling inner standard load typeof selecting instead use_subqf online wait sysdbclose
    • Таблица 4.1 Некоторые зарезервированные слова IDS IDS 9 IDS 10 IDS 11 item optcompind xadatasource sysdbopen join partition xid taskПроцесс непосредственной миграции на IDS 11 состоит из 5-ти основных шагов. 1. подготовка исходных экземпляров (экземпляра) 2. установка новых двоичных файлов сервера 3. переустановка переменных экземпляра 4. перезапуск экземпляра для старта процесса конверсии 5. проверка целостности данных и создание архиваДавайте рассмотри каждый из шаговШаг 1. Подготовка экземпляраНа этом шаге критичными являются несколько факторов, самый изменчивый из них –количество свободного дискового пространства в db-пространствах. При подготовке кмиграции на IDS 11 убедитесь, что в db-пространствах, особенно в корневом db-пространстве, достаточно места для преобразования страниц. Объем необходимогопространства зависит от того, с какой версии Informix вы переходите. Чем младше версия,тем больше места необходимо, особенно если версия младше, чем IDS 9.2. С Informix 9.2 IBM поменяла метод хранения индексов по умолчанию – с «attached» на«detached», то есть индексы стали хранится на отдельных страницах, даже если индекс итаблица находятся в одном db-пространстве. При переходе на IDS 9.2 многие заказчикиотмечали значительное увеличение объема используемого дискового пространства. Этосвязано с тем, что страницы, на которых хранились и таблицы, и индексы, теперь сталииспользоваться только для хранения таблиц. Перед началом обновления я рекомендую иметь не менее 20% свободного пространствав db-пространствах. Эта рекомендация особенно актуальна для корневого db-пространства, где будет проводится много изменений в системных базах данных и будутсозданы новые базы. Если вы обновляетесь с IDS 9.4 и старше, то объем доступногопространства не столь критичен, хотя мне вас очень жаль, если у вас меньше 20 Мбайтсвободного пространства в корневом db-пространстве и менее 5% в других db-пространствах. Также необходимо убедиться, что у вас много свободного пространства для логическихжурналов. Я рекомендую иметь 10-15 Мбайт минимум. Если журналы хранятся вкорневом db-пространстве, необходимо иметь в этом пространстве минимум 30-35 Мбайтсвободного пространства. Вы, возможно, захотите увидеть статистику по текущимзапросам в новом окружении, поэтому стоит собрать планы оптимизатора по всем частымзапросам, особенно сложным и времязатратным. Для сбора этой информации вы можетевыполнить SQL-команду set explain on и выполнить запрос через dbaccess или подобнуюпрограмму. Если у вас недавняя версия Informix (if you are on more recent version), выможете использовать модификатор without execute, который позволяет не выполнятьзапрос, а только подготовить план выполнения. Используя этот модификатор, вы можетезапускать запросы DML на промышленных базах без риска повредить их. Кромепросмотра плана оптимизатора при сборе информации о наиболее критичных запросахцелесообразно использовать средства мониторинга ОС. Статистические и конфигурационные данные можно собрать с помощью командdbschema –d –hd и onstat –pr. Команда dbschema генерирует данные о распределении
    • данных, эти данные используются оптимизатором для формирования планов доступа.Команду можно запускать для всей базы или для отдельных таблиц. Команда onstatчитает содержимое служебных страниц корневого db-пространства, на которых хранятсяуказатели на физические и логические устройства экземпляра, а также данные о бэкапах инекоторые данные по контрольным точкам (checkpoint). Также полезным может бытьвывод команд onstat –p/-P, onstat –g iof/iov, onstat –g glo. На уровни ОС полезен выводутилит vmstat, iostat, sar или других утилит мониторинга ресурсов сервера. Если дляархивирования вы используете ON-Bar с или без Informix Server Manager (ISM), незабудьте сделать копии конфигурационных файлов и bootstrap(загрузчик). После завершения всех подготовительных шагов необходимо подготовить данные исоздать полный архив экземпляра. Этот процесс включает в себя следующие шаги: 1. Завершение всех транзакций. Самый простой метод – выполнить команды из Таблицы 4.2 Таблица 4.2 Рекомендованный процесс завершения транзакций перед обновлением сервера БД Команда Описание onmode –sy/-jy Перевод экземпляра в статический (quiscent) или однопользовательский (если поддерживается) режим и отключение всех (или не-Informix) сессий onmode -c Принудительное выполнение контрольной точки, очистка памяти от подтвержденных транзакций onmode -ky Переводит экземпляр в режим off-line oninit –s/-j Перезапуск экземпляра в статический или однопользовательский (если поддерживается) режим. Во время быстрого восстановления откатываются все открытые транзакции onmode -l Закрывает открытый логический журнал и начинает писать новфй 2. Удалите все версии таблиц.(in-place table alters) Вопрос версий таблиц мы более подробно рассмотрим в Части 6. Для таблицы можно иметь несколько «версий» ее схемы и данных, в зависимости от типа и частоты изменений структуры таблицы. Во время выполнения обычных операций IDS нормально обрабатывает эти варианты схемы таблицы, но при обновлении они могут представлять проблему. Для выяснения, имеются ли такие версии таблицы для всех баз данных и экземпляров выполните команду oncheck –pT. Часть вывода этой команды для таблицы представляет собой количество строк для разных определений схемы.
    • Home Data Page Version SummaryVersion Count0(oldest) 439461(current) 58920Самый простой метод удаления всех версий таблицы – выполнение псевдо-обновленияпутем выполнения SQL-командыupdate table_name set column_name to column_nameгде table_name – имя таблицы, для которой есть версии, column_name – имя какого-тостолбца таблицы3. Осторожный администратор проверит целостность данных и индексов в базах данных командами oncheck –cd, oncheck –ci (или даже командами oncheck –cD и oncheck –cI (заглавная буква «i» )). В зависимости от размера баз такая проверка может занять длительное время. Вы можете пропустить этот шаг, если у вас не было повреждений данных или индексов или сбоев устройств хранения4. Остановите все репликации (ER,HDR)5. Сделайте по крайней мере один архив 0-го уровня экземпляра. Я обычно делаю два6. Остановите экземпляр(-ы)Шаг 2. Установка новой версии сервера БДПодробно процесс установки мы обсудим дальше в этой части. Я рекомендуюустанавливать новую версию IDS в отдельный каталог.Шаг 3. Переустановка переменных окруженияКак вы помните из Части 3 перед запуском экземпляра IDS необходимо установитьтри переменных окружения: $INFORMIXDIR,$ONCONFIG,$INFORMIXSERVER.Если вы перенесли файл $SQQLHOSTS или хотите, чтобы все экземпляры IDS наэтом сервере использовали один файл $SQQLHOSTS, установите переменную$INFORMIXSQLHOSTS. Рекомендуется скопировать $SQQLHOSTS и $ONCONFIG из старой инсталляции вновую. В этом случае вам будет достаточно установить переменную $INFORMIXDIRи проверить, чтобы в $PATH был указан путь к каталогу bin новой инсталляцииШаг 4. Перезапуск экземпляраПосле выполнения для перезапуска экземпляра команды oninit начнется процесспреобразования к IDS 11. я настойчиво рекомендую мониторить работу экземпляра вовремя выполнения этого процесса. Поэтому перед запуском экземпляра выполнитекоманду tail –f для лог-файла экземпляра. Для Windows-версии откорйте командноеокно экземпляра и выполните команду onstat –m –r 2. После запуска мониторинга, выполнив команду oninit –sv (статический режим) илиoninit –jv, переведите экземпляр в статический (если выполняется первый шагдвухступенчатого обновления) или однопользовательский режим. В логе вы увидитесообщения о процессе преобразования.Шаг 5. Проверка целостности данных и создания архива нового экземпляра.Предположим, что в лог-файле (путь к нему определяется переменной MSGPATH)нет записей об ошибках конвертирования. Тогда необходимо подготовить экземпляр кработе, выполнив следующие операции:
    • 1. Обновить статистику оптимизатора. Для базы sysmaster необходимо выполнить команду update statistics high. Для пользовательских баз выполнить update statistics low drop distributions, а затем update statistics. 2. Проверить целостность данных и индексов в базах данных командами oncheck –cd, oncheck –ci (или даже oncheck –cD, oncheck -cI). Если у вас никогда не было повреждения индексов и данных или сбоев устройств хранения, то этот шаг опционален. 3. Создать по крайней мере один архив 0-го уровняЕсли произошла критическая ошибка, и вам необходимо откатиться на более раннююверсию, то это можно сделать двумя путями. В IDS есть реверсная функция (reversionfunction). Полное описание этой функции смотрите в IBM Informix Dynamic ServerMigration Guide. Я предпочитаю переустановить значения переменных окружения ивыполнить полное восстановление. Я рекомендую этот подход не потому, чтореверсивная функция не работает - она работает. Но, выполнив восстановление, язнаю, что данные находятся в логически целостном состоянии. Полное восстановлениезанимает больше времени, но я предпочитаю перестраховаться дважды.Новая установкаНовый мастер развертывания IDS и «тихий» (silent) инсталлятор дают вамвозможность выбрать компоненты IDS при установке. Используя этот функционал, выможете установить только базовый функционал сервера (размер составляет 78-112Мбайт в зависимости от используемого аппаратного сервера и ОС) или выполнитьполную установку (требуется около 300 Мбайт). В IDS 11 IBM стандартизировалаинтерфейс инсталлятора, и процесс установки теперь выглядит одинаково дляразличных платформ. Вы можете запустить инсталлятор, написанный на Java, в одном из трех режимов:  «тихий» режим (silent mode). Не требует от пользователя ответов на вопросы и не позволяет конфигурировать инсталляцию. Для выполнения такой установки используется .ini файл  консольный режим. Выполнение установки из командной строки. Позволяет конфигурировать инсталляцию  графический режим. Для управления процессом установки используется графический интерфейс.Используя эти три режима, вы можете установить компоненты IDS как пакет (bundle)или продукт. При пакетной инсталляции вы можете установить все продукты –Informix Dynamic Server, IConnect, CSDK (Client Software Developer Kit – пакетразработчика программ) и т.д – одной командой (ids_install для UNIX/Linux, setup.exeдля Windows, .dmg файл для Mac OS X). Этот режим дает возможность вам управлятьвыбором программ для инсталляции, но так обычно не делается, а выполняетсяустановка продукта. Вы можете «записать» установку пакета для использованияфайла ответов для «тихой» инсталляции. Мы вернемся к этому вопросу чуть позже. Для Linux/UNIX продукт распространяется как tar файл, который вы можетераспаковать и выполнить отдельную инсталляцию IDS (installserver), CSDK(installclientsdk) и т.д. В консольном и графическом режиме установки продукта(product-level installation) есть дополнительный параметр «записи» параметровустановки в отдельный файл, с помощью которого вы потом можете установитьпродукты на произвольное количество компьютеров без ручного проведения процессаустановки. При использовании установки пакета (bundle installation) нет возможности записатьинсталляцию, но вы можете самостоятельно создать конфигурационный файл для
    • тихой установки пакета. К сожалению, на данный момент времени этот процесс неавтоматизирован. Вам необходимо скопировать и отредактировать файл bundle.ini,который находится в корневом каталоге распакованного дистрибутива IDS. на Mac OSX вы можете скопировать этот файл из каталога $INFORMIXDIR после установкисервера БД. В большинстве случаев для каждой опции есть две возможности –устанавливать или нет. Например, две последующие команды соответственноотменяют установку CSDK и подтверждают установку библиотек восточно-европейских языков Global Language Support (GLS).-P csdk.active=false-SP SERVER/IIF.jar IDS-EASTEURO.active=trueПодробно мы рассмотрим эти файлы позже.Установка шаг за шагом.Процесс инсталляции довольно прямолинейный. Единственная тонкость -дляинсталляции необходимо использовать права суперпользователя. На MAC OS X, есливы не вошли в систему как root, вам будет предложено ввести парольадминистратора. Для MAC OS X установка под User ID не-root пользователя являетсяпредпочтительной. Для версий под UNIX/Linux после распаковки дистрибутиваперейдите в режим суперпользователя (root) и для запуска установки в графическомрежиме запустите командуids_install –guiВне зависимости от ОС, для которой вы выполняете установку, будет запущенинсталлятор, который предоставит возможность почитать замечания по выпуску(release notes) и руководство по установке. Сейчас вам стоит изучить замечанию по выпуску, особенно раздел machine notes, гдевы найдете рекомендации по настройке ядра для запуска IDS. Для корректной работыIDS вам стоит использовать предложенные настройки. Методы настройки ядразависят от используемой ОС. Практически во всех случаях вам будет необходимоперезагрузить сервер, чтобы эти настройки вступили в силу. Следующие два окна приветствуют вас и предлагают почитать лицензионноесоглашение. Затем появляется окно, где необходимо указать путь, куда будет установлен сервер.Если перед запуском инсталлятора вы установили переменную $INFORMIXDIR, тоее значение будет прочитано инсталлятором и внесено в это поле автоматически.Стандартный путь установки - /opt/IBM/informix.На Mac OS X IDS по умолчанию устанавливается в каталог/Applications/IBM/Informix. Вы можете установить Informix в этот каталог, вподкаталог IDS11 или в структуру каталогов /opt.Каждый вариант имеет преимущества и недостатки. Если вы используете каталогустановки по умолчанию – то следуете стандарту ОС. С другой стороны ярекомендую для облегчения обновления и миграции ставить каждый релиз Informix вотдельный каталог. При установке в каталог /opt вы не следуете стандарту ОС, ноесли сопровождаете инсталляции под разные UNIX-подобные ОС, то можетенаписать скрипты администрирования, указав одинаковые пути к утилитам Informixна всех платформах. Выбирать вам и выбор зависит от того, что важнее для вашейорганизации.
    • После этого вы увидите экран, где сможете выбрать установку всех продуктов имодулей (по умолчанию) или специфицировать установку. В примере положим, чтовы устанавливаете все – Client SDK (сюда включен IConnect), IDS и драйвер InformixJDBC. Выбор типа установки «Custom» подразумевает, что вам необходимоопределить устанавливаемые модули Informix. Если вы выбрали «Custom»-установку , то увидите окно, в котором сможете указать,какие модули необходимо установить. При выборе модуля в правой части окна будетприведено описание модуля и объем занимаемого им пространства на жестком диске. Большинство основных модулей имеет по крайней мере один или два уровнявложенности опций. Например, для ON-Bar доступны такие опции – интерфейсInformix к Tivoli Storage Manager и Informix Storage Manager. Для CSDK и IСonnect тоже доступен набор различных модулей и опций.После того, как сделаете выбор, нажмите Next, и перед вами появится окно, котороеспросит, хотите ли вы включить «разделение ролей». Разделение ролей -это опция,которая не требуется для корректной работы сервера БД. Если вы выберите этуопцию, инсталлятор назначит административные функции, связанные с аудитом иLabel Based Access Control (LBAC) соответствующим пользовательским учетнымзаписям. Только те, кто будет залогинен под этой учетной записью, смогут выполнятьсоответствующие функции. Эта опция полезна в окружении, где на первом местестоит безопасность. Я ее никогда не использовал. Если вы установите сервер безразделения ролей, а в дальнейшем эта возможность вам понадобится, то в версиях дляUNIX/Linux/Mac OS вы можете ее добавить, а на Windows потребуетсяпереустановить сервер и переконфигурировать экземпляр. Если вы выберитеустановку с разделением ролей, то вам будет предложено ввести имена групп аудита ибезопасности. Члены этих групп будут выполнять функции Database System SecurityOfficer (DBSSO) и Auditing Analysis Officer(AAO). В Таблице 4.3 приведено описаниеэтих двух ролей безопасности Таблица 4.3 Группы разделения ролей Роль Описание Auditing Analysis Officer Члены этой группы могут включать и выключать (AAO) аудит экземпляра и просматривать журналы аудита Database System Security Члены этой группы являются администраторами Officer (DBSSO) безопасности экземпляра, они контролируют доступ для других ролей. Например, DBSSO определяет маски аудита, которые может использовать член группы AAO. Таким образом, DBSSO определяет, что подлежит аудиту, а что нет. ААО просто отслеживает процесс аудита. Рекомендуется, чтобы пользователи root и Informix не были членами этих ролей.Указанные вами группы должны существовать в ОС, и в их составе должен быть хотябы один участник.
    • Вне зависимости от того, включите вы или нет разделение ролей, следующее окно предложит вам создать «демонстрационный экземпляр». Эта возможность гораздо более полезная, чем вы можете предположить. Если вы выберите установку демонстрационного экземпляра, инсталлятор предложит вам использовать файл $ONCONFIG по умолчанию, указать путь к уже подготовленному вами файлу или позволить инсталлятору самостоятельно сконфигурировать и настроить экземпляр на основе ваших ответов на несколько вопросов. Если у вас есть уже файл $ONCONFIG, вы можете использовать его и инициализировать экземпляр со всеми необходимыми параметрами (память, пулы буферов, блокировки, устройства архивирования). Если вы решите использовать стандартный файл или разрешите инсталлятору настроить экземпляр, перед вами появится окно, где вам нужно будет ввести базовую информацию для инициализации экземпляра (имя и номер сервера, путь к корневому db-пространству, размер этого пространства). Будьте внимательны, по умолчанию размер корневого db-пространства (ROOTSIZE) составляет несколько сотен мегабайт. Это очень много, достаточно будет 60-80 Мбайт. Если вы выбрали конфигурацию экземпляра инсталлятором на основе оценки нагрузки, вам будет предложено определить количество создаваемых виртуальных процессоров (ВП), объем используемой памяти и предполагаемое количество запросов OLTP и DSS(OLAP). Инсталлятор используем эту информацию для создания экземпляра. Следующее окно показывает итоговый выбор устанавливаемых продуктов и занимаемый ими объем дискового пространства. Во время установки инсталлятор выводит прогресс ее выполнения на экране. После завершения установки инсталлятор выводит окно, где отображен путь к документации и рекомендациям по дальнейшей настройке экземпляра. Демонстрационный экземпляр может инициализироваться неудачно. Причина этого – отсутствие поддержки ядром параметров, необходимых для работы IDS. это справедливо для IDS под Mac OS X.Репликация установки на несколько физических серверов.Вы установили продукт на один сервер, но вам необходимо установить его на nфизических серверов и вы хотите, чтобы все установки были одинаковы? Лучший путьдостижения этой цели – тихая установка с файлом ответов. Этот тип установки такжетребует привилегий супер-пользователя. Если вы выполняете установку на уровнепродукта (product-level install) в текстовом или графическом режиме, то можете«записать» ваш выбор добавив опцию –record filename.ini к команде установки.Выходной файл содержит true или false для каждого выбранного модуля. Для тихой инсталляции пакета (silent bundle install) вы должны скопировать иотредактировать файл bundle.ini. Этот файл содержится в корневом каталогераспакованного дистрибутива или в каталоге $INFORMIXDIR (для Mac OS X) Форматыфайлов идентичны. После создания или редактирования файлов вы можете повторитьустановку выполнив такие команды:Пакетная установка (bundle install) ids_install –silent –options filename.ini [другие параметры]Инсталляция продукта (только IDS)Installserver –silent –options filename.ini [другие параметры]
    • Если в файле ответов вы не указали принятие лицензии, то для тихой установки вампотребуется добавить специальный флаг в командную строку инсталлятора. Послеустановки (пакета или отдельного продукта) последующая конфигурация (добавление db-пространств, перемещение и изменение размера журналов, создание баз данных и таблиц)может осуществляться скриптами.Изменение установкиЕсли после завершения установки вам потребовалось добавить какие-то модули, выможете просто запустить инсталлятор еще раз и выбрать необходимые модули, которыебудут добавлены к вашей установке или удалены из нее. При этом не происходитповторной инсталляции всего продукта. Работает это так. При инсталляции создаются контрольные файлы, в которых записано,какие модули и файлы устанавливались. Когда вы выбираете установку или удалениемодулей, мастер просматривает эти контрольные файлы, чтобы определить, какие модулии файлы необходимо установить или удалить. Контрольные файлы также используютсядля проверки зависимостей пакетов и верификации корректности удаления продукта. Дляверсий под UNIX/Linux/Mac OS X контрольные файлы находятся в каталоге$INFORMIXDIR/etc. Это файлы manifest.inf, IIFfile, IIFfiles.installed. Эти файлы нельзяизменять. В Windows эта же информация содержится в библиотеках установщика. Файл manifest.inf содержит информацию о установленных модулях, их размере и датеустановке, а также некоторые метаданные о функционале модулей. Файлы IIFfiles и IIFfiles.installed одинаковы по формату, но различны о содержимому.Файл IIFfiles содержит список всех файлов сервера IDS. Файл IIFfiles.installed содержитсписок только установленных файлов. Все описанные файлы обновляются всякий раз, когда вы выполняете операцииустановки/удаления компонентов.УдалениеВ отличие от инсталляции, где вы можете выбирать между уровнями продукта и пакета,деинсталляция производится только на уровне продукта. В Windows вы можете выбратьпункт деинсталляции в программной группе Informix или выполнить Control Panel >Add/Remove Software (Панель управления ->Установка и удаление программ). Выможете удалить все, в том числе db-пространства и чанки, или удалить только IDS исоответствующие двоичные файлы. В Linux/UNIX/Mac OS X в каталоге $INFORMIXDIR содержатся директориидеинсталляции CSDK, IDS, JDBС – uninslall_csdk, uninstall_ids nnnn (nnnn – номерверсии сервера), jdbc/_uninst. В каждом каталоге находится файл .jar, которыйвыполняет удаление продукта. Пример вызова:java -jar $INFORMIXDIR/uninstall_dir/uninstall.jarпо умолчанию деинсталляция осуществляется в консоли. Если хотите видеть графическийинтерфейс, добавьте в вызов флаг –swing.Для деинсталляции только сервера есть и другой графический интерфейс. В каталоге$INFORMIXDIR вы можете найти файл uninstallserver , выполнив который с флагом –gui вы удалите сервер в графическом режиме.Флаг –silent позволяет удалить продукт без всякого взаимодействия с пользователем.Конфигурационные параметры
    • Для правильной настройки IDS очень важно понимать назначение различных параметровфайла $ONCONFIG и их влияние на функционирование экземпляра. За годы разработкиIDS стал практически полностью самонастраивающися сервером (автономный потерминологии IBM). Сегодня вы можете изменять почти все параметры файла$ONCONFIG без перезапуска экземпляра. Те, которые требуют перезапуска, обычно неявляются широкоиспользуемыми или настраиваются только один раз. Многие параметры,которыми пользовались администраторы IDS ранее, теперь не используются, например,длительность контрольной точки. Алгоритм обработки контрольных точек полностьюпоменялся. В IBM Informix Dynamic Server Administrator’s Reference приведено полное описаниепараметров файла $ONCONFIG. В этом разделе я опишу основные параметры. Яобъединил их в логические и функциональные группы. В большинстве случаев внутрилогической группы параметры упорядочены по алфавиту, исключение сделано только там,где необходим специальный порядок для понимания взаимосвязи нескольких параметров.Некоторые параметры используют полный путь к определенным файлам или каталогам.Путь по умолчанию в большинстве случаев не соответствует вашему окружению.Поэтому убедитесь, что вес необходимые пути установлены корректно.При установке путей параметров вы должны использовать полные пути. В IDS 11некоторые параметры, включая ALARMPROGRAM, JVPCLASSPATH, JVPHOME,JVPJAVAHOME, JVPPROFILE, SYSALARMPROGRAM теперь поддерживаютвозможность установки путей относительно каталога $INFORMIXDIR. Например, теперьJPVHOME можно установить двумя путямиJVPHOME /opt/IBM/Informix/11/extend/krakatoaJVPHOME $INFORMIXDIR/extend/krakatoaВ случае, если в значении параметра может быть указано несколько путей, например вJVPCLASSPATH,относительный путь справедлив только для первого выражения встроке. Например, установка значения JVPCLASSPATHJVPCLASSPATH $INFORMIXDIR/extend/krakatoa/krakatoa.jar:$INFORMIXDIR/extend/krakatoa/jdbc.jarбудет развернута в следующую(неработающую) строку/opt/IBM/Informix/11/extend/krakatoa/krakatoa.jar:$INFORMIXDIR/extend/krakatoa/jdbc.jarперед началом обсуждения различных параметров файла $ONCONFIG вам следует знать,что в IDS 11.5 структура файла была изменена. Раньше параметры в файле располагалисьпрактически бессистемно, сейчас все параметры, отвечающие за одну возможность,сгруппированы вместе. Перед началом каждой группы приведено описание группы идопустимые значения параметров. В некоторых случаях приведены рекомендации поустановке значений параметров. Эти комментарии ожидались очень давно и должныпомочь новичкам корректно настроить IDS.При создании конфигурационного файла экземпляра рекомендуется скопировать файл$INFORMIXDIR/etc/onconfig.std и переименовать его. Я обычно добавляю к имени файлапосле точки(.) аббревиатуру имени экземпляра. Например, onconfig.sar, onconfig.tag, азатем редактирую файл.
    • Начальные устройстваПараметры этой группы являются физической основой экземпляра. В большинствеслучаев если один из параметров этой группы установлен неправильно илисоответствующий элемент поврежден, процесс быстрого восстановления прервется , иэкземпляр не инициализируется. О быстром восстановлении мы поговорим во второйкниге.LOGFILESЭтот параметр определяет количество логических журналов, создаваемых во времяпроцесса инициализации. Логические журналы, создаваемые во время инициализации,хранятся в db-пространстве ROOTNAME, которое обычно называется «rootdbs».Логический журнал используется сервером для записи изменений данных (кроме простыхBLOB’ов, хранящихся в BLOB-пространствах ) в базах данных со включеннымлогированием. В зависимости от приложения и количества ользователей вам, возможно,понадобится изменять размер и количество логических журналов. Для инициализацииэкземпляра достаточно установить LOGFILES равным 6, а LOGSIZE (см. ниже) 2 Мбайт.В части 5 показано, как переместить логические журналы в другое db-пространство иизменить их размер после инициализации экземпляра.LOGSIZEОпределяет размер по умолчанию логических журналов экземпляра. Логические журналыиспользуются при инициализации. Я устанавливаю размер корневого db-пространства(ROOTSIZE) равным 60-80 Мбайт, а LOGSIZE 2000 Кбайт. После инициализацииэкземпляра вы можете удалить исходные логические журналы и создать новые стребуемым размером. Если вы используете BLOB-объекты, размер логических журналовдолжен быть больше.MIRRORВключает или отключает зеркалирование экземпляра средствами IDS. вы можетеустановить значение этого параметра равным 1 (включено) во время инициализацииэкземпляра и использовать зеркалирование, когда в нем возникнет потребность. Илиможете оставить значение параметра равным 0 (отключено), а затем динамическивключить зеркалирование без необходимости перезапуска экземпляра.MIRROROFFSETИспользуется, если применяется зеркалирование средствами IDS. смотрите нижезамечания про ROOTOFFSETMIRRORPATHПрименяется только при использовании зеркалирования IDS. Параметр определяетполный путь к зеркалу корневого db-пространства. Информация о зеркальных копияхдругих чанков и db-пространств хранится в зарезервированных страницах экземпляра. Выможете изменить местонахождение зеркальной копии, но это сделать не так просто:недостаточно просто изменить значение этого параметра и перезапустить экземпляр.Сначала необходимо остановить зеркалирование корневого db-пространства и создатьновое место зеркалирования (create new mirror location). Остановите экземпляр и изменитезначение этого параметра на путь к новому месту зеркалирования. Запустите экземпляр вв статическом режиме (quiescent mode) и включите зеркалирование корневого db-пространства. Когда зеркальная копия синхронизируется, можете перевести сервер врежим он-лайн. Изменение режимов работы сервера, использование утилиты onspaces илиSQL API для создания/удаления зеркал рассмотрены в части 5 и 6. Обратите внимание,
    • что Informix не требует указания размера зеркального чанка. Сервер полагает, чтозеркальный чанк будет такого же размера, как и первичный чанк.PHYSDBSОпределяет имя db-пространства, в котором хранится физический журнал. По умолчаниюфизический журнал хранится в корневом db-пространстве. При инициализацииэкземпляра он может находится только в корневом db-пространстве. В IDS 11 естьвозможность изменить место хранения физического журнала без прерывания работыэкземпляра. Естественно у этой возможности есть некоторые ограничения. Работу сфизическим журналом мы рассмотрим в Части 5.PHYSFILEОпределяет размер физического журнала. Я рекомендую установить начальный размерфизического журнала в диапазоне 10-15 Мбайт. После создания db-пространств выможете изменить размер физического журнала. В IDS 11 был внедрен новый алгоритмобработки контрольной точки, поэтому желательно, чтобы размер физического журналасоставлял 110 процентов размера буфера. В части 5 показано, как менять размерфизического журнала и как перенести его в другое db-пространство.ROOTNAMEСодержит имя db-пространства, которое считается корневым. Принято, что корневое db-пространство называется «rootdbs», но вы можете использовать любое имя. Приинициализации корневое db-пространство состоит из одного чанка (Allocation of disk spacefor this dbspace during instance initialization process occurs at a single-chunk level), послеинициализации вы можете добавить необходимое количество чанков.ROOTOFFSETЕсли вы используете сырые устройства или один выделенный файл, то использованиесмещения дает возможность создавать несколько db-пространств (или чанков) на одномдисковом разделе или в этом файле. На сегодняшний день из-за облегчения работы сдисковыми разделами смещения практически не используются. Смещения внутри файлане используются, поскольку гораздо проще создать еще один файл. При создании db-пространств этот параметр указывают равным 0. Параметр ROOTOFFSET применяется для указания смещения корневого db-пространства. Поскольку именно корневое db-пространство создается первым, то,вероятно, нет необходимости задавать ему какое-либо смещение. Смещения чаще всегоиспользуются на Informix под UNIX/Linux, где применяются сырые устройства. Смещениямогут быть полезны при необходимости создать несколько маленьких чанков из большогофизического раздела. Используя значение смещения вы можете отметить начало чанка надиске. Чанк будет увеличен до требуемого размера и использован для создания нового db-пространства или добавления в существующее db-пространство.Использование смещений требует профессионализма. Сервер не проверяетэксклюзивность смещений и путей к устройствам. В результате можно некорректноуказать значение смещения, в результате два устройства пересекутся, и данные будутповреждены. Когда я использовал смещения, то никогда не располагал чанки вплотнуюдруг к другу, а всегда оставлял между ними 1 Мбайт незанятого пространства.ROOTPATHОпределяет полный путь к первому чанку корневого db-пространства. Обычноиспользуют полный путь, но можете использовать и относительный путь. Например, яиспользую такую переменную окружения:
    • export DEVICES=/opt/IBM/Informix/devices/tagusТогда можно корректно задать ROOTPATHROOTPATH $DEVICES/root_spaceROOTSIZEОпределяет размер в килобайтах первого чанка корневого db-пространства. Ярекомендую выделять 60-80 Мбайт. Этого значения достаточно для инициализацииэкземпляра -создания логического и физического журнала и системных БД. Послеинициализации рекомендуется перенести журналы в другое db-пространство (см Часть 5). В корневом db-пространстве могут создаваться временные таблицы для сортировки иупорядочения результатов выборки, но размер этих таблиц невелик. Для хранениявременных таблиц лучше создать временные db-пространства. Если вы не планируетесоздавать временные db-пространства, добавьте к корневому db-пространствудополнительные чанки. Временные db-пространства мы обсудим в части 5.System configurationПараметры этой группы также влияют на поведение всего экземпляра. Здесьустанавливается допустимое количество пользовательских соединений, протоколы, покоторым можно подключиться к серверу, количество ВП, максимально допустимое времямежду обработками контрольной точки. При настройке производительности многие администраторы первым делом вспоминаюто параметрах разделяемой памяти. Однако, многие параметры, которые мы рассмотримниже, могут серьезно повлиять на производительность экземпляра. Во время настройкиэкземпляра их нужно конфигурировать также внимательно, как и параметры разделяемойпамяти.ALARMPROGRAMОпределяет полный путь к программе или скрипту, которые будут запущены сервером БДпри наступлении некоторого события. Программа или скрипт должны уметь принимать 5аргументов – важность события (termed severity), идентификатор класса (class ID),сообщение класса (class message), особое сообщение (specific message) и ссылку на файл«смотреть также» («see also» file reference). Каждое событие может иметь свою схемууведомления администратора или процедуру автоматического разрешения события.Для обработки специфических событий эту программу можно сконфигурировать навызов других утилит. В каталоге $INFORMIXDIR/etc есть несколько файлов-шаблонов спрограммами обработки специфических событий: в зависимости от версии ОС это могутбыть файлы logs_full.sh, no_logs.sh или logs_full.bat, no_logs.bat. эти скриптыпредназначены для обработки только одного события. Первый скрипт (logs_full) спомощью набора утилит ON-Bar автоматически архивирует файлы логического журнала,второй вообще ничего не делает. Я рекомендую не изменять этот параметр и использовать существующий скрипт.AUTO_AIOVPSЭтот параметр разрешает серверу управлять количеством виртуальных процессоровасинхронного ввода/вывода, которые обслуживают ввод/вывод логического ифизического журнала, файловых чанков и т.п. Включение этого функционала не приводитк ухудшению производительности, но может ее улучшить. Рекомендую установитьпараметр AUTO_AIOVPS равным 1 (включено)
    • AUTO_CKPTSРазрешает серверу БД при необходимости выполнять обработку контрольной точки длядостижения требуемого времени восстановления. Включение этого функционала неприводит к ухудшению производительности, но может ее улучшить. Рекомендуюустановить параметр AUTO_CKPTS равным 1 (включено)AUTO_LRU_TUNINGРазрешает серверу БД автоматически управлять временем очистки последнихиспользованных запросов (least recently used queues). Эта возможность представляет ещеодно усовершенствование системы управления буферным пулом, представленной в IDS9.4. Когда экземпляр считает, что необходимо провести чистку, то процесс очисткибуферов получает высший приоритет. Включение этого функционала не приводит кухудшению производительности, но может ее улучшить. Рекомендую установитьпараметр AUTO_LRU_TUNING равным 1 (включено)CKPTINTVLУстанавливает максимальное количество секунд между обработками контрольной точки втом случае, когда экземпляр обрабатывает пользовательские потоки (if the instance ishandling user threads). Запись на диск во время обработки контрольной точки – самыйэффективный вид записи. В IDS 11 был введен новый алгоритм обработки контрольнойточки, поэтому этот параметр несколько утратил свое значение (is now more a worst-casetrigger than a hard system limit to which you must manage). Оставьте его равным 300 секунд.CLEANERSОпределяет количество потоков-чистильщиков страниц при запуске экземпляра. IDSиспользует чистильщики для передачи данных из буферного пула в механизм записи надиск. Разработчики IDS рекомендуют выделять один чистильщик на каждый активныйдиск экземпляра. Максимальное значение этого параметра равно 128.CONSOLEВ последних версиях IDS этот параметр практически бесполезен. Да и раньше ситуациябыла не намного лучше – на консоль выводились сообщения, что логические журналызаполнены и необходимо их архивировать, но это и так было видно, поскольку экземплярпрекращал операции до архивирования журнала. Я обычно устанавливаю этот параметрравным /dev/null или NUL. Вы можете перенаправить вывод сообщений в файл (поумолчанию так сделано в Windows-версии IDS).DBSERVERNAMEНазначает экземпляру уникальное имя среди всех экземпляров IDS в сети. Максимальнаядлина имени составляет 128 символов. Это имя регистрочуствительное. Нельзяиспользовать заглавные буквы, пробелы, знаки табуляции, тире, дефис, символ @. Это имя также используется в качестве переменной окружения $INFORMIXSERVER изаписывается в первое поле файла $SQLHOSTS. Имя экземпляра и псевдонимы (см. ниже) должно соответствовать правилам именованияобъектов в вашей организации. В книге в качестве имен экземпляров используютсяназвания рек.DBSERVERALIASESВ этом параметры содержится псевдоним (псевдонимы) экземпляра. Обычно псевдонимыиспользуются для задания дополнительных путей подключения к экземпляру. Длинапсевдонима равна 128 символам, псевдоним является регистрочувствительным и долженбыть уникальным в сети. Строки подключения к экземпляру обычно связаны с
    • протоколом подключения, поэтому желательно, чтобы псевдоним отражал этот факт.Например, чтобы обеспечить подключение через вторую сетевую карту по TCP/IP кэкземпляру sarthe, в DBSERVERALIASES я запишу псевдоним sarthe_tcp_2. Чтобыпсевдонимы соединений работали, они должны быть также записаны в файл $SQLHOSTSи в файл /etc/services или его аналог.Когда я говорю, что параметр DBSERVERALIASES используется для соединений посети, то это не так, если вы используете Enterprise Replication MACH-11. Более подробно конфигурация ER MACH-11 будет рассматриваться в следующей книге.DBSPACETEMPСодержит имена db-пространств, которые используются для сортировки, упорядочения,хранения временных таблиц, хэш-индексов и т.п. Введенные имена должны бытьразделены двоеточиями или запятыми без пробелов между ними. Вместе с разделителямимаксимальная длина этого параметра составляет 254 символа. Db-пространства, указанные в параметре DBSPACETEMP могут быть созданы и какобычные db-пространства, и как «временные» db-пространства, но всегда используютсякак временные db-пространства. Я рекомендую использовать именно временные db-пространства, поскольку работа с временными db-пространствами не регистрируется влогическом журнале. Временные пространства могут иметь страницу любого размера, новсе временные пространства должны иметь страницу одинакового размера. Вбольшинстве окружений при создании временных db-пространств используется размерстраницы по умолчанию всего экземпляра. Во время инициализации вы можете ввести имена временных db-пространств, которыхеще не существует. В этом случае в файл MSGPATH будет записано сообщение обошибке, которое говорит о том, что невозможно найти эти db-пространства. Этосообщение будет повторяться всякий раз при запуске экземпляра до тех пор, пока вы несоздадите временные db-пространства, имена которых указаны в параметреDBSPACETEMP. В качестве временных db-пространств используются только db-пространства, чьи именауказаны в параметре DBSPACETEMP или в переменных окружения $DBSPACETEMP,$PSORT_TEMPВ IDS 10 был существенно переработан механизм использования временных db-пространств, и сейчас они используются значительно реже. За этот функционалотвечает параметр NON_PDQ_QUERY_MEM, и он подробно рассматривается вовторой книге.DIRECT_IOЕсли вы используете Informix под UNIX/Linux и ваша ОС поддерживает прямойфайловый ввод/вывод, и вы используете чанки на файлах (выделенные файлы), то дляускорения доступа к чанкам можете установить этот параметр равным 1. Если ядро ОСподдерживает асинхронный ввод/вывод (kernel asynchronous IO - KAIO), и он включен вэкземпляре, то при конфигурировании экземпляра вы можете уменьшить количество ВПасинхронного ввода/вывода (AIO VP). Более подробную информацию по этим вопросамсмотрите в machine notes вашего дистрибутива.MSGPATHВ этом параметре хранится путь к журналу событий экземпляра. В журнал записываютсявсе сообщения экземпляра об ошибках. Каждый экземпляр на физическом сервере должениметь свой собственный журнал. Я обычно создаю отдельный каталог, где хранятся всежурналы ошибок. Обычно к имени журнала я прибавляю имя экземпляра, но вы можете
    • использовать любое приятное вам имя. Например, для экземпляра sarthe параметрMSGPATH имеет следующее значение:MSGPATH /opt/IBM/Informix/logs/sarthe.logС течением времени размер этого файла увеличивается, поэтому файл необходимопериодически архивировать и чистить.NETTYPEОт установки этого параметра зависит не только количество пользователей, которыемогут подключиться к экземпляру, но и то, как они могут подключиться. Дляобслуживания подключений к экземпляру используется понятие нити опроса и нитипрослушивания (poll thread, listen thread) .Нить опроса прослушивает сообщенияклиентских подключений и передает их нити прослушивания, которая производитаутентификацию пользователя и производит подключение пользователя к экземплярупутем запуска потока «sqlexec» для обработки SQL-команд. Результат выполнениякоманды передается в обратном порядке. Нить опроса запускается для каждой уникальнойкомбинации NETTYPE-параметров. В версиях для UNIX/Linux/Mac OS параметрNETTYPE позволяет также определить, ВП какого класса (CPU или NET) используютсядля обработки отдельной нити опроса. Соединения через разделяемую памятьобрабатываются нитью, которая использует ВП класса CPU, а другие типы соединениймогут обрабатываться ВП класса NET. Если для обработки подключений вы попробуетевыделить больше ВП класса CPU, чем общее количество ВП класса CPU, то экземплярвыделит ВП класса NET. Поля параметра NETTYPE представлены в таблице 4.4. Таблица 4.4 поля параметра NETTYPEНомер Имя поля Возможные значения (зависят от версии ОС)поля 1 Протокол подключения ipcshm, tlitcp, soctcp, tlispx, tlidr, socdr, sqlmux, (connection protocol) tliimc, socimc, socssl 2 Потоки (threads) Количество запускаемых нитей 3 Пользователи (users) Количество пользовательских подключений, которое будет обслуживаться каждой нитью 4 Класс ВП (VP class) Класс ВП, который будет обслуживать эти нити. Может быть CPU или NETНе забывайте, что необходимо разрешать только необходимые типы подключения.Включение каждого нового типа возможных подключений создает дополнительнуюнагрузку на сервер.NUMAIOVPSЭтот параметр, задающий количество виртуальных процессоров ввода/вывода (AIO ВП)может быть недоступен в версии сервера под вашу ОС. В IDS 11.50 этот параметр большене используется, вместо него применяется параметр AUTO_AIOVPS.
    • В более старых версиях IDS ВП AIO используются для обслуживания ввода/вывода изфайловых чанков (если не поддерживается прямой ввод/вывод), а также из физического илогического журнала. При использовании IDS 10 и младше, следуйте общим рекомендациям: для операцийэкземпляра выделяйте три ВП AIO плюс по одному ВП для каждого диска/LUN, накоторых располагается один или более чанков. В IDS 11.10 установите в качествезначения NUMAIOVPS значительно меньшее число (set NUMAIOVPS to a much lowernumber) и установите параметр AUTO_AIOVPS, чтобы экземпляр самостоятельноуправлял количеством ВП. В младших версиях IDS для определения количества ВП AIO предпочтительнееиспользовать параметр VPCLASS. Если вы используете этот параметр – закомментируйтепараметр NUMAIOVPS, поскольку он становится избыточным.VPCLASSЭтот параметр был введен во время выпуска IDS 9 и является стандартом определенияВП, создаваемых экземпляром. В целях обратной совместимости в файле $ONCONFIG вверсиях IDS младше 11.50 оставлены параметры ВП класса CPU, AIO. Правда, синтаксисопределения немного поменялся. Используя параметр VPCLASS вы можете определить конфигурируемые пользователемклассы виртуальных процессоров. Например, можно определить ВП для шифрованиястолбцов, интегрированной виртуальной машины Java, DataBlad’ов. Параметр имеет такойформат:vpclass class, num=number, optionsДля инициализации необходимо определить только ВП классов CPU и AIO. Определениевыглядит примерно так:vpclass CPU, num=3vpclass AIO, num=5Для инициализации экземпляра нет необходимости использовать дополнительные опции.Информацию о доступных опциях вы можете найти в IBM Informix Dynamic ServerAdministrator’s Reference.При использовании VPCLASS для создания ВП класса CPU необходимораскомментировать (comment out) параметры AFF_NPROCS, AFF_SPROC, NOAGE,NUMCPUVPS и, возможно, параметры MULTIPROCESSOR, SINGLE_CPU_VP. Прииспользовании VPCLASS для определения количества ВП AIO в версиях младше IDS11.50 необходимо раскомментировать (comment out) параметр NUMAIOVPS. Если вызабудете это сделать, инициализация экземпляра завершится ошибкой. К счастью в файлMSGPATH будет записана диагностика ошибки, по которой можно понять, что вамнеобходимо исправить.Разделяемая памятьСледующие параметры отвечают за конфигурирование разделяемой памяти экземпляра.BUFFERPOOLЭтот параметр введен в IDS 10 и представляет собой объединение отдельных параметровпредыдущих версий Informix. Раньше для каждого экземпляра был один набор буферов. ВIDS 10 появилась возможность создавать db-пространства с разным размером страниц (до16 КБайт). Каждый набор db-пространств, имеющих нестандартный размер страницы,
    • требует пул буферов с таким же размером страницы. IBM предлагает этот параметр дляопределения пулов буферов с разным размером страницы.Пул буферов выделяется для всех db-пространств с определенным размером страницы, ане для отдельного db-пространства.Сервер БД использует буфера для буферизирования данных запросов чтения и записи.Чем больше у вас буферов, тем больше вероятность, что необходимые пользователюданные находятся в буфере, и нет необходимости в обращении к диску (параметрыLRU_MIN и MAX_DIRTY регулируют очистку буферов от устаревших данных). В то жевремя большое количество буферов может привести к увеличению нагрузки на экземпляри нерациональному использованию системных ресурсов. Система должна управлятьизбыточными буферами, проверять их во время обработки контрольной точки. В файле-шаблоне $INFORMIXDIR/etc/onconfig.std для параметра BUFFERPOOL естьдве записи. Первая -это «значение по умолчанию», вторая запись – это запись для размерастраницы по умолчанию для Informix под вашу ОС. В следующей части вы увидите, каксоздавать db-пространства с разным размером страницы. Один из методов создания db-пространств автоматически создает и пул буферов для заданного размера страницы, еслиэтот пул еще не существует. Значение по умолчанию из файла $ONCONFIG будетиспользовано для установки параметров этого пула буферов. Более подробно смотритеследующую часть. Вторая запись BUFFERPOOL должна быть модифицирована перед инициализациейэкземпляра. Значение этого параметра сильно зависит от объема физической памятисервера, количества запущенных экземпляров, количества пользовательскихподключений, типа выполняемых операций (простые или сложные) и т.п. Общее правилорекомендует выделять 20-25 % физической памяти сервера экземпляру IDS, но этоправило не учитывает рабочей нагрузки, мультирезидентности и других операций,которые система должна поддерживать. Для начала установите значение этого параметра равным 10000, LRU_MIN_DIRTY=70,LRU_MAX_DIRTY=80. А затем мониторьте чтения из кэша и запись в кэш, а такжеразмер физического журнала. Если процент чтений из кэша и записи в кэш не будетсильно падать, то BUFFERPOOL можно установить равным по размеру 110% размерафизического журнала. Мониторить эти значения можно вызовом команды onstat –p . Во время нормальнойработы БД значение %cache_read должно быть больше 95%, а значение %cache_writeдолжно быть больше 85%.Начиная с IDS 11, сервер на основе мониторинга экземпляра записывает в MSGPATHрекомендации по настройке этого и некоторых других параметров.LOCKSЭтот параметр несильно влияет на размер разделяемой памяти экземпляра. Каждаяблокировка занимает 44 байта в резидентном разделе разделяемой памяти. Поэтомузначение этого параметра устанавливается большим, особенно в OLTP-средах, гденедостаток блокировок может привести к падению приложения. Мониторинг блокировок проводится командами onstat –p и onstat –k. Минимальноезначение этого параметра равно 2000, максимальное составляет 8000000 для 32-битовыхредакций IDS и 500000000 для 64-битовых редакций. Для загруженного экземпляра яустанавливаю значение этого параметра равным 100000 (требует 2-4 Мбайта разделяемойпамяти в зависимости от размера страницы по умолчанию), а затем провожу более точнуюнастройку.
    • В отличие от предыдущих версий Informix, количество блокировок больше нефиксировано. Если экземпляру требуется больше блокировок, чем вы установили в этомпараметре, он динамически добавит их, используя виртуальную часть разделяемойпамяти. Не полагайтесь на эту возможность, поскольку выделение и освобождениеблокировок требует некоторого времени, поэтому старайтесь установить параметрLOCKS как можно точнее.SERVERNUMИспользуется для задания смещения в структурах общей разделяемой памяти ОС(SHMBASE), откуда будет выделяться память для использования экземпляром. Выможете установить значение этого параметра равным 0 (ноль), но я рекомендуюиспользовать значение из диапазона 1-255. Это значение должно быть уникальным, еслина компьютере будет выполняться более одного экземпляра IDS. Последовательноенумерование экземпляров не требуется, как не требуется и уникальность этого значения впределах сети – оно имеет смысл только для физического сервера. Я рекомендую делатьзначение SERVERNUM уникальным во всем окружении; это позволит легче переноситьэкземпляры между системами без необходимости отлавливать потенциальные конфликтыадресов памяти. Хотя если у вас больше 255 экземпляров, это невозможно.SHMTOTAL Определяет максимальный объем разделяемой памяти (в Килобайтах), который можетиспользовать экземпляр. Если экземпляр пытается выделить больше памяти, чемразрешено этим параметром, то приложение, деятельность которого привела к попыткевыделения дополнительной памяти, получит сообщение об ошибке, и поток вызвавшийэту попытку, будет прибит экземпляром. В журнал MSGPATH будет записано сообщениео попытке выделения памяти. Установка этого параметра равным 0 (ноль)означаетотсутствие ограничений на выделение памяти, но устанавливать такое значение параметранеобходимо очень хорошо подумав и проводить постоянный мониторинг экземпляра иОС.SHMVIRTSIZEОпределяет начальный размер виртуальной части разделяемой памяти (в Килобайтах).Этот параметр необходимо настраивать в зависимости от нагрузки экземпляра. Ярекомендую начинать со значения 250 Мбайт (262144 КБайт) и затем мониторитьэкземпляр. Если экземпляру необходима дополнительная виртуальная память, ондинамически выделит сегмент размером SHMADD. Вы можете мониторить выделениедополнительных сегментов виртуальной памяти с помощью команды onstat –g seg. С выделением дополнительных сегментов виртуальной памяти, эффективность ееиспользования снижается. Если во время выполнения нормальных операций с БДпроисходит выделение дополнительных сегментов виртуальной памяти, необходимонастроить этот параметр. Его значение должно быть суммой всех выделенных объемоввиртуальной памяти. Если экземпляр больше не нуждается в дополнительной виртуальнойпамяти, он должен освободить этот сегмент автоматически. Иногда эта операциязавершается неудачно, и тогда необходимо освободить неиспользуемый сегментвиртуальной памяти с помощью команды onmode –F.SHMADDОпределяет объем дополнительной памяти (в КБайтах), который будет запрошенэкземпляром, если ему не хватило виртуальной памяти, выделенной через параметрSHMVIRTSIZE. Я устанавливаю это значение равным 120 Мбайт (131072 КБайт), а затеммониторю экзмепляр, чтобы выяснить, сколько дополнительно выделенной памятидействительно используется.
    • Выделение множества дополнительных сегментов виртуальной памяти может негативносказаться на производительности экземпляра (подробнее этот вопрос мы обсудим вовторой книге). С другой стороны выделение сразу большого объема виртуальной памяти,который практически не используется – это просто потеря системных ресурсов.Использование дополнительных сегментов виртуальной памяти можно посмотреть спомощью команды onstat –g seg.EXTSHMADDКонтролирует расширения виртуальной части разделяемой памяти (control an extension tothe virtual portion of shared memory). Эта часть памяти содержит кучи потоковопределенных пользователем ВП и процедур (UDR). В качестве начального значенияэтого параметра я использую 16 Мбайт (16384 КБайт). Если вы используете DataBlad’ы иUDR, то стоит установить для этого параметра большее значение.SHMVIRT_ALLOCSEGЭтот параметр введен в IDS11 и предназначен для определения реакции экземпляра наневозможность выделения памяти. Сервер может послать вам сообщение, что он не можетвыделить дополнительный сегмент виртуальной памяти. Этот параметр состоит из двух частей. Первая часть определяет пороговое значениеобъема памяти, ниже которого сервер будет пытаться выделять дополнительные сегментывиртуальной памяти. Значение может быть задано в килобайтах или процентахиспользуемой памяти. Если вы используете значение в процентах, то оно должно быть вдиапазоне 0.40-0.99 Вторая часть параметра определяет серьезность предупреждения, которое будет посланоSYSALARMPROGRAM, если экземпляр не сможет выделить сегмент объемомSHMADD. В таблице 4.5 приведены возможные значения Таблица 4.5 возможные значения второго компонента параметра SHMVIRT_ALLOCSEG Значение Уровень предупреждения, посылаемый SYSALARMPROGRAM параметра 1 Не важно (not noteworthy) 2 Информация (information) 3 Внимание (attention) 4 Серьезно (emergency) 5 Фатальная ошибка (fatal)Естественно, необходимо проверить, что SYSALARMPROGRAM может корректноотловить и обработать это предупреждение. Например, можно установить этот параметртак:SHMVIRT_ALLOCSEG 50000,3
    • Это означает, что предупреждение будет послано, если экземпляр имеет менее 50 Мбайтвиртуальной памяти и не может выделить больше из-за параметра SHMTOTAL илиограничений ОС. После настройки экземпляра вы можете установить этот параметр, например, так:SHMVIRT_ALLOCSEG .91,4Что означает посылку сообщения с уровнем серьезности «emergency», если экземпляримеет менее 9 процентов доступной виртуальной памяти и не может выделитьдополнительный сегмент из-за параметра SHMTOTAL или ограничений ОС.Архивирование и восстановлениеДавайте теперь рассмотрим параметры, которые предназначены для конфигурированияархивирования/восстановления. Некоторые из них относятся к ontape, другие – к наборуON-Bar. В этом разделе я приведу описание только тех параметров, установка которыхнеобходима для запуска экземпляра, т.е. мы поговорим о параметрах утилиты ontape. Опараметрах ON-Bar речь пойдет в Части 7. В IDS 11 были внесены существенные изменения в процесс архивирования/восстановления. Одно из них необходимо упомянуть сейчас. В предыдущих релизахпараметры LTAPEDEV и TAPEDEV поддерживали запись только на ленту илистандартное устройство ввода/вывода (STDIO), что приводило к необходимостииспользовать каналы или скрипт оболочки для перенаправления вывода в файл или наустройство архивирования. Хотя была возможность установить в качестве значения этихпараметров имя файла, но такой подход был не совсем хорош, поскольку каждая операцияархивирования перезаписывала один и тот же файл. Сейчас эта проблема решена. Вы можете установить в качестве значений параметров LTAPEDEV и TAPEDEV путь ккаталогу, например, /opt/IBM/informix/backups/ (не забудьте про завершающий «/»). Есливы так сделаете, то ontape будет архивировать экземпляр или логические журналы в этоткаталог, и имена файлов будут уникальными. Подробнее эту возможность мы обсудим вЧасти 7.LTAPEBLK и LTAPESIZEПо этим параметрам смотрите ниже замечания к параметрам TAPEBLK и TAPESIZE.LTAPEDEVОпределяет устройство, которое будет использоваться для архивирования логическихжурналов утилитой ontape. Значение по умолчанию этого параметра зависит отплатформы. Для версий под UNIX/Linux/Mac OS X это имя файла (generic file name), вверсиях под Windows значение по умолчанию установлено в NUL, т.е. архивирование непроизводится. Вне зависимости от дистрибутива, если вы установите значение этогопараметра равным /dev/null, то можете нарваться на два неприятных эффекта. Первый -полное восстановление экземпляра утилитой ontape невозможно, поскольку каждыйжурнал очищается для повторного использования сразу после заполнения и больше несодержит последнюю контрольную точку или открытую транзакцию. Использованныйжурнал очищается не сразу и может быть перечитан процессом восстановления, но этокране рискованный трюк. Если журналы с момента последнего архивирования былипереписаны, вы сможете восстановить базу только на момент создания последнего архива.Второй побочный эффект – невозможность использовать для архивирования утилиты ON-Bar. Следует отметить, что ON-Bar не считывает этот параметр динамически привыполнении операции архивирования, а использует значение, которое было задано вовремя старта экземпляра. Поэтому можно изменить этот параметр во время работы
    • экземпляра с имени устройства на /dev/null, и ON-Bar будет нормально работать. Правда,я не приветствую такой подход. Для промышленных установок при работе с журналируемыми базами данных я всегдарекомендую архивировать логические журналы на диск или ленту. Это позволит вампровести полное восстановление экземпляра в случае критического сбоя. Итак,установите в качестве значения параметра LTAPEDEV ленточное устройство или диск ивыполняйте регулярное архивирование логических журналов с помощью ontape или ON-Bar.При начальном конфигурировании экземпляра я устанавливаю значение этого параметраравным /dev/null, а после полной настройки ставлю в качестве его значения имяустройства.TAPEBLKЭтот параметр устанавливает размер блока ленточного устройства архивирования(TAPEDEV), используется утилитами ontape, onload, onunload при обработкеввода/вывода этого устройства. Значение по умолчанию можете подходить, а может и неподходить для вашего устройства. В общем, чем больше размер блока устройства, тембыстрее проходят операции архивирования/восстановления. Перед установкой параметрапосмотрите документацию к оборудованию.TAPEDEVПараметр указывает на устройство, которое будет использоваться для архивированияэкземпляра. Этот может быть полный путь к каталогу, полный путь к файлу, STDIO,символическая ссылка на каталог или устройство. Если вы используете файл, каталог илиSTDIO, то сервер игнорирует параметр TAPEBLK, но размер файла будет зависеть отпараметра TAPESIZE. Можно установить значение этого параметра равным /dev/null, но тогда будетневозможно восстановление экземпляра. Если вы используете другое допустимоезначение, включая файл, значение параметра будет проигнорировано ON-Bar с или безISM. Операции утилиты ON-Bar используют устройства, сконфигурированные спомощью менеджера хранилища (storage manager).TAPESIZEСпецифицирует максимальный объем данных (в килобайтах), которые могут бытьзаписаны на ленту или максимальный размер файла-архива при использовании утилитыontape. В предыдущих версиях IDS этот параметр требовал особого внимания. Раньше, когдауказанный объем данных записывался на ленту, вам предлагалось для продолженияархивирования вставить новую ленту. Если в параметре было установлен максимальныйобъем ленты (например, 2 ГБайт), и лента была некорректно отформатирована (имеламеньший объем), то процесс архивирования завершался с ошибкой. Тоже самоепроисходило с файлом: если он достигал максимального размера в процессеархивирования, то процесс архивирования завершался ошибкой. Практическаярекомендация была такой: в качестве значения параметра использовать 95-97 процентовполного объема ленты. Сейчас в качестве значения этого параметра при архивировании на ленту можноустановить 0 (ноль). В этом случае ontape будет писать данные на ленту, пока не получитсообщение «end-of-medium», после чего предложит вставить следующую ленту. Врезультате вы можете использовать ленты одинакового стандарта, но разной емкости.Если вы делаете архивы в файл или каталог, то значение параметра не должно превышатьограничения на максимальный размер файла в ОС (смотрите Часть7).
    • Этот параметр не применим к архивам, созданным с помощью ON-Bar для разныхменеджеров хранилищ (например, ISM)Первый запуск экземпляраВы установили переменные окружения, создали устройства, отредактировали файлконфигурации и $SQLHOSTS. Настала пора выполнить первый запуск экземпляра.Полезно просматривать не только вывод команды инициализации, но и файл MSGPATH.Для этого , как пользователь informix, я создаю , с помощью команды touch файл,указанный в $ONCONFIG, устанавливаю права на файл так, чтобы читать его могли все,а затем выполняю команду tail –f. Во втором окне я выполняю команду запуска экземпляра oninit –ivy. Флаг –Iприказывает серверу выполнить инициализацию корневого db-пространства, в результатечего из него удаляются все структуры данных, которые могли там остаться отпредыдущей инсталляции или прошлой попытки инициализировать сервер.Использовать этот флаг надо с особой осторожностью и только в том случае, если выхотите начать с полностью чистого экземпляра.Флаг –v предписывает серверу выдавать сообщения о процессе инициализации. Флаг –yпоказывает, что вы действительно намерены инициализировать сервер и отвечаетутвердительно на вопрос в стиле «Are you sure…»Когда экземпляр стартует в первый раз, то в файл MSGPATH выводится многосообщений: статусные сообщения о выделении разделяемой памяти, верифицирующиесообщения об обнаружении физических устройств, сообщения о запуске виртуальныхпроцессоров, установке сетевого соединения (если настроено для экземпляра) и т.д. есливсе идет хорошо, вы увидите сообщения, что создаются и заполняются системные базыданных (sys). В процессе инициализации создаются четыре системные БД – sysmaster,sysadmin, sysusers, sysutils. Ниже мы рассмотрим эти БД подробнее.Пока запомните, что до тех пор, пока вы не увидите сообщения о завершениисоздания этих БД, нельзя пытаться выполнять любые команды на экземпляре, в томчисле и подключаться к нему.Поэтому очень важно мониторить файл MSGPATH и вывод команды oninit.Если вы попробуете подключиться к экземпляру в момент создания системных базданных, то с очень высокой вероятностью прервете процесс их создания, и сервер будетполностью неработоспособен. Поверьте, я пару раз такое проделывал, но только натестовом сервере. Процесс создания системных БД занимает 1-2 минуты.Базы данных SysВо время инициализации создаются четыре системные БД - sysmaster, sysadmin, sysusers,sysutils. В этом разделе я расскажу об этих БД и о интерфейсе мониторинга системы(System Monitoring Interface - SMI). В зависимости от используемой функциональности в экземпляре могут быть и другиесистемные ЬД. Например, базы данных syscdr, sysha, onpload. О двух из них я краткорасскажу, а подробное рассмотрение этих баз будет проведено в моей следующей книге.База данных sysmaster и SMIБаза данных sysmaster и SMI с точки зрения администратора являются двумяпрекрасными инструментами. Через интерфейс SMI администратор может получитьдоступ к информации о всех операциях экземпляра. База данных sysmaster – этокомбинация настоящих таблиц, созданных в корневом db-пространстве, и псевдо-таблиц,
    • управляемых сервером БД. Псевдо-таблицы, создаваемые при запуске экземпляра,являются указателями на разделяемую память для экземпляра IDS. Через интерфейс SMI вы можете с помощью подмножества языка SQL получать данныеиз настоящих таблиц и псевдо-таблиц БД sysmaster. Утилиты onstat и oncheck такжеработают через SMI. Схема БД sysmaster находится в файле $INFORMIXDIR/etc/sysmaster.sql. этот файлсодержит описание каждой таблицы и полей этих таблиц. Как я уже говорил, этв бдсоздается во время процесса инициализации. Хотя и есть возможность в любой моментвремени пересоздать БД sysmaster, но лучше так не делать – может сильно не повезти. БД sysmaster создана так, что когда она находится в рабочем режиме, для нееневозможно создать схему (a database schema cannot be created) и выгрузить таблицы.Поскольку многие таблицы БД представляют собой указатели на разделяемую память, изэтих таблиц нельзя удалять данные, модифицировать их или записывать новые. Членыгруппы DBSA могут в этой базе создавать хранимые процедуры, которые могут бытьвызваны экземпляром или пользовательскими операциями. БД sysmaster создается с небуферизированным журналированием (unbuffered logging).Но при необходимости вы можете перевести ее в режим буферизированногожурналирования. Я не рекомендую изменять режим журналирования, посколку выигрышав производительности не будет или он будет очень невелик. Вы можете выполнять запросы к этой БД через ваше приложение или через dbaccess.Для БД sysmaster, в отличие от обычных БД, нельзя задать привилегии на выборку изтаблиц – роль «public» имеет разрешение connect ко всем таблицам. База данныхsysmaster функционирует как обычная БД, поэтому вы можете использовать данные изнее для объединения (join) с данными других БД. В отличие от обычных БД выборки илиобъединения (selects or joins ) с БД sysmaster можно делать даже в том случае, когдадругие БД используют разные режимы журналирования. Вы увидите, что в БД sysmaster таблиц немного, но много представлений. Вбольшинстве случаев эти представления служат для обратной совместимости состоронними приложениями. В последующих релизах эти представления могут бытьудалены или изменены. По пводу поддерживаемых в вашей аерсии представленийсмотрите официальную документацию дистрибутива.База данных sysadminВ IDS 11 база данных sysadmin для поддержки SQL интерфейса администрированиясодержит функции task() и admin(). Также в ней находится таблица истории команд,выполненных этими функциями, и эта БД используется планировщиком для выполнениязаданий. В БД также находятся данные о производительности и другие историческиеданные (other historical data), имеющие целью помочь администратору в настройкеэкземпляра.База данных sysusersВ этой БД мало таблиц. Она содержит идентификатор пользователя (user ID), роль и хост,с которого выполнено подключение. С помощью этой БД определяется, какиепользователи, группы пользователей и роли могут подсоединяться к экземплярам. Эта БДтакже используется членом роли DBSECAM для управления безопасностью экземпляраБаза данных sysutilsЭта БД используется набором утилит ON-Bar. В таблицах БД находятся данные о каждомэкземпляре, пространствах хранения, архивировании и восстановлении, статусе лент ивремени истечения актуальности архива и подобная информация. Эта БД может бытьиспользована для восстановления загрузчика onbar и других критических файлов
    • База данных syscdrЭта БД создается при включении Enterprise Replication. Содержит определения и правиларепликации, определения хостов и другие объекты, связанные с ER.База данных syshaЭта БД появилась в IDS 11 и предназначена для поддержки функционала высокойдоступности (high-availability functionality) на основе технологии MACH-11. подробно этатехнология будет рассмотрена во второй книге.ЗаключениеВ этом разделе приведено много полезной информации. Сейчас вы должны уже хорошопонимать, как установить или обновить IDS и какие опции нужно выбрать во время этогопроцесса. Вам следует знать наиболее важные параметры файла $ONCONFIG и для чегоони предназначены, также необходимо знать предназначение системных БД.Во время установки и инициализации Informix Dynamic Server помните о следующем:  Если вы планируете использовать программную или аппаратную защиту от сбоев дисков, включите зеркалирование (параметр MIRROR). Вы не обязаны использовать зеркалирование. В критических ситуациях вы можете быстро создать зеркала с помощью Informix без необходимости перезапуска экземпляра.  Если вы планируете для архивирования использовать утилиту ontape, убедитесь, что вы выставили правильные конфигурационные параметры. В Части 7 мы подробно поговорим о архивировании и восстановлении экземпляра  Установите размер корневого db-пространства 60-80 Мбайт. Корневое db- пространство не нужно делать большим, поскольку после инициализации экземпляра вы можете перенести физический и логические журналы в другое db- пространство. Возможность выполнять сортировку и упорядочение данных в памяти с помощью параметра NON_PDQ_QUERY_MEM и использование «временных» db-пространств еще более снижает необходимость в большом корневом db-пространстве.  Убедитесь, что в логических журналах достаточно места для создания системных БД во время инициализации экземпляра. После инициализации и конфигурирования экземпляра выполните архивирование логических журналов. После запуска экземпляра перенесите физический и логические журналы из корневого db-пространства.Эта часть посвящена одному из очень редких аспектов администрирования IDS. в жизнигораздо чаще приходится сталкиваться с задачами изменения режима журналированияБД, администрированием db-пространств и BLOB-пространств, отстреломпользовательских сессий. Следующая часть посвящена именно этим вопросам. Часть 5. Основные административные задачиВ этой части:  Изменение режимов работы экземпляра  Изменение режимов журналирования БД  Создание и удаление чанков, db-пространств, BLOB-пространств  Перемещение журналов и изменение их размеров  Безопасный отстрел пользовательского потока  Автоматический запуск и останов экземпляра.
    • Если вы используете эту книгу в качестве пошагового учебника, то к этому моментувремени у вас уже должен быть установленный и инициализированный экземплярInformix Dynamic Server. В этой части я сначала опишу графические инструментыадминистрирования, настройки и диагностики IDS. Я затрону базовые задачиадминистрирования сервера. Некоторые из них выполняются один раз для всегоэкземпляра, другие – более-менее регулярно. В большинстве случаев вы будете выполнять эти операции в командной строке иличерез интерфейс SQL API. После прочтения раздела вы сможете добавлять и удалять db-пространства, изменять режимы журналирования базы, перемещать журналы и изменятьих размеры, корректно убивать пользовательские потоки.Утилиты администрирования InformixIDS поставляется с двумя графическими утилитами администрирования и однойтекстовой. Я небольшой поклонник графических интерфейсов, поскольку все задачиадминистрирования IDS можно выполнять из командной строки. Однако, я понимаю, чтомногие пришедшие в администрирование IDS видели только графические интерфейсы.IDS OpenAdmin Tool (OAT)Этот инструмент разрабатывается в IBM Informix Advanced Technical Support. Изначальнопри разработке ставились такие задачи: обеспечить администратора необходимой дляанализа информацией, дать ему возможность управлять SQL-запросами экземпляра,обеспечить интерфейс к новым возможностям мониторинга. OAT написан на PHP,исходный код открыт по лицензии Open Source, ОАТ предназначен для замены InformixServer Administrator (ISA).АPI SQL-администрированияЭтот функционал появился в IDS 11 и позволяет выполнять администрированиеэкземпляра, используя вызовы функций SQL. Такая возможность была добавлена понескольким причинам. Во-первых, стандартизация : это административное средствоработает одинаково для IDS под разные ОС. Такая возможность особенно важна, еслиодновременно эксплуатируются сервера IDS под управлением разных ОС. Вторая причина – облегчение труда начинающих администраторов, многие из которыхчувствуют себя неуютно при работе с сервером, который управляется в основном изкомандной строки. Одновременно такие администраторы вполне уверенно пишут SQL-запросы. Теперь администраторы могут выполнять многие административные задачи спомощью SQL, а не загадочных функций onmode, onparams.Кроме того, все больше и больше внимания уделяется безопасности серверов,содержащих БД с критическими данными. В таких системах отключен telnet и другиесистемы удаленного администрирования. Без возможности подключиться к удаленномусерверу невозможно выполнять администрирование экземпляра IDS. При наличии SQLAPI нет необходимости в telnet-подключении – вы можете администрировать экземплярычерез клиентское SQL-приложение. API администрирования является частью БД sysadmin и состоит из трех основныхкомпонентов – двух определенных пользователем функций и таблицы истории, гдефиксируются все действия, выполненные через API. Эти две функции, task() и admin(),идентичны по функциональности и могут использоваться взаимозаменяемо. Отличаютсяони возвращаемыми значениями после выполнения команды. Функция task() возвращаеттекстовую строку с описанием того, что сделала функция. Функция admin() возвращаетцелочисленное значение. Рассмотрим, например, выполнение одной и той же операции спомощью обоих функций:
    • execute function task (‘create dbspace’,’data_space_1’, ‘opt/IBM/informix/devices/amazon/ama_chnk_20’, ‘150mb’,’0’);(expression) created dbspace number 12 named data_space_1илиexecute function admin(‘create dbspace’,’data_space_1’, ‘opt/IBM/informix/devices/amazon/ama_chnk_20’, ‘150mb’,’0’);(expression) 107Возвращаемое целочисленное значение следующее значение: если число положительно,то оно представляет собой номер строки в таблице истории операций, выполненных черезAPI, если число отрицательное, то это говорит о произошедшей ошибке, если значениеравно 0 (ноль), то команда успешно выполнена, но в таблице истории нет места длявставки новой строки. По умолчанию БД sysadmin и ее объекты создается в корневом db-пространстве. Если вы выполняете множество операций через API, размер таблицыистории будет расти, и корневое db-пространство может переполнится. Существует два пути управления ростом таблицы истории. Во-первых, вы можете спомощью API перенести базу данных в другое db-пространство:execute function task (“reset sysadmin”,”целевое db-пространство”)После переноса БД sysadmin в это db-пространство, оно становится критическим с точкизрения функционирования экземпляра. Если db-пространство повредится, экземплярпрекратит функционирование. Второй метод подразумевает мониторинг и очистку таблицы. Таблица истории невелика. В Таблице 5.1 приведена ее схема
    • Схема таблицы command_history в базе данных sysadmin Столбец Тип описание cmd_number serial Уникальный идентификатор строки cmd_exec_time datetime year-to-second Время, когда была выполнена команда cmd_user varchar(254) Идентификатор пользователя, выполнявшего команду cmd_hostname varchar(254) Компьютер, с которого была запущена команда cmd_executed varchar(254) Текст выполненной команды cmd_ret_status integer Код возврата команды cmd_ret_message lvarchar(30000) Строка, возвращенная командойБаза sysadmin предоставляет больше возможностей, чем просто выполнение функцийадминистрирования экземпляра. В других частях книги мы обсудим использование этойБД для планирования выполнения операций, настройки производительности. Болееподробно эти темы будут рассматриваться во второй книге.Изменение режимов работыЭкземпляр Informix Dynamic Server может работать в различных операционных режимах спредоставлением различного уровня функциональности для конечных пользователей. Внекоторых режимах экземпляр может работать продолжительное время, другие режимыявляются переходными, но каждый из них имеет свое назначение. Раньше требовалось,чтобы для выполнения определенных функций администрирования экземпляр былпереведен в определенный режим, на данный момент это неактуально. В IDS 11 выможете выполнять практически все задачи администрирования без необходимостипрерывания пользовательских потоков. Однако, администратору сервера необходимопонимать режимы работы сервера, как изменять эти режимы и т.п. Определить режим работы экземпляра можно несколькими методами. Самыйтрудоемкий способ – исследовать файл MSGPATH на предмет записей об изменениирежима работы. Самый простой способ – выполнить команду onstat -. Эта командавыводит время работы сервера и режим его работы. В первой строке вывода командывсегда указывается режим работы сервера.Только пользователь root или Informix должны менять режим работы экземпляра.Обратите внимание, что члены группы DBSA (обычно члены групп informix,informixadmin на уровне ОС) могут менять режим работы любого экземпляра, используякоманды oninit, onmode или SQL API. Желательно, чтобы учетная запись root не использовалась для изменения режимаработы сервера, поскольку в этом случае процессы, поддерживающие ВП, которыевыполняют UDR, получают права root. Если эти UDR выполняют внешние системныевызовы, то эти вывозы будут выполнены с правами root, что при наличии ошибок в UDRнежелательно.
    • В таблице 5.2 описаны 7 режимов работы экземпляра. Таблица 5.2. Режимы работы экземпляра Режим ОписаниеАдминистративный Усовершенствование однопользовательского режима(administrative) (single user) IDS 10. В этом режиме экземпляр находится в он-лайн, но к нему могут подключиться только пользователи, идентификаторы которых (ID) указаны через onmode –j –U, oninit –U или через конфигурационный параметр ADMIN_MODE_USERS. Список таких пользователей можно обновлять в любой момент, изменения применяются немедленно. Этот режим следует использовать только в особых случаях, когда необходимо ограничить доступ пользователей в систему на время выполнения некоторых административных задачОфф-лайн (Offline) Экземпляр не запущен. Разделяемая память не выделена или не инициализирована. Виртуальные процессоры не запущеныСтатический (quiescent) Экземпляр полностью функционален, но доступ к пользовательским БД невозможен. Этот режим очень похож на режим обслуживания в многопользовательских ОС. В этом режиме все пользователи, в том числе и informix, могут подключиться только к базам, доступным через SMI. В ранних версиях IDS некоторые административные задачи: удаление или добавление логических журналов, операции с физическим журналом, требовали перевода экземпляра в статический режим для своего завершения. В текущих версиях IDS алгоритм выполнения таких операций полностью переписан, поэтому сейчас нет необходимости изменять режим работы экземпляра.Только чтение (read В версиях до IDS 11.50 этот режим применим только кonly) вторичным серверам в HDR или MACH-11. В этом режиме приложение имеет доступ к таблицам на вторичном сервере, но команды insert, update, delete запрещеныВосстановление Это промежуточный режим, используемый сервером во(recovery) время инициализации разделяемой памяти и запуска виртуальных процессоров. В этом режиме выполняется быстрое восстановление. Если в этом режиме инициализирована разделяемая память, то SMI все равно недоступенВыключение (shutdown) Еще один промежуточный режим. Он используется тогда, когда экземпляр переходит из он-лайн в статический режим или в офф-лайн. Если не было указано немедленное выключение, то пользовательские потоки могут завершить свою работу, но новые подключения к экземпляру и базе не
    • допускаютсяОбновляемый В IDS 11.5 в этом режиме могут работать экземпляры,(updatable) сконфигурированные как HDR, SDS (shared disk secondary), и/или RSS(remote standalone secondary). При включении этого режима становятся возможными DML операции и full end-user query. Параметр файла $ONCONFIG UPDATABLE_SECONDARY определяет, поддерживает ли вторичный сервер DML-операции. DDL-операции на данный момент не поддерживаютсяКоманда изменения режима работы экземпляра не может быть отменена. Взависимости от того, как вы изменяете режим работы и если есть пользовательскиесессии, вы получите запрос на переход в другой режим. Если на этот запрос ответитеотрицательно, экземпляр останется в исходном режиме работы, а команда будетотменена.С помощью двух команд вы можете остановить, перезапустить, переинициализироватьэкземпляр. Вы можете использовать и SQL API, но только не для старта илиинициализации экземпляра, поскольку в эти моменты БД sysadmin недоступна. В IDS11.50 ОАТ обеспечивает функциональность запуска экземпляра, находящегося в офф-лайн, эта функциональность требует конфигурации сервиса xinetd для взаимодействия сэкземпляром. Утилита oninit может быть использована для перевода экземпляра из режима офф-лайн водин из следующих:  oninit –s (строчная буква s). Переводит сконфигурированный экземпляр из офф- лайн в статический режим.  oninit –S (прописная буква S). Переводит сконфигурированный экземпляр из офф- лайн в статический режим, но в этом случае если экземпляр раньше был частью HDR (первичным или вторичным сервером), то он будет работать как отдельный сервер и больше не будет частью пары HDR.  oninit –j. Переводит экземпляр из офф-лайн в административный режим. Обратите внимание, что в этом случае флаг –U для указания пользователей, которым разрешено подключение к экземпляру, не поддерживается. В результате к экземпляру могут подключиться только пользователь informix, члены группы DBSA и пользователи, указанные в конфигурационном параметре ADMIN_MODE_USERS.  oninit Без флагов переводит сконфигурированный экземпляр из офф-лайн в он- лайнУтилита oninit поддерживает также флаг –р, который я не рекомендую использовать. Приустановке этого флага экземпляр во время своего запуска не будет удалять временныетаблицы в корневом db-пространстве и остальных db-пространствах. Использование этойопции позволяет немного уменьшить время перехода из офф-лайн в он-лайн. С другойстороны, дисковое пространство, занятое временными таблицами, не будет очищено,пользовательские сессии к этим таблицам доступа иметь не будут, следовательноиспользование этого флага приводит к замусориванию дискового пространства. Я недумаю, что 10 секунд ожидания – это большая плата за очистку диска от ненужных
    • данных. У команды oninit, есть еще один флаг, с которым нужно быть очень осторожным– это флаг –i. Этот флаг инициализирует корневое db-пространство экземпляра,полностью стирая все данные, которые там находились. Используйте этот флаг только втом случае, если вы перенастраиваете экземпляр с самого начала. Для изменения режимов работы экземпляра используется команда onmode.  onmode –m Переводит экземпляр из статического режима в режимон-лайн  onmode –s[y] Переводит экземпляр из режима он-лайн через режим выключения в статический режим. Флаг –y отключает выдачу предупреждения. Эта команда запрещает новые подключения, но ждет завершения всех подключенных пользовательских сессий. Ждать этого она может бесконечное время. Для ускорения процесса выключения или если вам необходимо отстрелить пользовательское соединение используйте команду onmode –z session_id  onmode –k[y]. Корректно переводит экземпляр в режим офф-лайн – проводится обработка контрольной точки, транзакции откатываются  onmode –u[y]. Жестко прекращает работу экземпляра. В логических журналах транзакции помечаются для отката. Флаг –y отключает выдачу двух подтверждений.Команда onmode также поддерживает флаги –z (отстрел пользовательских сессий), -а(увеличение сегмента разделяемой памяти), -с (инициализация обработки контрольнойточки). Мы рассмотрим эти флаги подробнее в соответствующих разделахИзменение режима журналирования базыКак вы узнаете в Части 6, при создании БД необходимо выбрать режим журналирования.Режим журналирования определяет механизм записи измениний в БД. Если база данныхнаходится в журналируемом режиме, сервер отслеживает ее изменения с помощьюлогического и физического журнала. Во второй книге я расскажу, как логический журналиспользуется для поддержания логической целостности данных. В предыдущих версиях IDS изменение режима журналирования нужно было делатьвремя от времени, особенно во время обслуживания (changes to the logging mode of adatabase occurred with some regularity, particularly during maintenance periods). Такое,например, необходимо было делать для изменения структуры больших таблиц, чтобы неналететь на длинную транзакцию. В последних релизах IDS можно в «сырой»(нежурналируемый) режим перевести отдельную таблицу, не трогая остальных таблиц вБД. Эта возможность позволяет выполнять операции обслуживания таблиц без генерациизаписей в логическом журнале, одновременно журналируя операции пользователей. Есть ситуации, когда изменение режима журналирования необходимо. Например, высобираетесь создать БД с помощью утилиты dbimport. В этом случае лучше создать базуданных с нежурналируемым режимом. Причина этого состоит в том, что серверобрабатывает операцию импорта утилитой dbimport как одну транзакцию, и возможновозникновение долгой транзакции. После завершения импорта вы можете изменить режимжурналирования базы. Второй причиной изменения режима журналирования может бытьнеобходимость вненсения структурных изменений в большое количество таблиц во времяобслуживания БД. В Части 6 приведено описание всех режимов журналирования БД,поддерживаемых Informix Dynamic Server. Давайте сейчас обсудим два типажурналирования: журналируемый и нежурналируемый. В процессе разработки IDSмеханизмы изменения режима журналирования неоднократно менялись. В ранних версияхIDS изменение режима журналирования можно было сделать только тогда, когда сервернаходился в статическом режиме, некоторые изменения можно было проводить спомощью утилиты ontape. Затем стало возможно использовать для этой цели утилитыON-Bar. Затем IBM выпустила утилиту ondblog, которая помечала БД для изменения
    • режима журналирования. Режим журналирования изменялся только после полного архиваэкземпляра. Отдельный пользователь мог изменить режим журналирования для своейсессии. Используя SQL-команду set log пользовательское приложение могло изменитьрежим журналирования своей сессии с небуферизированного журналирования набуферизированное и наоборот. Утилита ondblog устанавливает флаг изменения режима журналирования базы послевыполнения архива 0-го уровня экземпляра через утилиту ontape или ON-Bar. Нижеприведен список флагов утилиты ondblog:  ansi. Режим журналирования ANSI  cancel Отменяет изменение режима журналирования  buf Буферизированное журналирование  nolog Отключает журналирование  unbuf Небуферизированное журналированиеПосле этих опций могут указываться один или два дополнительных параметра. Первый –список БД через пробел, для которых изменяется режим журналирования, второй – послефлага –f указывается путь к файлу со списком баз, для которых должен быть измененрежим журналирования. Базы данных в файле записываются по одной в строке, без знаковпрепинания. При отсутствии дополнительных параметров утилита ondblog изменяетрежим журналирования всех баз данных после выполнения архива 0-го уровня. Отключение журналирования или переход из нежурналируемого режима вжурналируемый требует выполнения архива 0-го уровня с использованием ontape с илибез использования ondblog или через ON-Bar с использованием ondblog. Используя ON-Bar или SQL API, вы можете создать «ложный» (fake) архив. Как я расскажу в Части 7создание такого архива просто меняет некоторые флаги в экземпляре так, словноархивирование экземпляра было выполнено. Используйте эту возможность оченьосторожно. Я рекомендую создавать правильный архив, и избегать использования этихопций. Изменить режим журналирования с помощью утилиты ontape довольно просто.ontape -U dbname – небуферизированное журналированиеontape –B dbname – буферизированное журналированиеontape –A dbname – ANSI-журналированиеЧтобы изменить режим журналирования с журналируемого/нежурналируемого на другой,просто добавьте вышеуказанные флаги или флаг –N dbname (для перехода кнебуферизированному журналированию) к команде ontape –s -L 0 (ноль). Для изменениярежима журналирования нескольких баз используйте утилиту ondblog. При изменении режима журналированияэкземпляр может не находиться в статическомрежиме, но к нему не должно быть активных пользовательских подключений, иначе выполучите загадочную ошибку –107 ISAM. Если вы прервете выполнение командыизменения режима журналирования базы, то база данных будет недоступна дляпользователей до выполнения полного архива экземпляра. В ситуациях, когда необходимо изменить режим журналирования БД для проведенияадминистративных работ, есть возможность ускорить процесс создания архива иизменения режима журналирования. Первый способ – использовать утилиту ondblog дляуказания баз данных и режимов журналирования, а затем onbar –b –F для созданияпсевдо-архива. Это все, что необходимо утилите ondblog для изменения режимажурналирования баз(ы) данных. Вторая возможность – отредактировать файл $ONCONFIG, временно указав в качествеархивного устройства (TAPEDEV) /dev/null, а затем выполнить команду ontape с или без
    • утилиты ondblog. Будет выполнено псевдо-архивирование, установлены необходимыефлаги и изменен режим журналирования БД. Третий подход – использовать SQL API и использовать параметр archive fake вфункциях task() или admin(). Естественно, перед изменением режима журналирования для проведения обслуживанияБД, необходимо выполнить полное архивирование экземпляра на случай, еслипотребуется восстановление. После проведения обслуживания вы можете изменить режимжурналирования назад одним из вышеописанных трех способов. После изменения режимаобязательно выполните полное архивирование экземпляра.Управление db-пространствами и BLOB-пространствамиУправлять db-пространствами и BLOB-пространствами можно через графическиеутилиты администрирования, команду onspaces и интерфейс SQL API. При создании db-пространств необходимо учитывать, как они будут размещены на физических дисках,какие таблицы будут находится в этих пространствах, и какой возможен рост размеровтаблиц. В OLTP-приложениях быстроизменяющиеся таблицы следует распределять (и возможнофрагментировать) по небольшим высокопроизводительным дискам. Другие таблицыможно разложить по db-пространствам на более медленных дисках. В OLAP-системахтребуются диски большой емкости, здесь при раскладывании таблиц по дискам болееважна их логическая группировка. С удешевлением жестких дисков и развитием технологии массивов хранения сталосложнее максимизировать дисковый ввод/вывод базы. Почти невозможно найтинебольшие по емкости жесткие диски, чтобы положить туда только меняющиеся таблицы.Администраторы массивов чаще всего идут по пути минимального сопротивлениясобирая все или почти все имеющиеся жесткие диски в RAID 1+0 (если вам повезло) илиRAID 5 (если вам очень не повезло). Такие массивы легко администрировать, но на нихтяжело достичь максимальной производительности IDS. Давайте рассмотрим некоторые общие вопросы. Для максимально производительнойобработки контрольной точки желательно размещать чанки db-пространств по алгоритмуround-robin на всех доступных жестких дисках. Хотя это правило было особенноактуально для IDS младше 11-й версии, оно и сейчас неплохо работает, минимизируявремя обработки контрольной точки. Чистильщики страниц (CLEANERS), управляющиезаписью данных на диск при обработке контрольной точки, выделяются в порядкесоздания чанков (are allocated in chunk-creation order). Если вы создадите множествочанков на одном диске, то при обработке контрольной точки множество чистильщиковстраниц будет писать на один и тот же диск. Распределение чанков по разным дискампозволяет добиться распараллеливания операций записи при обработке контрольнойточки. Второе замечание касается различия в утилитах администрирования. Ниже япокажу, как использовать утилиту onspaces, графические программы администрированияи SQL API для выполнения одних и тех же операций. Важное различие в поведении этихутилит наблюдается при создании чанков для нового db-пространства или расширенияуже существующего. При создании чанка и указании его размера утилита onspaces выделяет точнозапрошенный вами объем дискового пространства в Кбайтах при указании флага –s. Тожеможет быть справедливо для SQL API , если вы указываете размер в килобайтах:execute function task (‘create dbspace’, ’demo_space’, ‘/opt/IBM/informix/devices/test/test_space’, ‘50000KB’,’0’);
    • Если для создания чанков и db-пространств используется SQL API, то размер создаваемыхобъектов можно указывать в мегабайтах, гигабайтах и терабайтах. Например,execute function task (‘create dbspace’, ’demo_space_2’, ‘/opt/IBM/informix/devices/test/test_space_2’, ‘50МB’,’0’);При использовании ОАТ размер можно указывать только в мегабайтах или группах по1024 КБайта.Каким бы методом вы не создавали объекты, вызов onstat –d показывает размер db-пространства в страницах размера PAGESIZE. В дальнейшем я буду называть db-пространства и BLOB-пространства общим термином db-пространство, хотя существуютразличия в методах работы со smart BLOB-пространствами и простыми BLOB-пространствами.Типы логических устройств хранения.Вероятно, самое большое изменение в последних версиях IDS – это интеграция объектно-ориентированных возможностей в ядро DSA. Эта разработка предоставила разработкамбаз данных и приложений новые возможности, которые отсутствуют в стандартныхреляционных серверах. Некоторые новые типы данных требуют специальных пространствхранения, поэтому давайте еще раз посмотрим на физическую и логическую архитектурухранения данных, которая представлена на рисунке 5.13 Рисунок 5.13. Физические (сплошные линии) и логические(пунктирные линии)структуры хранения данных
    • Базовая физическая единица хранения – страница данных (data page), которая имеетфиксированный размер, называемый размером страницы (page size), это минимальныйобъем данных чтения/записи диска. В зависимости от версии ОС размер страницысоставляет 2 или 4 Кбайт. Физическими единицами хранения являются BLOB-страница (blobpage) и страница дляхранения smart BLOB’ов (sbpage) . Sbpage похожа на страницу данных: она также имеетразмер 2-4 Кбайт. BLOB-страницы могут иметь разные размеры. При установке размераBLOB-страниц необходимо принимать во внимание ограничения производительности иособенности хранения BLOB. Например, на BLOB-странице может хранится только одинBLOB-объект, большинство ваших объектов имеют размер 6 Кбайт, поэтому если выопределите размер страницы в 10 Кбайт, то потеряете зря много дискового пространства.Каждое BLOB-пространство может иметь свой собственный размер страницы. Наборы страниц (простых или BLOB) называются чанками и являются минимальнымиадминистрируемыми единицами. Вы можете создать чанки на любом диске, физическиподключенном к серверу, на котором выполняется экземпляр IDS. если чанк создается насыром устройстве, страницы в чанке будут непрерывными, одна будет следовать задругой. Именно поэтому чанки на сырых устройствах более производительны. Присоздании чанков на ФС их страницы собраны логически с помощью механизмов файловойсистемы, а физически могут находится где угодно на файловой системе. Под громкимвыражением «администрирование чанка» подразумевается возможность удалить его изdb/BLOB-пространства или добавить к db/BLOB-пространству.Максимальный размер чанка составляет 4 Тбайт или максимальный размер файла илисырого пространства, которым может управлять ваша ОС. На данный момент Informixможет управлять БД размером 8 Петабайт.DB-пространство – это логическая единица хранения данных, состоит из одного илинескольких чанков. Поскольку чанки могут находится на разных дисках, db-пространствотакже может быть распределено среди нескольких дисков. Именно на этом уровне выбудете выполнять большинство административных задач: создавать базы данных,таблицы, индексы. Вы будете выполнять архивирование и восстановление db-пространств(мы пока не говорим о восстановлении таблиц с помощью archecker). Каждый экземпляримеет хотя бы одно db-пространство – корневое, но большинство имеет больше. DB-пространства бывают нескольких типов. Администраторы чаще всего сталкиваются собычными db-пространствами и временными пространствами. Стандартные db-пространства часто называют просто db-пространствами, они используются дляхранения баз данных, таблиц, индексов, физического журнала и логических журналов. Взависимости от режима журналирования БД или отдельной таблицы, операции в этихпространствах могут журналироваться либо нет. Вы можете журналировать большинствоdb-пространств, что поможет усилить защиту сервера от физического сбоя. Временные db-ghjcnhfycndf (DBSPACETEMP) похожи на обычные пространства тем, чтомогут содержать таблицы и индексы, однако эти объекты не могут существовать в базепостоянно. Чуть позже мы рассмотрим временные db-пространства подробнее.Также широко используются BLOB-пространства и пространства subspace. Ониприменяются для хранения больших двоичных объектов (BLOB). BLOB-пространствамогут хранить данные типа text и byte или простые типы данных BLOB, поэтому оничасто называются простымиBLOB-пространствами (simple blobspaces). Sbspacesиспользуются для хранения данных типа clob и blob( или типов данных smart blob),поэтому они называются smart blobspaces.
    • Архитектура sbspace отличается от архитектуры BLOB-пространства. Sbspaces имеют двеобласти хранения – «пользовательскую», где непосредственно размещены данные иобласть метаданных, которые используются сервером БД для управления объектамиэтого пространства. Такая архитектура позволяет использовать байтовую блокировкуобъектов clob и blob, что позволяет нескольким пользователям работать с одним объектомодновременно. Пространство метаданных недоступно для пользователей, и его объемдолжен учитываться при расчете размера sbspace. Позже мы рассмотрим, как указатьразмер метаданных и дополнительные места хранения метаданных в sbspace. Этавозможность очень важна, так как в пространстве может закончиться область дляхранения метаданных, но будет еще много места для хранения пользовательских данных. Каждый экземпляр имеет по крайней мере одно пространство sbspace(SYSSBSPACENAME) для хранения некоторой статистической информации. Если вы непланируете использовать smart BLOB’ы, то это пространство может быть небольшогоразмера – около 20 Мбайт. Однако некоторая функциональность экземпляра предполагаетналичие одного или нескольких сконфигурированных sbspaces – например EnterpriseReplication.Вы можете создать временные sbspaces (SBSPACETEMP). Они используются дляхранения временных данных типа clob и blob. Преимущество временных пространствsbspaces – отсутствие области метаданных , операции с этими пространствами нежурналируются.Внешние db-пространства (extspaces) – это расширение концепции db-пространств.DB-пространства целиком и полностью управляются IDS , а внешние db-пространстванаходятся не под управлением экземпляра, а просто регистрируются в нем. Внешниепространства могут хранить данные или индексы, но обычно эта информациясгенерирована не сервером Informix, а неким сторонним приложением, поэтомупрограммист должен написать метод доступа к этим данным. Для выполнения этойработы сервер Informix предоставляет интерфейс виртуальных таблиц (Virtual TableInterface - VTI) и виртуальных индексов (Virtual Index Interface - VII). В большинстве случаев внешние пространства используются различными DataBlade-амидля получения доступа к данным, сформированным внешними приложениями. Иногдатребования к хранению объекта не могут быть удовлетворены функционалом db-пространств IDS. хорошим примером может быть DataBlade текстового поиска (Basic TextSearch (BTS) DataBlade). Индексы BTS должны храниться в плоском файле, поэтому онисоздаются во внешнем пространстве и управляются через интерфейс VII. Теперь давайте рассмотрим процесс создания чанков иdb-пространств. Если выиспользуете сырые устройства, то у вас есть два метода работы с чанками и db-пространствами. Первый - создавать чанк или db-пространство как подмножествобольшого дискового раздела. В этом случае вы используете средства ОС для созданиябольшого по размеру раздела на диске. Второй подход – создавать отдельный раздел длякаждого чанка и db-пространства. Чуть ниже мы рассмотрим эти альтернативы. Если вы используете выделенное пространство, эти проблемы не должны васбеспокоить, поскольку для каждого db-пространства или чанка вы создаете отдельныйфайл. Хотя в этом случае не используются смещения на диске, но в утилите onspaces ихзначения необходимо все равно задавать равными 0 (ноль) .Временные пространства.Как я уже говорил, существует два типа db-пространств – обычные и временные.Обычные db-пространства содержат в себе таблицы баз данных и индексы. Этипространства могут зеркалироваться, журналироваться (если БД находится вжурналируемом режиме), архивироваться утилитами ontape или ON-Bar.
    • IDS использует временные db-пространства для создания временных таблиц привыполнении хэш-джойнов (hash joins), сортировки по индексу, операций упорядочения.Пользовательские приложения также могут использовать временные db-пространства длясоздания явных и неявных временных объектов. Эти таблицы и/или индексы существуюттолько во время выполнения SQL-запроса, а затем уничтожаются. Временные db-пространства определяются через параметр DBSPACETEMP файла$ONCONFIG. Они не зеркалируются не архивируются и инициализируются при каждомперезапуске сервера. Действия с временными db-пространствами не журналируютсясервером, это поведение не зависит от режима журналирования базы. Если вы создадите временные db-пространства, это не значит, что Informix будетсоздавать временные объекты в этих пространствах. По умолчанию IDS не используетвременное пространство. При создании временного объекта необходимо явно указать, чтоон создается во временном db-пространстве, в противном случае он может быть создан влюбом db-пространстве, в том числе и в корневом. Для создания нежурналируемой временной таблицы необходимо в выражение createtemp table добавить квалификатор with no logcreate temp table ex_ample(div_no integer, area_no smallint, tot_sales decimal(12,2)) with no logВ IDS 11 введен новый конфигурационный параметр TEMPTABLE_NOLOG, которыйпредписывает создавать все временные объекты во временных db-пространствах, дажеесли при создании такого объекта не указан соответствующий SQL-квалификатор. Этотпараметр особенно полезен при наличии разработчиков, которые не особенно беспокоятсяо корректном создании временных объектов. Если создано несколько временных db-пространств и при создании временного объекта не указывается , в каком. Временномпространстве его размещать, то для размещения будет использоваться алгоритм round-robin. Другой подход к максимизации использования временных db-пространств –использование переменной окружения $DBSPACETEMP для пользовательских сессий.Таким образом можно переопределить временные пространства, которые используютсяэтими сессиями. Этот подход полезен в том случае, если одно приложение активноиспользует временное db-пространство, тогда все остальные приложения можноперенаправить на использование других db-пространств, что повысит производительностьсервера.Смещения.Смещение – предопределенное расстояние от некоторой известной точки. Смещенияиспользуются для размещения нескольких чанков на одном сыром устройстве. На Рисунке5.14 приведена иллюстрация
    • Рисунок 5.14 Сырые чанки на сыром разделе со смещениямиНа рисунке чанк db-пространства dbspace_1 создан в самом начале сырого устройства(смещение 0). Чанк имеет размер 200 «единиц» (в этом примере единицы измерения неимеют значения). Затем на устройстве создается еще один чанк. Чтобы этот чанк непереписал уже существующий, администратор во время его создания указывает черезфлаг offset утилиты onspaces или SQL API смещение этого чанка 220 единиц. Такойподход разделяет два чанка буфером размером 20 единиц. Вам необязательно создаватьчанки именно в начале раздела, а затем спускаться к его концу. При создании чанка выможете указать смещение на свой выбор. Я рекомендую в целях безопасности оставлятьмежду двумя чанками свободное пространство размером несколько единиц.
    • Informix не проверяет корректность задания смещений и размеров чанков. Вы можете поошибке создать один чанк в начале второго, что приведет к ошибкам целостностиданных. Я настойчиво советую при создании нескольких чанков на сыром разделеаккуратно записывать начальное значение и размер чанка.В окружении, где процесс проектирования и реализации происходит «на лету», этопозволит уменьшить количество проблем, связанных с разбиением диска и изменениемразмера db-пространств. При необходимости вы сможете добавить к db-пространствунесколько чанков с разными смещениями. Другое преимущество использованиясмещений – улучшение контроля над месторасположением каждого чанка. С помощьюсмещения вы можете создавать чанк ближе к центру диска или дальше от него. С другой стороны, использование смещений усложняет мониторинг дисков. Длямониторинга активности чанков и db-пространств вы можете использовать утилиты IDS,но мониторинг средствами ОС становится практически бесполезным, поскольку этиутилиты работают на уровне разделов. Поскольку на одном жестком диске обычнонаходится один дисковый раздел, сложно отследить, какой чанк вносит самый большойвклад в операции ввода/вывода.РазделыДругой подход к работе с чанками и db-пространствами состоит в создании одного илинескольких разделов на диске и использовании каждого раздела для размещения одногочанка. Я предпочитаю именно этот подход, поскольку он упрощает мониторингвозможных проблемных мест средствами IDS и ОС.Конфигурирование размера страницы db-пространства.В IDS 9.4 была введена поддержка «больших чанков» и возможность создания оченьбольших пространств, а в IDS 10 -возможность создавать db-пространства с разнымразмером страницы (configurable page size - CPS). CPS предоставляет такие возможности:  индексные ключи большого размера. Необходимы для полной поддержки UNICODE  увеличение эффективности хранения и дискового ввода/вывода.Рассматривая первую возможность, важно помнить, что, в отличие от данных, которыемогут находится на разных страницах, индексы должны полностью помещаться на однустраницу. Из-за незнания этого ограничения некоторые пользователи получили ошибкипри создании или модификации индексов, когда размер индекса стал больше размерастраницы. У вас могут возникнуть вопросы, как может не хватить 2 Кбайтного индекса, нотакое вполне возможно, если у вас приложение с поддержкой двухбайтовых языков(UNICODE). Используя CPS, вы можете создавать индексы длиной до 3 Кбайт. Второе преимущество CPS – увеличение эффективности хранения и получения данных сдиска – касается и страниц данных, и страниц индексов. Как уже говорилось, Informixобрабатывает данные постранично. Это значит, что для получения 3 Кбайт данных,размещенных на двух страницах, необходимо произвести две операции чтения. Если высократите количество чтений, то это увеличит производительность дисковоговвода/вывода. Рассмотрим эффективность хранения. Перед началом я кратко расскажу онизкоуровневой работе IDS с диском. В зависимости от ОС, страница данных может бытьразмером 2 Кбайт или 4 КБайт. Не вся страница доступна для хранения данных илииндексов. Для обычных db-пространств 28 байт каждой страницы резервируются дляслужебных целей. Некоторое дополнительное пространство занимается каждой строкой,но это мы пока не будем учитывать.
    • IDS всегда пытается хранить данные так, чтобы минимизировать дисковый ввод/вывод.Если на одной странице можно сохранить несколько строк, то Informix так и поступит.Если еще одна строка не помещается на страницу, то она будет записана на новую строку,поэтому для ее получения потребуется одна дополнительная операция чтения. Если длинастроки превосходит размер страницы, например, длина строки составляет 3 Кбайт, аразмер страницы равен 2 Кбайт, то основная часть строки будет размещаться на однойстранице (называется домашняя страница или home page), а остаток страницы – на другойстроке (остаточная страница или remainder page). Если возможно, то остаточнаястраница хранит данные нескольких строк. Основная идея – минимизация количестваопераций ввода/вывода. Используя CPS, вы можете управлять размером страниц db-пространств, где хранятся ваши данные. Вы можете увеличить плотность хранения иминимизировать дисковый ввод/вывод. Давайте рассмотрим пример. Предположим, размер строки таблицы равен 1200 байт. НаIDS с размером страницы 2 Кбайт вы сможете использовать 2020 байт страницы (2048байт –28 байт служебных данных). Первая вставленная строка размещается на странице 1.вторая вставленная строка не помещается на первой странице, поэтому она сохраняется надругой странице. В результате примерно половина объема страницы остается незанятой.Теперь предположим, что мы выбрали размер страниц равным 6 Кбайт, это даст 6116 байтиспользуемого пространства на страницу. Результат значительно улучшится. Начиная с IDS 10, в утилите onspaces вы можете указать флаг –k для определенияразмера страницы db-пространства. Размер страницы должен быть кратен размерустраницы по умолчанию. Максимальный размер страницы 16 Кбайт. При использовании CPS необходимо помнить о некоторых ограничениях. Внезависимости от размера страницы на ней может быть расположено максимум 255 строк.Поэтому не создавайте таблицу, содержащую 4-байтовую строку в db-пространстве сразмером страницы 16 Кбайт. Системные db-пространства имеют размер страницы поумолчанию. Напомню, что это корневое db-пространство, db-пространства, гдеразмещены физический и логический журнал, а также БД sysadmin. При создании одногоили нескольких db-пространств с размером страницы не по умолчанию, для db-пространства с этим размером страницы создается буферный пул. Иллюстрацию смотритена Рис 5.17Рисунок 5.17. Отдельный буферный пул для db-пространств с разным размером страниц.Вопрос о создании пула памяти на основе параметров CPS относится только кстандартным db-пространствам, BLOB-пространства не рассматриваются.Если вы посмотрите в конец файла $ONCONFIG, то увидите новый синтаксисконфигурирования пулов буферов. Здесь располагается «значение по умолчанию»,которое используется как шаблон утилитой onspaces, если новый пул должен быть созданв процессе создания пространства с размером страницы не по умолчанию. Вы можете
    • отредактировать это значение, если хотите, чтобы все последующие пулы использовалиэто значение. В файле также находится запись для размера страницы по умолчанию,которая используется корневым db-пространством. Давайте рассмотрим, как это работает на практике. Предположим, что вы разворачиваетеэкземпляр Informix и хотите создать первое db-пространство, используя CPS. Если высоздадите db-пространство с помощью команды onspaces, SQL API или какого-тографического инструмента, то команда создания db-пространства заодно создастбуферный пул с параметрами по умолчанию. Если эти параметры вам не подходят, тонеобходимо остановить экземпляр, изменить значения в файле $ONCONFIG для этогопула и перезапустить экземпляр. В качестве альтернативы вы можете создать сначалабуферный пул с желаемыми параметрами. Созданное потом пространство будетиспользовать соответствующий пул такого же размера. Создать буфер можно с помощьюутилиты onparams или SQL API:onparams –b –g page_size –n num_buffs – r num_lrus -x lru_max_dirty –m lru_min_dirtyexecute function admin (‘add bufferpool’, ‘pg_size’, ‘num_buffs’, ‘num_lrus’,’lru_max_dirty’, ’lru_min_dirty);Есть еще одно преимущество использования CPS. Предположим, что у васвысококонкуррентное окружение, где обрабатываются большие объемы данных из разныхтаблиц, и эти таблицы должны находится в памяти. Вы можете создать эти таблицы в db-пространствах с разным размером страницы. В результате данные разных таблиц будуткэшироваться в разных буферных пулах, тем самым повышая возможность экземпляраоперировать с этими данными в памяти и снижая уровень замусоривания пула и уменьшаянеобходимость чтения с диска данных, которые вытолкнуты из кэша. Такой подходулучшит производительность сервера.Соглашения о наименованиях в Informix под WindowsЭтот раздел касается только Informix под Microsoft Windows. Пользователям других ОСего можно пропустить. При развертывании Informix под Windows при именовании чанковнеобходимо придерживаться соглашения об именовании. Informix под Windows неиспользует символические ссылки при определении пути к устройствам экземпляра.Сервер предполагает наличие на дисках подкаталогов корневого db-пространства,начального db-пространства и их зеркальных копий (если используется зеркалирование)(The data server expects to see a needed set of subdirectories created on the drives supporting therootdbs, the initial dbspace, and their mirror if IDS mirroring is used). Из-за наличия реестраWindows нет возможности указать, где создается корневое db-пространство экземпляра.Этот путь жестко закодирован в сервер. Структура каталогов также зашита в сервер. Еслипри инсталляции сервера вы выбрали создание демонстрационного экземпляра, чанкиэтого экземпляра будут созданы в соответствии с этим путем по умолчанию. Путь такой:%ROOTPATH%IFMXDATAinstance_name, где instance_name – имя экземпляра. Спомощью onspaces и графических утилит вы можете выбрать другой путь, норекомендуется не изменять структуру каталогов. Имена файлов в каталоге состоят из трех частей (смотрите Таблицу 5.3)
    • Таблица 5.3. Соглашение об именовании файлов в Informix под Windows Часть имени файла Описание Имя пространства Имя db-пространства, которому принадлежит данный чанк. Максимальная длина этой части имени составляет 18 символов, в имени могут использоваться цифры и буквы, первый символ не должен быть числом или специальным символом. Тип пространства Мнимое расширение, определяющее, к какому типу пространства относится этот файл. Возможные значения – dat для первичного чанка, mirr – для зеркального чанка. Номер чанка Трехсимвольный номер для указания номера чанка/файла в именованном пространстве. Начальный чанк пространства нумеруется 000 (три нуля), последующие чанки имеют номера 001, 002 и т.дВ имени файла имя пространства и тип пространства разделяются с помощью символанижнего подчеркивания ( _ ), а номер чанка записывается после точки. В результате вкаталоге C:IFMXDATAsarthe, который содержит экземпляр sarthe на моемкомпьютере, будут находится такие файлы:rootdbs_dat.000sarthe_1_dat.000somebiglongnamefor_dat.000sarthe_2_mirr.000sarthe_3_dat.001В этом примере у меня есть первичные чанки для db-пространств (rootdbs, sarthe_1,somebiglongnamefor), зеркальный чанк (sarthe_2) и дополнительный чанк, добавленный вdb-пространство sarthe_3, начальный чанк этого db-пространства располагается на другомдиске.Создание пространств.При создании экземпляра вы создаете начальное db-пространство, которое обычноназывается rootdbs. Это db-пространство создается, если вы корректно установили такиепараметры файла $ONCONFIG: ROOTNAME, ROOTSIZE, ROOTOFFSET,ROOTPATH, MIRRORPATH (если используется). После того, как экземпляр запущен иработает, необходимо добавить нужные db-пространства. Сделать это можно используяутилиту onspaces, OAT, Server Studio, SQL API. Создание db-пространства после инициализации экземпляра не сильно отличается отсоздания корневого db-пространства.Как говорилось в Части 2 в версиях IDS для Linux, Mac OS X, UNIX необходимоиспользовать не реальные имена устройств, а символические ссылки. Дальше в тексте яполагаю, что вы делаете именно так.Для создания db-пространства из командной строки используется утилита onspaces. Нижеприведены ее самые популярные флаги
    •  -c - обозначает, что это создание объекта  -d - имя db-пространства  -p путь_к_устройству – путь к символической ссылке, указывающей на дисковый раздел  -o значение_смещения – смещение (если необходимо) на дисковом разделе. Если смещение не нужно, указывается значение 0 (ноль)  -s размер – размер db-пространства в килобайтах.  -k размер_страницы – опционально. Определяет размер страницы db- пространства в килобайтах. Кратное размеру страницы по умолчанию. Если не указано, то db-пространство создается с размером страницы по умолчанию.  -t - указывает на то, что создается временное db-пространствоЕсли db-пространство зеркалируется, необходимо указать следующий флаг:  -m путь_к_устройству смещение – путь к символической ссылке, указывающей на зеркальный дисковый раздел и значение смещения (если необходимо). Если смещения нет, то указывается значение 0 (ноль).Например, создадим 100 Мбайтное зеркалируемое db-пространство index_1onspaces –c –d index_1 -p /opt/IBM/informix/devices/amazon/ama_chnk_1 –o 0 –s 100000 -m /opt/IBM/informix/devices/amazon/ama_chnk_12 0Вышеприведенная команда должна быть записана в одну строку. Символ «»,обозначающий продолжение ввода, будет изредка встречаться и дальше в книге.Если вы не хотите зеркалировать db-пространство, то при вводе предыдущей командыопустите эту часть: -m /opt/IBM/informix/devices/amazon/ama_chnk_12 0. Для создания временного db-пространства work_space_1 размером 150 Мбайт исмещением 200 Мбайт выполните команду:onspaces –c –d work_space_1 -p /opt/IBM/informix/devices/amazon/ama_chnk_20 -s 150000 –o 200000 –tСоздадим db-пространство archive_space размером 1 Гбайт с размером страницы 12Кбайт:onspaces –c –d archive_space -p /opt/IBM/informix/devices/amazon/ama_chnk_2y -s 1000000 –o 0 –k 12вы можете выполнять эти операции и с помощью SQL API IDS 11. Как вы видели ранее,можно использовать взаимозаменяемые функции task() и admin(). Они выполняютодинаковые действия, поэтому в примерах мы используем одну из них. Прииспользовании SQL API обязательно проверяйте, что вы задали параметры команды вправильном порядке. Этот порядок определяется утилитой, функционал которойиспользуется. Например, при создании db-пространства его размер должен быть указанперед значением смещения. В противном случае вы создадите db-пространство размером0 Мбайт и смещением 200 Гбайт на сыром разделе.
    • Например, создадим временное db-пространство work_space_1 размером 150 Мбайт, сосмещением 200 Мбайтexecute function task (‘create tempdbspace’, ‘work_space_1’, ‘opt/IBM/informix/devices/amazon/ama_chnk_20’, ‘150mb’,’200mb’)По этой записи необходимо сделать несколько замечание. Синтаксис создания временногоdb-пространства отличается от синтаксиса создания обычного db-пространства.В Informix 11.5 введен дополнительный синтаксис создания db-пространств с помощьюSQL API. Ключевое слово with_check используется для проверки существованияфизического устройства, путь к которому указывается при создании db-пространства.Для создания BLOB-пространств, простых или smart-, применяются свои флаги и единицыизмерения. Поэтому переходим к этому вопросу.Простые BLOB-пространстваДля создания простого BLOB-пространства необходимо из утилиты onspaces исключитьфлаг –d имя_db_пространства и использовать следующие дополнительные флаги  -b имя_blob – определяет имя BLOB-пространства  -g размер_страницы – размер страницы BLOB-пространства в страницах, а не килобайтахНапример, создадим незеркалируемое BLOB-пространство размером 1 Гбайт, размерстраницы пространства положим равным трем страницам.onspaces –c –b blob_world -p /opt/IBM/informix/devices/amazon/ama_chnk_3 -s 1000000 –o 0 –g 3На SQL API это будет выглядеть так:execute function task (‘create with_check blobspace’, ‘blob_world’, ‘opt/IBM/informix/devices/amazon/ ama_chnk_3’, ‘1gb’,’0’,’3’);Нельзя создать «временные» простые BLOB-пространства. Но простые BLOB-пространства можно зеркалировать. Простые BLOB-пространства работают почти так же,как и обычные BLOB-пространства, но есть и некоторые отличия. В отличие от обычногоdb-пространства, которое доступно для использования сразу после создания (и длязеркалирования, если оно проводится на уровне экземпляра), то в случае BLOB-пространства записи о его создании и активации должны располагаться в двух отдельныхлогических журналах. Это означает, что необходимо будет переключить журналы спомощью команды onmode –l (строчная буква L), а потом нужно выполнить обработкуконтрольной точки командой onmode –c. Обычное db-пространство может быть создано с размером страницы, который являетсякратным размеру страницы по умолчанию. В случае BLOB-пространство, при егосоздании необходимо явно указать размер страницы. Минимальный размер страницы
    • равен 1 (единица). Один BLOB-объект может занимать несколько BLOB-страниц, но наBLOB-странице может быть только один BLOB-объект, поэтому выбирать размер BLOB-страницы следует внимательно, не надо делать ее слишком большой или слишкоммаленькой. Оптимально если размер BLOB-страницы максимально близок к среднемуразмеру BLOB-объекта. Я понимаю, что термин «средний размер» может ввести взаблуждение. Средний размер можно вычислить двумя способами. Первый –просуммировать размеры BLOBов и разделить на их количество. Но в этом случае плохоучитываются BLOB’ы больших размеров. It is more appropriate to look at the average BLOBto be stored in terms of volume and size and calculate the BLOBpage size form that. (не совсемясно, в чем принципиальное отличие). Если размеры BLOB-объектов в таблицах сильно отличаются друг от друга, тоцелесообразно создать несколько BLOB-пространств с разным размером страницы.Эффективность хранения BLOB-страниц в BLOB-пространствах можно получить, вызвавкоманду onstat –pB.Smart BLOB-пространстваЭти пространства имеют свой собственный набор флагов для создания и управления. Присоздании пространства указывается флаг –S . большинство флагов утилиты onspacesприменимы к этим пространствам, включая флаги пути, смещения, размера,зеркалирования. Поскольку объекты в sb-пространстве могут иметь разныехарактеристики и разрешать одновременный доступ к ним нескольких пользователей, тодля поддержки этого функционала были введены дополнительные флаги. Первые два флага –Ms значение_размера и –Mo значение_смещения управляютразмером области метаданных в sb-пространстве и смещением, по которому создаетсяобласть метаданных. Если не указать один из этих параметров, то IDS создаст областьметаданных в середине sb-пространства. При вычислении размера области метаданныхсервер на основе размера всего sb-пространства попробует «угадать», сколько smartBLOB-ов может храниться в таком объеме пространства. Если сервер ошибется, и вамбудет не хватать места для хранения метаданных, вы сможете добавить к пространствучанк, в котором будут храниться только метаданные пространства (более подробносмотрите следующий раздел). Если вы знаете ожидаемый объем BLOB-ов, которые будутхраниться в этом пространстве, то можете попробовать помочь серверу вычислитьправильный размер области метаданных. Ниже мы обсудим необходимые параметры. Дополнительные параметры, позволяющие контролировать функциональность sb-пространства, указываются после флага –Df. Параметры указываются в строке,ограниченной двойными кавычками, каждый параметр отделяется от предыдущегозапятой, пробелы между параметрами не допускаются. Строка является регистро-чуствительной, поэтому будьте аккуратны. В таблице 5.4 приведены часто используемыепараметры. Если не сказано обратное, то размер указывается в килобайтах.
    • Таблица 5.4 Дополнительные параметры контроля функционирования sb-пространствФлаг ОписаниеACCESSTIME Отслеживает ли экземпляр время доступа к smart BLOB-у. Возможные значения OFF (по умолчанию) или ONAVG_LO_SIZE Ожидаемый средний размер BLOB-а sb-пространства. Если флаг установлен, сервер будет использовать это значение при вычислении размера области метаданных. Если не используется, желательно установить значение параметра меньше, чем размер страницы по умолчанию. Максимальное значение 232 КБайтBUFFERING Определяет, как буферизируются smart BLOB-ы. Если включено (ON по умолчанию), используется память из буферного пула резидентной памяти. Если OFF, используется память из виртуальной части разделяемой памяти экземпляра.LOCK_MODE Определяет режим блокировки объекта. Если установлено значение BLOB (по умолчанию), первый пользователь блокирует весь объект (как и в случае с простыми BLOB’ами). Если установлено RANGE, пользователь блокирует только ту часть объекта, с которой работает. Для поддержки блокировки RANGE должен быть установлен параметр BUFFERING ON.LOGGING Определяет, журналируются ли изменения smart BLOB’ов. По умолчанию не журналируются (OFF).MIN_EXT_SIZE Specifies the minimum amount of storage for each smart BLOB. Если не используется, лучше установить значение меньше, чем размер страницы по умолчанию. Максимальное значение параметра 2 32 КБайтВ следующем примере создается sb-пространство размером 500 Мбайт с такимипараметрами, как режим блокировки= RANGE, журналирование изменений, буферизацияобъектов в резидентной памятиonspaces –c –S pics_sbspace -p /opt/IBM/informix/devices/tagus/sbspace_3 -s 500000 –o 0 -Df “AVG_LO_SIZE=2,LOGGING=ON, LOCK_MODE=RANGE,BUFFERING=ON”Параметр LOGGING определяет, проводится ли журналирование изменений BLOB-объектов. Изменения в области метаданных журналируются всегда.Добавление дискового чанка.Расширение пространства путем добавления чанка немного отличается от создания этогопространства. Если вы создали зеркалируемое средствами Informix пространство, тодополнительные чанки, добавляемые к тому пространству, также должнызеркалироваться. В этом случае вы должны добавить к пространству зеркалируемый чанк,а затем, при необходимости, можете отменить зеркалирование. Чтобы добавить чанк к пространству, используйте утилиту onspaces со следующимифлагами:
    •  -a db_пространство – имя пространства  --p путь_к_устройству –полный путь символической ссылки, указывающей на дисковый чанк  -o значение_смещения – значение смещения. Если не нужно, указать 0 (ноль)  -s размер_чанка – размер чанка в килобайтах.Если используется зеркалирование чанка средствами Informix, укажите следующий флагутилиты onspaces  -m путь смещение – полный путь символической ссылки, указывающей на зеркальный чанк и значение смещения в Кбайт. Если смещения нет, указать 0 (ноль)при добавлении чанка в db-пространство под Windows не забывайте правильно указатьномер чанка в имени файла (см Таблицу 5.3). Например, добавим чанк размером 1 Гбайт кBLOB-пространству my_blobs, используя SQL APIexecute function task (“add chunk”, “my_blobs”, “f:f_sarthe_disks/myblobs_dat.001”,”1000MB”,”0”);Обратите внимание, что при добавлении чанков не используется опция with_check. Придобавлении чанка в sb-пространство, можно указать, будут ли в этом чанке хранитьсятолько метаданные, или будут и данные, и метаданные. Эта возможность особеннополезна, если ваши расчеты по размеру метаданных оказались ошибочными. Управлятьдобавлением чанка к sb-пространству можно с помощью двух дополнительных флаговутилиты onspaces.  -Ms размер – какой объем дискового пространства в чанке предназначен для хранения метаданных  -Mo значение_смещения – смещение(в килобайтах) области метаданных в чанке.Я не нашел документированного API добавления чанка в sb-пространство и управленияразмещением метаданных.Удаление чанка.В большинстве случаев удаление чанка возможно в том момент, когда пространствонаходится в он-лайн. Исключением являются простые BLOB-пространства. Удалениечанка из простого BLOB-пространства требует, чтобы экземпляр находился в статическомрежиме. Перед удалением необходимо убедиться, что чанк пустой. Для этого изкомандной строки запустите oncheck –pe, направьте вывод в файл и проанализируйте этотфайл. Каждый чанк db-пространства будет показан отдельно с указанием табличных илииндексных экстентов, которые находятся в этом чанке. Если в чанке, которыйпланируется удалить, находятся экстенты таблиц или индексов, то попробуйте удалитьэти экстенты или перенести их в другой чанк. Вы можете выгрузить таблицы, удалить ихи создать заново в другом db-пространстве. Изменение схемы распределения данных поdb-пространствам вызывает перестройку затронутых этим процессом разделов. Смотритев Части 6 тему «Изменение разделов». Если чанк пуст, то для его удаления можно вызвать утилиту onspaces со следующимифлагами:
    •  -d имя_пространства имя db-пространства, из которого удаляется чанк  -p путь_к_устройству – полный путь к символической ссылке, указывающей на удаляемый чанк  -o значение_смещения – значение смещения в файле (в килобайтах). Если смещения нет, то указать 0 (ноль)  -y - утвердительный ответ на вопрос подтверждения действия.Можно также использовать функции SQL API с этими параметрами.Если чанк не пустой, то процесс его удаления будет отменен и будет выведеносообщение об ошибке. Такой поведение может быть проблемой в том случае, когдаобласть метаданных дополнительного чанка sb-пространства используется для храненияданных о пользовательских объектах, размещенных в других чанках. В этом случае вамне удастся удалить отдельный чанк – необходимо удалять все sb-пространство. Если вдополнительном чанке хранятся только пользовательские данные, то чанк может бытьудален даже в том случае, когда он не пустой. Выполнение этой операции требуетуказания флага –f в утилите onspaces. Я настоятельно рекомендую последобавления/удаления чанка выполнять полное архивирование экземпляра. Начальный чанк db-пространства не может быть удален. Даже в том случае, когда в db-пространстве есть еще чанки. Для удаления начального чанка необходимо удалить всеdb-пространство.Удаление пространства.Вы не можете удалить пространство, если оно содержит табличные или индексныеэкстенты. Для проверки того, какие экстенты размещены в пространстве используйтеутилиту oncheck –pe, как описано в предыдущем разделе.Sb-пространство можно удалить даже если в нем содержатся пользовательскиеданные. Для этого используйте в нижеописанной командной строке флаг –fУдаление db-пространства утилитой onspaces требует передачи ей двух параметров.  -d имя_пространства - имя удаляемого db-пространства  -y – подтверждение удаленияSQL API требует только параметра drop dbspace и имени этого db-пространства. Еслиdb-пространство не свободно, его удаление не произойдет, и будет выведено сообщениеоб ошибке. Удалять пространства можно и с помощью ОАТ. Если вы удалили пространство, созданное с использованием выделенных файлов,файлы не будут удалены автоматически – их нужно удалять руками.Добавление и удаление зеркалирования.Если при создании экземпляра зеркалирование средствами Informix не было включено,то вы можете включить его в любое время редактированием файла $ONCONFIG.Зеркалированием управляет конфигурационный параметр MIRROR. Если установленоMIRROR=1, то зеркалирование включено, иначе – отключено. К сожалению, изменениеэтого параметра требует перезапуска экземпляра. Для настройки зеркалирования db-пространства средствами Informix можноиспользовать утилиту onspaces или SQL API. Применяются такие флаги:  -m имя_пространства – определяет имя db-пространства  -p путь_к_устройству – полный путь к символической ссылке, указывающей на чанк, который необходимо зеркалировать
    •  -o смещение_первичного_чанка – смещение (в килобайтах) зеркалируемого чанка. Если не используется – указать 0 (ноль)  -m путь_к_зеркалу смещение_зеркального_чанка – полный путь к символической ссылке, указывающей на зеркальный чанк и смещение в килобайтах. Если смещение не используется, указать 0 (ноль).  -y – подтверждение включения зеркалированияНапример, выполним зеркалирование средствами Informixdb-пространства dbs_1:onspaces –m dbs_1 -p /opt/IBM/informix/devices/tagus/dbs_1 –o 0 -m /opt/IBM/informix/devices/tagus/dbs_1_mirror 0 –yУдаление зеркалирования – тоже простая операция. Можно отключить толькозеркалирования всего пространства. Выключение зеркалирования подразумеваетиспользование следующих флагов утилиты onspaces:  -r имя_пространства -имя пространства, зеркалирование которого удаляется  -y -подтверждение удаленияУдалить зеркалирование можно средствами SQL API, используя параметр stopmirroring и имя db-пространства. Удаление зеркалирования не означает удаленияфайлов или дисковых разделов, на которых хранились зеркальные копии, а такжесимволических ссылок на эти разделы и файлы – все эти объекты просто больше неиспользуются экземпляром, а удалять их необходимо вручную.Изменение статуса чанка.Когда активно зеркалирование пространства средствами Informix и чанкисконфигурированы в зеркальные пары, вы можете отключить/включить один из чанковэтой зеркальной пары, второй член этой пары будет полностью работоспособен. Одна изпричин , по котором иногда такое приходится делать, - физические переместить диски,на которые указывают символические ссылки, без необходимости экспортировать,удалять и пересоздавать таблицы. Этот процесс включает в себя остановкузеркалирования, изменение дискового раздела, на который указывает символическаяссылка, а затем включение зеркалирования. При переводе отключенного чанка в он-лайнInformix делает на него побитовую копию данных чанка, который был активным в этовремя. Этот процесс не отличается от того, который происходит, когда зеркалированиевключается. К сожалению, изменить статус чанка через ОАТ невозможно, поэтомунеобходимо использовать консольные утилиты или SQL API. При использованииутилиты onspaces флаг –D отключает чанк, а флаг –О (заглавная буква О) переводитчанк в он-лайн. Полный синтаксис изменения статуса чанка такой:  -s имя_пространства – определяет имя db-пространства  -p путь_к_устройству – полный путь к символической ссылке, указывающей на чанк, который переводится в оффлайн или он-лайн.  -o значение_смещения – значение смещения в килобайтах. Если нет, указать 0 (ноль)  -D или –О – определяет действие, совершаемое над чанком: D-отключить (down), O-включить (online)  -y – утвердительный ответ
    • Например, отключим первичный чанк db-пространства danube_1onspaces –s danube_1 -p /opt/IBM/informix/devices/Danube/dan_1 –o 0 –D –yКогда чанк переводится в оффлайн, это событие журналируется в файле MSGPATH и вОАТ регистрируется предупреждение. Статус чанка также можно увидеть с помощьюкоманды onstat –d.Установка и изменение параметра DATASKIPЭтот параметр определяет поведение экземпляра при обработке запросов, которыетребуют получения данных из пространств, которые недоступны в результате дисковогосбоя или по какой-то другой причине. Если значение параметра равно OFF, то запросзавершается ошибкой. Если значение параметра равно ON, неважно для всех db-пространств (ALL) или для некоторого их списка, и запросу необходимо получитьданные из отключенных db-пространств, то запрос завершится получением тех данных,которые он может получить, но клиентскому приложению вернется сообщение обошибке. Изменить значение параметра DATASKIP можно путем редактирования файла$ONCONFIG, с помощью утилиты onspaces или через SQL API. Приложение в своейсессии может переопределить значение параметра путем вызова SQL-команды setdataskip. Чтобы изменить значение параметра DATASKIP с помощью утилиты onspacesнеобходимо вызвать эту утилиту с флагом –f и передать в нее один или два параметра  -f OFF или ON [ALL | список_имен_пространств]  -y - утвердительный ответ на запрос подтвержденияИспользование только ключевого слова ON или OFF подразумевает, что оно повлияетна все пространства экземпляра, что делает ключевое слово ALL избыточным. Еслинеобходимо установить параметр DATASKIP для определенных пространств, то ихсписок через запятую необходимо указать после слов ON/OFF . Значение DATASKIP, установленное с помощью onspaces, действительно во времяработы экземпляра. При перезапуске экземпляра восстанавливается значение этогопараметра, указанное в файле $ONCONFIG. Чтобы необходимое значение DATASKIP сохранялось после перезапуска экземпляра,необходимо отредактировать файл $ONCONFIG, установив для этого параметражелаемое значение. В файле также поддерживается указание ключевых слов ALL исписка необходимых пространств.Создание, перемещение и изменение размеров журналов.Одна из первых задач, которые должны быть решены после инициализации экземпляра,который будет управлять журналируемыми базами данных, это создание одного илинескольких db-пространств для хранения физического журнала и логических журналов,вынесение журналов из корневого db-пространства и создание новых логическихжурналов. Вынесение журналов из корневого db-пространства уменьшает дисковыйввод/вывод по устройству. Если все БД экземпляра будут нежурналируемыми, тонеобходимости перенесения журналов в другое db-пространство нет, кроме, возможно,желания очистить место в корневом db-пространстве. Для нежурналируемых БД записьв журналы практически не производятся. Если экземпляр содержит журналируемые базы данных, вы должны побеспокоится околичестве и размере логических журналов. К счастью, сейчас управление журналами
    • упростилось. Вы можете сконфигурировать экземпляр на автоматическое добавлениежурналов при необходимости. Рекомендуется размещать физический журнал и логические журналы в отдельных db-пространствах. Дисковый ввод/вывод логических журналов может быть оченьбольшим, поэтому желательно размещать чанки пространства, в котором находятсялогические журналы, на быстрых устройствах. При желании вы можете разместитьлогические журналы в нескольких db-пространствах, но требования так делать нет.Важно помнить, что любое db-пространство, в котором находятся журналы, становитсяс точки зрения сервера БД, критическим. Не забудьте о зеркалировании этогопространства средствами Informix или RAIDФизический журналВ IDS 11 администрирование физического журнала значительно улучшено. Впредыдущих версиях IDS для перемещения или изменения размера физическогожурнала было необходимо, чтобы экземпляр находился в статическом режиме. В IDS 11вы можете изменять размер и размещение журнала без прерывания операцийэкземпляра. однако необходимо выполнить некоторые условия. Во-первых, выполнять эти операции можно только через onparams, onmonitor ипотенциально через ОАТ, Server Studio и SQL API. Раньше администраторы занимались«читерством» - переводили экземпляр в офф-лайн, модифицировали параметрыфизического журнала в файле $ONCONFIG, а затем перезапускали экземпляр. Если вытак поступите сейчас, то подвергнете экземпляр большой опасности: есть вероятность,что он вообще не запустится. Во-вторых , изменение физического журнала – это не in-place операция. Ниже мыувидим, что некоторые DDL-операции касаются только отдельных строк таблицы (in-place table alters), а другие DDL-операции касаются всей таблицы. Во втором случаеисходная таблица существует до тех пор, пока не будет создана ее полная копия и этакопия не будет загружена с новыми определениями. Когда новая копия активируется,старая удаляется. В результате вам необходимо место для хранения и оригинала, иновой копии. Эти рассуждения касаются и администрирования физического журнала.Если вы изменяете режим журнала, но оставляете его в том же db-пространстве, то вамнужно иметь достаточно места для нового и старого журнала. В противном случаеоперация завершится ошибкой.Третье, после операций администрирования физического журнала необходимо создатьполный архив экземпляра.Для изменения размера или месторасположения физического журнала используетсяутилита onparams со следующими флагами:  -p –s размер_в_килобайтах – определяет новый размер журнала в килобайтах или текущий размер журнала, если вы не меняете размер  -d имя_db_пространства – название db-пространства, в котором будет храниться физический журнал  -y – ответ на запрос подтвержденияРазмер физического журнала важен по нескольким причинам. Во-первых, призаполнении журнала на 75% экземпляр инициирует обработку контрольной точки (fullcheckpoint). Во-вторых, начиная с IDS 11 в физическом журнале хранится большеданных в течении большего промежутка времени. Благодаря новому неблокирующемуалгоритму обработки контрольной точки теперь экземпляр во время контрольной точкине прерывает операции. Разработчики IDS рекомендуют устанавливать размерфизического журнала равным 110 процентов размера буферов памяти экземпляра (110percent of the instance memory buffer pool). При необходимости вы можете пересмотреть
    • эту рекомендацию, приняв во внимание особенности вашей системы, нагрузку на нее.Это та область, где справедливо выражение «если этого достаточно, то больше - лучше». Вы можете мониторить физический журнал и его буферы командами onstat –l(строчная буква l) и oncheck –pr. С помощью этих команд вы можете увидеть, какойпроцент журнала используется во время обработки контрольной точки. Подробнуюинформацию о последних чекпоинтах можно получить с помощью командыonstat –g ckp.Логические журналы.Логические журналы администрировать проще, чем физический. В старых версиях IDSдля добавления нового журнала было необходимо переводить экземпляр в статическийрежим, и новый журнал добавлялся в конец цепочки журналов. Эти ограничения былиубраны в ранних выпусках IDS 9. сейчас вы можете администрировать логическиежурналы когда экземпляр находится он-лайн и обрабатывает запросы пользователей. Новые логические журналы могут быть вставлены в текущую позицию цепочкижурналов или в ее конец. Логические журналы могут иметь разный размер. Вы можетесконфигурировать автоматическое добавление журналов, что очень полезно, еслиэкземпляру не хватает логических журналов из-за больших транзакций или транзакции,которая не была своевременно закрыта и остается открытой в нескольких журналах. Этавозможность не отменяет отката длинной транзакции, но дает экземпляру больше местана эту операцию. Также, начиная с IDS 9, логический журнал можно использовать сразупосле его добавления. Для активации логического журнала нет необходимостивыполнять полное архивирование экземпляра. Неизменным остается одно – в экземпляре не может быть меньше трех логическихжурналов. Результатом этого является двухступенчатый процесс перемещениялогических журналов – сначала создаются новые журналы (возможно, в новом db-пространстве(ах) ), а затем удаляются старые. Администрировать логические журналыможно с помощью onparams, GUI-программ или SQL API. Для добавления логическихжурналов используются следующие флаги:  -a –d имя_db_пространства – имя db-пространства, где будет находиться логический журнал  -s размер_журнала в килобайтах. Новый размер логического журнала. Требуется в том случае, когда новый журнал будет больше или меньше, ечм значение по умолчанию для экземпляра.  -i(опционально). Определяет, что новый журнал будет вставлен сразу после текущего, а не в конец цепочки журналов.Если вы не укажете размер нового журнала (флаг -s), то будет создан журнал размеромLOGSIZE (параметр файла $ONCONFIG). Этот параметр определяет размерлогического журнала по умолчанию и в версии IDS 11.5 равен 10 Мбайт. В предыдущихверсиях размер журнала по умолчанию различался. Размер журнала зависит отколичества пользователей и характера их работы. Если одна или несколько таблиц содержат простые BLOB-объекты (типа TEXT илиBINARY), журнал маленького размера практически не имеет смысла. Процесс записи впростое BLOB-поле обходит некоторые механизмы экземпляра и проводитсянепосредственно в логический журнал. Операция «insert» для BLOB-а не считаетсяподтвержденной до тех пор, пока весь BLOB не записан в логические журналы.Удаление BLOB-объекта считается неподтвержденным до тех пор, пока журнал, вкотором зарегистрирована эта транзакция, не архивирован на диск. В зависимости отколичества и размеров BLOB-ов в логичесике журналы может записываться очень
    • большое количество информации. Как результат, вы должны создать журналыдостаточно большого объема, чтобы они не заполнялись практически сразу.Как говорилось выше, журналирование smart BLOB-ов определяетсяконфигурационным параметром LOGGING, используемом при создании или измененииsb-пространства. Из экземпляра могут быть удалены только те логические журналы, в которые в данныймомент времени не записываются транзакции и в которых не содержится информация опоследней контрольной точке. Удаление логического журнала подразумеваетиспользование его физического номера, а не logical ID. Каждый журнал имеет свойнеизменяемый физический номер, а также логический номер, присваиваемый ему в тотмомент, когда он становится «текущим» журналом экземпляра. Когда этот журналзаполняется, сервер БД инкрементирует логический номер этого журнала. Дляопределения физического номера каждого журнала , текущего журнала экземпляра ижурнала, содержащего последнюю контрольную точку, используется команда onstat –l(строчная буква l). Для удаления логического журнала используется утилита onparams со следующимифлагами:  -d –l физический_номер_журнала – определяет физический номер удаляемого логического журнала  -y – подтверждение удаления.Как и в случае физического журнала, я настойчиво рекомендую послеадминистрирования логических журналов создавать полный архив экземпляра.Также необходимо обратить внимание на количество журналов и размер журнала. Еслиразмеры журналов очень маленькие, то журналы будут быстро заполняться. Маленькийжурнал архивируется быстрее, однако при маленьком журнале гораздо легче получитьошибку длинной транзакции. Параметры LTXHWM, LTXEHWM определяют, какойпроцент логических журналов может быть заполнен перед началом отката открытойтранзакции или перед остановкой других операций экземпляра для подтверждениятакой транзакции или завершения ее отката. С другой стороны большие журналы медленнее заполняются. В результате они неархивируются на протяжении некоторого времени. В случае отказа оборудования выбудете разворачиваться из архива экземпляра и архива логических журналов. Если у васв течении дня заполнялся один журнал, то возможности восстановления будутограничены, особенно если этот журнал находился на сбойном диске. Можно подобратьразмеры журналов так, чтобы они архивировались каждые 30-45 минут при среднейактивности экземпляра. В Части 7 мы рассмотрим автоматическое архивированиезаполненных логических журналов.Автоматический запуск и остановка IDSЕсли вы такой же ленивец, как и я, то первое, о чем подумаете, это автоматизацияостановки и запуска экземпляров. На Linux/Unix/Mac OS X я используя для решенияэтой задачи стартовые скрипты системы. На Linux/Unix серверах в каталогах rc2.d и rc0.d я размещаю скрипты start_ids(Листинг 5.1) и stop_ids (Листинг 5.2) для автоматического запуска и остановкиэкземпляра во время остановки или перезагрузки сервера. Обычно эти каталогинаходятся в каталоге /etc, но в некоторых версиях Linux/Unix они расположены в /sbin.
    • ##start_ids## скрипт для запуска экземпляров IDS во время загрузки сервера##Положить в каталог rc2.d и назначить правильный номер## автор Carlton Doeexport INFORMIXDIR= ##подставить путь к двоичным файлам IDSexport PATH=$INFORMIXDIR/bin:$PATHecho “About to start IDS instances”echo “Starting instance_name” # заменить instance_name именем экземпляраexport ONCONFIG= ##конфигурационный файл экземпляраexport INFORMIXSERVER= ##DBSERVERNAMEoninit##повторить четыре предыдущие строки для всех экземпляров IDS## при необходимости, если используются разные версии IDS## изменить переменную окружения $INFORMIXDIR Листинг 5.1 Скрипт start_ids##stop_ids## скрипт для остановки экземпляров IDS во время выключения сервера##Положить в каталог rc0.d и назначить правильный номер## автор Carlton Doeexport INFORMIXDIR= ##подставить путь к двоичным файлам IDSexport PATH=$INFORMIXDIR/bin:$PATHecho “Shutting down IDS instances”echo “Stopping instance_name” # заменить instance_name именем экземпляраexport ONCONFIG= ##конфигурационный файл экземпляраexport INFORMIXSERVER= ##DBSERVERNAMEonmode –ky##повторить четыре предыдущие строки для всех экземпляров IDS## при необходимости, если используются разные версии IDS## изменить переменную окружения $INFORMIXDIR Листинг 5.2. Скрипт stop_idsЦифры в именах каталогов относятся к уровню исполнения ОС. Уровень 0 – этоуровень остановки сервера, уровень 2 – первый многопользовательский режим.Скрипты в каталоге rc0.d выполняются в числовом порядке (перед номером скриптаставится заглавная буква К - kill). Скрипты в каталоге rc0.d выполняются в числовомпорядке (перед номером скрипта ставится заглавная буква S - start). Вы можете использовать любую буквенно-цифровую комбинацию, например,S95_start_ids. Я обычно стараюсь при остановке сервера остановить экземпляр какможно раньше. Это помогает остановить экземпляр IDS до начала остановки другихсистем сервера. Для скрипта старта сервера я наоборот стараюсь выбрать номерпобольше. Это позволяет запуститься другим демонам и выделить этим демонамнеобходимую для работы память.На системах Mac OS X скрипт ibm.Informix.ids11.plist располагается в каталоге/Library/LaunchDaemons и автоматически запускает/останавливает экземпляр IDS вовремя перезагрузки сервера.
    • На Windows-системах самый простой метод обеспечить автоматический запуск/остановэкземпляра – это разрешить службам экземпляра стартовать и останавливатьсяавтоматически во время перезагрузки сервера. В Панель управления > Службы дляслужб экземпляра установите тип запуска «Автоматически». Обратите внимание, что вокне ввода пароля необходимо установить правильный пароль для учетной записиinformix. Если пароль этой учетной записи будет изменен, например, из-за устареванияпароля, то необходимо будет обновить и пароль в этом поле.Контроль доступа и безопасностьПри настройке экземпляра необходимо уделить внимание вопросам безопасности иконтроля доступа. Во-первых, подумайте, необходим ли пользователям доступ ко всемтаблицам базы или только к определенным. При ответе на этот вопрос необходимознать, могут ли пользователи подключиться к физическому серверу с помощьюпрограмм для администрирования или только с помощью определенных приложений. ВIDS поддерживается контроль доступа на основе «ролей», с помощью которого выможете ограничить доступ пользователю на основе его идентификатора (user ID). Хотя роли были и в предыдущих версиях IDS, но там было необходимо применять ихкак часть процесса инициализации сессии. В IDS 10 IBM усовершенствовала механизмролей возможностью назначения пользователю «роли по умолчанию» (default roles). Этароль активируется при подключении пользователя. Этот функционал включает в себяиспользование нового ключевого слова default в команде назначения роли. Давайте рассмотрим примерcreate role hr;create role it_dept;revoke all on employee from public;grant all on employee to hr;grant default role hr to susan;grant default role it_dept to MelindaПосле выполнения этих команд доступ к таблицы employee будет только у членовгруппы hr. Членство пользователя в роли проявляется при его подключении к базеданных, поэтому только Susan сможет читать и редактировать записи в таблицеemployee. Второй вопрос, на который необходимо ответить, - кто имеет право создавать базыданных. С помощью параметра DBCREATE_PERMISSION файла $ONCONFIG выможете разрешить создавать базы данных только пользователю informix. Поумолчанию этот параметр оставлен пустым, что позволяет создать базу данных любомупользователю. Этот список можно ограничить, задав в вышеуказанном параметреидентификаторы тех пользователей (user ID), которые имеют право создать БД. Третий вопрос – хотите ли вы контролировать возможность создавать UDR на С и/илиJava. Поскольку эти объекты считаются внешними по отношению к серверу БД ивыполняются вне контроля сервера, то при некорректном их написании могутпредставлять опасность для работы сервера БД. Чтобы контролировать создание такихпроцедур, необходимо выполнить два шага. Во-первых, необходимо установитьпараметр IFX_EXTEND_ROLE файла $ONCONFIG равным 1 – это включитьфункционал использования ограничений. По умолчанию этот параметр включен(значение 1), для выключения установите его равным 0. Во-вторых, назначьте рольextend тем пользователям, которым необходимо создавать или администрироватьвнешние UDR.
    • Этот же механизм контролирует, кто может регистрировать DataBlad’ы всистеме. Только пользователь Informix и пользователю, которым назначена рольextend могут регистрировать DataBlade.Здесь я кратко рассмотрел только базовые вопросы безопасности экземпляра. во второйкниге мы рассмотрим эти вопросы более подробно.Отстрел пользовательской сессии.Иногда возникает необходимость прибить подключение пользователя к экземпляру.Одно из преимуществ архитектуры Informix – отсутствие отдельного системногопроцесса обслуживания каждого пользовательского подключения. Крайненежелательно убивать пользовательский поток, находящийся в критической секции.Критическая секция – часть кода Informix Dynamic Server, которая обрабатываетзавершение транзакции и отслеживает, чтобы были выполнены все дисковые операции.Уничтожение такого потока ведет к немедленному откату транзакции. Если откатневозможен, экземпляр немедленно прекращает работу. Для определения того, находится ли поток в критической секции, используетсякоманда onstat –u. Если в столбце флагов (flags) есть символ Х, это значит, что потокнаходится в критической секции. Вывод команды onstat –u показывает всепользовательские сессии экземпляра. Более подробные данные об отдельной сесииможно получить с помощью вызова команды onstat –g sec идентификатор_сессии.Также можно воспользоваться ОАТ и Server Studio. Пользовательская сессияотстреливается путем вызова команды onmode –z идентификатор_сессии, гдеидентификатор_сессии берется из столбца sessid вывода утилиты onstat –u. Дляпрерывания сессии, участвующей в распределенной транзакции, используется вызовonmode –Z. Распределенные транзакции и использование onmode –Z будут подробнорассмотрены во второй книге.ЗаключениеВ этой части мы рассмотрели типичные задачи администрирования Informix DynamicServer. Незатронутыми остались вопросы настройки и мониторинга экземпляра.вопросы настройки мы будем рассматривать на протяжении всей книги, когда будемобсуждать тот или иной механизм СУБД и его настройку. Утилиты мониторингарассмотрим в Части 8. Сейчас вы должны понимать режимы работы экземпляра Informix и уметь переводитьэкземпляр в он-лайн и офф-лайн; знать разницу между журналируемым инежурналируемым режимом базы данных. Вы должны уметь создавать и удалять db-пространства, простые/smart BLOB-пространства, понимать разницу междурегулярными и временными пространствами. Наконец, вы должны уметь перемещатьлогический и физический журнал, а также безопасно прибивать пользовательскуюсессию. При выполнении этих базовых административных задач помните о следующем:  команду изменения режима работы экземпляра отменить нельзя  изменение режима журналирования на нежурналируемый делает возможными массовые изменения без возможности возникновения длинной транзакции. Вы можете перевести таблицу в сырой режим для выполнения административных операций и оставить другие таблицы доступными для пользователей.  После больших изменений экземпляра или баз данных создавайте архив 0-го уровня  Если база данных находится в журналируемом режиме, то изменения в созданным пользователем временных таблицах также журналируются. Избежать этого журналирования можно создав временную таблицу с
    • использованием ключевого слова with no log или установкой параметра TEMPTABLE_NOLOG.  Для хранения временных таблиц создайте несколько временных db- пространств.  Для равномерного распределения дискового ввода/вывода переместите логический и физический журнал из корневого db-пространства в другое пространство.  Перед отстрелом пользовательской сессии, с помощью команды onstat –u проверьте, чтобы эта сессия не находилась в критической секции. Для отстрела сессии используйте команду onmode –z идентификатор_сессии.В следующей части мы рассмотрим некоторые задачи, которые должен решатьадминистратор БД в сконфигурированном экземпляре. Мы поговорим о создании базданных, таблиц и индексов. Я расскажу о фрагментировании таблиц и индексов,разнице между индексами и ограничениями и их использовании. Будут такжепредставлены некоторые полезные SQL-запросы.
    • Часть 6. Создание окружения базы данных.В этой части:  Создание баз данных, таблиц, индексов  Использование фрагментирования  Использование ограничений и индексов  Загрузка данных  Контроль доступа к данным  Новые и/или обновленные SQL-командыБольшинство тем в этой книге относятся к администрированию экземпляров InformixDynamic Server. В этой части мы рассмотрим вопросы администрирования базы данныхи влияние механизмов IDS на него. Мы поговорим о создании баз данных и таблиц,фрагментировании, наполнении таблиц данными, а также рассмотрим некоторыеполезные SQL-запросы. При выполнении задач администрирования я предпочитаю выполнять командыадминистрирования (в том числе и DDL-запросы) с помощью программы dbaccess.Давайте кратко рассмотрим использование этой программы и выполнение с еепомощью задач, обсуждаемых в этом разделе.Утилита dbaccessЭто одна из самых главных программ, которые администратор Informix использует всвоей работе. После внедрения в IDS 11 SQL API dbaccess может вообще бытьпрактически единственной и достаточной программой администрирования. В Windows-версиях Informix вы можете использовать dbaccess с консоли физического сервера илиподключившись к этому серверу через telnet. Программа dbaccess имеет 6 элементовменю:  Язык запросов (Querylanguage)  Соединение (Connection)  База данных (Database)  Таблица (Table)  Сессия (Session)  Выход (Exit)В таблице 6.1 описаны элементы каждого пункта меню. Подчеркнутые заглавные буквыпоказывают, как быстро вызвать команду
    • Меню утилиты dbaccessПервичное Вторичное Третичное меню описаниеменю менюQuery New В Output Эти меню используются дляlanguage Run доступны написания и выполнения SQL- Modify Printer запросов. По умолчанию вывод Use_editor New-file результатов запроса происходи в Output Append-file окно программы Choose To-pipe Save Info Drop ExitConnection Connect Используется для подключения к Disconnect базе экземпляра и отключения от Exit нее. При отсоединении необходимо ответить на запрос подтвержденияDatabase Select Используется для получения Create информации о базах данных Info экземпляра и для подключения к Drop ним. Подменю опции Create cLose подробно рассматриваются ниже ExitTable Create Используется для получения Alter информации о таблице, а также Info для создания, изменения, Drop удаления таблиц в текущей БД. Exit Подменю опции Create подробно рассматриваются нижеSession Используется для получения базовой информации о текущей сессии dbaccess и ее подключении к экземпляруExit Выход из dbacess
    • Режимы журналирования базы данныхКак я писал в 5 части, изменения данных в базе могут журналироваться на диске дляобеспечения целостности данных в случае проведения операции восстановления. Ведение(или нет) таких журналов и определяет режим журналированияЕсли база данных журналируемая, сервер БД использует физический и логическийжурнал для записи изменений данных. Базы данных, расположенные на одном экземпляреIDS, могут использовать разные режимы журналирования. Режим журналирования базыуказывается при ее создании, но может быть изменен в любой момент, как вы видели вЧасти 5. пользовательская сессия может изменить режим журналирования своих операцийс помощью SQL-команды set log. Пользователи, имеющие право на изменение базыданных или таблиц, могут изменить режим журналирования отдельной таблицы илинескольких таблиц. Ниже мы рассмотрим эту возможность подробнее. В IDS поддерживаются четыре режима журналирования. Два из них очень похожи другна друга и отличаются тем, когда буферы логического журнала сбрасываются на диск. Первый режим, нежурналируемый, записывает очень мало данных в логическиежурналы. Записываются только DDL-операции (create/drop table, create/drop index,create/drop procedure, rename table/column, alter table и т.п). Нежурналируемые базыданных обладают повышенной производительностью, поскольку на журналирование нетратятся ресурсы. Но в случае сбоя изменения в БД восстановить невозможно. Послеперезагрузки будут доступны только данные, которые были записаны в неповрежденныетаблицы. Восстановление нежурналируемых баз данных ограничивается восстановлениепоследнего полного архива экземпляра. Режим журналирования ANSI очень похож на небуферизированное журналирование(обсуждается дальше), но также предполагает совместимость с обработкой транзакций поANSI. Совместимость с ANSI включает в себя такие возможности и правила какуникальное именование владельца табличных ссылок (unique owner naming for tablereferences), различные значения по умолчанию для разных прав на таблицу (differentdefaults for table-level privileges), разницу в возможностях чтения и обновления длякурсоров (differences in the update and read capability of cursors), разницу реагированиясимвольных и типов и типов с плавающей запятой на переполнение. Обратите внимание, что IDS не обеспечивает полной поддержки всех ANSI-стандартов.Если вы в ANSI-совместимой БД выполняете не-ANSI SQL-команду, то будет выданопредупреждение, и выполнение команды продолжится. Использование этого режимажурналирования больших преимуществ не приносит. Небуферизированное и буферизированное журналирование работают практическиодинаково, за исключением определения момента времени, когда буферы журналасбрасываются на диск. DDL-операции журналируются в обоих режимах. Такжежурналируются операции insert, update, delete. Операции select не журналируются. Для журналирования операций select есть одно исключение: выражения select into tempмогут журналироваться – это зависит от настроек экземпляра. Если запрос извлекает дляобработки большой набор данных для обработки, то журналирование операций select intotemp может вызвать сложности. Самый лучший способ избежать таких проблем –создавать временные таблицы во временном db-пространстве, используя ключевые словаwith no log или установить в файле $ONCONFIG параметр TEMPTABLE_NOLOG. ВЧасти 5 приведены дополнительные данные о создании временных db-пространств. Разница этих режимов журналирования заключается в записи журналируемых данных вжурнал на диске. При небуферизированном журналировании буферы физического илогического журнала записываются на диск сразу после подтверждения транзакции. Прибуферизированном журналировании данные в буферах логического и физическогожурнала хранятся до момента полного заполнения этих буферов, обработки контрольнойточки или если пользовательское соединение закрылось и транзакции не были записаны вжурналы. Еще при одном условии может быть запущен сброс буферов на диск.
    • Поскольку в экземпляре может быть только один набор журналов, то в том случае, когда вбазе данных с небуферизированным журналированием подтверждается транзакция,информация из буферов логического журнала записывается в журнал. (короче говоря,если БД с небуферизированным журналированием пишет в журнал, то в этот же моментвремени в журнал сбрасываются и буфера логического журнала БД с буферизированнымжурналированием). Каждый из этих режимов журналирования имеет преимущества и недостатки. Принебуферизированном журналировании целостность данных может быть гарантированавплоть до отдельной транзакции, даже в случае критического сбоя экземпляра. но в этомрежиме из-за постоянной записи в журнал, возрастает дисковый ввод/вывод. Кроме того,логические журналы заполняются быстрее, чем при буферизированном журналировании.При буферизированном журналировании уменьшается дисковый ввод/вывод, и экземплярработает быстрее. Но поскольку информация о транзакциях хранится в разделяемойпамяти, есть риск ее потерять при освобождении разделяемой памяти из-закатастрофического сбоя экземпляра. Малькольм Велланс (Malcolm Weallans),администратор IDS, с которым я очень давно знаком, сказал мне однажды: «Разницамежду буферизированным и небуферизированном журналированием – твоя паранойя». Вочень немногих системах можно допустить потерю подтвержденных транзакций, поэтомуобычно я использую небуферизированное журналирование. Исключением являютсябольшие OLAP-системы, где очень мало транзакций и практически нет необходимости вжурналировании. При выборе режима журналирования примите во внимание следующие факторы:  Изменчивость данных  Требуемая производительность БД  Допустимость потери отдельных транзакций  Возможность пересоздать отдельные транзакции.Создание базы данных.Существует два мнения о том, где создавать базу данных. Первая школа рекомендуетсоздавать БД в корневом db-пространстве, вторая – где угодно, но только не в корневом. Япридерживаюсь второго мнения, поскольку в корневом db-пространстве и так находитсямножество системных таблиц, а также там по умолчанию создаются временные таблицы.Корме того, если при создании таблицы не указано, в каком db-пространстве ее создавать,она создается именно в корневом. В результате можно просто переполнить корневое db-пространство и положить экземпляр. Создать базу данных можно четырьмя путями: спомощью dbaccess, с помощью dbimport, с помощью SQL (через dbaccess) или сиспользованием Server Studio. При создании базы данных необходимо указать db-пространство, в котором она создается, и режим журналирования. Давайте рассмотримнекоторые методы создания подробнее.Создание базы данных с помощью dbaccessВыбор в dbaccess меню Database > Create проведет вас через процесс создания базыданных. После ввода имени БД вам будет предложено выбрать db-пространство и режимжурналирования. Пункт Database > Create > Dbspace предоставляет возможностьвыбрать необходимое db-пространство, по умолчанию предлагается корневое db-пространство (rootdbs). Выберите необходимое пространство и нажмите «Enter». ПунктDatabase > Create > Log позволяет выбрать необходимый режим журналирования. Поумолчанию используется «None» (нет журналирования). Если в двух вышеперечисленныхменю ничего не выбрать, то база данных будет создана с параметрами по умолчанию.После выхода из Database > Create вам будет предложено создать БД (по умолчанию)
    • или отказаться от этого. После создания база данных становится «текущей» или«активной» базой данных в сессии dbaccess.Создание базы данных с помощью dbimportЭтот метод создает не только базу данных, но и таблицы, индексы и ограничения. Затемутилита заполняет базу данных данными исходной БД из файлов в ASCII-формате,находящихся на диске или ленте. Обратите внимание, что Informix Dynamic Serverрассматривает сессию dbimport как одну транзакцию. Если вы установите флаг созданияжурналируемой БД и в базу данных необходимо загрузить много данных, то вероятнеевсего получите длинную транзакцию и импорт будет отменен. Я рекомендую неустанавливать флаг журналирования при использовании dbimport. Изменить режимжурналирования можно в любой момент, как показано в Части 5. При создании БД с помощью dbimport выбор целевого db-пространства и режимажурналирования осуществляется с помощью соответствующих флагов. Давайтерассмотрим параметры вызова командыdbimport имя_бд –d целевое_db_пространство[-l | -l buffered | ansi]Флаг –l (строчная буква L) определяет использование небуферизированногожурналирования, флаг –l buffered – буферизированного журналирования. Если не указатьрежим журналирования, база данных создается как нежурналируемая. Если не указатьцелевое db-пространство, база данных будет создана в корневом db-пространстве. Ниже приведена полная синтаксическая диаграмма этой команды:dbimport имя_бд –d целевое_db_пространство[-l | -l buffered | ansi][-I directory_name | -t tape_dev [-b blksize-s tapesize ] [-f path_to_file]У вас есть две возможности, чтобы указать утилите, где искать командный файл SQL иданные. Они могут быть на диске или ленте. Если файлы расположены на диске,используйте флаг –i и укажите полный путь к каталогу. Обратите внимание, что целевойкаталог должен иметь такое же имя, как и тот из которого вы импортируете БД, и суффикс.exp. Если данные находятся на ленте, используйте опцию –t и, если экспорт проводился спараметрами, отличными от установленных для TAPEDEV, укажите размер блока идлину ленты. При экспорте БД на ленту вы можете выбрать, где хранить командный файлсоздания таблиц и индексов. Он может быть также записан на ленту в процессе экспорталибо перенаправлен в файл. Я обычно сохраняю его в файл. Для указания файла SQL-команд на диске используйте флаг –f и полный путь к файлу.Создание базы данных с помощью SQLИспользование SQL и dbaccess – самый быстрый способ создать базу данных. Если вызапустили dbaccess без указания базы данных и выбрали Query > New, то автоматическибудет выведено окно, в котором вам предложат выбрать базу данных. Закройте это окно(обычно Ctrl+C) и вернитесь в экрану Query > New. SQL-запрос вполне прост и понятен:create database имя_бд[in имя_db_пространства][with log | with buffered log | log mode ansi]
    • Если ничего не указывать, то база данных будет создана в корневом db-пространстве безжурналирования. В следующем примере создается база данных chap6_db в db-пространстве dbs_0 с небуферизированным журналированием.create database chap6_db in dbs_0 with logСоздание и фрагментирование таблиц и индексовПосле создания базы необходимо создать таблицы, где будут храниться данные. В этомразделе мы рассмотрим создание таблиц, балансирование ввода/вывода и повышениепроизводительности.Создание таблиц и индексовТаблицы и индексы могут быть созданы теми же 4-мя методами, что и базы данных.Программа dbimport для создания таблиц и индексов целевой базы данных используеткомандный файл. Если при экспорте БД был указан флаг –ss (server-specific), то во времяимпорта будет использована информация о расположении db-пространств, размереэкстентов таблиц, обновлении статистики. Если необходимо изменить расположениетаблиц или размер перед импортом базы, то вы можете отредактировать командный файл.Не изменяйте информацию о столбцах (например, имена столбцов) в командном файле,иначе во время импорта есть шанс получить ошибки (например, несовпадение типов). По умолчанию таблицы создаются в том же db-пространстве, что и база, используетсястраничная блокировка, размер таблицы равен 16 Кбайт (Linux/UNIX) или 32 Кбайт (MacOS X/Windows). Режим блокирования таблицы можно поменять с помощью двухпараметра файла $ONCONFIG DEF_TABLE_LOCKMODE и переменной окруженияIFX_DEF_TABLE_LOCKMODE. Если вам необходимо установить режим блокировкидля всего экземпляра, то лучше использовать конфигурационный параметр, еслинеобходимо установить этот режим на уровне отдельной сессии – предпочтительнееиспользовать переменную окружения. Переменная окружения может быть установлена всессии, которая запускает экземпляр, и тогда до перезапуска экземпляра будетиспользовано именно это значение переменной окружения. Установкаконфигурационного параметра или переменной окружения не будет влиять на режимблокировки уже созданных таблиц, а только на создаваемые после установки параметраили переменной окружения. Ниже я расскажу, как изменить режим блокирования ужесозданной таблицы.При создании таблицы через dbaccess после указания определения столбцов можноуказать db-пространство, в котором создается таблица, размер экстента, режимблокирования и фрагментирование. С помощью dbaccess можно также создаватьограничения и индексы, но, как мне кажется, этот процесс достаточно запутан, и прощеиспользовать SQL-команды. SQL-команды создания таблиц и индексов достаточно просты и понятны. Их синтаксисможно найти в IBM Informix Guide to SQL:Syntax. Я не буду подробно рассматриватьсинтаксис, а лучше расскажу о его применении. Мы не будем углубляться в вопросыпроектирования схемы БД и нормализации, хотя от них во многом зависит стратегияфрагментирования. В этой части я буду пользоваться тестовой таблицей и индексами, кодсоздания которых приведен в Листинге 6.1.
    • create table store_sales(division_no smallint, store_no smallint, category char(3), sales_date date, amt_sold decimal(8,2)) in danube_1 extent size 550000 next size 5500 lock mode row;create index ix_strsls_div on store_sales (division_no) in idx_space_1;create index ix_strsls_cat on store_sales (category) in idx_space_2;create index ix_strsls_dt on store_sales (sales_date); Листинг 6.1 Таблица store_sales и ее индексыВ синтаксисе создания таблицы необходимо обратить внимание на некоторые вещи.Прежде всего, ключевое слово in используется для указания db-пространства, в которомсоздается таблица (danube_1). Параметр extent size определяет, сколько места на диске вкилобайтах выделить для таблицы при ее создании, параметр next size в килобайтахопределяет, сколько места будет выделено таблице, когда заполнится первоначальныйэкстент.Как говорилось в Части 3, правильное определение размера таблицы очень важно дляправильного проектирования базы данных. Без этого можно получить пересечениеэкстентов, что негативно сказывается на производительности. В приложенииприведена схема вычисления размера начального и последующих экстентов на основеразмера страницы db-пространства, длины строки и предполагаемого количества строк.Вы можете распределить индексы таблицы по разным db-пространствам, как это сделано сдвумя первыми индексами в листинге. Вопрос фрагментации индексов мы рассмотримниже. В IDS 10 и 11 внесены новые возможности в процесс создания индексов. Давайте краткорассмотрим эти улучшения. До этих версий процесс создания (удаления) индексатребовал эксклюзивного блокирования таблицы, т.е. до завершения процессапользователи не могли получить доступ к таблице. Кроме того, созданный индекснапоминал хромую утку – оптимизатор знал, что индекс есть, но до выполнения updatestatistics для индекса, не использовал этот индекс при построении плана выполнениязапроса. Выполнение update statistics также требует времени. В IDS 10 процесс создания индекса стал фоновым, и отпала необходимость блокированиятаблицы. Индекс создается в «выключенном» состоянии. Когда создание индексазавершено, экземпляр включает индекс в тот момент, когда нет пользовательских сессий,обновляющих таблицу. Когда поступает команда удаления индекса, оптимизаторпрекращает использование индекса для построения новых планов запросов, индексудаляется, когда все существующие сессии прекращают его использование. В IDS 11 добавлена возможность построения статистики во время создания индекса,поэтому оптимизатор может начать использовать индекс сразу после его создания. Это незначит, что во время создания индекса выполняется оператор update statistics,разработчики IDS подошли к этой задаче значительно профессиональнее.При создании индекса сервер должен выполнить те же операции, что и при updatestatistics, - ему необходимо знать, сколько строк есть в таблице (update statistics low),нужно создать bins and overflows, также знать распределение данных в требуемых
    • столбцах (update statistics medium/high). В результате в конце процесса создания индексаинформация update statistics low для индекса и update statistics high для ведущегостолбца доступны оптимизатора для построения планов запросов. Созданиестатистической информации происходит автоматически, вам ничего не надоконфигурировать и настраивать. Статистическая информация собирается при созданиииндекса, при изменении таблицы, которое затрагивает индекс, и при изменении схемыфрагментирования индекса. В IDS 11 добавлен дополнительный функционал работы с индексами, которыйзначительно снижает нагрузку на сервер при создании или изменении таблиц илииндексов. В ранних версиях IDS если изменяемая таблица или индекс были частью UDR,написанной на SPL, или подготовленного выражения (prepared statement), то при доступе ктаблице или индексу IDS возвращал ошибку –710. Приложение было должно еще разподготовить выражение (would have to re-prepare the statement), а UDR, написанная на SPL,необходимо было переоптимизировать (re-optimized). В IDS 11 введен конфигурационный параметр AUTO_REPREPARE и переменнаяокружения IFX_AUTO_REPREPARE. Если установить значение этого параметра равным1, то сервер будет проверять при построении плана запроса, не изменились ли таблица илииндекс. Если изменились, то сервер автоматически переоптимизирует запрос или SPL-процедуру. Несмотря на то, что этот новый функционал уменьшает количество ошибок вприложениях, в некоторых случаях все равно может появиться ошибка –710. Первыйслучай – не будут переподготовлены выражения с DDL-операциями (типа alter tablemy_tab add col_34 smallint). Второй случай – если с изменяемой таблицей работает многосессий, то некоторые из них возможно сгенерируют ошибку. В этом случае необходимоперезапустить запрос. Необходимо понимать, что когда IDS выполняет переподготовку или ре-оптимизациювыражения, он работает на основе переменных окружения сессии. Т.е. если вы установилив сессии параметры PDQ priority, OPTCOMPIND, последовательность сортировки, топереподготовка/ре-оптимизация будет выполнена с учетом этих параметров. Такоеповедение сервера может негативно повлиять на производительность работы.Дополнительные опции создания таблицНачиная с IDS 9, при создании таблиц доступны дополнительные опции. В примерах ниже полагается, что таблица создается в стандартном режиме (standardmode). Большинство таблиц создается именно в стандартном режиме, поскольку этотрежим гарантирует транзакционную целостность, использование ограничений,журналирование изменений. По умолчанию таблицы создаются именно в этом режиме. Нонужно знать, что таблица может быть создана в сыром режиме (raw mode). Сырыетаблицы похожи на стандартные, за исключением того, что они не поддерживаютжурналирование изменений, ключи и ограничения целостности. В ранних версиях IDS длясырых таблиц не поддерживались индексы, но сейчас ситуация поменялась – оптимизаторможет использовать индексы при работе с сырой таблицей. Пример создания сырой таблицы представлен в Листинге 6.2
    • create raw table store_sales( division_no smallint, store_no smallint, category char(3), sales_date date, amt_sold decimal (8,2)) in danube_1extent size 550000 next size 5500lock mode row; Листинг 6.2 пример создания сырой таблицы store_salesЕсли таблицы не содержат ограничений, то вы можете использовать alter table дляперевода таблиц в сырой режим из стандартного или наоборот.В части 2 мы обсуждали объектно-реляционные возможности IDS. Сейчас Informixподдерживает тип данных row, который может состоять из полей разных типов. Выможете использовать этот тип данных при создании простых или сырых таблиц, а такжедля создания производных таблиц, которые наследуют свойства мастер-таблицы илисупер-таблицы. В Листинге 6.3 приведен пример создания двух «именованных» типовrow и использования этих типов для создания таблицы, в которой хранится информация остудентах. Поскольку типы данных row определены, они могут использоваться во всейБД.create row type name_t(fname char(20), lname char(20));create row type address_t( street_1 char(20), street_2 char(20), city char(20), state char(2), zip char(9));create table student(student_id serial, name name_t, address address_t, company char(30)); Листинг 6.3. Использование типов данных row для создания новой таблицыВторой путь создания таблиц – использование typed-таблиц. В Листинге 6.4 приведенаиллюстрация этого метода. Вывод dbschema для такой таблицы покажет такие же именастолбцов и типы данных, как и для именованного типа rowcreate row type student_info_t(fname char(20), lname char(20), street_1 char(20), street_2 char(20), city char(20),
    • state char(2),zip char(9));create table student_info of type student_info_t; Листинг 6.4 Создание typed-таблицыПоследняя опция, доступная при создании таблиц, - использование супер-типа, которыйиспользуется для создания разных таблиц.В предыдущем примере мы создали тип данных student_info_t и таблицу на его основе.Теперь на основе student_info_t мы создадим новый тип данных, который наследуетатрибуты student_info_t.create row type class_enrollment_t(course_no int, course_date date) under student_info_t;Используя новый подтип, создадим таблицу, которая наследует все атрибуты типа данныхstudent_info_t.create table course_enrollment of type class_enrollment_t under student_infoТакие таблицы наследуют все атрибуты супер-таблицы, включая фрагментирование,триггеры, индексы, ограничения и т.д. если в супер-таблицу после создания дочернихтаблиц были внесены изменения, то эти изменения будут унаследованы дочернимитаблицами.Фрагментирование таблиц.Одна из полезных возможностей Informix Dynamic Server – фрагментирование таблиц ииндексов. Таблицы и индексы могут быть размещены в разных db-пространствах. Вотличие от RAID 0, вы можете фрагментировать таблицы по определенным логическимправилам, что часто дает прирост производительности и надежности. Можно установитьконфигурационный параметр DATASKIP, чтобы фрагментированные таблицы былидоступны в том случае, когда недоступен одни из фрагментов. Как вы уже знаете,существует две схемы фрагментирования – round-robin и по выражению. Индексы могутфрагментироваться только по выражению. С помощью ключевого слова by expression выможете разместить индексы в разных db-пространствах или в db-пространстве, отличномот того, где размещена таблица. Индекс можно оставить ко-резидентным (co-resident), т.е.он будет размещаться в том же db-пространстве, что и таблица. Вне зависимости от метода фрагментирования, необходимо помнить о влиянии ростаэкстентов на фрагменты и db-пространства. В Части 3 уже говорилось, что необходимостараться правильно определить размеры таблиц, чтобы минимизировать пересечениеэкстентов и снижение производительности. Помните, что установки размера начального ипоследующих экстентов касаются всех фрагментов таблицы (за исключением тех,которые созданы с помощью описанного ниже приема). Все фрагменты таблицы будутсозданы и будут расширяться на основе одинаковых настроек. Существует один способсоздания фрагментов с разными начальными размерами. Сначала необходимо создать двеили больше «псевдотаблиц» с идентичными схемами. Каждую таблицу создайте сразными значениями размера начального и последующих экстентов. Затем с помощьюоператора alter fragment (описан ниже) создайте новую таблицу путем соединениявместе «псевдотаблиц». С помощью alter fragment измените условия фрагментирования.
    • С помощью этой методики можно создать таблицу, фрагментированную по разным db-пространствам, и где каждый фрагмент имеет свои собственные параметры роста. В IDS 10 был изменен процесс создания и администрирования фрагментов: можносоздавать несколько фрагментов в одном db-пространстве. В ранних версиях каждыйфрагмент должен был находится в отдельном db-пространстве, что ограничиваловозможное количество фрагментов. С помощью ключевого слова partition можнополностью использовать преимущества больших db-пространств для хранения таблиц ипреимущества фрагментированных таблиц. Давайте рассмотрим примерфрагментирования таблицы по этому методуcreate table store_sales( division_no smallint, store_no smallint, category char(3), sales_date date, amt_sold decimal(8,2)) fragment by expression partition part_1 (division_no=1) in danube_1, partition part_2 (division_no>7) in danube_1, partition part_3 (division_no>=5 and division_no<=6) in danube_2, partition part_4 (division_no>=2 and division_no<=4) in danube_3extent size 5500 next size 250lock mode row; Листинг 6.5 Размещение разных фрагментов таблицы в одном db-пространстве.Обратите внимание, что размещение всех фрагментов в одном db-пространстве негативносказывается на производительности, так как доступ к диску сериализуется.Фрагментирование round-robinЭта схема фрагментирования предполагает, что вес данные таблицы будут равномернораспределены между всеми фрагментами таблицы. Если вы задаете эту схемуфрагментирования для таблицы, в которой уже есть данные, то данныеперераспределяться не будут. Они останутся на месте до тех пор, пока не будутвыгружены (unload), удалены и загружены в таблицу снова. Эта схема фрагментирования обладает всеми преимуществами и недостатками RAID 0.При выполнении выборки из таблицы даже с учетом индекса экземпляр должен читать всеdb-пространства, содержащие фрагменты таблицы. В зависимости от размера таблицы, этасхема фрагментирования может обеспечить большую производительность, чем хранениетаблицы в отдельном db-пространстве.При фрагментировании таблицы по round-robin, ее индексы не должны создавться какко-резидентные. Если этого не сделать и создать индексы как ко-резидентные, тостраниы индексов будут распределены по db-пространствам, в которых хранятсяфрагменты таблицы, что вызовет значительное падение производительности из-занеобходимости чтения всех индексных страниц в db-пространствах, содержащихфрагменты таблицы. Индексы фрагментированных по round-robin таблиц должны быть«отключены» (detached)и созданы в отдельном db-пространстве.В Листинге 6.6. показан пример создания таблицы с фрагментированием по round-robin
    • create table store_sales( division_no smallint, store_no smallint, category char(3), sales_date date, amt_sold decimal(8,2)) fragment by round robin indanube_1, danube_2, danube_3, danube_4extent size 95000 next size 9500lock mode row; Таблица store_sales с фрагментированием по round-robinФрагментирование по выражению.Фрагментирование по выражению подразумевает, что данные таблицы или индексаразделяются по разным db-пространствам на основе логических правил. Правила можносоздать используя выражения SQL и применить их при создании таблицы или в любойудобный момент времени. В выражении фрагментирования можно использоватьпрактически любой столбец таблицы (некоторые исключения обсудим ниже). В отличиеот алгоритма round-robin, применение фрагментирования по выражению к таблице сданными приводит к перераспределению этих данных в соответствии с правиломфрагментирования. В зависимости от режима журналирования базы и количестваперемещаемых строк может случиться длинная транзакция. При изменении значенийполей, которые используются в выражении фрагментирования, строка может быть такжеперенесена в другое db-пространство. Одна из самых приятных возможностейфрагментирования по выражению – возможность уменьшить количество индексов безпотери производительности. Оптимизатор использует выражения фрагментирования дляисключения из просмотра фрагментов, где не могут храниться необходимые данные. Давайте вспомним нашу тестовую таблицу и предположим, что у нас 6 отделов продаж,из которых реально работают 4. Мы можем построить схему фрагментирования так,чтобы данные по продажам 4 активных отделов продаж раскладывались по разным db-пространствам, а данные по 2 малоактивным отделам складывались в одно db-пространство. Такой подход позволяет не создавать индекс по номеру отдела продаж,поскольку данные уже разделены с помощью выражения фрагментирования. В Листинге6.7 показано, как создать таблицу с фрагментированием по выражениюcreate table store_sales( division_no smallint, store_no smallint, category char(3), sales_date date, amt_sold decimal(8,2)) fragment by expression division_no=1 in danube_1 division_no=2 in danube_2 division_no=4 in danube_3 division_no=5 in danube_4 (division_no=3) or (division_no=6) in danube_5 extent size 950 next size 95 lock mode row; Листинг 6.7. Таблица store_sales с фрагментированием по выражению
    • Приведенные выражения фрагментирования вполне просты и понятны, на практике могутиспользоваться сложные выражения с применением UDR или secondary access methodoperator classes. Первый метод очень полезен, если необходимо создать правила сложнее, чем «равно,больше/меньше». Использование UDR позволяет создавать схемы фрагментирования сиспользованием столбцов, созданных на основе определенных пользователем типовданных. UDR могут быть написаны на любом поддерживаемом языке, но должны всегдавозвращать только булев результат. Использование secondary access method operator classes с точки зрения реализациипохоже на использование UDR. Необходимо, чтобы класс оператор разрешался в форматиндекса B-дерева (the operator class must resolve to a B-tree index format).исходя из этого вывыбираете опции класса, которые хотите использовать для построения схемыфрагментирования. Как вы понимаете, правила фрагментирования таблиц необходимо записывать правильно,чтобы IDS мог быстро определить, куда вставлять строку или где ее искать. Ниже мыобсудим эту мудрую мысль подробнее.Оценка выраженияСервер оценивает выражения фрагментирования сверху вниз и слева направо. Оченьжелательно, чтобы выражения фрагментирования были исключительными (чтобы однастрока не удовлетворяла двум и более выражениям). Если это не так, строка будетобработана в соответствии с первым подходящим правилом. В выраженияхфрагментирования допускается использование всех столбцов таблицы, кроме столбцов сBLOB-ами. Я не рекомендую использовать в выражениях фрагментирования типы данныхserial (и подобные), date, datetime, поскольку при их использовании распределение строкстановится неравномерным, особенно если таблица не является статичной. Об одномисключении из этого совета я расскажу ниже. Если вы все-таки используете правила наоснове этих типов, то вам придется часто переписывать правила для перераспределенияданных. Корме того, использование типов данных date, datetime замедляет вычислениевыражений, поскольку серверу необходимо для оценки выражения преобразовыватьданные этих типов в целое. В случае если все-таки необходимо использовать фрагментирование по дате, IDS 11предоставляет новый функционал, который позволяет использовать функции обработкидат (month(), year(), day()) в выражениях фрагментирования. С помощью этого подходаможно создать схему фрагментирования, которая не будет нуждаться в изменениях.fragment by expression month(sales_date)=1 in tagus_1fragment by expression month(sales_date)=2 in tagus_2fragment by expression month(sales_date)=3in tagus_3fragment by expression month(sales_date)=4 in tagus_4fragment by expression month(sales_date)=5 in tagus_5fragment by expression month(sales_date)=6 in tagus_6fragment by expression month(sales_date)=7 in tagus_7fragment by expression month(sales_date)=8 in tagus_8fragment by expression month(sales_date)=9 in tagus_9fragment by expression month(sales_date)=10 in tagus_10fragment by expression month(sales_date)=11 in tagus_11fragment by expression month(sales_date)=12 in tagus_12Использование функций обработки дат снимает проблему производительности, связаннуюс конвертированием дат в целое число, поскольку эти функции обрабатывают даты в их
    • родном формате. В функциях фрагментирования можно использовать любые функцииSQL, включая функции mod() и pow(). Использование функции mod() (иногда называетсявычислением хэша – hash expression) приводит к равномерному распределению строктаблицы, в которой уже есть данные. Это очень похоже на алгоритм round-robin, ноиспользование этой функции SQL позволяет оптимизатор ускорить выборку необходимыхстрок даже при их равномерном распределении. Выражение фрагментирования выглядитпримерно так:...,)fragment by expressionmod(cust_id,3)=2 in danube_1mod(cust_id,3)=1 in danube_2mod(cust_id,3)=0 in danube_3lock mode row;Выражения фрагментирования должны быть максимально простые, поскольку сервервычисляет их каждый раз при добавлении строки или при ее изменении. Прииспользовании в выражениях фрагментирования диапазонов (дат, чисел), самоеисключающее выражение ставьте первым. Например:..,region_code smallint)fragment by expression(region_code>=200) in danube_3(region_code>=150) in danube_1(region_code>=100) in danube_4,remainder in danube_5Если задать порядок правил наоборот (т.е. первым поставить(region_code>=100) indanube_4 )), то практически все строки таблицы окажутся в db-пространстве danube_4.Единственным исключением будут строки с region_code<100 – они будут в db-пространстве danube_5. Это же правило справедливо и с в случае использования ввыражениях фрагментирования диапазонов: наиболее исключающее выражение должнобыть первым..,trans_code smallint)fragment by expression(region_code>=50 and trans_code<100) in danube_2(region_code>=25 and trans_code<50) in danube_3(region_code>=1and trans_code<25) in danube_5remainder in danube_1Обратите внимание на использование ключевого слова remainder. На практике егонеобходимо избегать, поскольку оптимизатор всегда при выполнении запросапросматривает раздел remainder, даже если, благодаря выражениям фрагментирования,абсолютно ясно, в каких db-пространствах располагаются исходные данные. Вмсетоиспользования remainder пишите выражения фрагментирования так, чтобы все строки, сатрибутами вне правил фрагментирования, складывались в определенное db-пространство. Например, можно написать так:
    • ..,region_code smallint)fragment by expression(region_code>=200) in danube_3(region_code>=150) in danube_1(region_code>=100) in danube_4,(region_code<100) in dbs_5При такой записи оптимизатор не будет сканировать еще одно db-пространство.Фрагментирование индексов.В IDS 7 и младше страницы таблиц и индексов располагаются в экстентах таблиц. В IDS 9и старше это поведение изменилось – индексы размещаются в своих собственныхэкстентах, даже если они были созданы в в том же db-пространстве, что и таблица. Выможете фрагментировать индексы по выражениям. Фрагментирование по round-robin неподдерживается. Самый простой пример – создание индекса в db-пространстве, отличномот db-пространства, где находится таблица. Например:create index ix_strsls_cat on store_sales (category)in idx_space_1;create index ix_strsls_dt on store_sales(sales_date)in idx_space_2;Размещение индексов отдельно от таблицы может существенно повыситьпроизводительность. Я всегда стараюсь размещать индексы в db-пространствах на техдисках, где находятся db-пространства с таблицами, к которым пользователи обращаютсяредко. Если вам необходимо разместить самые активные по вводу/выводу таблицы повсем дискам, то не забудьте также по всем дискам разместить и самые активно-используемые индексы. Для построения схемы фрагментирования индексов вы можетеприменять любой столбец, используемый в индексе. Правила фрагментирования индексовобрабатываются точно также, как и правила фрагментирования таблиц, поэтому советы изпредыдущего раздела применимы и к индексам. Вот пример неправильной идеологически,но правильной синтаксически схемы фрагментирования:create index major_idx on store_sales (division_no, store_no, category)fragment by expressiondivision_no >4 in danube_index_1,category=”A” or category=”F” in danube_index_2,division_no <=4 in danube_index_3;В отличие от таблиц, для фрагментированных индексов нельзя задать размеры экстентов.IDS самостоятельно выделяет необходимые экстенты.Изменение фрагментирования.Изменить фрагменты таблиц или индексов можно в любой момент с помощью SQL-команды alter fragment. С помощью этой команды вы можете переинициализироватьфрагментирование, удалить, добавить фрагменты. Можно также слить две одинаковые поструктуре таблицы в одну фрагментированную. С помощью этой команды можноотключить фрагмент таблицы для создания новой таблицы. В этом разделе мы, восновном, будем говорить о фрагментах таблиц. Нижеизложенные принципы можно
    • применить и к изменению фрагментов индексов, по я предпочитаю удалять ипересоздавать индексы с нужной схемой фрагментирования. В разделе 11 IBM InformixDynamic Server Administrator’s Guide приведены команды SQL, которые журналируютсявсегда, вне зависимости от режима журналирования базы, на которой выполняются этикоманды. Команда alter fragment присутствует в этом списке. Поэтому перед запускомкоманды убедитесь, что в логических журналах сервера достаточно места для поддержкивыполнения этой операции и других операций в БД. Это значит, что нужно убедиться, чтопараметры LTXHWM и LTXEHWM соответствуют размеру логических журналовэкземпляра, которые могут быть использованы перед инициализацией ситуации длиннойтранзакции. Перед выполнением этой команды стоить включить автоматическоедобавление логических журналов. После завершения выполнения операции не забудьтеудалить лишние журналы.Обратите внимание, что команду alter fragment нельзя выполнять для активной таблицы,так как эта операция выполняется в одной транзакции, и при выполнении этой командытаблица блокируется в эксклюзивном режиме. Если какая-то сессия использует таблицу,команда изменения фрагмента (alter fragment) будет отменена. А во время выполнениякоманды все запросы к таблице будут отвергнуты. При выполнении команды все старыефрагменты таблицы находятся на своих местах до тех пор, пока не будут окончательносозданы новые фрагменты и синхронизированы индексы. Только после этого старыефрагменты будут удалены. Это приводит к тому, что во время выполнения этой операциинаблюдается эффект «двойного использования дискового пространства», т.е. таблицазанимает в 2 раза больше дискового пространства. В случае отката транзакции новыефрагменты будут удалены, а старые активированы заново. Перед изменением фрагментаубедитесь, что в db-пространстве достаточно места для хранения и новых, и старыхфрагментов.Инициализация, добавление и изменение фрагментов.Для иллюстрации выполнения команды alter table используем таблицу store_sales,созданную в начале этой части. Чтобы сделать ее фрагментированной необходимовыполнить такие команды (в зависимости от выбранной схемы фрагментирования)alter fragment on table store_salesinit fragment by round robin in danube_2, danube_3, danube_4;alter fragment on table store_sales init fragment by expression division_no=1 in danube_1, division_no=2 in danube_2, division_no=4 in danube_3, division_no=5 in danube_4, (division_no=3) or (division_no=6) in danube_5;В этих примерах показано использование ключевого слова init для переинициализациисхемы фрагментирования с многими условиями. Это ключевое слово можно использоватьи для удаления схемы фрагментирования. Для того, чтобы сделать таблицу нефрагментированной можно выполнить команду:alter fragment on table store_sales init in danube_7;В отличие от команды alter table, в одной команде alter fragment нельзя выполнитьнесколько действий. Следовательно, добавление фрагмента к таблице и изменение
    • выражения фрагментирования этой же таблицы требуют выполнения двух отдельныхкоманд. Исключение из этого правила – использование ключевого слова init дляпереинициализации всей схемы фрагментирования. Например, изменение схемыфрагментирования:alter fragment on table store_salesmodify danube_3 to ((division_no=4) or(division_no=3)) in danube_3,modify danube_5 to division_no=6 in danube_12;Вы можете использовать этот синтаксис, как показано в примере, для перемещенияданных фрагмента в другое db-пространство. Для добавления новых фрагментов ксуществующей схеме фрагментирования можно использовать команды, похожие нанижеприведенные. Первая команда добавляет фрагменты к схеме фрагментирования повыражению, вторая – к схеме фрагментирования round-robinalter fragment on table store_sales add store_no>400 in danube_4;alter fragment on table store_sales add danube_6;Добавление фрагмента к схеме фрагментирования round-robin не вызываетперераспределения строк, которые уже есть в таблице. Новое db-пространство будетиспользовано для размещения новых строк. При изменении схемы фрагментирования выможете с помощью ключевых слов before и after указать, где в схеме фрагментированиярасполагается новое правило. Единственное исключение - выражения фрагментированиянельзя указывать после ключевого слова remainder. Например,alter fragment on table store_sales add store_no>400 in danube_4 before danube_7;Удаление фрагментовПри удалении фрагмента обязательно обратите внимание, куда денутся данные,расположенные в этом фрагменте. По умолчанию они перемещаются в фрагментremainder, если таковой существует. Как я уже говорил фрагмента remainder лучшеизбегать из-за его негативного влияния на производительность запросов. Удалениефрагмента напоминает перемещение логических журналов из корневого db-пространствапосле настройки сервера. Сначала вам нужно изменить схему фрагментирования илидобавить новые фрагменты. Затем перелить в эти фрагменты данные, которыерасположены в фрагменте, который будет удаляться. Затем фрагмент можно удалить. Если новые условия фрагментирования не позволяют перенести строку из удаляемогофрагмента в другой, то будет сгенерирована ошибка SQL –776 и ошибка ISAM –772, итранзакция drop fragment откатится. Рассмотрим пример команды удаления фрагментаalter fragment on table store_sales drop danube_3Если таблица была создана с несколькими фрагментами, которые расположены в одномdb-пространстве, то при удалении фрагмента необходимо указать ключевое словоpartition и имя фрагмента
    • alter fragment on table store_sales drop partition part_3Чтобы убедиться, что правила фрагментирования написаны правильно, после изменениясхемы фрагментирования я обычно с помощью dbschema создаю схему таблицы. Еслиэто не так, то с помощью серии команд add, modify, drop fragment можно привестисхему фрагментирования к необходимому виду. Для повторной инициализации всейсхемы фрагментирования можно использовать ключевое слово init. Необходимо помнить,что повторная инициализация может привести к длинной транзакции, поэтому этуоперацию лучше производить во время выполнения работ по обслуживанию БД.Перед проведением больших изменений схемы фрагментирования может быть полезноперевести таблицы в сырой режим. Этот метод позволяет снизить нагрузку на серверпри выполнении операции изменения схемы фрагментирования, но не позволяетвыполнить восстановление в случае неудачи. После изменения таблицы и перевода ееназад в стандартный режим, необходимо выполнить архив 0-го уровня.Присоединение таблицИспользуя ключевое слово attach в команде alter fragment, вы можете объединить дветаблицы с одинаковой структурой в одну. «Новую» таблицу можно создать сфрагментированием по round-robin, тогда каждая таблица будет содержать свои прежниеданные, или с помощью ключевого слова as задать схему фрагментирования и выполнитьфрагментирование как часть операции attach. Каждая присоединяемая таблица сохраняет свои параметры экстентов. Поэтому передприсоединением таблиц необходимо убедиться, что в db-пространствах хватит места.Синтаксис присоединения выглядит так:alter fragment on table store_sales attach store_sales, midwest_sales;Вторая и последующие таблицы (в примере это midwest_sales) становятся «расходными»и теряют свои имена, первая таблица остается «выжившей» и сохраняет имя. Несколькозамечаний по присоединению таблиц:  При соединении таблиц удалите все созданные ограничения. Попытка присоединить таблицы с ограничениями вызовет ошибки SQL –868 или –888  Таблицы со столбцами serial, serial8 не могут быть присоединены.  К фрагментированной таблице могут быть подключены только нефрагментированные таблицы.  Все индексы «расходной» таблицы при присоединении ее к другой таблице удаляются. В «выжившей» таблице журналируемой базы останутся индексы, и они будут применены для новой таблицы. В нежурналируемой БД оставшиеся индексы не будут применены к новой таблице – их необходимо удалить и создать снова.  Триггеры и представления «расходной» таблицы удаляются. Триггеры и представления «выжившей» таблицы остаются, но на время присоединения все триггеры отключаются.  При присоединении таблиц для создания схемы фрагментирования в правильном порядке вы можете использовать ключевые слова before и after.  Таблицы с типами данных неименованная строка (unnamed row) и именованная строка (named row) не могут быть присоединены.  Фрагменты подключенных таблиц должны находится в db-пространствах с одинаковым размером страницы.
    • Отключение фрагментовВы можете выделить фрагменты из «первичной» таблицы, чтобы создать новые,«отключенные» таблицы. В зависимости от схемы фрагментирования, отключениефрагментов в новые таблицы может быть простым методом создания таблиц истории. Сэтой целью в схеме фрагментирования лучше использовать столбцы типа date или serial.Когда в таблицу начинают записываться данные с датами, большими, чем определенная,или когда размер таблицы становится больше заданного, вы можете добавить к таблиценовый фрагмент, а деактивированный фрагмент отключить от первичной таблицы ипереместить данные из него в новую таблицу истории. Отключенные таблицы наследуютпараметры экстентов и режим блокирования первичной таблицы. Больше ничего ненаследуется. Вам будет необходимо создать индексы, ключи и ограничения для новойтаблицы. Синтаксис отключения таблиц предполагает задание имени db-пространства, гдесодержится отключаемый фрагмент, и имя новой таблицы. Например,alter fragment on table store_sales detach danube_5 div3_sales;Если фрагменты таблицы находятся в одном db-пространстве, то перед именем фрагментанеобходимо указать ключевое слово partition.alter fragment on table store_sales detach partition part_5 div5_salesИзменение таблиц.Выше мы обсуждали вопросы физического хранения таблиц и индексов. Вторая большаячасть администрирования таблиц – это модификация схемы. В этом разделе мы поговоримо определении столбцов, ограничениях и ссылочной целостности. Для модификации схемы таблицы и режима журналирования можно использовать SQL-команду alter table. В одной команде alter table вы можете выполнять несколькоизменений таблицы. Это могут изменение режима блокировки, добавление, удаление,изменение столбца, изменение типа данных столбца, добавление или удаление опцийбезопасности, типа Label-Based Access Control, добавление или удалениеидентификаторов строк (row ID) или контрольных столбцов Enterprise Replication/MACH-11. некоторые изменения могут быть выполнены «на месте» (in-place), другие требуютполной перестройки таблицы. Изменения «на месте» выполняются практически, невызывают нагрузки на устройства ввода/вывода, но требуют мониторинга, особенно есливыполняется несколько изменений структуры таблицы. Изменения «не на месте» (non-in-place alters) не требуют мониторинга, но вызывают на грузку ввода/вывода и выполняютсянекоторое время. Основные изменения такого типа – изменения типа данных столбца нанесовместимый тип данных (например, изменение типа данных столбца с числового насимвольный). Другие изменения такого типа – добавление/удаление идентификаторастроки (row ID), удаление BLOB-столбца, изменение столбца, который используется всхеме фрагментирования таким образом, что часть данных необходимо перенести вдругое место хранения. При выполнении таких изменений создается таблица с требуемойсхемой, а затем данные из старой таблицы копируются в новую. На таблицу в этом случаенакладывается эксклюзивная блокировка, которая предотвращает доступ пользователей ктаблице. После заполнения данными новой таблицы старая будет удалена. Передзапуском операции такого типа необходимо убедиться, что в целевых db-пространствахдостаточно места и для исходной таблицы, и для ее копии, в противном случае операциязавершится ошибкой. Большинство операций изменения схемы таблицы выполняются «наместе». При выполнении таких изменений создается новая схема таблицы, но данные несразу обновляются. Когда обновляется строка такой таблицы, то обновляется схема
    • строки так, чтобы соответствовать последней версии схемы таблицы. Пример показанниже на Рисунке 6.2 my_tableRow_1 Col_1 Col_2 Col_3 Col_4 Col_5Row_2 Col_1 Col_2 Col_3 Col_4 Col_5Row_3 Col_1 Col_2 Col_3 Col_4 Col_5 alter table my_table add (col_6 int) before col_3; insert into my_table values(….); insert into my_table values(… );Row_1 Col_1 Col_2 Col_3 Col_4 Col_5Row_2 Col_1 Col_2 Col_3 Col_4 Col_5Row_3 Col_1 Col_2 Col_3 Col_4 Col_5Row_4 Col_1 Col_2 Col_6 Col_3 Col_4 Col_5Row_5 Col_1 Col_2 Col_6 Col_3 Col_4 Col_5 select col_2 from my_table where conditions=row_2; update my_table set col_1=”xyz” where conditions=row_1Row_1 Col_1 Col_2 Col_3 Col_4 Col_5 Col_5Row_2 Col_1 Col_2 Col_3 Col_4 Col_5Row_3 Col_1 Col_2 Col_3 Col_4 Col_5Row_4 Col_1 Col_2 Col_6 Col_3 Col_4 Col_5Row_5 Col_1 Col_2 Col_6 Col_3 Col_4 Col_5 Рисунок 6.2 Изменения таблицы «на месте» и версионность схемыВо время изменения схемы в таблице my_table уже были данные. После изменения схемыв таблицу был вставлены две новые строки. Эти строки были вставлены с учетом новогоформата таблицы, но все старые строки хранятся в старом формате. Затем одна строкабыла выбрана с помощью оператора select, а вторая была обновлена. Выборка строки невызывает модификации ее схемы, а операция обновления – вызывает. Если вы выполнитеdbschema для этой таблицы, то команда вернет все столбцы, соответствующие последней«версии» схемы. Возникает вопрос – есть ли в таблице строки, которые не соответствуютпоследней «версии» схемы и как исправить ситуацию? На первый вопрос отвечаеткоманда oncheck –pT. На второй – «делайте это, только если вам очень сильно нужно». ВЛистинге 6.8 показан вывод двух команд oncheck. В начале листинга представлен выводoncheck для таблицы my_table, в конце – для другой таблицыHome Data Page Version SummaryVersion Count0(oldest) 21(current) 3
    • Home Data Page Version SummaryVersion Count0(oldest) 21 32 03 264(current) 3 Листинг 6.8 Часть вывода команды oncheck –pT – вывод версий строкКак видите в таблице могут храниться строки различных версий. Обычно это не влияет напроизводительность. Когда выполняется выборка строки со старой схемой, IDS добавит вновые столбцы этой строки значения NULL. Если было произведено много измененийсхемы и ваши приложения постоянно запрашивают «старые» данные, процессмодификации строк перед их возвращением клиентскому приложению может снизитьпроизводительность системы. Решить эту проблему можно довольно просто – обновитеодин из столбцов сам на себя, и все строки таблицы будут обновлены до самой последнейверсии схемы:update my_table set col_1=col_1;Перед выполнением операции такого типа убедитесь, что хватит места для хранения строкв последней версии схемы. Поскольку изменение таблицы выполняется как однатранзакция, необходимо быть уверенным, что вам хватит логических журналов дляпредотвращения ситуации длинной транзакции. При операциях «на месте» это некритично, поскольку данные таблицы не изменяются немедленно. Изменения «не наместе» более проблематичны, степень серьезности возможных проблем зависит отколичества строк в таблице. Простейший метод решения – поменять режимжурналирования таблицы на raw. О сырых (raw) таблицах было сказано выше. Измененияв этих таблицах не записываются в логические журналы, поэтому можно провести ихразличные изменения без риска возникновения длинной транзакции. Недостаток –невозможно выполнить откат изменений или восстановится после отмененных операций.Для выполнения изменений «не на месте» можно перевести таблицу в сырой режим,выполнить необходимые действия, а затем вернуть ее в обычный режим. Эта операция неповлияет на индексы таблицы. Такое поведение индексов может быть и желательным, инет, в зависимости от числа перестроек индекса в результате изменений в таблице.Последовательные перестройки индекса могут существенно замедлить выполнениекоманды alter table. Я обычно при выполнении alter table удаляю все индексы, а затемсоздаю их заново. При таком подходе индекс перестраивается один раз.Ограничения, ссылочная целостность и индексыОбеспечение целостности данных в базе данных – одна из самых важных задачадминистратора БД. В решении этой задачи важную роль играют хранимые процедуры,определенные пользователем функции (UDR), триггеры, различные типы ключей. Давайтетеперь кратко рассмотрим ограничения и индексы. Хранимые процедуры, определенныепользователем функции, триггеры заслуживаю не нескольких абзацев в книге, аотдельного рассмотрения. О хранимых процедурах можете почитать в IBM Informix Guideto SQL:Tutorial, а об определенных пользователем функциях – IBM Informix User-DefinedRoutines and Data Types Developer’s Guide.Хранимые процедуры, определенные пользователем функции (UDR) и триггеры
    • Хранимые процедуры – это функции, написанные на комбинации SQL и языка хранимыхпроцедур (stored procedure language SPL). Процедуры хранятся в откомпилированном видедля каждого экземпляра и могут быть использованы для аудита таблиц, обеспечениябезопасности, обработки данных и повышения производительности сервера. Хотя синтаксис хранимых процедур очень похож на синтаксис С, на самом деле онограничен базовыми командами управления типа if-then-else, while, for. Остальнаяфункциональность хранимых процедур унаследована от SQL. В IDS 11 введены новыеоператоры – loop, while loop, for loop, exit when, goto, маркированные циклы (markedloops). Определенные пользователем функции (User-defined routine UDR) – расширениявстроенных процедур, написанных на SPL. Обычно термин UDR относится к процедурам,написанным на С или Java. Если UDR написанs на Java, они собираются в класс, а затем в.jar файл. После регистрации в экземпляре, .jar-файл хранится в одном из sb-пространств.В сервер БД для выполнения таких процедур интегрирована виртуальная машина Java. Если UDR написана на С, то ее необходимо скомпилировать, получить разделяемуюобъектную библиотеку (shared object library) и положить в каталог, владельцем которогоявляется пользователь informix и права на который установлены как 755. Общепринятымявляется использование каталога вроде $INFORMIXDIR/extend, но вы можетеиспользовать любой другой каталог в системе. Все UDR, написанные на С, должнылежать в одном каталоге, определенном в конфигурационном параметреDB_LIBRARY_PATH файла $ONCONFIG. Хранимые процедуры и UDR могут вызываться пользовательскими приложениями илитриггерами. Поскольку UDR рассматриваются как объекты сервера БД при их разработке вы можетеприменять объектно-ориентированный подход. Например, можно создать перегруженнуюфункцию (overloaded function). Перегруженная функция – это функция с тем же именем,что и существующая, но с другой сигнатурой. Например,create function convrt_val (in_1 dollar, in_2 aus_dollar)….create function convrt_val (in_1 aus dollar, in_2 euro)…create function convrt_val (in_1 euro, in_2 aus_dollar)…Сервер БД при выборе, какую из перегруженных функций вызывать, будеториентироваться на тип передаваемых в нее параметров. Одно из основных различиймежду UDR и хранимыми процедурами – хранимые процедуры выполняются на CPU ВП,а UDR могут быть сконфигурированы для выполнения на определенном пользователемВП (user-defined VP UDVP) или ВП определенного класса. Одно из преимуществ IDS –возможность определить определенный пользователем ВП (user-defined VP UDVP).Определенные пользователем ВП – это псевдонимы ВП CPU-класса, но поскольку ониэлементами пользователя, а не экземпляра, следовательно, выполняются в ОС какпроцессы пользователя informix, а не root. Владельцем процессов экземпляра, благодаряиспользованию setuid, является пользователь root. Проблемой может стать исполнениеUDR на ВП класса CPU. Так как UDR написана на Java/C, то ничего не препятствует ейвызвать функции ОС, выполняться которые будут с привилегиями root, что оченьнежелательно с точки зрения безопасности, особенно если функция не была тщательнопротестирована. Процесс связывания UDR с определенным UDVP довольно прост. Сначала вы создаетеUDVP, используя параметр VPCLASS файла $ONCONFIG или команду onmode. Затем вкоманде регистрации UDR используете ключевое слово class
    • create function convrt_val (in_1 dollar, in_2 aus_dollar)class=”convrt_vp”external name “/opt/IBM/Informix/11_5/extend/cnvrt_funcs.so”language C not variant....Триггеры, как и хранимые процедуры, тоже пишутся на смеси SQL и SPL ипредоставляют похожие возможности. Пользователи не могут вызывать триггеры;экземпляр вызывает триггер, когда происходит действие, отслеживаемое этим триггером.Например, триггер может быть вызван после обновления строки в таблице. Вы можете,например, создать триггер, который вызывается при обновлении только определенногостолбца таблицы. Часто триггеры в свою очередь вызывают хранимые процедуры илиUDR. В ранних версиях IDS на таблицу мог быть создан один триггер на вставку, один наудаление и несколько триггеров на обновление. В IDS 11 можно иметь несколькотриггеров на каждое действие над таблицей. Триггеры могут быть созданы для трех случаев – before, for each row, after. Когда наодну операцию создано несколько триггеров, они срабатывают в таком порядке – сначалатриггер before, затем for each row, затем after. В этом случае не нужно беспокоиться опорядке срабатывания триггеров. Функционал триггеров также был существенно расширен в IDS 10. раньше триггер былчерным ящиком. Когда наступало событие, отслеживаемое триггером, он запускался ичто-то делал, а вам оставалось ждать, пока он завершит свои действия без возможностипосмотреть, а что в этом триггере происходит. В IDS 10 введена возможностьинтроспекции триггера (trigger introspection), которая позволяет использовать APIDataBlade и специальные функции для просмотра выполнения триггера. Например, можнопросмотреть, какой уникальный идентификатор будет присвоен строке триггером,изменить значения переменных в триггере. Более подробно об этой возможности выможете почитать в IBM Informix DataBlade API Programmer’s Guide. С помощью триггеров, UDR, хранимых процедур вы можете реализовать бизнес-логикуне в приложении, а непосредственно в базе данных.Ограничения и индексыОграничения и индексы используются для увеличения производительности запросов,отслеживания связи между элементами данных, задания допустимых значений дляданных. Хотя индексы и ограничения поддерживаются Informix уже давно, но иногдавозникает непонимание разницы между ними. Отчасти это вызвано тем, что в выводеутилиты dbschema ограничения могут быть представлены как индексы с забавнымиименами. Давайте подробнее рассмотрим разницу между индексами и ограничениями, атакже использование каждого из них с точки зрения производительности и целостностисистемы.Логическая разница между ограничениями и индексами Один из частых вопросов – в чем разница между ограничением уникальности, первичнымключом и уникальным индексом (unique constraint, a primary key and a unique index). Ответсостоит из двух частей. С точки зрения логики разработки БД каждый из этих элементовиграет отдельную роль. Во вторых, хотя все эти элементы построены на использованиииндексов, но IDS по разному управляет индексами, ключами и ограничениями.
    • Давайте рассмотрим ограничения, ключи и индексы с точки зрения логикипроектирования. Ограничения используются для обеспечения правил бизнес-логики в таблице. Ониделятся на две группы. Во первых, ограничения могут использоваться для обеспеченияуникальности строк. Например, имя заказчика должно быть уникально в таблицеcustomer, а комбинация идентификатора пользователя и адреса доставки должна бытьуникальна в таблице address. Такие ограничения реализуются с использованием индексови называются ограничениями на основе индекса (index-based constraints). Второй типограничений – ограничения проверки (check constraints), которые используются дляопределения допустимых значений столбца. Например, сумма минимального заказадолжна быть больше 50. такие ограничения реализуются не с помощью индексов, а спомощью правил, встроенных в схему таблицы.Первичные и внешние ключи являются еще одним типом ограничений. Ключииспользуются для определения ссылочной целостности между таблицами – частоиспользуется также термин «главный-подчиненный». Ключи не позволяют вставить вподчиненную таблицу записи, для которых нет соответствия в главной таблице, а такжепрепятствуют удалению из главной таблицы записей, для которых есть соответствующиезаписи в подчиненной таблице. На Рисунке 6.3 приведен пример такого проектирования для системы обработки заказов.Уникальный идентификатор покупателя – customer ID является первичным ключом иоднозначно идентифицирует покупателя в системе. Строка в таблице order должнасодержать действительный идентификатор покупателя (внешний ключ на таблицуcustomer) и уникальный номер заказа – первичный ключ. Таблица деталей заказа должнасодержать действительный номер заказа (внешний ключ на таблицу order). В примерепоказано, что таблица может иметь и первичный ключ, и внешний ключ(и). Если выудалите строку из одной из этих таблиц, не удалив соответствующие строки в другихтаблицах, то система будет работать неправильно. По умолчанию IDS не разрешаетудалять из родительской таблицы строки, для которых есть соответствующие строки вдочерних таблицах. Если в команде создания внешнего ключа указать on delete cascade,то при удалении родительской строки автоматически будут удалены все подчиненныестроки. Вы можете использовать эту возможность для уменьшения размера кода на SQL.Перед удалением родительской записи должны быть удалены все соответствующие ейдочерние записи. Если при удалении родительской строки невозможно удалить хотя быодну дочернюю строку, то вся операция удаления родительской строки будет откачена, ини одна строка не будет удалена.Индексы следует использовать только для повышения скорости выполнения запросов.Поэтому я считаю, что администратор БД никогда не должен создавать уникальныеиндексы на таблице. Если требуется уникальность, то ее нужно реализовать с помощьюограничения. Как я уже говорил выше, ограничения могут реализовываться на основеиндексных структур. Оптимизатор может использовать эти структуры для ускорениявыполнения запросов.Разница в управленииInformix по разному обрабатывает ограничения и индексы. Эта разница в обработкевлияет на процесс выполнения SQL-запросов и, как следствие, на написание клиентскихприложений. Ваша задача, как администратора IDS, помогать разработчикам учитыватьэти особенности. Функциональные отличия ограничений от индексов таковы:  индексы обрабатываются (enforced) немедленно, вне зависимости от состояния транзакции и режима журналирования БД  ограничения обрабатываются (enforced) в конце транзакции
    • например, предположим, что у нас есть таблица заказчиков, в которой первичным ключомявляется столбец типа integer, начальное значение которого равно 1. вы хотите, чтобы 10первых идентификаторов не использовались. Для решения этой задачи можно написатьпримерно такой запрос:begin work;lock table customer in exclusive mode;update customer set cust_id=(cust_id+10);Если для столбца cust_id задан уникальный индекс, то операция обновления завершитсяошибкой при попытке обновления первой строки. Идентификатор cust_id первой строкидолжен быть изменен с 1 на 11, но значение 11 уже есть в индексных структурах, поэтомуиндекс препятствует изменению строки. Если для столбца cust_id задано ограничение уникальности (unique constraint), тотранзакция будет завершена успешно, поскольку проверка уникальности будетпроизводится после обновления всех строк. Если столбец cust_id является родительскимпо отношению к столбцам других таблиц, то дочерние таблицы должны быть обновленыраньше, чем родительская, для чего необходимо перевести ограничения в отложенныйрежим (setting constraints to deferred mode) . По умолчанию IDS обрабатывает ограничения в конце транзакции. Это не являетсяпроблемой для транзакций с одной операцией, наподобие приведенной выше. Ситуацияслегка меняется, если в транзакции выполняется несколько операций. В этом случаеограничения обрабатываются после каждого выражения add, update,delete в транзакции.В случае наличия связи мастер-деталь, обработка ограничений после каждого выражениявызывает откат транзакции, поскольку данные не обновляются во всех необходимыхтаблицах. Решить эту проблему можно выполнив перед началом транзакции SQL-командуset constraints deferred. После выполнения этой команды ограничения будут обработаныпосле выполнения всех операторов в транзакции. Установка deferred-режима обработкиограничений влияет только на ту транзакцию, в которой сделана эта установка. Послеподтверждения или отката транзакции режим обработки соответствующих ограниченийбудет выставлен в immediate.Как создавать ограничения.Как уже упоминалось в начале, есть два типа ограничений – типа check и на основеиндекса, ограничения каждого типа создаются по-разному.Ограничения типа checkЭти ограничения используются для того, чтобы данные в одном или нескольких столбцахнаходились в заданном диапазоне значений. Такими диапазонами могут быть «больше,чем», «меньше, чем», «между». Ограничение check отличается от значения по умолчаниютем, что последнее применяется только в том случае, если во время вставки новой строкив таблицу для столбца не указано другое значение (отличное от значения по умолчанию). Создать ограничение этого типа можно несколькими путями. Например, так:create table division (division_no smallint, division_name char(16), check (division_no>5) constraint chk_div_divno);Можно изменить существующую таблицу и добавить в нее необходимое ограничение:alter table category add constraint check (category_no<25) constraint chk_cat_catno;
    • Обратите внимание, что в обеих примерах ограничение присвоено имя (chk_div_divno впервом примере и chk_cat_catno во втором). Давать имя ограничению не обязательно, ноочень-очень желательно. Если вы не именуете ограничение или внешний ключ, то это имяим даст сервер БД. Нельзя сказать, что оно будет понятным для пользователя. Например,вот вывод схемы таблицы, при создании которой имя ограничения указано не было:create table “db_a”.division (division_no smallint, division_name char(20), check (division_no>5) constraint “db_a”._110_crom1);Использование имен также позволяет вам поддерживать стандарты именования длякоординации логической и физической модели БД.Ограничения на основе индекса (index-based constraints)Как следует из названия, эти ограничения создаются на основе некоторого индекса.Существует два типа ограничений на основе индекса – ключи для поддержанияссылочной целостности (первичные и внешние ключи referential integrity keys) иограничения уникальности(unique constraints). Создавать ограничения на основе индекса рекомендуется в два шага – сначала создатьсоответствующий индекс, а затем - необходимое ограничение. Например, для созданияограничения ссылочной целостности между двумя таблицами можно использоватьследующие команды:create unique index ix_divsn_1 on division(division_no) in danube_index_1;alter table division add constraint primary key(division_no) constraint pk_divsn_1;create index ix_strsls_2 on store_sales(division_no) in danube_index_2;alter table store_sales add constraint foreign key(division_no) references division constraint fk_strsls_1;Создать ограничение уникальности можно так:create unique index ix_cust_2 on customer(customer_name) in danube_index_3;alter table customer add constraint unique(customer_name) constraint uc_cust;При таком создании ограничений будет создан только один индекс (смотрите следующийраздел), хотя утилита dbschema для таблицы покажет оба объекта (индекс и ограничение).При работе с ограничениями, если вы хотите удалить его, никогда не удаляйте индекс,на основе которого создано ограничение, или информацию об этом ограничении изтаблицы sysconstraints. Для удаления ограничения используйте только команду alter table,иначе придется разворачивать экземпляр из архива. Поверьте, я уже пробовал. Один раз.
    • Фрагментирование ограничений.Посмотрев на синтаксис создания ограничений, видно, что фрагментировать ограничениятак, как фрагментируют индексы, нельзя. Ограничения на основе индекса должнысоздаваться в том же db-пространстве, что и сама таблица. В случае фрагментированнойтаблицы такое поведение ограничений негативно влияет на производительность. Дляограничений типа check вышеприведенное рассуждение не подходит, так как для такихограничений индексы не создаются. Обойти эту проблему можно так. Индекс может быть превращен в ограничение, хотяобратное неверно. Это значит, что вы можете, например, создать уникальный индекс снекоторой схемой фрагментирования для таблицы. Затем, с помощью команды alter table,можно добавить ограничение уникальности по тем же столбцам, которые используютсядля создания индекса – существующий индекс будет использован для функционированияв качестве ограничения. Именно по этой причине для создания ограничений на основеиндекса я использую двухшаговый процесс, описанный в предыдущем разделе. Имяограничения, созданного с помощью этого метода, не будет совпадать с именем индекса.Вам необходимо самостоятельно задать имя ограничения или позволить экземплярусделать это за вас. После обновления уникального индекса до ограничения илипервичного ключа утилита dbaccess для таблицы покажет только исходный индекс.Однако dbschema покажет и индекс, и ограничение. Предупреждение из предыдущегораздела остается в силе – не удаляйте индекс, на котором построено ограничение, -сначала удалите ограничение, затем индекс. Такой метод фрагментирования ограничений работает для всех ограничений на основеиндекса. Я настойчиво рекомендую его даже в том случае, когда таблицы или индексы нефрагментируются. Он позволяет быстро выделить определения индексов и ограничений,что может быть полезно при подготовке экспорта БД на другую систему. Ниже я болееподробно расскажу об этом.Наполнение базы данных данными.Итак, вы создали базу данных, таблицы, индексы, ограничения, UDR, хранимыепроцедуры. Настало время залить в базу данные. Для выполнения этой задачи естьнесколько утилит, каждая из которых имеет свои преимущества и недостатки. Некоторыеиз них, например, High Performance Loader, я могу описать только очень кратко, поэтомуне забудьте проконсультироваться с документацией, которая идет в составе дистрибутива.DbimportПервой мы рассмотрим программу dbimport, которая используется в паре с dbexport ипредназначена для создания всего окружения БД, а затем наполнения таблиц базыданными, которые хранятся в плоских файлах. База данных создается как часть импорта,поэтому проблем с запрещением доступа пользователей к базе во время работыпрограммы не возникает. На время импорта/экспорта база данных блокируется вэксклюзивном режиме и, как упоминалось выше, базу желательно создавать безжурналирования. Если вывод dbexport делается на ленту, то командный файл можносохранить не на ленту, а на диск. Вы можете отредактировать этот файл, но не меняйтепорядок таблиц в файле, типы данных в таблице, не добавляйте/удаляйте столбцы, так какв противном случае возникнет ошибка при попытке загрузки файлов. В новых версияхIDS формат командного файла внесены некоторые усовершенствования для облегченияработы. Раньше сначала для таблицы выполнялись все DDL-выражения, а затем в неезаливались данные. Если для таблицы были заданы индексы и/или ограничения, тоутилита создавала эти индексы и ограничения, а затем проводила загрузку данных втаблицу с индексом, что плохо влияло на производительность. В современных версияхсоздание индексов, ограничений и соответствующие команды alter table описаны в концекомандного файла и выполняются после заливки данных в таблицы. Команды создания
    • процедур и триггеров также расположены в конце командного файла. В результате вовремя загрузки данных в таблицы не возникает дополнительной нагрузки на сервер. Вреальном мире это очень хорошо, поскольку триггеры и хранимые процедуры обработализаливаемые данные в оригинальной БД.SQL-команда loadЭта команда является наименее гибкой из всех обсуждаемых. Ее можно использовать дляобработки малых и средних объемов данных в журналируемой БД или больших объемовданных в нежурналируемой БД или сырой таблице. эта команда читает плоский ASCII-файл с разделителями (delimited ASCII flat file) и загружает данные в столбцы целевойтаблицы. В зависимости от наличия индексов для целевой таблицы загрузка данныхможет быть проведена очень быстро. Во время работы этой команды пользователи могутполучить доступ к целевой таблице, если только при запуске команды load не былавыставлена эксклюзивная блокировка таблицы. При использовании команды load может возникнуть целый букет проблем. Вжурналируемой БД эта команда выполняется как единая транзакция, как результат,возможно возникновение длинной транзакции. Для уменьшения количества необходимыхблокировок вы можете установить эксклюзивную блокировку на таблицу, но в этомслучае пользователи не смогут работать с такой таблицей. Еще одна проблема –отсутствие механизма обработки ошибок в плоском файле. Например, если в поле,которое должно быть загружено в столбец numeric, содержится алфавитный символ, товозникнет ошибка преобразования типов, и сервер откатит весь процесс. утилита ведетсчет загруженных строк, что позволяет идентифицировать проблемную строку в плоскомфайле.Утилита dbloadПри работе с плоскими файлами обеспечивает большую гибкость, чем SQL-команда loadили утилита dbimport. С помощью dbload можно выполнять следующие задачи:  загружать файлы с разделителями, без разделителей или фиксированной длины (delimited, fixed-length, non-delimited files)  загружать столбцы  не загружать первые n строк таблицы  записывать проблемные строки в файл-журнал одновременн