![](/img/trans.png)
[英]Trouble running PowerShell command with subprocess library in Python script runbook (Azure automation account)
[英]Running 'mysqldump' on an Azure Runbook
所以我寫了一個 python 腳本,它運行“mysqldump”來生成一個轉儲,然后將其存儲為備份。 在本地,該腳本可以順利運行,但最終目標是能夠將其作為 Runbook 添加到 Azure 自動化帳戶,因此它每天運行一次。
The issue currently, is that the Azure environment does not have a MySQL module, as MySQL is not a Windows product, so I cannot run any MySQL commands (I get the error ' #The #The system cannot find the specified file
'), including ' mysql轉儲'。 我嘗試過使用不同的 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"-p{os.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()
是的,您是正確的,您嘗試執行的數據操作對於 mysql 是不可能的,因為它不是第一方 MS 產品。 但是您使用 Azure SQL 執行相同的操作。
現在我能想到的解決自動化問題的唯一選擇是使用SimplySQL 模塊來獲取連接和查詢數據庫的運行手冊。 連接屬性非常簡單,允許連接到多種數據庫類型,包括 MySQL。 您可以使用以下命令安裝並獲取 SimplySQL 的快速統計信息。
Install-Module -Name SimplySql -RequiredVersion 1.6.2
Get-Module SimplySQL
之后使用Invoke-SqlQuery ,您可以將 MySQL 查詢傳遞給您使用 Open-MySQLConnection cmdlet 打開的連接。
請注意,要在本地本地服務器或虛擬機中備份現有 MySQL 數據庫,您可以考慮使用 mysqldump cmd 工具進行轉儲和還原。
但除此之外,我想不出任何方法來達到這個結果。 作為一種解決方法,您可以使用 SQL 服務器和 PowerShell 運行手冊來實現您要執行的備份操作。 為此,請檢查此Azure 自動化:導出 Azure SQL Database to Blob Storage in BACPAC 文件文檔以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.