| Есть вещи, о которых солдатам надлежит ведать, и есть вещи которых им лучше не знать. | |
| Отон у Тацита в «Истории» |
Фирма Oracle прочит ASM в перспективу, и в версии 11, помимо усовершенствований (хотя без радикальных новшеств), добавила в документацию по СУБД отдельную книгу, Storage Administrator's Guide. Основную ценность ASM фирма, судя по заявлениям, видит в применении этого механизма к большим установкам, в первую очередь кластерным (RAC), использующим «сотни» дисковых устройств. Не исключено, что в будущем пользователям Oracle придется иметь дело с ASM как с основным механизмом. Поэтому, несмотря на то, что (а) в сегодняшней практике ASM редкость, и что (б) будучи новой, эта техника, как водится, требует выдержки временем1, разумно присматриваться к ней уже сейчас.
Ниже рассматривается пример организации ASM, доступный для воспроизведения на обычной, не кластерной платформе. Не потребуется даже иметь дело с неформатированными разделами диска, так как в данном случае допускается их имитация обычными файлами ОС. Для определенности, пример относится к Windows. Многие необходимые подправки для Unix очевидны. Более полно материал для Unix превосходно изложен в статье Manually Creating an ASM Instance (Jeff Hunter) (далее [1]), из которой я много позаимствовал2.
Пример приводится для версии 10.2.0.3.0 СУБД.
Выдаем в ОС:
>localconfig reset
На Windows CSS оформлена как служба ОС, но запускать и останавливать ее можно и из командной строки, например:
>ocssd start
О других действиях можно узнать, выдав:
>ocssd --help
Обратите внимание, чтобы имя пользователя ОС не содержало русских букв.
На Unix CSS оформлена как демон cssd. При ближайшем рассмотрении [ORACLE_HOME]/bin, localconfig оказывается сценарием для командной оболочки ОС (.bat или .sh).
my $s='0' x 2**20;open (DF1, ">C:/asmdisks/_file_disk1") || die "Cannot create file - $!\n"; open (DF2, ">C:/asmdisks/_file_disk2") || die "Cannot create file - $!\n"; open (DF3, ">D:/asmdisks/_file_disk3") || die "Cannot create file - $!\n"; open (DF4, ">D:/asmdisks/_file_disk4") || die "Cannot create file - $!\n";
for ( my $i = 1; $i < 100; $i++ ) { print DF1 $s; print DF2 $s; print DF3 $s; print DF4 $s; }
exit
Желающие могут отнестись к такому файлу утилитарно, но нетрудно понять, что здесь создаются четыре файла, содержащие 100 раз по 1024*1024 знаков '0', то есть по 100 мегабайтов. Заставить программу проработать можно следующими действиями:
>mkdir c:\asmdisks >mkdir d:\asmdisks >set ORACLE_HOME=c:\oracle\product\10.2.0\db_1 >set PERL_HOME=%ORACLE_HOME%\perl\5.8.3\bin\MSWin32-x86-multi-thread >%PERL_HOME%\perl Createtextfiles.pl
Если на тренировочной машине одно дисковое устройство, все файлы придется разместить на нем.
Подготовить экземпляр +ASM можно, во-первых, средствами DBCA (для этого в DBCA версии 10 были введены несколько специальных форм), а во-вторых, вручную. Здесь рассматривается именно второй вариант, который в большей степени способен дать понимание происходящему.
>mkdir c:\oracle\product\10.2.0\admin\+asm\bdump >mkdir c:\oracle\product\10.2.0\admin\+asm\cdump >mkdir c:\oracle\product\10.2.0\admin\+asm\udump
Все же +ASM – вырожденый экземпляр СУБД, создаваемый по техническим причинам, а не для обслуживания доступа к какой-либо БД, а потому файл с параметрами для него может выглядеть необычно просто, например:
background_dump_dest = c:\oracle\product\10.2.0\admin\+ASM\bdump core_dump_dest = c:\oracle\product\10.2.0\admin\+ASM\cdump user_dump_dest = c:\oracle\product\10.2.0\admin\+ASM\udumpinstance_type = ASM compatible = 10.2.0.3.0 # для определенности
large_pool_size = 12M # можно и больше, например, 64M, если потребуется
remote_login_passwordfile = exclusive
_asm_allow_only_raw_disks = FALSE # этот пример без "сырых" устройств asm_diskstring = 'c:\asmdisks\_file*', 'd:\asmdisks\_file*' # возможно групповое указание файлов
Файл размещается по правилам INIT.ORA. Назовем его init+ASM.ora и разместим в %ORACLE_HOME%\database (в Unix – в $ORACLE_HOME/dbs).
Неочевидны специальная забота о LARGE_POOL_SIZE и обратное, необязательность SHARED_POOL_SIZE (в нашем случае легко проверить, что SGA_TARGET окажется = 0).
Параметр _ASM_ALLOW_ONLY_RAW_DISKS является недокументированным и неофициальным.
Параметр ASM_DISKSTRING ссылается на созданные предварительно файлы, имитирующие неформатированные устройства для размещения дисковых групп.
Другие возможные параметры, здесь не указанные:
>oradim -new -asmsid +ASM -startmode manual >oradim -edit -asmsid +ASM -startmode auto
Перевод службы в режим автозапуска обсуждаем; главное – так, или иначе обеспечивать запуск +ASM ранее экземпляров СУБД, использующих +ASM на компьютере (но после запуска демона cssd).
Далее как обычно:
>set ORACLE_SID=+ASM >sqlplus / AS SYSDBA
Версия 11 отнеслась более серьезно к разграничению доступа и ввела специальную привилегию SYSASM, так что подключаться начиная с нее следует так:
>sqlplus / AS SYSASM
В SQL*Plus набираем, как обычно:
SQL> STARTUP
Необычным будет результат: легко удостовериться, что СУБД перейдет в состояние STARTED, а не OPEN.
Кроме того, в ответ мы, скорее всего, увидим ошибку. Она вызвана тем, что +ASM не воспринимает наши файлы, как «дисковые группы»; не знает, как их использовать.
COLUMN path FORMAT A30 SELECT group_number , disk_number , mount_status , header_status , state , path FROM v$asm_disk . SAVE asm_disks @asm_disks
Чтобы превратить эти разделы в дисковые группы, можно выдать:
CREATE DISKGROUP prima_data1 NORMAL REDUNDANCY FAILGROUP controller1 DISK 'c:\asmdisks\_file_disk1', 'c:\asmdisks\_file_disk2' FAILGROUP controller2 DISK 'd:\asmdisks\_file_disk3', 'd:\asmdisks\_file_disk4' ;
Создана дисковая группа со свойством «нормальной избыточности» (NORMAL REDUNDANCY), запрещающей наличие менее двух групп отказа. Можно было указать HIGH REDUNDANCY (не менее трех групп отказа) или EXTERNAL REDUNDANCY (достаточно одной). Названия групп отказа можно было явно не задавать. Результаты выполненной команды можно наблюдать такими запросами:
COLUMN name FORMAT A15 SELECT group_number , name , total_mb , free_mb, state , type FROM v$asm_diskgroup . SAVE asm_diskgroup @asm_diskgroup @asm_disks
Другие сведения о конфигурации ASM можно посмотреть в нескольких прочих таблицах с именами LIKE 'V$ASM%'.
CONNECT /@prima.class AS SYSDBA CREATE TABLESPACE users2 DATAFILE '+prima_data1' SIZE 5M;
Проверка:
SQL> COLUMN name FORMAT A60 SQL> SELECT file#, name FROM v$datafile;FILE# NAME ---------- ----------------------------------------------------- 1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIMA\SYSTEM01.DBF 2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIMA\UNDOTBS01.DBF 3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIMA\SYSAUX01.DBF 4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIMA\USERS01.DBF 5 +PRIMA_DATA1/prima/datafile/users2.256.639862169
К новому «файлу» можно обращаться как к обычному, например:
ALTER DATABASE DATAFILE '+PRIMA_DATA1/prima/datafile/users2.256.639862169' RESIZE 10M ;
Но поскольку это может показаться неудобным, для таких названий можно заводить псевдоним (alias). Подробности имеются в документации по Oracle.
«Файл» вполне работоспособен:
CONNECT scott/tiger@prima.class CREATE TABLE emp2 TABLESPACE users2 AS SELECT * FROM emp;
CONNECT /@prima.class AS SYSDBA SHUTDOWN IMMEDIATE CONNECT / AS SYSDBA SHUTDOWN HOST del d:\asmdisks\_file_disk3 STARTUP @asm_diskgroup @asm_disks ALTER DISKGROUP prima_data1 MOUNT; @asm_diskgroup @asm_disks CONNECT /@prima.class AS SYSDBA STARTUP SELECT COUNT ( * ) FROM scott.emp2;
Сценарии asm_diskgroup.sql и asm_disks.sql были выданы для диагностики.
Восстановить утерянный файл помогут следующие действия. Воссоздадим файл d:\asmdisks\_file_disk3 программой на Perl указанным выше образом. Затем выполним следующую последовательность действий:
CONNECT /@prima.class AS SYSDBA ALTER TABLESPACE users2 OFFLINE; CONNECT / AS SYSDBA ALTER DISKGROUP prima_data1 DISMOUNT; SHUTDOWN STARTUP ALTER DISKGROUP prima_data1 MOUNT; ALTER DISKGROUP prima_data1 ADD FAILGROUP controller2 DISK 'd:\asmdisks\_file_disk3' ; CONNECT /@prima.class AS SYSDBA ALTER TABLESPACE users2 ONLINE; SELECT COUNT ( * ) FROM scott.emp2;
При необходимости файл можно восстанавливать в любом другом надежном месте. Уточнить происходящее помогает своевременная выдача запросов в asm_diskgroup.sql и asm_disks.sql.
Упражнение. Повторить пример с потерей файлов, удалив, а затем восстановив, сразу два из них: d:\asmdisks\_file_disk3 и d:\asmdisks\_file_disk4.
1Отзывы первопроходцев не все были благоприятными, но уже в версии 10.2 картина улучшилась.
2В интернете есть и другие статьи на эту тему, все вместе удивительно перекликающиеся общими моментами. В то же время [1] содержит ряд обозначений их документации по Oracle. Однако статья [1] является наиболее ясным и полным описанием, встреченным мною.