Original post: http://anothermysqldba.blogspot.com/2014/11/recover-lost-mysql-data-with.html
Cópia de segurança ... de backup ... backup ... mas é claro .. você também precisa monitorar e testar esses backups, muitas vezes de outra forma poderiam ser inútil. Tendo seus MySQL log binário habilitado pode certamente ajudá-lo em tempos de emergência também. Os log binário do MySQL são frequentemente referenciado em relação a replicação do MySQL, por uma boa razão, eles armazenam todas as consultas ou eventos que alteram dados ( baseados em linha é um pouco diferente, mas esta um exemplo). Os logs binários têm um impacto mínimo no desempenho do servidor quando se considera as opções de recuperação que prestam.
Portanto, este é apenas um exemplo simples usando mysqlbinlog para recuperar dados de um log binário e aplicá-lo de volta para o banco de dados.
Primeiro precisamos de algo a perder. Se algo estava para acontecer com o nosso banco de dados que precisa ser capaz de recuperar os dados ou talvez seja apenas uma forma de se recuperar de alguém erro.
Podemos fingir aqui e assumir que temos desenvolvedores / DBAs que não estão se comunicando muito bem e / ou salvar cópias de seu código.
Enquanto um procedimento é criado é mais tarde escrito por outra pessoa de forma incorreta.
A versão substituída do procedimento não está a gerar valores aleatórios como a equipe queria. O criador original do processo acabado de sair de frustração. Então o que fazer? Um pouco de tempo tem passado desde que foi criado também. Nós sabemos o nome do banco, nome da rotina e do período de tempo em geral, quando o procedimento incorreto foi criado e sorte para nós os logs bin ainda estão por aí, para que possamos ir buscá-la.
Temos de dar uma olhada geral em torno de uma vez que quer apenas um point-in-time-recuperação deste procedure.We acontecer para encontrar o procedimento e a posição no log binário antes e depois dele.
Recuperamos o nosso procedimento a partir do log binário via point-in-time-recuperação .
Este é um exemplo simples, mas é um exemplo das ferramentas que você pode usar a avançar.
É por isso que os logs binários são tão valiosos.
URL úteis:
Cópia de segurança ... de backup ... backup ... mas é claro .. você também precisa monitorar e testar esses backups, muitas vezes de outra forma poderiam ser inútil. Tendo seus MySQL log binário habilitado pode certamente ajudá-lo em tempos de emergência também. Os log binário do MySQL são frequentemente referenciado em relação a replicação do MySQL, por uma boa razão, eles armazenam todas as consultas ou eventos que alteram dados ( baseados em linha é um pouco diferente, mas esta um exemplo). Os logs binários têm um impacto mínimo no desempenho do servidor quando se considera as opções de recuperação que prestam.
[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 |
+---------------+-------+
Portanto, este é apenas um exemplo simples usando mysqlbinlog para recuperar dados de um log binário e aplicá-lo de volta para o banco de dados.
Primeiro precisamos de algo a perder. Se algo estava para acontecer com o nosso banco de dados que precisa ser capaz de recuperar os dados ou talvez seja apenas uma forma de se recuperar de alguém erro.
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 aqui e assumir que temos desenvolvedores / DBAs que não estão se comunicando muito bem e / ou salvar cópias de seu 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 |
+----+----------------------------+------------------+
Enquanto um procedimento é criado é mais tarde escrito por outra pessoa de forma incorreta.
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 |
+-----+-------------------+---------------------+
A versão substituída do procedimento não está a gerar valores aleatórios como a equipe queria. O criador original do processo acabado de sair de frustração. Então o que fazer? Um pouco de tempo tem passado desde que foi criado também. Nós sabemos o nome do banco, nome da rotina e do período de tempo em geral, quando o procedimento incorreto foi criado e sorte para nós os logs bin ainda estão por aí, para que possamos ir buscá-la.
Temos de dar uma olhada geral em torno de uma vez que quer apenas um point-in-time-recuperação deste procedure.We acontecer para encontrar o procedimento e a posição no log binário antes e depois dele.
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 o nosso procedimento a partir do log binário via point-in-time-recuperação .
Este é um exemplo simples, mas é um exemplo das ferramentas que você pode usar a avançar.
É por isso que os logs binários são tão valiosos.
URL úteis: