Oracle_One-Alura_Latam/011_mysql/dba_seguridad_optimiz.md

14 KiB

DBA

Seguridad y Optimización de la BD

DBA

¿Quien es un DBA?

Es el profesional responsable de administrar la base de datos

Funciones

  • Evalúa el ambiente, es decir, el Hardware, realiza instalación y mantenmiento de MySQL según las necesidades operativas de la empresa
  • Configura que los accesos se realizen de forma segura. Conexiones/IDE y otras interfaces
  • Mantiene un buen desempeño de la BD. Trabaja con los indices para mejorar las consultas a la base de datos
  • Almacenamiento/Respaldo de datos. Realiza los backups
  • Apoya al área de desarrollo con el mantenimiento de los datos. Elimina datos no desados, desfragmentar la DB, entre otros
  • Monitorea la instalación de MySQL. Gestiona los recursos usados por la BD y la adecua a las necesidades de la los usuarios.
  • Configura el ambiente y sus diversas propiedades (MySQL my.ini)
  • Administra los usuarios que tendrán acceso a la DB. Otorga niveles de acceso

Conexiones

MariaDB

mariadb -u <USER> -h <HOST> [<DBNAME>] -P <PORT> -p

MySQL

mysql -u <USER> -h <HOST> [<DBNAME>] -P <PORT> -p

Detener servicio

SystemD

systemctl stop mariadb
systemctl stop mysql

Servicio de Windows

# C:\Windows\system32
> net stop mysql80

Tuning

La puesta a punto de MySQL se puede realizar de 4 maneras

1. Esquemas, índices, variables interdas de MySQL (mysqld), Hardware y S.O.

  • HARDWARE
    • Utilizar sistemas operativos de 64-bits. Mysql puede usar procesamiento en paralelo y consumir toda la memoria
    • Configuración de RAM. Parametro que permite indicar el máximo de memoria disponible para los procesos. No se recomienda exceder el 50%
    • Dependiendo de la forma con la que se trabaje la base de datos va a variar su consumo de memoria
    • El tipo del disco: HDD, SSD, NVME
    • Conexión SATA, SAS, M2, PCIe.
    • Uso del controlador de disco RAID (0, 1, 5 y 10) para la seguridad de los datos
      • RAID 0: Divide los datos en dos HD diferentes, y actuan como un solo disco a nivel de S.O
      • RAID 1: Uno de los HD es copia del otro, y lo que realize en uno se replica automáticamente en el otro
      • RAID 5: Divide los datos en más de dos HD diferentes, y actuan como un solo disco a nivel de S.O
      • RAID 10: Los discos tiene espejos, y lo que realize en uno se replica automáticamente en el otro
      • RAID 1 y 10: Utilizan mas espacio producto de la redundancia, pero son mas seguros por tener backup disponible

RAID wiki
Nested RAID wiki
RAID ArchWiki

RAID

RAID 0

RAID 1

RAID 2

RAID 3

Nested RAID

RAID 01 (RAID 0+1)

RAID 03 (RAID 0+3)

RAID 10 (RAID 1+0)

RAID 50 (RAID 5+0)

RAID 60 (RAID 6+0)

RAID 100 (RAID 10+0)

Variables de ambiente MySQL

Estas variables establecen parametros de funcionamento predefindos. Existen mas de 250 variables. Estas pueden cambiar según la versión de MySQL

SHOW STATUS muestra los valores actuales de las variables de ambiente

2 Tipos de variables de ambiente GLOBAL y SESSION

my.ini o my.cnf: Directivas para daemon(servicio) y client

MySQL doc
MariaDB doc

SHOW GLOBAL STATUS LIKE '%tmp%tables%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 338   |
| Created_tmp_tables      | 18175 |
+-------------------------+-------+
SHOW GLOBAL VARIABLES LIKE '%table_size%';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| max_heap_table_size   | 16777216             |
| tmp_disk_table_size   | 18446744073709551615 |
| tmp_memory_table_size | 16777216             |
| tmp_table_size        | 16777216             |
+-----------------------+----------------------+

SET GLOBAL tmp_table_size = 33554432;

SHOW GLOBAL VARIABLES LIKE 'tmp_table_size';
+----------------+----------+
| Variable_name  | Value    |
+----------------+----------+
| tmp_table_size | 33554432 |
+----------------+----------+

Esta modificación es efímera, se pierde al reiniciar el servicio o maquina

Para establecer el valor de forma permanente editar archivos de configuración

Debian

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
#
# * Fine Tuning
#

tmp_table_size          = 33554432

Windows

C:\ProgramData\MySQL Server 8.0\my.ini

Mecanismos de Almacenamiento

Es la forma de almacenar la información en las tablas

MySQL 8.0 Community dispone 9 mecanismos para almacenar datos

Una misma DB puede usar diversos mecanismos en sus tablas

ENGINE

Es el parametro que indica el mecanismo de almacenamiento

MyISAM

  • No es transaccional. No esta diseñado para que varios usuarios realicen operaciones en las tablas simultaneamente
  • Solo permite el bloqueo a nivel de tabla (Lectura mas rápida)
  • Recomendada para tablas que no estan en continio cambio
  • La clave externa no soporta Full Text
  • Almacena datos de manera mas compacta (Optimiza espacios de almacenamiento)
  • Implementa índices HASH y BTREE
  • key_buffer_size: Determina el tamaño de cache para almacenar los indices MyISAM. Varía de 8MB a ~4GB según el S.O.
  • concurrent_insert: Comportamiento de inserciones concurrentes dentro de tabla MyISAM
    • 0: Inserciones simultaneas desactivdas
    • 1: Inserciones simultaneas sin intervalo de datos (Al mismo tiempo)
    • 0: Inserciones simultaneas con intervalo de datos
  • delay_key_write: Atraso entre la actualización de índices y el momento en que se crea la tabla (Espera a que todos los registros sean insertados para despues actualizar los indices. Mas consistencia. Menos rapidez)
  • max_write_lock_count: Dertermina el número de grabaciones en las tablas que tendrán precedencia a las lecturas (Prioriza la cantidad de grabaciones que se realizaran antes de las lecturas en varias conexiones)
  • preload_buffer_size: Tamaño del buffer a ser usando antes de cargar los índices de claves de las tablas. 32KB
  • El uso de estas variables de ambiente se realiza en la medida de lo necesario. Lo recomendable es usar esos valores por defecto
  • myisamchk: Analiza, optimiza y repara tablas MyISAM (las reconstruye)
  • myisampack: Crea tablas compactadas solo para lectura
  • myisam_ftpdump: Muestra información completa de los campos tipo texto

InnoDB

  • Mecanismo de almacenamiento transaccional más utilizado en MySQL
  • Esta diseñado para que varios usuarios realicen operaciones simultaneas sobre las tablas
  • Soporte transaccional completo. Soporte a claves externas
  • Cache de buffer configurado de forma separada tanto para la base como para el índice
  • Bloqueo de tabla a nivel de línea
  • Indexacion BTREE
  • Back-up de la DB online. Sin bloqueo
  • Tablas
    • innodb_data_file_path: Determina la ruta y tamaño máximo del archivo dentro del sistema donde se almacena la información
    • ìnnodb_data_home_dir: Ruta común de todos los archivos innodb. Cuando se especifica, guarda todo dentro de ese directorio (default mysqldata)
    • innodb_file_per_table: Separa el almacenamiento de datos e indices. Por defecto almacena datos e índices de forma compartida
  • Desempeño
    • innodb_buffer_poll_size: Tamaño de almacenamiento usado para indices y datos en cache
    • innodb_flush_log_at_trx_commit: Frecuencia de escritura del log-in en el disco
    • innodb_log_file_size: Tamaño en Bytes de archivos log-in (default 5MB)

MEMORY

  • Mecanismo de almacenamiento que crea las tablas en la memoria RAM, no en disco
  • No soporta clave externa
  • Acceso muy rápido a la información
  • Los datos necesitan ser reinicializados junto con el servidor
  • Bloqueo a nivel de tabla
  • Indice utiliza HASH por defecto y BTREE
  • Formato de linea de longitud fija. No soporta BLOB/TEXT

Usando ENGINE

CREATE TABLE df_table (id INT, nombre VARCHAR(100));

ALTER TABLE df_table ENGINE = MyISAM;

/* MariaDB */
SHOW ENGINES;
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                                         | Transactions | XA   | Savepoints |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | Stores tables as CSV files                                                                      | NO           | NO   | NO         |
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                                           | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                                       | NO           | NO   | NO         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage. Used for internal temporary tables and privilege tables | NO           | NO   | NO         |
| MyISAM             | YES     | Non-transactional engine with good performance and small data footprint                         | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                                  | YES          | NO   | YES        |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables                | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                                              | NO           | NO   | NO         |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+

Creando una base de datos

CREATE DATABASE base DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- o también
CREATE DATABASE base DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Directorio de las BBDD

VARIABLES WHERE Variable_Name LIKE '%dir';
    +---------------------------+----------------------------+
    | Variable_name             | Value                      |
    +---------------------------+----------------------------+
    | aria_sync_log_dir         | NEWFILE                    |
    | basedir                   | /usr                       |
    | character_sets_dir        | /usr/share/mysql/charsets/ |
==>>| datadir ------------------| /var/lib/mysql/ -----------|<<==
    | innodb_data_home_dir      |                            |
    | innodb_log_group_home_dir | ./                         |
    | innodb_tmpdir             |                            |
    | lc_messages_dir           |                            |
    | plugin_dir                | /usr/lib/mysql/plugin/     |
    | slave_load_tmpdir         | /tmp                       |
    | tmpdir                    | /tmp                       |
    | wsrep_data_home_dir       | /var/lib/mysql/            |
    +---------------------------+----------------------------+

sudoedit /etc/mysql/mariadb.conf.d/50-server.cnf

#
# * Basic Settings
#

...
datadir                 = /var/lib/mysql

Backup

Back-up lógico

Exporta todas las estructuras, tablas, rutinas, etc. a un script sql. Este permite recrear la base de datos. Es lento ya que se ejecuta comando a comando

Back-up físico

Contiene todos los archivos binarios del sistema donde esta almacenada la información. Es más rápido pero no permite edicion antes de su restauración

mysqldump

Más information

  - Create a backup (user will be prompted for a password):
    mysqldump --user user --password database_name --result-file=path/to/file.sql

  - Backup a specific table redirecting the output to a file (password prompted):
    mysqldump --user user --password database_name table_name > path/to/file.sql

  - Backup all databases redirecting the output to a file (password prompted):
    mysqldump --user user --password --all-databases > path/to/file.sql

  - Backup all databases from a remote host,
    redirecting the output to a file (password prompted):
    mysqldump --host=ip_or_hostname --user user --password --all-databases > path/to/file.sql

  --routines --events

MariaDB usa mariadb-dump mariadb-dump --help

mysqldump -u <user> -p<password> --databases <db_name> > out.sql

LOCK

MariaDB

-- To lock a table:
BACKUP LOCK table_name

-- To unlock a table:
BACKUP UNLOCK

MySQL

LOCK instance for backup;

UNLOCK INSTANCE;