在 Azure Runbook 上运行“mysqldump”

Posted

技术标签:

【中文标题】在 Azure Runbook 上运行“mysqldump”【英文标题】:Running 'mysqldump' on an Azure Runbook 【发布时间】:2021-12-28 09:56:24 【问题描述】:

所以我编写了一个运行“mysqldump”的python脚本来生成一个转储,然后将其存储为备份。在本地,该脚本可以顺利运行,但最终目标是能够将其作为 Runbook 添加到 Azure 自动化帐户,因此它每天运行一次。

目前的问题是 Azure 环境没有 MySQL 模块,因为 MySQL 不是 Windows 产品,所以我无法运行任何 MySQL 命令(我收到错误 '#The system cannot find the specified file'),包括 'mysqldump' .我尝试过使用不同的 python 连接器,但它们显然都需要一个 mysql 版本才能访问。我也一直在考虑将所有内容重做为 Powershell Runbook,因为似乎有比 python 更多的选项(例如SimplySQL)。我可以添加 SimplySQL 模块,我可以从 Runbook 中调用它,这是向前迈出的一步,但据我所知,没有选项或支持“mysqldump”。这意味着,我需要以某种方式重新创建“mysqldump”命令,方法是使用支持的简单查询重做它的功能。

当然,这不是最佳的,而且很容易出错,所以如果有人有更好的选择、有用的提示或工具,那将是一个很大的帮助!


不确定它是否有帮助,但这是我的 python 脚本。

    import logging
    import os
    from azure.storage.blob import BlobServiceClient
    from subprocess import Popen, PIPE, STDOUT
    from datetime import datetime
    from dotenv import load_dotenv
    import importlib.util
    import sys
    
    def generateDump():
    
        load_dotenv()
    
        process, process_output = runMySqlDumpCommand()
    
        if (process.returncode != 0):
            logging.error('ERROR CODE: ' + str(process.returncode))
            return
        else:
            generateAndUploadBlob(process_output)
    
    def runMySqlDumpCommand():
        command_args = [
            "mysqldump",
            "-P",
            f"os.getenv('PORT')",
            "-h", 
            f"os.getenv('HOST')",
            "-u",
            f"os.getenv('DUMP_USER')",
            f"-pos.getenv('DUMP_PASSWORD')",
            f"os.getenv('DATABASE')"
        ]
    
        #The system cannot find the specified file
        process = Popen(command_args, stdin=PIPE, stdout=PIPE, stderr=STDOUT, universal_newlines=True)
        process_output = process.communicate()[0]
        process.wait()
    
        return process, process_output
    
    def generateAndUploadBlob(process_output):
        timestamp = datetime.now().strftime("%d-%m-%Y_%H:%M:%S")
        filename = os.getenv('DATABASE') + "_" + timestamp + ".sql"
        blob_service_client = BlobServiceClient.from_connection_string(os.getenv('DUMP_STORAGE_CONNECTION'))
        blob_client = blob_service_client.get_blob_client(container=os.getenv('DUMP_CONTAINER_NAME'), blob=filename)
    
        blob_client.upload_blob(process_output)

if __name__== "__main__":
    generateDump()

【问题讨论】:

【参考方案1】:

是的,您是正确的,您尝试执行的数据操作是无法使用 mysql 进行的,因为它不是第一方 MS 产品。但是您使用 Azure SQL 执行相同的操作。

目前,我认为解决您面临的自动化问题的唯一选择是使用SimplySQL module 获取连接和查询数据库的运行手册。连接属性非常简单,允许连接到多种数据库类型,包括 MySQL。您可以使用以下命令安装并获取 SimplySQL 的快速统计信息。

Install-Module -Name SimplySql -RequiredVersion 1.6.2
Get-Module SimplySQL

之后,您可以使用 Invoke-SqlQuery 将 MySQL 查询传递给您使用 Open-MySQLConnection cmdlet 打开的连接。

请注意,要在本地本地服务器或虚拟机中备份现有 MySQL 数据库,您可以考虑dump and restore using mysqldump cmd tool。

但除此之外,我想不出任何方法来达到这个结果。作为一种解决方法,您可以使用 SQL Server 和 PowerShell Runbook 来实现您想要执行的备份操作。为此,请查看此Azure Automation: Export Azure SQL Database to Blob Storage in a BACPAC file 文档以获取更多信息。

【讨论】:

以上是关于在 Azure Runbook 上运行“mysqldump”的主要内容,如果未能解决你的问题,请参考以下文章

我是否必须在powershell Runbook(azure)中导入模块?

Azure Runbook 错误,AzureRmStorageAccountKey 无法索引到空数组

如何使用 PowerShell Runbook 在 azure blob 存储上创建文本文件?

Azure Runbook 不删除文件共享中的文件

使用 python 将 azure Runbook 与 azure 中的文件共享连接起来

使用 REST API 创建自动化作业以执行 azure Runbook