Выделение табличных пространств

Все данные Informix хранятся в табличных пространствах, или просто пространствах (dbspace).

Если вы хотите только попробовать работать с Informix, дополнительные табличные пространства можно не выделять. Все, что вы создаете в СУБД, будет размещаться в корневом пространстве (пока там не закончится место). Можно сразу перейти к созданию базы данных.

В реально работающей системе корневое пространство обычно используют только для хранения служебных баз данных sys*, а все остальные массивы информации размещают в отдельных пространствах. Это позволяет минимизировать риск переполнения корневого пространства (Informix очень болезненно реагирует на такое переполнение).

Рекомендуется выделить следующие пространства:

  1. Пространство данных - место, где вы будете размещать ваши собственные базы данных
  2. Одно или несколько временных пространств - в них будут располагаться временные таблицы, временные файлы, создаваемые СУБД при выполнении сложных запросов, временные файлы для сортировки и т.п.
  3. Пространство для размещения журналов транзакций

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

Замечание. Термин "табличное пространство" не вполне корректен, поскольку в пространстве могут находиться не только таблицы. В оригинальной документации пространство обозначается словом "dbspace" - то есть пространство баз данных. К сожалению, мне пока не удалось подобрать русское слово, наиболее точно соответствующее этому понятию.

Informix хранит все свои данные в пространствах. Корневое пространство (rootspace) существует всегда. Координаты корневого пространства указываются в файле конфигурации СУБД ($INFORMIXDIR/etc/$ONCONFIG или просто onconfig). Координаты всех остальных пространств сохраняются в служебной базе данных (sysmaster) и в конфигурации не указываются.

Пространство - это логическая группа блоков дисковой памяти. Эти блоки называются чанками (chunks). Чанки размещаются в физических файлах операционной системы. Один чанк может либо занимать какой-то файл целиком, либо занимать только часть этого файла.

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

Координаты чанка определяются тремя параметрами:

Небольшое уточнение относительно корневого пространства: в файле конфигурации СУБД указываются координаты первого чанка этого пространства. Координаты всех остальных чанков хранятся в служебной базе sysmaster.

Порядок создания пространств и чанков

Выделение нового чанка происходит в две стадии:

Подготовка файла для чанка

Чанк может размещаться либо в обычном файле в файловой системе, либо на так называемом сыром устройстве - например, в физическом разделе жесткого диска или на логическом томе, созданном каким-либо менеджером томов (например, LVM). Следует заметить, что сырые устройства бывают двух видов - байт-ориентированные (символьные) и блочные. Для размещения чанков Informix можно использовать только символьные тома.

Начнем с варианта - файл в файловой системе. Итак, нужно:

  1. создать физический файл
  2. установить права доступа к файлу
  3. (не обязательно) создать ссылку на файл

Создание физического файла в файловой системе - самое простое дело:

	/usr/informix > touch имя_файла
	/usr/informix >

Установка прав доступа: файл должен принадлежать пользователю informix, группе informix и должен быть доступен для чтения и записи только этому пользователю и этой группе:

	/usr/informix > chown informix:informix имя_файла
	/usr/informix > chmod 660 имя_файла
	/usr/informix >

Создать ссылку на файл - в принципе не обязательно, но в ряде случаев может быть удобно. Дело в том, что имя файла, содержащего чанк, записывается в служебные базы в том виде, как его указал администратор. При этом СУБД все равно, чему соответствует указанное имя - реальному файлу или ссылке на него. Указание реального имени приведет к тому, что файл затем будет нельзя (или будет сложно) перенести в другое место. Это особенно неудобно, если чанк помещен в сырой раздел - имя файла, обозначающего этот раздел (как и имя любого специального файла) изменять не следует. Так что рекомендую делать ссылки всегда.

	/usr/informix > ln -s имя_файла ссылка
	/usr/informix >

Регистрация чанка

Регистрация чанка выполняется командой onspaces. Как у большинства команд, у нее много параметров (попробуйте onspaces --help). При регистрации чанка обязательны четыре:

Просмотр списка табличных пространств и чанков

Перед тем, как создавать что-то новое, следует вначале осмотреться и понять, что мы имеем на данный момент. Для просмотра списка имеющихся пространств и чанков воспользуемся командой onstat -d

	/usr/informix > onstat -d

	IBM Informix Dynamic Server Version 11.70.FC7 -- On-Line -- Up 00:03:32 -- 432924 Kbytes

	Dbspaces
	address          number   flags      fchunk   nchunks  pgsize   flags    owner    name
	5ac3c028         1        0x60001    1        1        2048     N  BA    informix rootdbs
	 1 active, 2047 maximum

	Chunks
	address          chunk/dbs     offset     size       free       bpages     flags pathname
	5ac3c1d0         1      1      0          400000     163611                PO-B-- /Spaces/rootspace
	 1 active, 32766 maximum

	NOTE: The values in the "size" and "free" columns for DBspace chunks are
	      displayed in terms of "pgsize" of the DBspace to which they belong.

	Expanded chunk capacity mode: always

	/usr/informix >

Полученная распечатка состоит из двух частей. Первая часть - с заголовком Dbspaces - содержит список табличных пространств. Вторая часть - с заголовком Chunks - содержит список уже имеющихся чанков. В нашем примере показано состояние дисковой памяти непосредственно после инициализации СУБД: имеется только одно пространство - корневое пространство rootdbs, и это пространство состоит из единственного чанка, размещенного в файле /Spaces/rootspace.

В листинге выделены имя пространства и координаты чанка.

Информация о табличном пространстве занимает одну строку и включает:

Информация о чанке занимает тоже только одну строку и включает:

Выделение табличного пространства

Создадим новое пространство, в котором будем размещать наши базы данных. Назовем его "sp1" (от space 1). Физический файл поместим в каталог /fs2/Spaces, сам файл назовем space1_chunk1 (первый чанк первого пространства). Выделим под этот файл 20 гигабайт памяти.

	/usr/informix 1> touch /fs2/Spaces/space1_chunk1
	/usr/informix 2> chown informix:informix /fs2/Spaces/space1_chunk1
	/usr/informix 3> chmod 660 /fs2/Spaces/space1_chunk1
	/usr/informix 4> ln -s /fs2/Spaces/space1_chunk1 /Spaces/s01c01
	/usr/informix 5> onspaces -c -d sp1 -p /Spaces/s01c01 -o 0 -s 20000000

	Verifying physical disk space, please wait ...
	Space successfully added.

	** WARNING **  A level 0 archive of Root DBSpace will need to be done.

	/usr/informix 6> 

Для удобства команды в примере пронумерованы; номер указан в тексте приглашения к вводу

  1. создание файла
  2. задание владельца файла и группы-владельца
  3. установка прав доступа
  4. создание символической ссылки на файл
  5. создание нового пространства

Первые четыре команды мы уже использовали, когда создавали файл для корневого пространства. Это были подготовительные действия. Реальное создание пространства происходит по пятой команде - onspaces. Ее параметры:

Теперь посмотрим, что у нас получилось.

	/usr/informix > onstat -d

	IBM Informix Dynamic Server Version 11.70.FC7 -- On-Line -- Up 00:10:14 -- 432924 Kbytes

	Dbspaces
	address          number   flags      fchunk   nchunks  pgsize   flags    owner    name
	5ac3c028         1        0x60001    1        1        2048     N  BA    informix rootdbs
	5ac3c8e8         2        0x60001    2        1        2048     N  BA    informix sp1
	 2 active, 2047 maximum

	Chunks
	address          chunk/dbs     offset     size       free       bpages     flags pathname
	5ac3c1d0         1      1      0          400000     163611                PO-B-- /Spaces/rootspace
	5ac3ca90         2      2      0          10000000   19999947              PO-B-- /Spaces/s01c01
	 2 active, 32766 maximum

	NOTE: The values in the "size" and "free" columns for DBspace chunks are
	      displayed in terms of "pgsize" of the DBspace to which they belong.

	Expanded chunk capacity mode: always

	/usr/informix >

Итак, мы видим, что появилось еще одно пространство с именем sp1 и еще один чанк.

Обратите внимание на следующие важные обстоятельства:

Итак, пространство выделено, но использовать его на самом деле пока нельзя. Об этом говорит предупреждение A level 0 archive of Root DBSpace will need to be done. Попросту говоря, СУБД не будет использовать новое пространство до тех пор, пока вы не сделаете ее архивирование.

Архивирование мы пока не настраивали, а работать хочется. Что ж, у нас имеется возможность сделать фиктивный архив - пометить экземпляр СУБД как архивированный, не делая реальной копии.

	/usr/informix > onbar -b -F
	/usr/informix > 

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

Выделение пространства для временных объектов

В оригинальной документации такие пространства называют "temp spaces". Они предназначены для размещения разного рода временных объектов, создаваемых либо пользователями, либо самой СУБД. Временными объектами могут быть:

Для краткости будем называть такие пространства временными (хотя существуют они постоянно)

Если временное пространство не выделено, все перечисленные объекты создаются в корневом пространстве, что увеличивает нагрузку на него и создает риск его переполнения.

В нагруженных системах часто создают несколько временных пространств - в этом случае СУБД может использовать их одновременно, распределяя массивы данных между ними, что может способствовать ускорению работы, так как операции с разными пространствами могут выполняться параллельно.

Для примера создадим временное пространство размером 2 Гбайт. Файл первого чанка этого пространства разместим на отдельном носителе (физическом диске) в файловой системе fs4

	/usr/informix 11> touch /fs4/Spaces/tmp1
	/usr/informix 12> chown informix:informix /fs4/Spaces/tmp1
	/usr/informix 13> chmod 660 /fs4/Spaces/tmp1
	/usr/informix 14> ln -s /fs4/Spaces/tmp1 /Spaces/tmp1
	/usr/informix 15> onspaces -c -d temp1 -t -p /Spaces/tmp1 -o 0 -s 2000000

	Verifying physical disk space, please wait ...
	Space successfully added.

	** WARNING **  A level 0 archive of Root DBSpace will need to be done.

	/usr/informix 16> onbar -b -F
	/usr/informix 17> 

Как видно, все очень похоже на операцию добавления основного (табличного) пространства. Единственное отличие - флаг -t в команде onspaces. Именно этот флаг (temporary) указывает на необходимость создания временного пространства. Что ж, посмотрим, что получилось:

	/usr/informix > onstat -d

	IBM Informix Dynamic Server Version 11.70.FC7 -- On-Line -- Up 00:10:14 -- 432924 Kbytes

	Dbspaces
	address          number   flags      fchunk   nchunks  pgsize   flags    owner    name
	5ac3c028         1        0x60001    1        1        2048     N  BA    informix rootdbs
	5ac3c8e8         2        0x60001    2        1        2048     N  BA    informix sp1
	5e39d230         3        0x42001    3        1        2048     N TBA    informix temp1
	 3 active, 2047 maximum

	Chunks
	address          chunk/dbs     offset     size       free       bpages     flags pathname
	5ac3c1d0         1      1      0          400000     163611                PO-B-- /Spaces/rootspace
	5ac3ca90         2      2      0          10000000   19999947              PO-B-- /Spaces/s01c01
	5e39d3d8         3      3      0          1000000    999947                PO-B-- /Spaces/tmp1
	 3 active, 32766 maximum

	NOTE: The values in the "size" and "free" columns for DBspace chunks are
	      displayed in terms of "pgsize" of the DBspace to which they belong.

	Expanded chunk capacity mode: always

	/usr/informix >

Видно, что добавилось еще одно пространство. Признаком того, что оно - временное, служит символ T в колонке flags.

Еще одна тонкость. Хотя пространство выделено, СУБД не будет использовать его в качестве временного - до тех пор, пока не получит на это разрешения. Чтобы дать такое разрешение, необходимо отредактировать конфигурационный файл onconfig. Для этого нужно найти в файле параметр DBSPACETEMP и добавить в качестве его значения имя нашего нового пространства. Строка будет выглядеть примерно так:

	DBSPACETEMP   temp1

После этого, так как менялся конфигурационный файл, СУБД нужно перезапустить.

	/usr/informix 20> onmode -ky
	/usr/informix 21> oninit
	/usr/informix 22> 

Временное пространство готово к использованию.

Типы пространств

onspaces -c -d имя ...
пространство для обычных данных
onspaces -c -d имя -t ...
пространство для временных данных
onspaces -c -P имя ...
пространство для размещения физического журнала
onspaces -c -b имя ...
пространство для больших двоичных данных (blob space)
onspaces -c -S имя ...
пространство для расширенных двоичных данных (smartblob space)
onspaces -c -x имя ...
пространство для внешних данных

Теперь пришло время для создания базы данных.