Во-первых, что тут нового? Во-вторых, это не бэкап базы, а экспорт таблицы. Разница в наборе выгружаемых данных, целостности и штатной восстанавливаемости.
1. Какой инструмент делает бэкап аналогично?
2. Это как бы тестовый скрипт, который проверяет концепцию. Или вы думаете сложно добавить запрос который делает запрос в MySQL для получение списка таблиц и других объектов? Тут основная фишка проверить насколько это быстро происходит. По сути он будет делать всё тоже, что и mysqldump только (те же запросы), только не будет приводить ответы сервера в текстовый вид. Что касается штатной восстанавливаемости, то да я писал об этом как об одном из недостатков, но тут уже нужно смотреть насколько плюсы метода будут превосходить этот недостаток.
Снепшоты это несколько другой тип бэкапа, это физический бэкап, а мой вариант это всё же логический, т.е. при восстановлении он заполняет базу обычными SQL запросами, кроме того есть возможность восстановление отдельных объектов из бэкапа, вплоть даже до отдельных строк таблицы (так как этот бэкап еще и значительно проще парсить, чем SQL-файл).
В чем конкретно претензия? Или Вы просто из-за комплексов решили самоутвердиться путем оскорбления других? Ну тогда в какой-то детсадовский форум, а не на Хабр :)
И что? К примеру описанные в презентации mydumper и Xtrabackup появились относительно недавно, да и сам mysqldump изначально написан сторонним разработчиком.
Немного не по теме: никто не подскажет: есть ли утилиты для репликации mysql с горизонтальной/вертикальной фрагментацией? Стандартная репликация же позволяет только 1 к 1 копию получать.
Мне надо бы, как в MS SQL, выбрать строки/столбцы из существующей таблицы по определенному критерию, типа WHERE. В одном месте хранится полный набор данных, в другом — частичный.
> Основной недостаток способа, естественно, невозможность восстановления стандартными методами, т.е. нужен специальный скрипт для восстановления.
А о целостности данных он заботится? Что произойдёт, если во время бэкапа кто-то изменит таблицу? Есть ли опция, аналогичная --master-data mysqldump-а?
По сути этот метод точно такой же как mysqldump, отправляет в MySQL те же самые запросы. Так что в этом плане он от mysqldump ничем не отличается. Основное отличие в том как он сохраняет результат выполнения этих запросов.
В случае mysqldump происходит следующее:
mysqldump с помощью libmysql делает SELECT * FROM table (используется команда COM_QUERY);
сервер отвечает, сначала приходит описание столбцов, потом пакет EOF, а дальше идут уже сами данные в текстовом протоколе, т.е. в каждом пакете одна строка, сами поля в виде LengthEncodedString (для каждого поля сначала указывается размер), также числа из бинарного вида переводятся в текстовый;
libmysql разбирает каждый пакет и отдает в mysqldump уже строку в виде массива полей
mysqldump в зависимости от типа экранирует каждое поле и оформляет каждую строку в виде SQL запроса (в минимальном виде, это заключение в скобки с разделителем запятой)
ну и после этого уже запись в файл
повторяем пункт 3
В таком варианте на этот самый разбор пакетов, экранирование и оформление в виде SQL уходит довольно много времени.
В предложенном мной варианте предлагается эти самые разбор пакетов, экранирование и оформление в виде SQL убрать на этап восстановления.
Получается так:
делаем запрос SELECT * FROM table напрямую к серверу, при этом используем не COM_QUERY, а COM_STMT_PREPARE и COM_STMT_EXECUTE (этот вариант быстрее);
разбираем описание столбцов, а сами данные уже приходят в ProtocolBinary::ResultsetRow (в таком виде цифры не преобразуются к тестовому виду, а также NULL поля в виде битовой карты передаются), в общем это быстрее и компактнее;
пишем пакеты полученные из сокета сразу в файл, без малейших преобразований, до тех пор пока не увидим EOF пакет
В данном тестовом скрипте нет, так как задача этого скрипта проверить идею, а в конечном продукте естественно будет блокировка. У mysqldump же открытые исходники, так что не проблема выполнять те же запросы.
Сейчас используется клиент-серверный протокол версии 10, он не менялся с выхода MySQL 4.1. Бывают его расширения, как в последних версиях MySQL, так и в форках, той же MariaDB. Но они в основном касаются добавления новых команд, или каких-либо расширенных статусов выполнения команд.
В любом случае, во время начального хендшейка, клиент передает флаги возможностей которые клиент поддерживает, и если клиент не умеет обрабатывать новые фишки, то сервер просто не будет их передавать клиенту.
Тестируем новый тип бэкапа MySQL