Часто задаваемые вопросы по OpenEdge RDBMS
VI. Вопросы обслуживания данных
46. Я использую массив RAID. Должен ли я по-прежнему делать backup-копии?
Безусловно. Хотя дисковый массив и обеспечивает некоторую избыточность и может помочь при некоторых сбоях, он не спасет вас от наводнения и не поможет вам, если вы запустите пакетную задачу обработки конца месяца в неправильный день или введете команду rm * в неправильном месте.
47. Как часто следует выполнять резервное копирование базы данных?
Как минимум, вы должны делать ежедневные, еженедельные и ежемесячные «холодные» копии. Если вы используете утилиту копирования базы данных OpenEdge (PROBKUP), вы можете делать онлайн или «горячие» копии, когда база данных продолжает использоваться. Вы должны проверять ваши копии, чтобы убедиться, что они целые и что вы можете их восстановить.
Частота резервного копирования зависит от того, как много данных вы можете себе позволить потерять. Если вы делаете еженедельные копии по субботам, а сбой происходит вечером в пятницу, то, восстановив самую свежую копию, вы потеряете данные почти за всю неделю.
Если вы делаете еженедельные копии и используете After-Image, то вы можете восстановить самую свежую копию и накатить файлы After-Image за неделю до точки сбоя. В этом случае вы потеряете данные лишь за несколько минут.
48. Какие доступны инструменты для резервного копирования?
Программа резервного копирования, поставляемая с OpenEdge RDBMS, называется probkup и является предпочтительным выбором. Она может выполнять холодное (offline) копирование базы данных, также как и горячее (online) копирование. Результат может быть направлен на одну или более магнитных лент на ленточном накопителе или в один или более дисковых файлов. Программа probkup знает, какие файлы необходимо включить для создания полной копии базы данных.
Для холодного копирования вы можете также использовать утилиты резервного копирования, поставляемые с вашей операционной системой. Однако это не является такой уж хорошей идеей. Такие инструменты ничего не знают о том, что такое база данных и какие файлы необходимо скопировать. Для их использования вы должны предоставить в качестве входной информации список файлов, которые необходимо скопировать. Когда вы добавляете или удаляете экстенты и области в базе данных, вы должны изменить эти списки. Об этом можно легко забыть, и тогда ваши копии станут бесполезными.
49. Следует ли использовать утилиты резервного копирования из UNIX или Windows, или использовать probkup?
Утилита резервного копирования OpenEdge (probkup) всегда является предпочтительным выбором. Она знает, где находятся все файлы; она знает, запущена или остановлена база данных. Утилита probkup обеспечивает самый безопасный способ резервного копирования вашей базы данных.
Вы можете использовать утилиты резервного копирования вашей операционной системы или независимых поставщиков для резервного копирования системы, приложений, конфигурационных файлов и так далее, и только для холодного копирования баз данных, когда база данных остановлена. Вы не можете использовать утилиты резервного копирования вашей операционной системы или независимых поставщиков для копирования работающей базы данных, потому что обычно база данных содержит данные в памяти, так что копирования дисковых файлов недостаточно. Все такие копии будут полностью бесполезны.
Если Вам необходимо горячее копирование, чтобы избежать остановки базы данных, Вы можете использовать один из следующих методов:
- Используйте утилиту резервного копирования OpenEdge (probkup) с опцией «online».
- Выполните «split mirror backup». Чтобы это сделать, вы сначала устанавливаете для базы данных «quiet point» с помощью proutil, затем выполняете расщепление вашего дискового зеркала, завершаете «quiet point», копируете файлы базы данных с неактивной стороны вашего зеркала на целевое устройство резервного копирования, и, наконец, ресинхронизируете зеркала. Вы должны учитывать, что действие «quiet point» начинается после появления в журнале базы данных соответствующего сообщения, а не после того, как закончилось исполнение команды proutil. Также заметим, что в то время, когда зеркала расщеплены, вы не имеете никакой избыточности, и дисковый сбой может быть катастрофическим. Для того чтобы этого избежать, некоторые используют диски с тройным зеркалом.
- Если у вас имеется подсистема дисковой памяти EMC, вы можете использовать функцию EMC snapshot.
Замечание для пользователей Windows: различные коммерческие утилиты резервного копирования могут влиять на работу базы данных, если база данных используется во время работы программы резервного копирования. Программа резервного копирования может устанавливать монопольные блокировки на файлы во время их резервного копирования, и это может вызвать фатальные ошибки ввода-вывода в базе данных, когда она пытается прочитать или записать в файл, заблокированный программой резервного копирования. По крайней мере, одна утилита резервного копирования может быть настроена, чтобы закрывать программы, которые имеют открытый файл, который выбран для резервного копирования. По крайней мере, одна утилита, Ferro Backup, может быть настроена для обхода блокировок открытых файлов, так что она все равно может их копировать. Однако все такие копии файлов базы данных полностью бесполезны и будут повреждены, если база данных работает во время копирования. Наилучшим способом действий является настройка утилиты резервного копирования в Windows так, чтобы она пропускала файлы базы данных и их каталоги, и использовать probkup для создания резервных копии базы данных. Сканеры вирусов также могут ошибочно помещать в карантин или удалять файлы резервного копирования и/или базы данных.
50. Когда следует использовать опцию -norecover для probkup?
Только если у вас возникают проблемы с восстановлением после сбоя.
Когда Вы создаете резервную копию в offline, программа копирования выполняет восстановление после сбоя после ее запуска, и затем она не включает данные журнала Before-Image в создаваемую копию, так как они не нужны и получающаяся копия будет иметь меньший размер. Опция -norecover позволяет сделать резервную копию без выполнения первого этапа – восстановления после сбоя, при этом резервная копия будет включать полный журнал Before-Image. Если у вас возникает проблема при восстановлении после сбоя, вы можете с помощью -norecover создать копию поврежденной базы данных перед попыткой ее восстановления.
Заметим, что содержимое журнала Before-Image всегда включается в резервную копию, когда вы создаете копию в режиме online.
51. Как создать резервную копию с использованием probkup?
Для создания резервной копии базы данных с именем «foo» на другом диске, вы можете использовать команды, подобные следующим:
BKDATE=`date +%Y%m%d_%H%M%S` probkup foo -com /backups/foo/foo_${BKDATE}.bak
Команда создаст резервную копию в единственном файле. Вы также можете создавать копию в виде нескольких файлов, используя параметр -vs чтобы указать размер выходного файла. Чтобы сделать копию без необходимости вводить все имена выходных файлов, вы можете использовать скрипт, аналогичный показанному ниже (этот скрипт тестировался на системе Solaris, не содержит проверок на ошибки и может потребовать некоторых изменений в зависимости от вашего интерпретатора shell):
#! /bin/bash # DB_NAME="foo" BK_DIR="/backups/${DB_NAME}" BK_DATE=`date +%Y%m%d_%H%M%S` BK_FILES="${BK_DIR}/${DB_NAME}_${BK_DATE}_part_" rm -f bklist touch bklist COUNTER=2 while [ $COUNTER -lt 100 ] do echo ${BK_FILES}`printf "%02d" ${COUNTER}` >> bklist COUNTER=`expr $COUNTER + 1` done echo "Starting backup of ${DB_NAME} to ${BK_DIR}" mkdir -p ${BK_DIR} probkup ${DBNAME} ${BK_FILES}01 -vs 100000 -com <bklist # FILE_COUNT=`ls ${BK_FILES}* | wc -l` FILE_COUNT=`expr ${FILE_COUNT}` for I in ${BK_FILES}* do mv ${I} ${I}_of_${FILE_COUNT}.bak done rm bklist echo "Backup of ${DB_NAME} in ${FILE_COUNT} parts completed."
Резервная копия будет сохранена в виде нескольких файлов (от 1 до 99), в зависимости от размера базы данных. Каждый файл будет содержать 100 000 блоков (или то количество, которое вы указали в параметре –vs), за исключением последнего файла, который будет меньше. До тех пор, пока копия занимает 99 или меньше файлов, это будет работать. Лишние имена файлов в списке игнорируются, так что вы можете увеличить список при необходимости. Если же список слишком короткий, процесс копирования закончится с ошибкой, когда он попытается получить следующее имя выходного файла.
52. Как восстановить резервную копию, полученную с помощью probkup?
Во-первых, вы должны создать пустую структуру базы данных, куда вы будете восстанавливать скопированные данные (если вы не создадите пустую структуру, утилита prorest создаст один экстент переменного размера для каждой области хранения). Эта структура должна содержать те же области хранения (имена и номера), что и оригинальная база данных, но экстенты не обязаны быть такими же, если для каждой области хранения их суммарный размер достаточен для хранения всех данных.
- Чтобы определить, какие области хранения содержатся в резервной копии, используйте следующую команду (предполагается, что база данных называется «foo», а файл копии называется «foo_20101010.bak»).
prorest foo foo_20101001.bak -list
Это даст вам список всех областей хранения, их размеров и других параметров. Более подробную информацию можно найти в руководстве OpenEdge Database Administration. Перед восстановлением вы должны:
- Создать соответствующий файл определения структуры «foo.st» в текстовом редакторе.
- Проверить, что ваш файл структуры не содержит синтаксических ошибок.
prostrct create foo -validate
- Убедиться, что все необходимые вам точки подключения доступны и имеют достаточно дискового пространства.
- Создать пустую структуру базы данных. Вы можете указать при этом другой размер блока.
prostrct create foo -blocksize 8192
- Теперь восстановите резервную копию:
prorest foo foo_20101001.bak
Когда восстановление закончится, вы закончили процесс. Или нет? Как насчет других файлов, которые вам могут понадобиться, таких, как файл keystore (используемый OpenEdge Transparent Encryption), скрипт резервного копирования, файлы параметров .pf, и так далее?
53. Как переместить таблицу в другую область хранения?
Существует несколько способов переместить таблицу и её индексы. Для небольших таблиц вы можете использовать утилиту tablemove. Она может переместить только таблицу или таблицу вместе с индексами.
Для больших таблиц использование утилиты tablemove не рекомендуется из-за большого объема создаваемых в журнале транзакций записей, которые она генерирует при создании записи в новом месте и удалении ее в старом. Например, при перемещении 35-гигабайтной таблицы и ее индексов, наблюдался рост журнала before-Image до 300 гигабайт. Вместо утилиты tablemove вы должны использовать утилиту двоичного дампирования, и затем использовать двоичную загрузку в новое место.
Если вы перемещаете все содержимое области, то, после выполнения загрузки данных, вы можете усечь старую область. Вы также можете переместить всю область в новое место путем перемещения экстентов данных и затем использовать prostrct repair для указания новых путей для экстентов, которые вы переместили.
54. Какой самый простой способ для создания локальной копии базы данных?
Имеется несколько способов.
- Самый простой способ это использовать утилиту procopy. Если вы создаете копию большой базы данных, сначала подготовьте файл определения структуры хранения, чтобы указать, где должны быть размещены экстенты.
- Вы можете создать резервную копию с помощью probkup и затем восстановить ее в нужном месте.
- Вы также можете использовать утилиту копирования файлов операционной системы, чтобы скопировать каждый экстент и файл .db в новое место. Если вы используете этот способ, вы также должны подготовить файл определения структуры, в котором будет указано новое расположение всех экстентов, и затем использовать утилиту prostrct repair для изменения нового расположения экстентов в скопированном файле .db. Если не выполнить prostrct repair, возникнут проблемы, так как копия файла.db будет содержать полные пути к экстентам в их старом месте. Если запустить базу данных, будут использованы оригинальные экстенты, а не их копии и база данных может быть повреждена. Вы можете использовать команду prostrct list, чтобы получить текущее определение структуры.
Не забудьте о других файлах (скрипты, файлы .pf и т.д.) которые также нужно скопировать и отредактировать.
55. Как переименовать базу данных?
Предположим, ваша база данных называется «spam» и вы хотите переименовать ее в «eggs», для этого необходимо сделать следующее:
- Получите текущий файл определения структуры, его имя будет «spam.st», следующим образом:
prostrct list spam
- Скопируйте файл «spam.st» в «eggs.st»
- Отредактируйте файл «eggs.st» и измените все вхождения «spam» на «eggs». Сохраните ваши изменения.
- Переименуйте файл «spam.db» в «eggs.db».
- Переименуйте файл «spam.lg» в «eggs.lg».
- Если вы используете файл keystore «spam.ks», переименуйте его в «eggs.ks».
- Переименуйте все другие файлы, которые содержатся в вашем отредактированном файле определения структуры.
- Измените файл «eggs.db» с новыми путями к экстентам с помощью команды:
prostrct repair eggs
- Если вы используете файл параметров «spam.pf», отредактируйте его и замените все вхождения «spam» на «eggs». Сохраните ваши изменения и переименуйте файл в «eggs.pf».
Не забудьте изменить имя базы данных во всех скриптах и документах, например, в скриптах запуска и остановки сервера базы данных, резервного копирования, управления AI-журналами, мониторинга, в расписании cron, в инструкциях пользователя и администратора баз данных, в планах аварийного восстановления и т.п.
Вы можете также предварительно потренироваться на базе данных, которую можно потом просто выбросить, чтобы отработать правильную процедуру.
56. Как переместить базу данных на другой сервер?
Простейший способ переноса базы данных с одного сервера на другой – это сделать резервную копию и восстановить ее на новом сервере. Однако заметим, что резервные копии не являются переносимыми между различными операционными системами или типами процессоров.
Альтернативный метод, но требующий больше времени – сделать двоичный дампы всех ваших таблиц и затем загрузить их в новую базу данных на новом сервере. Файлы двоичных дампов являются переносимыми между различными операционными системами, типами процессоров и версиями OpenEdge.
57. Как часто следует делать дамп и загрузку моих данных?
Мы слышали, что некоторые люди выполняют дампирование и перезагрузку их данных через регулярные интервалы, скажем раз в год. Это не должно быть необходимо, если вы не используете древние версии и используете области хранения типа II. Однако если вы выполняете некоторую реорганизацию, вы можете сделать это. Здесь приведены некоторые причины, по которым дампирование и перезагрузка может оказаться полезными:
- Вы выполняете конвертирование областей хранения с типа I в тип II. Вы должны перезагрузить данные. Некоторые возможности базы данных и языка 4GL требуют, чтобы данные были в областях типа II.
- Вы хотите использовать другой размер блока данных. Размер блока данных указывается при создании базы данных и затем не может быть изменен.
- Вы хотите использовать другое значение maximum rows-per-block. Это значение определяется при создании области хранения данных и затем не может быть изменено.
- Вы хотите изменить операционную систему или тип процессора.
- Вы хотите переупорядочить записи в таблице так, чтобы физический порядок хранения соответствовал некоторому конкретному индексу.
58. Следует ли использовать «нормальный» или двоичный дамп?
Как правило, следует использовать двоичный дамп. «Нормальные» дампы выполняются в текстовом формате, в том же, который создается оператором EXPORT языка 4GL. Данные переводятся в символьный формат, разделяются символом-разделителем, значения символьных полей заключаются в кавычки. Это требует больше времени на обработку и файлы имеют больший размер, чем в двоичном дампе, который содержит записи в формате хранения базы данных.
С другой стороны, «нормальный» дамп позволит обнаружить некоторые повреждения записей, которые двоичный дамп не обнаруживает. Это связано с тем, что нормальный дамп требует декодирования каждого поля и преобразования его в символьный формат. Двоичный дамп не проверяет индивидуальные значения полей, выгружая полные записи в двоичном формате хранения их в базе данных.
Результат нормального дампа намного легче прочитать из другого программного обеспечения, чем результат двоичного дампа (формат двоичного дампа не документирован).
59. Какой способ дампирования и загрузки данных самый быстрый?
Общий подход заключается в том, чтобы выполнять несколько операций в параллельном режиме, запустив две или более операций в одно и то же время. Утилита двоичного дампирования позволяет задать индекс, который будет использован для управления дампированием. Можно также указать диапазон строк для дампирования, когда вы не хотите выгружать все строки, или разделить большой дамп среди нескольких экземпляров программы дампирования.
Следующая информация может оказаться полезной:
- Dan Foreman, «Binary Dump & Load Checklist», доступно на сайте Progress Communities.
- Tom Bascom, доклад на Exchange 2006 «Highly Parallel Dump and Load», доступно на сайте Progress Communities по адресу http://communities.progress.com/pcom/docs/DOC-15841 (смотрите сессию DB-8) и на сайте Тома http://www.greenfieldtech.com/downloads
60. Какой самый быстрый способ подсчитать все записи в таблице?
Самый быстрый способ подсчитать количество всех записей – это выполнить proutil tabanaly для области данных, которая содержит интересующую вас таблицу. Это даст вам количество записей во всех таблицах в этой области данных.
Еще один способ подсчитать строки в таблице — выполнить инструкцию SQL SELECT COUNT(*) FROM «mytable» из утилиты SQL Explorer. Утилита sqlexp использует драйвер JDBC и OpenEdge SQL Server.
Еще один способ подсчитать строки – выполнить запрос FOR EACH с опцией TABLE-SCAN. Например, так:
n = 0. for each mytable table-scan no-lock: n = n + 1. end.
61. Какой самый быстрый способ удалить все записи из таблицы?
Самый быстрый способ удалить все записи из таблицы – это использовать оператор SQL DROP TABLE. При этом также будет удалено описание таблицы, так что ее потребуется создать заново, если она еще необходима. Соответственно, вы должны использовать словарь данных для выгрузки определения таблицы в файл.df перед ее удалением.