MarkLogic 7 - 使用 rest-api 的数据库备份
MarkLogic 7 - database-backup with rest-api
我希望使用 rest-api 在 ML7 中自动备份。
由于这不是开箱即用的,我想我可以按所需的时间表使用 curl 命令添加新的扩展和设置脚本。
听起来很简单,但出于某种原因,当我尝试安装我的扩展时,它吐出 'invalid content' 并且日志显示:
• 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"); :)
};
根据我在 Whosebug 上的另一个问题的答案,我认为我可以使用参数并卷曲到类似的东西(成功安装后):
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方法returns一样的错误。
我在这里做错了什么?
欢迎提出任何建议。
谢谢,
欧内斯特
上面的curl命令调用了资源服务扩展。安装成功后才能调用扩展。
此外,
- curl 需要 PUT 或 POST 请求以在安装时使用
-H 'content-type: _CONTENT_TYPE_HERE_';
指定负载的 content-type,内容类型 应该是 application/xquery
- 在安装时将 XQuery 源文件的本地路径传递给
-d @/path/to/xquerysource.xqy
。
这是安装资源服务扩展的文档,其中包括一个 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
希望对您有所帮助,
此外,您的函数中存在语法错误(FLWOR 中缺少 return),您不需要导入 Admin 库。
我希望使用 rest-api 在 ML7 中自动备份。 由于这不是开箱即用的,我想我可以按所需的时间表使用 curl 命令添加新的扩展和设置脚本。 听起来很简单,但出于某种原因,当我尝试安装我的扩展时,它吐出 'invalid content' 并且日志显示:
• 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"); :)
};
根据我在 Whosebug 上的另一个问题的答案,我认为我可以使用参数并卷曲到类似的东西(成功安装后):
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方法returns一样的错误。 我在这里做错了什么?
欢迎提出任何建议。
谢谢, 欧内斯特
上面的curl命令调用了资源服务扩展。安装成功后才能调用扩展。
此外,
- curl 需要 PUT 或 POST 请求以在安装时使用
-H 'content-type: _CONTENT_TYPE_HERE_';
指定负载的 content-type,内容类型 应该是 application/xquery - 在安装时将 XQuery 源文件的本地路径传递给
-d @/path/to/xquerysource.xqy
。
这是安装资源服务扩展的文档,其中包括一个 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
希望对您有所帮助,
此外,您的函数中存在语法错误(FLWOR 中缺少 return),您不需要导入 Admin 库。