Google api SQL база данных дамп с помощью облачных функций Google - PullRequest
0 голосов
/ 12 марта 2020

С помощью скрипта node.js через googleapis я сделал дамп всех баз данных, созданных на моем экземпляре Google SQL, дамп генерирует один файл для всех баз данных, которые я храню в корзине. Моя цель состоит в том, чтобы иметь один файл для каждой базы данных, а не один файл для всех, основная проблема заключается в том, что если я выполню запрос на экспорт для базы данных A, я не смогу запустить другой для базы данных B, пока не будет выполнен первый.

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Мое решение состоит в том, чтобы использовать рекурсивную функцию, подобную этой:

"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 за поддержку

0 голосов
/ 12 марта 2020

Вы можете использовать Asyn c с обратным вызовом , чтобы последовательно выполнить экспорт, вы можете использовать метод список операций , который даст вам статус экспортирует , чтобы иметь возможность узнать, когда экспорт завершился и когда перейти к следующему шагу с помощью обратного вызова. Для получения дополнительной информации проверьте этот другой сообщение

...