Как переместить базу данных с одного сервера на другой?

Как перенести таблицы MySQL с одного физического сервера на другой?

Например, этот точный сценарий: У меня есть сервер MySQL, который использует таблицу innodb и имеет размер около 20 ГБ.

Я хочу перенести его на новый сервер, что наиболее эффективный способ сделать это?

118 голосов | спросил John 4 Jpm1000000pmTue, 04 Jan 2011 18:38:47 +030011 2011, 18:38:47

13 ответов


71

Мой любимый способ - передать команду sqldump команде sql. Вы можете делать все базы данных или конкретные. Так, например,

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword

Вы можете делать все базы данных с помощью

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver

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

ответил David Hall 4 Jpm1000000pmTue, 04 Jan 2011 19:09:47 +030011 2011, 19:09:47
56

Недавно я переместил базу данных на 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
ответил Derek Downey 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 03:58:51 +0400 2011, 03:58:51
29

Вам даже не нужен mysqldump, если вы перемещаете всю схему базы данных, и вы готовы остановить первую базу данных (поэтому она согласована при передаче)

  1. Остановить базу данных (или заблокировать ее)
  2. Перейдите в каталог, где находятся файлы данных mysql.
  3. Передать папку (и ее содержимое) в каталог данных mysql нового сервера
  4. Запустить резервную копию базы данных
  5. На новом сервере выполните команду «создать базу данных».
  6. Восстановить пользователей & предоставить разрешения.

Я не могу вспомнить, обрабатывает ли mysqldump пользователей и разрешения или просто данные ... но даже если это происходит, это way быстрее, чем выполнение дампа & запустив его. Я бы использовал это только в том случае, если мне нужно было сбрасывать базу данных mysql, чтобы затем повторно вставить в некоторые другие СУБД, если мне нужно было изменить параметры хранилища (innodb vs. myisam) или, может быть, я изменил основные версии mysql (но Я думаю, что я сделал это между 4 и 5, хотя)

ответил Joe 4 Jpm1000000pmTue, 04 Jan 2011 19:38:25 +030011 2011, 19:38:25
26

В соответствии с Учебным пособием по тестированию 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) и перезагружать их в   целевого сервера.

Для перемещения отдельных таблиц существуют два основных способа, основанных на механизмах хранения.

В данном примере мы будем предполагать следующее:

  1. datadir is /var /lib /mysql
  2. , называемая mydb
  3. в базе данных mydb , называемой mytable .

Таблицы MyISAM

Если mydb.mytable использует механизм хранения MyISAM, таблица физически будет отображаться как три отдельных файла

  1. /var/lib/mysql/mydb/mytable.frm (файл .frm)
  2. /var/lib/mysql/mydb/mytable.MYD (файл .MYD)
  3. /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

ответил RolandoMySQLDBA 23 Maypm11 2011, 22:12:15
12

Если вы просто хотите переместить конкретную таблицу, попробуйте:

mysqldump -u username -ppassword databasename tablename> databasename.tablename.sql

Вы можете указать другие имена таблиц выше, в той же команде. После завершения команды переместите файл databasename.tablename.sql на другой сервер, а затем восстановите его с помощью:

mysql -u username -ppassword databasename <databasename.tablename.sql

Обратите внимание, что обратный .sql-файл создается с помощью программы mysqldump , а восстановление выполняется непосредственно в mysql .

ответил StanleyJohns 25 Maypm11 2011, 23:52:23
7
  1. Если у вас есть ssh-доступ, вы можете использовать mysqldump из командной строки
  2. Если у вас нет доступа ssh, но у вас есть доступ к phpMyAdmin, вы можете использовать его для экспорта /импорта
  3. Если у вас нет доступа к phpMyAdmin, есть некоторые полезные сценарии php, которые будут выгружать и импортировать (однако, исходя из моего собственного опыта, я никогда не находил такой надежный, как phpMyAdmin).

Возможно, такая возможность возникает, когда вы перемещаете фактические файлы базы данных (для моей установки они расположены в /var /lib /mysql), но я не понимаю, как это будет действовать /работать.

ответил poelinca 4 Jpm1000000pmTue, 04 Jan 2011 18:44:38 +030011 2011, 18:44:38
5

Вам понадобится время простоя. Это займет некоторое время, в зависимости от скорости вашей сети. Я собираюсь предположить, что вы используете MySQL на Linux /Unix. Вот что я использую:

  1. Остановите демон mysql на исходном узле.
  2. Создайте папку tmp на вашем целевом хосте для получения файлов.
  3. Используйте экран , чтобы сделать сеанс оболочки, который выдержит, если ваш ssh отключится.
  4. Используйте rsync для передачи файлов между хостами. Что-то вроде: rsync -avhP source user @ targethost: /path /to /folder /
  5. Запустите тестовые примеры, чтобы убедиться, что вы ничего не потеряли при передаче.

Затем выполните, как обычно, настройку локального MySQL.

* Примечание: вы также можете использовать параметр -c с rsync, чтобы добавить контрольную сумму к передаче, однако это будет чередой в зависимости от скорости процессора.

ответил randy melder 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 03:56:11 +0400 2011, 03:56:11
4

Я могу подтвердить, что метод 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).

ответил paalvibe 29 J0000006Europe/Moscow 2012, 02:17:40
4

Я думаю, что все более ранние ответы, вероятно, работают нормально, но на самом деле не затрагивают проблему установки имени базы данных во время передачи.

Вот как я это сделал с 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
ответил ErichBSchulz 26 AM00000050000002931 2012, 05:43:29
3

Вы перемещаете его на другой сервер mysql db? если это так, сделайте экспорт на нем

# mysqldump -u username -ppassword database_name> file.sql
ответил 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 03:33:58 +0400 2011, 03:33:58
3

Общий метод linux:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

отредактируйте datadir (и сокет) как для mysqld, так и для mysqld_safe (если применимо), чтобы указать на новое местоположение, затем

/etc/init.d/mysql start

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

ответил seeafish 19 MarpmMon, 19 Mar 2012 20:57:06 +04002012-03-19T20:57:06+04:0008 2012, 20:57:06
2

Возможно, это лучший способ сделать это:

Версия 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

ответил parf 8 42012vEurope/Moscow11bEurope/MoscowThu, 08 Nov 2012 21:45:09 +0400 2012, 21:45:09
1

Я бы предложил два простых шага для переноса всей базы данных с одного сервера на другой.

Шаг 1 : выполните полную резервную копию баз данных на исходном сервере с помощью mysqldump .

Шаг 2 . Вы можете использовать команду rsync для переноса всех баз данных на целевой сервер.

ответил Rudra 21 FebruaryEurope/MoscowbThu, 21 Feb 2013 00:48:55 +0400000000amThu, 21 Feb 2013 00:48:55 +040013 2013, 00:48:55

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132