fix mongo connection while backup

This commit is contained in:
cawa 2023-06-06 15:53:03 +03:00
parent abee37a52c
commit 85fc6b6a86

View File

@ -11,7 +11,7 @@ const getDirectories = async source =>
.filter(dirent => dirent.isDirectory()) .filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name); .map(dirent => dirent.name);
async function performBackup(databaseName) { async function performBackup(databaseName, uri) {
try { try {
const timestamp = moment().format("DD.MM.YYYY_HHmmss"); const timestamp = moment().format("DD.MM.YYYY_HHmmss");
const { backupFolder } = await prompt([ const { backupFolder } = await prompt([
@ -24,37 +24,64 @@ async function performBackup(databaseName) {
]); ]);
const folderName = "dumps/" + backupFolder; const folderName = "dumps/" + backupFolder;
const backupCommand = `mongodump --db ${databaseName} --out ${folderName}`;
console.log(`Creating backup of database ${databaseName}...`); let backupCommand = spawn("mongodump", [
await exec(backupCommand); "--authenticationDatabase=admin",
"--uri",
uri,
"--db",
databaseName,
"--out",
folderName,
]);
console.log(`Backup created successfully in folder ${folderName}.`); backupCommand.stdout.on("data", function (data) {
console.log(data.toString());
});
backupCommand.stderr.on("data", function (data) {
console.log(data.toString());
});
const waitForEnd = new Promise((resolve, reject) => {
backupCommand.on("exit", function (code) {
console.log("child process exited with code " + code.toString());
console.log(`Search you backup in folder ${folderName}.`);
resolve();
});
});
await waitForEnd;
return;
} catch (error) { } catch (error) {
console.error("An error occurred during the backup process:", error); console.error("An error occurred during the backup process:", error);
return;
} }
} }
function performRestore(restoreFolder, uri) { async function performRestore(restoreFolder, uri) {
try { try {
console.log(`Restoring database from folder ${restoreFolder}...`); console.log(`Restoring database from folder ${restoreFolder}...`);
let ls = spawn("mongorestore", ["--uri", uri, "--drop", restoreFolder]); let restoreCommand = spawn("mongorestore", ["--uri", uri, "--drop", restoreFolder]);
ls.stdout.on("data", function (data) { restoreCommand.stdout.on("data", function (data) {
console.log(data.toString()); console.log(data.toString());
}); });
ls.stderr.on("data", function (data) { restoreCommand.stderr.on("data", function (data) {
console.log(data.toString()); console.log(data.toString());
}); });
ls.on("exit", function (code) { const waitForEnd = new Promise((resolve, reject) => {
console.log("child process exited with code " + code.toString()); restoreCommand.on("exit", function (code) {
console.log("child process exited with code " + code.toString());
resolve();
});
}); });
await waitForEnd;
console.log("Database restored successfully."); return;
} catch (error) { } catch (error) {
console.error("An error occurred during the restore process:", error); console.error("An error occurred during the restore process:", error);
return;
} }
} }
@ -161,74 +188,77 @@ async function main() {
await client.connect(); await client.connect();
console.log("Connected to MongoDB successfully."); console.log("Connected to MongoDB successfully.");
const { action } = await prompt([ while (true) {
{ const { action } = await prompt([
type: "list",
name: "action",
message: "Choose an action:",
choices: ["Clear ...", "Backup", "Restore"],
},
]);
if (action === "Backup") {
const { databaseName } = await prompt([
{ {
type: "list", type: "list",
name: "databaseName", name: "action",
message: "Choose a database to backup:", message: "Choose an action:",
choices: await client choices: ["Clear ...", "Backup", "Restore"],
.db()
.admin()
.listDatabases()
.then(({ databases }) => databases.map(({ name }) => name)),
}, },
]); ]);
await performBackup(databaseName); if (action === "Backup") {
} else if (action === "Restore") { const { databaseName } = await prompt([
try {
const dirs = await getDirectories("./dumps");
const { restoreFolder } = await prompt([
{ {
type: "list", type: "list",
name: "restoreFolder", name: "databaseName",
message: "Choose the folder to restore from:", message: "Choose a database to backup:",
choices: dirs, choices: await client
.db()
.admin()
.listDatabases()
.then(({ databases }) => databases.map(({ name }) => name)),
}, },
]); ]);
await performRestore("./dumps/" + restoreFolder, uri); await performBackup(databaseName, uri);
} catch (err) { } else if (action === "Restore") {
if (err.errno === -2) { try {
console.log("No 'dumps' dir found"); const dirs = await getDirectories("./dumps");
} else { const { restoreFolder } = await prompt([
throw new Error(err); {
type: "list",
name: "restoreFolder",
message: "Choose the folder to restore from:",
choices: dirs,
},
]);
await performRestore("./dumps/" + restoreFolder, uri);
} catch (err) {
if (err.errno === -2) {
console.log("No 'dumps' dir found");
} else {
throw new Error(err);
}
console.log("Disconnected from MongoDB.");
await client.close();
return;
} }
console.log("Disconnected from MongoDB."); } else if (action === "Clear ...") {
const { subject } = await prompt([
{
type: "list",
name: "subject",
message: "Choose what you are going to clean up:",
choices: ["collection", "field"],
},
]);
if (subject === "collection") {
const collection = await chooseCollection(client);
await clearColleciton(collection);
} else if (subject === "field") {
const collection = await chooseCollection(client);
const field = await chooseField(client);
await clearField(collection, field);
}
await client.close(); await client.close();
return; console.log("Disconnected from MongoDB.");
} }
} else if (action === "Clear ...") { console.log("\nPress Ctrl+C to exit\n");
const { subject } = await prompt([
{
type: "list",
name: "subject",
message: "Choose what you are going to clean up:",
choices: ["collection", "field"],
},
]);
if (subject === "collection") {
const collection = await chooseCollection(client);
await clearColleciton(collection);
} else if (subject === "field") {
const collection = await chooseCollection(client);
const field = await chooseField(client);
await clearField(collection, field);
}
await client.close();
console.log("Disconnected from MongoDB.");
} }
} catch (error) { } catch (error) {
console.error("An error occurred:", error); console.error("An error occurred:", error);