Oracle_One-Alura_Latam/011_mysql/dba_seguridad_optimiz.md

412 lines
14 KiB
Markdown

# 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
```sh
mariadb -u <USER> -h <HOST> [<DBNAME>] -P <PORT> -p
```
### MySQL
```sh
mysql -u <USER> -h <HOST> [<DBNAME>] -P <PORT> -p
```
## Detener servicio
### SystemD
```sh
systemctl stop mariadb
```
```sh
systemctl stop mysql
```
## Servicio de Windows
```sh
# 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](https://en.wikipedia.org/wiki/Standard_RAID_levels)
Nested RAID [wiki](https://en.wikipedia.org/wiki/Nested_RAID_levels)
RAID [ArchWiki](https://wiki.archlinux.org/title/RAID)
<details><summary markdown="span">RAID</summary>
#### RAID 0
[<img src="./imgs/RAID_0.svg" width="250"/>](./imgs/RAID_0.svg)
#### RAID 1
[<img src="./imgs/RAID_1.svg" width="250"/>](./imgs/RAID_1.svg)
#### RAID 2
[<img src="./imgs/RAID_2.svg" width="800"/>](./imgs/RAID_2.svg)
#### RAID 3
[<img src="./imgs/RAID_3.svg" width="550"/>](./imgs/RAID_3.svg)
<details><summary markdown="span">Nested RAID</summary>
#### RAID 01 (RAID 0+1)
[<img src="./imgs/RAID_01.svg" width="550"/>](./imgs/RAID_01.svg)
#### RAID 03 (RAID 0+3)
[<img src="./imgs/RAID_0+3.svg" width="550"/>](./imgs/RAID_0+3.svg)
#### RAID 10 (RAID 1+0)
[<img src="./imgs/RAID_1+0.svg" width="550"/>](./imgs/RAID_1+0.svg)
#### RAID 50 (RAID 5+0)
[<img src="./imgs/RAID_50.png" width="550"/>](./imgs/RAID_50.png)
#### RAID 60 (RAID 6+0)
[<img src="./imgs/RAID_60.png" width="550"/>](./imgs/RAID_60.png)
#### RAID 100 (RAID 10+0)
[<img src="./imgs/RAID_100.svg" width="550"/>](./imgs/RAID_100.svg)
</details>
</details>
## 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](https://dev.mysql.com/doc/refman/8.2/en/server-system-variables.html)
[MariaDB doc](https://mariadb.com/kb/en/server-system-variables/)
```sql
SHOW GLOBAL STATUS LIKE '%tmp%tables%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 338 |
| Created_tmp_tables | 18175 |
+-------------------------+-------+
```
```sql
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
```sh
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
```
```txt
#
# * 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
```sql
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
```sql
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
```sql
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`
```sh
#
# * 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](https://dev.mysql.com/doc/refman/en/mysqldump.html)
```sh
- 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`](./proyecto_scripts/mariadb-dump--help.txt)
```sh
mysqldump -u <user> -p<password> --databases <db_name> > out.sql
```
### LOCK
MariaDB
```sql
-- To lock a table:
BACKUP LOCK table_name
-- To unlock a table:
BACKUP UNLOCK
```
MySQL
```sql
LOCK instance for backup;
UNLOCK INSTANCE;
```