RethinkDB:​​有没有办法通过GUI或rql克隆同一个集群中的数据库?

时间:2014-11-11 15:09:00

标签: rethinkdb

假设我的群集上有一个名为my_db的数据库。我可以克隆这个数据库,以便在同一个集群上我可以使用my_db_cloned而不处理dump / export吗?

4 个答案:

答案 0 :(得分:6)

您可以通过ReQL将数据从一个表复制到另一个表中,如下所示: r.table(destination).insert(r.table(source))

这也可以在给定数据库中所有表的循环中运行:

r.db(source).tableList().forEach(function (t) {
  return r.db(destination).table(t).insert(r.db(source).table(t));
})

同样,您可以构造一个循环来重新创建所有表:

r.db(source).tableList().forEach(function (t) {
  return r.db(destination).tableCreate(t);
})

此版本不保留自定义主键或耐久性设置,但您明白了。

最后克隆二级索引

r.db(source).tableList().forEach(function (t) {
  return r.db(source).table(t).indexStatus().map(function (idx) {
    return r.db(destination).table(t).indexCreate(
      idx('index'), idx('function'), {geo: idx('geo'), multi: idx('multi')});
  });
})

对于所有这些查询,我建议在node.js中运行它们,或者使用Python或Ruby客户端运行它们。在数据资源管理器中运行它们可能不会起作用,因为它会在一分钟之后超时长时间运行查询。

答案 1 :(得分:2)

您可以在ReQL中执行此操作:

r.dbCreate('my_db_cloned')
r.db('my_db').tableList().forEach(r.db('my_db_cloned').tableCreate(r.row))
r.db('my_db').tableList().forEach(r.db('my_db_cloned').table(r.row).insert(r.db('my_db').table(r.row)))

您需要在第二个和第三个命令之间等待半秒钟,以确保在插入表之前表格可用。 (在即将发布的1.16版本中,将有一个tableWait命令来消除猜测。)

请注意,这不会复制二级索引。

答案 2 :(得分:2)

我有同样的问题。所以我使用@DanielMewes建议构建了一个命令行工具。

https://github.com/internalfx/thinker

希望它有所帮助,为我节省了很多时间。

答案 3 :(得分:0)

目前没有专门的克隆命令。您必须转储数据库并以不同的名称将其还原以获取数据的第二个副本。