Mostrando entradas con la etiqueta mysqlbinlog. Mostrar todas las entradas
Mostrando entradas con la etiqueta mysqlbinlog. Mostrar todas las entradas

sábado, 13 de julio de 2019

MySQL Binlogs :: Cómo recuperar

Entonces me di cuenta de que no había hecho una publicación sobre esto después de esta situación que surgió recientemente.

Aquí está el escenario: una copia de seguridad se realizó a medianoche, utilizaron volcados de MySQL por base de datos. Luego, a las diez de la mañana del día siguiente, la base de datos se estrelló. Una serie de eventos sucedieron antes de que me llamaran, pero lo llevaron a una versión de la base de datos con tablas MyISAM y los archivos IBD que faltan en el espacio de tablas.

Así que la opción 1, la restauración de la copia de seguridad nos llevaría a la medianoche y perderíamos horas de datos. Opción 2, reimportamos los miles de archivos ibd y guardamos todo. Luego tuvimos la opción 3, restaurar desde la copia de seguridad, luego aplicar los registros bin para los cambios recientes.

Para hacerlo más interesante, no tenían todos los archivos ibd que me dijeron, y vi algunos faltantes. Así que no estoy seguro de cómo fue posible, pero la opción 2 se convirtió en una opción no válida. Ellos, por supuesto, querían la menor pérdida de datos posible, así que optamos por la opción 3.

Para hacerlo de forma segura, inicié otra instancia de MySQL en el puerto 3307. Esto me permitió trabajar en un lugar seguro mientras el tráfico tenía acceso de lectura a los datos de MyISAM en la instancia del puerto 3306.

Una vez que todos los archivos de copia de seguridad se descomprimieron e importaron en la instancia 3307, pude concentrarme en los archivos binlog.

Al principio, este concepto suena mucho más riesgoso de lo que realmente es. En realidad es bastante sencillo y sencillo.

Así que primero tienes que encontrar los datos que buscas. Una revisión de los archivos binlog le da una ventaja en cuanto a qué archivos son relevantes. En mi caso, de alguna manera lograron restablecer el binlog para que el archivo 117 tuviera 2 rangos de fecha dentro.

Primero para la revisión de binlog, el siguiente comando genera los datos en un formato legible.
mysqlbinlog --defaults-file=/root/.my.cnf --base64-output=DECODE-ROWS --verbose mysql-bin.000117 > review_mysql-bin.000117.sql

* Nota ... Tenga cuidado al ejecutar el comando anterior. Tenga en cuenta que lo tengo descargando el archivo directamente en la misma ubicación que binlog. Entonces valida que tu nombre de archivo sea válido. Este mysql-bin.000117.sql es diferente a este mysql-bin.000117 .sql. Perderá su binlog con la segunda opción y un espacio antes de .sql.

Ahora para guardar los datos para que puedan ser aplicados. Como tenía varios binlogs, creé un archivo y, de todos modos, quería volver a verificar los rangos de tiempo.


mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-09 00:00:00" --stop-datetime="2019-07-10 00:00:00" mysql-bin.000117 > binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000118 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000119 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-10 00:00:00" --stop-datetime="2019-07-10 10:00:00" mysql-bin.000117 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000120 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000121 >> binlog_restore.sql

mysql --socket=/var/lib/mysql_restore/mysql.sock -e "source /var/lib/mysql/binlog_restore.sql"

Ahora apliqué todos los datos de esos binlogs para los rangos de tiempo dados. El cliente volvió a verificar todos los datos y estaba muy contento de tenerlos todos de vuelta.

Existían varias opciones diferentes para esta situación, esto sucedió para entrenar mejor con el cliente.

Una vez que todo lo validado estaba correcto en la versión restaurada, era simplemente detener ambas bases de datos, mover los directorios de datos (quería mantener los valores predeterminados de datadir intactos), revisar los directorios solo para estar seguro e iniciar MySQL. Ahora la instancia restaurada estaba en el puerto 3306. 

jueves, 27 de noviembre de 2014

Recuperar los datos de MySQL se pierden con mysqlbinlog ejemplo de punto en el tiempo de recuperación

Original post: http://anothermysqldba.blogspot.com/2014/11/recover-lost-mysql-data-with.html

Copia de seguridad de copia de seguridad ... ... Copia de seguridad ... pero claro .. también hay que controlar y probar esas copias de seguridad a menudo de lo contrario podrían ser inútil. Tener sus MySQL binlogs habilitado sin duda puede ayudar en momentos de una emergencia también. Los binlogs MySQL a menudo se hace referencia en lo que respecta a la replicación de MySQL, por una buena razón, almacenan todas las consultas o eventos que alteren los datos ( basado en la fila es un poco diferente, pero este ejemplo). Los binlogs tienen un impacto mínimo en el rendimiento del servidor al considerar las opciones de recuperación que proporcionan. 


[anothermysqldba]> show variables like 'log_bin%'; 
+---------------------------------+--------------------------------------------+ 
| Variable_name | Value | 
+---------------------------------+--------------------------------------------+ 
| log_bin | ON | 
| log_bin_basename | /var/lib/mysql/binlogs/mysql-binlogs | 
| log_bin_index | /var/lib/mysql/binlogs/mysql-binlogs.index | 

show variables like 'binlog_format%'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| binlog_format | MIXED | 
+---------------+-------+ 


Así que esto es sólo un ejemplo sencillo utilizando mysqlbinlog para recuperar datos de un binlog y aplicarlo de nuevo a la base de datos. 

En primer lugar tenemos algo que perder. Si algo iba a pasar a nuestra base de datos tenemos que ser capaces de recuperar los datos o tal vez es sólo una manera de recuperarse de someones error. 


CREATE TABLE `table_w_rdata` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`somedata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`moredata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

Podemos fingir aquí y asumir que tenemos desarrolladores / administradores de bases que no se comunican muy bien y / o almacenamiento de copias de su código. 


delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 
call populate_dummydata(50); 

> SELECT NOW() \G 
*************************** 1. row *************************** 
NOW(): 2014-11-27 17:32:25 
1 row in set (0.00 sec) 

> SELECT * from table_w_rdata WHERE id > 45; 
+----+----------------------------+------------------+ 
| id | somedata | moredata | 
+----+----------------------------+------------------+ 
| 46 | b204e9800998ecf8427e | 0998ecf8427e | 
| 47 | d98f00b204e9800998ecf8427e | 8ecf8427e | 
| 48 | b204e9800998ecf8427e | 800998ecf8427e | 
| 49 | 98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 50 | 98f00b204e9800998ecf8427e | 998ecf8427e | 
+----+----------------------------+------------------+ 

Mientras se crea un procedimiento más tarde se escribe sobre otra persona incorrecta. 

DROP PROCEDURE IF EXISTS populate_dummydata ; 
delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @C + (RAND() * @A ))) as somedata, SUBSTR(md5(''),FLOOR( @B + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 

call populate_dummydata(50); 
> SELECT NOW(); SELECT * from table_w_rdata WHERE id > 95; 
+---------------------+ 
| NOW() | 
+---------------------+ 
| 2014-11-27 17:36:28 | 
+---------------------+ 
1 row in set (0.00 sec) 

+-----+-------------------+---------------------+ 
| id | somedata | moredata | 
+-----+-------------------+---------------------+ 
| 96 | 4e9800998ecf8427e | 00998ecf8427e | 
| 97 | 9800998ecf8427e | 800998ecf8427e | 
| 98 | e9800998ecf8427e | 204e9800998ecf8427e | 
| 99 | e9800998ecf8427e | 4e9800998ecf8427e | 
| 100 | 9800998ecf8427e | 04e9800998ecf8427e | 
+-----+-------------------+---------------------+ 


La versión sustituida del procedimiento no genera valores aleatorios como el equipo quería. El creador original del procedimiento acaba de dejar de frustración. Entonces, ¿qué hacer? Un poco de tiempo ha pasado desde que fue creado también. Hacemos saber el nombre de base de datos, nombre de la rutina y el marco general de tiempo cuando se creó el procedimiento incorrecto y por suerte para nosotros los registros bin todavía están alrededor, para que podamos ir a buscarlo. 

Tenemos que echar un vistazo general en todo ya que sólo queremos un punto en el tiempo de recuperación de esta procedure.We suceda a encontrar el procedimiento y la posición en el binlog antes y después de ella. 


NOW(): 2014-11-27 19:46:17 
# mysqlbinlog --start-datetime=20141127173200 --stop-datetime=20141127173628 --database=anothermysqldba mysql-binlogs.000001 | more 

at 253053 
at 253564 

# mysql anothermysqldba --login-path =local -e "DROP PROCEDURE populate_dummydata"; 
# mysqlbinlog --start-position=253053 --stop-position=253564 --database=anothermysqldba mysql-binlogs.000001 | mysql --login-path =local anothermysqldba 


> SHOW CREATE PROCEDURE populate_dummydata\G 
*************************** 1. row *************************** 
Procedure: populate_dummydata 
sql_mode: NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `populate_dummydata`( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END 
character_set_client: utf8 
collation_connection: utf8_general_ci 
Database Collation: latin1_swedish_ci 
1 row in set (0.00 sec) 

NOW(): 2014-11-27 19:51:03 
> call populate_dummydata(50); 
> SELECT * from table_w_rdata WHERE id > 145; 
+-----+-----------------------------+------------------+ 
| id | somedata | moredata | 
+-----+-----------------------------+------------------+ 
| 146 | 98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 147 | cd98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 148 | 204e9800998ecf8427e | 98ecf8427e | 
| 149 | d98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 150 | 204e9800998ecf8427e | 9800998ecf8427e | 
+-----+-----------------------------+------------------+ 


Recuperamos nuestro procedimiento del registro binario a través de un punto en el tiempo de recuperación . 
Este es un ejemplo simple, pero es un ejemplo de las herramientas que puede utilizar en movimiento hacia adelante. 

Es por esto que los binlogs son tan valiosos. 

URL útil: 

lunes, 6 de mayo de 2013

"Herramientas" del comercio

Original post: http://anothermysqldba.blogspot.com/2013/04/tools-of-trade.html

Pensé que podría valer la pena crear una lista de las herramientas principales de la trata que todos usamos. 

En primer lugar se trata de dar las gracias a todos los que ayuda a crear estas herramientas.
En segundo lugar es para permitir a otros que no usan estos para ver y aprender cómo se puede utilizar y por qué.
  • MySQL cliente de línea de comandos .
    • Esto es un hecho, pero sé que es el mejor acceso a MySQL.
    • mysql-p - prompt = "\ u @ \ h [\ d]> \ _ Master>"
  • Xtrabackup
    • . / Xtrabackup - defaults-file = / etc / my.cnf - backup - Estadísticas - target-dir = ~ / backups / - Preparación - export - user = root - innodb_data_home_dir = / var / lib / mysql / - innodb_data_file_path = / var / lib / mysql /
  • mysqlbinlog
  • mysqltuner
    • Una buena visión de conjunto en lo que podría haber pasando con su base de datos.
  • Percona Toolkit
    • exampes:
      • pt-query-digest
        • ejemplo: pt-query-digest - pregunte-pass / var / lib / mysql / mysql-slow.log
      • pt-table-checksum
        • ejemplo: pt-table-checksum - pregunte-pass
      • pt-table-sync
        • ejemplo: pt-table-sync - no-check-disparadores - pregunte-pass - no-check-disparadores - ejecutar - imprimir
      • pt-show-subvenciones
        • pt-show-subvenciones - pregunte-pass
  • MySQL Utilities
    • exampes:
      • python mysqldiskusage - server = root: contraseña @ localhost
      • python mysqlindexcheck - server = root: contraseña @ localhost ps_helper.schema_index_statistics
      • python mysqlprocgrep - server = root: contraseña @ localhost - match-user = root
  • planet.mysql.com
    • Esto podría hacer que algunas personas se preguntan, pero ... El conocimiento es poder. Este es el mejor lugar para aprender sobre MySQL.
    • Si usted tiene que entrevistar a un candidato DBA MySQL, recoger algunos autores activos comunes y pregunte si ellos saben quién es esa persona. Esto le permitirá entender si investigar las últimas tendencias e información alrededor de MySQL o se conforman con su experiencia.
  • MySQL Sandbox
    • mytop
      • inspirado en la parte superior, pero con un enfoque en MySQL
    • https://tools.percona.com/
      • Esto también podría hacer algunas preguntas. Añado esto porque es una manera rápida y buena para la gente para empezar y crear un my.cnf que es mejor que la versión instalada por defecto. Por lo menos se puede usar sólo para comparar con lo que usted piensa que debería ser.
    Usted puede notar que no soy un fan de la GUI. Sin ofender a esas herramientas GUI disponibles pero ¿por qué GUI si no lo necesita. Pero eso es sólo mi opinión y aquí está una lista de herramientas GUI para ser justos. Después de todo mapa de esquema es útil y fácil de hacer con MySQL Workbench .

    Otras herramientas para la revisión: