2015-05-07 3 views
7

У меня есть несколько DDBB на InnoDB (MySQL 5.5.7. -FreeBSD). В течение 5 лет у меня нет никаких проблем. Я понимаю периодически проверять таблицы, оптимизировать, ...Через 5 лет несколько строк исчезли из таблицы mySQL innoDB

Загадоренно таблица одного из БД потеряла 20 строк из 70 (УДАЛИТЬ!). Эти строки были вставлены несколько лет назад. Никаких отношений между ними (случайные идентификаторы). Это очень маленький стол.

Я не нашел причину после нескольких часов исследований (и Google). Я восстановил информацию через последнюю резервную копию.

Я проверил:

WEB APP:

1) Приложение не имеет ВЕЬЕТЕ, только ВЫБРАТЬ или UPDATE.

2) Нет УДАЛИТЬСЯ НА КАСКАДЕ, без внешнего ключа.

2) Защищенный SQL INJECT.

3) Нет таблиц управления приложениями (как phpMysqlAdmin).

4) В моем журнале приложений нет попыток атаки или доступа в течение этих часов.

MYSQL:

1) Все проверки строк были сделаны непосредственно в консоли тузда без использования APP.

2) mysqlcheck: нет ошибки в затронутой таблице.

3) Mysqldump: нет дампа исчезающих строк, только оставшиеся строки.

4) Журнал ошибок: зарегистрированная ошибка отсутствует.

5) Файл table.idb не содержит потерянных записей, только оставшиеся строки.

6) Пользователь mysql доступен только локально (по IP).

SERVER:

1) Любой имеет доступ к серверу.

2) На HDD или на контроллере не было ошибок.

3) Я не вижу инцидентов в системных журналах.

Видимо, все правильно. Я не знаю, что произошло.

Я думаю, что из двух вариантов:

1) ошибка в MySQL 5.5.7 ???

2) В те часы, когда записи были потеряны, я делал импорт (по разной базе данных) миллионов INSERT и DELETE. Я не думаю, что этот интенсивный процесс повредил (без следа) другую таблицу в другой базе данных.

Я беспокоюсь, если это произойдет снова!

Спасибо!

ОБНОВЛЕНИЕ 1 @pala_ рекомендовал мне проконсультироваться с бункером (я не смотрел!).

В бункерном журнале 20 запросов со знаменитым DELETE!

Я вставить бен-журнал:

(...) 
BEGIN 
/*!*/; 
# at 83069675 
# at 83069772 
# at 83070746 
# at 83071672 
# at 83072677 
#150505 12:29:18 server id 168291 end_log_pos 83069772   Table_map: `affected_database`.`affected_table` mapped to number 583255 
#150505 12:29:18 server id 168291 end_log_pos 83070746   Delete_rows: table id 583255 
#150505 12:29:18 server id 168291 end_log_pos 83071672   Delete_rows: table id 583255 
#150505 12:29:18 server id 168291 end_log_pos 83072677   Delete_rows: table id 583255 
#150505 12:29:18 server id 168291 end_log_pos 83073123   Delete_rows: table id 583255 flags: STMT_END_F 
### DELETE FROM affected_database.affected_table 
### WHERE 
### @1=xxxxxxx 
### @2=xxxxxxxx 
### @3=xxxxxxxxxx 
### @4=xxxxxxxxx 
### @5=xxxxxxxxx 
### @6=xxxxxxxxx 
### @7=xxxxxxxxxx 
### @8=xxxxxxxxx 
### @9=xxxxxxxxxx 
### @10=xxxxxxxxxxxx 
### @11=xxxxxxxxxxx 
### @12=xxxxxxxxxxx 
### @13=xxxxxxxxxxx 
### @14=xxxxxxxxxxx 
### @15=xxxxxxxxxxx 
### @16=xxxxxxxxxxx 
### @17=xxxxxxxxxxx 
### @18=xxxxxxxxxxx 
### @19=xxxxxxxxxxx 
### @20=xxxxxxxxxxx 
### @21=xxxxxxxxxxx 
### @22=xxxxxxxxxxx 
### @23=xxxxxxxxxxx 
### @24=xxxxxxxxxxx 
### DELETE FROM affected_database.affected_table 
### WHERE 
(...) x20 

Как это работать?

Благодаря

+1

sql-server - это другая база данных для mysql - не помещайте ее, если она вам не нужна. у вас есть двоичный журнал включен? если это так, проверьте, чтобы увидеть, действительно ли строки были удалены с помощью запроса. –

+0

Вы быстро! Я редактировал, чтобы удалить тег, поскольку я видел ссылку на Microsoft SQL Server. Спасибо! – BeAsT

+1

помните, что оператор REPLACE INTO может удалять строки при конфликтующих с новыми значениями [replace-into-think-two] (http://code.openark.org/blog/mysql/replace-into-think-twice). Могли бы вы укажите структуру таблицы (если таковая имеется). – houssam

ответ

0

DELETE, кажется, на самом деле была запущена в соответствии с вами bin-log. Более случайные варианты (ошибка в MySQL, проблема во время несвязанного импорта (если это действительно не связано)), кажется, маловероятны.

Осталось 2 варианта: 1. «авторизованный», но неизвестный, например. в вашей кодовой базе есть код удаления, но вы просто не нашли его или кто-то с допустимым входом выполнял команду (вам не нужно приложение для этого как таковое, но вам нужен доступ к серверу, который позволяет регистрироваться в в вашу базу данных) 2. неавторизованный: кто-то получил доступ к вашей системе (и очистился), или кто-то нашел sql-injection

Очень сложно сказать, что наиболее вероятно. Из проверок, которые вы сделали, трудно сказать, насколько вы были внимательны, но как доступ к системе (без инцидентов), так и проблемы с кодом (защита от инъекций) сложно понять полностью. С другой стороны, если есть много людей с возможным доступом к системе, это действительно сложно решить.

Если вы действительно чувствуете, что это может случиться снова, возможно, вы должны включить general query log. Это даст вам намек на источник. Вы можете смотреть его каждый день и поворачивать его, чтобы он не становился слишком большим.

Если на вашем сервере возникли проблемы на уровне паранойи, вы можете попытаться сохранить свои журналы извне, в месте, где у вас есть доступ: это устранит любые доказательства несанкционированного доступа. Я еще не зашел так далеко.

Смежные вопросы