Задача: надо перенести базу данных с windows сервера Oracle 11.2.0.3 на linux сервер Oracle 12.0.2.0.
Дополнительная проблема: база которую надо переносить это прод, который останавливать крайне не желательно, а для межплатформенного переноса данных нужен холодный бэкап.
Но есть полный дубль прод-кластера.
Соответсвенно план следующий
- Берем инкрементальный бэкап и разворачиваем его на дубле прода(для красоты картины меняем SID)
- Создаем холодный бэкап с дубля и переносим его на Linux
- Поднимаем бэкап на Linux на Oracle 11
- Проводим апгрейд до 12 Oracle
- Переносим Базу в 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

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

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

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

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

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

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

Проверяем

Молимся
Ок получили что все прошло как надо.
Теперь надо перенести базу в 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;