Stand in сервер что это значит
stand-in processing
Смотреть что такое «stand-in processing» в других словарях:
stand-alone processing — autonominis apdorojimas statusas T sritis automatika atitikmenys: angl. off line processing; stand alone processing vok. selbstständige Verarbeitung, f; Verarbeitung getrennt von übrigen System, f rus. автономная обработка, f pranc. traitement… … Automatikos terminų žodynas
off-line processing — autonominis apdorojimas statusas T sritis automatika atitikmenys: angl. off line processing; stand alone processing vok. selbstständige Verarbeitung, f; Verarbeitung getrennt von übrigen System, f rus. автономная обработка, f pranc. traitement… … Automatikos terminų žodynas
Photographic processing — is the chemical means by which photographic film and paper is treated after photographic exposure to produce a negative or positive image. Photographic processing transforms the latent image into a visible image, makes this permanent and renders… … Wikipedia
Transaction processing system — A Transaction Processing System To be considered a transaction processing system the computer must pass the ACID test.From a technical perspective, a Transaction Processing System (or Transaction Processing Monitor) monitors transaction programs … Wikipedia
information processing — Acquisition, recording, organization, retrieval, display, and dissemination of information. Today the term usually refers to computer based operations. Information processing consists of locating and capturing information, using software to… … Universalium
Graphics processing unit — GPU redirects here. For other uses, see GPU (disambiguation). GeForce 6600GT (NV43) GPU A graphics processing unit or GPU (also occasionally called visual processing unit or VPU) is a specialized circuit designed to rapidly manipulate and alter… … Wikipedia
cereal processing — Introduction treatment of cereals (cereal) and other plants to prepare their starch for human food, animal feed, or industrial use. Nutrient composition of selected raw cereal grains (per 100 grams)Cereals, or grains, are members of… … Universalium
Video post-processing — The term post processing (or postproc for short) is used in the video/film business for quality improvement image processing (specifically digital image processing) methods used in video playback devices, (such as stand alone DVD Video players),… … Wikipedia
Automatic data processing — In telecommunication, the term automatic data processing (ADP) has the following meanings: 1. An interacting assembly of procedures, processes, methods, personnel, and equipment to perform automatically a series of data processing operations on… … Wikipedia
Integrated Microcomputer Processing System — IMPS, short for Integrated Microcomputer Processing System is a public domain statistical package developed by the U.S. Census Bureau. The Integrated Microcomputer Processing System (IMPS) performs the major tasks in survey and census data… … Wikipedia
Pyramid (image processing) — Pyramid or pyramid representation is a type of multi scale signal representation developed by the computer vision, image processing and signal processing communities, in which a signal or an image is subject to repeated smoothing and subsampling … Wikipedia
Прикладная репликация (StandIn)
Оглавление
Общие сведения
В рамках DataSpace реализован подход, называемый быстрым переходом в StandIn, как показано на схеме ниже.
Также в DataSpace реализован горячий архив. Горячий архив — база данных, в которую также реплицируются вектора изменений. При этом на основной базе (и возможно StandIn) часть устаревших данных может быть удалена (вытеснена). Горячий архив полезен при поиске исторических операций.
В дополнение к быстрому переходу и горячему архиву DataSpace обеспечивает возможность репликации в прикладном приложении.
Связь с моделью данных
При применении репликации в DataSpace ключевой вопрос — выбор ключа репликации. Этот выбор определяет следующие параметры:
DataSpace может автоматически определять ключ репликации в зависимости от транзакционных данных при условии, что в модели размечены агрегаты и выполняются соответствующие ограничения.
Репликация поддерживается только в агрегатоцентричной модели или ее производных при соблюдении описанных ниже ограничений.
Агрегатоцентричная модель
Ключом репликации выступает идентификатор экземпляра агрегата, который включает в себя имя класса агрегата и идентификатор сущности корня агрегата. Например, (Product, 542134932).
Если корни агрегатов размечены на модели и выполняются ограничения, то ключ репликации определяется автоматически.
Существуют следующие ограничения:
Клиентоцентричная модель
Отличается от агрегатоцентричной модели наличием только одного класса агрегатов, как правило, клиент.
Ручное формирование ключа репликации
Ключ репликации передается явно, в каждом вызове API DataSpace.
Применение векторов изменений
Процесс формирования векторов изменения и их применения показан на схеме ниже.
Репликация в DataSpace 4G позволяет переносить транзакционные изменения в гетерогенной среде посредством компонента Прикладной журнал. На каждую транзакцию формируется объект, позволяющий однозначно воспроизвести осуществленные в ней изменения – вектор изменений. Вектор отправляется в прикладной журнал и далее распространяется им в различные системы.
Настройка репликации в Standin при использовании DataSpace
При использовании DataSpace для работы с данными консистентная репликация изменений в базе Standin обеспечивается автоматически при выполнении следующих условий:
Настройка репликации в Standin для новых пользователей DataSpace
При настройке репликации в базе Standin для новых пользователей DataSpace нужно выполнить следующие шаги:
Убедитесь, что модель данных удовлетворяет критерию агрегатоцентричности или разработайте такую модель данных.
Убедитесь, что на стенде имеется развернутый сервис Прикладной Журнал (ПЖ) или закажите разворачивание этого сервиса.
Выберите идентификатор Standin-зоны (зоны ПЖ) и закажите создание новой зоны ПЖ с этим идентификатором на стенде.
Закажите настройку плагинов ПЖ для DataSpace и убедитесь, что такая настройка произведена. Дополнительные сведения о плагинах можно найти в таблице ниже.
Имя плагина | Тип данных | Комментарий |
---|---|---|
EXPORT_FUNC_SI | DATASPACE | Вектора изменений DataSpace, формат JSON |
EXPORT_FUNC_SI_LCK | LCK | Standin блокировки агрегатов, формат JSON |
EXPORT_FUNC_SI_LCK | ULCK | Standin разблокировки агрегатов, формат JSON |
После настройки ПЖ на стенде запросите параметры подключения к ПЖ на данном стенде и заполните шаблон ресурса appJournal.properties секрета secret-appJournalSettings как показано в фрагменте ниже.
При задании параметров реомендуется следовать следующим рекомендациям:
Информацию о нужных значениях остальных параметров можно найти в документации ПЖ.
Для параметров из ресурса appJournalForCore.properties необходимо использовать указанные в шаблоне значения:
В случае использования Dataspace-Core Pipeline выполните следующие требования для приложений DataSpace Core и DataSpace Applier (aka GigaBas):
Если Dataspace-Core Pipeline не используется, необходимо указать параметры приложений Spring Boot приложений явным образом:
Проверка интеграции DataSpace с ПЖ на стенде разработки/тестирования
Корректную интеграцию DataSpace с ПЖ на стенде разработки /тестирования нужно проверять с использоанием следующих средств:
Проверка интеграции DataSpace с ПЖ на стенде по логам
В логах DataSpace / Applier необходимо найти перечисленные в таблице ниже позиции.
Позиция | Описание | Пример строк лога |
---|---|---|
Лог Applier: Applied journal createMode = 0 | Вектор с данными успешно применен. В этой же строке находится id Сервиса: serviceId = 909ee533-36d2-4be9-b214-4ca55c676c7f_ 6904652537442598913 #ProductParty (тот же что в Sent LCK + DATA Journal) | 2020-12-10 18:38:15,123 [consumer-2-C-1] [INFO] (sbp.dataspace.standin.journal.StandinJournalConsumer) [sbp.dataspace.standin.journal.StandinJournalConsumer::handle:60] mdc:() | Applied journal createMode = 0, dataType = DATASPACE, serviceId = 909ee533-36d2-4be9-b214-4ca55c676c7f_6904652537442598913#ProductParty |
DataSpace: Sent LCK+DATA Journal | В ПЖ отправлен вектор с данными. В той же строке уникальный идентификатор в терминологии ПЖ: id Сервиса. В примере справа — часть строки после serviceId, где: — 909ee533-36d2-4be9-b214-4ca55c676c7f — идентификатор транзакции; — 6904652537442598913 — идентификатор агрегата; — ProductParty – тип агрегата | 2020-12-10 18:38:14,882 [general-pool-thread-3] [INFO] (sbp.com.sbt.dataspace.replication.journal.PayloadContainerAsJournalSender) [sbp.com.sbt.dataspace.replication.journal.PayloadContainerAsJournalSender::sendDataContainerWithAckRequest:56] mdc:() | tx 909ee533-36d2-4be9-b214-4ca55c676c7f: Sent LCK+DATA journal (createMode 0, vectorVersion 1, serviceId 909ee533-36d2-4be9-b214-4ca55c676c7f_6904652537442598913#ProductPart |
DataSpace: Received ACK | От ПЖ получено подтверждение об успешном приеме вектора. В этой же строке идентификатор транзакции tx | 2020-12-10 18:38:14,884 [general-pool-thread-3] [INFO] (sbp.com.sbt.dataspace.replication.PostTransactionConfirmatorImpl) [sbp.com.sbt.dataspace.replication.PostTransactionConfirmatorImpl::sendAck:23] mdc:() | tx 909ee533-36d2-4be9-b214-4ca55c676c7f: Received ACK |
Проверка интеграции DataSpace с ПЖ на стенде через UI ПЖ
Чтобы осуществить проверку через UI ПЖ, необходимо выполнить следующие действия:
Должно быть найдено две строки:
Проверка интеграции DataSpace с ПЖ на стенде через тестовый запрос
Это рекомендованный способ проверки интеграции DataSpace и ПЖ на стенде.
Чтобы проверить интеграцию DataSpace и ПЖ с помощью тестовый запроса, необходимо выполнить следующие действия:
Типичные проблемы и пути их устранения
Таблица ниже содержит типичные проблемы и пути их устранения.
Проблема | Метод решения |
---|---|
Активный контур в ПЖ: МАIN При создании сущности запись в БД производится в БД MAIN Переходим в ПЖ в StandIn При создании сущности запись в БД производится снова в БД MAIN, а не в БД SI | В терминале pod-а модуля dataspace-core выполнить команду: curl http://localhost:8080/actuator/env Команда должна выдать информацию о значениях параметров подключения к БД: Следует ожидать там значения вида: jdbc:postgresql://abc999..sbrf.ru:5433/dbmn. Следует убедиться, что полученные значения корректно указывает на нужные базы данных. При необходимости привлечь команду ПЖ к разбору проблемы |
Формат вектора изменений DATASPACE
Вектор изменений, содержащий изменения бизнес-сущностей
В качестве строковых значений атрибутов используется следующее:
Атрибут | Используемое значение |
---|---|
JournalData.dataType | DATASPACE |
JournalData.subtype | JDC_JSON_1 |
JournalData.dataObject | JSON-объект |
Пример вектора изменений в обертке DATASPACE
Фрагмент кода ниже содержит пример вектора изменений в обертке DataSpace.
Спецификация атрибутов
Таблица ниже содержит описание атрибутной спецификации.
Атрибут | JSON-тип | Краткое описание | Подробности |
---|---|---|---|
rootClass | string | Корневой класс агрегата | Класс корня агрегата, заполняется всегда |
rootId | string | ID агрегата | Идентификатор корневой сущности агрегата, заполняется всегда |
txId | string | ID транзакции | Идентификатор физической транзакции в БД, заполняется всегда |
txTimestamp | number | Отметка времени коммита транзакции | Отметка времени коммита, из JVM где вызывается коммит |
headers | object | Дополнительные заголовки | См. описание атрибутов из элемента headers |
partitions | array | Список партиций, содержащих данные | См. описание атрибутов из элемента списка partitions |
Таблица ниже содержит описание атрибутов из элемента headers.
Атрибут | JSON-тип | Краткое описание | Подробности |
---|---|---|---|
guid | string | GUID транзакции | Идентификатор транзакции по агрегату, заполняется в случае версионирования агрегатов. По умолчанию равен атрибуту txId |
version | number | Версия агрегата | Монотонно возрастающая последовательность, изменяющаяся с каждым обновлением в БД любой сущности, входящей в агрегат. Заполняется при включенном версионировании агрегатов |
Таблица ниже содержит описание элементов списка партиций.
Атрибут | JSON-тип | Краткое описание | Подробности |
---|---|---|---|
type | string | Тип партиции | Короткий идентификатор, по которому можно определить семантику данных в партиции, заполняется всегда |
serializer | string | Тип сериализации | Короткий идентификатор, по которому можно определить какая сериализация использована для данных в партиции, заполняется всегда |
serialVersionUID | number | ID сериализатора | UID сериализатора, использованного для сериализации данных в партиции, заполняется всегда |
payload | string | Данные партиции | Сериализованные данные в строковом виде, заполняется всегда |
Вектор изменений для блокировки агрегата (standin-блокировка)
При блокировке агрегата необходимо использовать следующие значения:
Еще раз про Oracle standby
Перед тем, как мы начнем, стоит немного сказать о тех принципах организации БД Oracle, которые понадобятся нам для понимания механизма работы резервного копирования и восстановления данных в СУБД Oracle.
Экземпляр БД Oracle содержит следующие виды файлов:
Управляющие файлы (Control files) — содержат служебную информацию о самой базе данных. Без них не могут быть открыты файлы данных и поэтому не может быть открыт доступ к информации базы данных.
Файлы данных (Data files) — содержат информацию базы данных.
Оперативные журналы (Redo logs) — содержат информацию о всех изменениях, произошедших в базе денных. Эта информация может быть использована для восстановления состояния базы при сбоях.
Существуют другие файлы, которые формально не входят в базу данных, но важны для успешной работы БД.
Файл параметров — используется для описания стартовой конфигурации экземпляра.
Файл паролей — позволяет пользователям удаленно подсоединяться к базе данных для выполнения административных задач.
Архивные журналы — содержат историю созданных экземпляром оперативных журнальных файлов (их автономные копии). Эти файлы позволяют восстановить базу данных. Используя их и резервы базы данных, можно восстановить потерянный файл данных.
Главная идея при создании standby экземпляра состоит в том, чтобы с помощью выполнения транзакций, сохраненных в оперативных или архивных журналах основной БД, поддерживать резервную БД в актуальном состоянии (такой механизм для Oracle называется Data Guard).
Отсюда следует первое требование к нашей основной базе — она должна быть запущена в archivelog mode.
Вторым требованием является наличие файла паролей. Это позволит удаленно подключаться к нашей БД в административном режиме.
Третье требование — это режим force logging. Этот режим нужен для принудительной записи транзакций в redo logs даже для операций, выполняемых с опцией NOLOGGING. Отсутствие этого режима может привести к тому, что на standby базе будут повреждены некоторые файлы данных, т.к. при «накатке» архивных журналов из них нельзя будет получить данные о транзакциях, выполненных с опцией NOLOGGING.
Также необходимо отметить, что если вы используете Oracle ниже 11g, то необходимо, чтобы сервера для основной базы и для standby имели одинаковую платформу. Т.е., если ваша основная база работает на Linux-сервере, то standby-сервер не может быть под управлением Windows.
Все примеры в этой статье будут ориентиваны на unix-системы, однако, их отличие от случая Windows-систем, в основном, состоит только в способе написания путей к файлам.
Не забываем также, что обмен данными между основным и standby серверами будет происходить по SQL-Net, поэтому необходимо, чтобы соединения на соответствующий порт (как правило, 1521 tcp) было открыто в обоих направлениях.
Будем считать, что наша база называется test. Мы будем так настраивать конфигурацию основной и standby базы, чтобы в любой момент мы могли поменять их роли местами (switchover). Мы планируем, что наша система будет использовать Data Guard protection mode, который называется MAXIMUM PERFORMANCE.
Итак, поехали.
Для начала поверяем соответствие нашей БД необходимым требованиям.
1. Смотрим, в каком режиме работает наша основная БД:
SQL> select name, open_mode, log_mode from v$database;
Если вы не видите значения ARCHIVELOG в поле LOG_MODE, выполняем следующие команды:
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
2. Проверяем наличие файла паролей:
SQL> select * from v$pwfile_users;
Если вы не видите этот результат, создаем необходимый файл:
$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=xxxxxxxx force=y
Вместо ‘xxxxxxxx’ необходимо вставить текущий пароль пользователя SYS.
3. Включаем режим force logging:
SQL> alter database force logging;
Переходим к конфигурированию нашей системы. Для начала выполним необходимые настройки на основной базе. Будем сохранять все данные в каталоге /data/backup.
Создаем standby redo logs. Они нужны только на standby базе для записи данных, сохраняемых в redo logs на основной базе. На основной базе они нам понадобятся, когда мы будем переключать ее в режим standby и при этом использовать real-time apply redo. Файлы standby redo logs должны быть такого же размера как и online redo logs. Посмотреть размер online redo logs можно с помощью команды:
SQL> select bytes from v$log;
BYTES
———-
52428800
52428800
52428800
Смотрим, какие группы для redo logs есть в нашей базе:
SQL> select group# from v$logfile;
Создаем standby redo logs:
SQL> alter database add standby logfile group 4 ‘/oradata/test/stnbylog01.log’ size 50m;
Database altered.
SQL> alter database add standby logfile group 5 ‘/oradata/test/stnbylog02.log’ size 50m;
Database altered.
SQL> alter database add standby logfile group 6 ‘/oradata/test/stnbylog03.log’ size 50m;
Database altered.
Создаем файл с параметрами нашего экземпляра (pfile). Мы будем учитывать, что наша основная база может быть переключена в режим standby, а это требует задания параметров, которые будут использоваться только в standby режиме.
SQL> create pfile=’/data/backup/pfilePROD.ora’ from spfile;
Нам необходимо добавить некоторые параметры в получившийся файл, если их там нет:
db_name=’test’ — это имя нашей базы (одинаковое для основного и standby экземпляра).
db_unique_name=’testprod’ — а это уникальное имя для каждого экземпляра, оно не будет изменяться при смене ролей со standby на production.
log_archive_config=’dg_config=(testprod,teststan)’ — определяем имена экземпляров, между которыми будет происходить обмен журналами.
log_archive_dest_1=’SERVICE=teststan LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=’teststan’ – когда экземпляр является основной базой (PRIMARY_ROLE), мы будем передавать архивные журналы на standby сервер с помощью процесса LGWR. Параметр ASYNC указывает, что данные, сгенерированные транзакцией, не обязательно должны быть получены на standby до завершения транзакции – это не приведет к остановке основной базы, если нет связи со standby.
log_archive_dest_2=’LOCATION=/oradata/test/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=testprod’ – здесь мы указываем каталог, куда будут локально сохранятся архивные журналы (для основной базы) или куда будут складываться пришедшие с основной базы журналы (для standby базы).
log_archive_dest_state_1=ENABLE – включаем запись архивных журналов в log_archive_dest_1. Пока мы не создали standby базу, этот параметр можно поставить в значение DEFER, если мы не хотим видеть лишние сообщения о недоступности standby базы в alert_log.
log_archive_dest_state_2=ENABLE – включаем запись архивных журналов в log_archive_dest_2.
fal_client=’testprod’ – этот параметр определяет, что когда экземпляр перейдет в режим standby, он будет являться клиентом для приема архивных журналов (fetch archive log).
fal_server=’teststan’ – определяет FAL (fetch archive log) сервер, с которого будет осуществляться передача архивных журналов. Параметры fal_client и fal_server работают только когда база запущена в standby режиме.
standby_file_management=’AUTO’ – задаем режим автоматического управления файлами в standby режиме. При таком значении параметра все создаваемые или удаляемые файлы основной базы будут автоматически создаваться или удаляться и на standby базе.
Если мы все-таки хотим разместить нашу standby базу в каталогах, отличных от тех, в которых размещена основная база, нам понадобятся дополнительные параметры:
db_file_name_convert=’/oradata_new/test’,’/oradata/test’ – этот параметр указывает, что в именах файлов данных, которые будут создаваться в standby базе (т.е. когда наш основной экземпляр начнет работать в режиме standby), необходимо изменить пути с ‘/oradata_new/test’ на ‘/oradata/test’.
log_file_name_convert=’/oradata_new/test/archive’,’/oradata/test/archive’ – этот параметр указывает, что в именах журнальных файлов, которые будут создаваться в standby базе, необходимо изменить пути с ‘/oradata_new/test/archive’ на ‘/oradata/test/archive’.
В итоге файл параметров для основной базы помимо всего прочего должен иметь следующие записи:
# эти параметры нам понадобятся для работы в режимах PRIMARY и STANDBY
db_name=’test’
db_unique_name=’testprod’
log_archive_config=’dg_config=(testprod,teststan)’
log_archive_dest_1=’SERVICE=teststan LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=’teststan’ log_archive_dest_2=’LOCATION=/oradata/test/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=testprod’
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
# эти параметры нам понадобятся для работы только в режиме STANDBY
fal_client=’testprod’
fal_server=’teststan’
standby_file_management=’AUTO’
Если есть такая возможность, перезапускаем основную базу с новыми параметрами и создаем новый spfile на основе переработанного нами pfile:
SQL> shutdown immediate;
SQL> startup nomount pfile=’/data/backup/pfilePROD.ora’;
SQL> create spfile from pfile=’/data/backup/pfilePROD.ora’;
SQL> shutdown immediate;
SQL> startup;
Если у нас нет возможности остановить основную базу на время наших манипуляций, то придется вносить изменения в текущую конфигурацию с помощью ALTER SYSTEM.
Тут надо учитывать, что нам не удастся сменить db_unique_name на работающей базе. Поэтому, нам придется в конфигурации использовать то имя, которое есть на данный момент. Посмотреть его можно с помощью команды:
Задаем необходимые параметры:
SQL> alter system set log_archive_config=’dg_config=(test,teststan)’;
System altered.
Задаем места для записи архивных журналов. На работающей базе мы не сможем поправить параметр log_archive_dest_1, если он задан. Поэтому только добавляем направление копирования в standby базу:
SQL> alter system set log_archive_dest_2=’SERVICE=teststan LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=teststan’;
System altered.
SQL> alter system set log_archive_dest_state_2=ENABLE;
System altered.
SQL> alter system set FAL_SERVER=teststan;
System altered.
SQL> alter system set FAL_CLIENT=test;
System altered.
SQL> alter system set standby_file_management=’AUTO’;
System altered.
Добавляем в tnsnames.ora запись о standby базе:
TESTSTAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = standbysrv)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = teststan)
)
)
Пришло время создать backup-ы (если их нет). Для этого мы будем пользоваться утилитой rman.
Необходимо, чтобы место, где располагается бэкап, из которого мы будем разворачивать standby базу, было точно таким же, как и место, куда мы этот бэкап сохраняли. Т.е. если мы складываем бэкап в каталог ‘/data/backup’, то при восстановлении базы на standby-сервере rman будет искать данные бэкапа в таком же каталоге. Для решения этой задачи есть два очевидный пути: скопировать данные бэкапа с основного сервера на standby в точно такой же каталог, созданный там, или использовать для бэкапа сетевой ресурс, который одинаково монтируется на обоих серверах.
Запускаем rman на основном сервере:
$ rman target /
Создаем контрольный файл для standby базы:
RMAN> backup current controlfile for standby format ‘/data/backup/standbycontrol.ctl’;
Создаем бэкап нашей основной базы и архивных журналов:
RMAN> run
2> <
3> allocate channel c1 device type disk format ‘/data/backup/%u’;
4> backup database plus archivelog;
5> >
Здесь нас может поджидать неприятность, если по каким-то причинам у нас нет полного набора архивных журналов (например, они были удалены). Тогда rman выдаст ошибку:
RMAN-20242: Specification does not match any archivelog in the recovery catalog
Для исправления ситуации необходимо проверить и изменить статусы архивных журналов в репозитории rman. Для этого выполним следующую команду:
RMAN> change archivelog all crosscheck;
Если бэкап прошел успешно, копируем содержимое каталога /data/backup/ на standby сервер (если мы не использовали общий сетевой ресурс для бэкапа) и приступаем к созданию экземпляра на standby сервере.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = teststan)
(ORACLE_HOME = /oracle)
(SID_NAME = test)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standbysrv)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
Следует заметить, что параметр SID_NAME в данном случае чувствителен к регистру, т.к. listener будет искать файл паролей с именем orapw$SID_NAME.
Кстати, сейчас самое время скопировать файл паролей ($ORACLE_HOME/dbs/orapw$ORACLE_SID) с основного сервера на standby.
Нам также следует прописать нашу основную и standby базы в tnsnames.ora:
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = standbysrv)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = teststan)
)
)
TESTPROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = productionsrv)(PORT = 1521))
)
(CONNECT_DATA =
(SID = test)
)
)
Т.к. подразумевается, что приложения «знают» нашу базу под именем test, то и для standby базы мы задаем SID test.
Не забываем перестартовать listener:
$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/lsnrctl start
Также нам необходимо создать на основе файлов параметров основной базы файл параметров для standby. Для этого перепишем на standby сервер файл pfilePROD.ora, переименовав его в pfileSTAN.ora, и внесем необходимые исправления в ту его часть, которую мы редактировали ранее:
# эти параметры нам понадобятся для работы в режимах PRIMARY и STANDBY
db_name=’test’
db_unique_name=’teststan’
log_archive_config=’dg_config=(testprod,teststan)’
log_archive_dest_1=’SERVICE=testprod LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=’testprod’ log_archive_dest_2=’LOCATION=/oradata/test/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=teststan’
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
# эти параметры нам понадобятся для работы только в режиме STANDBY
fal_client=’teststan’
fal_server=’testprod’
standby_file_management=’AUTO’
При размещении standby базы в других каталогах также добавляем необходимые параметры:
Пришло время стартовать standby экземпляр базы:
SQL> startup nomount pfile=’/data/backup/pfileSTAN.ora’;
SQL> create spfile from pfile=’/data/backup/pfileSTAN.ora’;
SQL> shutdown immediate;
SQL> startup nomount;
Разворачиваем standby базу из бэкапа. Для этого переходим на основной сервер и запускаем rman.
Подключаемся к будущей standby базе и выполняем дуплицирование (мы помним, что бэкап данных и контрольный файл у нас лежат в каталоге, который и с основного сервера и со standby виден как /data/backup):
RMAN> connect auxiliary sys@teststan
RMAN> duplicate target database for standby nofilenamecheck dorecover;
Параметр nofilenamecheck нам нужен, чтобы rman не ругался на повторяющиеся имена файлов (если мы используем одинаковую структуру каталогов на основном и standby серверах).
Если все прошло успешно, то переводим систему в режим автоматического применения транзакций на standby базе.
Переключаем журнальный файл и смотрим последний номер архивного журнала на основной базе:
SQL> alter system switch logfile;
System altered.
SQL> select max(sequence#) from v$archived_log;
Теперь переходим на standby сервер.
Проверяем состояние базы:
SQL> select name,open_mode,log_mode from v$database;
SQL> select max(sequence#) from v$log_history;
Мы видим, что последний примененный лог на standby отстает от основной базы, а также, что процессы ARCH не работают.
Проверяем наличие standby redo logs:
SQL> select * from v$standby_log;
Если их нет – создаем:
SQL> alter database add standby logfile group 4 ‘/oradata/test/stnbylog01.log’ size 50m;
Database altered.
SQL> alter database add standby logfile group 5 ‘/oradata/test/stnbylog02.log’ size 50m;
Database altered.
SQL> alter database add standby logfile group 6 ‘/oradata/test/stnbylog03.log’ size 50m;
Database altered.
Переводим нашу standby базу в режим Real-time apply redo:
SQL> alter database recover managed standby database using current logfile disconnect;
Смотрим, что получилось:
SQL> select recovery_mode from v$archive_dest_status;
RECOVERY_MODE
————————
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
MANAGED REAL TIME APPLY
SQL> select max(sequence#) from v$log_history;
Как видим, все работает.
Если мы не хотим использовать режим Real-time apply redo, а хотим дожидаться когда будет закончено формирование очередного архивного журнала на основном сервере и он будет передан на standby для применения сохраненных в нем транзакций, то нам необходимо переводить нашу standby базу в режим redo apply командой:
SQL> alter database recover managed standby database disconnect;
Если что-то пошло не так, то для решения проблемы в первую очередь необходимо остановить «накатку» логов:
SQL> alter database recover managed standby database cancel;
Возможно, что в процессе дуплицирования на standby сервер были переданы не все архивные журналы. Тогда их надо вручную скопировать на standby сервер (в нашем случае в каталог /oradata/test/archive), произвести ручную «накатку»:
SQL> recover standby database;
и после этого опять запустить режим Real-time apply redo:
SQL> alter database recover managed standby database using current logfile disconnect;
Процессы переключения ролей между экземплярами (switchover) и перевода standby базы в режим primary в случае падения основной базы (failover) имеют множество своих подводных камней, поэтому это тема отдельной статьи.