我正在寻找如何使用 Lambda 将 RDS 导出到 S3,到目前为止,我找到了一个 Python 节点和 Java API,但我找不到一种在没有实际可执行文件的情况下以编程方式运行类似
mysqldump
之类的方法。
有办法吗?
我正在考虑使用node.js为SHOW CREATE TABLE
SHOW TABLES
然后以某种方式创建扩展的
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 发布在此处 - 直接从 Node js 请求主体加载文件到 S3
如果您可以使用 AWS CDK,此 CDK 构造将为您提供帮助。
import { RdsDump, DbEngine } from 'cdk-rds-dump';
declare const rdsCluster: rds.DatabaseCluster;
new RdsDump(this, "RdsDump", {
dbEngine: DbEngine.MYSQL,
rdsCluster: cluster,
databaseName: "testDatabase",
schedule: events.Schedule.cron({ minute: "0", hour: "0" }),
});