terça-feira, 15 de abril de 2025

LABORATÓRIO EM CASA

https://anothermysqldba.blogspot.com/2025/04/homelab.html  

Só por diversão...

Existem inúmeras opções para testar instâncias de bancos de dados MySQL e gerais.

Este é apenas um exemplo de como você pode usar  o Proxmox  para ter uma configuração rápida e simples para testes e acesso repetíveis.

Este exemplo é uma opção boa e barata para ter um laboratório em casa para MySQL e qualquer outra coisa que você queira.

A virtualização de homelab que escolhi foi  Proxmox  e  Openmediavaul  para armazenamento NFS estendido (não estou 100% convencido do  Openmediavault , o Debian sozinho poderia fazer isso)

Hardware Escolhi uma configuração simples e compacta:

Essa virtualização também permite que você tenha um ambiente que pode ser executado conforme necessário, desligado ou até mesmo desligado e retornado quando quiser. 

Permite também clonar cada instância para instâncias adicionais e testes, se desejado, após a configuração. 

Esta será uma configuração direta muito simples em todos eles.

Você pode criar dispositivos de bloco para cada diretório de dados ou NFS se preferir, mas tudo isso será instalação direta local para demonstração.

Objetivo de testar e demonstrar:

  • Instalar
  • Monitoramento
  • Rotação de senha do cofre

Debian BASE 

Configurei uma instância do Debian 12 com 4 GB e 4 CPUs.
Em seguida, converti isso como um modelo para poder vincular todas as outras instâncias a partir dele.
Isso torna a configuração de outras instâncias muito mais rápida, além de ter a mesma base para começar.


┌──(root㉿debian12-server)-[~]
└─# uname -a
Linux debian12-server 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (06/03/2025) x86_64 GNU/Linux

apt install unzip
cd /usr/local/src/
wget https://releases.hashicorp.com/vault/1.4.2/vault_1.4.2_linux_amd64.zip
descompacte o vault_1.4.2_linux_amd64.zip
mv cofre /usr/bin/
setcap cap_ipc_lock=+ep /usr/bin/vault
# cofre -v
Cofre v1.4.2

MariaDB 11 Rolling 

vi /etc/rede/interfaces
auto ens18
iface ens18 inet estático
    endereço 192.168.3.100
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

# nome do host
mariadb1.sqlhjalp.com

sudo apt-get install apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
vi /etc/apt/sources.list.d/mariadb.sources

┌──(raiz㉿mariadb1)-[~]
└─# cat /etc/apt/sources.list.d/mariadb.sources
# MariaDB 11 Lista de repositórios contínuos - criada em 2025-04-01 15:13 UTC
# https://mariadb.org/download/
X-Repolib-Nome: MariaDB
Tipos: deb
# deb.mariadb.org é um espelho dinâmico caso o seu espelho preferido fique offline. Consulte https://mariadb.org/mirrorbits/ para obter detalhes.
# URIs: https://deb.mariadb.org/11/debian
URIs: https://mirror.its.dal.ca/mariadb/repo/11.rolling/debian
Suítes: leitor ávido
Componentes: principal
Assinado por: /etc/apt/keyrings/mariadb-keyring.pgp

┌──(raiz㉿mariadb1)-[~]
└─# apt-get update

┌──(raiz㉿mariadb1)-[~]
└─# apt-get install mariadb-server -y

┌──(raiz㉿mariadb1)-[~]
└─# mariadb
Bem-vindo ao monitor MariaDB. Os comandos terminam com ; ou \g.
Seu ID de conexão MariaDB é 32
Versão do servidor: 11.7.2-MariaDB-deb12 distribuição binária mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab e outros.

Digite 'help;' ou '\h' para obter ajuda. Digite '\c' para limpar a instrução de entrada atual.

MariaDB [(nenhum)]>
MariaDB [(nenhum)]> saída
Tchau

┌──(raiz㉿mariadb1)-[~]
└─# systemctl stop mariadb.service

Só para esclarecer. Sim, com um servidor vinculado ao Proxmox, você pode reiniciar e ele mantém todos os seus valores e configurações.

┌──(raiz㉿mariadb1)-[~]
└─# tempo de atividade
 10:27:29, 1 min, 2 usuários, carga média: 0,15, 0,11, 0,04

┌──(raiz㉿mariadb1)-[~]
└─# mariadb
Bem-vindo ao monitor MariaDB. Os comandos terminam com ; ou \g.
Seu ID de conexão MariaDB é 33
Versão do servidor: 11.7.2-MariaDB-deb12 distribuição binária mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab e outros.

Digite 'help;' ou '\h' para obter ajuda. Digite '\c' para limpar a instrução de entrada atual.

MariaDB [(nenhum)]> status
--------------
mariadb de 11.7.2-MariaDB, cliente 15.2 para debian-linux-gnu (x86_64) usando wrapper EditLine

ID de conexão: 33
Banco de dados atual:
Usuário atual: root@localhost
SSL: A cifra em uso é TLS_AES_256_GCM_SHA384, o certificado está OK
Pager atual: stdout
Usando outfile: ''
Usando delimitador: ;
Servidor: MariaDB
Versão do servidor: 11.7.2-MariaDB-deb12 distribuição binária mariadb.org
Versão do protocolo: 10
Conexão: Localhost via soquete UNIX
Conjunto de caracteres do servidor: utf8mb4
Conjunto de caracteres do banco de dados: utf8mb4
Conjunto de caracteres do cliente: utf8mb3
Conjunto de caracteres de conexão: utf8mb3
Soquete UNIX: /run/mysqld/mysqld.sock
Tempo de atividade: 1 min 45 s

Tópicos: 1 Perguntas: 61 Consultas lentas: 0 Aberturas: 33 Tabelas abertas: 26 Consultas por segundo em média: 0,580
--------------

Inovação MySQL 

vi /etc/rede/interfaces
auto ens18
iface ens18 inet estático
    endereço 192.168.3.101
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4


# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│ Qual versão do servidor você deseja receber? │
  mysql-8.0  
  mysql-innovation <-- Escolhi isso
  mysql-8.4-lts    
  mysql-cluster-8.0   
  inovação em cluster mysql    
  mysql-cluster-8.4-lts    
  Nenhum

 Qual produto MySQL você deseja configurar?                                                                                                                           
 Servidor e cluster MySQL (atualmente selecionado: mysql-innovation)
 Conectores MySQL (Atualmente selecionado: Habilitado)
 OK

# apt-get atualização
# apt-get install mysql-server -y

─# mysql -u root -p
Digite a senha:
Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou \g.
Seu ID de conexão MySQL é 9
Versão do servidor: 9.2.0 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle e/ou suas afiliadas.

Oracle é uma marca registrada da Oracle Corporation e/ou seus
afiliadas. Outros nomes podem ser marcas registradas de seus respectivos
proprietários.

Digite 'help;' ou '\h' para obter ajuda. Digite '\c' para limpar a instrução de entrada atual.

mysql> estado
--------------
mysql Ver 9.2.0 para Linux em x86_64 (MySQL Community Server - GPL)

ID de conexão: 9
Banco de dados atual:
Usuário atual: root@localhost
SSL: Não em uso
Pager atual: stdout
Usando outfile: ''
Usando delimitador: ;
Versão do servidor: 9.2.0 MySQL Community Server - GPL
Versão do protocolo: 10
Conexão: Localhost via soquete UNIX
Conjunto de caracteres do servidor: utf8mb4
Conjunto de caracteres do banco de dados: utf8mb4
Conjunto de caracteres do cliente: utf8mb4
Conjunto de caracteres de conexão: utf8mb4
Soquete UNIX: /var/run/mysqld/mysqld.sock
Dados binários como: Hexadecimal
Tempo de atividade: 47 seg

Tópicos: 2 Perguntas: 6 Consultas lentas: 0 Aberturas: 119 Tabelas de limpeza: 3 Tabelas abertas: 38 Consultas por segundo em média: 0,127

MySQL Innovation NDB CLuster 

gato /etc/rede/interfaces
auto ens18
iface ens18 inet estático
    endereço 192.168.3.102
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    endereço 192.168.3.103
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    endereço 192.168.3.103
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│ Qual versão do servidor você deseja receber?                                                                                                                            
 mysql-8.0  
 mysql-inovação     
 mysql-8.4-lts        
 mysql-cluster-8.0       
 mysql-cluster-innovation <-- Escolhi isso    
 mysql-cluster-8.4-lts   
 Nenhum

 Qual produto MySQL você deseja configurar?                                                                             
  Servidor e cluster MySQL (atualmente selecionado: mysql-cluster-innovation)  
  Conectores MySQL (Atualmente selecionado: Habilitado)     
  OK

# apt-get atualização
# apt-get install mysql-cluster-community-server -y
# apt-get install mysql-cluster-community-management-server <-- podemos escolher mais tarde qual usar
# apt-get install mysql-cluster-community-data-node -y

# vi /etc/mysql/conf.d/mysql.cnf

[mysqld]
# Opções para o processo mysqld:
ndbcluster # executa o mecanismo de armazenamento NDB

[mysql_cluster]
# Opções para processos de cluster NDB:
ndb-connectstring=192.168.3.102 # localização do servidor de gerenciamento

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
[ndbd padrão]
# Opções que afetam os processos ndbd em todos os nós de dados:
NoOfReplicas=2 # Número de réplicas de fragmentos
DataMemory=98M # Quanta memória alocar para armazenamento de dados

[ndb_mgmd]
# Opções do processo de gerenciamento:
HostName=192.168.3.102 # Nome do host ou endereço IP do nó de gerenciamento
DataDir=/var/lib/mysql-cluster # Diretório para arquivos de log do nó de gerenciamento

[não especificado]
# Opções para o nó de dados "A":
                                # (uma seção [ndbd] por nó de dados)
HostName=192.168.3.103 # Nome do host ou endereço IP
NodeId=2 # ID do nó para este nó de dados
DataDir=/var/lib/mysql/data # Diretório para os arquivos de dados deste nó de dados

[não especificado]
# Opções para o nó de dados "B":
HostName=192.168.3.104 # Nome do host ou endereço IP
NodeId=3 # ID do nó para este nó de dados
DataDir=/var/lib/mysql/data # Diretório para os arquivos de dados deste nó de dados

[mysqld]
# Opções do nó SQL:
HostName=192.168.3.102 # Nome do host ou endereço IP
                                # (conexões mysqld adicionais podem ser
                                # especificado para este nó para vários
                                # finalidades como executar ndb_restore)


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini
Servidor de gerenciamento de cluster MySQL mysql-9.2.0 ndb-9.2.0
AVISO: --ndb-connectstring é ignorado quando mgmd é iniciado com -f ou config-file.

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:11 [ndbd] INFO -- Angel conectado a '192.168.3.102:1186'
2025-04-01 11:53:12 [ndbd] INFO -- Angel alocou nodeid: 2

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:19 [ndbd] INFO -- Angel conectado a '192.168.3.102:1186'
2025-04-01 11:53:20 [ndbd] INFO -- ID de nó alocado pelo Angel: 3


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgm
-- Cluster NDB -- Cliente de gerenciamento --
ndb_mgm> mostrar
Conectado ao servidor de gerenciamento na porta 1186 192.168.3.102 (usando texto não criptografado)
Configuração de cluster
---------------------
[ndbd(NDB)] 2 nó(s)
id=2 @192.168.3.103 (mysql-9.2.0 ndb-9.2.0, Grupo de nós: 0, *)
id=3 @192.168.3.104 (mysql-9.2.0 ndb-9.2.0, Grupo de nós: 0)

[ndb_mgmd(MGM)] 1 nó(s)
id=1 @192.168.3.102 (mysql-9.2.0 ndb-9.2.0)

[mysqld(API)] 1 nó(s)
id=4 (não conectado, aceitando conexão de 192.168.3.102)

┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "selecione @@nomedohost"
Digite a senha:
+-------------------+
| @@nome do host |
+-------------------+
| ndb1.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "selecione @@nomedohost"
Digite a senha:
+-------------------+
| @@nome do host |
+-------------------+
| ndb2.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "selecione @@nomedohost"
Digite a senha:
+-------------------+
| @@nome do host |
+-------------------+
| ndb3.sqlhjalp.com |
+-------------------+

Servidor Percona 

# cat /etc/rede/interfaces
 
auto ens18
iface ens18 inet estático
    endereço 192.168.3.105
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# percona-release enable-only ps-84-lts release
# percona-release habilitar ferramentas de liberação
# apt install percona-server-server

┌──(root㉿ps1)-[/usr/local/src]
└─# ps -ef |grep mysql
mysql 5832 1 0 11:58? 00:00:03 /usr/sbin/mysqld
raiz 5924 501 0 12:04 pts/1 00:00:00 grep --color=auto mysql

┌──(root㉿ps1)-[/usr/local/src]
└─# mysql -u root -p
Digite a senha:
Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou \g.
Seu ID de conexão MySQL é 9
Versão do servidor: 8.4.4-4 Percona Server (GPL), versão '4', revisão '844fde07'

Copyright (c) 2009-2025 Percona LLC e/ou suas afiliadas
Copyright (c) 2000, 2025, Oracle e/ou suas afiliadas.

Oracle é uma marca registrada da Oracle Corporation e/ou seus
afiliadas. Outros nomes podem ser marcas registradas de seus respectivos
proprietários.

Digite 'help;' ou '\h' para obter ajuda. Digite '\c' para limpar a instrução de entrada atual.

Aglomerado Percona 

# cat /etc/rede/interfaces
iface ens18 inet estático
    endereço 192.168.3.106
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

iface ens18 inet estático
    endereço 192.168.3.106
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

iface ens18 inet estático
    endereço 192.168.3.106
    máscara de rede 255.255.255.0
    portal 192.168.3.1
    servidores de nomes DNS 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# atualização do apt
# configuração percona-release pxc80
# apt install -y percona-xtradb-cluster

 
gato /etc/meu.cnf
[cliente]
soquete=/var/run/mysqld/mysqld.sock

[backup extra]
limite de arquivos abertos = 1000000

[mysqld]
id do servidor=1
datadir=/var/lib/mysql
soquete=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
arquivo pid=/var/run/mysqld/mysqld.pid
caminho-de-log-seguro=/var/lib/arquivos-mysql/
# O período de expiração do log binário é de 604.800 segundos, o que equivale a 7 dias
binlog_expire_logs_seconds=604800

userstat = 1

 └─# cat /etc/my.cnf | grep criptografar
pxc-encrypt-cluster-traffic = DESLIGADO
 
┌──(raiz㉿pxc1)-[/]
└─# cat /etc/my.cnf | endereço grep
wsrep_cluster_address = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Endereço IP do nó
wsrep_node_address=192.168.3.106

┌──(root㉿pxc1)-[/etc/mysql/conf.d]
└─# systemctl start mysql@bootstrap

mysql> mostrar status como 'wsrep_c%';
+--------------------------------------+--------------------------------------+
| Nome_da_variável | Valor |
+--------------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
| wsrep_commit_oooe | 0 |
| wsrep_commit_oool | 0 |
| janela_de_confirmação_do_wsrep | 0 |
| tamanho_do_índice_do_certificado_do_wsrep | 0 |
| contagem_de_bucket_de_certificação_wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| wsrep_cluster_weight | 1 |
| capacidades_do_cluster_do_wsrep | |
| ID de configuração do cluster wsrep | 1 |
| tamanho_do_cluster_wsrep | 1 |
| uuid_de_estado_do_cluster_wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primário |
| wsrep_connected | LIGADO |
+--------------------------------------+--------------------------------------+
15 linhas em conjunto (0,00 seg)

┌──(root㉿pxc2)-[/etc]
└─# cat /etc/my.cnf | endereço grep
wsrep_cluster_address = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Endereço IP do nó
wsrep_node_address=192.168.3.107

┌──(raiz㉿pxc2)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raiz㉿pxc2)-[/var/lib/mysql]
└─# ls -tla
total 8
drwxr-x--- 2 mysql mysql 4096 1 de abr 13:36 .
drwxr-xr-x 26 root root 4096 1 de abr 12:34 ..

┌──(raiz㉿pxc2)-[/var/lib/mysql]
└─# systemctl iniciar mysql

┌──(root㉿pxc2)-[/etc]
└─# cat /etc/my.cnf | endereço grep
wsrep_cluster_address = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Endereço IP do nó
wsrep_node_address=192.168.3.107
 ┌──(raiz㉿pxc3)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raiz㉿pxc3)-[/var/lib/mysql]
└─# systemctl iniciar mysql


mysql> mostrar status como 'wsrep_c%';
+--------------------------------------+--------------------------------------+
| Nome_da_variável | Valor |
+--------------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
| wsrep_commit_oooe | 0 |
| wsrep_commit_oool | 0 |
| janela_de_confirmação_do_wsrep | 0 |
| tamanho_do_índice_do_certificado_do_wsrep | 0 |
| contagem_de_bucket_de_certificação_wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| wsrep_cluster_weight | 3 |
| capacidades_do_cluster_do_wsrep | |
| ID de configuração do cluster wsrep | 3 |
| tamanho_do_cluster_wsrep | 3 |
| uuid_de_estado_do_cluster_wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primário |
| wsrep_connected | LIGADO |
+--------------------------------------+--------------------------------------+
15 linhas em conjunto (0,00 seg)

Configurar exportadores MySQL e Prometheus 

por cada máquina...

apt install -y prometheus-mysqld-exporter
 
CRIAR USUÁRIO SE NÃO EXISTIR 'prometheus'@'localhost' IDENTIFICADO POR '<SENHAAQUI>'; 
mysql> mostrar concessões para 'prometheus'@'localhost'; +--------------------------------------------------------------------------------------------+ | Subsídios para prometheus@localhost | +--------------------------------------------------------------------------------------------+ | CONCEDER SELEÇÃO, PROCESSO, REPLICAÇÃO CLIENTE EM *.* PARA `prometheus`@`localhost` | +--------------------------------------------------------------------------------------------+ 1 linha no conjunto (0,00 seg) ┌──(raiz㉿pxc1)-[~] └─# ls -ltr /etc/mysql/debian.cnf -rw-r--r-- 1 root root 50 1 de abril 16:52 /etc/mysql/debian.cnf # vi /etc/default/prometheus-mysqld-exporter systemctl reiniciar prometheus-mysqld-exporter.service # systemctl restart prometheus-mysqld-exporter.service

Servidor Prometheus 

root@prometheus:/etc/prometheus# vi prometheus.yml


  - nome_da_tarefa: mysqld-exporter
    configurações_estáticas:
      - alvos:
          - 'mysql1.sqlhjalp.com:9104'
          - 'mariadb1.sqlhjalp.com:9104'
          - 'ps1.sqlhjalp.com:9104'
          - 'pxc1.sqlhjalp.com:9104'
          - 'pxc2.sqlhjalp.com:9104'
          - 'pxc3.sqlhjalp.com:9104'
          - 'ndb1.sqlhjalp.com:9104'
          - 'ndb2.sqlhjalp.com:9104'
          - 'ndb3.sqlhjalp.com:9104'
        rótulos:
          país: EUA
          db_env: 'casa'
          ambiente: "demo"
          Linux: Debian
          nodeuse: servidor


mysql_up{ambiente="demonstração"}

Valor do Elemento
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="mariadb1.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="mysql1.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="ndb1.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="ndb2.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="ndb3.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="ps1.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="pxc1.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="pxc2.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1
mysql_up{país="EUA",db_env="home",ambiente="demo",instância="pxc3.sqlhjalp.com:9104",job="mysqld-exporter",linux="debian",nodeuse="servidor"} 1

CONFIGURAÇÃO DA CONTA DO Vault 

mysql> CRIAR FUNÇÃO SE NÃO EXISTIR vaultaccess;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY BASES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `vaultaccess`@`%` WITH GRANT OPTION;
 
CRIAR USUÁRIO `vaultadmin`@`%` IDENTIFICADO POR '<PASSWORDHERE>' FUNÇÃO PADRÃO `vaultaccess`@`%` NÃO EXIGE NENHUMA SENHA EXPIRAR CONTA PADRÃO DESBLOQUEAR HISTÓRICO DE SENHAS INTERVALO DE REUTILIZAÇÃO DE SENHA PADRÃO SENHA PADRÃO EXIGE PADRÃO ATUAL ;
mysql> mostrar concessões para vaultadmin;

CRIE A FUNÇÃO SE NÃO EXISTIR SOMENTE LEITURA;
CONCEDER SELEÇÃO, EXECUTAR EM *.* PARA `READONLY`@`%` ;

Mariadb

MariaDB [(none)]> CRIAR USUÁRIO `vaultadmin`@`%` IDENTIFICADO POR '<SENHAAQUI>'; 
MariaDB [(none)]> CONCEDER SELECIONAR, INSERIR, ATUALIZAR, EXCLUIR, CRIAR, REMOVER, RECARREGAR, PROCESSAR, ARQUIVAR, REFERÊNCIAS, INDEXAR, ALTERAR, MOSTRAR BANCOS DE DADOS, SUPER, CRIAR TABELAS TEMPORÁRIAS, BLOQUEAR TABELAS, EXECUTAR, CRIAR VISUALIZAÇÃO, MOSTRAR VISUALIZAÇÃO, CRIAR USUÁRIO, EVENTO, GATILHO, CRIAR ESPAÇO DE TABELA EM *.* PARA `vaultadmin`@`%` COM OPÇÃO DE CONCESSÃO;

Mecanismo de banco de dados Vault - repetido por instância de banco de dados 

vault escreve banco de dados/configuração/plugin MYSQL nome_do_plugin=mysql-database-plugin url_de_conexão="{{nome_de_usuário}}:{{senha}}@tcp(mysql1.sqlhjalp.com:3306)/" funções_permitidas="minha-função" nome_de_usuário="vaultadmin" senha="<SENHA AQUI>"
leitura do cofre banco de dados/configuração/MYSQL Valor-chave --- ----- funções_permitidas [] mapa de detalhes da conexão [backend: url_de_conexão_do_banco_de_dados: {{nome_de_usuário}}: {{senha}} @ tcp (mysql1.sqlhjalp.com:3306) / tempo_de_vida_máximo_da_conexão: 0 s conexões_ociosas_máximas: 0 conexões_abertas_máximas: 4 nome_de_usuário: administrador_do_cofre] desabilitar_rotação_automatizada falso política_de_senha n/a nome_do_plugin plugin-de-banco-de-dados-mysql versão_do_plugin n/a credenciais_raiz_rotação_de_instruções [] período_de_rotação 0s programação de rotação n/a janela_de_rotação 0 skip_static_role_import_rotation falso verificar_conexão verdadeiro leitura do cofre banco de dados/funções/DEMOREADONLY Valor-chave --- ----- creation_statements [CRIAR USUÁRIO '{{name}}'@'%' IDENTIFICADO POR '{{password}}'; CONCEDER SELEÇÃO EM *.* PARA '{{name}}'@'%';] credencial_tipo senha nome_do_banco_de_dados MYSQL default_ttl 1h max_ttl 24h renovar_declarações [] declarações_de_revocação [EXCLUIR USUÁRIO SE EXISTIR '{{name}}'@'%';] instruções de rollback []

Exemplo de usuário dinâmico do Vault 

leitura do cofre banco de dados/credenciais/DEMOREADONLY
Valor-chave
--- -----
lease_id banco de dados/creds/DEMOREADONLY/1SACMdnTGXseMewbA6ek1T42
duração do arrendamento 1h
lease_renewable verdadeiro
senha -piWu8YfOFxUkAqR347a
nome de usuário v-userpass-k-DEMOREADON-HFRYaNGE


mysql> mostrar concessões para 'v-userpass-k-DEMOREADON-HFRYaNGE'@'%';
+--------------------------------------------------------------------------+
| Subsídios para v-userpass-k-DEMOREADON-HFRYaNGE@% |
+--------------------------------------------------------------------------+
| CONCEDER SELEÇÃO EM *.* PARA `v-userpass-k-DEMOREADON-HFRYaNGE`@`%` |
+--------------------------------------------------------------------------+
1 linha no conjunto (0,00 seg)

Além disso..... 

POSTGRESQL

https://docs.vultr.com/how-to-install-postgresql-on-debian-12

# apt install -y postgresql-common
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# atualização do apt
# política apt-cache postgresql
# apt install postgresql -y
# systemctl iniciar postgresql
# status do sistema ctl postgresql
# sudo -u postgres psql sudo -u postgres psql
# postgres=# ALTER ROLE postgres COM SENHA CRIPTOGRAFADA '<senha>';
ALTERAR PAPEL
#

Banco de Dados Oracle XE 


wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# yum install ./oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm ./oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# /etc/init.d/oracle-xe-21c configure

$ exportar ORACLE_SID=XE
$ export ORAENV_ASK=NO
$ . /opt/oracle/produto/21c/dbhomeXE/bin/oraenv

ORACLE_HOME = [] ? /opt/oracle/produto/21c/dbhomeXE
A base Oracle foi definida como /opt/oracle


[root@localhost ~]# echo $ORACLE_HOME
/opt/oracle/produto/21c/dbhomeXE
[root@localhost ~]# cd $ORACLE_HOME
[root@localhost dbhomeXE]# senha
/opt/oracle/produto/21c/dbhomeXE

[root@localhost dbhomeXE]# cd bin

[root@localhost bin]# sqlplus /nolog

SQL*Plus: Versão 21.0.0.0.0 - Produção em qui, 3 de abr de 2025, 10:35:15
Versão 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle. Todos os direitos reservados.

SQL>

SQL> CONECTAR SYS COMO SYSDBA
Digite a senha:
Conectado.
SQL>

SQL> definir tamanho da linha 1500
SQL> selecione nome de usuário, status_da_conta de DBA_USERS;

STATUS_DA_CONTA_DE_NOME_DE_USUÁRIO
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------
SISTEMA ABERTO
SISTEMA ABERTO
XS$NULL BLOQUEADO
OJVMSYS BLOQUEADO
LBACSYS BLOQUEADO
OUTLN BLOQUEADO
DBSNMP BLOQUEADO
APPQOSSYS BLOQUEADO
DBSFWUSER BLOQUEADO
GGSYS BLOQUEADO
ANÔNIMO BLOQUEADO
 
SQL> SAIR
Desconectado do Oracle Database 21c Express Edition Release 21.0.0.0.0 - Produção
Versão 21.3.0.0.0

SQLSERVER 

# curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
# yum install -y mssql-server
# /opt/mssql/bin/mssql-conf configuração
# status do sistema ctl mssql-server

curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo

# yum install -y mssql-tools18 unixODBC-devel

# yum check-update
# yum update mssql-tools18

eco 'exportar PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
fonte ~/.bash_profile

# /opt/mssql/bin/mssql-conf definir-sa-senha
Digite a senha do administrador do sistema do SQL Server:
Confirme a senha do administrador do sistema do SQL Server:
Configurando o SQL Server...

# sqlcmd -S localhost -No -U sa

# sqlcmd -S localhost -No -U sa
Senha:
1> CRIAR BANCO DE DADOS TestDB;
2> SELECIONE Nome DE sys.databases;
3> VAI
Nome
--------------------------------------------------------------------------------------------------------------------------------
mestre
banco de dados temporário
modelo
msdb
TestDB

(5 linhas afetadas)


USE TestDB;

CRIAR TABELA dbo.Inventory
(
    id INT, nome NVARCHAR (50), quantidade INT, CHAVE PRIMÁRIA (id)
);
POXA

INSERIR EM dbo.Inventory VALORES (1, 'banana', 150);
INSERIR EM dbo.Inventory VALORES (2, 'laranja', 154);

IR


SELECIONE * DE dbo.Inventory ONDE quantidade > 152;
IR

1> SELECIONE * DE dbo.Inventory;
2> VAI
id nome quantidade
----------- -------------------------------------------------- -----------
          1 banana 150
          2 laranja 154

MONGODB - PERCONA

https://docs.percona.com/percona-server-for-mongodb/8.0/install/apt.html

# apt install -y gnupg2 gnupg curl
# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita a liberação do psmdb-80
# atualização do apt
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 de fev 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidade]
Descrição=Habilitar páginas enormes transparentes (THP)
DependênciasPadrão=não
Depois=sysinit.target local-fs.target
Antes=mongod.service

[Serviço]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo sempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
ProcuradoPor=básico.alvo

# systemctl daemon-reload
# systemctl start habilitar-páginas-enormes-transparentes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[sempre] madvise nunca
sempre adiar [adiar+madvise] madvise nunca
0
1

# systemctl enable habilitar-páginas-enormes-transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl start mongod
# status do sistema ctl mongod
# mongosh
ID de registro atual do Mongosh: 67ed4eb0cd874b942d98ebcf
Conectando a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conectar ECONNREFUSED 127.0.0.1:27017

MONGODB

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian/

 
# apt-get install gnupg curl
# curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
  --querido
# echo "deb [ assinado-por=/usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
# apt-get atualização
# apt-get install -y mongodb-org
# systemctl daemon-reload
# ulimit -c ilimitado
# ulimit -n 64000
# ulimit -f ilimitado
# ulimit -t ilimitado
# ulimit -l ilimitado
# ulimit -m ilimitado
# ulimit -u 64000
# ulimit -a
tempo não bloqueador em tempo real (microssegundos, -R) ilimitado
tamanho do arquivo principal (blocos, -c) ilimitado
tamanho do segmento de dados (kbytes, -d) ilimitado
prioridade de agendamento (-e) 0
tamanho do arquivo (blocos, -f) ilimitado
sinais pendentes (-i) 15471
memória máxima bloqueada (kbytes, -l) ilimitada
tamanho máximo de memória (kbytes, -m) ilimitado
abrir arquivos (-n) 64000
tamanho do tubo (512 bytes, -p) 8
Filas de mensagens POSIX (bytes, -q) 819200
prioridade em tempo real (-r) 0
tamanho da pilha (kbytes, -s) 8192
tempo de CPU (segundos, -t) ilimitado
máximo de processos de usuário (-u) 64000
memória virtual (kbytes, -v) ilimitada
bloqueios de arquivo (-x) ilimitados

# systemctl start mongod

# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita a liberação do psmdb-80
# atualização do apt
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 de fev 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidade]
Descrição=Habilitar páginas enormes transparentes (THP)
DependênciasPadrão=não
Depois=sysinit.target local-fs.target
Antes=mongod.service

[Serviço]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo sempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
ProcuradoPor=básico.alvo

# systemctl daemon-reload
# systemctl start habilitar-páginas-enormes-transparentes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[sempre] madvise nunca
sempre adiar [adiar+madvise] madvise nunca
0
1

# systemctl enable habilitar-páginas-enormes-transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl start mongod
# status do sistema ctl mongod
# mongosh
ID de registro atual do Mongosh: 67ed4eb0cd874b942d98ebcf
Conectando a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conectar ECONNREFUSED 127.0.0.1:27017


CASSANDRA

https://docs.vultr.com/how-to-install-apache-cassandra-on-debian-12

# atualização do apt
# cat /etc/apt/source.list
deb https://deb.debian.org/debian bookworm principal firmware não livre
deb http://deb.debian.org/debian bookworm-updates principal
deb http://deb.debian.org/debian-security bookworm-security principal
deb http://deb.debian.org/debian instável principal não livre contrib

# atualização do apt
# apt install curl
# apt install openjdk-17-jdk
# java --versão
openjdk 17.0.14 21/01/2025
Ambiente de execução OpenJDK (compilação 17.0.14+7-Debian-1deb12u1)
VM do servidor OpenJDK de 64 bits (compilação 17.0.14+7-Debian-1deb12u1, modo misto, compartilhamento)

# echo "deb [assinado por=/etc/apt/keyrings/apache-cassandra.asc] https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
# curl -o /etc/apt/keyrings/apache-cassandra.asc https://downloads.apache.org/cassandra/KEYS
# atualização do apt
# apt install cassandra

# ls -lr /etc/cassandra/cassandra.yaml
-rw-r--r-- 1 root root 91468 27 de janeiro 07:28 /etc/cassandra/cassandra.yaml

# vi /etc/cassandra/cassandra.yaml
# systemctl reiniciar cassandra

# ls -lr /var/log/cassandra/
total 0

# status do systemctl cassandra
# status do nodetool
nodetool: Falha ao conectar a '127.0.0.1:7199' - ConnectException: 'Conexão recusada'.

# cqlsh -u cassandra -p cassandra

Aviso: Usar uma senha na interface de linha de comando pode ser inseguro.
Recomendação: use o arquivo de credenciais para fornecer a senha com segurança.

Erro de conexão: ('Não foi possível conectar a nenhum servidor', {'127.0.0.1:9042': ConnectionRefusedError(111, "Tentativa de conectar a [('127.0.0.1', 9042)]. Último erro: Conexão recusada")})


quarta-feira, 22 de janeiro de 2025

MySQL DBA Trabalho em casa - Brasil

 Por favor, envie seu currículo/CV em inglês. Esta função é totalmente remota no Brasil.

O TRABALHO:

Junte-se à nossa equipe de banco de dados e torne-se um membro essencial de uma equipe responsável pelo maior

sistema de bilhetagem do mundo. Atualmente estamos trabalhando na criação de um conjunto de próxima geração

ferramentas de banco de dados para criar, gerenciar e operar vários bancos de dados da AWS e, em seguida, migrar nossos bancos de dados em nuvem para a AWS. Utilizamos diversas tecnologias de banco de dados RDBMS e NoSQL. Oferecemos suporte a diversas plataformas de banco de dados, executadas em infraestrutura de nuvem privada e pública, ao mesmo tempo em que impulsionamos o maior sistema de emissão de bilhetes do mundo e atendemos 170 milhões de clientes.

Por favor, siga este URL para enviar currículo 

sábado, 24 de fevereiro de 2024

Criptografia MariaDB (dados em repouso)

Abaixo está um exemplo simples que mostra algumas opções de criptografia MariaDB. 

Você deve considerar o que deseja criptografar. A comunicação de dados (dados em trânsito) ou dados na instância (dados em repouso). 

Esta postagem se concentrará na opção de dados em repouso usando um nó de nível gratuito da AWS em execução no Amazon Linux. Usarei o banco de dados global em 2 instâncias diferentes para mostrar a atualização das tabelas atuais com criptografia, bem como novas tabelas de carregamento que serão criptografadas automaticamente. 


Primeiro, começaremos com as instalações... rápidas e fáceis apenas para esta demonstração. 

 # yum -y install mariadb105-server
# vi /etc/my.cnf.d/mariadb-server.cnf
# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id 
server_id=100

# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id
server_id=200
# systemctl start mariadb.service
# mysql
MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.5.23-MariaDB, for Linux (x86_64) using  EditLine wrapper
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.5.23-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db     characterset: latin1
Client characterset: utf8
Conn.  characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 27 sec
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+


Carregaremos o banco de dados global na instância server_id 100. 


# mysql < world.sql
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.23-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| world              |
+--------------------+
4 rows in set (0.000 sec)
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)  


Agora podemos ver que ambas as instâncias não estão usando criptografia. 


MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)


Agora, em ambos os sistemas, configurarei chaves aleatórias e as criptografarei. 


#  mkdir /etc/mysql/

#  mkdir /etc/mysql/encryption/
# (echo -n "1;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
# (echo -n "2;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
#  (echo -n "100;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile

# cat /etc/mysql/encryption/keyfile
1;466139b487d5735b536a10502b0607d2b96dfa58a7f95ce4847d98ef585af8b5
2;a0f533c2e459dc64e0aeb1f0f8c9dfb496571e71001ca60fac35c8bbc6361096
100;4b4bfd61af39d57e068385cf1a023bdfc5972ed414a24167067ca5256fc314e6

# cat /etc/mysql/encryption/keyfile
1;f8b1b250d3bf7159e2abd15be146367415a80d3781bbcf7d96b26640d7efdc8a
2;c7eaccedd0ef561f0c08d461abfd651947230b08c71aec67c6064bbedb6408ec
100;90475521b6eb6be3c1ec02770f3e8f80b34130f37d25c89b51cf10ec6a7c5bb6

openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
openssl enc -aes-256-cbc -md sha1    -pass file:/etc/mysql/encryption/keyfile.key    -in /etc/mysql/encryption/keyfile    -out /etc/mysql/encryption/keyfile.enc

 ls -ltr /etc/mysql/encryption/
total 12
-rw-r--r--. 1 root root 203 Feb 24 23:39 keyfile
-rw-r--r--. 1 root root 257 Feb 24 23:40 keyfile.key
-rw-r--r--. 1 root root 224 Feb 24 23:41 keyfile.enc


Ahora podemos configurar el archivo cnf para habilitar el complemento, como opciones de criptografía. 


# vi /etc/my.cnf.d/mariadb-server.cnf
[mariadb]
## File Key Management
plugin_load_add = file_key_management
loose_file_key_management_filename = /etc/mysql/encryption/keyfile
loose_file_key_management_filename = /etc/mysql/encryption/keyfile.enc
loose_file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
loose_file_key_management_encryption_algorithm = AES_CBC

## InnoDB/XtraDB Encryption Setup
innodb_encrypt_log = ON
innodb_encrypt_temporary_tables=ON
innodb_encryption_threads=4
innodb_encrypt_tables=ON
innodb_default_encryption_key_id=1

## Aria Encryption Setup
aria_encrypt_tables = ON

## Temp & Log Encryption
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt_binlog = ON


Reinicie MariaDB para que podamos verificar el estado actual. 


systemctl restart mariadb.service
mysql
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
+----------------------------+-------------------+----------------+
5 rows in set (0.000 sec)


Faça upload também dos dados mundiais para a instância server_id 200. 

 

# mysql < world.sql
# mysql 
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)


De acordo com information_schema.INNODB_TABLESPACES_ENCRYPTION agora estamos criptografados. No entanto, eles não mostram isso no nível do esquema. Embora digam que está criptografado se aparecer na  tabela INNODB_TABLESPACES_ENCRYPTION, prefiro ter certeza e vê-lo na tabela e no esquema. 

 

MariaDB [(none)]> show create table world.city\G
*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.001 sec)


Até este ponto, você pode ver que ambas as instâncias foram contabilizadas no  esquema INNODB_TABLESPACES_ENCRYPTION após a reinicialização ou carregamento do esquema e dos dados. 

Então... algumas modificações na tabela vão ajudar aqui... 


MariaDB [world]> ALTER TABLE city ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.074 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE country ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.031 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE countrylanguage  ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.033 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city\G
*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


Isso é simples etc. até agora... agora precisamos habilitar binlogs e verificar mais. 

vi /etc/my.cnf.d/mariadb-server.cnf
log_bin=demo

cat /etc/my.cnf.d/mariadb-server.cnf | grep log_bin
log_bin=demo

# systemctl restart mariadb.service

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)


Verificando os binlogs .... 


mariadb-binlog--base64-output=DECODE-ROWS --verbose  demo.000001

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup

# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

# at 256

# Encryption scheme: 1, key_version: 1, nonce: eb7991b210f3f4d2f7f21537

# The rest of the binlog is encrypted!

ERROR: Error in Log_event::read_log_event(): 'Event decryption failure', data_len: 2400465656, event_type: 240

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


É bom ver que agora está sendo criptografado. 


MariaDB [world]> create table city2 like city;
Query OK, 0 rows affected (0.013 sec)

MariaDB [world]> insert into city2 select * from city;
Query OK, 4079 rows affected (0.078 sec)
Records: 4079  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city2\G
*************************** 1. row ***************************
       Table: city2
Create Table: CREATE TABLE `city2` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


Quero ver essas transações no log binário.. como? Puedes usar mariadb_binlog junto con --read-from-remote-server para poder ver los datos en los registros...


mariadb-binlog  --base64-output=DECODE-ROWS --verbose --read-from-remote-server   demo.000001 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup
ROLLBACK/*!*/;
# at 256
#240225  0:06:06 server id 100  end_log_pos 296 CRC32 0x0c89f3bb  Ignorable
# Ignorable event type 164 (Start_encryption)
# at 296
#240225  0:06:06 server id 100  end_log_pos 325 CRC32 0x535776a2  Gtid list []
# at 325
#240225  0:06:06 server id 100  end_log_pos 363 CRC32 0x2ac4a61b  Binlog checkpoint demo.000001
# at 363
#240225  0:09:40 server id 100  end_log_pos 405 CRC32 0x93e10dc4  GTID 0-100-1 ddl
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
/*!100001 SET @@session.server_id=100*//*!*/;
/*!100001 SET @@session.gtid_seq_no=1*//*!*/;
# at 405
#240225  0:09:40 server id 100  end_log_pos 501 CRC32 0x39269040  Query thread_id=5 exec_time=0 error_code=0
use `world`/*!*/;
SET TIMESTAMP=1708819780/*!*/;
SET @@session.pseudo_thread_id=5/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1, @@session.sql_if_exists=0, @@session.explicit_defaults_
for_timestamp=0/*!*/;
SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=utf8,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table city2 like city
/*!*/;
# at 501
#240225  0:09:49 server id 100  end_log_pos 543 CRC32 0xde82b753  GTID 0-100-2 trans
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
START TRANSACTION
/*!*/;
# at 543
# at 602
#240225  0:09:49 server id 100  end_log_pos 602 CRC32 0x05bbb9e6  Annotate_rows:
#Q> insert into city2 select * from city
#240225  0:09:49 server id 100  end_log_pos 661 CRC32 0x9e0b4e0d  Table_map: `world`.`city2` mapped to number 21
# at 661


Espero que isso possa pelo menos começar ... 


Recursos :

https://mariadb.com/kb/en/securing-mariadb-encryption/  

quinta-feira, 12 de novembro de 2020

Usando seu arquivo FRM para obter Schema e, em seguida, importar arquivos idb ..

Este é um tópico que em geral você nunca deveria ter que fazer ... Por quê? Porque você criou backups certos ... Você testou e sabe que os backups funcionam, então você pode simplesmente restaurar esses backups e obter seu esquema perdido e dados relacionados ... 

No entanto, aquela instância no escritório de canto ... você nunca teve o tempo de configurar ... não é tão importante ... apenas travou e agora você percebe como realmente a usa ... 

Nem tudo está perdido ..  

O MySQL lanç seus utilitários MySQL há algum tempo e, desde então, foi substituído mais pelo MySQL Shell.  

O mysqlfrm ainda é muito útil quando precisa retirar o esquema de um arquivo FRM em um comando rápido e simples e é uma instalação simples. 

mysqlfrm --diagnostic city.frm
# WARNING: Cannot generate character set or collation names without the --server option. # CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for city.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(160) DEFAULT NULL,
  `CountryCode` char(12) NOT NULL,
  `District` char(80) NOT NULL,
  `Population` int(11) NOT NULL,
PRIMARY KEY `PRIMARY` (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `popkey` (`Population`)
) ENGINE=InnoDB;

#...done.


Agora que você tem o esquema que perdeu ... reconstrua o banco de dados ou uma tabela. Por causa do exemplo, direi que acabamos de perder os dados da cidade do banco de dados mundial. 

$ cp  city.ibd  / tmp /  

$ cp city.ibd /tmp/
mysql> LOCK TABLES city WRITE;
mysql> ALTER TABLE city DISCARD TABLESPACE;

cp city.ibd /edb/local/mysql/data/rundeck/
chown tmdba:dba /edb/local/mysql/data/rundeck/city.ibd

mysql> ALTER TABLE city IMPORT TABLESPACE;
mysql> UNLOCK TABLES;
mysql> SELECT COUNT(*) FROM city;


segunda-feira, 21 de setembro de 2020

MySQL mysql_config_editor & expect

 Esta é apenas uma nota para ajudar qualquer pessoa que queira usar o comando mysql_config_editor em suas ferramentas de automação. 

o mysql_config_editor não aceita um argumento de senha, portanto, como ferramentas de automação que podem ter definido sua senha no arquivo .my.cnf ao tentar usar mysql_config_editor falham. 

É possível e bastante simples com uma ferramenta expect. 

 yum -y install expect  

ele também funciona para o apt-get. 


Portanto, neste exemplo, mostrarei uma versão de script bash simples. 

1º .. meu caminho de login não funciona ... 

mysql --login-path=local

ERROR 1045 (28000): Access denied for user


Defina isso com o esperado 

Você executaria isso por meio de seu script bash.  

expect <<EOD

spawn mysql_config_editor set --login-path=local --host=localhost --user=root --password 

expect "password"

send  -- "<PASSWORD>\r"

interact

EOD


Agora funciona ...

mysql --login-path=local

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1002