Фев 282013
 

Возникла у меня такая задача: смигрировать базу c Linux x86-64 на AIX 7.1. Версия Oracle - 11.2.0.3. Можно было бы использовать expdp, но из-за приличного объёма базы (180Гб) процесс занял бы длительное время. Тут нам на помощь приходит технология Transportable Tablespaces. Суть её состоит в том, что файлы данных копируются целиком и все существующие сегменты данных "подключаются" напрямую, т.е. эта операция, в отличие от импорта, не генерирует redo информацию и не требует перестройки индексов. Технология эта годится только для относительно крупных баз, т.к. требует от администратора кучу действий, особенно при смене порядка бит (endianess), как в моём случае.
Заодно мы решили воспользоваться случаем и смигрировать данные сразу в ASM (раньше файлы просто лежали на большом дисковом разделе).

Итак, вот примерная последовательность действий.

Подготовка

База будет полностью доступна во время подготовки, поэтому делаем всё не спеша и аккуратно.
Сначала определим список табличных пространств, которые будут переноситься. У этого списка есть труднопереводимое требование: он должен быть self-contained, это означает, что у объектов из этого набора не должно быть внешних зависимосей. Кроме того, существует ещё ряд ограничений, которые надо будет проверить. Итак, начнём подготовку.

  1. Проверим параметры NLS_NCHAR_CHARACTERSET и NLS_CHARACTERSET на обеих базах, они обязательно должны совпадать.
  2. Убедимся, что на обеих базах установлен DST патч одинаковой версии. Проверить можно так:
    SELECT * FROM v$timezone_file;

    Если запрос возвращает разные результаты, то обязательно надо привести в соответствие версию DST патча на обеих базах.

  3. Проверяем набор табличных пространств
    EXEC sys.dbms_tts.transport_set_check('TBS1,TBS2', TRUE);
    SELECT * FROM sys.transport_set_violations;

    В результате этого действия будут выведены возможные несовместимости набора с технологией TTS. У меня, например, было несколько function-based индексов, которые мне пришлось удалить и создать только после импорта на целевой базе.

  4. Создаём на целевой базе схемы, в которые будут залиты данные. Временно назначаем этим схемам DEFAULT TABLESPACE system, т.к. их родные пространства ещё не приехали. Если схем много, то можно соорудить скрипт.
  5. На исходной базе расшариваем каталог с файлами данных по NFS и монтируем его на целевую.
    mount -o rw,bg,hard,nointr,rsize=32768,wsize=32768,vers=3,timeo=600,actimeo=0 oldhost:/u03/oradb /mnt/nfs

    Если смонтировать с другими опциями, то при попытке запустить конвертацию файлов получим ошибку ORA-27054 и ничего не выйдет.

На этом этап подготовки заканчивается.

Основной этап

В течение этого этапа база будет недоступна, поэтому имеет смысл заготовить скрипты заранее, чтобы уменьшить downtime.

  1. На исходной базе переводим все пространства в READ ONLY:
    ALTER TABLESPACE tbs1 READ ONLY;
    ALTER TABLESPACE tbs2 READ ONLY;
    ....
  2. Используем DataPump для экспорта метаданных TTS и для экспорта бессегментных объектов:
    Создаём директории

    CREATE OR REPLACE DIRECTORY dpump_dir AS '/u03/oradb';
    GRANT READ,WRITE ON DIRECTORY dpump_dir TO sys;

    и делаем экспорт:

    expdp \'/ as sysdba\' directory=dpump_dir dumpfile=tts.dmp logfile=tts.log transport_tablespaces=tbs1,tbs2
    expdp \'/ as sysdba\' full=y content=METADATA_ONLY dumpfile=objs.dmp logfile=objs.log

    Дамп, собранный первой командой содержит сведения о сегментах (грубо говоря, какой сегмент в каком табличном пространстве и в каком файле находится), а второй содержит пакеты, представления, процедуры и другие бессегментные объекты.

  3. Момент истины. На целевой базе конвертируем файлы данных утилитой RMAN и заливаем их прямо в ASM:
    CONVERT DATAFILE 
    '/mnt/nfs/datafile/file01.dbf',
    '/mnt/nfs/datafile/file02.dbf',
    ......
    TO PLATFORM="AIX-Based Systems (64-bit)"
    FROM PLATFORM="Linux x86 64-bit"
    DB_FILE_NAME_CONVERT="/mnt/nfs/", "+DISKGROUP/db/datafile/"
    PARALLELISM=5;

    Можно поэкспериментировать с параметром PARALLELISM для достижения оптимальной скорости.

  4. Импортируем метаданные TTS:
    Сначала создадим директорию для DataPump на целевой базе.

    CREATE OR REPLACE DIRECTORY dpump_dir AS '/mnt/nfs';
    GRANT READ,WRITE ON DIRECTORY dpump_dir TO sys;

    И собственно импорт:

    impdp \'/ as sysdba\' directory=dpump_dir dumpfile=tts.dmp logfile=tts_imp.log transport_datafiles='+DISKGROUP/db/datafile/file01.dbf','+DISKGROUP/db/datafile/file01.dbf,...'
  5. Импортируем бессегментные объекты:
    impdp \'/ as sysdba\' directory=dpump_dir dumpfile=objs.dmp logfile=objs_imp.log

  6. На целевой базе переводим все пространства в READ WRITE:
    ALTER TABLESPACE tbs1 READ WRITE;
    ALTER TABLESPACE tbs2 READ WRITE;
    ....
  7. Теперь компилируем объекты, и проверяем, всё ли залилось и всё ли работает. Также не забываем указать созданным в п. 4 этапа подготовки схемам правильные default tablespaces. Мне пришлось на этом этапе пересоздать ещё и функциональные индексы, что заняло почти час. С этого момента базу можно считать доступной.
  8. Проверяем новую базу с помощью DBVERIFY или RMAN (на всякий случай).

У меня время недоступности базы объёмом 180Гб составило 3 часа вместе с длительной фазой перестроения функциональных индексов. Весьма неплохо.

Для ускорения процесса можно задействовать Veritas Volume Manager. Для этого том с файлами должен лежать в дисковой группе, управляемой VxVM. Тогда останется только остановить исходную базу, размонтировать том, депортировать дисковую группу с Linux, импортировать её на AIX и запустить конвертацию. Тогда данные пойдут по SAN, а не по сети, что выйдет гораздо быстрее.

  2 комментария to “Технология Transportable Tablespaces”

  1. Уверены что у вас выполнится эта команда?
    impdp \'/ as sysdba\' directory=dpump_dir dumpfile=tts.dmp logfile=tts_imp.log transport_datafiles='+DISKGROUP/db/datafile/file01.dbf','+DISKGROUP/db/datafile/file01.dbf,...'
    Если в новой базе не будут созданы пользователи, то оракл не даст прижиться новым тейблспейсам.

    • Добрый день, Александр!
      Команда выполнится. См. п.4 раздела "Подготовка". Как раз там мы и создаём схемы.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)