From: Олег Иванов <oivanov@fors.com.>
Newsgroups: email
Date: Mon, 19 Nov 2006 18:21:07 +0000 (UTC)
Subject: Миграция базы данных с 9i на 10gR2 в Oracle Applications 11i
Обновление экспортом базы данных с версии 9.0.5 на 10.2.0.2
в Oracle e-Business suite версии 11.5.10.2
Цель: избавиться от большого числа файлов, улучшить структуру объектов,
тем самым ускорить работу продукта
полезные Notes:230627.1 362203.1
1. УСТАНОВКА ПО 10.2.0.2
Подготовить машину, для RHEL4 update 4, в /etc/sysctl.conf проверить параметры
CREATE UNIQUE INDEX IBC_DIRECTORY_NODES_B_U2 ON IBC_DIRECTORY_NODES_B
(DIRECTORY_PATH, NODE_TYPE)
PCTFREE 10 INITRANS 11 TABLESPACE APPS_TS_TX_IDX;
CREATE INDEX ZPB_TASK_PARAMETERS_N2 ON ZPB_TASK_PARAMETERS (NAME, VALUE)
PCTFREE 10 INITRANS 11 TABLESPACE APPS_TS_TX_IDX;
не влезают в меньший блок и выдадут ошибку
ORA-01450: maximum key length (3118) exceeded
первый индекс 5+5+(400*8)+5 байт, во втором программист издевался:
поставил размер 3175+30. В третьем - не забивал себе голову - сделал
столбцы размером 100+4000.
Если создавать табл. пространства с одинаковым размером экстента, то
UNIFORM SIZE должен быть больше 40К (и кратен 5 блокам)
так как определения LOBов содержат параметр CHUNK 32768 (описание в Note:281571.1)
Если размер DB_BLOCK_SIZE=8192 нет проблем.
Это определение можно не выгружать меняя catexp.sql
или отредактировать файл экспорта, но редакторы его не берут из-за размера.
Можно написать программу на C или java и заменять CHUNK 32768 на пробелы.
LOBы во всех пространствах - разработчики не заботились об отдельном ТБС для них.
пример сообщения об ошибке:
IMP-00017: following statement failed with ORACLE error 3252:
CREATE TABLE "ODM_PMML_DTD" ("DTD" CLOB) PCTFREE 10 TABLESPACE "ODM" NOCOMPRESS
LOB ("DTD") STORE AS (TABLESPACE "ODM" ENABLE
STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE)
ORA-03252: initial extent size not enough for LOB segment
10.2.0.2 база создается примерно полчаса, половина времени уходит на форматирование больших файлов.
Нужно создать табличные пространства с теми же именами, что в исходной базе
данных, по одному файлу для каждого ТБС. Размер можно сделать сразу большим
как в исходной базе.
Установить переменные окружения в профиле пользователя-владельца ПО:
LD_LIBRARY_PATH=/lib:/usr/lib:$ORACLE_HOME/lib
так как 10.2.0.2 криво скомпилирован и ругается в alert.log, что не может найти библиотеку.
NLS_LANG=AMERICAN_AMERICA.UTF8
так как в imp ошибка, он делает двойное перекодирование
Параметры инициализации можно взять из Note:216205.1
проблема с MDSYS, в 10.2 отсутствуют необходимые объекты.
Например, тип GEOCODE_RESULT нужен для WIRELESS.MYGEOCODER Из 9i взять файл и выполнить
cd /oracle/visora/9.2.0/md/admin
alter user mdsys identified by mdsys account unlock;
connect mdsys/mdsys
@sdogcdr.sql
@prvtgcdr.plb
можно создать представление sys.ad_extents, если оно есть - оно не импортируется.
set long 100000
spool adextents.sql
select TEXT from dba_views where VIEW_NAME='AD_EXTENTS';
spool off
сконфигурировать листенер 10.2 (параметры взять из 9.2) и запустить его.
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)
#in minutes
SQLNET.EXPIRE_TIME = 2
#in seconds
SQLNET.SEND_TIMEOUT = 25
#in seconds, выдаст ORA-12535 если клиент ничего не пошлет после соединения
#SQLNET.RECV_TIMEOUT=60
#in seconds, если клиент не авторизуется
SQLNET.INBOUND_CONNECT_TIMEOUT = 8
#чтобы никто не подсоединялся к базе
tcp.validnode_checking=yes
tcp.invited_nodes=(127.0.0.1,IPсерверов)
2. ПОДГОТОВКА ИСХОДНОЙ БАЗЫ К МИГРАЦИИ
в Note:230627.1 написано, что нужно установить патчи
4872830 provides the adclondb.sql
4775612 ставится полчаса, компилирует DLL (проверить что /usr/gcc указывает на gcc296
а /usr/bin/g++ на g++296) и другие объекты
выполнять adgrants.sql из этого патча не нужно - он старый. Нужно выполнить
такой же файл из директории с базой данных. ОБЯЗАТЕЛЬНО установив ORACLE_HOME
указывающий на базу и погасив процессы Applications
sqlplus '/ as sysdba' @adgrants.sql APPLSYS
этот скрипт обходит необходимость выставления O7_DICTIONARY_ACCESSIBILITY=TRUE
создаст файл adcrdb.sql в котором команда создания базы и ТБС, файл бессмысленный
cd /oracle/visappl/au/11.5.0/patch/115/sql
sqlplus "/ as sysdba" @$AU_TOP/patch/115/sql/auque1.sql
создаст auque2.sql который надо запустить после импорта, чтобы активировать
работу с очередями после импорта
Note:235422.1 выполнить на исходной базе под SYS
declare
cursor c1 is select unique rule_owner ro from dba_rules union all
select unique rule_set_owner ro from dba_rule_sets union all
select unique evaluation_context_owner ro from dba_evaluation_contexts;
stmt varchar2(1000);
begin
for c1_rec in c1 loop
dbms_rule_adm.grant_system_privilege(
privilege => dbms_rule_adm.CREATE_EVALUATION_CONTEXT_OBJ,
grantee => c1_rec.ro, grant_option => TRUE);
dbms_rule_adm.grant_system_privilege(
privilege => dbms_rule_adm.CREATE_RULE_SET_OBJ,
grantee => c1_rec.ro, grant_option => TRUE);
dbms_rule_adm.grant_system_privilege(
privilege => dbms_rule_adm.CREATE_RULE_OBJ,
grantee => c1_rec.ro, grant_option => TRUE);
stmt := 'grant aq_user_role to ' || c1_rec.ro;
execute immediate stmt;
end loop;
end;
скопировать catexp.sql добавить ВСЮДУ где перечислены пользователи
(exu81obj exu8usr и т.п.) пользователей. Они служебные в 10g, а в 9i
простые:
,'MDDATA','OLAPSYS','DMSYS','OUTLN','DBSNMP'
insert into noexp$ select 'SYSTEM', 'HELP', 2 from sys.dual where not exists
(select 'x' from sys.noexp$ where name = 'HELP' AND owner = 'SYSTEM');
COMMIT;
выполнить отредактированный скрипт
исключать схему SYSTEM из экспорта нельзя, там есть таблицы типа BROWSER_PROFILE, IAP
проверить результат запроса к view, если отличается пересоздать
(создается catexp.sql):
CREATE OR REPLACE VIEW exu81csc (release) AS SELECT '8.1.0.0.0' FROM DUAL;
записать результат:
select * from global_name;
select username, default_tablespace from dba_users where username='CTXSYS' or username='OLAPSYS';
select OWNER,TRIGGER_NAME from dba_triggers where STATUS='DISABLED';
select OWNER,NAME from DBA_QUEUES where ENQUEUE_ENABLED='NO';
select OWNER,NAME from DBA_QUEUES where DEQUEUE_ENABLED='NO';
select OWNER,OBJECT_NAME,OBJECT_TYPE, status from dba_objects where status<>'VALID';
разобраться почему объекты INVALID, а триггера DISABLED
мигрировать korean lexer ДО ЭКСПОРТА
exec ctx_ddl.create_preference('ko_morph_lexer','korean_morph_lexer');
alter index "ICX"."ICX_QUES_CTX" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "APPS"."IBE_CT_IMEDIA_SEARCH_IM" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."CS_FORUM_MESSAGES_TL_N4" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."CS_INCIDENTS_ALL_TL_N1" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."CS_KB_ELEMENTS_TL_N2" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."CS_KB_SETS_TL_N3" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."CS_KB_SOLN_CAT_TL_N1" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
alter index "CS"."SUMMARY_CTX_INDEX" rebuild parameters ('REPLACE LEXER ko_morph_lexer');
в панели администрирования выполнить очистку данных параллельных
запросов с параметрами
(Все, Число,1,....нет,Да)
если процесс висит после успешной очистки FND_TEMP_FILES, то Note:238415.1
FNDCPPUR пытается удалить несуществующие файлы. Это бывает, если клонировать
базу и не обновить пути или не перетащить файлы логов.
можно их создать:
select 'echo > '||LOGFILE_NAME from applsys.FND_CONCURRENT_REQUESTS where LOGFILE_NAME is not null;
select 'echo > '||OUTFILE_NAME from applsys.FND_CONCURRENT_REQUESTS where OUTFILE_NAME is not null;
delete from applsys.fnd_conc_request_arguments where request_id in
(select request_id from applsys.fnd_conc_request_arguments minus select request_id from applsys.fnd_concurrent_requests);
также может подвисать на очистке FND_ENV_CONTEXT. Скорость удаления строк 5000 в минуту,
а там может быть 10млн.строк. Для ускорения в 60 раз можно:
остановить concurrents
drop index applsys.fnd_env_context_u1;
create index applsys.fnd_env_context_u1 on applsys.fnd_env_context (concurrent_process_id,variable_name)
pctfree 10 tablespace apps_ts_tx_idx logging;
запустить работу по удалению. 10млн строк удалит за 20 минут.
по таблице FND_CONFLICT_DOMAIN Note:386385.1 Patch.4574592
select count(*) from apps.fnd_env_context e where not exists
(select 'X' from apps.fnd_concurrent_processes p
where p.concurrent_process_id=e.concurrent_process_id);
создает zip архив с утилитами, который надо будет раскрыть в $OH 10.2
$AU_TOP/bin/admkappsutil.pl
раскрыть полученный appsutil.zip в корне $OH 10.2
выполнить под apps процедуры (Note:277124.1)
exec WF_PURGE.ITEMS
exec WF_PURGE.ACTIVITIES
exec WF_PURGE.NOTIFICATIONS
exec WF_PURGE.TOTAL
exec WF_PURGE.TOTALPERM
exec WF_PURGE.ADHOCDIRECTORY
select item_type,activity_status,count(*) from wf_item_activity_statuses
group by item_type,activity_status;
select item_type,count(*) from wf_item_attribute_values group by item_type;
select consumer_name, msg_state, count(*) from aso.aq$aso_order_feedback_t
group by consumer_name, msg_state;
Select Q_Name, State, Count(*) From Aso.Aso_Order_Feedback_T Group By Q_Name, State;
$ASO_TOP/patch/115/asoclofq.sql
11i постоянно и массировано под себя ходит и в $APPL_TOP/admin/log/ лежат файлы
eventsX.log и errorX.log которые заодно можно удалить после остановки процессы Applications
выполнить скрипт подготовки к клонированию
cd $ORACLE_HOME/appsutil/scripts/<CONTEXT_NAME>
perl adpreclone.pl dbTier
3. ЭКСПОРТ
прямой экспорт может дать ошибку на одной из таблиц со старым ROWID,
поэтому проще выгружать обычным экспортом, разница в скорости несущественна
перед экспортом погасить процессы Applications, убедиться по списку процессов,
что они остановились, перегрузить экземпляр, дать
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
недостаточно привилегий у APPS. чтобы не было ошибок
IMP-00060: Warning: Skipping table "APPLSYS"."WF_NOTIFICATION_OUT"
because object type "SYS"."AQ$_JMS_OBJECT_MESSAGE"
does not exist or has different identifier
12 таблиц, все кроме WF_NOTIFICATION_OUT пустые
через 1-10 мин. после начала импорта, когда пользователи будут созданы, дать:
grant execute on DBMS_SYS_SQL to system;
grant execute on DBMS_SYS_SQL to OWAPUB;
grant execute on dbms_sql to APPS;
grant execute on dbms_pipe to APPS;
grant execute on dbms_lock to APPS;
grant execute on dbms_lock to EDWREP;
grant execute on dbms_space_admin to APPS;
grant execute on dbms_system to APPS;
grant execute on dbms_alert to APPS;
grant execute on dbms_pipe to OWAPUB;
grant execute on DBMS_REPCAT_INTERNAL_PACKAGE to ASG;
#EDWREP.WBSECURITYHELPER
grant select on DBA_ROLE_PRIVS to EDWREP;
grant select on V_$SESSION to EDWREP;
#grant execute on dbms_aqadm to applsys;
#system.defcall
grant execute on dbms_defer_query_utl to system;
через 2-60 минут после начала импорта:
есть продукт E Data Warehouse, в котором много таблиц через dblink
с этой же базой, так как у приличного варехауза должны быть MView и dblinkи :)
dblinkов может много накопиться, если они не нужны их можно удалить.
проверить до экспорта параметры dblink APPS.EDW_APPS_TO_WH и APPS.APPS_TO_APPS
убедиться, что есть запись в TNS_NAMES и запущен листенер
или вручную создать пользователя apps и создать линки
connect apps/apps
alter session set global_names=false;
drop database link EDW_APPS_TO_WH;
drop database link APPS_TO_APPS;
create database link EDW_APPS_TO_WH connect to apps identified by apps using 'VIS';
create database link APPS_TO_APPS connect to apps identified by apps using 'VIS';
select * from dba_db_links where db_link in ('APPS_TO_APPS','EDW_APPS_TO_WH');
после или в процессе импорта посмотреть логфайл на ошибки.
сначала идут ошибки создания табличных пространств. Их можно игнорировать,
если пользователи у которых оно DEFAULT уже созданы, если нет - импорт прервется
при попытке импортировать объекты в несуществующих пользователей.
ошибки на SYSTEM.REPCAT$* можно игнорировать - ничего не импортируется
в DEF$_DESTINATION вставлено 2 строки роли не играют, можно удалить
в AQ$_QUEUE_UPGRADE_TMP вставлено 4 строки заполнялась при переходе с 8 версии, роли не играет
предупреждения table contains ROWID column, values may be obsolete можно
игнорировать, если дальше стоит 0 rows imported
не создается много индексов, а объектные индексы создаются с ошибкой. Ошибки:
DRG-12606: error encountered while parsing COLUMNS list
ORA-00904: "CTXSYS"."HZDQM"."MCT": invalid identifier
Причина: не импортируется пакет.
Bug 5635146
select name, text from all_source where UPPER(name) = 'HZDQM' and owner = 'CTXSYS'
and text like '%$Header%' order by name;
не выдаст строк, надо выполнить
sqlplus apps/apps @/oracle/visappl/ar/11.5.0/patch/115/sql/arhdqcp1.sql APPS CTXSYS AR
склеить текст из лога для индексов, которые не создалить и пересоздать их.
Можно посмотреть как пересоздать индексы и схему CTXSYS в Note:292996.1, 312640.1, но выполнить
рекомендации их до импорта нельзя
если перед экспортом не мигрировать koren lexer будут ошибки, Note:362203.1 для импорта не поможет:
DRG-13201: KOREAN_LEXER is desupported
ORA-13249: Rebuild_index parameter cannot be specified in CREATE INDEX
ORA-02001: user SYS is not permitted to create indexes with freelist groups
ORA-13231: failed to create index table [MDRT_49E4E$] during R-tree creation
если APPLSYS.WF_CONTROL или ODM.DMS_QUEUE_TABLE не импортируется IMP-00060: из-за
SYS.AQ$_JMS_USERPROPARRAY значит в импорте параметры не подействовали - их вбивали
в командной строке, а она импортом обрезается.
Оценка скорости операций: скорость диска:
iostat -k -x -d 2
формирование пустых блоков 6Мб/c
журнальные файлы лучше вынести на отдельный диск - 8Мб/c
чтение дампа 5Мб/c
запись в файлы данных 5-14Мб/c
переключение 500мб логфайлов раз в 1,5мин
импорт идет 5,5-9,5 часов. 164 переключений журнала, общий объем 85Гб
после импорта 16645 объектов INVALID.
Note 372263.1
перейти в $AD_TOP/patch/115/sql (/oracle/visappl/ad/11.5.0/patch/115/sql/)
sqlplus "/ as sysdba" @/oracle/visappl/ad/11.5.0/patch/115/sql/adctxpkg.sql manager CTXSYS APPS
cd $APPL_TOP/admin/adgrants.sql (/oracle/visora/9.2.0/appsutil/sql/)
sqlplus "/ as sysdba" @/oracle/visora/9.2.0/appsutil/sql/adgrants.sql APPLSYS
select a.table_owner||'.'||a.synonym_name from dba_synonyms a,dba_objects b where
status='INVALID' and object_type='SYNONYM' and a.synonym_name=b.object_name;
Note:380480.1 из них 83 синонима на объекты несуществующих пользователей:
select a.table_owner||'.'||a.synonym_name from dba_synonyms a,dba_objects b
where status='INVALID' and object_type='SYNONYM' and
a.synonym_name=b.object_name and a.table_owner not in
(select username from dba_users);
удалить их
spool dropsynonyms.sql
select 'DROP PUBLIC SYNONYM '||a.synonym_name||';' from dba_synonyms a,dba_objects b
where status='INVALID' and object_type='SYNONYM' and a.synonym_name=b.object_name
and a.table_owner not in (select username from dba_users);
spool off
скомпилировать объекты:
execute utl_recomp.recomp_serial();
после перекомпиляции за 13 минут всё должно скомпилироваться, кроме
может быть пакетов EGO*
после импорта очереди AQ запрещены. Нужно разрешить как в Note:357011.1