MySQL ya no es completamente libre. Sólo era un producto libre, no un proyecto. Sin embargo aun nos queda Drizzle.
Tag: MySQL
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:
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:
Es posible que tengas algunos otros errores, si es así, los comentarios están abiertos
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:
`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.
INSERT INTO `recibos` (`anio`) VALUES ('2010'), ('2010'), ('2010'), ('2011'), ('2011');
/* Mostramos los datos */
SELECT * FROM `recibos`;
El resultado sería:
| anio | ID |
+------+----+
| 2010 | 1 |
| 2010 | 2 |
| 2010 | 3 |
| 2011 | 1 |
| 2011 | 2 |
+------+----+
La limitación es que este tipo artificio sólo funciona en tablas del tipo MyISAM.
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
:
{
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:
{
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.