Comments 29
Израильский SQL сервер отвечает запросом на запрос.
-16
Тестируем новый тип бэкапа
Во-первых, что тут нового? Во-вторых, это не бэкап базы, а экспорт таблицы. Разница в наборе выгружаемых данных, целостности и штатной восстанавливаемости.
+4
1. Какой инструмент делает бэкап аналогично?
2. Это как бы тестовый скрипт, который проверяет концепцию. Или вы думаете сложно добавить запрос который делает запрос в MySQL для получение списка таблиц и других объектов? Тут основная фишка проверить насколько это быстро происходит. По сути он будет делать всё тоже, что и mysqldump только (те же запросы), только не будет приводить ответы сервера в текстовый вид. Что касается штатной восстанавливаемости, то да я писал об этом как об одном из недостатков, но тут уже нужно смотреть насколько плюсы метода будут превосходить этот недостаток.
2. Это как бы тестовый скрипт, который проверяет концепцию. Или вы думаете сложно добавить запрос который делает запрос в MySQL для получение списка таблиц и других объектов? Тут основная фишка проверить насколько это быстро происходит. По сути он будет делать всё тоже, что и mysqldump только (те же запросы), только не будет приводить ответы сервера в текстовый вид. Что касается штатной восстанавливаемости, то да я писал об этом как об одном из недостатков, но тут уже нужно смотреть насколько плюсы метода будут превосходить этот недостаток.
0
А Вы сшепшот файловой системы не пробывали делать?! А так велосипед имхо…
-1
Снепшоты это несколько другой тип бэкапа, это физический бэкап, а мой вариант это всё же логический, т.е. при восстановлении он заполняет базу обычными SQL запросами, кроме того есть возможность восстановление отдельных объектов из бэкапа, вплоть даже до отдельных строк таблицы (так как этот бэкап еще и значительно проще парсить, чем SQL-файл).
0
А процедуры из базы куда деваются при этом?
+2
А Вы разве не делаете отдельно бекап данных и структуры?
0
Процедуры точно также бэкапятся, просто вызвать SHOW CREATE PROCEDURE слишком быстрая и простая операция, поэтому не добавлял в тестовый скрипт.
0
Всё, что необходимо знать о бэкапах для MySQL давно уже находится здесь:
www.percona.com/live/mysql-conference-2013/sessions/backup-today-saves-you-tomorrow :)
www.percona.com/live/mysql-conference-2013/sessions/backup-today-saves-you-tomorrow :)
+1
И что? К примеру описанные в презентации mydumper и Xtrabackup появились относительно недавно, да и сам mysqldump изначально написан сторонним разработчиком.
0
Немного не по теме: никто не подскажет: есть ли утилиты для репликации mysql с горизонтальной/вертикальной фрагментацией? Стандартная репликация же позволяет только 1 к 1 копию получать.
0
стандартная репликация позволяет выборочно реплицировать таблицы. вы можете сделать шардирование, пользуясь разными таблицами
0
Вы в скрипт посмотрите что предлагается для скачивания :)
0
Я в своей практике использую Перконовскую xtrabackup (а также инкрементальный бекап).
В Амазон-облаке — RDS/EBS снапшоты. так проще.
В Амазон-облаке — RDS/EBS снапшоты. так проще.
0
> Основной недостаток способа, естественно, невозможность восстановления стандартными методами, т.е. нужен специальный скрипт для восстановления.
А о целостности данных он заботится? Что произойдёт, если во время бэкапа кто-то изменит таблицу? Есть ли опция, аналогичная --master-data mysqldump-а?
А о целостности данных он заботится? Что произойдёт, если во время бэкапа кто-то изменит таблицу? Есть ли опция, аналогичная --master-data mysqldump-а?
+1
По сути этот метод точно такой же как mysqldump, отправляет в MySQL те же самые запросы. Так что в этом плане он от mysqldump ничем не отличается. Основное отличие в том как он сохраняет результат выполнения этих запросов.
В случае mysqldump происходит следующее:
В таком варианте на этот самый разбор пакетов, экранирование и оформление в виде SQL уходит довольно много времени.
В предложенном мной варианте предлагается эти самые разбор пакетов, экранирование и оформление в виде SQL убрать на этап восстановления.
Получается так:
В случае 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 пакет
0
mysqldump как бы сначала делает либо LOCK TABLES, либо START TRANSACTION. Вы это делаете?
+1
А формат этого самого бинарного протокола неизменен (например от версии к версии)?
0
Сейчас используется клиент-серверный протокол версии 10, он не менялся с выхода MySQL 4.1. Бывают его расширения, как в последних версиях MySQL, так и в форках, той же MariaDB. Но они в основном касаются добавления новых команд, или каких-либо расширенных статусов выполнения команд.
В любом случае, во время начального хендшейка, клиент передает флаги возможностей которые клиент поддерживает, и если клиент не умеет обрабатывать новые фишки, то сервер просто не будет их передавать клиенту.
В любом случае, во время начального хендшейка, клиент передает флаги возможностей которые клиент поддерживает, и если клиент не умеет обрабатывать новые фишки, то сервер просто не будет их передавать клиенту.
0
Sign up to leave a comment.
Тестируем новый тип бэкапа MySQL