Publi

  • ¿Cómo obtener el tamaño de las tablas en MySQL? Y alguna idea para nuestros servidores

    Hoy en día tenemos multitud de aplicaciones web instaladas en nuestros servidores. Algunas serán para gestionar nuestros servicios de forma más cómoda, también puede que tengamos varios WordPress instalados, Drupal, una tienda online, CRM, o algunas más específicas. El problema aquí es que como todo en esta vida digital, tiende a ocupar el máximo espacio posible. El caso es que a veces, es muy útil contar con un resumen del tamaño de todas las tablas de nuestro servidor.… Leer artículo completo

  • Cómo expulsar todas las sesiones MySQL de un usuario en particular desde un script

    502729552_aaa355b1ce_o

    Muchas veces, puede que tengamos una aplicación no muy bien depurada en nuestro servidor web. A dicha aplicación le hemos dado su propio usuario MySQL y observamos que las conexiones no se cierran adecuadamente.

    Temporalmente puede que la solución sea expulsar de vez en cuando todos los usuarios que siguen activos, con el fin de no saturar nuestro servidor MySQL. Puede que en otros servicios que tengamos activos hayamos visto el mensaje «Too many connections» impidiendo así el acceso a los demás servicios.… Leer artículo completo

  • Bucles y cursores en MySQL con ejemplos

    Hace mucho tiempo que quería escribir sobre esto. Y aunque es recomendable no abusar de los bucles en MySQL, es más, a veces no son necesarios, y siempre hay que buscar una solución que no los use, a veces no la vamos a encontrar y será en esos casos cuando debamos utilizarlos.

    Veamos un bucle muy sencillo, parecido a un for de los de toda la vida, en el que contamos del 1 al 9:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DELIMITER $$
    CREATE PROCEDURE simple_loop ( )
    BEGIN
      DECLARE counter BIGINT DEFAULT 0;
     
      my_loop: LOOP
        SET counter=counter+1;

        IF counter=10 THEN
          LEAVE my_loop;
        END IF;

        SELECT counter;

      END LOOP my_loop;
    END$$
    DELIMITER ;

    cuando hagamos:

    1
    CALL simple_loop();

    Veremos algo como esto:

    +———+
    | counter |
    +———+
    | 1 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 2 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 3 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 4 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 5 |
    +———+
    1 row in set (0.01 sec)+———+
    | counter |
    +———+
    | 6 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 7 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 8 |
    +———+
    1 row in set (0.01 sec)

    +———+
    | counter |
    +———+
    | 9 |
    +———+
    1 row in set (0.01 sec)

    Query OK, 0 rows affected (0.01 sec)

    Vemos que el código que iteraremos está entre LOOP…END LOOP, lo que aparece justo antes (my_loop) es una etiqueta para nombrar ese bucle.… Leer artículo completo

  • MySQL: Listar elementos evitando las repeticiones consecutivas

    Imaginémonos un programa que almacena periódicamente valores en una base de datos, dichos valores pueden ser temperatura, humedad, uso de CPU, voltaje, corriente, intensidad de luz, etc. En definitiva, parámetros que varían con el tiempo, con la característica de que, dos muestras seguidas pueden ser iguales, y no nos interesaría obtenerlas, pero tras una variación sí que nos interesaría volver a ver el mismo valor. Por ejemplo, en una tabla de uno de CPU vemos:

    IdDateCPU Use
    15-jun-2013 10:44:2056%25-jun-2013 10:45:5057%35-jun-2013 10:47:2057%45-jun-2013 10:48:5057%55-jun-2013 10:50:2058%65-jun-2013 10:51:5058%75-jun-2013 10:53:2056%85-jun-2013 10:54:5055%95-jun-2013 10:56:2056%105-jun-2013 10:57:5056%115-jun-2013 10:58:2059%125-jun-2013 11:00:5059%

    Cuando en realidad lo que nos interesaría ver es:

    IdDateCPU Use
    15-jun-2013 10:44:2056%25-jun-2013 10:45:5057%55-jun-2013 10:50:2058%75-jun-2013 10:53:2056%85-jun-2013 10:54:5055%95-jun-2013 10:56:2056%115-jun-2013 10:58:2059%

    Por tanto tenemos dos formas de abordar el tema:

    Evitando introducir valores repetidos

    Para ello, bastaría con introducir un trigger en la base de datos asociado a la introducción de los valores en dicha tabla.… Leer artículo completo

  • Numerar los resultados de un SELECT en MYSQL

    Este ejemplo puede tener muchas utilidades. Por ejemplo, que queramos generar automáticamente campos ID (sin autoincrement), tanto empezando en 1 como empezando en el número que queramos o realizar alguna operación matemática con ese número; en definitiva vamos a introducir un número incremental a cada resultado que nos devuelva.

    Imaginamos que tenemos una tabla `Emails` donde tengo correos electrónicos y nombres de varios amigos. Para crear la estructura, copiar y pegar en MySQL:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DROP SCHEMA IF EXISTS `PoesiaBinaria` ;
    CREATE DATABASE IF NOT EXISTS `PoesiaBinaria` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

    USE `PoesiaBinaria`;

    CREATE TABLE `Emails` (
           `Email` VARCHAR(100) NOT NULL,
           `Nombre` VARCHAR(200) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Pedro', 'pedro@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Javier', 'javier@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Gaspar', 'gaspar@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Maria', 'maria@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Sandra', 'sandra@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andrea', 'andrea@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Clara', 'clara@misamigos.com');
    INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andres', 'andres@misamigos.com');

    Ahora puedo extraer datos de dicha tabla:

    1
    SELECT * FROM `Emails`;

    Que me devuelve:

    +——–+———————-+
    | Email | Nombre |
    +——–+———————-+
    | Pedro | pedro@misamigos.com |
    | Javier | javier@misamigos.com |
    | Gaspar | gaspar@misamigos.com |
    | Maria | maria@misamigos.com |
    | Sandra | sandra@misamigos.com |
    | Andrea | andrea@misamigos.com |
    | Clara | clara@misamigos.com |
    | Andres | andres@misamigos.com |
    +——–+———————-+
    8 rows in set (0.00 sec)

    Ahora bien, para numerar los resultados podemos hacer lo siguiente:

    1
    2
    SET @numero=0;
    SELECT @numero:=@numero+1 AS `posicion`, `Emails`.
    Leer artículo completo
  • Introducir el resultado de una consulta SELECT de mysql en un Array [BASH]

    data

    ¡Bash es una pasada! Es capaz de dejarnos hacer maravillas en poco tiempo y de automatizar lo inautomatizable, en este caso, traigo un ejemplo más, de cómo un código muy corto es capaz de presentarnos los resultados de una consulta SELECT de mysql:

    Los datos de prueba provienen de uno de mis proyectos: Málaga Bloguea donde muestro las últimas novedades de blogs de Málaga.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #!/bin/bash

    OLDIFS=IFS
    MYSQL_USER=#Usuario Mysql
    MYSQL_PASSWORD=#Password Mysql
    MYSQL_HOST="localhost"
    # IFS personalizado, para poder delimitar los campos correctamente
    IFS="`echo -e "\t\n\r\f"`"

    # Declaramos la variable como array, no es estrictamente necesario, pero sí un poco más correcto
    declare -a IPS

    # Generamos la consulta (Si vamos a utilizar un juego de caracteres determinado, como
    # UTF8, debemos especificar primero para evitar sorpresas.
    Leer artículo completo
  • Accediendo a bases de datos MySQL desde C++

    photo-1423592707957-3b212afa6733_r

    Muchos estamos acostumbrados a utilizar bases de datos en PHP pero cuando se trata de un programa de escritorio almacenamos los cambios en archivos sin contemplar esta posibilidad.

    Usar una base de datos puede ser un gran aliado a la hora de hacer aplicaciones que almacenen gran cantidad de información o vayamos a acceder desde varios puntos a dicha información (programas multipuesto, por ejemplo).

    También es de gran utilidad si construimos un software que haga más ligeras ciertas tareas dentro de un servidor web (necesitamos la posibilidad de ejecutar programas sobre el servidor y tal vez de compilarlos allí, pero es una opción bastante buena, en ocasiones un script puede ejecutarse de forma demasiado lenta.… Leer artículo completo

  • Creando un servidor que acepte múltiples clientes simultáneos en C

    5989707041_64de393f6b_oPara hacer una prueba de esto, crearemos un servidor al que nos podremos conectar por telnet y pedir cierta información a través de comandos. El ejemplo soporta los siguientes comandos (en mayúsculas):

    • DATE: Pide la fecha al servidor
    • TIME: Pide la hora al servidor
    • HOLA: Saluda y me dice mi IP
    • EXIT: Cierra el cliente actual
    • CERRAR: Cierra el servidor.
    • Cualquier otra cosa se manda repetida (ECHO)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    /**
    *************************************************************
    * @file servtcp.c
    * @brief Breve descripción
    * Ejemplo de un cliente TCP usando threads
    *
    *
    * @author Gaspar Fernández <blakeyed@totaki.com>
    * @version 0.1Beta
    * @date 13 ene 2011
    * Historial de cambios:
    *   20110113 - Versión inicial
    *
    *
    *************************************************************/


    #include <fcntl.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <resolv.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <string.h>

    /** Puerto  */
    #define PORT       7000

    /** Número máximo de hijos */
    #define MAX_CHILDS 3

    /** Longitud del buffer  */
    #define BUFFERSIZE 512

    int AtiendeCliente(int socket, struct sockaddr_in addr);
    int DemasiadosClientes(int socket, struct sockaddr_in addr);
    void error(int code, char *err);
    void reloj(int loop);

    int main(int argv, char** argc){

        int socket_host;
        struct sockaddr_in client_addr;
        struct sockaddr_in my_addr;
        struct timeval tv;      /* Para el timeout del accept */
        socklen_t size_addr = 0;
        int socket_client;
        fd_set rfds;        /* Conjunto de descriptores a vigilar */
        int childcount=0;
        int exitcode;

        int childpid;
        int pidstatus;

        int activated=1;
        int loop=0;
        socket_host = socket(AF_INET, SOCK_STREAM, 0);
        if(socket_host == -1)
          error(1, "No puedo inicializar el socket");
       
        my_addr.
    Leer artículo completo