Pull to refresh

Comments 29

Израильский SQL сервер отвечает запросом на запрос.
Тестируем новый тип бэкапа

Во-первых, что тут нового? Во-вторых, это не бэкап базы, а экспорт таблицы. Разница в наборе выгружаемых данных, целостности и штатной восстанавливаемости.
1. Какой инструмент делает бэкап аналогично?
2. Это как бы тестовый скрипт, который проверяет концепцию. Или вы думаете сложно добавить запрос который делает запрос в MySQL для получение списка таблиц и других объектов? Тут основная фишка проверить насколько это быстро происходит. По сути он будет делать всё тоже, что и mysqldump только (те же запросы), только не будет приводить ответы сервера в текстовый вид. Что касается штатной восстанавливаемости, то да я писал об этом как об одном из недостатков, но тут уже нужно смотреть насколько плюсы метода будут превосходить этот недостаток.
А Вы сшепшот файловой системы не пробывали делать?! А так велосипед имхо…
Снепшоты это несколько другой тип бэкапа, это физический бэкап, а мой вариант это всё же логический, т.е. при восстановлении он заполняет базу обычными SQL запросами, кроме того есть возможность восстановление отдельных объектов из бэкапа, вплоть даже до отдельных строк таблицы (так как этот бэкап еще и значительно проще парсить, чем SQL-файл).
А Вы разве не делаете отдельно бекап данных и структуры?
xtrabackup это физический бэкап, а рассмотренный в теме бэкап это, как ускоренный mysqldump.
Откуда такие придурки берутся? :))))))))))))))))))
В чем конкретно претензия? Или Вы просто из-за комплексов решили самоутвердиться путем оскорбления других? Ну тогда в какой-то детсадовский форум, а не на Хабр :)
Процедуры точно также бэкапятся, просто вызвать SHOW CREATE PROCEDURE слишком быстрая и простая операция, поэтому не добавлял в тестовый скрипт.
И что? К примеру описанные в презентации mydumper и Xtrabackup появились относительно недавно, да и сам mysqldump изначально написан сторонним разработчиком.
Я хотел сказать, что наличие старых инструментов, не означает, что не нужно разрабатывать новые :)
Немного не по теме: никто не подскажет: есть ли утилиты для репликации mysql с горизонтальной/вертикальной фрагментацией? Стандартная репликация же позволяет только 1 к 1 копию получать.
стандартная репликация позволяет выборочно реплицировать таблицы. вы можете сделать шардирование, пользуясь разными таблицами
Мне надо бы, как в MS SQL, выбрать строки/столбцы из существующей таблицы по определенному критерию, типа WHERE. В одном месте хранится полный набор данных, в другом — частичный.

Вы в скрипт посмотрите что предлагается для скачивания :)
И что там? Это же не готовый скрипт, а так сказать демонстратор технологии.
Я в своей практике использую Перконовскую xtrabackup (а также инкрементальный бекап).
В Амазон-облаке — RDS/EBS снапшоты. так проще.
> Основной недостаток способа, естественно, невозможность восстановления стандартными методами, т.е. нужен специальный скрипт для восстановления.

А о целостности данных он заботится? Что произойдёт, если во время бэкапа кто-то изменит таблицу? Есть ли опция, аналогичная --master-data mysqldump-а?
По сути этот метод точно такой же как mysqldump, отправляет в MySQL те же самые запросы. Так что в этом плане он от mysqldump ничем не отличается. Основное отличие в том как он сохраняет результат выполнения этих запросов.

В случае mysqldump происходит следующее:

  1. mysqldump с помощью libmysql делает SELECT * FROM table (используется команда COM_QUERY);
  2. сервер отвечает, сначала приходит описание столбцов, потом пакет EOF, а дальше идут уже сами данные в текстовом протоколе, т.е. в каждом пакете одна строка, сами поля в виде LengthEncodedString (для каждого поля сначала указывается размер), также числа из бинарного вида переводятся в текстовый;
  3. libmysql разбирает каждый пакет и отдает в mysqldump уже строку в виде массива полей
  4. mysqldump в зависимости от типа экранирует каждое поле и оформляет каждую строку в виде SQL запроса (в минимальном виде, это заключение в скобки с разделителем запятой)
  5. ну и после этого уже запись в файл
  6. повторяем пункт 3


В таком варианте на этот самый разбор пакетов, экранирование и оформление в виде SQL уходит довольно много времени.

В предложенном мной варианте предлагается эти самые разбор пакетов, экранирование и оформление в виде SQL убрать на этап восстановления.

Получается так:

  1. делаем запрос SELECT * FROM table напрямую к серверу, при этом используем не COM_QUERY, а COM_STMT_PREPARE и COM_STMT_EXECUTE (этот вариант быстрее);
  2. разбираем описание столбцов, а сами данные уже приходят в ProtocolBinary::ResultsetRow (в таком виде цифры не преобразуются к тестовому виду, а также NULL поля в виде битовой карты передаются), в общем это быстрее и компактнее;
  3. пишем пакеты полученные из сокета сразу в файл, без малейших преобразований, до тех пор пока не увидим EOF пакет
mysqldump как бы сначала делает либо LOCK TABLES, либо START TRANSACTION. Вы это делаете?
В данном тестовом скрипте нет, так как задача этого скрипта проверить идею, а в конечном продукте естественно будет блокировка. У mysqldump же открытые исходники, так что не проблема выполнять те же запросы.
А формат этого самого бинарного протокола неизменен (например от версии к версии)?
Сейчас используется клиент-серверный протокол версии 10, он не менялся с выхода MySQL 4.1. Бывают его расширения, как в последних версиях MySQL, так и в форках, той же MariaDB. Но они в основном касаются добавления новых команд, или каких-либо расширенных статусов выполнения команд.

В любом случае, во время начального хендшейка, клиент передает флаги возможностей которые клиент поддерживает, и если клиент не умеет обрабатывать новые фишки, то сервер просто не будет их передавать клиенту.
Sign up to leave a comment.

Articles