No puedo encontrar mysql al instalar Drupal 7

Hace ya unos años estoy trabajando fuertemente con Drupal 6, sólo hace unas semanas he empezado a usar la versión 7 y me parece un avance excelente. Poco a poco estaré publicando información relacionada a Drupal.

Instalando Drupal 7 bajo Windows y Apache he encontrado que no me da la opción de usar MySQL:

Instalación Drupal y MySQL

Esto es porque ahora Drupal 7 tiene como requerimiento el uso de la extensión PDO, además que requiere MySQL 5.015 o mayor.

Para solucionarlo, sólo debemos abrir el archivo php.ini, buscar y descomentar las líneas que permiten el uso de estas extensiones:

;extension=php_openssl.dll
extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll

Reiniciamos Apache y listo:

Instalación Drupal y MySQL

Es posible que tengas algunos otros errores, si es así, los comentarios están abiertos

Por cosas pequeñas y sencillas... 🙂

Reiniciar auto_increment cada año en MySQL

Alguna vez vamos a necesitar reiniciar el contador del auto_increment cada año. Por ejemplo si tenemos una tabla recibos quisieramos que el número de recibo empieze desde 1 el año siguiente.

Para esto hay un pequeño artificio en MySQL que nos puede ayudar:

SQL:

CREATE TABLE `recibos` (
  `anio` year(4) NOT NULL,
  `ID` int(5) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY  (`anio`,`ID`)
) ENGINE=MyISAM;
 

El truco está en que el campo primario debe ser la composición de dos campos; donde la columna con AUTO_INCREMENT es la segunda columna del índice.

SQL:

/* Ingresamos datos */
INSERT INTO `recibos` (`anio`) VALUES ('2010'), ('2010'), ('2010'), ('2011'), ('2011');

/* Mostramos los datos */
SELECT * FROM `recibos`;
 

El resultado sería:

CODE:

+------+----+
| anio | ID |
+------+----+
| 20101 |
| 20102 |
| 20103 |
| 20111 |
| 20112 |
+------+----+

La limitación es que este tipo artificio sólo funciona en tablas del tipo MyISAM.

Generar backups de bases de datos MySQL desde .NET

En general prefiero realizar los backups desde scripts, pero muchas veces esta tarea se debe realizar desde la misma aplicación. Algo a tomar muy en cuenta si opta por este camino, es que los backups -- en lo posible -- deben ser generados con las herramientas que el motor de base de datos trae para este fin.

En los ejemplos se muestra el uso de mysqldump y la clase Process, que según MSDN proporciona acceso a procesos locales y remotos, y permite iniciar y detener procesos del sistema local:

csharp:
public void Backup(string  args)
{
        ProcessStartInfo psi = new ProcessStartInfo(ConfigurationManager.AppSettings["MysqlDump"], args);
        string filename = Path.Combine(workingDir, DateTime.Now.ToString(@"yyyy-MM-dd.\sql"));
       
        using (StreamWriter writer = new StreamWriter(filename, false, Encoding.UTF8))
        {
                using(Process process = new Process())
                {
                        psi.CreateNoWindow = true; // Evita que el proceso se inicie en una nueva ventana.
                        psi.UseShellExecute = false; // Evita que se use el shell del sistema operativo para iniciar el proceso.
                        psi.RedirectStandardOutput = true; // Escribir la salida en Process.StandarOuput
                        psi.StandardOutputEncoding = Encoding.UTF8; // Codificación de los datos de salida
       
                        process.StartInfo = psi;
                        process.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
                        {
                                writer.WriteLine(e.Data);
                        };
       
                        process.Start();
                        process.BeginOutputReadLine(); // Lectura asincrónica del stream de salida
                        process.WaitForExit(); // Esperar a que el proceso termine.
                }
        }
}

Aunque en el código mostrado es más sencillo realizar algún proceso sobre los datos generados, hay que tener muy en cuenta la codificación de los datos en los backups, puesto que por un descuido se puede generar fácilmente basura.

Si se quiere evitar estos problemas de codificación, se podría usar algo como:

csharp:
public void Backup(string args)
{
    string filename = Path.Combine(workingDir, DateTime.Now.ToString(@"yyyy-MM-dd.\sql"));
    ProcessStartInfo psi = new ProcessStartInfo("cmd.exe",
                                                string.Format("/c \"\"{0}\" {1} > \"{2}\"\"",
                                                              ConfigurationManager.AppSettings["MysqlDump"], args,
                                                              filename));

    psi.CreateNoWindow = true;
    psi.UseShellExecute = false;

    using (Process process = new Process())
    {
        process.StartInfo = psi;
        process.Start();
        process.WaitForExit();
    }
}

En fin, usar uno u otro método va a depender de los requerimientos de la aplicación.