MySQL使用 Lambda 将 RDS 转储到 S3

问题描述 投票:0回答:2

我正在寻找如何使用 Lambda 将 RDS 导出到 S3,到目前为止,我找到了一个 Python 节点和 Java API,但我找不到一种在没有实际可执行文件的情况下以编程方式运行类似

mysqldump
之类的方法。

有办法吗?

我正在考虑使用node.js为SHOW CREATE TABLE

中的每个元素调用
SHOW TABLES

然后以某种方式创建扩展的

INSERT
语句。

mysql amazon-s3 aws-lambda amazon-rds
2个回答
4
投票

是的,这是可能的,不过你需要在你的 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


0
投票

如果您可以使用 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" }),
});

https://www.npmjs.com/package/cdk-rds-dump

© www.soinside.com 2019 - 2024. All rights reserved.