2

当你启动一个 rethinkdb 实例时,它会自动创建一个名为“test”的数据库。当您运行多个实例并使用它对它们进行集群时,rethinkdb proxy会导致问题:

Database name conflict: test is the name of more than one database

如果您尝试删除数据库,即使用

r.dbDrop('test').run(conn, function(result) {
   console.log(result) // Will result in error
});

这将产生以下错误:

ReqlOpFailedError: Database 'test' is ambiguous; there are multiple databases with that name in r.dbDrop("test")

那么如何防止 RethinkDB 自动创建“测试”数据库呢?或者如果遇到名称冲突,如何删除数据库?

4

2 回答 2

0

经过一段时间的挖掘,我没有找到任何好的选项来阻止 RethinkDBtest在启动时尝试创建默认数据库。只有集群节点使用不同的数据目录时才会出现上述问题。否则他们将不会尝试创建额外的test数据库,因为其他节点会简单地识别它已经存在(由启动的第一个节点创建)。

我最终在我的后端软件中解决了这个问题,方法是从数据库中的表中枚举test启动期间命名的所有数据库。db_configrethinkdb

例子:

// Read from the database 'rethinkdb' that holds information about other databases
r.db("rethinkdb")

// Table db_config contains database id, name information
 .table("db_config")

// Filter by name 'test'
 .filter({name: "test"})
 .run(conn, function(err, cursor) {

     // Get results from cursor by id and rename
     cursor.each(function(err, result){
         r.db("rethinkdb")
          .get(result.id)
          .update({name: "other_name"})
          .run(conn, function(err, result) {
              console.log(result.replaced);
           });
     });
});
于 2016-10-28T11:41:12.700 回答
0

如果使用rethinkdb create创建数据目录,则不会test创建数据库。

例如,如果rethinkdb_data不存在,这将在没有test数据库的情况下创建它:

rethinkdb create
rethinkdb

这将执行相同的操作,但用于-d指定数据目录的位置:

rethinkdb create -d /var/lib/rethinkdb/data
rethinkdb -d /var/lib/rethinkdb/data
于 2016-11-01T20:19:23.683 回答