Дмитрий DarkByte Москин

Мой блог, да.
logo

SQL sharding - RuCTF 2012 Quals

Опубликовано 18.03.2012 автором Дмитрий Москин
SQL sharding [admin] / 300 баллов
На данный момент описание таска не доступно, поэтому пишу по памяти.
В компании было 4 mysql сервер, между которыми данные разделялись по определённому алгоритму, зависимому от первичного ключа таблицы. X - число серверов, ID - первичный ключ. Сервер выбирался по формуле ID % X. Затем был добавлен ещё один сервер, но формулу не изменили и данные неправильно распределились по таблицам. Необходимо разместить данные по серверам так, как они должны быть. IP1, IP2, IP3, IP4, IP5, Pass1, Pass2, Pass3, Pass4, Pass5


В данном задании было несколько ошибок. Сначала IP4 был равен IP5, поэтому было доступно всего 4 сервера из пяти. После исправления этой проблемы, добавили новый IP, но разместили его не в правильном месте и получилось так, что к серверу IP4 подходил пароль Pass5, а к IP5 пароль Pass4. Об этой проблеме я тоже сообщал, но мне сказали, что всё нормально. Ну и ладно, решению это не мешает.

Самым простым методом, который пришёл в голову, был дамп данных со всех 5 серверов, импорт их на локальный сервер в одну базу и последующее извлечение с учётом новой формулы. Учитывая то, что попутно с исправлением последней проблемы, мой аккаунт вдруг покинул мою команду и вернулся обратно только спустя час, я особо не заморачивался, создал по 5 дубликатов каждой таблицы и составил ручками запросы:
INSERT INTO concerts_copy0 SELECT * FROM concerts WHERE (cid mod 5)=0;
INSERT INTO concerts_copy1 SELECT * FROM concerts WHERE (cid mod 5)=1;
INSERT INTO concerts_copy2 SELECT * FROM concerts WHERE (cid mod 5)=2;
INSERT INTO concerts_copy3 SELECT * FROM concerts WHERE (cid mod 5)=3;
...
INSERT INTO users_copy2 SELECT * FROM users WHERE (uid mod 5)=2;
INSERT INTO users_copy3 SELECT * FROM users WHERE (uid mod 5)=3;
INSERT INTO users_copy4 SELECT * FROM users WHERE (uid mod 5)=4;

Выполнил их и выгрузил получившиеся таблицы в 5 файлов, который из которых был предназначен для конкретной базы. Импортировал их в базы данных из задания и на этом закончил выполнение задания, ибо чекер, который должен был проверить правильность выполнения задания, так же был написан с ошибкой и поэтому даже на правильное решение говорил, что оно не правильное. Через 8 часов я повторно нажал кнопку "Отправить" на странице с заданием и оно выполнилось, но за это время таск успели решить ещё две команды.