Поднятие версии Oracle, со сменой операционки имени и т.д.

Задача: надо перенести базу данных с windows сервера  Oracle 11.2.0.3 на linux сервер Oracle 12.0.2.0.

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

Но есть полный дубль прод-кластера.

Соответсвенно план следующий

  1. Берем инкрементальный бэкап и разворачиваем его на дубле прода(для красоты картины меняем SID)
  2. Создаем холодный бэкап с дубля и переносим его на Linux
  3. Поднимаем бэкап на Linux на Oracle 11
  4. Проводим апгрейд до 12 Oracle
  5. Переносим Базу в ASM

1.  Перенос инкрементального бэкапа на дубль прода

Для простоты и картины делаем новый горячий бэкап

C:\Users\admin_db_app>set NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
C:\Users\admin_db_app>set ORACLE_BASE=c:\app\oracle
C:\Users\admin_db_app>set ORACLE_HOME=c:\app\oracle\product\11.2.0\dbhome_1
C:\Users\admin_db_app>set ORACLE_SID=EISGS002
C:\Users\admin_db_app>rman target /
RMAN> RUN {
crosscheck archivelog all;
delete expired archivelog all;
BACKUP  AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0 
DATABASE FORMAT 'E:\BACKUP_cold\BCK_%d_%U' 
PLUS ARCHIVELOG FORMAT 'E:\BACKUP_cold\ARC_%d_%U';
BACKUP CURRENT CONTROLFILE FORMAT 'E:\BACKUP_cold\control.bck';
DELETE NOPROMPT OBSOLETE;
}

После этого копируем все содержимое папки на сервер дубля прода, допустим в папку D:/BACKUP

Запускаем процесс поднятия бэкапа

C:\Users\admin_db_app>set ORACLE_HOME=c:\app\oracle\product\11.2.0\dbhome_1
C:\Users\admin_db_app>set ORACLE_SID=EISGS032
C:\Users\admin_db_app>set ORACLE_UNQNAME=EISGS03
C:\Users\admin_db_app>rman target /
RMAN>shutdown immediate;
RMAN>startup nomount pfile='c:\pfile_for_restore';
RMAN>exit
C:\Users\admin_db_app>rman auxiliary /
RMAN> duplicate database to eisgs03 backup location 'D:/BACKUP';
RMAN>exit;

2. После того, как база поднялась останавливаем все инстансы ноды и делаем холодный бэкап

C:\Users\admin_db_app>rman target /
RMAN> startup mount;
RMAN> RUN {
crosscheck archivelog all;
delete expired archivelog all;
BACKUP  AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0 
DATABASE FORMAT 'D:\BACKUP_4_oda\BCK_%d_%U' 
PLUS ARCHIVELOG FORMAT 'D:\BACKUP_4_oda\ARC_%d_%U';
DELETE NOPROMPT OBSOLETE;
}

Копируем получившийся бэкап на ODA

3. Поднимаем бэкап на Linux на Oracle 11

Переходим на Linux

создаем необходимые папки на дисках

[oracle@odadb1]$ mkdir -p /u01/app/oracle/admin/eisgs03/adump
[oracle@odadb1]$ mkdir -p /u02/app/oracle/oradata/datastore/EISGS03/CONTROLFILE/
[oracle@odadb1]$ mkdir -p /u02/app/oracle/oradata/flashdata/EISGS03/CONTROLFILE/
[oracle@odadb1]$ mkdir -p /u02/app/oracle/oradata/flashdata/EISGS03/ARCHIVELOG
-----
[oracle@odadb2]$ mkdir -p /u01/app/oracle/admin/eisgs03/adump

После этого на обеих нодах в оракловые настройки добавляем новую базу для этого открываем редактор vi /etc/oratab куда добавляем запись eisgs03:/u01/app/oracle/product/11.2.0.3/dbhome_1:N

Запускаем восстановление базы. Для этого, определяем файл бэкапа содержащий контрольник, в общем случае это файл размером 1-2 Mb, если ошибемся с файлом ничего страшного rman ругнется но ничего не запортится.
итак считаем что бэкап лежит в папке: /u02/app/oracle/oradata/datastore/bck_eisgs03/
Файл бэкапа называется: DB_0LRUNBJG_1_1

[oracle@odadb1 ~]$ . oraenv
ORACLE_SID = [oracle] ? eisgs03
The Oracle base has been set to /u01/app/oracle
[oracle@odadb1 ~]$ export ORACLE_SID=eisgs031
[oracle@odadb1 ~]$ rman target /

Recovery Manager: Release 11.2.0.3.0 - Production on Thu Mar 23 12:00:56 2017

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: EISGS03 (DBID=2708297186)

RMAN> startup nomount pfile='/u01/app/oracle/pfile03.ora';
RMAN>restore controlfile from '/u02/app/oracle/oradata/datastore/bck_eisgs03/DB_0LRUNBJG_1_1';
RMAN> alter database mount;
RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/fast_recovery_area/datastore/eisgs03/snapcf_eisgs03.f';
RMAN> catalog start with '/u02/app/oracle/oradata/datastore/bck_eisgs03/';
RMAN>crosscheck backup;
RMAN>delete expired backup;
RMAN>report schema;  // тут смотрим какие тэйблспейсы есть и перечисляем их все в следующем скрипте
RMAN>run{
 sql  'alter database flashback off';
    set newname for TABLESPACE SYSTEM to NEW;
    set newname for TABLESPACE SYSAUX to NEW;
    set newname for TABLESPACE USERS to NEW;
    set newname for TABLESPACE EXAMPLE to NEW;
    set newname for TABLESPACE STREAMS_TS to NEW;
    set newname for TABLESPACE UNDOTBS1 to NEW;
    set newname for TABLESPACE UNDOTBS2 to NEW;
    set newname for TEMPFILE 1 to NEW;
    set newname for TEMPFILE 2 to NEW;
    restore database;
    switch DATAFILE all;
    switch TEMPFILE all;
}
RMAN>alter database open resetlogs;
RMAN> exit

Создаем spfile

[oracle@odadb1 ~]$ sqlplus / as sysdba
SQL>create spfile='/u02/app/oracle/oradata/datastore/eisgs03/EISGS03/spfileeisgs03.ora' from pfile='/u01/app/oracle/pfile03.ora';

прописываем ссылку на вновь созданный spfile ini файле обоих инстансов для этого открываем редактор vi /u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/initeisgs032.ora или vi /u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/initeisgs031.ora соответсвенно
и определяем что в файле должна быть только одна строка:
spfile=’/u02/app/oracle/oradata/datastore/eisgs03/EISGS03/spfileeisgs03.ora’
перестрартуем базу чтобы spfile поднялся.
После этого определяем FRA

[oracle@odadb1 ~]$ sqlplus / as sysdba
SQL>alter system set db_recovery_file_dest='/u02/app/oracle/oradata/flashdata/EISGS03/ARCHIVELOG' scope=spfile;
SQL>alter system set log_archive_dest='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile;
SQL>exit;

Регистрируем базу в кластере

[oracle@odadb1 ~]$ srvctl add database -d eisgs03 -o /u01/app/oracle/product/11.2.0.3/dbhome_1
[oracle@odadb1 ~]$ srvctl add instance -d eisgs03 -i eisgs032 -n odadb2
[oracle@odadb1 ~]$ srvctl add instance -d eisgs03 -i eisgs031 -n odadb1
[oracle@odadb1 ~]$ srvctl start database -d eisgs03

Выполняем цепочку скриптов, для преапгрейда

[oracle@odadb1 ~]$ sqlplus / as sysdba
SQL>@/u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/admin/catbundle.sql psu apply
SQL>@/u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/admin/utlrp.sql   --Перекомпилируем все объекты
SQL>exec DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION(); -- Убиваем стримы
SQL>drop user streamadmin cascade; -- убиваем пользователя
SQL>SELECT name,description from SYS.V$PARAMETER WHERE name LIKE '\_%' ESCAPE '\';  -- Проверяем что у нас нет никаких скрытых параметров
SQL>select owner, object_name from dba_objects where status='INVALID'; -- Проверяем есть ли у нас объекты инвалидные объекты
SQL>drop package sys.XDB_MIGRATESCHEMA; -- если есть в схеме sys - убиваем
SQL>select * from all_wm_versioned_tables; -- Убеждаемся что у нас нет никаких версионированных таблиц
SQL>@/u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/admin/owmuinst.plb -- Пересоздание Oracle Workspace Manager
SQL>@/u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/admin/owminst.plb
SQL>@/u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/admin/utlrp --Перекомпилируем все объекты
SQL>select owner, object_name from dba_objects where status='INVALID';
SQL>alter session set nls_language='American';
SQL>@/tmp/install/dbupgdiag.sql
SQL>exit
[oracle@odadb1 ~]$cd /u01/app/oracle/product/11.2.0.3/dbhome_1/rdbms/temp/
[oracle@odadb1 temp]$$sqlplus / as sysdba
SQL>@preupgrd.sql
SQL>exit
[oracle@odadb1 temp]$ sqlplus / as sysdba
SQL>SET echo ON
SQL>set SERVEROUTPUT ON
SQL>@emremove.sql
SQL>EXECUTE dbms_preup.purge_recyclebin_fixup;
SQL>show parameter job
SQL>execute dbms_stats.gather_dictionary_stats;
SQL>select owner, object_name from dba_objects where status='INVALID';
SQL>truncate table sys.aud$;
SQL>truncate table sys.fga_log$;
SQL>alter system set recyclebin=off scope=spfile;
SQL>shutdown immediate;
SQL>startup
SQL>purge recyclebin;
SQL>PURGE DBA_RECYCLEBIN;
SQL>show recyclebin
SQL>truncate table sys.recyclebin$;
SQL>execute dbms_stats.gather_table_stats('SYS','RECYCLEBIN$');
SQL>alter system set recyclebin=on scope=spfile;
SQL>exit;

На всякий случай создаем бэкап

[oracle@odadb1 ~]$ rman target /
RMAN>list archivelog all;
RMAN>delete archivelog all;
RMAN>exit
[oracle@odadb1 ~]$ srvctl stop database -d eisgs03
[oracle@odadb1 ~]$ rman target /
RMAN>startup mount;
RMAN>backup full database TAG "BEFORE_UPGRADE" plus archivelog TAG "BEFORE_UPGRADE";
RMAN>backup current controlfile TAG "BEFORE_UPGRADE_CTL" ;
RMAN>shutdown immediate
RMAN>exit
[oracle@odadb1 ~]$ srvctl start database -d eisgs03
После этого запускаем непосредственно upgrade
[oracle@odadb1 ~]$ dbua

1
Тут просто выбираем что мы будем поднимать базу

2
Определяем которую

3
Assistant проводит проверку все ли Ok. Нам нужно добиться того, чтобы не было error’ов(это обязательно) и warning’ов (Это уже опционально)

4
Определякс количество потоков

5
Убираем галочку с EM- будем потом юзать внешнюю

6

Смело говорим, что у нас свой бэкап

7

Проверяем

8
Молимся

Ок получили что все прошло как надо.

Теперь надо перенести базу в ASM

для этого создаем новый бэкап

[oracle@odadb1 ~]$ . oraenv
ORACLE_SID = [oracle] ? eisgs03
[oracle@odadb1 ~]$ export ORACLE_SID=eisgs031
[oracle@odadb1 ~]$ srvctl stop database -d eisgs03
[oracle@odadb1 ~]$ rman target /
RMAN> startup mount;
RMAN> backup full database tag='BEFORE_ASM';
RMAN> backup current controlfile tag='BEFORE_ASM_CTL';
RMAN>shutdown immediate;
RMAN> startup nomount pfile='/u01/app/oracle/pfile12_eisgs03'
-- ищем файл контрольника он где-то /u02/app/oracle/oradata/flashdata/EISGS03/ARCHIVELOG/EISGS03/backupset/текущяа_дата/файл содержащий BEFORE_ASM_CTL
RMAN> restore controlfile from '/u02/app/oracle/oradata/flashdata/EISGS03/ARCHIVELOG/EISGS03/backupset/имя файла
RMAN>run{
 sql  'alter database flashback off';
    set newname for TABLESPACE SYSTEM to NEW;
    set newname for TABLESPACE SYSAUX to NEW;
    set newname for TABLESPACE USERS to NEW;
    set newname for TABLESPACE EXAMPLE to NEW;
    set newname for TABLESPACE STREAMS_TS to NEW;
    set newname for TABLESPACE UNDOTBS1 to NEW;
    set newname for TABLESPACE UNDOTBS2 to NEW;
    set newname for TEMPFILE 1 to NEW;
    set newname for TEMPFILE 2 to NEW;
    restore database;
    switch DATAFILE all;
    switch TEMPFILE all;
}
RMAN>alter database open resetlogs;
RMAN> exit

Создаем spfile

[oracle@odadb1 ~]$ sqlplus / as sysdba
SQL>create spfile='+DATA/EISGS03/spfileeisgs03.ora' from pfile='/u01/app/oracle/pfile12_eisgs03';

прописываем ссылку на вновь созданный spfile ini файле обоих инстансов для этого открываем редактор vi /u01/app/oracle/product/12.0.2.0/dbhome_1/dbs/initeisgs032.ora или vi /u01/app/oracle/product/12.0.2.0/dbhome_1/dbs/initeisgs031.ora соответсвенно
и определяем что в файле должна быть только одна строка:
spfile=’+DATA/EISGS03/spfileeisgs03.ora’
перестрартуем базу чтобы spfile поднялся.

Для старта xdb

SQL> column ftp_protocol format a10
SQL> column http_protocol format a10
SQL> column http2_protocol format a10
SQL> column http_host format a10
SQL> column http2_host format a10
SQL> select ftp_port,ftp_protocol,http_port,http_protocol,http_host,http2_port,http2_protocol,http2_host from  xdb.xdb$root_info;


SQL>EXECUTE DBMS_XDB.SETFTPPORT (2122);
SQL>EXECUTE DBMS_XDB.SETHTTPPORT ( 8081);
SQL> ALTER SYSTEM REGISTER;

SQL>ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(SERVICE=EISGS03XDB)' SCOPE = SPFILE;
SQL>EXIT
[oracle@odadb1 ~]$ srvctl stop database -d eisgs03
[oracle@odadb1 ~]$ srvctl start database -d eisgs03

Открываем доступ на temp

; === От SYS ===
; Права
begin  
  -- windows OS dbms_java.grant_permission('PNH_FORMS', 'SYS:java.io.FilePermission', pnh_forms.getjavaprop('java.io.tmpdir') || '\*', 'read,write,delete' );
  /*Linux OS*/ dbms_java.grant_permission('PNH_FORMS', 'SYS:java.io.FilePermission', pnh_forms.getjavaprop('java.io.tmpdir') || '/*', 'read,write,delete' );
  dbms_java.grant_permission( 'PNH_FORMS', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );
  dbms_java.grant_permission( 'PNH_FORMS', 'SYS:oracle.aurora.security.JServerPermission', 'Verifier', '' );
end;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *