Mysql Новый тип бэкапа MySQL

vovanium

Новичок
Бэкапы MySQL бывают 2 основных разновидностей это:

Логический бэкап

Создается текстовый дамп из SQL-запросов, как в mysqldump или Sypex Dumper.

Физический бэкап

Делаются точные копии файлов таблиц, типичный представитель mysqlhotcopy, xtrabackup.

Sypex MySQL RAW бэкап

При анализе логических способов бэкапа было замечено, что основная потеря скорости происходит при получении пакетов данных от сервера, разборе их и преобразовании к текстовому формату. К тому же этот разбор обычно делается libmysql либо в случае новых PHP-версий mysqlnd, и приводит к дополнительному оверхеду.

Поэтому решил попробовать избавиться от лишних преобразований, и написал тестовый скрипт который подключается напрямую к MySQL (по TCP или к UNIX-сокету) без использования стандартных MySQL-драйверов. Скрипт сохраняет в файл данные в виде бинарных пакетов полученных от MySQL-сервера. Таким образом не тратится время на разбор пакетов, полей, экранирование данных. А разбор пакетов и формирование SQL-запросов происходит уже при восстановлении бэкапа.

В итоге скорость бэкапа многократно увеличилась, в зависимости от структуры таблицы. Также дампы весьма компактны. Можно сравнить скорость RAW бэкапа, с бэкапом с помощью mysqldump и SELECT… INTO OUTFILE.

Несколько результатов выполнения на стандартных таблицах форумов IPB и phpBB.



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

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

О результатах отписывайтесь в комментах. Только учтите, что SELECT… INTO OUTFILE работает только на localhost, плюс у MySQL пользователя должны быть права доступа FILE и у каталога backup должны быть выставлены права доступа 777.
 

rukhem

Новичок
нука нука
1. mysqldump всегда меньше чем бинарные файлы которые делает xtrabackup потому что в бинарных файлах есть индексы...
2. хорошо вы подключились к сокету и как вы данные оттуда берете ? можно поподробнее ?
3. когда ваш волшебный скрипт делает бекап - вся база лочится ? как обеспечивается консистентность данных ?
 

rukhem

Новичок
Дальше ваш скрипт работает в "броузере" и каково значение в php.ini max_execution time ? ась ?
удалите пост не позорьтесь :)
 

vovanium

Новичок
1. Ну это в принципе зависит от типа таблицы, но согласен если бэкапить с индексами будет больше.
2. Используется MySQL Client/Server Protocol т.е. в принципе для бэкапа используется те же запросы, что и в mysqldump, но в отличии от него разбор пакетов, происходит при восстановлении, а не при бэкапе, за счет этого экономится время. Так как обычно бэкап делается значительно чаще, чем восстановление данных, то получается значительная экономия. Да и лочатся данные на меньшее время.
3. Лочатся таблицы, так же как в mysqldump, и консистентность данных также обеспечивается. Т.е. основное нововведение только в том, как получаются и сохраняются данные полученные от сервера.

К тому же используется ProtocolBinary::Resultset, в котором числа не преобразуются в человекопонятный вид, он заметно быстрее ProtocolText::Resultset, особенно когда в таблице много колонок с числами.

Ну и при восстановлении, данные будут заливать используя LOAD DATA LOCAL INFILE при наличии соответствующих прав у пользователя, либо обычными INSERT запросами. Также за счет того, что бинарный формат значительно проще парсится, можно даже сделать восстановление отдельных записей из таблицы.
 
Последнее редактирование:

vovanium

Новичок
Дальше ваш скрипт работает в "броузере" и каково значение в php.ini max_execution time ? ась ?
То есть вы всерьез думаете, что я разобрался с работой на низком уровне с MySQL сервером (т.е. этот скрипт будет бэкапить MySQL даже если в PHP не включена поддержка MySQL), и при этом не в курсе о наличии max_execution_time, или о том как эти ограничения можно обходить?
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба

rukhem

Новичок
какой максимальный объем базы был забекаплен этим чудом ?
и сколько времени длился бекап ? :)
 

vovanium

Новичок
Целевая аудитория, тащем-та, довольно четко обозначена
Целевая аудитория в принципе такая же, как у тех кто использует mysqldump. PHP скрипты прекрасно запускаются из консоли или крона.
 

fixxxer

К.О.
Партнер клуба
rukhem, основная проблема, пожалуй, это отсутствие проверок на длину результата при использовании socket-функций.

До кодстайла тестового скрипта я бы не стал докапываться :)
 

rukhem

Новичок
То есть вы всерьез думаете, что я разобрался с работой на низком уровне с MySQL сервером (т.е. этот скрипт будет бэкапить MySQL даже если в PHP не включена поддержка MySQL), и при этом не в курсе о наличии max_execution_time, или о том как эти ограничения можно обходить?
Тоесть ваш скрипт бекапа надо запускать в браузере ?
 

rukhem

Новичок
rukhem, основная проблема, пожалуй, это отсутствие проверок на длину результата при использовании socket-функций.

До кодстайла тестового скрипта я бы не стал докапываться :)
Я ради интереса глянул
там значит в корне index.php:

Код:
<?php
header('Content-type: text/html; charset=utf-8');
и какже бекапитьто без css :))))
 

rukhem

Новичок
Как курсовая - покопаться - молодец.
Как практичное приложение и "смотрите какой я умный.... я гений..." - полное говно :D вещи надо называть своими именами.
 

vovanium

Новичок
основная проблема, пожалуй, это отсутствие проверок на длину результата при использовании socket-функций.
Это же концепт, а не конечный вариант :) Мне вообще интересно тесты на разных системах, чтобы понять стоит ли развивать тему.
 

vovanium

Новичок
какой максимальный объем базы был забекаплен этим чудом ?
и сколько времени длился бекап ?
Пока самое большое тестил до 1,3 ГБ, одну из таблиц wikipedia.


И таблицу GeoNames чуть больше 1 ГБ

Я же как бы для того и выложил, чтобы народ попробовал, получить фидбек.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
vovanium, главное, потом не забыть - оно при таком размере пакета будет вылезать редко, но метко.

Вообще, это частая ошибка - забывать о том, что сокет это не файл, и имеет полное право возвращать хоть по одному символу за вызов.
 

vovanium

Новичок
главное, потом не забыть - оно при таком размере пакета будет вылезать редко, но метко.
Про это в курсе, в том числе на практике. Потому пока socket_read используется, и не используются неблокирующие сокеты. Так как в дальнейшем планируется открывать несколько соединений с MySQL и бэкапить параллельно, как в том же mydumper, таким образом скорость еще увеличится. Так как в принципе по большей части скорость упирается в MySQL и скорость диска. В то время как при работе mysqldump больше нагрузка именно на него.
 

fixxxer

К.О.
Партнер клуба
Не уверен, что параллельно всегда будет быстрее - можно наоборот словить лишние seek-и.

Я же как бы для того и выложил, чтобы народ попробовал
Сделал бы cli, больше бы попробовали. Возиться с прописыванием виртуалхоста и запускать через браузер - это адски лениво и вообще глупое занятие, самому патчить лень тоже. Я понимаю, что таргет-группа, на которую твои продукты нацелены, это в основном клиентура с cms-ками и шаредами, но тут немного иная аудитория в основном.
 
Сверху