jueves, 12 de noviembre de 2020

Usando su archivo FRM para obtener Schema y luego importar archivos idb ..

Este es un tema que, en general, nunca debería tener que hacer ... ¿Por qué? Porque creó las copias de seguridad correctamente ... Ha probado y sabe que las copias de seguridad funcionan, por lo que puede restaurar esas copias de seguridad y obtener su esquema perdido y los datos relacionados ... 

Sin embargo, esa instancia en la oficina de la esquina ... nunca llegaste a configurar ... no es tan importante ... simplemente se bloqueó y ahora te das cuenta de how lo usas realmente ... 

No todo está perdido ..  

MySQL lanzó sus utilidades de MySQL hace un tiempo y desde entonces ha sido reemplazado por MySQL Shell.  

mysqlfrm sigue siendo muy útil cuando se necesita extraer el esquema de un archivo FRM en un comando rápido y simple y es una instalación simple. 

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.


Entonces, ahora que tiene el esquema que perdió ... reconstruya la base de datos o la tabla. Por el bien del ejemplo, diré que acabamos de perder los datos de la ciudad de la base de datos mundial. 

$ cp  ciudad.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;


lunes, 21 de septiembre de 2020

MySQL mysql_config_editor y esperar

 Esta es solo una nota para ayudar a cualquiera que desee utilizar el comando mysql_config_editor en sus herramientas de automatización. 

mysql_config_editor no acepta un argumento de contraseña, por lo que las herramientas de automatización pueden haber establecido antes su contraseña en el archivo .my.cnf al intentar usar mysql_config_editor fallan. 

Es posible y bastante simple, aunque con la herramienta de espera. 

 yum -y install expect  

también funciona para apt-get. 


Entonces, en este ejemplo, mostraré una versión simple del script bash. 

Primero ... mi ruta de acceso no funciona ... 

mysql --login-path=local

ERROR 1045 (28000): Access denied for user


Establecer esto con esperar 

Ejecutarías esto a través de tu script bash.  

expect <<EOD

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

expect "password"

send  -- "<PASSWORD>\r"

interact

EOD


Ahora funciona ...

mysql --login-path=local

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

Your MySQL connection id is 1002


domingo, 15 de marzo de 2020

MySQL y Dockers ... una configuración simple

MySQL y Dockers ... no son conceptos nuevos, la gente se ha mudado a Dockers desde hace algún tiempo. Para alguien que solo se está moviendo hacia esto para el desarrollo, puede tener algunos obstáculos.

Si bien MySQL funciona bien localmente, si está probando código en diferentes versiones de MySQL, es bueno tener varias versiones fácilmente disponibles.

Una opción durante años ha sido, por supuesto, https://mysqlsandbox.net/ de Giuseppe Maxia. Esta es una solución muy válida para poder obtener varias instancias y probar la replicación, etc.

Los Dockers ahora también son otro escenario de uso frecuente cuando se trata de probar en diferentes versiones de MySQL. A continuación se detallan algunos de los pasos para instalar fácilmente varias versiones. Yo uso OSX, así que estos ejemplos son para OSX.

Necesita Docker para comenzar y, por supuesto, Docker Desktop es una herramienta útil para que pueda acceder fácilmente.

Una vez que configuré Docker, puedo preparar mi entorno para MySQL.

Aquí creé una carpeta Docker que contiene los directorios de datos MySQL, los archivos de configuración y el directorio de archivos mysql si lo necesitaba.

mkdir ~/Docker ;

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

Ahora dentro de mysql_data


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


Ahora configuro archivos cnf simples para este ejemplo. Lo principal a tener en cuenta es la dirección de enlace. Esto está configurado para garantizar que esté abierto para que podamos llegar a MySQL fuera del docker. También puede observar que estos archivos se pueden usar para configurar información de configuración adicional como mejor le parezca por instancia de Docker de 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


Bien, ahora que tenemos configurados los archivos de configuración, necesitamos construir los acopladores. Algunas cosas a tener en cuenta para los comandos de compilación.

--name Establecimos una referencia con nombre para la ventana acoplable.

Aquí estamos asignando los archivos de configuración, el directorio de datos y los directorios de archivos mysql al docker. Esto nos permite ajustar el archivo my.cnf y etc. fácilmente.
-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

Queremos poder llegar a estas instancias de MySQL fuera del docker, por lo que debemos publicar y asignar el puerto en consecuencia.
-p 3306: 3306 Esto significa 3306 local a 3306 dentro de la ventana acoplable
-p 3307: 3306 Esto significa 3307 local a 3306 dentro de la ventana acoplable
-p 3308: 3306 Esto significa 3308 local a 3306 dentro de la ventana acoplable
-p 3309: 3306 Esto significa 3309 local a 3306 dentro de la ventana acoplable

Luego también pasamos un par de variables de entorno.
-e MYSQL_ROOT_HOST =% -e MYSQL_ROOT_PASSWORD = <establezca una contraseña aquí>

Poniendo todo junto ...


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

Después de cada ejecución de los comandos anteriores, debe obtener una identificación devuelta.
ejemplo: 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

Puede iniciar / reiniciar y acceder a cada terminal acoplable fácilmente a través del escritorio de Docker o simplemente tomar nota de las ID relacionadas y ejecutar a través del terminal.

Docker Desktop también le muestra todas las variables que pasó para que pueda validar.
Por supuesto, también puede acceder a la CLI aquí, detenerla, iniciarla o destruirla fácilmente.


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

Si el contenedor Docker ya se está ejecutando, ahora puede acceder a MySQL a través de su terminal localhost.

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

Ahora, si tiene problemas de acceso, recuerde asegurarse de que las cuentas de MySQL sean correctas y de que sus puertos y mapas estén correctos.
  • Se perdió la conexión con el servidor MySQL al "leer el paquete de comunicación inicial"
  • ERROR 1045 (28000): acceso denegado para el usuario 'root'@'192.168.0.5' (usando la contraseña: SÍ)

Ahora puede ver que todos están activos y disponibles, y que los Id. De servidor coinciden con lo que configuramos por archivo de 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 |
+--------------+-----------+-------------+