Windows環境でデータベースをバックアップするには様々な方法がありますが、本記事ではバックアップ機能を実現するためのコードを使用する方法のみを説明します。
データベースをバックアップする最も一般的な方法は、バックアップに cmd コマンドを使用することです。コードは次のとおりです。
E:
cd E:\SOFT\MySQL\mysql-5.7.24-winx64\bin
mysqldump -uroot -p123456 --lock-all-tables --flush-logs e3db > E:/1586916254571.sql
コードの最初の行: ドライブ文字を切り替えます。cmd はデフォルトで C ドライブにあるため、ルート ドライブ文字を mysql がインストールされているドライブ文字に切り替える必要があります。
コードの 2 行目: パスを切り替えます。mysql インストール ディレクトリの bin ディレクトリにパスを切り替えます。これは、mysqldump コマンドがこのパスで正しく認識される必要があるためです。
コードの 3 行目: -u の後にデータベース アカウント、-p の後にパスワード、大なり記号の前にバックアップするデータベースの名前、その後にバックアップするファイルの名前とパスが続きます。バックアップ パスに漢字を使用することはできません。漢字を使用しないと、バックアップ ファイルを生成できない可能性が高くなります。
上記の 3 行のコードでは、cmd コマンドを使用してデータベースをバックアップしているだけですが、node を使用してデータベースを制御するにはどうすればよいでしょうか? ここでは、nodeを使用してbatファイルを実行する方法を紹介します。コードは以下のように表示されます:
const path = require('path');
const fs = require('fs');
const {execFile} = require('child_process');
execFile(path.resolve('./backupTask/test.bat'),{encoding: 'buffer'}, (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
if(fs.existsSync(filePath)){
console.log('生成成功');
} else {
console.log('生成失败')
}
});
ノードの child_process サブプロセスを使用して、bat コマンド ファイルの実行を制御します。bat コマンドファイル内のコマンドであっても、ノードの背景が配置されているプロジェクト パスであっても、漢字を表示することはお勧めできません。家主がテストしている場合、プロジェクト パスに漢字があるため、エラーが報告されるか、正常に実行されますが、実行中にファイルは生成されません。
上記の記述によれば、batコマンドが正常に実行され、データベースが正常にバックアップされることがわかります。バックアップファイルのファイル名を動的に変更できるようにしたい場合は、fs モジュールの writeFile を組み合わせることでコマンドを動的に生成できます。家主の完全なコードは以下に掲載されています。
log.allLog.info('启动数据库备份命令');
let backupDir = config.backupConfig.dbDir; // 设置备份路径
backupDir = backupDir.replace(/\\/g, '/'); // 路径斜杠替换
let filePath = backupDir + '/' + new Date().getTime() + '.sql'; // 根据时间戳生成备份文件路径+文件名
log.allLog.info('生成备份路径和文件名:' + filePath);
// 生成cmd命令字符串
let cmdStr = `${config.backupConfig.drive}
${config.backupConfig.binPath}
mysqldump -u${config.username} -p${config.password} --lock-all-tables --flush-logs ${config.database} > ${filePath}`;
fs.writeFile('./batCmd/run.bat', cmdStr, {encoding: 'utf8'}, err => {
if (err) {
log.errLog.error('数据库备份命令写入文件错误,', err);
return;
}
log.allLog.info('数据库备份命令写入成功');
log.allLog.info('执行命令文件,文件路径:' + path.resolve('./batCmd/run.bat'));
execFile(path.resolve('./batCmd/run.bat'), {encoding: 'buffer'}, (err, stdout, stderr) => {
if (err) {
log.errLog.error('数据库备份命令执行错误,', err);
return;
}
log.allLog.info('数据库备份命令执行成功,正在检测文件是否成功生成');
if (fs.existsSync(filePath)) {
log.allLog.info('数据库备份命令执行成功,成功检测到文件:' + filePath);
} else {
log.errLog.error('数据库备份命令执行成功,但未检测到备份文件');
}
});
});