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

domingo, 15 de março de 2020

MySQL e Dockers ... uma configuração simples

MySQL e Dockers ... não são novos conceitos, as pessoas estão se mudando para o Dockers há algum tempo. Para alguém que está apenas se movendo para isso em desenvolvimento, isso pode ter alguns obstáculos.

Enquanto o MySQL funciona bem em execução local, se você estiver testando código em diferentes versões do MySQL, é bom ter várias versões facilmente disponíveis.

Uma opção há anos, é claro, é https://mysqlsandbox.net/ de Giuseppe Maxia. Esta é uma solução muito válida para poder obter várias instâncias e testar a replicação, etc.

Dockers agora também são outro cenário frequentemente usado quando se trata de testar versões diferentes do MySQL. A seguir, serão apresentados alguns passos para obter várias versões instaladas facilmente. Eu uso o OSX, então esses exemplos são para o OSX.

Você precisa do Docker para iniciar e, claro, e o Docker Desktop é uma ferramenta útil para você poder acessar facilmente.

Depois de configurar o Docker, posso preparar meu ambiente para o MySQL.

Aqui, criei uma pasta Docker que contém os diretórios de dados do MySQL, os arquivos de configuração e o diretório de arquivos mysql, se necessário.

mkdir ~/Docker ;

mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~ / Docker / cnf;

Agora dentro do mysql_data


cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;


Agora eu configurei arquivos cnf simples para este exemplo. A principal coisa a observar é o endereço de ligação. Isso está definido para garantir que seja aberto para alcançarmos o MySQL fora da janela de encaixe. Você também pode observar que esses arquivos podem ser usados ​​para configurar informações adicionais de configuração, conforme você entender por instância do estivador do MySQL.



cd ~/Docker/cnf;

cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80


# Custom config should go here
!includedir /etc/mysql/conf.d/

cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M

$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56

$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55


OK. Agora que temos os arquivos de configuração configurados, precisamos construir as janelas de encaixe. Algumas coisas a serem observadas nos comandos de construção.

--name Definimos uma referência nomeada para a janela de encaixe.

Aqui estamos mapeando os arquivos de configuração, o diretório de dados e o diretório mysql-files para a janela de encaixe. Isso nos permite ajustar o arquivo my.cnf e etc facilmente.
-v ~ / Docker / cnf / my.8.0.cnf: /etc/mysql/my.cnf
-v ~ / Docker / mysql_data / 8.0: / var / lib / mysql
-v ~ / Docker / arquivos mysql: / var / lib / arquivos mysql

Queremos alcançar essas instâncias do MySQL fora da janela de encaixe, portanto, precisamos publicar e mapear a porta de acordo.
-p 3306: 3306 Isso significa 3306 local para 3306 dentro da janela de encaixe
-p 3307: 3306 Isso significa 3307 local para 3306 dentro da janela de encaixe
-p 3308: 3306 Isso significa 3308 local para 3306 dentro da janela de encaixe
-p 3309: 3306 Isso significa 3309 local para 3306 dentro da janela de encaixe

Também passamos algumas variáveis ​​de ambiente.
-e MYSQL_ROOT_HOST =% -e MYSQL_ROOT_PASSWORD = <defina uma senha aqui>

Então, juntando tudo ...


docker run --restart always --name mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/8.0:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:8.0

docker run --restart always --name mysql5.7 -v ~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.7:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.7

docker run --restart always --name mysql5.6 -v ~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.6:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.6

docker run --restart always --name mysql5.5 -v ~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.5:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.5

Após cada execução dos comandos acima, você deve obter um ID retornado.
exemplo: 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

Você pode iniciar / reiniciar e acessar cada terminal docker facilmente através do Docker Desktop ou apenas anotar os IDs relacionados e executá-los através do terminal.

O Docker Desktop também mostra todas as variáveis ​​que você passou para que você possa validar.
Obviamente, você também pode acessar a CLI aqui, parar e iniciar ou destruí-la facilmente.


$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p

Se o contêiner do Docker já estiver em execução, você poderá acessar o MySQL através do seu terminal localhost.

$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root

Agora, se você estiver tendo algum problema de acesso, lembre-se de garantir que as contas do MySQL estejam corretas e que suas portas e mapeamento estejam corretos.
  • Conexão perdida com o servidor MySQL ao 'ler o pacote de comunicação inicial'
  • ERRO 1045 (28000): acesso negado para o usuário 'root'@'192.168.0.5' (usando a senha: YES)

Agora você pode ver que todos estão ativos e disponíveis e os IDs do servidor correspondem ao que definimos por eariler de arquivo cnf.

$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+