Возможно ли форк MySQL данных?

0

Я восстанавливаю базу данных mysql с perl на удаленном сервере с около 30 миллионами записей. Он принимает > 2 дня и смотрит на мои сетевые подключения. Я не полностью использую свою пропускную способность по восходящей линии связи. Мне нужно будет сделать это как минимум 1 раз в неделю. Есть ли способ разблокировать mysqldump (я использую perl), чтобы я мог использовать все преимущества моей пропускной способности (я не против, если я немного задохнулся... Мне просто нужно сделать это быстрее).

  • 0
    Узким местом почти наверняка является ваша база данных, а не передача по сети, поэтому выполнение двух одновременных передач вряд ли поможет.
Теги:
mysqldump

4 ответа

2
Лучший ответ

Не можете ли вы загрузить весь дамп на удаленный сервер и запустить там восстановление?

  • 0
    Ну, если бы я сделал это таким образом, я столкнулся бы с той же проблемой, когда я не в полной мере использую свою пропускную способность загрузки.
  • 1
    @ user522962: Пожалуйста, уточните: как пропускная способность загрузки не будет использоваться, если вы передадите файл?
Показать ещё 4 комментария
1

mk-parallel-dump и mk-parallel-restore разработаны делать то, что вы хотите, но в моем тестировании mk-parallel-dump был на самом деле медленнее обычного старого mysqldump. Ваш пробег может отличаться.

(я бы предположил, что самым большим фактором будет количество шпинделей, на которых хранятся ваши файлы данных, что в моем случае 1 не особенно благоприятствовало распараллеливанию.)

Первая оговорка: mk-parallel- * записывает кучу файлов и выясняет, когда безопасно начать их отправку (и когда вы их получите) может быть немного сложнее. Я считаю, что это было как упражнение для читателя, извините.

Вторая оговорка: mk-parallel-dump специально объявляется как не резервная копия. Потому что "Во время этого выпуска есть ошибка, которая предотвращает правильную работу -lock-таблиц", она действительно полезна только для баз данных, которые, как вы знаете, не будут меняться, например, подчиненный, на котором вы можете STOP SLAVE без каких-либо последствий, а затем START SLAVE после выполнения mk-parallel-dump.

Я думаю, что лучшим решением, чем распараллеливание дампа, может быть следующее:

Если вы делаете свой mysqldump еженедельно, вы можете просто сделать это один раз (сбрасывая с помощью -single-transaction (что вы должны делать в любом случае) и -master-data = n), а затем запустите slave, который подключается через туннель ssh к удаленному мастеру, поэтому ведомое устройство постоянно обновляется. Недостатком является то, что если вы хотите клонировать локальную копию (возможно, сделать резервную копию), вам понадобится достаточно свободного места для хранения дополнительной копии. Преимущество состоит в том, что журнал репликации на основе недели (на основе запросов), вероятно, немного меньше, чем повторная отправка данных, а также он поступает постепенно, поэтому вы не засоряете свою трубу.

  • 0
    к сожалению, я не могу настроить подчиненное устройство, поскольку у нас нет разрешений от удаленного хоста (общий хостинг)
1

Насколько велика ваша база данных? Какие таблицы вы используете?

Большой риск при резервном копировании с использованием mysqldump связан с блокировкой таблицы и обновлениями таблиц во время процесса резервного копирования.

Процесс резервного копирования mysqldump в основном работает следующим образом:

For each table {
   Lock table as Read-Only
   Dump table to disk
   Unlock table
}

Опасность состоит в том, что если вы запускаете запрос INSERT/UPDATE/DELETE, который влияет на несколько таблиц во время работы резервного копирования, ваша резервная копия может не правильно отображать результаты вашего запроса. Это очень реальный риск, когда для резервного копирования требуется несколько часов, и вы имеете дело с активной базой данных. Представьте себе - ваш код запускает ряд запросов, которые обновляют таблицы A, B и C. В процессе резервного копирования в настоящее время заблокирована таблица B.

  • Обновление до A не будет записано, так как эта таблица уже была скопирована.
  • Обновление для B не будет записано, поскольку в настоящее время таблица заблокирована для записи.
  • Обновление до C будет записано, потому что резервная копия еще не достигла C.

Это простой способ уничтожить ссылочную целостность в вашей базе данных.

Ваш процесс резервного копирования должен быть атомарным и транзакционным. Если вы не можете завершить всю базу данных для записи во время процесса резервного копирования, вы рискуете катастрофой.

Кроме того, здесь должно быть что-то не так. В предыдущей компании мы запускали ночные резервные копии DBG 450G Mysql (наибольшая таблица имела 150M строк), и для завершения резервного копирования потребовалось менее 6 часов.

Две мысли:

  • Есть ли у вас рабская база данных? Запустите резервную копию - остановите репликацию (предотвратите риск RW), запустите резервное копирование и перезапустите репликацию.
  • Используются ли ваши таблицы с помощью InnoDB? Рассмотрите возможность инвестирования в InnoDBhotbackup, который решает эту проблему, поскольку процесс резервного копирования использует журнал, который является частью механизма хранения InnoDB.
  • 0
    У меня нет подчиненного или InnoDB ... мой занимает больше времени, потому что наша реплицированная БД находится на удаленном сервере, и наша пропускная способность загрузки не очень высока
1

Восстановление mysqldump - это просто выполнение длинной серии команд, которые будут восстанавливать вашу базу данных с нуля. Если путь выполнения для этого; 1) отправить команду 2) удаленная система выполняет команду 3) удаленная система отвечает, что команда завершена; 4) отправить следующую команду, то вы тратите большую часть своего времени на ожидание сетевой задержки.

Я знаю, что большинство хостов SQL позволят вам загружать файл дампа специально, чтобы избежать того времени восстановления, о котором вы говорите. Компания, которая берет мои деньги каждый месяц, даже имеет веб-форму, которую вы можете использовать для восстановления базы данных из файла, который был загружен через sftp. Сотрясайте свою документацию по хостингу. У них должно быть что-то похожее. Если ничего больше (и вам удобно в командной строке), вы можете загрузить его прямо в свою учетную запись и сделать это из оболочки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню