21 ноября, среда 21:26
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

Скрипты резервного копирования

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Скрипты резервного копирования

    По материалам личного участия в обисквичивании нескольких банков.

    Основные отличия от встроенного решения. Файлы с бэкапами создаются сразу сжатые gzip-ом. Процедура восстановления не предусматривает интерактива. Сразу предусматривается стирание старых архивов и копирование на резервный сервер (примечание: стирание архивов с резервного сервера не предусматривается).

    Требование по установке. В файле bq.sh в районе 270 строки, заменить определения переменных BQFBKUP и BQIBKUP на
    Код:
       BQFBKUP=${BQBKUPDIR}/${BQNAME}.f
       BQIBKUP=${BQBKUPDIR}/${BQNAME}.i
    Предупреждение. Разумеется, до использования необходимо понять, как именно работают эти скрипты. Поэтому они такие маленькие. А потому, что было требование "маленькие и понятные", error handling сведена к минимуму. Т.е., другими словами, никакой набор чужих скриптов не заменит своей головы.
    /kiv

  • #2
    В качестве конструктивной критики.
    При передаче данных с одного сервера на другой возможен сбой связи. В этом случае архив с БД будет не скопирован вообще или скопирован с ошибкой. Таким образом при восстановлении базы возможны две ситуации:
    1. Будет восстанавливаться битый архив; Соответственно резерва не будет вообще;
    2. Будет восстанавливаться предпоследний архив; Что по сути означает отсутствие актуального архива.

    В любом случае резервная база будет в неактуальном состоянии, а у администратора ложное ощущение безопасности.

    Поэтому логично в скрипте создания архива добавить создание хэша архива, например, с помощью md5 и передавать его на резервный сервер вместе с архивом БД.
    При восстановлении создавать md5 полученного архива и сравнивать с эталонным (полученным с основного) и только в случае успешного сравнения уничтожать резервную БД и восстанавливать ее из резервной копии. В противном же случае отправлять письмо администратору систему.

    Комментарий


    • #3
      Сообщение от Маслов Д. А. Посмотреть сообщение
      Поэтому логично в скрипте создания архива добавить создание хэша архива, например, с помощью md5 и передавать его на резервный сервер вместе с архивом БД.
      При восстановлении создавать md5 полученного архива и сравнивать с эталонным (полученным с основного) и только в случае успешного сравнения уничтожать резервную БД и восстанавливать ее из резервной копии. В противном же случае отправлять письмо администратору систему.
      scp как раз это самое и делает (не уверен, какой алгоритм используется при подсчёте контрольной суммы; в любом случае, "хороший" в криптографическом смысле). Поэтому мне достаточно анализировать код возврата scp. Альтернативную ветвь логики (что делать, если scp вернула не 0), нужно воткнуть перед fi. Мне не требуется, т.к. отчёты из крона я читаю глазами, а не процмейлом.
      UPD: вот типичный вывод
      Код:
      /home/bis/quit41d/backup/bq41d.f OK
      
      1968656 active blocks out of 1968882 blocks in /opt/quit/db/bisquit will be dumped. (6686)
      6656 BI blocks will be dumped. (6688)
      Backup requires an estimated 15.1 GBytes of media. (9285)
      Restore would require an estimated 1977328 db blocks using 1.9M of media. (9286)
      Backed up 1975312 db blocks in 00:22:58
      Wrote a total of 58156 backup blocks using 15.1 GBytes of media. (13625)
      
      Backup complete. (3740)
      
      /home/bis/quit41d/backup/bq41d.f OK
      There is no server for database /opt/quit/db/bisquit. (1423)
      /opt/quit/db/bisquit already exists.
      Do you want to over write it? [y/n]:  Start of extending target DB to needed size... (9432)
      This is a full backup of /opt/quit/db/bisquit.db. (6759)
      This backup was taken Sun Oct 18 23:30:35 2009. (6760)
      The blocksize is 8192. (6994)
      It will require a minimum of 1975362 blocks to restore. (6763)
      Start of restoring the target DB... (9433)
      Read 1975312 db blocks in 00:23:29
      /kiv

      Комментарий


      • #4
        Как правило, АБС банка работает минимум на 2-х серверах: основном и резервном (зеркальном). Это обеспечит минимальное время простоя при каком-либо катаклизме. Поэтому следует ОБЯЗАТЕЛЬНО включить механизм ai-журналирования (для БД). Наряду с обязательным ежедневным полным бэкапом БД следует проводить архивацию ai-файлов. На резервном сервере проводится периодический накат (roll forward) на БД, восстановленную из бэкапа, выполненного сразу же после включения ai-журналирования. Таким образом, на резервном сервере имеем полноценную "реплику" БД, готовую к работе. Отставание "реплики" определяется периодом переноса ai-файлов на резервный сервер (готовность ai-файла для переноса определяется периодом aiarchiever'а).
        Единственное место в Бисквитовском скрипте, которое надо изменить:BQParams="-bibufs 75 -c 300 -aiarcdir /u/aiarc/db/ -aiarcinterval 600"
        /u/aiarc/db - каталог, где будут складироваться готовые к переносу ai-файлы
        600 - интервал переключения на пустой ai-файл в секундах
        Используя этот механизм, можно реализовать следующую схему ежедневного резервного копирования с помощью достаточно простых скриптов.
        Основной сервер:
        1. Раз в сутки останавливаем БД
        2. Раз в сутки делаем полный бэкап БД
        3. Раз в сутки делаем архив ai-файлов БД
        4. Раз в сутки стартуем БД
        5. С периодичность 10 мин (как пример) aiarchiever переключается на ведение нового ai-файла, копируя "старый" в каталог /u/aiarc/db (как пример)
        Резервный сервер:
        1. С периодичностью 10 мин (как пример) забираем с основного сервера готовые ai-файлы из каталога /u/aiarc/db (как пример)
        2. С периодичностью 10 мин (как пример) накатываем полученные ai-файлы на "лежащую" (незапущенную) БД
        3. Раз в сутки забираем с основного сервера полный бэкап БД и архивы ai-файлов за сутки (для хранения)

        Имеем следующие преимущества:
        1. При отказе основного сервера на резервном уже есть готовая к работе БД. Её надо просто запустить. Период "отставания" регулируется.
        2. Копируя "лежащую" БД ТОЛЬКО СРЕДСТВАМИ операционной системы (измение времени последнего доступа к БД приведет к невозможности дальнейшего "наката" ai-файлов), можем получить БД на любой момент времени и работать с ней.
        3. Используя полный бэкап БД за какой-либо предыдущий день и архив ai-файлов за все последующие дни можно восстановить БД на любой момент времени.

        Пример скрипта, включающего ai: db-ai-on bq41d

        #!/bin/sh
        # Lapin O.E. script to switch ai on for main BISQUIT db

        #-----------------------------------------------------------
        # For PROGRESS 10.1b
        #-----------------------------------------------------------
        PATH=$PATH:.:/usr/dlc-10.1b:/usr/dlc-10.1b/bin; export PATH
        DLC=${DLC:-"/usr/dlc-10.1b"}; export DLC
        #-----------------------------------------------------------
        PROLIB=${PROLIB:-"$DLC/bin/prolib"}; export PROLIB
        PROMSGS=${PROMSGS:-"$DLC/rus/promsgs.rus"}; export PROMSGS
        PROTERMCAP=${PROTERMCAP:-"$DLC/protermcap"}; export PROTERMCAP
        PROPATH=.:${DLC}/bin; export PROPATH

        # Check for root
        if [ -x "/usr/ucb/whoami" ]
        then
        UserName="`/usr/ucb/whoami`"
        else
        UserName="`who am i | cut -f1 -d' '`"
        fi

        if [ "$UserName" != "root" ]
        then
        exit 1
        fi

        # Check for parameters
        if [ $# != 1 ]
        then
        exit 1
        fi

        # Common variables section
        DBUdir=/u/db-utils
        LOGdir=${DBUdir}/logs
        LOGfile=${LOGdir}/`basename $0`.log
        # End of common variables session

        # Choose
        case $1 in
        bq41d) ABSdir=/home2/bis/quit41d
        DBdir=/db/db
        DBname=bisquit
        DBsource=${DBdir}/${DBname}
        AIstr=${DBdir}/${DBname}.ai.st
        AIfiles=""
        ONlog=${LOGfile} ;;

        bq41dtr) ABSdir=/home2/bis/quit41d
        DBdir=/db/db-train
        DBname=bisquit
        DBsource=${DBdir}/${DBname}
        AIstr=${DBdir}/${DBname}.ai.st
        AIfiles=""
        ONlog=${LOGfile} ;;

        *) exit 1 ;;
        esac

        # Delete old Log if exist
        [ -f ${ONlog} ] && rm -f ${ONlog}

        # Create header for log file
        date > ${ONlog}
        echo "After-image ON procedure started for "${DBdir}/${DBname}"" >> ${ONlog}

        # Check for stopped Database
        ${DLC}/bin/proutil ${DBsource}.db -C holder >> ${ONlog}
        DBSTATUS=$?
        case $DBSTATUS in
        0) ;;
        14) echo "DataBase is in single mode. Program terminated." >> ${ONlog} ; exit 1 ;;
        16) echo "DateBase is in multi-user mode. Program terminated." >> ${ONlog} ; exit 1 ;;
        esac

        # check for correct stopped DB
        if [ -f ${DBsource}.lk ]
        then
        echo "DataBase not prepare for ai on. Program terminated." >> ${ONlog}
        exit 1
        fi

        # Check for existing AI structure file
        if [ ! -f ${AIstr} ]
        then
        echo "ERROR: AI structure file "${ATstr}" is absent for "${DBdir}/${DBname}"" >> ${ONlog}
        echo " Program terminated." >> ${ONlog}
        exit 1
        fi

        # Check for existing old AI files
        AIfiles=`cat ${AIstr} | sed '/#/d' | head -1 | cut -f2 -d' ' | cut -f1 -d'.'`
        if [ -f ${AIfiles}.a* ]
        then
        echo "ERROR: AI files found for "${DBdir}/${DBname}"" >> ${ONlog}
        echo " Program terminated." >> ${ONlog}
        exit 1
        fi

        # Add ai extent to existing DB
        ${DLC}/bin/prostrct add ${DBsource} ${AIstr} >> ${ONlog}

        # Switch ai ON for DB
        ${DLC}/bin/rfutil ${DBsource} -C aimage begin >> ${ONlog}

        # Make AI Manager Enable for DB
        ${DLC}/bin/rfutil ${DBsource} -C aiarchiver enable >> ${ONlog}

        # Create footer for log file
        date >> ${ONlog}
        echo "After-image ON procedure finished for "${DBdir}/${DBname}"" >> ${ONlog}

        exit 0

        # end of script
        Ничто не вечно ...

        Комментарий


        • #5
          Сообщение от Lapin Посмотреть сообщение
          Поэтому следует ОБЯЗАТЕЛЬНО включить механизм ai-журналирования (для БД). Наряду с обязательным ежедневным полным бэкапом БД следует проводить архивацию ai-файлов.
          Не обязательно. Альтернативная возможность (не рассматривая кластеризацию на уровне ОС) состоит в инкрементальном резервном копировании (bq41d incr), с последующей донакаткой инкрементов на резервном.

          Использование ai файлов (как и их перенос), рекомендуется в случае большой транзакционной нагрузки на базу.
          /kiv

          Комментарий


          • #6
            Включение механизма ai-журналирования НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ самими разработчиками Прогресса. От этого только преимущества.
            Если вы сделали инкрементальный бэкап ПОСЛЕ совершения НЕПОПРАВИМОЙ ошибки в БД, то он Вас не спасет. Если произошел отказ диска с основными файлами БД, Вы потеряете ВСЕ данные от момента последнего бэкапа. Поскольку ai-файлы размещаются на другом физическом диске (или даже на другом сервере) Вы ВСЕГДА сможете восстановить БД, потеряв минимум данных. Накат ai-файла Вы можете сделать до ЛЮБОГО ЗАДАННОГО момента времени, отсекая ошибку и сохраняя ВСЕ данные до её совершения. Можно делать инкрементальный бэкап каждые 5 минут, но это - неграмотное решение. Инкрементальный бэкап как и полный предназначен не для обеспечения восстановления БД в случае дисковых сбоев, серьезных ошибок операторов, приведших к потере жизненно важных данных. Бэкап обеспечивает ОТПРАВНУЮ ТОЧКУ для восстановления БД при возникновении программных или аппаратных сбоев.
            Ai-журналирование практически не сказывается на производительности БД. Делая online инкрементальный бэкап Вы ПОЛНОСТЬЮ тормозите транзакционную активность. А если в этот момент идет, например, загрузка КЛАДР? Кроме всего прочего, БД имеют явно выраженную тенденцию к безудержному росту. Да, для маленьких некритичных БД, наверное, подойдет и инкрементальный бэкап. Но уверяю Вас, наиболее грамотное решение - ОБЯЗАТЕЛЬНОЕ использование ai-журналирования + периодический полный бэкап БД.
            Никакой сложности в использовании механизма ai нет.
            Кроме того, можно обойтись и без использования OpenEdge Replication, который требует отдельной лицензии.
            Ничто не вечно ...

            Комментарий


            • #7
              Скрипт резервного копирования БД Бисквит. Запускается из cron без параметров. bkup-bq41d:

              #!/bin/sh
              # Lapin O.E. script of all jobs for offline backup main BISQUIT db

              # Backup main BISQUIT db

              /u/db-utils/db-stop bq41d
              [ $? = 0 ] && /u/db-utils/db-bkup-offline bq41d
              [ $? = 0 ] && /u/db-utils/bkup-arc-ai bq41d
              [ $? = 0 ] && /u/db-utils/db-start bq41d

              # Archieving of DB backup

              /u/db-utils/bkup-arc bq41d

              # Archieving of BISQUIT source codes and other valid info

              /u/db-utils/bkup-src bq41d

              # Copying all archives on tape

              /u/db-utils/arc-tape bq41d

              # end of script
              Ничто не вечно ...

              Комментарий


              • #8
                Основной скрипт для offline бэкапа БД Бисквит. Запускается с параметром - имя запускающего скрипта Бисквита, например,
                db-bkup-offline bq41d

                #!/bin/sh
                # Lapin O.E. script for offline backup main BISQUIT db
                #
                # Additional variables

                #-----------------------------------------------------------
                # VARs For PROGRESS 10.1b
                #-----------------------------------------------------------
                PATH=$PATH:.:/usr/dlc-10.1b:/usr/dlc-10.1b/bin; export PATH
                DLC=${DLC:-"/usr/dlc-10.1b"}; export DLC
                PROLIB=${PROLIB:-"$DLC/bin/prolib"}; export PROLIB
                PROMSGS=${PROMSGS:-"$DLC/rus/promsgs.rus"}; export PROMSGS
                PROTERMCAP=${PROTERMCAP:-"$DLC/protermcap"}; export PROTERMCAP
                PROPATH=.:${DLC}/bin; export PROPATH
                #-----------------------------------------------------------

                # DataBase log file date
                LOG_DATE=`date +%Y%m%d`

                # Check for root
                if [ -x "/usr/ucb/whoami" ]
                then
                UserName="`/usr/ucb/whoami`"
                else
                UserName="`who am i | cut -f1 -d' '`"
                fi
                #echo "$UserName>"
                if [ "$UserName" != "root" ]
                then
                exit 1
                fi

                # Check for parameters
                if [ $# != 1 ]
                then
                exit 1
                fi

                # Common variables section
                DBUdir=/u/db-utils
                LOGdir=${DBUdir}/logs
                LOGfile=${LOGdir}/`basename $0`.log
                # End of common variables session

                # Choose
                case $1 in
                bq41d) ABSdir=/home2/bis/quit41d
                DBdir=/db/db
                DBname=bisquit
                DBsource=${DBdir}/${DBname}
                DBscript=bq41d
                AIenable="YES"
                AIstr=${DBdir}/${DBname}.ai.st
                AIdir=/u/ai/db
                AIarc=/u/aiarc/db
                AIfiles=db~db~${DBname}
                AIlog=${DBdir}/${DBname}.archival.log
                BKUPdir=/u/db-bkup
                BKUPvol1=${BKUPdir}/bq01
                BKUPvols=${BKUPdir}/bkup.vols
                BKUPlog=${LOGfile} ;;

                bq41dtr) ABSdir=/home2/bis/quit41d
                DBdir=/db/db-train
                DBname=bisquit
                DBsource=${DBdir}/${DBname}
                DBscript=bq41dtr
                AIenable="NO"
                AIstr=${DBdir}/${DBname}.ai.st
                AIdir=/u/ai/db-train
                AIarc=/u/aiarc/db-train
                AIfiles=db~db-train~${DBname}
                AIlog=${DBdir}/${DBname}.archival.log
                BKUPdir=/u/db-bkup
                BKUPvol1=${BKUPdir}/bq01
                BKUPvols=${BKUPdir}/bkup.vols
                BKUPlog=${LOGfile} ;;

                *) exit 1 ;;
                esac

                # Delete old Log if exist
                if [ -f ${BKUPlog} ]
                then
                rm -f ${BKUPlog}
                fi

                # Create header for log file
                date > ${BKUPlog}
                echo "Offline Backup procedure started for "${DBdir}/${DBname}"" >> ${BKUPlog}

                # Check for stopped Main Database
                ${DLC}/bin/proutil ${DBsource}.db -C holder >> ${BKUPlog}
                DBSTATUS=$?
                # echo $DBSTATUS >> ${BKUPlog}
                case $DBSTATUS in
                0) ;;
                14) echo "DataBase is in single mode. Program terminated." >> ${BKUPlog} ; exit 1 ;;
                16) echo "DataBase is in multiuser mode. Program terminated." >> ${BKUPlog} ; exit 1 ;;
                esac
                # check for correct stopping DB
                if [ -f ${DBsource}.lk ]
                then
                echo "DataBase not ready for backup. Program terminated." >> ${BKUPlog}
                exit 1
                fi

                # Save DB structure and sorting files
                if [ -f ${DBdir}/${DBname}.st ]
                then
                cp -f ${DBdir}/${DBname}.st ${BKUPdir} >> ${BKUPlog}
                fi

                if [ -f ${DBdir}/${DBname}.srt ]
                then
                cp -f ${DBdir}/${DBname}.srt ${BKUPdir} >> ${BKUPlog}
                fi

                # If AI enable then make AI structure file backup
                if [ "$AIenable" = "YES" ]
                then
                # Save AI extent structure file
                if [ -f ${AIstr} ]
                then
                cp -f ${AIstr} ${BKUPdir} >> ${BKUPlog}
                fi
                fi

                # Truncating BI file
                ${DLC}/bin/proutil ${DBsource}.db -C truncate bi -bi 16384 >> ${BKUPlog}

                # BackUp Database
                ${DLC}/bin/probkup ${DBsource} ${BKUPvol1} -vs 125000 -com EOF >> ${BKUPlog}
                ${BKUPdir}/bq02
                ${BKUPdir}/bq03
                ${BKUPdir}/bq04
                ${BKUPdir}/bq05
                ${BKUPdir}/bq06
                ${BKUPdir}/bq07
                ${BKUPdir}/bq08
                ${BKUPdir}/bq09
                ${BKUPdir}/bq10
                ${BKUPdir}/bq11
                ${BKUPdir}/bq12
                ${BKUPdir}/bq13
                ${BKUPdir}/bq14
                ${BKUPdir}/bq15
                ${BKUPdir}/bq16
                ${BKUPdir}/bq17
                ${BKUPdir}/bq18
                ${BKUPdir}/bq19
                ${BKUPdir}/bq20
                ${BKUPdir}/bq21
                ${BKUPdir}/bq22
                ${BKUPdir}/bq23
                ${BKUPdir}/bq24
                ${BKUPdir}/bq25
                ${BKUPdir}/bq26
                ${BKUPdir}/bq27
                ${BKUPdir}/bq28
                ${BKUPdir}/bq29
                quit
                EOF

                # Remove previous DataBase log file to log dir
                if [ -f "${DBdir}/bisquit.lg" ]
                then
                echo "Saving DataBase log file..." >> ${BKUPlog}
                cp -f ${DBdir}/bisquit.lg ${BKUPdir}/logs/bq${LOG_DATE}.lg >> ${BKUPlog}
                rm -f ${DBdir}/bisquit.lg
                fi

                # Create footer for log file
                date >> ${BKUPlog}
                echo "Offline Backup procedure finished for "${DBdir}/${DBname}"" >> ${BKUPlog}

                exit 0

                # end of script
                Ничто не вечно ...

                Комментарий


                • #9
                  # BackUp Database
                  ${DLC}/bin/probkup ${DBsource} ${BKUPvol1} -vs 125000 -com EOF >> ${BKUPlog}
                  ${BKUPdir}/bq02
                  .....
                  ${BKUPdir}/bq29
                  quit
                  EOF


                  filename=f_`date "+%d%m%y-%H%M"`
                  backupdir=/probackup/
                  fullname=${backupdir}${filename}
                  mediafile=/local/tmp/next_media
                  filenum=2
                  echo ${fullname}_${filenum} > ${mediafile}
                  filenum=`expr $filenum + 1`
                  while [ $filenum -le $numfiles]
                  do
                  echo ${fullname}_${filenum} >> ${mediafile}
                  filenum=`expr $filenum + 1`
                  cat ${mediafile}|$DLC/bin/probkup online $DATABASE ${fullname}_1 -vs 500000 | tee -a $LOG

                  Комментарий


                  • #10
                    Скрипт для архивации подготовленных ai-файлов.
                    Параметр запуска единственный - имя запускающего скрипта Бисквита.
                    bkup-arc-ai bq41d

                    #!/bin/sh
                    # Lapin O.E. script for archieving AI arc files for DB

                    # Archiever and its parameters for pack files
                    ARCcmd=/usr/local/bin/rar
                    ARCparam="a -y -inul"

                    # Check for root
                    if [ -x "/usr/ucb/whoami" ]
                    then
                    UserName="`/usr/ucb/whoami`"
                    else
                    UserName="`who am i | cut -f1 -d' '`"
                    fi
                    #echo "$UserName>"
                    if [ "$UserName" != "root" ]
                    then
                    echo "ERROR: You must be logged in as the SUPERUSER"
                    exit 1
                    fi

                    # Check for parameters
                    if [ $# != 1 ]
                    then
                    echo "ERROR: illegal call - db script name required (for example, bq41d)"
                    exit 1
                    fi

                    # Common variables section
                    DBUdir=/u/db-utils
                    LOGdir=${DBUdir}/logs
                    LOGfile=${LOGdir}/`basename $0`.log
                    # End of common variables session

                    #echo $1
                    case $1 in

                    bq41d) DBname=bisquit
                    DBdir=/db/db
                    ARCdir=/u/db-arc
                    AIarc=/u/aiarc/db
                    AIfiles=db~db~${DBname}
                    AIlog=${DBdir}/${DBname}.archival.log
                    ARClog=${LOGfile} ;;

                    bq41dtr) DBname=bisquit
                    DBdir=/db/db-train
                    ARCdir=/u/db-arc
                    AIarc=/u/aiarc/db-train
                    AIfiles=db~db-train~${DBname}
                    AIlog=${DBdir}/${DBname}.archival.log
                    ARClog=${LOGfile} ;;

                    *) echo "ERROR: Unknown Database - $1"
                    exit 1 ;;
                    esac

                    # Check for existing arc dir on server
                    if [ ! -d "${ARCdir}" ]
                    then
                    echo "ERROR: Arc directory "${ARCdir}" not found on this server"
                    exit 1
                    fi

                    # Check for existing ai arc dir on server
                    if [ ! -d "${AIarc}" ]
                    then
                    echo "ERROR: AI Arc directory "${AIarc}" not found on this server"
                    exit 1
                    fi

                    # Delete old Log if exist
                    if [ -f ${ARClog} ]
                    then
                    rm -f ${ARClog}
                    fi

                    # Create header for log file
                    date > ${ARClog}
                    echo "AI archieving procedure started for "${AIarc}"" >> ${ARClog}

                    # Check for existing ai arc files
                    if [ ! -f ${AIarc}/${AIfiles}* ]
                    then
                    echo "ERROR: AI arc files not exist. Program terminated." >> ${ARClog}
                    exit 1
                    fi

                    # Get date and time of archive file
                    TODAY=`date +%Y%m%d`
                    FDATE=""
                    FFIRST=""

                    if [ -f $AIlog ]
                    then
                    FDATE=`cat $AIlog | sed '/#/d' | grep '0001' | head -1 | cut -f3 -d,`
                    fi

                    if [ -z "$FDATE" ]
                    then
                    FFIRST=`find "${AIarc}" -name "${AIfiles}*" -print | head -1`
                    [ -n "$FFIRST" ] && \
                    FDATE=`ls $FFIRST |\
                    head -1 |\
                    sed 's/\(.*\)\///' |\
                    cut -f2 -d.`
                    fi

                    if [ -z "$FDATE" ]
                    then
                    FDATE=`expr $TODAY - 1`
                    fi

                    ARCname=${FDATE}a
                    ARCfile=${ARCdir}/${ARCname}
                    TAPEdev=/dev/rmt/ntape1

                    # Deleting old AI arc files to hold last 5

                    i=0 # initial value for cycle
                    imax=5 # max quantity of arc files to hold
                    arcname=""

                    echo "Check old AI arc files *a.r* for deleting from "${ARCdir}" ..." >> ${ARClog}

                    for fname in `ls ${ARCdir}/*a.rar 2>/dev/null | sort -r`
                    do
                    i=`expr $i + 1`
                    arcname=`dirname $fname`/`basename $fname .rar`.r*
                    if [ $i -gt $imax ]
                    then
                    # echo $fname
                    [ -f $fname ] && rm -f $arcname
                    fi
                    done

                    # Archiving AI arc files

                    cd $ARCdir

                    # Delete old ARC file if exist
                    [ -f ${ARCfile}* ] && rm -f ${ARCfile}*

                    # Archiving AI arc files is in progress ...
                    echo "Archieving AI arc files is in progress ..." >> ${ARClog}

                    # Make list of files for archieving
                    echo "${AIarc}/${AIfiles}*" > $$.list
                    echo "${AIlog}" >> $$.list

                    $ARCcmd $ARCparam $ARCfile -v640000k @$$.list

                    # Delete temporary list of files
                    rm -f $$.list

                    echo "Archieving AI arc files is completed ..." >> ${ARClog}

                    # Check for existing archive files in arc dir to check successful archieving
                    if [ ! -f ${ARCfile}* ]
                    then
                    date >> ${ARClog}
                    echo "ERROR: Archive files not found in Arc directory. Program terminated." >> ${ARClog}
                    exit 1
                    fi

                    # Check for errors in archive
                    echo "Testing AI arc files in archieve ..." >> ${ARClog}
                    $ARCcmd t $ARCfile >> ${ARClog}
                    if [ $? != 0 ]
                    then
                    echo "ERROR: Archive files is corrupted. Program terminated." >> ${ARClog}
                    exit 1
                    fi

                    # Remove old ai archives from AI arc dir and AI log from DB dir
                    #[ -f ${AIarc}/${AIfiles}* ] && rm -f ${AIarc}/${AIfiles}* >> ${ARClog}
                    echo "Removing AI arc files from "${AIarc}"" >> ${ARClog}
                    find "${AIarc}" -name "${AIfiles}*" -print > $$.list
                    while read -r fname
                    do
                    [ -f $fname ] && rm -f $fname >> ${ARClog}
                    done $$.list
                    rm -f $$.list
                    echo "Removing AI log file from "${DBdir}"" >> ${ARClog}
                    [ -f ${AIlog} ] && rm -f ${AIlog} >> ${ARClog}

                    date >> ${ARClog}
                    echo "AI Archieving procedure finished for "${AIarc}"" >> ${ARClog}

                    exit 0

                    # end of script
                    Ничто не вечно ...

                    Комментарий


                    • #11
                      Сообщение от Lapin Посмотреть сообщение
                      Делая online инкрементальный бэкап Вы ПОЛНОСТЬЮ тормозите транзакционную активность.
                      Исключительно истины ради: это не так. Не потому, что мне не нравится ai, а потому, что у каждого механизма есть резоны и минусы. При высокой транзакционной нагрузке ai - must have. При низкой, резонов нет.

                      По поводу отката "на произвольную точку во времени". Я уже много лет эксплуатирую и oracle и openedge и никак не могу встретить или хотя бы измыслить ситуацию, когда бы этот откат мне понадобился, хотя возможность такая есть. Да. Я не занимаюсь разработкой на рабочей базе. Может, в этом и дело?

                      Про отказ дисковой подсистемы. Вы часто встречали именно отказ одного логического тома при полностью сохраненной работоспособности контроллера, компьютера и остальных логических томов? Дело не в защите от редчайшего отказа, а в ежедневном распараллеливании нагрузки. Аналогия - журналируемая ФС с журналом на ssd.
                      /kiv

                      Комментарий


                      • #12
                        Это так. При своем старте probkup ставит "замок" на bi-файл и удерживает его до тех пор, пока не будут скопированы все активные bi-блоки (кластеры). В этот промежуток времени вносить изменения в БД НЕВОЗМОЖНО. После того, как probkup "отпустит" bi-файл, можно вносить изменения в БД, которые в текущий (выполняемый) бэкап НЕ ПОПАДУТ.
                        Что касается различного рода отказов. Это счастье, если за всю трудовую деятельность на посту администратора БД не случалось никаких отказов. НО, ЕСЛИ ВДРУГ такое всё же ПРОИЗОЙДЕТ - лучше быть к этому ГОТОВЫМ. Пусть я лучше провожусь с настройкой ai-журналирования неделю, зато потом не буду кусать локти, когда среди рабочего дня, перед формированием очень важного рейса в МЦИ, по какой-то неизвестной мне причине (честно говоря - и знать не хочу, потом будем разбираться) выйдет из строя основной сервер и останутся только 5-7 минут до момента истины. Потом эти операции (рейсы) будут уже никому не нужны.
                        Вероятность отказов очень мала, но она ЕСТЬ. Я хочу спать по возможности спокойно, и уйти на пенсию, сохранив максимум нервных клеток.
                        Для некритичных БД подойдет и периодический бэкап. НО, БД, используемая в банке должна быть доступна по крайней мере 22-23 часа в сутки 365 дней в году в течение многих-многих лет (до пенсии уж точно), а это предполагает использование ВСЕХ ДОСТУПНЫХ механизмов защиты и восстановления данных.
                        Ничто не вечно ...

                        Комментарий

                        Пользователи, просматривающие эту тему

                        Свернуть

                        Присутствует 1. Участников: 0, гостей: 1.

                        Обработка...
                        X