Как переместить базу данных с одного сервера на другой?
Как перенести таблицы MySQL с одного физического сервера на другой?
Например, этот точный сценарий: У меня есть сервер MySQL, который использует таблицу innodb и имеет размер около 20 ГБ.
Я хочу перенести его на новый сервер, что наиболее эффективный способ сделать это?
13 ответов
Мой любимый способ - передать команду sqldump команде sql. Вы можете делать все базы данных или конкретные. Так, например,
mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword
Вы можете делать все базы данных с помощью
mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver
Единственная проблема заключается в том, что база данных слишком велика, а труба обрушивается. В этом случае вы можете делать таблицы за столом или любые другие методы, упомянутые ниже.
Недавно я переместил базу данных на 30 ГБ со следующим stragegy:
Старый сервер
- Остановить сервер mysql
- Скопировать содержимое datadir в другой расположение на диске (
~ /mysqldata /*
) - Запустите сервер mysql снова (время простоя составляло 10-15 минут).
- сжатие данных (
tar -czvf mysqldata.tar.gz ~ /mysqldata
) - скопировать сжатый файл на новый сервер
Новый сервер
- установить mysql (не запускать)
- распаковать сжатый файл (
tar -xzvf mysqldata.tar.gz
) - перемещение содержимого mysqldata в datadir
- Убедитесь, что ваш innodb_log_file_size одинаковый на новом сервере, или если это не так, не копировать старые файлы журналов ( mysql создаст эти )
- Запустить mysql
Вам даже не нужен mysqldump, если вы перемещаете всю схему базы данных, и вы готовы остановить первую базу данных (поэтому она согласована при передаче)
- Остановить базу данных (или заблокировать ее)
- Перейдите в каталог, где находятся файлы данных mysql.
- Передать папку (и ее содержимое) в каталог данных mysql нового сервера
- Запустить резервную копию базы данных
- На новом сервере выполните команду «создать базу данных».
- Восстановить пользователей & предоставить разрешения.
Я не могу вспомнить, обрабатывает ли mysqldump пользователей и разрешения или просто данные ... но даже если это происходит, это way быстрее, чем выполнение дампа & запустив его. Я бы использовал это только в том случае, если мне нужно было сбрасывать базу данных mysql, чтобы затем повторно вставить в некоторые другие СУБД, если мне нужно было изменить параметры хранилища (innodb vs. myisam) или, может быть, я изменил основные версии mysql (но Я думаю, что я сделал это между 4 и 5, хотя)
В соответствии с Учебным пособием по тестированию MySQL 5.0 , глава 32, раздел 32.3.4 , Стр. 456,457 описывают Условия для двоичной переносимости , которые вызывают следующее:
Двоичная переносимость важна, если вы хотите взять двоичную резервную копию, которая была на одной машине и использовать ее на другая машина, имеющая архитектура. Например, используя двоичная резервная копия - один из способов копирования базы данных с одного сервера MySQL на другой.
Для MyISAM двоичная переносимость означает что вы можете напрямую копировать файлы для таблицы MyISAM из одного MySQL сервер к другому на другом машина, а второй сервер будет доступ к таблице.
Для InnoDB средства двоичной переносимости что вы можете напрямую скопировать файлы табличного пространства с сервера MySQL на одной машине на другой сервер на другая машина и вторая сервер сможет получить доступ к табличного пространства. По умолчанию все InnoDB хранятся таблицы, управляемые сервером вместе в табличном пространстве, поэтому переносимость табличного пространства является функция того, все ли отдельные Таблицы InnoDB переносимы. Если даже одна таблица не переносима, ни одна табличное пространство.
Таблицы MyISAM и табличные пространства InnoDB являются бинарными портами от одного хоста до другое, если выполняются два условия:
- Обе машины должны использовать целую арифметику с двумя дополнениями
- Обе машины должны использовать формат с плавающей запятой IEEE, иначе таблицы не должны содержать плавающей запятой столбцы (FLOAT или DOUBLE)
На практике эти два условия создают немного ограничение. Комплемента дополнительного код целочисленная арифметика и IEEE формат с плавающей запятой является нормой современное оборудование. Третье условие для Бинарная переносимость InnoDB заключается в том, что вы следует использовать строчные имена для таблиц и базы данных. Это потому, что InnoDB хранит эти имена внутренне (в своем словарь данных) в нижнем регистре Окна. Использование имен нижнего регистра позволяет бинарная переносимость между Windows и Unix, чтобы заставить использовать строчные буквы имен, вы можете поместить следующие строки в файле опций:
[туздЫ]
lower_case_table_names = 1
Если вы настроите InnoDB на использование для табличных табличных пространств, условий для бинарной переносимости распространяются на включить файлы .ibd для InnoDB таблицы. (Условия для общие табличные пространства все еще применяются потому что он содержит данные словарь, который хранит информацию о всех таблицах InnoDB.)
Если условия бинарной переносимости не удовлетворяются, вы можете скопировать MyISAM или InnoDB с одного сервера на другой, сбросив их с помощью некоторых текстовый формат (например, с mysqldump) и перезагружать их в целевого сервера.
Для перемещения отдельных таблиц существуют два основных способа, основанных на механизмах хранения.
В данном примере мы будем предполагать следующее:
- datadir is /var /lib /mysql
- , называемая mydb
- в базе данных mydb , называемой mytable .
Таблицы MyISAM
Если mydb.mytable использует механизм хранения MyISAM, таблица физически будет отображаться как три отдельных файла
- /var/lib/mysql/mydb/mytable.frm (файл .frm)
- /var/lib/mysql/mydb/mytable.MYD (файл .MYD)
- /var/lib/mysql/mydb/mytable.MYI (файл .MYI)
.frm содержит структуру таблицы
.MYD содержит данные таблицы
.MYI содержит индексную страницу таблицы
Эти файлы используются взаимозависимо для представления таблицы с логической точки зрения в mysql. Поскольку этот файл не имеет к нему никакой дополнительной логической связи, перенося таблицу с одного сервера БД на другой. Вы даже можете это сделать с сервера Windows на Linux Server или MacOS. Конечно, вы можете отключить mysql и скопировать 3 файла таблицы. Вы можете запустить следующее:
LOCK TABLES mydb.mytable READ;
SELECT SLEEP (86400);
РАЗБЛОКИРОВАТЬ ТАБЛИЦЫ;
в одном сеансе ssh, чтобы удерживать таблицу только как прочитанную и удерживать блокировку в течение 24 часов. Через секунду выполните копию в другой сессии ssh. Затем запустите сеанс mysql с помощью 24-часовой блокировки. Вам не нужно ждать 24 часа.
Таблицы InnoDB
Основываясь на вышеупомянутой цитате из книги по сертификации, существует множество факторов, которые определяют, как создавать резервные копии конкретной таблицы InnoDB. Для простоты, ясности и краткости просто выполните mysqldump нужной таблицы, используя параметры -single-transaction, чтобы иметь идеальный дамп времени в таблице. Не нужно зацикливаться на семантике InnoDB, если вам нужна только одна таблица. Вы можете перезагрузить этот файл dump на любой сервер MySQL вашего выбора.
Поскольку два вопроса были объединены здесь (jcolebrand): EDIT
Если вы более чем готовы жить с низкой производительностью DB, вы можете выполнить серию rsyncs со старого сервера (ServerA) на новый сервер (ServerB), даже если mysql все еще работает на сервере ServerA.
Шаг 01) установите ту же версию mysql на ServerB, что ServerA имеет
Шаг 02) На сервере ServerA запустите SET GLOBAL innodb_max_dirty_pages_pct = 0;
из mysql и около 10 минут (это очищает грязные страницы из пула буферов InnoDB, а также ускоряет выключение mysql быстрее). ваша база данных - это все MyISAM, вы можете пропустить этот шаг.
Шаг 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA: /var /lib /mysql ServerB: /var /lib /mysql
Шаг 04) Повторите шаг 03, пока rsync не займет менее 1 минуты
Шаг 05) служба mysql stop
на сервере ServerA
Шаг 06) Выполните еще один rsync
Шаг 07) scp ServerA: /etc/my.cnf ServerB: /etc /
Шаг 08) служба mysql start
на сервере
Шаг 08) service mysql start
на сервере ServerA (необязательно)
Дайте ему попробовать !!!
РИСКОВАННАЯ
Вы можете создать ведомость репликации, как это. Просто помните, что идентификатор сервера явно установлен в главном /etc/my.cnf и другом номере для id сервера в подчиненном /etc/my.cnf
Если вы просто хотите переместить конкретную таблицу, попробуйте:
mysqldump -u username -ppassword databasename tablename> databasename.tablename.sql
Вы можете указать другие имена таблиц выше, в той же команде. После завершения команды переместите файл databasename.tablename.sql на другой сервер, а затем восстановите его с помощью:
mysql -u username -ppassword databasename <databasename.tablename.sql
Обратите внимание, что обратный .sql-файл создается с помощью программы mysqldump , а восстановление выполняется непосредственно в mysql .
- Если у вас есть ssh-доступ, вы можете использовать mysqldump из командной строки
- Если у вас нет доступа ssh, но у вас есть доступ к phpMyAdmin, вы можете использовать его для экспорта /импорта
- Если у вас нет доступа к phpMyAdmin, есть некоторые полезные сценарии php, которые будут выгружать и импортировать (однако, исходя из моего собственного опыта, я никогда не находил такой надежный, как phpMyAdmin).
Возможно, такая возможность возникает, когда вы перемещаете фактические файлы базы данных (для моей установки они расположены в /var /lib /mysql), но я не понимаю, как это будет действовать /работать.
Вам понадобится время простоя. Это займет некоторое время, в зависимости от скорости вашей сети. Я собираюсь предположить, что вы используете MySQL на Linux /Unix. Вот что я использую:
- Остановите демон mysql на исходном узле.
- Создайте папку tmp на вашем целевом хосте для получения файлов.
- Используйте экран , чтобы сделать сеанс оболочки, который выдержит, если ваш ssh отключится.
- Используйте rsync для передачи файлов между хостами. Что-то вроде: rsync -avhP source user @ targethost: /path /to /folder /
- Запустите тестовые примеры, чтобы убедиться, что вы ничего не потеряли при передаче.
Затем выполните, как обычно, настройку локального MySQL.
* Примечание: вы также можете использовать параметр -c с rsync, чтобы добавить контрольную сумму к передаче, однако это будет чередой в зависимости от скорости процессора.
Я могу подтвердить, что метод DTest также работает для копирования между ubuntu и osx.
Чтобы скопировать все базы данных, не делая никаких демпинга или подобных:
Убедитесь, что у вас есть чистый mysql mysql (установлен dmg, загруженный из mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), что (ОЧЕНЬ ВАЖНО) никогда не запускался.
Скопируйте содержимое /var /lib /mysql /folder с устройства ubuntu поверх /usr /local /mysql /data /contents на mac. Чтобы получить доступ к папке на машине ubuntu, мне пришлось использовать sudo i.e.:
sudo cp /var /lib /mysql /home /foouser /mysql_data_folder
sudo chown -R foouser /home /foouser /mysql_data_folder
Я скопировал папку с помощью scp.
Прежде чем приступить к созданию копии папки mysql на Mac, убедитесь, что вы ничего не испортили.
После копирования папки выполните следующие действия на компьютере Mac:
sudo chown -R_mysql /usr /local /mysql /data /
sudo chgrp -R wheel /usr /local /mysql /data /
sudo chmod -R g + rx /usr /local /mysql /data /
Запустите сервер mysql в первый раз (с панели настроек в разделе «Системные настройки - gt; mysql»). Теперь все пользователи и базы данных должны быть настроены правильно.
Это работало с mysql 5.1.61 на ubuntu 64 бит 11.10 и mysql 5.1.63 на osx lion (macbook pro).
Я думаю, что все более ранние ответы, вероятно, работают нормально, но на самом деле не затрагивают проблему установки имени базы данных во время передачи.
Вот как я это сделал с bash:
Вам может быть полезно использовать rsync
, чем scp
, и не сжимать файл, если вы часто это делаете.
На моем исходном сервере:
me @ web: ~ $ d = участники
me @ web: ~ $ mysqldump $ d | gzip> $ d.sql.gz
me @ web: ~ $ scp -i .ssh /yourkeynamehere $ d.sql.gz $ sbox: $ d.sql.gz
На моем целевом сервере:
me @ sandbox: ~ $ d1 = members
me @ sandbox: ~ $ d2 = members_sb
me @ sandbox: ~ $ mysqladmin create $ d2
me @ sandbox: ~ $ cat $ d1.sql.gz | gunzip | mysql $ d2
На любой машине, чтобы увидеть прогресс:
me @ sandbox: ~ $ ls * .gz
me @ sandbox: ~ $ cat $ d.sql.gz | gunzip | Меньше
Все это предполагает, что файл конфигурации MySQL в вашем домашнем каталоге на обеих машинах и установите разрешения:
$ echo "
[Клиент]
Пользователь = drupal6
пароль = metoknow
хозяйничать = ord-mysql-001-sn.bananas.com
[MySQL]
database = nz_drupal "> .my.cnf
$ chmod 0600 ~ /.my.cnf
Общий метод linux:
/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf
отредактируйте datadir (и сокет) как для mysqld, так и для mysqld_safe (если применимо), чтобы указать на новое местоположение, затем
/etc/init.d/mysql start
Я разместил это, потому что никто, казалось, просто не перечислял наименьшее количество шагов для этого, и я считаю, что это самый простой способ лично.
Возможно, это лучший способ сделать это:
Версия 1 : копирование файлов данных (только для MYISAM)
ssh server1
служба mysql stop
cd $ mysql-data-dir
rsync -avz dirs-or-files server2: $ mysql-data-dir
служба mysql start
ssh server2 перезагрузка службы mysql
- Если ваши файлы базы данных доступны только для чтения, вы можете пропустить остановку сервера.
Версия 2 : mysqldump
Установите pigz - на современные процессоры Xeon или Opteron, особенно если у вас есть 2 или более процессора, он намного быстрее, чем gzip.
ssh server1
mysqldump ... | pigz> резервное копирование YYMDD.sql.gz
rsync backup-YYMDD.sql.gz сервер: местоположение
ssh server2
pigz -dc location /backup-YYMDD.sql.gz | mysql ..
Версия 3 : master /slave + mysqldump /file-copy
В среде HA вы должны использовать следующий трюк:
установочный подчиненный сервер & все резервные копии от него
перед резервными копиями - выполнять «ведомый останов»;
затем выполните версию 1 или версию 2
скрипт:
touch full.start
mysqladmin -h slave-db stop-slave
echo "показать статус подчиненного \ G" | mysql -h slave-db> ПОЛНЫЙ /comfi- $ NOW.master-позиции
/usr /bin /mysqldump -h slave-db --default-character-set = utf8 -A --opt --skip-lock-tables | pigz> "FULL /xxxx- $ NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end
ln -fs "FULL /XXXX- $ NOW.sql.gz" FULL.sql.gz
PS:
для копирования небольших таблиц:
ssh server1 таблица схем mysqldump | Схема ssh server2 mysql
Я бы предложил два простых шага для переноса всей базы данных с одного сервера на другой.
Шаг 1 : выполните полную резервную копию баз данных на исходном сервере с помощью mysqldump .
Шаг 2 . Вы можете использовать команду rsync для переноса всех баз данных на целевой сервер.