Создание TARGET-базы средствами операционной системы
В стандартном варианте для создания TARGET-баз данных используется резервная копия SOURCE-базы, созданная с помощью утилиты PROBKUP. И это правильно, надежно и удобно, но только до поры до времени, пока размер базы данных небольшой, скажем до 100Гб. Но что если размер базы данных несколько сотен гигабайт? Время на формирование резервной копии значительно увеличивается, а значит, увеличивается время, необходимое для восстановления TARGET-базы, если по каким-либо причинам, сознательно или нет, мы её «потеряли». Впрочем, и для первичной настройки репликации не хочется тратить драгоценное время на формирование резервной копии стандартными средствами OpenEdge. В этой статье я расскажу, как восстановить TARGET-базу не используя утилиту PROBKUP с минимальным временем простоя базы данных. Свой пример приведу с использованием обычной команды копирования в Linux – cp. Её вы всегда можете заменить на что-то другое, более эффективное, например, сформировав копию базы с помощью технологии снапшотов, что в разы быстрее. Главное, это порядок ваших действий при копировании базы данных средствами операционной системы.
Для выполнения нашего примера, нам сначала надо активировать в базе данных механизм OpenEdge Replication. Я не стал изощряться с настройками репликации и использовал минимально необходимый набор параметров для её работы. Для наших опытов, как обычно, используем базу данных sports из каталога $DLC. Итак, начнем.
Создадим каталог для базы данных:
$ mkdir replic $ cd replic/ $ mkdir source $ cd source/
Сделаем копию базы $DLC/sports в каталог source:
$ procopy $DLC/sports ./sports
Для работы OpenEdge Replication необходим механизм After-Imaging. Добавим в базу AI-экстенты, затем, в нашем случае, пометим базу как скопированную и включим After-Imaging. В завершении активируем механизм автоматической архивации AI-экстентов AI File Management.
Создаем st-файл с описанием AI-экстентов:
vi ai.st
Описываем AI-экстенты, для примера хватит пяти. Рекомендую использовать AI-экстенты переменного размера. Разницы в производительности между использованием переменных и фиксированных AI-экстентов фактически нет, зато с фиксированными экстентами проблем больше (семи штук по количеству дней в неделе):
a . a . a . a . a . a . a .
Добавляем AI-экстенты.
$ prostrct add sports ai.st Formatting extents: size area name path name 16 After Image Area 1 /home/valeriy/replic/source/sports.a1 00:00:00 16 After Image Area 2 /home/valeriy/replic/source/sports.a2 00:00:00 16 After Image Area 3 /home/valeriy/replic/source/sports.a3 00:00:00 16 After Image Area 4 /home/valeriy/replic/source/sports.a4 00:00:00 16 After Image Area 5 /home/valeriy/replic/source/sports.a5 00:00:00
Помечаем базу как скопированную:
$ rfutil sports -C mark backedup
Включаем After-Imaging:
$ rfutil sports -C aimage begin The BI file is being automatically truncated. (1526)
Теперь подготовим файл настроек репликации для Source-базы. Возьмем его шаблон из $DLC:
cp $DLC/properties/source.repl.properties ./
Переименуем полученный файл:
$ mv source.repl.properties sports.repl.properties
Отредактируем содержимое, чтобы настройки выглядели так:
[server] control-agents=agent1 database=sports transition=manual transition-timeout=1200 defer-agent-startup=1400 [control-agent.agent1] database=sports host=localhost port=4501 connect-timeout=120 replication-method=async critical=0 [transition] database-role=normal
Здесь мы только изменили имя нашей базы в параметре database секций [server] и [control-agent.agent1], а также добавили в секцию [server] параметр defer-agent-startup=1400. Параметр defer-agent-startup указывает серверу репликации на то, как долго он должен ждать появления коннекта к TARGET-базе в минутах.
Мы готовы к активации OpenEdge Replication:
$ proutil sports -C enablesitereplication source Replication (source) is now enabled for database sports. (10351)
В завершении активируем AI File Management:
$ rfutil sports -C aiarchiver enable Archiver has been enabled.
Создадим файл параметров для старта базы sports:
$ vi sports.pf
Его содержимое:
-S 4500 -B 10000 -L 20000 -spin 10000 -pica 10000 -bibufs 30 -aibufs 30 -aistall -aiarcdir ./ai -aiarcdircreate -aiarcinterval 300 -bithold 75000 -bistall -DBService replserv
Мы готовы к старту базы данных с включенным механизмом OpenEdge Replication:
$ proserve sports -pf sports.pf OpenEdge Release 11.x as of Tue Aug 23 19:00:21 EDT 2011 17:22:15 BROKER The startup of this database requires 49Mb of shared memory. Maximum segment size is 1024Mb. 17:22:15 BROKER 0: Multi-user session begin. (333) 17:22:15 BROKER 0: Connections to this database will not be allowed until all Database Services started have completed their startup and initialisation. (10545) 17:22:15 BROKER 0: Before Image Log Initialisation at block 0 offset 235. (15321) 17:22:15 BROKER 0: The After-image Extent Management daemon has created the directory /home/valeriy/replic/source/ai. (13217) 17:22:15 BROKER 0: Login by valeriy on /dev/pts/0. (452) 17:22:15 BROKER 0: The OpenEdge Replication Server is starting... 17:22:15 BROKER 0: Started for 4500 using TCP IPV4 address 0.0.0.0, pid 25734. (5644)
С этой минуты стартованный сервер репликации будет проверять возможность подключение к своей TARGET-базе. При этом наши пользователи могут полноценно работать с базой sports. Стоит ли говорить о том, что пока мы не создали TARGET-базу, заполненные AI-экстенты не будут освобождаться. Следите за ними, и пока они все не заполнились, либо добавьте новые AI-экстенты в online, либо увеличьте интервал переключения между AI-экстентами в AI File Management, либо AI File Management отключите на это время. В последних двух случаях главное, чтобы AI-экстенты базы были переменного размера. Следить за состоянием AI-экстентов можно командой:
$ rfutil sports -C aimage extent list
Итак, у нас есть стартованная базы данных с работающим механизмом OpenEdge Replication. Настало время приступить к созданию TARGET-базы средствами операционной системы. Особенность формирование резервной копии любой базы данных нестандартными средствами заключается в том, что во время формирования, пользователи могут внести изменения в базу данных, что приведет к рассогласованности и повреждению такой копии. Чтобы этого избежать необходимо на время копирования остановить транзакционную активность в копируемой базе. У нас есть два варианта, либо остановить SOURCE-базу, что подразумевает отключение всех пользователей и в большинстве случаев не представляется возможным, либо остановить транзакционную активность на стартованной базе командой PROQUIET. В последнем случае все пользователи останутся подключенными к базе, лишь их действия по изменению данных просто будут «заморожены», в то время как пользователи, которые формируют отчеты, не вносящие ни каких изменений в базу, будут продолжать работать. После восстановления транзакционной активности «замороженные» пользователи продолжат работать так, как ни в чем не бывало.
На стартованной базе останавливаем транзакционную активность:
$ proquiet sports enable -REPLTargetCreation
Обратите внимание на параметр <-REPLTargetCreation>, он обязателен для создания копии для TARGET-базы. Кроме того, этот параметр чувствителен к регистру, поэтому его написание должно быть точно таким, как в примере.
Начнём копирование, но перед этим создадим в каталоге replic каталог target, в который и будем копировать:
$ mkdir ../target
Внимание! В нашем примере мы имеем дело с простой структурой базы, в то время как файлы промышленной базы данных могут размещаться в разных каталогах файловой системы. Не забудьте скопировать все файлы, в этом вам поможет структурный файл базы, в котором прописаны пути ко всем файлам. Предварительно обновите структурный файл командой PROSTRCT LIST.
Копируем базу:
$ cp ./sports* ../target/
Восстанавливаем транзакционную активность в исходной базе:
$ proquiet sports disable
База данных вернулась в рабочее состояние, и пользователи вновь работают с ней. Забудем на время о SOURCE-базе.
Переходим в каталог с копией:
$ cd ../target/
В первую очередь изменяем файл настроек репликации target/sports.repl.properties. Удаляем в нём все настройки и вносим новые:
[agent] database=sports listener-minport=4387 listener-maxport=4500 [transition] database-role=normal
Удалим lock-файл, который остался от SOURCE-базы. В этом примере мы его захватили при копировании, но его можно сразу исключить на стадии копирования. Внимание!Будьте осторожны! Никогда не удаляйте lk-файл промышленной базы, находящейся в стартованном состоянии. Прежде чем его удалить в такой базе, убедитесь, что с базой никто не работает. В противном случае удаление lk-файла на работающей базе может привести к непоправимым последствиям. В нашем случае его можно удалить, так как это копия промышленной базы, с которой действительно ни один процесс не работает.
$ rm -f sports.lk
Изменим пути к файлам базы в структурном файле sports.st на новое расположение этих файлов, заменив каталог source на каталог target. После чего корректируем пути непосредственно в базе данных:
$ prostrct repair sports sports.st Prostrct repair of database sports using structure file sports.st completed. (13485)
Изменяем роль базы данных с SOURCE на TARGET:
$ proutil sports -C enablesitereplication target Replication (target) is now enabled for database sports. (10351)
Отключаем механизмы AI File Management и After-Imaging, унаследованные от SOURCE-базы:
$ rfutil sports -C aiarchiver disable After-image Extent Management has been disabled for the database. (13292) $ rfutil sports -C aimage end After-image disabled. (846)
Изменяем файл параметров sports.pf. Теперь он должен содержать следующее:
-S 4501 -B 10000 -L 20000 -spin 10000 -bibufs 50 -pica 10000 -DBService replagent
Проверяем, что сервер репликации на SOURCE-базе по-прежнему работает:
$ dsrutil ../source/sports -C monitor OpenEdge Replication Monitor Page 1 Database: /home/valeriy/replic/source/sports S. Replication server status R. Replication server remote agents A. Replication agent status M. Modify display defaults Q. Quit Enter your selection:
Выбираем S (Replication server status):
OpenEdge Replication Monitor Page 1 Database: /home/valeriy/replic/source/sports Database is enabled as OpenEdge Replication: Source Server is: Connecting to Agent(s) Number of configured agents: 1 Defer Agent Startup : Continue connection attempts until: Thu Nov 24 17:50:17 2011 Deferred Agent startup will expire in : 22 Hr 55 Min 45 Sec Next connection attempt in : 4 Min 58 Sec Connection attempts performed : 4 Agent(s) currently connected : 0 Delay Interval (current / min / max): 5 / 5 / 500 Recovery information: State: No recovery being performed Agents needing recovery: 0 Agents connected: 0 Agents in synchronization: 0 Transition information: Type: Manual RETURN - repeat, U - continue uninterrupted, Q - quit:
Во-первых, мы подключились – уже хорошо, значит, сервер репликации жив. Во-вторых, в строке «Next connection attempt in» видим, что у нас есть время до следующей попытки подключения. В прочем, не страшно, если в этом поле будет вместо времени значение «Now occurring». Главное, что сервер работает.
Стартуем TARGET-базу:
$ proserve sports -pf sports.pf 18:58:10 BROKER The startup of this database requires 54Mb of shared memory. Maximum segment size is 1024Mb. 18:58:10 BROKER 0: Multi-user session begin. (333) 18:58:10 BROKER 0: Connections to this database will not be allowed until all Database Services started have completed their startup and initialisation. (10545) 18:58:10 BROKER 0: Begin Physical Redo Phase at 0 . (5326) 18:58:10 BROKER 0: Physical Redo Phase Completed at blk 0 off 1198 upd 0. (7161) 18:58:10 BROKER 0: At end of Physical redo, transaction table size is 5445. (13547) 18:58:10 BROKER 0: Login by valeriy on /dev/pts/0. (452) 18:58:10 BROKER 0: The OpenEdge Replication Agent is starting... 18:58:10 BROKER 0: Started for 4501 using TCP IPV4 address 0.0.0.0, pid 26032. (5644)
Вновь подключаемся к мониторингу сервера репликации:
$ dsrutil ../source/sports -C monitor
Параллельно в отдельном окне подключаемся к мониторингу агента репликации на TARGET-базе, для этого:
$ dsrutil ../target/sports -C monitor OpenEdge Replication Monitor Page 1 Database: /home/valeriy/replic/target/sports S. Replication server status R. Replication server remote agents A. Replication agent status M. Modify display defaults Q. Quit
Выбираем A (Replication agent status):
OpenEdge Replication Monitor Page 1 Database: /home/valeriy/replic/target/sports Database is enabled as OpenEdge Replication: Target Agent: Name: agent1 ID: 1 Host name: 127.0.0.1 State: Normal Processing Ready: Yes Critical: No Method: Asynchronous Agent is waiting for: Nothing Maximum bytes in TCP/IP message: 8504 Server/Agent connection time: Wed Nov 23 19:00:44 2011 Delay Interval (current / min / max): 180 / 5 / 500 Transition information: Type: Manual The last block received at: Wed Nov 23 19:00:45 2011 Activity information: Blocks received: 1 Blocks processed: 1 RETURN - show remaining, U - continue uninterrupted:
Видим, что статус репликации получил значение «Normal Processing». В тоже время мониторинг сервера репликации должен в поле «Server is» показать значение «In Normal Processing».
OpenEdge Replication Monitor Page 1 Database: /home/valeriy/replic/source/sports Database is enabled as OpenEdge Replication: Source Server is: In Normal Processing Number of configured agents: 1 Delay Interval (current / min / max): 500 / 5 / 500 Recovery information: State: No recovery being performed Agents needing recovery: 0 Agents connected: 0 Agents in synchronization: 0 Transition information: Type: Manual RETURN - repeat, U - continue uninterrupted, Q - quit:
Что и следовало доказать. Мы получили работающую репликацию.
В следующей статья я расскажу как создать одновременно две базы Target и как добавить вторую Target к существующей конфигурации.
Метка:OpenEdge Replication