【问题标题】:MarkLogic 7 - database-backup with rest-apiMarkLogic 7 - 使用 rest-api 进行数据库备份
【发布时间】:2015-10-20 21:09:11
【问题描述】:

我希望使用 rest-api 在 ML7 中自动备份。 由于这不是开箱即用的,我想我可以按照所需的时间表使用 curl 命令添加新的扩展和设置脚本。 听起来很简单,但由于某种原因,当我尝试安装我的扩展时,它会吐出“无效内容”并显示日志:

RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: invalid backupdb extension: could not parse XQuery extension backupdb; please see the server error log for detail XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected QName_; backupdb either is not a valid module or does not provide extension functions (delete, get, put, post) in the http://marklogic.com/rest-api/resource/backupdb namespace

这是我的扩展的代码:

xquery version "1.0-ml";

module namespace backupdb =
    "http://marklogic.com/rest-api/resource/backupdb";

import module namespace admin = "http://marklogic.com/xdmp/admin"
    at "/MarkLogic/admin.xqy";


declare variable $dbname := "database-backup";
declare variable $s3bucket := "bucket-destination";

declare function backupdb:put(
    $context as map:map,
    $params  as map:map,
    $input   as document-node()*
) as document-node()?
{
  let $dbname := map:get($params, $dbname)
  let $s3bucket := map:get($params, $s3bucket)
  xdmp:database-backup(
    (:xdmp:database-forests(xdmp:database($dbname)), $s3bucket ):)
    xdmp:database-forests(xdmp:database($dbname)), "s3://bucketname/folder" )
        (: "s3://s3bucket/folder"); :)

};

根据我在 stackoverflow 上得到的另一个问题的答案,我认为我可以使用参数并将 curl 设置为类似(成功安装后):

curl --anyauth --user "${USER}":"${pass}" -X PUT -d 'undefined'  'http://localhost:8040/v1/resources/backupdb?rs:database-backup=Documents&rs:bucket-destination=s3://bucket/folder'

POST 方法返回相同的错误。 我在这里做错了什么?

欢迎提出任何建议。

谢谢你, 欧内斯特

【问题讨论】:

    标签: marklogic


    【解决方案1】:

    此外,您的函数中存在语法错误(FLWOR 中缺少返回),您不需要导入 Admin 库。

    【讨论】:

    • 谢谢,我更新了我的代码:return document { "Done"} ,但仍然是同样的问题。
    • 具体来说:return xdmp:database-backup(...)。每个FLWOR statement needs to have a return
    • 新扩展的安装工作正常,但现在当我调用 curl 实际开始备份时
      curl --anyauth --user user:pass -X PUT -d 'undefined' 'http://localhost:8040/v1/resources/backupdb?rs:database-backup=Documents&rs:bucket-destination=s3://bucketname/folder'
      它返回 ERROR 500: Reason: Invalid coercion 但它确实启动了,文件被保存到 s3我在日志中收到一堆消息:
      XDMP-AS: (err:XPTY0004) $service($context, $service-params, $input) -- Invalid coercion: xs:unsignedLong("<logn-number>") as document-node()'invalid coercion' 是什么意思?
    • 这意味着您的函数不返回文档节点。 xdmp:database-backup 返回一个数字(一个 xs:unsignedLong)。要将其转换为文档节点,您可以将整个函数体包装在文档构造函数中。类似于:
    • 您可能想在部署代码之前尝试自己运行代码。更容易看到语法错误等等。 Query Console 可以帮助您自行运行代码。
    【解决方案2】:

    上面的 curl 命令调用资源服务扩展。在安装成功之前,您无法调用该扩展程序。

    还有,

    • curl 安装时需要 PUT 或 POST 请求以 -H 'content-type: _CONTENT_TYPE_HERE_'; 指定负载的 content-typecontent-type 应为 application /xquery
    • 在安装时使用-d @/path/to/xquerysource.xqy 传递XQuery 源文件的本地路径。

    这是关于安装资源服务扩展的文档,其中包括一个 curl 示例:

    http://docs.marklogic.com/7.0/REST/PUT/v1/config/resources/%5Bname%5D

    这是调用资源服务扩展的文档:

    http://docs.marklogic.com/7.0/REST/PUT/v1/resources/%5Bname%5D

    希望对您有所帮助,

    【讨论】:

    • 对不起,上面的curl命令只是安装成功后的一个想法。上面的错误我从这个命令得到: curl --anyauth --user user:pass -X PUT -i -H "Content-type: application/xquery" -d@"./backupdb.xqy" 'localhost:8040/v1/config/resources/backupdb '
    • 在 MarkLogic 讨论列表中,Danny Sokolsky 评论了上面示例中的语法错误。也许最好在一个地方而不是两个地方提出这个问题以避免混淆?
    • 会的。非常感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多