Введение
В первой части статьи была рассмотрена основная проблема при миграции СУБД Oracle с RISC-платформ на Linux x86 — различие в форматах хранения (Endian) и необходимость конвертации блоков в файлах данных при миграции. Также кратко была описана технология миграции с помощью транспортируемых табличных пространств, включая вариант с инкрементальными резервными копиями, который позволяет снизить время простоя (downtime) при миграции.
В второй части статьи был описан алгорим миграции с помощью технология Full Transportable Export/Import (FTEX) с использованием скриптов M5, поставляемых компанией Oracle.
В третьей части статьи были описаны проблемы возникающие при миграции крупных промышленных баз и приведены возможные варианты их решения.
Необходимость создания данной, четвертой части статьи, возникла потому-что не был рассмотрен новый способ миграции с помощью транспортируемых табличных пространств. Эта технология появилась начиная с Oracle Database 12.2, и позволяет еще больше упростить миграцию.
Кросплатформенное копирование табличных пространств по сети
Начиная с версии Oracle Database 12.2 появилась новая технология: RMAN Cross Platform Tablespace Transport Over Network.
Описание данной технологии приведено в документе службы Oracle Support: «12.2 RMAN Cross Platform Tablespace Transport Over Network (Doc ID 2307383.1)».
Идея заключается в том, что файлы данных и инкрементальные резервные копии копируются на целевую БД напрямую по сети (по протоколу SQL*Net). Это исключает необходимость наличия промежуточной системы хранения для резервных копий, также поддерживается миграция в случае если целевая БД расположена на ASM.
В процессе копирования автоматически определяется Endian (порядок байтов в машинном слове) и, если он различается на исходной и целевой БД, автоматически
происходит конвертация блоков в другой Endian.
Для реализации такой миграции в утилите RMAN появились две новые команды:
«restore foreign datafile .. from service … » и «recover foreign datafilecopy … from«
Первая команда фактически копирует файлы данных с исходной БД на целевую с конвертацией Endian — аналог команд создания полной резервной копии в формате «image copy«, ее копирования на целевую БД и выполнение команды convert.
Вторая команда автоматически определяет с какого момента времени (SCN) нужно получить инкрементальную резервную копию на исходной БД, формирует эту резервную копию, копирует ее на целевой сервер, автоматически конвертирует Endian и применяет к файлу данных.
Применение на практике
Для начала, необходимо на целевой БД на платформе Linux, создать TNS-алиас для подключения к целевой БД на RISC-платформе.
В данном примере в файле tnsnames.ora на сервере с Linux x86 определяется TNS-алиас с «говорящим» названием для подключения к целевой БД на Solaris SPARC.
solaris = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.127)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl)) )
Проверяем, что подключение с сервера на Linux x86 к БД на Solaris SPARC успешно работает:
[oracle@localhost ~]$ sqlplus system/oracle@solaris SQL*Plus: Release 19.0.0.0.0 - Production on Sat Dec 14 13:49:40 2024 Version 19.25.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> SELECT d.platform_name, p.endian_format FROM v$transportable_platform p, v$database d WHERE p.platform_id = d.platform_id; PLATFORM_NAME ENDIAN_FORMAT ----------------------- ------------- Solaris[tm] OE (64-bit) Big
Внимательный читатель обратил внимание, что исходная БД на платформе Solaris SPARC имеет версию 12.2, а целевая БД на платформе Linux x86 — версию 19.25. Это означает, что при миграции возможно неявно провести апгрейд БД до более высокой версии!
Определяем список файлов данных для миграции:
SQL> SELECT file#, name FROM v$datafile; /u01/app/oracle/oradata/ibs/system01.dbf 3 /u01/app/oracle/oradata/ibs/sysaux01.dbf 4 /u01/app/oracle/oradata/ibs/undotbs01.dbf 7 /u01/app/oracle/oradata/ibs/users01.dbf
Стоит напомнить, что переноситься на другую платформу и конвертироваться могут только файлы табличных пространств с пользовательскими данными.
Таким образом, нам нужно мигрировать только файл данных под номером 7, из которого состоит табличное пространство USERS.
Проверим табличное пространство USERS на замкнутость (self contained):
SQL> exec sys.dbms_tts.TRANSPORT_SET_CHECK('USERS',true,true); PL/SQL procedure successfully completed. SQL> SELECT * FROM SYS.TRANSPORT_SET_VIOLATIONS; no rows selected
Табличное пространство USERS замкнуто: можно начинать его мигрировать на другую платформу.
Запускаем утилиту RMAN и подключаемся к целевой БД на платформе Linux x86 (Oracle Linux 9.4 на процессорах AMD):
[oracle@localhost ~]$ lscpu | grep Model Model name: AMD EPYC 7702P 64-Core Processor Model: 49 [oracle@localhost ~]$ rman target sys/oracle@linux Recovery Manager: Release 19.0.0.0.0 - Production on Sat Dec 14 15:23:02 2024 Version 19.25.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. connected to target database: ORCL (DBID=1703490175)
Для копирования и конвертации файлов по сети, в утилите RMAN версии 12.2+ появилась новая команда «restore foreign datafile … from service«.
Копируем файл данных с БД на платформе Solaris for SPARC на БД на платформе Linux x86:
RMAN> restore foreign datafile 7 format '/oradata/ORCL/users01.dbf' from service solaris; Starting restore at 14-DEC-24 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=19 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: using network backup set from service solaris channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring foreign file 7 to /oradata/ORCL/users01.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:04:15 Finished restore at 14-DEC-24
Следует отметить, что копирование файла данных и его конвертации происходит без останова исходной БД и перевода табличного в режим «только для чтения»!
Если на целевой БД для управления файлами данных используется OMF (Oracle Management Files), то вместо фразы FORMAT следует использовать опцию NEW:
RMAN> restore foreign datafile 7 to new from service solaris; Starting restore at 14-DEC-24 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=21 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: using network backup set from service solaris channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring foreign file 7 to /oradata/ORCL/datafile/o1_mf_users_mov1kc19_.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:04:15 Finished restore at 14-DEC-24
Убедимся, что новый файл данных появился на файловой системе ОС Linux:
[oracle@localhost ~]$ ll /oradata/ORCL/users01.dbf -rw-r-----. 1 oracle oinstall 3102482432 Dec 14 15:31 /oradata/ORCL/users01.dbf [oracle@localhost ~]$
Поскольку, файл данных на целевой БД не согласован, а также за период копирования и конвертации файлов данных пользователи продолжали работу с исходной БД, в ней накопился определенный объем изменений.
Перенесем эти изменения в файлы данных на целевом сервере, с помощью новой команды утилиты RMAN «recover foreign datafilecopy … from service»:
RMAN> recover foreign datafilecopy '/oradata/ORCL/users01.dbf' from service solaris; recover foreign datafilecopy '/oradata/ORCL/users01.dbf' from service solaris; Starting recover at 14-DEC-24 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=25 device type=DISK channel ORA_DISK_1: starting incremental datafile backup set restore channel ORA_DISK_1: using network backup set from service solaris channel ORA_DISK_1: restoring foreign file 00007 to /oradata/ORCL/users01.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:01:45 Finished recover at 14-DEC-24
Утилита RMAN автоматически определяет с какого момента времени (SCN) нужно получить инкрементальную резервную копию на исходной БД, копирует эту резервную копию
на целевой сервер, автоматически конвертирует в Litle Endian и применяет к файлу данных.
Серией последовательных выполнений команды «recover foreign datafilecopy … from service» мы добиваемся минимального расхождения в данных на исходной и целевой БД.
Наконец в назначенное время, табличное пространство на исходной БД переводится в режим «только для чтения»:
[oracle@localhost ~]$ sqlplus system/oracle@solaris SQL*Plus: Release 19.0.0.0.0 - Production on Sat Dec 14 15:51:12 2024 Version 19.25.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> alter tablespace users read only; Tablespace altered.
Получаем с исходной БД последнюю инкрементальную копию и применяем ее на целевой БД с автоматической конвертацией:
RMAN> recover foreign datafilecopy '/oradata/ORCL/users01.dbf' from service solaris; Starting recover at 14-DEC-24 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=25 device type=DISK channel ORA_DISK_1: starting incremental datafile backup set restore channel ORA_DISK_1: using network backup set from service solaris channel ORA_DISK_1: restoring foreign file 00007 to /oradata/ORCL/users01.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 Finished recover at 14-DEC-24
Теперь все готово для подключения нового табличного пространства (соответствующих файлов данных) к целевой БД.
Для упрощения работы созданим db-линк с целевой БД на исходную:
SQL> create public database link solaris connect to system identified by oracle using 'solaris'; Database link created.
Подключаем новое табличное пространство к целевой БД. Для этого используется утилита impdp с параметрами transport_tablespaces и transport_datafiles.
Передача с целевой БД метаданного табличного пространства и их загрузка в целевую БД происходит прямо по сети (параметр network_link), без формирования промежуточного файла дампа:
[oracle@localhost ~]$ impdp system/oracle network_link=solaris transport_tablespaces=USERS transport_datafiles='/oradata/ORCL/users01.dbf' Import: Release 19.0.0.0.0 - Production on Sat Dec 14 16:03:27 2024 Version 19.25.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** network_link=solaris transport_tablespaces=USERS transport_datafiles=/oradata/ORCL/users01.dbf Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK Processing object type TRANSPORTABLE_EXPORT/TABLE Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at Sat Dec 14 16:04:12 2024 elapsed 0 00:00:42
Миграция успешно завершена и новое табличное пространство и соответствующий файл данных доступны для работы на целевой платформе на Linux x86:
SELECT t.name as tablespace_name, d.file#, d.name FROM v$datafile d, v$tablespace t WHERE d.ts# = t.ts# and t.name = 'USERS'; TABLESPACE_NAME FILE# NAME ------------------------------ ---------- --------------------------- USERS 5 /oradata/ORCL/users01.dbf
Автоматизация миграции с помощью скрипта M6
Для упрощения миграции больших баз данных, которые содержат большое число табличных пространств и файлов данных, автором был разработан скрипт M6.
Данный скрипт выполняется на исходной БД в среде утилиты SQL*Plus версии 22.4 и выше, и автоматически формирует все необходимые скрипты для
автоматизации миграции с помощью вышеописанного алгоритма.
SQL> @gen_restore help=y =============================================================================== M6 Scripts: Release 1.0.0.0.1 - Production on 15.12.2024 17:46:53 gen_restore.sql - generate RMAN scripts for datafile conversion during migration Copyright (c) 2024, Igor Melnikov. All rights reserved. You can control how gen_restore.sql runs by entering the "gen_restore" command followed by various arguments. To specify parameters, you use keywords: Format: @gen_restore.sql parameter1=value1 parameter2=value2 Example: @gen_restore.sql TABLESPACES=users,users_ind SOURCE_SERVICE=solaris SCRIPT_RESTORE=restore_x86.rcv @gen_restore.sql SOURCE_SERVICE=ibm_power Keyword Description (Default) -------------------------------------------------------- SOURCE_SERVICE_NAME TNS alias for source database on destination server (source_db) TABLESPACES tablespaces for migration, ALL-for all user-defined tablespaces (ALL) HELP print this message: Y/N (N) SCRIPT_RESTORE RMAN script for restore (restore.rcv) SCRIPT_RECOVER RMAN script for recover (recover.rcv) SCRIPT_READ_ONLY sql script for read only tablespaces (tbs_ro.sql) SCRIPT_READ_WRITE sql script for read write tablespaces (tbs_rw.sql) IMPDP_CONFIG config file for impdp - plug-in tablespaces (tts_plugin.cfg) SOURCE_DB_LINK Database link on target database to source database (source_db) DEBUG Debug mode: Y/N (N)
Скрипт автоматически генерирует следующие файлы для миграции с помощью вышеописанного алгоритма:
-
скрипт для утилиты RMAN для копирования и восстановления файлов данные с конвертацией Endian на целевой платформе (имя скрипта задается параметром SCRIPT_RESTORE);
-
скрипт для утилиты RMAN для копирования и применения инкрементальных резервных копий с конвертацией Endian на целевой платформе (имя скрипта задается параметром SCRIPT_RECOVER);
-
скрипт для утилиты SQL*Plus/sqlcl для перевода табличных пространств на исходной БД в режим «только для чтения» (имя скрипта задается параметром SCRIPT_READ_ONLY);
-
скрипт для утилиты SQL*Plus/sqlcl для перевода табличных пространств на исходной БД в режим «только чтения-записи (имя скрипта задается параметром SCRIPT_READ_WRITE);
-
файл параметров для утилиты impdp, для подключения табличных пространств и файлов данных к целевой БД (имя файла задется параметром IMPDP_CONFIG).
Дополнительно в скрипт можно передать два опциональных параметра:
-
имя TNS-алиаса на целевой БД, для подключения к исходной БД (параметр SOURCE_SERVICE_NAME);
-
имя database link на целевой БД, который ссылается на исходную БД (необходим для параметра NETWORK_LINK утилиты impdp).
Заключение
Компания Oracle постоянно упрощает процесс миграции СУБД Oracle Database между платформами с разными Endian.
Новые команды утилиты RMAN «restore foreign datafile … from service» и «recover foreign datafilecopy … from service», которые появились в Oracle Database версии 12.2,
позволяют значительно упростить этот процесс.
Забегая вперед, следует отметить, что в новом релизе СУБД Oracle Database 23ai появились новые возможности которые еще больше упрощают этот процесс,
но это уже другая история …
Автор выражает благодарность компании ЭЛЬКАРО[ссылка удалена мод.] за предоставленные для тестирования серверы на платформе Sun Solaris 11.4 for SPARC и Oracle Linux на AMD Epyc.
Скрипт M6 можно скачать по следующей ссылке.
Игорь Мельников
Независимый консультант
ссылка на оригинал статьи https://habr.com/ru/articles/867390/
Добавить комментарий