Обновление MySQL Database

У меня есть порт Belkin 4 дешевки KVM. Это довольно достойно, кроме каждых нескольких дней, это сходит с ума, и необходимо отключить его и разъем, это въезжает задним ходом снова.

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

6
задан 1 June 2009 в 17:19
5 ответов

При питании с файловой системой MySQL необходимо остановить сервер MySQL. Для предотвращения времени простоя на живой машине используйте копировать/виртуализировать машину с ТОЙ ЖЕ ВЕРСИЕЙ сервера MySQL. В то время как сервер MySQL BACKUP останавливается, скопируйте таблицы (я принимаю.FRM.MYI и т.д.?) в файловую систему в/var/lib/mysql/BACKUP_DB (соответствующий каталог BACKUP_DB).

Запустите сервер MySQL BACKUP и удостоверьтесь, что данные загрузили правильно сценарии использования или CLI. При проверке, mysqldump база данных BACKUP_DB, таким образом, она может быть загружена в живой сервер:

mysqldump --extended-insert BACKUP_DB > /root/sql/BACKUP_DB.sql

Вы теперь преобразовали свои необработанные данные резервного копирования в SQL-операторы, которые могут быть загружены в MySQL без времени простоя (в отличие от необработанных данных). Переместиться BACKUP_DB.sql к живой машине.

Импорт BACKUP_DB.sql в Ваш экземпляр MySQL LIVE как другая база данных:

mysql BACKUP_DB < /root/sql/BACKUP_DB.sql

Необходимо теперь загрузить резервную базу данных в MySQL как BACKUP_DB.

Теперь, зависящий от ВСТАВКИ ИГНОРИРУЮТ, или операторы REPLACE INTO (Вы перезаписываете старые данные или "заполняете пробелы" в Ваших индексах?):

mysqldump --no-create-db
--no-create-info --extended-insert --insert-ignore MERGE_SOURCE | mysql BACKUP_DB

Или, для ЗАМЕНЫ В действие:

mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' | mysql BACKUP_DB

С другой стороны, вместо того, чтобы передать вывод по каналу назад в MySQL, отправьте в файл и рассмотрите SQL-операторы.

mysqldump --no-create-db --no-create-info --extended-insert --insert-ignore MERGE_SOURCE > /root/sql/merge.sql
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' > /root/sql/merge.sql

Наконец, для предотвращения времени простоя выведите первую базу данных по второму:

mysqldump BACKUP_DB | mysql CURRENT_DB

Вы могли всегда блокировать базу данных сначала для предотвращения данных, записанных в (например), z таблицу с внешним ключом в таблица (который был уже переписан):

FLUSH TABLES WITH READ LOCK;

(выполните дамп как предыдущий шаг),

UNLOCK TABLES;

Добавьте команду FLUSH к запуску Вашего дампа .sql файл и РАЗБЛОКИРУЙТЕ в конец.

Обязательно увеличьтесь в четыре раза, проверяют Ваши имена DB в этот сценарий! Попросите, чтобы любой развил вопрос, в котором Вы не уверены, поскольку это - материал приготовления пюре данных высокого риска. Выполните (и отметьте подробно), точные шаги, требуемые на dev сервере, если это возможно, или, виртуализируют Ваш тест или создают мелкомасштабный тест. Просто тест. И, конечно, возьмите достаточно резервных копий для покрытия каждой возможности данных потерь.

7
ответ дан 3 December 2019 в 00:02
  • 1
    Определенно мой предпочтительный ответ за одним исключением: I' m не уверенный Вам нужен ' mysqldump - CURRENT_DB без данных | mysql BACKUP_DB' этап, как помещение файлов FRM/MYI от Вашего резервного копирования, должен уже сделать все таблицы/доступные данные. –  katriel 6 June 2009 в 17:48
  • 2
    Что, если существуют данные с тем же первичным ключом? –  David Pashley 9 June 2009 в 01:04
  • 3
    @David - относительно схемы, " Мы должны объединиться, более старое создало резервную копию database" подразумевает, что старая база данных является версией тока. По сути, живые первичные ключи / auto_increment нужно считать окончательными - иначе, какую версию данных Вы считаете авторитетными? Я не знаю ни о каком автоматизированном способе различать на на основание строки без явных столбцов TIMESTAMP и дальнейших сценариев. ВСТАВЬТЕ ИГНОРИРУЮТ, пропустит конфликтующие ключи, ЗАМЕНА В перезаписывает их - первый функционально эквивалентен ИЗБРАННОЙ ВСТАВКЕ на пустом первичном ключе без необходимых предварительных знаний ключей. –  Andy 9 June 2009 в 13:40
  • 4
    Если Вы перезапустили базу данных, won' t это снижает систему (хотя это может быть с 1-x секунд)? –  Niko Gunadi 10 June 2009 в 03:00
  • 5
    @Niko you' корректное ре, время простоя неизвестно; я исправил свой ответ для предотвращения перезапуска сервера –  Andy 10 June 2009 в 13:57

Настройте репликацию и переключите сервер БД для работы в режиме ведомого устройства, когда это будет готово, и хорошо протестированное (!!!).

Если у Вас нет некоторых технических ограничений для выполнения этого, это - только допустимый вариант (я подразумеваю, что необходимо смочь протестировать изменения прежде, чем поместить их в 24/7 среду).

3
ответ дан 3 December 2019 в 00:02
  • 1
    +1. Это является самым легким и наименьшее количество подверженного ошибкам способа сделать это. –  Milan Babuškov 8 June 2009 в 20:34

Принятие Вас имеет дисковое пространство, я настроил базу данных миграции и копирую/объединяю данные в в них. Настройте копию своей веб-среды, чтобы соединиться с базой данных миграции и протестировать ее полностью. Затем, после того как Вы счастливы, строки подключения изменения на Вашей продуктивной среде для рассмотрения новой миграции DB.

2
ответ дан 3 December 2019 в 00:02
  • 1
    Я думаю I' d представляют пару минут запланированного времени простоя - иначе у Вас есть небольшое состояние состязания между синхронизацией этих двух баз данных и переключением информации о соединении в приложении. You' d теряют любые (потенциально критические) изменения, которые были внесены между прямо здесь. –  hark 1 June 2009 в 17:48

можно использовать-T опцию mysqldump произвести таблицы как tab-separated-values. Затем создайте копию живого DB, как Kyle предполагает. Затем используйте mysqlimport, чтобы повторно импортировать данные в живую копию и протестировать его там. Когда Вы будете готовы переключиться от живого до живой копии, необходимо будет получить некоторое время простоя.

Я не попробовал это сам так Принцип "качество на риск покупателя".

1
ответ дан 3 December 2019 в 00:02

Для этого примера давайте предположим, что Вашу базу данных называют "крутым поворотом", и Вашу сохраненную базу данных называют "zig_backup". Я также предположу, что Ваша резервная база данных и Ваша живая база данных имеют ту же схему.

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

Проблемы для знания:

  • Потенциал для индексов или первичных ключей в старом/новом для конфликта по некоторым причинам (обычно, если ошибка была сделана, или записи, были потеряны случайно),
  • Удаления, которые произошли начиная с резервного копирования, не должны быть "объединены"

Процесс для обновления потребует планирования, с точки зрения который таблицы для слияния сначала и которые можно объединиться в последний раз. Моя общая тенденция к сделать тяжелый подъем сначала (большие таблицы), затем проложите себе путь на меньшие таблицы. В зависимости от Ваших размеров данных это не может иметь значения.

Процесс для слияния затем был бы:

  1. Восстановите резервную базу данных рядом с живой базой данных с измененным именем базы данных (например, "zig_backup")
  2. Для каждой таблицы в живой базе данных объединитесь от резервной базы данных
  3. Для каждой таблицы в резервной базе данных проверьте, чтобы видеть, существует ли таблица в живой базе данных, и в противном случае добавьте его.

Самый безопасный метод должен был бы сделать соединение полной таблицы и просто вставить строки, которые не соответствуют:

for each table in the "live" database:
    INSERT INTO zig.$table
    SELECT BACKUP.* FROM zig_backup.$table AS BACKUP
    LEFT OUTER JOIN zig.$table AS LIVE ON LIVE.ID=BACKUP.ID
    WHERE LIVE.ID IS NULL;

Это, конечно, требует знания первичных ключей каждой таблицы. Прямая "ЗАМЕНА" не может работать, поскольку строки в живой базе данных, возможно, изменились, и их измененные данные будут перезаписаны

Для слияния недостающих таблиц сделайте:

\u zig_backup
SHOW TABLES

Чтобы получить список всех таблиц и определить, существует ли таблица в живой базе данных, можно сделать:

\u zig
SHOW TABLES LIKE 'tablename';

С другой стороны, таблица в резервной базе данных, которая не существует в "живой" базе данных, может быть двоичная скопированный в живой каталог базы данных.

Наконец, обрабатывающие удаления от "живой" базы данных являются трудными в лучшем случае тем более, что тем, что Вы объединяете те некоторые данные, отсутствует по той или иной причине.

5
ответ дан 3 December 2019 в 00:02
  • 1
    +1, поскольку это - единственный ответ, который полагает, что в базах данных могли бы быть противоречивые данные. –  David Pashley 9 June 2009 в 01:03

Теги

Похожие вопросы