通过谷歌云功能的谷歌API SQL数据库转储

时间:2020-03-12 16:38:57

标签: node.js google-cloud-functions google-cloud-sql google-api-nodejs-client

使用通过googleapis的node.js脚本,我对在Google SQL实例上创建的所有数据库进行了转储,该转储为我存储在存储桶中的所有数据库生成了一个文件。我的目标是为每个数据库有一个文件,而不是为所有文件有一个文件,主要问题是,如果我对数据库A运行导出请求,那么在完成第一个数据库之前我不能对数据库B运行另一个文件。

2 个答案:

答案 0 :(得分:0)

您可以使用Async with callback来顺序运行导出,也可以使用operations list方法来获取exports的状态,以便能够知道何时导出已完成,何时使用回调进行下一步。有关更多信息,请检查其他post

答案 1 :(得分:0)

我的解决方案是使用像这样的递归函数:

"use strict"
const { google } = require("googleapis");
const { auth } = require("google-auth-library");
const dateFormat = require('date-format');
var sqladmin = google.sql("v1beta4");
const project = "my-project-name";
const instanceName = "my-sql-instance-name";
const dbToDump = [];

exports.dumpDatabase = (_req, res) => {

async function dump() {
    let count = 0;
    let currentRequestName = '';
    const authRes = await auth.getApplicationDefault();
    var authClient = authRes.credential;

    let databases = await sqladmin.databases.list({
        project: project,
        instance: instanceName,
        auth: authClient
    });
    for (let i = 0; i < databases.data.items.length; i++) {
        const element = databases.data.items[i];
        // the system databases will be omitted
        if (
            element.name != "information_schema" &&
            element.name != "sys" &&
            element.name != "mysql" &&
            element.name != "performance_schema"
        ) {
            dbToDump.push(element.name);
        }
    }

    async function recursiveCall() {

        //exit condition  
        if (count >= dbToDump.length) {
            res.status(200).send("Command complete");
            return true;
        }


        // no request running
        if (currentRequestName == '') {
            // set data for next export call  
            var request = {
                project: project,
                instance: instanceName,
                resource: {
                    exportContext: {
                        kind: "sql#exportContext",
                        fileType: "SQL",
                        uri: 'gs://my-gsc-bucket/${dbToDump[count]}-${dateFormat.asString('yyyyMMddhhmm', new Date())}.gz',
                        databases: [dbToDump[count]]
                    }
                },
                auth: authClient
            };
            let r = await sqladmin.instances.export(request); //dump start
            currentRequestName = r.data.name;
        }

        // call to monitor request status
        let requestStatus = await sqladmin.operations.get({ project: project, operation: currentRequestName, auth: authClient });

        if (requestStatus.data.status == 'DONE') {
            // the current request is completed, prepare for next call
            count++;
            currentRequestName = '';
            recursiveCall();
        } else {
            // wait 10 seconds before check status
            setTimeout(recursiveCall, 10000)
        }
    }

    recoursiveCall();

}

dump();
};

对我来说这项工作,唯一的另一项设置是增加60秒以上的超时时间。 感谢Andres S的支持