MySQLDump RDS to S3 using Lambda



我正在研究如何使用Lambda将RDS导出到S3,到目前为止,我找到了Python节点和Java API,但如果没有实际的可执行文件,我无法找到以编程方式运行mysqldump之类的东西的方法。

有办法做到这一点吗?

我正在考虑使用node.js为SHOW TABLES中的每个元素调用SHOW CREATE TABLE

然后以某种方式创建扩展的INSERT语句。

是的,不过您需要在lambda包中包含mysqldump可执行文件!

Node.js中的示例脚本,用于使用mysqldump进行备份并上传到S3。

var S3 = require('./S3Uploader'); //custom S3 wrapper with stream upload functionality
var fs = require('fs');
var path = require('path');
var util = require('util');
const writeFile = util.promisify(fs.writeFile);
const execFile = util.promisify(require('child_process').execFile);
const exec = util.promisify(require('child_process').exec);
async function backupToS3(){
var backupName = 'mysqlbackup-'+new Date().toISOString()+'.gz'
var content = `cd /tmp
BACKUPNAME="[BACKUP_NAME]"
[EXE_PATH]/mysqldump --host [DB_ENDPOINT] --port [DB_PORT] -u [DB_USER] --password="[DB_PASS]" [DB_NAME] | gzip -c > $BACKUPNAME
`;
content = content.replace('[BACKUP_NAME]', backupName);
content = content.replace('[DB_ENDPOINT]', 'xx'); //get from lambda environment variables
content = content.replace('[DB_PORT]', 'xx'); //get from lambda environment variables
content = content.replace('[DB_USER]', 'xx'); //get from lambda environment variables
content = content.replace('[DB_PASS]', 'xx'); //get from lambda environment variables
content = content.replace('[DB_NAME]', 'xx'); //get from lambda environment variables
content = content.replace('[EXE_PATH]', __dirname+'/tools'); //path where mysqldump executable is located withing the lambda package
//generate backup script
await writeFile('/tmp/db_backup.sh', content);
fs.chmodSync('/tmp/db_backup.sh', '755');
//run script
var res1 = await execFile('/tmp/db_backup.sh');
//stream upload to S3
var res2 = await S3.uploadFile('/tmp/'+backupName, 'backups');
//cleanup local backup (this should cleanup automatically according to lambda lifecycle)
var res3 = await exec('rm /tmp/'+backupName);
return  'Backup complete';
};

示例S3Uploader发布在这里-直接从Nodejs-req主体加载文件到S3

最新更新