Accediendo a MySQL desde PowerShell

Hace unos días me surgió la necesidad de trabajar con una base de datos con MySQL, en un servidor Ubuntu, generado desde el marketplace de Azure. Por ello es que estoy compartiendo este post, para dejar accesible estos “ apuntes” de lo que sería lo necesario para poder acceder a una base de datos MySQL desde PowerShell.

Para los administradores de sistemas que trabajan en estos tiempos modernos no es nuevo el tener que tomar el control de plataformas heterogéneas. Hoy es común tener ambientes con Windows y Linux conviviendo en el mismo datacenter, así como soluciones que se interconectan entre sí. Por ello es necesario conocer como interactuar con cada sistema en particular.

Primer paso

A modo de requisito es necesario contar con el MySQL .NET Connector en el equipo que va a ejecutar PowerShell:

Descarga del conector para MySQL

Simplemente hay que descargarlo e instalarlo, siguiendo los pasos del asistente que básicamente se reducen a siguiente y siguiente hasta el final.

Posterior a la instalación hay que integrar en el script (o en el bloque de código a ejecutar) lo siguiente:

[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")

Y lo siguiente es realizar la conexión y la estructura de información necesaria antes de pasar a detallar el query a ejecutar:

$MySQLAdminUserName = 'root'
$MySQLAdminPassword = 'Ultr@P@ssw0rd'
$MySQLDatabase = 'databaseName'
$MySQLHost = 'MySQLServer'
$ConnectionString = "server=" + $MySQLHost + ";port=3306;uid=" + $MySQLAdminUserName + ";pwd=" + $MySQLAdminPassword + ";database="+$MySQLDatabase

Hasta ahora nada raro, simplemente definimos las variables que van a contener nuestra información de conexión, en donde detallamos usuario admin, passsword, servidor, base de datos y el connection string.

Definimos la query a ejecutar:

$Query = "SHOW tables"

Lo siguiente es armar una estructura de conexión, que es requerida para poder ejecutar nuestra query (que también vamos a definir) utilizando el conector ya invocado:

$Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
$DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
$DataSet = New-Object System.Data.DataSet
$RecordCount = $dataAdapter.Fill($dataSet, "data")
$DataSet.Tables[0]

Y listo! Nuestra primer consulta a MySQL desde PowerShell.

Organizando el trabajo…

Ahora que tenemos claro el procedimiento para realizar consultas a nuestra base de datos, vamos a generar algunas funciones para que nos facilite el trabajo a la hora de realizar tareas un poco más complejas con MySQL.

La primera función que vamos a armar es un Cmdlet para realizar la conexión con el servidor:

function Connect-MySqlServer {

    [OutputType('MySql.Data.MySqlClient.MySqlConnection')]
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [pscredential]$Credential,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$MySQLHost,

        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [int]$Port = 3306,

        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$MySQLDatabase
    )


    $MySQLAdminUserName = $Credential.UserName
    $MySQLAdminPassword = $Credential.GetNetworkCredential().Password

    if ($PSBoundParameters.ContainsKey('Database')) {
        $ConnectionString = "server=" + $MySQLHost + ";port=" + $Port + ";uid=" + $MySQLAdminUserName + ";pwd=" + $MySQLAdminPassword + ";database="+$MySQLDatabase
    } else {
        "server=" + $MySQLHost + ";port=" + $Port + ";uid=" + $MySQLAdminUserName + ";pwd=" + $MySQLAdminPassword
    }

    try {
        [MySql.Data.MySqlClient.MySqlConnection]$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)
        $conn.Open()
        $Global:MySQLConnection = $conn
        if ($PSBoundParameters.ContainsKey('Database')) {
            $null =  New-Object MySql.Data.MySqlClient.MySqlCommand("USE $MySQLDatabase", $conn)
        }
        $conn
    } catch {
        Write-Error -Message $_.Exception.Message
    }
}

Perfecto! Tenemos nuestra primer función para conectarnos a nuestro servidor, ahora necesitamos una función que nos permita cerrar la sesión que generamos en el servidor. Para ello vamos a escribir lo siguiente:

function Disconnect-MySqlServer {

    [OutputType('MySql.Data.MySqlClient.MySqlConnection')]
    [CmdletBinding()]
    Param
    (
        [Parameter(ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [MySql.Data.MySqlClient.MySqlConnection]$Connection = $MySQLConnection
    )

    try {
        $Connection.Close()
        $Connection
    } catch {
        Write-Error -Message $_.Exception.Message
    }
}

Ya que al definir en la primer función una variable global, podemos invocarla como valor predeterminado del parámetro de nuestra función para desconectarnos y así simplemente ejecutar:

Disconnect-MySqlServer -Connection

Cerrando una sesión de MySQL desde PowerShell

Y listo! Estamos fuera del servidor de MySQL desde PowerShell.

Happy scripting!

Comments