XQUERY.Как проверить текущий статус инкрементной резервной копии? - PullRequest
0 голосов
/ 25 марта 2019

Я написал Xquery, который выполняется во время выполнения инкрементного резервного копирования. Я знаю, что состояние резервной копии возвращает три возможных значения - completed, in-progress и failed. Не уверен, точное значение последнего, но в любом случае это мой xquery -

    xquery version "1.0-ml";

declare function local:escape-for-regex
  ( $arg as xs:string? )  as xs:string {

   replace($arg,
           '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')
 } ;

declare function local:substring-before-last
  ( $arg as xs:string? ,
    $delim as xs:string )  as xs:string {

   if (matches($arg, local:escape-for-regex($delim)))
   then replace($arg,
            concat('^(.*)', local:escape-for-regex($delim),'.*'),
            '$1')
   else ''
 } ;

let $server-info := doc("/config/server-info.xml")
let $content-database :="xyzzy"
let $backup-directory:=$server-info/configuration/server-info/backup-directory/text()
let $backup-latest-dateTime := xdmp:filesystem-directory(fn:concat( $backup-directory,'/',$content-database))/dir:entry[1]/dir:filename/text()
let $backup-latest-date := fn:substring-before($backup-latest-dateTime,"-")
let $backup-info := cts:search(/,cts:element-value-query(xs:QName("directory-name"),$backup-latest-date))
let $new-backup := if($backup-info)
                    then fn:false()
                   else fn:true()
let $db-bkp-status := if($new-backup)
                        then (xdmp:database-backup-status(())[./*:forest/*:backup-path[fn:contains(., $backup-latest-dateTime)]][./*:forest/*:incremental-backup eq "false"]/*:status)
                      else (xdmp:database-backup-status(())[./*:forest/*:backup-path[fn:contains(., $backup-latest-dateTime)]][./*:forest/*:incremental-backup eq "true"][./*:forest/*:incremental-backup-path[fn:contains(., fn:replace(local:substring-before-last(xs:string(fn:current-date()), "-"), "-", ""))]]/*:status)

return $db-bkp-status

Мы поддерживаем файл конфигурации, в котором хранится статус резервной копии. Если будет новый полный день резервного копирования, $backup-info ничего не вернет. Если это ежедневный день инкрементного резервного копирования, он вернет конфигурацию. Я использую его только для того, чтобы проверить, является ли текущее резервное копирование новым полным или инкрементным. Для инкрементального дня $backup-info имеет значение false и поэтому переходит к последней строке, т. Е. Условие else. это ничего не возвращает для инкрементных резервных копий. Ни completed, ни in-progress. Интересно, как markLogic собирает метку времени. Пожалуйста, помогите в этом.

Не стесняйтесь предоставлять свои собственные xquery с нуля. Я могу обновить мой.
Я даже вынул идентификатор задания и произвел поиск в выводе функции xdmp:database-backup-status(()), но этот идентификатор задания тоже не существует в наборе результатов.

1 Ответ

1 голос
/ 26 марта 2019

MarkLogic предоставляет модули администрирования для предоставления большей части информации, которую вы пытаетесь получить другими способами. Модули пользовательского интерфейса администратора (обычно находятся в / opt / MarkLogic / Modules / MarkLogic / Admin / Lib) содержат много полезного кода, который можно адаптировать для получения таких подробностей. В этом случае я бы сослался на database-status-form.xqy

define function db-mount-state(
  $fstats as node()*,
  $fcounts as node()*,
  $dbid as xs:unsignedLong)
{
let $times := $fstats/fs:last-state-change,
  $ls := max($times),
  $since :=
    if (not(empty($ls)))
    then concat(" since ", longDate($ls), " ", longTimeSecs($ls))
    else ""
return concat(database-status($dbid,$fstats,$fcounts),$since)
}

define function backup-recov-state($fstats as node()*)
{
  if(empty($fstats/fs:backups/fs:backup)
       and
     empty($fstats/fs:restore))
  then
    "No backup or restore in progress"
  else
    if(empty($fstats/fs:backups/fs:backup))
    then
      "Restore in progress (see below for details)"     
    else
      "Backup in progress (see below for details)"
}

... Вызовите функции из вашей базы данных, затем извлеките детали из элементов, которые вы хотите:

let $last-full-backup := max($fstats/fs:last-backup)
let $last-incremental-backup : = max($fstats/fs:last-incr-backup
return ($last-full-backup, $last-incremental-backup)

Это всего лишь некоторые примеры фрагментов кода, не исполняемые, но они должны заставить вас двигаться в правильном направлении.

...