Mostrando las entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando las entradas con la etiqueta MySQL. Mostrar todas las entradas

martes, 11 de octubre de 2016

Cambios en MySQL 5.6 a MySQL 5.7

Cambios en MySQL 5.6 a MySQL 5.7

Los cambios mas significativos cambios que tenemos que tomar en cuenta son los siguientes:


1) Insertar valores negativos en un campo tipo unsigned
Crear tabla con campo tipo unsigned:
CREATE TABLE test (
 id int unsigned
);
 
Insertar valor negativo: 
Previamente (en MySQL 56)
INSERT INTO test VALUES (-1);
Query OK, 1 row affected, 1 warning (0.01 sec) 
En MySQL 5.7: 
INSERT INTO test VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1

2) Division por cero
Crear tabla de prueba: 
CREATE TABLE test2 (
 id int unsigned
); 
Dividiendo por 0 
Previamente: 
INSERT INTO test2 VALUES (0/0);
Query OK, 1 row affected (0.01 sec) 
En MySQL 5.7: 
INSERT INTO test2 VALUES (0/0);
ERROR 1365 (22012): Division by 0


3) Insertando 20 caracteres en una campo cadena en un campo de 10 caracteres
Crear table con campo tipo carácter de 10: 
CREATE TABLE test3 (
a varchar(10)
); 
Intentar insertar un valor mayor 
Previamente: 
INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec) 
En MySQL 5.7: 
INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
ERROR 1406 (22001): Data too long for column 'a' at row 1

4) Insertando una fecha en ceros en un campo tipo datetime
Creamos la tabla con el campo tipo datetime: 
CREATE TABLE test3 (
a datetime
); 
Insertar 0000-00-00 00:00:00. 
Previamente: 
INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec) 
En MySQL 5.7: 
INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'a' at row 1

5) Usando GROUP BY and seleccionando columna ambigua:

Esto sucede cuando la descripción de la consulta no es parte de la sentencia GROUP BY, y/o que no hay funciones de agregación (MIN o MAX). 
Previamnete:
SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
+----+------------+-------------+
| id | invoice_id | description |
+----+------------+-------------+
| 1 | 1 | New socks             |
| 3 | 2 | Shoes                 |
| 5 | 3 | Tie                   |
+----+------------+-------------+
3 rows in set (0.00 sec) 
En MySQL 5.7: 
SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoice_line_items.description' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by


lunes, 22 de agosto de 2016

Relay log corruptio en MySQL

Problemas con el "Relay Log", marcando corrupto en MySQL

La replicación del MySQL se detiene y al entrar a checar lo sucedido (show slave status \G;) te encuentras con un error como el siguiente:

Last_Error: Could not parse relay log event entry. The possible reasons are: the master’s binary log is corrupted (you can check this by running ‘mysqlbinlog’ on the binary log), the slave’s relay log is corrupted (you can check this by running ‘mysqlbinlog’ on the relay log), a network problem, or a bug in the master’s or slave’s MySQL code. If you want to check the master’s binary log or slave’s relay log, you will be able to know their names by issuing ‘SHOW SLAVE STATUS’ on this slave.

jueves, 4 de febrero de 2016

Script Respaldo Procedimientos MySQL

Respaldo de procedimientos de 1 por 1 en MySQL en bash.

El siguiente script permite respaldar los procedimientos, y/o funciones de una base de datos dada como parámetro, y dejando el respaldo parseado y listo para ser registrado.

lunes, 14 de septiembre de 2015

MySQL autoincrement en replicación Master-Master

Un detalle que se nos presenta al momento de la replicación de Master-Master es con respecto a los campos que definimos como auto_increment dentro de la estructura de nuestras tablas.

La solución que se nos ofrece en este tipo de situaciones, sonara como una "Mexicanada".

Tenemos dos parámetros configurables: auto_increment_increment y auto_increment_offset.

Para configurar estas opciones lo podemos realizar al iniciar el servicio MySQL.


--auto_increment_increment= N --auto_increment_offset=#

donde:
N = Número de servidores que trabajaran con esta configuración.
# = Número entre 1 y N, cada servidor usara un diferente offset.


Ó mediante variables:

SET @@auto_increment_increment = N;
SET @@auto_increment_offset = #;


auto_increment_increment; es el numero en que el servidor incrementara cada vez que un valor sea incrementado. El default es 1, es decir que incrementara de 1 en 1, ejemplo 1, 2, 3, 4, 5, etc. Si el valor es un 2, incrementara en 2, ejemplo 1, 3, 5, 7, 9, etc. Si el valor es 3 incrementara, 1, 4, 7, 10, etc.
auto_increment_offset: No puede ser un valor mayor al de auto_increment_increment, este permite decirle cual sera el valor del servidor, si es par o non, si es 1 sera 1, 3, 5 y si es "2" entonces seran los valores 2, 4, 6, 8, No importa cual sea el valor actual del auto_increment, si es 132, continuara con 134, 136, etc.


También podemos declararlos de la siguiente manera:
Al detalle:
Configuraciones:
En servidor 1:
auto_increment_increment = 2    # Cantidad de servidors
auto_increment_offset = 1  # El número a incrementar (es non)
En servidor 2:
auto_increment_increment = 2   # Cantidad de servidores.
auto_increment_offset = 2  # El número a incrementar (es inpar)
De un inicio en cuanto activamos una replicación las tablas contaran con la misma información. Una vez que se configura como anteriormente se menciono, y se realizan insert sobre dichas tablas (con auto_increment) se insertaran algunos registros en servidor 1, y otros se insertaran en el servidor 2, todo con respecto a la configuración anterior. En un momento dado tendrán información diferente, pero al ejecutarse la replicación, ambos servidores contaran con la misma información.







jueves, 20 de agosto de 2015

Variables para Optimizar MysQL


Variables para optimizar MySQL


innodb_buffer_pool_size: Cuanta memoria usaran las tablas InnoDB que usaran para la carga de memoria en los datos e indices.
En servidores dedicados se recomienda un 50% a 80% de la RAM.

innodb_log_file_size: Se debe incrementar esta variables para para mejorar el rendimiento.

innodb_flush_method: Cuando se usa controladores de RAID, es mejor usar la opción O_DIRECT. Esto previene "doble buffer", cuando no se tienen estos RAIDS es
mejor no usarlo.

innodb_flush_neighbors: Es mejor dejar el parámetro deshabilitado (0) en discos SSD, los cuales no tienen ninguna ventaja con IO secuencial.

innodb_io_capacity y innodb_io_capacity_max: Estas variables influencian cuantos trabajos background por segundo pueden haber.

innodb_lru_scan_depth: Si incrementas innodb_io_capacity,  tambien se debe incrementar esta variable.


Replicación.

log-bin: Activarlo, te permite recuperar cierta información que se haya perdido, ante un daño de la base de datos.

expire-logs-days: Por default los logs duran para siempre, lo recomendado seria mantenerlos de 1 a 10 dias.

server-id: Id único que se le da al servidor.



Misc.


timezone=GMT: Cambiar el timezone a un default, por lo general se usa el GMT

sql-mode: Variable para configurar algunas propiedades que le queramos dejar a la entidad. Como,
STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,
NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,
NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY.

skip-name-resolve: Con esta variable podemos desahabilitar la reversa de los nombres de las conexiones.

max_connect_errors: Maximo de errores al conectarse para bloquear la conexión.

max-connections: El default es 151, pero yo por lo general uno 500 usuarios  simultáneos.





















viernes, 24 de julio de 2015

Migrar MySQL 5.1 a 5.5

Cuando vamos a migrar MySQL a otra versión tenemos que tomar en cuenta los cambios de sintaxis, variables que son descontinuadas y configuraciones que cambian.

Algunos puntos importantes al migrar de MySQL 5.1 a 5.5 son los siguientes:

= [v5.5.32] En las tablas de sistema, los campos "url" se crean tipo Text, pero en la migración no se cambian, se tiene que hacer a pie:

ALTER TABLE mysql.help_category MODIFY url TEXT NOT NULL;
ALTER TABLE mysql.help_topic MODIFY url TEXT NOT NULL;


= [v5.5.3] No se permite "FLUSH TABLES", cuando existe un bloqueo de tabla activo. Para esto se tiene que ejecutar:

FLUSH TABLES tbl_list WITH READ LOCK

Esto permite que se pueda hacer flush a la tabla y bloquearse al mismo tiempo. Por lo tanto aplicaciones que usen esto:

LOCK TABLES tbl_list READ;
FLUSH TABLES tbl_list;

fallaran.

= [v5.5.7] Nueva tabla proxies_priv, marcara error de que no existe,

"Table 'mysql.proxies_priv' doesn't exist"

cuando se inicie mysql se le tendrá que usar "--skip-grant-tables" y después se correrá mysql_upgrade. ejemplo:

shell> mysqld --skip-grant-tables &
shell> mysql_upgrade

Tendremos que detener y reiniciar el servicio mysql.

Si requerieramos de opciones adicionales, como seleccionar el archivo de configuración personalizado o por default:

shell> mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
         --skip-grant-tables &
shell> mysql_upgrade

Tener cuidado por que con el parámetro "--skip-grant-tables" cualquiera podrá entrar al servidor, para seguridad adicional
agregar "--skip-networking" para que usuarios remotos se conecten.

= [v5.5.7] No se permite mas "TRUNCATE TABLE", devolverá error, se tiene que cambiar a DELETE FROM, la técnica de borrado
es un DROP Y CREATE.

= [v5.5.6] Por problemas en la replicación, cuando se guarda en el binario para ser replicado, cuando se hace uso de la sentencia
CREATE TABLE IF NOT EXISTS ... SELECT, cuando la tabla que se va a crear si existe manda un mensaje de error y en el servidor
"master" si se insertan los registros pero en el servidor "slave" no. Es decir:
- Si la tabla no existe, se guarda en el  log tal cual.
- Si la tabla existe,

= [v5.5.6] Si truena cuando inicia el full-text stopword, se debe reparar la tabla:
REPAIR TABLE tbl_name QUICK;

= [v5.5.5] Existe la manera de activar que nos envie un error (ER_DATA_OUT_OF_RANGE), cuando se quiera insertar un valor fuera de rango,
o que en su defecto le ponga el valor máximo de dicho numero. Variable global @@sql_mode , valores numéricos.

= Revisar los campos timestamp ya no permiten el campo "n" timestamp(n).
- Para corregirlo, en el archivo dump, se debe quitar el parametro (n)
- Antes de respaldar la base de datos, alterar dichas columnas.

= El parámetro "--languages" se remplazo por las variables del sistema: "lc_messages_dir" y "lc_messages".

= Las tablas particionadas se deben de alterar

Actualizar primero los espejos:

Detenemos la replicación en todos los espejos y los actualizamos. Los reiniciamos con la opción "--skip-slave-start", para que no se conecten al servidor maestro.

De esta manera se podra reparar cualquier tabla con los comandos:
REPAIR TABLE or ALTER TABLE
Desahabilitar el log binario en el maestro.

 SET sql_log_bin = 0
 También se puede hacer reiniciado el master, y configurando la opción de "--log-bin", en el my.cnf, aprovechando esto, pudieras desahabilitar la conexión de los clientes TCP/IP,  con la opción "--skip-networking".

De esta manera no se replicaran las optimizaciones o reparaciones que se hagan en los objetos de la base de datos y no se replicarían.

Finalmente regresaremos las configuraciones a su estado original, para comenzar a ponerlo nuevamente a replicarse.

Si usamos anteriormente  set sql_log_bin a 0, se ejecuta SET sql_log_bin = 1.

Si usamos el otro método solo reiniciamos el esclavo, sin la opción "--skip-slave-start".


service mysqld stop
wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
rpm --force -Uvh mysql-community-release-el6-5.noarch.rpm
rm mysql-community-release-el6-5.noarch.rpm

yum install --disablerepo=* --enablerepo=mysql55-community mysql-community-server
chkconfig mysqld on
service mysqld start
mysql_upgrade




miércoles, 21 de enero de 2015

Plugins MySQL


INSTALACION DE PLUGIN:

Los plugins deben ser reconocidos por el servidor antes de ser usado. Esto se logra con diferentes métodos.

Normalmente el plugin se activa al reiniciar el servicio MySQL

*Buit-in plugins:
Es un plugin construido dentro del servidor que es reconocido automáticamente. Puede cambiarse el valor si se usa la opción --plugin_name.

*Registrando el plugin en la tabla mysql.plugin:
El servidor normalmente habilita cada plugin listado en la tabla al iniciar el servicio, sin embargo puede ser cambiado con la opción --plugin_name. Si el servicio de MySQL se inicia con la opción --skip-grant-tables, esta opción no consulta la tabla y no carga los plugins.

*Mandando llamar el plugins con la opción --plugin-load:
Es una librería que se carga al iniciar el servicio MySQL, con la opción --plugin-load. Pero puede ser cambiado si se usa la opción --plugin_name.

Esta opción usa un listado separado por punto y coma de los plugins con la siguiente sintaxis, name=plugin_library, donde "name" es el nombre del plugin y "plugin_library" es el nombre de la librería compartida que contiene el código. Las librerías deberán estar alojadas en el directorio que refiera la variable "plugin_dir". Esta opción no registra en la tabla mysql.plugin. Para reinicios subsecuentes, el servidor carga de nuevo los plugins SOLO con la opción --plugin-load.

*Instalar plugin con "INSTALL PLUGIN":
Cuando un plugin esta localizado en el archivo de la librería puede ser cargada en tiempo de ejecución con "INSTALL PLUGIN". Ademas registra el plugin en la tabla mysql.plugin, lo cual
causa que cuando se reinicie el servicio MySQL se recarguen los plugins. 

Si utiliza las dos opciones para registrar un plugin, "INSTALL PLUGIN" y --plugin-load, el servicio reiniciara pero mandame mensajes de que el plugin ya existe.

ejemplo:
con "--plugin-load":
[mysqld]
plugin-load=myplugin=somepluglib.so

Con sentencia:
mysql> INSTALL PLUGIN myplugin SONAME 'somepluglib.so';

CONTROLAR ACTIVAR PLUGINS
Se puede activar o desahabilitar un plugin al gusto sin importar si esta configurado con algunas de las opcinoes anteriores con:
--plugin_name=OFF       : Desahabilita el plugin
--plugin_name[=ON]      : Habilita el plugin, pero si marca error de todas formas inicia el servicio.
--plugin_name=FORCE  : Inicia el servicio siempre y cuando no exista error.
--plugin_name=FORCE_PLUS_PERMANENT : Inicia el servicio siempre y cuando no exista error pero aparte previene  de que se desahabiliten plugins en tiempo de ejecución, marcaria error.

El estado de los plugins activos pueden ser visto en information_schema.plugins.load_option.

Ejemplo: Tenemos 3 plugins, donde "csv" no es extremadamente importante que inicie si llega a fallar en el inicio, pero "blackhole" debe iniciar si o si y el plugin "archive" esta desahabilitado.

[mysqld]
csv=ON
blackhole=FORCE
archive=OFF


DESINSTALAR UN PLUGIN
* Sentencia "UNINSTALL PLUGIN", daría de baja el plugin y eliminaría el registro de la tabla mysql.plugin
-No puede desahabilitar plugins que son construidos en el servicio MySQL.
-No puede bajar plugins donde el servicio fue iniciado con --plugin-name=FORCE_PLUS_PERMANENT.


Información de los Plugin MySQL

*Cada registro de la tabla INFORMATION_SCHEMA.PLUGINS contiene información de cada plugin cargado.

SELECT * FROM information_schema.PLUGINS\G

Dentro de este resultado, todo lo que tenga en PLUGIN_LIBRARY = NULL, son plugins internos y no pueden ser descargados.


* SHOW PLUGINS\G
Muestra un registro por cada plugin cargado.

*La tabla mysql.plugin muestra los plugins registrador con "INSTALL PLUGINS".




No me a tocado a mi hacer uso de ellos, al menos no configurarlos yo, pero lo guardo como nota por si los requiero.








martes, 2 de diciembre de 2014

Extraer una tabla de un respaldo.

Para no tener que levantar todo el respaldo de una base de datos para solo extraer una tabla, hice el siguiente script:

   #! /bin/bash

   if test -z "$1"
   then
       echo First parameter will be "table"
       exit
   else
       TABLE=$1
   fi
  
  echo Table name: $1.
  echo File in to search: $2.
  echo File out: $3.
  sed -n -e '/CREATE TABLE.*'$TABLE'/,/CREATE TABLE/p' $2 > $3.dump
  echo Need to edit file $3.dump
  echo and extract just what you need.
  echo Lucky

 Se manda de parámetro el nombre de la tabla, el archivo del .dump y el nombre del archivo de salida.

sábado, 29 de noviembre de 2014

Leer fichero mysql-bin

Este archivo se genera a partir de que se tiene activo que se guarde el log de toda modificación en la base de datos, este archivo es leído por el servidor espejo, lo lee y toma los cambios y se ejecutan, para mantener la integridad de datos en los servidores.

¿Como leer este fichero binario?

Por fortuna contamos con el comando mysqlbinlog, con los parámetros correctos, podemos extraer la información para posteriormente ser leída y procesada.

 mysqlbinlog binlog.000046 > archivo.out
Y con algunos parámetros
mysqlbinlog --start-datetime="2008-05-28 16:41:00" --stop-datetime="2008-05-28 16:43:00" > archivo.out
Ya es cuestión de jugar con sus parámetros.

mas información aquí

Muy útil hasta para recuperar información.

viernes, 21 de noviembre de 2014

Se me lleno el disco de Base de Datos (ESPEJO uff!!)

Caso curioso...

Caso:
El servidor espejo( de mi productivo)  lleno el disco duro donde se encontraba la partición de mi base de datos, 100%, y como buena Ley de Murphy, el monitoreo que le tenia activado no estaba activado para esa unidad de disco, motivo por el cual no me di cuenta antes de que sucediera.

Síntoma:
El servicio de MySQL por obvias razones dejo de funcionar, no permitía accesar al servicio MySQL.

Causa:
Un descuido de una opción del sistema, comenzó a grabar mucha información en pocas horas inserto mas de 4millones de registros con mucha información de por medio.

Solución:
Una puede ser, depurar información en producción, dar mantenimiento en la base de datos productiva, respaldar nuevamente y restaurar y iniciar el espejo nuevamente ya con menos información.

Otra, liberar espacio en la unidad que se lleno copiando toda la carpeta de una de las base de datos a otro disco ó otro servidor, para levantar esa base de datos en ese otro disco.






martes, 11 de noviembre de 2014

MySQL implode, join resultados.

Por algún motivo en particular me nació la necesidad de agrupar, unir o concatenar los campos que pertenecían a una tabla, primero pensé en hacer un ciclo con un contador de la cantidad de campos que tenia dicha tabla y al final hacer el query final.

Oh sorpresa!! que con group_concat de MySQL me soluciono dicho problema, lo explico mejor con un ejemplo:

Query:
SELECT GROUP_CONCAT(DISTINCT column_name SEPARATOR ' , ') FIELD FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'nombre_basedatos' and table_name = 'nombre_tabla';

Consultando la tabla COLUMNS de sistema, busco extraer sus campos y ponerlos en una sola variable, dado que ocupo formar la consulta dinámicamente de los campos, pensaríamos que con un "*" funcionaria pero requería comparar la estructura de una "misma" tabla de dos base de datos.


Habra quien le encuentre otras utilidades como quizás formar un "score-board".

jueves, 6 de noviembre de 2014

Extraer tablas con falta de indices.

Si requerimos extraer de una manera dinamica, a que campos de las tablas les falta crearles indice, podemos generarlo dando como parámetros la base de datos y el nombre o alias de campos.

En ocasiones nuestras reglas nos dicen que los campos que representan una llave foranea terminan con "_id", es asi que realizo la siguiente consulta


Consulta para extraer el query con la creación de indices para las tablas de una base de datos data, donde


SELECT CONCAT('CREATE INDEX ix_', a.table_name,'_',a.column_name, ' ON ',a.table_name,'(',a.column_name,')') as indice
FROM information_schema.columns as a INNER JOIN  information_schema.tables as b
ON a.table_schema = b.table_schema and a.table_name = b.table_name
WHERE a.table_schema = 'nombre_basedatos' and a.column_name like ('%_id') and b.table_rows > 1000 and column_key = '';


nombre_basedatos: La base de datos donde queremos revisar.
%_id: El alias de los campos que se estan buscando.

Dudas?

Tips optimización 1 MySQL

Lo primero que hay que revisar cuando queremos hacer una consulta mas rápida, es el 
uso de indices. 

Tips para Optimización de Consultas:

- Usar el comando EXPLAIN <consulta>, regresa información con respecto a la consulta.
- id: Numero secuencial de la consulta
- select_type: Tipo de consulta, los cuales pueden ser:
- SIMPLE: Consulta simple, sin subquerys.
- PRIMARY: Similar a la consulta simple.
- UNION: Segunda o tercera consulta dentro de una union. 
- DEPEDENT UNION: Similar a UNION.
- UNION RESULT: Resultado de la UNION.
- SUBQUERY: Primer subconsulta 
- DEPENDENT SUBQUERY: Similar a subquery 
- DERIVED: Subconsulta en una clausula FROM.
- table: Tabla a la que hace refernecia los registros.
- type: Tipo de join.
- system: Solo tiene un registro
- const:  
- eq_ref: 
- refref_or_null: 
- index_merge: 
- unique_subquery: 
- index_subquery: Es similar al unique_subquery, remplaza las subconsultas en IN, pero trabaja sobre indices no unicos.
- range: Solo los registros que fueron solicitaos son los que se regresan.
- index: Similar al "ALL", por lo general es mas rápido que el de ALL ya que se basa en el scaneo del arbol del indice. 
- ALL: Escaneo completo de la tabla.

- Suponiendo que tenememos una consulta con comparaciones entre campos, ya sea en un inner join ON, ó where, es importante mantener el mismo tipo de campos y padding en ambos. varchar(10) vs varchar(15) no es bueno, varchar(10) vs char(10) si lo es.

- En la clausula WHERE:
- Remover los parentecis inecesarios.
- Las constantes con indices se evaluan solo una vez.
- Count(*) sin WHERE, es obtenido de la información del cabcesero de la tabla.
- Para cada tabla en un join, 
- Las tablas constantes son leidas antes que cualquier otra tabla; las tablas constantes son, tablas vacias o con un solo registro, 
tablas que son usadas en WHERE en una llave primaria o unica.
-  La mejor forma de 

lunes, 26 de mayo de 2014

Querys curiosos para MySQL

Manera de calcular el tamaño de cierta tabla, junto con eso, cantidad de registros, y el tamaño de los datos, del indice.

SELECT table_name, table_rows, data_length, index_length,
round(((data_length + index_length) / 1024 / 1024),2) "Size in MB",
(round(((data_length + index_length) / 1024 / 1024),2) / (SELECT COUNT(id) FROM nombre_basedatos.nombre_tabla)) as "Avg Row", (SELECT COUNT(id) FROM cbt.asociado) as rows FROM information_schema.TABLES WHERE table_schema = "nombre_basedatos"
and table_name = 'nombre_tabla';


Ver los derechos que tienen los usuarios sobre cierta base de datos:

SELECT grantee, privilege_type, is_grantable
  FROM information_schema.schema_privileges
  WHERE table_schema = 'nombre_basedatos';


Directorio en el que se encuentra nuestra base de datos:
SELECT @@basedir AS 'Directorio base';

Directorio donde se encuentran los datos.
SELECT @@datadir AS 'Directorio datos';

viernes, 21 de marzo de 2014

Actualizar #consecutivo a tabla #MySQL


Para actualizar un consecutivo,

Sin necesidad de realizar un ciclo, podemos actualizar un campo dado, comenzando con su maximo valor y que de ahi continue en consecutivo:

Creamos la tabla

CREATE TABLE tabla_prueba (id integer(4), valor varchar(40));

Insertamos registros a la tabla:
INSERT INTO tabla_prueba (id, valor) values(1,'valor1'),(2,'valor2'),(3,'valor3'),
       (0,'valor4'),(0,'valor5'),(0,'valor5');

Insertamos 3 registros con valor 0 en el campo id.

Actualizaremos esos registros que quedaron en 0, con un consecutivo.

UPDATE tabla_prueba as a, (SELECT @numeroConsecutivo:= (SELECT max(id) FROM tabla_prueba)) as tabla
SET a.id=@numeroConsecutivo:=@numeroConsecutivo+1 WHERE a.id = 0;


Cabe mencionar y como podrán observar que solo seleccione los campos con id = 0 para que se notara, si no, hubiera actualizado todos los registros con consecutivo a partir del 3, ya que era el máximo en su momento.

martes, 25 de febrero de 2014

Query por consola a Base de Datos

Para ejecutar una consulta que extraiga información de una base de datos(#database) por consola, el resultado mandarlo a un archivo de salida:


En este ejemplo, vamos a obtener la url de una imagen, y concatenando otros string, vamos a generar una salida como "cp /home/user/imagen.pjg /home/user/imagenes/", esto dentro de un archivo llamado, salida.sql

echo "SELECT  concat('cp ', url, '/', file, ' ', url, 'imagenes/'  FROM table_imagenes WHERE LEFT(file,2)='p_';" | mysql -A database_name > salida.sql

La sintaxis seria:

 echo "SELECT  campo  FROM table_name;" | mysql -A database_name > output.sql

martes, 26 de noviembre de 2013

Ejecución de consulta Repetidas veces. #MySQL

Si queremos ejecutar una consulta repetidas veces y nos pinte el resultado en consola lo podemos realizar asi:

watch 'echo "select count(*) from nombre_tabla;" | mysql -A nombre_basedatos'

Nos evitamos estar ejecutando a pie la consulta, solo es comodidad, igual manera abra que tener cuidado de no realizar una consulta que consuma muchos recursos, para no afectar los demas servicios.

Todo es cuestión de ingenio es que seguramente ustedes podran encontrarle otros usos.


miércoles, 20 de noviembre de 2013

Extraer información de base de datos, mandar a archivo.


#Extraer información de la base de datos y mandarla a un archivo:

echo "show create table nombre_tabla" | mysql -A nomre_basedatos > nomre_basedatos.sql

De igual forma podemos concatenar varios scripts en un mismo archivo, algo asi:

echo "show create table nombre_tabla" | mysql -A nomre_basedatos > nomre_basedatos.sql
echo "show create table nombre_tabla2" | mysql -A nomre_basedatos >> nomre_basedatos.sql

Como podemos observar en este ultimo, solo agregamos otro signo ">"  a ">>" lo que le refiere a que concatenara la salida de lo ejecutado.

miércoles, 8 de mayo de 2013

Bienvenidos

Loading..

De vez en cuando hablare un poco de MySQL, SQL, Django, Python, entre otras cosas que nada que ver...