29 июня 2017

Установка Oracle на ASM с SECTOR_SIZE=4K

Столкнулся с проблемой установки Oracle DB 11.2.0.4 на ASM с размером сектора 4К.
Решение ниже...

Как известно, почти все винчестеры после 2009 года выпуска используют размер сектора 4К. Соответственно, я стараюсь все экземпляры Oracle ставить с этим размером сектора -- создаю, разделы, выравненные по границе 4К, переключаю redo-логи в режим 4К и создаю дисковые группы с размером сектора 4K.
Разумеется, ОС тоже должна поддерживать сектор 4К и понимать, что это диск с 4К. Это проверяется fdisk'ом



Или командами blockdev

Значение параметра для ASM задаётся на этапе конфигурирования ASM
/usr/sbin/oracleasm configure -I

И хранится в файле /etc/sysconfig/oracleasm


Нельзя менять этот параметр после создания дисковых групп -- данные станут нечитаемы.

Проверить, какой сейчас используется размер сектора для дисковых групп можно запросом под SYS
select NAME as DISKGROUP_NAME, SECTOR_SIZE from V$ASM_DISKGROUP




Пока датафайлы находятся на файловой системе -- проблем не возникает.

Но установка на ASM, с дискгруппами с размером сектора 4K, не удаётся со следующей ошибкой на этапе создания экземпляра:

PRCR-1079: Failed to start resource ora.orcl.db
CRS-5017: The resource action "ora.orcl.db start" encountered the folowing error:
ORA-01078: failure in processing system parameters. For details refer to "(:CLSN00107:)" in "/oracle/product/11.2.0/grid/log/orasrv/agent/ohasd/oraagent_oracle/oraagent_oracle.log"
CRS-2674: Start of 'ora.orcl.db' on 'orasrv' failed.



Эта ошибка описана в нескольких статьях, например:
https://chandlerdba.com/2015/07/20/oracle-on-4096-4k-sector-disks-dont-work-ish/
https://flashdba.com/2014/02/06/oracle-fixes-the-4k-spfile-problem-but-its-still-broken/

Проблема состоит в том, что экземпляр Oracle DB не может прочитать SPFILE с ASM 4K при старте.
Если экземпляр запустить с помощью PFILE, то потом он с SPFILE на ASM 4K работает нормально -- работают команды

alter system set PARAMETER=VALUE scope=spfile;
create pfile=<path> from spfile=<path>;
create spfile=<path> from pfile=<path>;

Но вот запуститься он таким образом не может.

Вот что написано в первой статье:

The fundamental problem is that, if you have a 4K sector and are using ASM, having your SPFILE in ASM doesn’t work. This was spotted in 11.2.0.3 (Doc: 16870214.8) but wasn’t fixed in 11.2.0.4.0 (it’s fixed by 11.2.0.4.6, possibly earlier) and it’s not fixed in 12.1.0.2.0 base release. Which mean the -MGMTDB will always fail to create. Itis fixed by patch set 3 12.1.0.2.3 (path 20485724)

Т.е. даже в 12.1 не пофиксили.



РЕШЕНИЕ

ASM подхоящее место, чтобы собрать все файлы БД, но дело в том, что SPFILE не обязан находиться на ASM, если это не RAC.
Таким образом, для обхода этой проблемы просто перемещаем SPFILE с ASM на файловую систему.

При создании БД через DBCA это делается следующим образом:

Проходим все шаги до конца, снимаем галку с поля "Создать БД" и ставим галку в поле "Создать скрипты".
Редактируем скрипты и подменяем путь к SPFILE c ASM на локальный диск <ORACLE_HOME>/dbs.
Это нужно сделать в трёх местах

NB: В моём случае БД называется ORCL. Замените на своё имя.


В файле postDBcreation.sql

1)
create spfile='+DATA/ORCL/spfileORCL.ora' FROM pfile='/oracle/admin/ORCL/scripts/init.ora';

заменить на 
create spfile='/oracle/product/11.2.0/dbhome_1/dbs/spfileORCL.ora' FROM pfile='/oracle/admin/ORCL/scripts/init.ora';


В файле ORCL.sql

2)
host /oracle/product/11.2.0/dbhome_1/bin/srvctl add database -d ORCL -o /oracle/product/11.2.0/dbhome_1 -p +DATA/ORCL/spfileORCL.ora -n ORCL -a "DATA,FRA"

заменить на
host /oracle/product/11.2.0/dbhome_1/bin/srvctl add database -d ORCL -o /oracle/product/11.2.0/dbhome_1 -p /oracle/product/11.2.0/dbhome_1/dbs/spfileORCL.ora -n ORCL -a "DATA,FRA"

3)
host echo "SPFILE='+DATA/ORCL/spfileORCL.ora'" > /oracle/product/11.2.0/dbhome_1/dbs/initORCL.ora

заменить на
host echo "SPFILE='/oracle/product/11.2.0/dbhome_1/dbs/spfileORCL.ora'" > /oracle/product/11.2.0/dbhome_1/dbs/initORCL.ora

После этого выполняем стартовый скрипт ORCL.sh

Такое решение не поможет на кластере (RAC), но можно попробовать разместить SPFILE на shared storage на файловой системе (не на ACFS), если такой storage у вас есть.