Задача: надо перенести базу данных с 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;