Article updated on

Ejemplos rápidos de MySQL

Aquí esta una lista de los comandos de MySQL que más utilizo.

Logarse a la consola MySQL

mysql -u root -pmypassword

 

Enviar comando SQL sin logarse

mysql -u root -pmypassword mydb -e "select now()"

 

Base de datos Create/ Drop

mysqladmin -u root -pmypassword drop mydb
mysqladmin -u root -pmypassword create mydb

 

Exportar/Importar la base de datos

mysqldump -u root -pmypassword --quick mydb | gzip > myzipfile.gz
gunzip < myzipfile.gz | mysql -u root -pmypassword mydb

usar si da error de Lock:

mysqldump --single-transaction -u user -p DBNAME > backup.sql
mysql -u root -p DBNAME < backup.sql
 

Dar permisos a la base de datos

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

 

Crear tablas enlazadas con un Foreign Key con clave numerica y autoincremento

CREATE TABLE CATEGORIES(
    id INT NOT NULL AUTO_INCREMENT,
    category VARCHAR(100) NOT NULL,
        PRIMARY KEY (id)
    );
    
CREATE TABLE ARTICLE(
    id INT NOT NULL AUTO_INCREMENT,
    lang VARCHAR(2) NOT NULL,
    url VARCHAR(100) NOT NULL,
    meta_keywords VARCHAR(100) NOT NULL,
    title VARCHAR(120) NOT NULL,
    meta_description VARCHAR(100) NOT NULL,
    intro VARCHAR(500) NOT NULL,
    status VARCHAR(1) NOT NULL,
    last_update date NOT NULL,
    id_categories INT NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY (id_categories) REFERENCES CATEGORIES(id)
    );

 

Comprueba si la base de datos está escuchando

  • Linux cambia el puerto por el tuyo si lo necesitas: sudo netstat -anltp|grep :3306 or sudo nmap -p 3306 localhost
  • Windows el puerto de tu base de datos debería estar entre las listadas con este comando: netstat -an

img/0/27/_002.jpeg

* El puerto debería estar escuchando, si no lo está puede que haya un firewall o que la instalación de la base de datos este mal.

Test Code Snippet

import java.sql.*;
public class Connect {
    private static final long PAUSE_MILLIS = 70000;
    public static void main(String[] args) {
        Connection conn = null;
        try {
            String userName = "root";
            String password = "mypassword";//cambia por el tuyo
            String url = "jdbc:mysql://localhost:3306";//cambia por el tuyo
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            PreparedStatement ps1;
            System.out.println("Database connection established");            
            while(true){            
                try {
                    conn.setAutoCommit(true);
                    ps1 = conn
                            .prepareStatement("SELECT CURRENT_TIMESTAMP() as Date");
                    ResultSet rs = ps1.executeQuery();
                    while (rs.next()) {
                        System.out.println(rs.getString("Date"));
                    }
                    rs.close();
                    ps1.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                System.out.println("Espera al siguiente ciclo...");
                Thread.sleep(PAUSE_MILLIS);                
            }            
        } catch (Exception e) {
            System.err.println("No puedo conectar");
            System.err.println(e.getMessage());
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("Se termina la conexión");
                } catch (Exception e) {
                }
            }
        }
    }
}

 

* Cambia el PUERTO, PASSWORD, PAUSE_MILLIS según lo vayas necesitando para encontrar la causa de la excepción.

 

Telnet a MySQL

Usar el telnet puede ser muy útil para averiguar si puedes llegar a la base de datos ej. en consola escribe telnet youdatabaseip port. o  telnet youdatabaseip:port Si estás usando windows y si el telnet no está instalado busca. search install telnet

Si ves este mensaje es que estás llegando correctamente. Pulsa Intro 2 veces para salir.

img/0/27/_001.jpeg

Prueba diferentes combinaciones como por ejemplo:

  • telnet localhost 3306
  • telnet 127.0.0.1 3306
  • telnet 192.168.1.10 3306
  • telnet 82.16.23.22 3306

* Prueba diferentes combinaciones, si alguna falla puede darte una pista de que el problema este relacionado con la conectividad en la red.

MySql Archivos de configuración

  • Linux MySQL ej: /etc/my.cnf
  • Windows ej: MySQL: C:\Program Files\mysql\bin\my.ini
  • Comenta o cambia "bind-address" y cambia la IP a: bind-address="127.0.0.1" o bind-address="0.0.0.0"
  • Comenta "skip-networking"

* Si el problema es ocasional quizá debas establecer las siguientes propiedades.

  • wait_timeout = number
  • interactive_timeout = number
  • connect_timeout = number

 

 MySQL TimeOut 

  • Entra en consola MySQL ej. mysql -u root -pmypassword
  • Desde la consola muestra todas las variables relacionadas con el tiempo show global variables like '%time%' 

img/0/27/_003.jpeg

* El wait_timeout esta en segundos y cerrará todas las conexiones abiertas. Puedes actualizar tus archivos de configuración #configfiles or  restablecerlo desde consola ej. durante 10 minutos set global wait_timeout=600;

 

Mostrar conexiones activas

  • En la Consla MySQL show full processlist; o show full processlist\G; o SELECT host,count(host) FROM information_schema.processlist GROUP BY host;

img/0/27/_005.jpeg

* Muestra la cantidad de conexiones activas en la base de datos.

  • Info muestra el comando de MySQL en ejecución, NULL indica que esta abierta la conexión pero que no hay ningun comando ejecutándose.
  • Usa el comando kill id_process para borrar procesos.

 

Ejemplos de POOL con Tomcat

Pool con query de validación, máximo 2 conexiones en IDLE (latentes)

        <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/blog"
        username="root" password="mypasswd" maxActive="10" maxIdle="2" validationQuery="SELECT 1"/>

 

Pool que no tiene conexiónes en IDLE y que las cierra trás 45 segundos de duración.

        <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/blog"
        username="root" password="mypasswd" maxActive="10" maxIdle="2" maxWait="45" 
        maxAge="45" removeAbandoned="true" removeAbandonedTimeout="45"/>

 

JSP Para pruebas. (No se debería usar como ejemplo puesto que una JSP no es el lugar para acceder a base de datos)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>    
<%
Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/mysql");
if(ds!=null){    
    Connection con = ds.getConnection();
    con.setAutoCommit(true);
    PreparedStatement ps1 = con
            .prepareStatement("SELECT CURRENT_TIMESTAMP() as Date");
    ResultSet rs = ps1.executeQuery();
    while (rs.next()) {
        out.println("Date From DataBase " +rs.getString("Date"));
    }
    rs.close();
    ps1.close();
    con.close();
}
%>