Displaying posts with tag: DBA (reset)
Query log de MySQL (general log)

En MySQL podemos habilitar un log de queries ejecutadas en el servidor llamado “general log“. Aunque no es muy recomendable tenerlo habilitado normalmente, puede resultar útil en momentos puntuales. Vamos a ver su funcionamiento:

Las variables que controlan el general log son las siguientes:

  • general_log: Indicamos si queremos habilitar o no dicho log
  • general_log_file: Indicamos el path del fichero dónde queremos el log

Mediante SHOW VARIABLES podemos verlos:

mysql> show variables like 'general_log%';
+------------------+--------------------------+
| Variable_name    | Value                    |
+------------------+--------------------------+
| general_log      | OFF                      | 
| general_log_file | /var/log/mysql/query.log | …
[Lea más]
Deshabilitar el binary log para una sesión con MySQL

Cuando habilitamos un slave en read_only esto no quita que un usuario con privilegio SUPER pueda realizar modificaciones, por lo que puede ocurrir algún desastre que tengamos que recuperar manualmente mediante comandos SQL tanto en el master como en el slave.

Si nos interesa ejecutar algún conjunto de comandos en el master que no queremos que se ejecuten en el slave, podemos deshabilitar únicamente para la sesión actual los binary logs, sin afectar al resto de conexiones, mediante la variable sql_log_bin:

mysql> set sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)

A partir de este comando cualquier sentencia que ejecutemos no quedará registrada en el binary log, y por lo tanto el slave no la verá …

[Lea más]
Realizar optimize de las tablas en función de los datos libres

Las tablas de MySQL debemos hacerles mantenimiento periódicamente ya que cuando eliminamos un dato, el espacio se queda marcado como libre pero no se libera. Mediante el comando OPTIMIZE podemos liberar dicho espacio recreando la tabla sin dicho espacio.

Tanto mediante SHOW TABLE STATUS:

mysql> show table status\G
(...)
*************************** 13. row ***************************
           Name: ejemplo_systemadmin.es
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 467
 Avg_row_length: 25
    Data_length: 11675
Max_data_length: 7036874417766399
   Index_length: 62464
      Data_free: 54300
 Auto_increment: NULL
    Create_time: 2011-11-04 12:43:11
    Update_time: 2012-09-01 08:10:05
     Check_time: 2012-08-05 06:30:11
      Collation: latin1_swedish_ci …
[Lea más]
Deshabilitar tabla ASCII en la salida de MySQL

Al ejecutar comandos SQL en MySQL veremos que nos devuelve el resultado con una bonita tabla ASCII tanto en el modo interactivo:

mysql> select 1,2;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
1 row in set (0.00 sec)

mysql> 

Como usando la opción -e para pasar el comando a ejecutar:

$ mysql -e "select count(1)"
+----------+
| count(1) |
+----------+
|        1 | 
+----------+

Vamos a ver las opciones que tenemos para poder modificar el tipo de salida por pantalla.

En el caso que no queramos que nos muestre el nombre de la columna por pantalla, tenemos la opción -N:

  -N, --skip-column-names 
                      Don't write column names in results.

Por lo que obtendríamos, por linea de comandos con la opción -e:

$ mysql -e …
[Lea más]
Códigos de errores de MySQL

En MySQL nos podemos encontrar con errores que no son muy explicativos pero que nos dan un código. Son similares a:

algo ... (errno: <CODIGO>)
algo ... (Errcode: <CODIGO>)

Mediante perror podemos descodificar dicho error:

Únicamente deberemos ejecutar el comando perror con el código para que nos devuelva una mejor descripción del error:

$ perror 31
OS error code  31:  Too many links
$ perror 32
OS error code  32:  Broken pipe

Dicho binario se encuentra con el resto de ficheros dónde tengamos instalado el MySQL:

# ls -la /usr/local/mysql/bin/perror 
-rwxr-xr-x 1 mysql mysql 197433 Feb 15  2010 /usr/local/mysql/bin/perror

Tags: MySQL
Relacionados

[Lea más]
CREATE TABLE SELECT vs CREATE TABLE LIKE

En MySQL, el comando CREATE TABLE le podemos pasar otra tabla con un SELECT o con un LIKE para que cree una tabla con el resultado de la SELECT o copie la estructura de datos.

Los dos comandos son parecidos pero tenemos que tener en cuenta un detalle. Cuando hacemos un CREATE TABLE LIKE estamos diciendo que queremos copiar la estructura de tabla, por lo que incluye todas las definiciones:

mysql> show create table a;
+-------+-------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                          |
+-------+-------------------------------------------------------------------------------------------------------+
| a     | CREATE TABLE `a` (
  `i` int(11) NOT NULL,
  PRIMARY KEY (`i`)
) ENGINE=MyISAM …
[Lea más]
El comando mysqladmin

La herramienta mysqladmin permite realizar las operaciones más comunes que un administrador de este motor de base de datos necesita realizar con comandos más cortos. Vamos a ver unos ejemplos:

Si ejecutamos mysqladmin sin opciones veremos el conjunto de operaciones que podemos hacer:

# mysqladmin 
mysqladmin  Ver 8.42 Distrib 5.5.8, for Linux on x86_64
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
(...)
Where command is a one or more of: (Commands may be shortened)
  create databasename   Create a new database
  debug                 Instruct server to write debug information to log
  drop databasename     Delete a database and all its tables
  extended-status       Gives an extended status message from the server
  flush-hosts           Flush all cached hosts
  flush-logs            Flush all logs
  flush-status          Clear status variables
  flush-tables …
[Lea más]
Duplicate entry ’201830′ for key ‘PRIMARY’

En tablas MyISAM nos podemos encontrar que al insertar un valor nos salga el siguiente error:

Duplicate entry '201830' for key 'PRIMARY'

En este caso, debería ser imposible que en una columna con una clave primaria exista una entrada duplicada. Se trata de una corrupción de datos debido posiblemente a algún bug o un cierre abrupto de la base de datos.

Para solucionar el problema deberemos usar el comando REPAIR TABLE:

REPAIR TABLE ejemplo;

Dichos errores no son especialmente comunes, pero lo único que podemos hacer es introducir un trozo de código en la aplicación que realice la operación en caso de encontrar el error para minimizar el problema.

Tags: MySQL
Relacionados

[Lea más]
min_examined_row_limit de MySQL

Uno de los grandes problemas del log de slow queries de MySQL es la gran cantidad de ruido que se acaba introduciendo limitando mucho la utilidad de revisar dicho log, especialmente si se revisa cada mucho tiempo. Una opción para reducir dicho ruido es min_examined_row_limit

La variable min_examined_row_limit permite indicar un valor mínimo de filas examinadas para que una query (aunque tarde más que el tiempo que tengamos definido en long_query_time) sea incluida en el log o no. Dicho valor por defecto esta a 0.

mysql> show variables like 'min_examined_row_limit';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| min_examined_row_limit | 0     |
+------------------------+-------+
1 row in set (0.00 sec)

Aumentando el valor evitaremos que se incluyan en el log queries que …

[Lea más]
Identificar un servidor MySQL con una query

Teniendo uno o varios MySQL slave, lo lógico es repartir las lecturas entre los varios servidores, por lo que necesitamos un SELECT que nos identifique el servidor con el fin de verificar que realmente estamos repartiendo las lecturas entre servidores.

A partir de la versión 5 de MySQL se introdujo la base de datos information_schema dónde podemos encontrar mediante tablas mucha información sobre el estado del MySQL.

Mediante la tabla global_variables, podemos obtener el hostname del servidor que esta ejecutando la query, por lo que identificaremos el servidor que estamos usando:

mysql> select * from information_schema.global_variables where variable_name="HOSTNAME";
+---------------+----------------------+
| VARIABLE_NAME | VARIABLE_VALUE       |
+---------------+----------------------+
| HOSTNAME      | …
[Lea más]