David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

martes, 23 de marzo de 2021

SQL Server en Linux... tal cual lo estás leyendo!

Está claro que no hay limites cuando se trata de contenedores. Efectivamente, podemos montar un SQL Server con un contenedor en una máquina con Linux, en este caso sobre Debian 10.

Si vamos a Docker Hub, podemos encontrar esta imagen mantenida oficialmente por Microsoft:

   https://hub.docker.com/_/microsoft-mssql-server

Los requerimientos que debemos cumplir:

   - Docker Engine 1.8 o superior

   - Por lo menos 2 GB de memoria RAM

   - ACCEPT_EULA=Y, confirmamos que aceptamos estas condiciones

   - SA_PASSWORD=<contraseña robusta por lo menos 8 caracteres>

   - MSSQL_PID= ID de producto/Nombre de edición. Predeterminado el valor Developer.

Los valores aceptados para especificar la edición que desplegamos en el contenedor son:

   - Developer : Esto ejecutará el contenedor usando la Edición Developer (es el valor por defecto si no se suministra la variable de entorno MSSQL_PID) 

   - Express : Esto ejecutará el contenedor usando la Edición Express

   - Standard : Esto ejecutará el contenedor usando la Edición Standard

   - Enterprise : Esto ejecutará el contenedor usando la Edición Enterprise

   - EnterpriseCore : Esto ejecutará el contenedor usando la edición Enterprise Core 

Tenemos que tener presente que estamos aceptando el EULA al lanzar estos comandos, así que vaya por delante que tenemos que cumplir las condiciones de licenciamiento con Microsoft. Por ello podemos utilizar SQL Sever 2017 para entornos de desarrollo y SQL Server Express para entornos de producción.

Hay que tener en cuenta que la versión Express tiene varias limitaciones en la memoria máxima utilizada de 1 GB por el motor de base de datos, 1 MB de caché de buffer máximo, uso máximo de 1 socket y 4 cores de CPU y la limitación de 10 GB en el tamaño de base de datos. No tiene limite en el número de usuarios concurrentes.

Para lanzar un contenedor con una instancia de la última versión de SQL Server:

   # docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pa$$w0RD' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest

Para lanzar un contenedor con una instancia de la versión Express:

   # docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pa$$w0RD' -e 'MSSQL_PID=Express' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu 

Una vez lanzada la instancia, solo tenemos que abrir dbeaver, seleccionar una nueva conexión a SQL Server y rellenar los datos:

   - Servidor: localhost

   - Puerto: 1433

   - Database/Schema: Master 

   - Autenticación: SQL Server Authentication

   - Usuario: sa

   - Contraseña: Pa$$w0RD

Quizás haya que esperar un poco a que establezca la conexión y ya podemos trastear con SQL Server, crear una base de datos, tablas, etcétera. 

DOCKER-COMPOSE

Para la versión SQL Express el archivo docker-compose.yml tendría:

   version: '3.3' 

   services: 

      run: 

         environment: 

            - ACCEPT_EULA=Y 

            - SA_PASSWORD=Pa$$w0RD 

            - MSSQL_PID=Express 

         ports: 

            - '1433:1433' 

         image: run

SaluDOS

domingo, 21 de febrero de 2021

Sentencias útiles en MySQL

Vamos a ver varios ejemplos útiles para trabajar con MySQL, son cosas sencillas y muy básicas pero creo que interesantes y del día a día.

Empezaremos conectándonos al servidor de base de datos con usuario root:

   # mysql -u root -p 

CREAR USUARIOS, PRIVILEGIOS Y BASES DE DATOS

Para no utilizar el usuario root en labores de administración, lo ideal es crear un usuario diferente como por ejemplo adminUSER:

   > GRANT ALL PRIVILEGES ON *.* TO 'adminUSER'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

Generar una base de datos es tan sencillo como lanzar la siguiente sentencia SQL especificando el nombre de la base de datos:

    CREATE DATABASE testDB;

Si vamos a crear un usuario específico para que sea administrador solo de esa base de datos podemos crear el usuario adminTEST:

   > GRANT ALL PRIVILEGES ON testDB.* TO 'adminTEST'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

La próxima vez que nos conectemos al servidor de base de datos podremos iniciar sesión con este usuario, así solo tendremos privilegios sobre la nueva base de datos:

   # mysql -u adminTEST -p 

Muchas veces necesitamos un usuario que tenga privilegios de solo lectura sobre una base de datos, por ejemplo un usuario de servicio con el que vamos a monitorizar. Empecemos viendo como crear un usuario que tendrá acceso desde el mismo servidor de base de datos solo a la base de datos especificada:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

Si lo que deseamos es que se conecte desde cualquier equipo remoto:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'%' IDENTIFIED BY 'Pa$$w0rd';

O podemos ser mas restrictivos especificando el nombre DNS o la dirección IP desde la que se conectará el usuario con acceso de lectura:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'NombreServidorRemoto' IDENTIFIED BY 'Pa$$w0rd';

Siempre que cambiemos los privilegios de un usuario o lo creemos, hay que ejecutar:

   > FLUSH PRIVILEGES;

CREAR TABLAS

Cuando estamos conectados a un servidor con varias bases de datos, primero tendremos que ejecutar la sentencia para utilizar una base de datos concreta:

   > USE testDB;

Una forma rápida de generar tablas en MySQL es a través de un pequeño script, aunque siempre podemos utilizar un editor gráfico como podría ser DBeaver. Debemos especificar el nombre de la tabla, los campos que la componen y sus características. Veamos algunos ejemplos:

Creación de una tabla de usuarios: Crearemos UserID, un campo que será clave principal, autoincremental y no podrá ser null. Además crearemos una serie de campos de texto de tamaño variable para especificar los datos del usuario, alias, nombre, etcétera. Por último un campo de tipo booleano para establecer si el usuario está activo o no.

   > CREATE TABLE DBUsers (
         UserID int NOT NULL AUTO_INCREMENT,
         Alias varchar (50) NOT NULL,
         FirstName varchar(100),
         LastName varchar(100),
         Email varchar(150),
         Enabled boolean DEFAULT 1,
         PRIMARY KEY (UserID)
         );

Creación de una tabla de grupos de usuarios o roles: Crearemos GroupID, un campo que será clave principal, autoincremental y no podrá ser null. Además estableceremos el campo con el nombre del grupo y un campo booleano para establecer si el usuario está activo o no.


   > CREATE TABLE DBGroupsList (
         GroupID int NOT NULL AUTO_INCREMENT,
         GroupName varchar (50) NOT NULL,
         Enabled boolean DEFAULT 1,
         PRIMARY KEY (GroupID)
         );

Creación de una tabla en la que asignaremos usuarios a grupos especificando los identificadores de usuario y grupo. Además añadimos un campo que establezca si esa asignación está activa o no. Además estos campos tienen que estar conectados a las tablas que definen la lista de usuarios y la lista de grupos, para eso son las claves foráneas.


    > CREATE TABLE DBGroupsAssign (
         UserID int NOT NULL
         GroupID int NOT NULL,
         Enabled boolean DEFAULT 1,
         FOREIGN KEY (UserID) REFERENCES DBUsers(UserID),
         FOREIGN KEY (GroupID) REFERENCES DBGroupsList(GroupID)
         );

MODIFICAR TABLAS

Una labor muy común es modificar una tabla, vamos a ver el caso mas frecuente, por ejemplo que tenemos que añadir un campo.

En este ejemplo vamos a añadir la fecha de alta en la tabla de usuarios. Además como lo queremos en un sitio concreto, podemos especificar FIRST para ser el primer campo de la tabla o AFTER para especificar el campo detrás del que queremos insertar el nuevo.

   > ALTER TABLE DBUsers ADD StartDate DATETIME AFTER Alias;

Otro caso muy frecuente es modificar alguna característica de un campo ya existente. Por ejemplo vamos a modificar la longitud de un campo, imaginemos que el Email se nos ha quedado corto en la tabla de usuarios. Además vamos a hacer que sea un campo obligatorio, que no pueda estar vacio.

   > ALTER TABLE DBUsers MODIFY Email varchar(255) NOT NULL;

SaluDOS

Montar un docker mysql y conectarse desde dbeaver

VERSIÓN

Antes de montar el docker de mysql, es mejor revisar este enlace y decidir la versión que queremos utilizar:

https://hub.docker.com/_/mysql

Actualmente los dockers soportados son las siguientes versiones de mysql:

   8.0.23   8.0.8   latest

   5.7.33   5.7   5

   5.6.51   5.6

Además vamos a tener la precaución de que los datos sean persistentes. Una vez que se elimine el docker, podremos volver a levantarlo y tendremos nuestras bases de datos intactas.

CREACIÓN DEL DOCKER

Veamos que parámetros vamos a utilizar para levantar el docker, algunos los especificaremos pero son opcionales.

   -d --> Modo en segundo plano (detached)

   --rm --> Cuando paremos el contenedor automáticamente se eliminará

   --name mysql --> Nombre del docker

   -e --> Sirve para pasar al docker una variable de entorno, en este contenedor le vamos a especificar la contraseña del usuario root. seguido de este parámetro especificamos la variable y su valor:

   MYSQL_ROOT_PASSWORD=Pa$$w0rD

   -p 3306:3306 --> Puerto 3306 en el equipo y el correspondiente en el docker

   -v mysql_data:/var/mysql --> Ruta local del equipo y la correspondiente en el docker, esto hará que los datos se guarden en el equipo local y sean persistentes siempre  que especifiquemos la misma configuración del volumen.

   mysql:latest --> última versión del docker de mysql en el repositorio oficial Docker Hub. Si quisieramos una versión concreta, podriamos especificarla:

      mysql:5.7.33

El comando completo sería:

   # docker run -d --rm --name mysql -e MYSQL_ROOT_PASSWORD=Pa$$w0rD -p 3306:3306 -v mysql_data:/var/mysql mysql

Comprobamos que el docker está funcionando:

   # docker ps -a

DOCKER-COMPOSE 

El fichero docker-compose.yml tendría el siguiente contenido:

   version: '3.3' 

   services: 

      mysql: 

         container_name: mysql 

         environment: 

            - MYSQL_ROOT_PASSWORD=Pa$$w0rD 

         ports: 

            - '3306:3306' 

         volumes: 

            - 'mysql_data:/var/mysql' 

         image: mysql

CONEXIÓN DESDE DBEAVER

Para conectarnos a la base de datos que tenemos en un contenedor en nuestro propio equipo, creamos una nueva conexión, seleccionamos mysql y especificamos los datos básicos:

   - Server Host: localhost

   - Port: 3306

   - Nombre de usuario: root

   - Contraseña: Pa$$w0rD

Al finalizar podremos realizar la conexión. Es posible que aparezca algún error en la conexión debido a un parámetro mal configurado. Tanto al crear la conexión como al editarla, en la pestaña Driver Properties podremos reconfigurar una infinidad de parámetros y su valor en la conexión.

Si la conexión no la realizamos desde el mismo equipo que tiene el docker, hay que tener en cuenta que para conexiones remotas tendremos que abrir correctamente los puertos en el firewall del equipo que contiene el contenedor de mysql.

SaluDOS

jueves, 4 de febrero de 2021

DBeaver, el castor que te conecta a cualquier base de datos desde cualquier sistema operativo

Hay muchos programas para poder conectarnos y administrar bases de datos. Algunos son específicos y otros genéricos con compatibilidad con las principales bases de datos como mySQL, Ms SQL, PostgreSQL, Oracle, etc...

DBeaver es un proyecto libre y de código abierto.

DBeaver tiene dos versiones, la community que es la que instalaremos y una enterprise 'tope de gama' que cuesta unos 20$/mes o 200$/año aproximadamente. Se puede consultar en la web de la versión enterprise:

   https://dbeaver.com/

Es multiplataforma, por lo que algo muy atractivo es que se puede instalar en Linux, Windows y MacOS. Podemos encontrar el software y mucha mas información sobre como instalarlo o la documentación asociada en la web oficial del proyecto Community:

   https://dbeaver.io/download/

Tal y como nos indican en su web, para realizar la instalación en una distribución linux tenemos varias opciones para instalarlo, descargando el paquete de la web, paquete snap, flatpak o clonar el repositorio de github. El repositorio en github lo encontramos en: 

   https://github.com/dbeaver/dbeaver/releases

Veamos por ejemplo la instalación del paquete. Aunque podemos hacer la descarga desde la web, veamos como sería desde la consola tal y como lo indica la documentación oficial:

   # wget -O - https://dbeaver.io/debs/dbeaver.gpg.key | sudo apt-key add - 

   # echo "deb https://dbeaver.io/debs/dbeaver-ce /" | sudo tee /etc/apt/sources.list.d/dbeaver.list 

   # apt-get update && sudo apt-get install dbeaver-ce

Tras descargarlo de la web oficial, solo tenemos que posicionarnos en el directorio de descarga y ejecutar el comando correspondiente.

   Para distribuciones derivadas de Debian:

   # dpkg -i dbeaver_ce-x.x.x_amd64.deb

   Para distribuciones derivadas de Red Hat el equivalente es:

   #  rpm -ivh dbeaver_ce-x.x.x_amd64.rpm

La verdad es que se instala casi de forma instantánea y es un programa muy ligero. No te defrauda ni su logo oficial.

SaluDOS