2016-08-11 139 views
0

我有一个Groovy脚本,删除一个数据库,并从现有的备份(SQL)恢复数据库我可以在groovy文件中运行mongorestore命令吗?

Sql sql = Sql.newInstance(dbSQLUrl, userName, password) 

我通过了所有必需的参数和下面跑sql.execute()

sql.execute(
     alter database dbName 
     set offline with rollback immediate 
     drop database dbName 
     ) 


sql.execute(
    RESTORE DATABASE dbName 
    FROM disk = 'C:\Backups' 
    WITH REPLACE 
) 

所有上面的代码工作得很好。我也需要为MongoDB实现这个功能。在Mongo中是否有相当于sql.execute()的地方,我可以在groovy文件中运行Mongo命令,如mongorestore

对于蒙戈我有以下代码:

List credentials = [] 
List servers = [] 

credentials.push(MongoCredential.createCredential(mongoUserName, mongoDBName, mongoPassword as char[])) 
servers.push(new ServerAddress(mongoHost, mongoPort)) 

GMongoClient mongoClient = new GMongoClient(servers,credentials) 
DB mongoDB = mongoClient.getDB(mongoDBName) 
mongoDB.dropDatabase() 

现在我需要运行/包括我的常规文件中下面的命令, mongorestore ~/backups/first_backup/

有没有什么办法可以做到这一点?

回答

0

不知道这是你所需要的最有效的方式,但你可以调用命令,并等待其完成加给你的代码:

String command = "mongorestore ${System.properties['user.home']}/backups/first_backup" 
Process p = command.execute() 
p.waitFor() 
+0

我有下面的代码,String command =“”“mongorestore $ dbBackUpPath”“”Process p = command.execute(),basckup数据库没有创建,而当我在命令行运行下面的代码,mongorestore/home/backups /测试它运作良好。我看到测试数据库正在恢复。 – Sharath

+0

你添加了'p.waitFor()'吗?您需要一些方法来等待该命令完成。为了调试,在'p = command.execute()'后面加上'println p.in.text + p.err.text',看看'mongorestore'输出的是什么。 –

+1

我的错误是我错误地通过路径\ home \ backsups \ test而不是/ home/backups/test。现在它工作正常。 – Sharath

0

总之,这不能通过使用MongoDB驱动来实现。这些命令只能从命令行(即MongoDB shell)调用。您可能需要将日期导出为CSV,并以编程方式将数据导入MongoDB,这会非常缓慢。

否则,您可能需要使用Groovy库执行命令。类似于下面的Java命令。

Runtime.getRuntime()。exec(“mongoimport -d -h <> ..”);

Similar question for Java Driver

+0

当我从我的脚本执行上面的行,它说“过程完成退出代码0”,但我没有看到蚂蚁数据库恢复,而当我从命令行运行以下命令,“mongorestore/home/backups/test”,我看到数据库正在恢复。 – Sharath

+0

我写了Runtime.getRuntime()。exec(“”“mongorestore $ dbBackUpPath”“”) – Sharath

+0

您是否尝试过使用完全绝对路径的mongorestore? – notionquest

相关问题