Як я можу перемістити базу даних з одного сервера на інший?


136

Як я можу перемістити таблиці MySQL з одного фізичного сервера на інший?

Такий, як саме цей сценарій: у мене є сервер MySQL, який використовує таблицю innodb і розміром близько 20 ГБ.

Я хочу перенести його на новий сервер, який найефективніший спосіб це зробити?


4
Я б використовував xtrabackup percona.com/docs/wiki/… Це дуже схоже на його копіювання, але ви можете тримати сервер під керуванням і припускаючи, що ви використовуєте в основному таблиці innodb (які ви сказали, що у вас є), ви можете вважати це "гарячим" резервне копіювання.
Джонатан

Я не отримую вигоди від інших людей, які використовують цей інструмент. Це безкоштовно / з відкритим кодом, і хоча його створила компанія, досить просто використовувати, що вам не потрібно розглянути питання про придбання підтримки у цієї компанії.
Джонатан

Відповіді:


80

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

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

Ви можете робити всі бази даних за допомогою

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

Єдина проблема, коли база даних занадто велика і труба руйнується. У цьому випадку ви можете зробити таблицю за таблицею або будь-який з інших способів, згаданих нижче.


4
Порада: Якщо жодна база даних не дозволяє віддалених з'єднань, пропустіть їх netcat.
Барт ван Хекелом

1
Щоб це працювало для мене, мені довелося створити порожню базу даних з тим самим іменем на віддаленому сервері, а потім додати ім’я цієї бази даних до кінця команди.
Зугвалт

1
Це елегантно, але без стиснення навряд чи достатньо швидко для 20 ГБ бази даних.
Тато32

Це рішення добре лише для повністю керованої мережі (якщо і лише якщо в захищеній приватній мережі читайте: не в Інтернеті)! Але швидке та просте рішення!
tdaget

Це блискавично! Але те, що сказав @Zugwalt, було правдивим і для мене. Команда не працювала, поки я не створив базу даних (порожня), додавши ім’я бази даних в кінець команди.
Скелети

65

Нещодавно я перемістив базу даних на 30 ГБ із такою стратегією:

Старий сервер

  • Зупинити сервер 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

1
Пропустити копію після стискання / розпакування. Передайте тар через мережу за допомогою ssh або (якщо і лише якщо в захищеній приватній мережі читати: а не в Інтернеті) використовуйте netcat, щоб уникнути накладного шифрування. Крім того, якщо в локальній мережі пропустіть gzipping, якщо у вас швидка мережева труба, ви знайдете перенос вузьких місць на прив’язаному ядрі, що обертається, роблячи стиснення
atxdba

Це працює і для innodb, і для myisam? Також користувачі mysql також є у datadir?
giorgio79

2
@ giorgio79 впевнено, поки ви також переміщуєте файли ibdata. За замовчуванням вони знаходяться в datadir. Користувачі MySQL зберігаються в папці mysql в просторі таблиць користувача.
Дерек Дауні

2
Чи буде ця процедура працювати для переходу з Windows на Linux?
ypercubeᵀᴹ

2
@ TypoCubeᵀᴹ вибачте за відповідь на два роки, але це допомогло б мені, якби хтось остаточно сказав: "Так, це працює від Windows до Linux". У моєму випадку я перейшов з Windows Server 2012 R2 до Cent OS (Red Hat 4.8.5-11) . Конкретною версією mysql була Maria DB 10.1 . Як було призначено, я зупинив обидві служби mysql, перемістив каталог даних і після запуску служби mysql на новому сервері всі бази даних, таблиці баз даних та користувачі баз даних були повністю недоторканими.
WEBjuju

30

Згідно з посібником з дослідження сертифікації 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. Використання малих імен дозволяє переносити бінарну портативність між Windows та Unix, щоб змусити використовувати малі імена, ви можете помістити наступні рядки у файл опцій:

[mysqld]
lower_case_table_names=1

Якщо ви налаштуєте InnoDB для використання табличних просторів таблиць, умови для перенесення бінарних даних переносяться на файли .ibd і для таблиць InnoDB. (Умови для спільних табличних просторів все ще застосовуються, оскільки він містить словник даних, який зберігає інформацію про всі таблиці InnoDB.)

Якщо умови для бінарної портативності не виконуються, ви можете скопіювати таблиці MyISAM або InnoDB з одного сервера на інший, скинувши їх за допомогою деякого текстового формату (наприклад, з mysqldump) і перезавантаживши їх на цільовий сервер.

Існує два основних способи, засновані на механізмі зберігання даних, для переміщення окремих таблиць.

Для наведеного прикладу ми припустимо наступне:

  1. datadir є / 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-сервер або MacOS. Звичайно, ви можете вимкнути mysql і скопіювати 3 таблиці таблиці. Ви можете запустити наступне:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

за один ssh сеанс, щоб утримувати таблицю лише як прочитану та утримувати блокування протягом 24 годин. Через секунду виконайте копію в іншому сеансі ssh. Потім вбити сеанс mysql за допомогою блокування на 24 години. Не потрібно чекати 24 години.

Таблиці InnoDB

Виходячи з вищезгаданої цитати з книги сертифікації, існує багато факторів, які регулюють, як створити резервну копію конкретної таблиці InnoDB. Для простоти, ясності та стислості просто виконайте mysqldump потрібної таблиці, використовуючи параметри --single-транзакції, щоб мати ідеальне скидання таблиці за часом. Не потрібно зациклюватися на семантиці InnoDB, якщо ви хочете лише одну таблицю. Ви можете перезавантажити цей dumpfile на будь-який MySQL сервер на ваш вибір.

Оскільки тут було об'єднано два питання (jcolebrand): EDIT

Якщо ви більше ніж готові жити з деякою повільною продуктивністю БД, ви можете виконати ряд rsyncs від старого сервера (ServerA) до нового сервера (ServerB), навіть якщо mysql все ще працює на ServerA.

Крок 01) встановіть ту саму версію mysql на ServerB, яку має ServerA

Крок 02) На ServerA запустіть SET GLOBAL innodb_max_dirty_pages_pct = 0;з mysql і близько 10 хвилин (Це очищає брудні сторінки з пулу InnoDB Buffer. Це також допомагає швидше відключити mysql) Якщо у вашій базі даних все MyISAM, ви можете пропустити цей крок.

Крок 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

Крок 04) Повторіть крок 03, поки rsync не піде менше 1 хвилини

Крок 05) service mysql stopна ServerA

Крок 06) Виконайте ще одну rsync

Крок 07) scp ServerA:/etc/my.cnf ServerB:/etc/

Крок 08) service mysql startна ServerB

Крок 08) service mysql startна ServerA (необов’язково)

Спробувати !!!

КАВАТИ

Ви можете створити такий підлеглий реплікації. Просто пам’ятайте, що в ідентифікаторі /etc/my.cnf встановлено ідентифікатор сервера explcitly та інше число для ідентифікатора сервера /etc/my.cnf


29

Вам навіть не потрібен mysqldump, якщо ви переміщуєте цілу схему баз даних, і ви готові зупинити першу базу даних (тому вона послідовна під час передачі)

  1. Зупинення бази даних (або блокування)
  2. Перейдіть до каталогу, де знаходяться файли даних mysql.
  3. Перенесіть папку (та її вміст) в каталог даних mysql нового сервера
  4. Почніть резервне копіювання бази даних
  5. На новому сервері видайте команду "створити базу даних". "
  6. Заново створіть користувачів та надайте дозволи.

Я не можу пригадати , якщо туздИшпр обробляє користувачів і права доступу, або тільки дані ... але навіть якщо це станеться, це шлях швидше , ніж робити дамп і запустити його. Я б використовував це лише в тому випадку, якщо мені потрібно скинути базу даних mysql, щоб потім знову вставити в якусь іншу RDBMS, якщо мені потрібно змінити параметри зберігання (innodb vs. myisam), або, можливо, якщо я міняв основні версії mysql (але Я думаю, що я це робив між 4 та 5)


Це більш ефективно, особливо якщо хтось є системним адміністратором / DBA. BTW mysqldump, використовуючи --all-databasesскидання схеми mysql. Запуск mysql на наступній машині відкриває дозволи, за умови, що ви передали папку даних на іншу машину з тим же основним випуском MySQL. (MySQL 5.5.x до MySQL 5.5.x, MySQL 5.1.x до MySQL 5.1.x, MySQL 5.0.x до MySQL 5.0.x)
RolandoMySQLDBA

4
@Joe, так, mysqldumpобробляє користувачів та дозволи, оскільки вони зберігаються у mysqlсхемі.
Шломі Ноач

Такий підхід особливо корисний при хмарному хостингу, як AWS. Ви можете зупинити mysql, відключити та відключитися від поточного сервера; приєднати та встановити на новий сервер та запустити mysql. Немає накладних копій, якщо обсяг залишився в одній фермі сервера.
LateralFractal

12

Якщо ви просто хочете перемістити певну таблицю, спробуйте:

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

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

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

Зауважте, що файл .sql назад створюється за допомогою програми mysqldump , а відновлення виконується безпосередньо в mysql .


7
  1. Якщо у вас є доступ до ssh, ви можете використовувати mysqldump з командного рядка
  2. Якщо у вас немає доступу до ssh, але у вас є доступ до phpMyAdmin, ви можете використовувати його для експорту / імпорту
  3. Якщо у вас немає доступу до phpMyAdmin, є кілька зручних скриптів для php, які будуть скидатись та імпортувати (однак, кажучи з мого власного досвіду, я ніколи не знайшов такого, який би був таким надійним, як phpMyAdmin).

Можливо, є така можливість, коли ви переміщуєте фактичні файли бази даних (для моєї установки вони знаходяться за адресою / var / lib / mysql), але я не дуже розумію, як це буде діяти / працювати.


5

Вам потрібно буде провести час простою. Залежить час, залежно від швидкості вашої мережі. Я припускаю, що ви працюєте з MySQL на Linux / Unix. Ось процес, який я використовую:

  1. Зупиніть демон mysql на вихідному хості.
  2. Створіть папку tmp на своєму цільовому хості, щоб отримувати файли.
  3. Використовуйте екран, щоб зробити сеанс оболонки, який виживе, якщо ваш ssh відключиться.
  4. Використовуйте rsync для передачі файлів між хостами. Щось на зразок: rsync -avhP вихідний користувач @ targethost: / path / to / folder /
  5. Запустіть свої тестові справи, щоб переконатися, що ви нічого не втратили при передачі.

Потім продовжуйте, як завжди, налаштовуючи локальний MySQL.

* Примітка: ви також можете використовувати параметр -c з rsync, щоб додати контрольну суму до передачі, однак це буде sloooow залежно від швидкості процесора.


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 / з машини ubuntu поверх / usr / local / mysql / data / content на mac. Щоб отримати доступ до папки на машині ubuntu, я повинен був використовувати sudo, тобто:

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 (з області налаштувань у розділі System Preferences-> mysql). Усі користувачі та бази даних тепер мають бути налаштовані правильно.

Це працювало з mysql 5.1.61 на ubuntu 64 біт 11.10 та mysql 5.1.63 на osx lion (macbook pro).


4

Я думаю, що всі попередні відповіді, ймовірно, працюють добре, але насправді не вирішується питання встановлення імені бази даних під час передачі.

Ось як я це робив з bash:

Можливо, вам буде краще використовувати, rsyncніж scpне стискати файл, якщо ви робите це часто.

На моєму вихідному сервері:

me@web:~$ d=members
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 |  less

Все це передбачає, що у вашому домашньому каталозі на обох машинах є файл конфігурації MySQL та встановлено дозволи:

$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf

3

Ви переміщуєте його на інший сервер mysql db? якщо так використовувати, зробіть експорт на ньому

# mysqldump -u username -ppassword database_name > FILE.sql

Mysqldump? Це коли ви маєте справу з невеликою кількістю даних?
Ой Чін Бун

2
Я думаю, що малі / великі є цілком суб'єктивними в наші дні. Коли я побачив назву питання, я очікував, що база даних буде значно більшою, ніж 20 Гб, вважатись "великою" ...
Аарон Бертран

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

Я розмістив це, тому що, здається, ніхто просто не перелічує найменшу кількість кроків для цього, і я вважаю, що це найпростіший спосіб особисто.


2

Можливо, це кращий спосіб зробити це:

Версія 1 : копія файлів даних (лише MYISAM)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

ssh server2 служби перезапустіть mysql

  • Якщо файли вашої бази даних читаються тільки ви можете пропустити зупинку сервера.

Версія 2 : mysqldump

Встановіть pigz - на сучасних процесорах Xeon або Opteron, особливо коли у вас є 2 або більше процесора, це набагато швидше, ніж gzip.

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

Версія 3 : master / slave + mysqldump / file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

сценарій:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/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 схема


2

Я б запропонував два простих кроки для передачі всієї бази даних з одного сервера на інший.

Крок 1. Зробіть повне резервне копіювання баз даних на вихідному сервері за допомогою mysqldump .

Крок 2 : Ви можете використовувати команду rsync для передачі всіх баз даних на цільовий сервер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.