Bagaimana saya bisa memindahkan database dari satu server ke yang lain?

136

Bagaimana saya bisa memindahkan tabel MySQL dari satu server fisik ke yang lain?

Seperti skenario persis ini: Saya memiliki server MySQL yang menggunakan tabel innodb dan berukuran sekitar 20GB.

Saya ingin memindahkannya ke server baru, apa cara paling efisien untuk melakukan ini?

John
sumber
4
Saya akan menggunakan xtrabackup percona.com/docs/wiki/... Ini sangat mirip menyalinnya tetapi Anda dapat tetap menjalankan server dan dengan asumsi Anda menggunakan tabel innodb (yang menurut Anda), Anda dapat menganggapnya "panas" cadangan juga.
Jonathan
Saya tidak mendapat manfaat dari orang lain yang menggunakan alat ini. Ini gratis / open-source dan meskipun dibuat oleh perusahaan, cukup mudah digunakan sehingga Anda tidak perlu mempertimbangkan untuk membeli dukungan dari perusahaan itu.
Jonathan

Jawaban:

80

Cara favorit saya adalah menyalurkan perintah sqldump ke perintah sql. Anda dapat melakukan semua database atau yang spesifik. Jadi, misalnya,

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

Anda dapat melakukan semua database dengan

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

Satu-satunya masalah adalah ketika database terlalu besar dan pipa runtuh. Dalam hal ini, Anda dapat melakukan table by table atau metode lain yang disebutkan di bawah ini.

David Hall
sumber
4
Tip: Jika tidak ada basis data yang memungkinkan koneksi jarak jauh, pipa melalui netcat.
Bart van Heukelom
1
Agar ini berfungsi bagi saya, saya harus membuat database kosong dengan nama yang sama pada server jarak jauh dan kemudian menambahkan nama database itu ke akhir perintah.
Zugwalt
1
Ini elegan, tetapi tanpa kompresi hampir tidak cukup cepat untuk basis data 20GB.
Ayah 32
Solusi ini hanya baik untuk jaringan yang sepenuhnya dikontrol (jika dan hanya jika pada jaringan pribadi yang aman, baca: bukan internet)! Tapi solusi cepat dan mudah!
tdaget
Ini cepat kilat! Tapi apa yang dikatakan Zugwalt juga berlaku untuk saya. Perintah tidak berfungsi sampai saya telah membuat database (kosong) tambahkan menambahkan nama database ke akhir perintah.
Skeets
65

Baru-baru ini saya memindahkan database 30GB dengan stragegy berikut:

Server Lama

  • Hentikan server mysql
  • Salin konten datadir ke lokasi lain pada disk ( ~/mysqldata/*)
  • Mulai server mysql lagi (downtime 10-15 menit)
  • kompres data ( tar -czvf mysqldata.tar.gz ~/mysqldata)
  • salin file yang dikompresi ke server baru

Server Baru

  • instal mysql (jangan mulai)
  • unzip file terkompresi ( tar -xzvf mysqldata.tar.gz)
  • memindahkan konten mysqldata ke datadir
  • Pastikan innodb_log_file_size Anda sama di server baru, atau jika tidak, jangan salin file log lama ( mysql akan menghasilkan ini )
  • Mulai mysql
Derek Downey
sumber
1
Lewati salinan setelah kompres / dekompresi. Streaming tar melalui jaringan menggunakan ssh, atau (jika dan hanya jika pada jaringan pribadi yang aman baca: bukan internet) gunakan netcat untuk menghindari overhead enkripsi. Juga jika pada jaringan lokal lewati gzipping, jika Anda memiliki pipa jaringan yang cepat, Anda akan menemukan transfer terhambat pada inti pemintalan yang melakukan kompresi
atxdba
Ini bekerja untuk innodb dan myisam? Juga, pengguna mysql juga ada di datadir?
giorgio79
2
@ giorgio79 tentu selama Anda memindahkan file ibdata juga. Secara default mereka ada di datadir. Pengguna MySQL disimpan dalam folder mysql di tablespace pengguna.
Derek Downey
2
Apakah prosedur ini berfungsi untuk berpindah dari Windows ke Linux?
ypercubeᵀᴹ
2
@ TypoCubeᵀᴹ minta maaf untuk mengambil lebih dari dua tahun untuk merespons, tetapi itu akan membantu saya jika seseorang berkata secara definitif, "Ya, ini bekerja dari Windows ke Linux". Dalam kasus saya, saya beralih dari Windows Server 2012 R2 ke Cent OS (Red Hat 4.8.5-11) . Versi mysql khusus adalah Maria DB 10.1 . Seperti yang ditentukan, saya menghentikan kedua layanan mysql, memeriksa kembali direktori data, dan setelah memulai layanan mysql pada server baru, semua database, tabel database, dan pengguna basis data benar-benar utuh.
WEBjuju
30

Menurut Panduan Studi Sertifikasi MySQL 5.0 , Bab 32 Bagian 32.3.4, Halaman 456.457 menguraikan Ketentuan untuk Portabilitas Biner yang menghasilkan hal-hal berikut:

Portabilitas biner adalah penting jika Anda ingin mengambil cadangan biner yang dibuat pada satu mesin dan menggunakannya pada mesin lain yang memiliki arsitektur yang berbeda. Misalnya, menggunakan cadangan biner adalah salah satu cara untuk menyalin basis data dari satu server MySQL ke yang lain.

Untuk MyISAM, portabilitas biner berarti Anda dapat langsung menyalin file untuk tabel MyISAM dari satu server MySQL ke komputer lain dan server kedua akan dapat mengakses tabel tersebut.

Untuk InnoDB, portabilitas biner berarti Anda dapat langsung menyalin file tablespace dari server MySQL di satu mesin ke server lain di mesin yang berbeda dan server kedua akan dapat mengakses tablespace. Secara default, semua tabel InnoDB yang dikelola oleh server disimpan bersama dalam tablespace, sehingga portabilitas tablespace adalah fungsi apakah semua tabel InnoDB individu bersifat portabel. Jika bahkan satu tabel tidak portabel, tidak juga tablespace.

Tabel MyISAM dan tablespace InnoDB adalah biner portable dari satu host ke host lain jika dua kondisi terpenuhi:

  • Kedua mesin harus menggunakan aritmatika integer dua pelengkap
  • Kedua mesin harus menggunakan format titik-mengambang IEEE atau tabel tidak boleh mengandung kolom titik-mengambang (FLOAT atau DOUBLE)

Dalam praktiknya, kedua kondisi tersebut menimbulkan sedikit pembatasan. Aritmatika integer dua pelengkap dan format titik-mengambang IEEE adalah norma pada perangkat keras modern. Kondisi ketiga untuk portabilitas biner InnoDB adalah Anda harus menggunakan nama huruf kecil untuk tabel dan database. Ini karena InnoDB menyimpan nama-nama ini secara internal (dalam kamus datanya) dalam huruf kecil pada Windows. Menggunakan nama huruf kecil memungkinkan portabilitas biner antara Windows dan Unix, untuk memaksa penggunaan nama huruf kecil, Anda dapat meletakkan baris berikut dalam file opsi:

[mysqld]
lower_case_table_names=1

Jika Anda mengkonfigurasi InnoDB untuk menggunakan tabel tablespace per-tabel, kondisi untuk portabilitas biner diperluas untuk menyertakan file .ibd untuk tabel InnoDB juga. (Kondisi untuk tablespace bersama masih appli karena berisi kamus data yang menyimpan informasi tentang semua tabel InnoDB.)

Jika kondisi portabilitas biner tidak terpenuhi, Anda dapat menyalin tabel MyISAM atau InnoDB dari satu server ke server lain dengan membuangnya menggunakan beberapa format teks (misalnya, dengan mysqldump) dan memuatnya kembali ke server tujuan.

Ada dua cara utama berdasarkan mesin penyimpanan untuk memindahkan masing-masing tabel.

Untuk contoh yang diberikan, kita akan mengira sebagai berikut:

  1. datadir adalah / var / lib / mysql
  2. database yang disebut mydb
  3. tabel dalam database mydb disebut mytable .

Tabel MyISAM

Jika mydb.mytable menggunakan mesin penyimpanan MyISAM, tabel secara fisik akan dimanifestasikan sebagai tiga file terpisah

  1. /var/lib/mysql/mydb/mytable.frm (file .frm)
  2. /var/lib/mysql/mydb/mytable.MYD (file .MYD)
  3. /var/lib/mysql/mydb/mytable.MYI (file .MYI)


.Frm berisi struktur tabel .MYD berisi data tabel
.MYI berisi halaman indeks tabel

File-file ini digunakan secara interdependen untuk mewakili tabel dari sudut pandang logis di mysql. Karena file ini tidak memiliki kaitan logis lebih lanjut melampirkan ke dalamnya, migrasi tabel dari satu server DB ke yang lain. Anda bahkan dapat melakukan ini dari server Windows ke Linux Server atau MacOS. Tentu saja, Anda bisa mematikan mysql dan menyalin 3 file tabel. Anda dapat menjalankan yang berikut ini:

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

dalam satu sesi ssh untuk menahan meja sebagai hanya baca dan tahan kunci selama 24 jam. Satu detik kemudian, lakukan copy di sesi ssh lain. Kemudian bunuh sesi mysql dengan kunci 24 jam. Anda tidak perlu menunggu 24 jam.

Tabel InnoDB

Berdasarkan kutipan di atas dari buku Sertifikasi, ada banyak faktor yang mengatur cara membuat cadangan tabel InnoDB tertentu. Demi kesederhanaan, kejelasan, dan singkatnya, cukup lakukan mysqldump dari tabel yang diinginkan dengan menggunakan parameter --satu-transaksi transaksi untuk mendapatkan titik titik-waktu pembuangan yang sempurna dari tabel. Tidak perlu membuat sendiri dengan semantik InnoDB jika Anda hanya ingin satu meja. Anda dapat memuat ulang dumpfile itu ke server MySQL mana pun yang Anda pilih.

Karena dua pertanyaan digabung di sini (jcolebrand): EDIT

Jika Anda lebih dari bersedia untuk hidup dengan kinerja DB yang lambat, Anda dapat melakukan serangkaian rsyncs dari server lama (ServerA) ke server baru (ServerB) bahkan ketika mysql masih berjalan di ServerA.

Langkah 01) instal versi mysql yang sama di ServerB yang dimiliki ServerA

Langkah 02) Pada ServerA, jalankan SET GLOBAL innodb_max_dirty_pages_pct = 0;dari mysql dan sekitar 10 menit (Ini membersihkan halaman kotor dari Pool Buffer InnoDB. Ini juga membantu melakukan shutdown mysql lebih cepat) Jika database Anda adalah semua MyISAM, Anda dapat melewati langkah ini.

Langkah 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

Langkah 04) Ulangi Langkah 03 sampai rsync membutuhkan waktu kurang dari 1 menit

Langkah 05) service mysql stopdi ServerA

Langkah 06) Lakukan satu lagi rsync

Langkah 07) scp ServerA:/etc/my.cnf ServerB:/etc/

Langkah 08) service mysql startdi ServerB

Langkah 08) service mysql startdi ServerA (opsional)

Cobalah !!!

CAVEAT

Anda dapat membuat budak replikasi seperti ini. Hanya ingat untuk menetapkan server-id secara eksplisit di master /etc/my.cnf dan nomor yang berbeda untuk server-id di slave /etc/my.cnf

RolandoMySQLDBA
sumber
29

Anda bahkan tidak memerlukan mysqldump jika Anda memindahkan seluruh skema basis data, dan Anda bersedia menghentikan basis data pertama (jadi konsisten ketika dipindahkan)

  1. Hentikan basis data (atau kunci)
  2. Pergi ke direktori tempat file data mysql berada.
  3. Transfer ke folder (dan kontennya) ke direktori data mysql server baru
  4. Mulai kembali database
  5. Di server baru, keluarkan perintah 'buat database'. '
  6. Menciptakan kembali pengguna & memberikan izin.

Saya tidak ingat apakah mysqldump menangani pengguna dan izin, atau hanya data ... tetapi meskipun demikian, ini jauh lebih cepat daripada melakukan dump & menjalankannya. Saya hanya akan menggunakannya jika saya perlu membuang database mysql untuk kemudian memasukkan kembali ke RDBMS lain, jika saya perlu mengubah opsi penyimpanan (innodb vs myisam), atau mungkin jika saya mengubah versins mysql utama (tetapi Saya pikir saya sudah melakukan ini antara 4 & 5, meskipun)

Joe
sumber
Ini lebih efisien, terutama jika seseorang adalah sysadmin / DBA. BTW mysqldump menggunakan --all-databasesdump skema mysql. Memulai mysql di mesin berikutnya memunculkan izin asalkan Anda mentransfer folder data ke mesin lain dengan rilis utama MySQL yang sama. (MySQL 5.5.x ke MySQL 5.5.x, MySQL 5.1.x ke MySQL 5.1.x, MySQL 5.0.x ke MySQL 5.0.x)
RolandoMySQLDBA
4
@ Jo, ya, mysqldumpmenangani pengguna dan izin, karena ini disimpan dalam mysqlskema.
Shlomi Noach
Pendekatan ini sangat berguna dengan cloud hosting, seperti AWS. Anda dapat menghentikan mysql, unmount dan lepas dari server saat ini; pasang dan pasang ke server baru dan mulai mysql. Tidak ada salinan overhead jika volume tetap di server farm yang sama.
LateralFractal
12

Jika Anda hanya ingin memindahkan tabel tertentu, cobalah:

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

Anda bisa menentukan lebih banyak nama tabel di atas, dalam perintah yang sama. Setelah perintah selesai, pindahkan file databasename.tablename.sql ke server lain dan kemudian kembalikan menggunakan:

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

Perhatikan bahwa file .sql kembali dibuat menggunakan program mysqldump , dan pemulihan dilakukan langsung ke mysql .

StanleyJohns
sumber
7
  1. Jika Anda memiliki akses ssh, Anda dapat menggunakan mysqldump dari baris perintah
  2. Jika Anda tidak memiliki akses ssh tetapi Anda memiliki akses phpMyAdmin Anda dapat menggunakannya untuk mengekspor / mengimpor
  3. Jika Anda tidak memiliki akses phpMyAdmin ada beberapa skrip php praktis yang akan dibuang dan diimpor (namun berbicara dari pengalaman saya sendiri, saya tidak pernah menemukan satu yang dapat diandalkan seperti phpMyAdmin).

Mungkin ada kemungkinan ini di mana Anda memindahkan file-file database aktual (untuk instal saya file-file tersebut terletak di / var / lib / mysql), tapi saya tidak benar-benar tahu bagaimana ia akan bertindak / bekerja.

poelinca
sumber
5

Anda harus beristirahat. Ini akan memakan waktu cukup lama tergantung pada kecepatan jaringan Anda. Saya akan menganggap Anda menjalankan MySQL di Linux / Unix. Inilah proses yang saya gunakan:

  1. Hentikan daemon mysql pada host sumber.
  2. Buat folder tmp pada host target Anda untuk menerima file.
  3. Gunakan layar untuk membuat sesi shell yang akan bertahan jika ssh Anda terputus.
  4. Gunakan rsync untuk mentransfer file antar host. Sesuatu seperti: rsync -avhP pengguna sumber @ targethost: / path / ke / folder /
  5. Jalankan test case Anda untuk memastikan Anda tidak kehilangan apa pun dalam transfer.

Kemudian lanjutkan seperti biasa mengatur MySQL lokal.

* Catatan: Anda juga dapat menggunakan parameter -c dengan rsync untuk menambahkan checksum ke transfer, namun ini akan menjadi sloooow tergantung pada kecepatan CPU.

randomx
sumber
4

Saya dapat mengonfirmasi bahwa metode DTest juga berfungsi untuk menyalin antara ubuntu dan osx.

Untuk menyalin semua basis data tanpa harus melakukan dumping atau yang serupa:

Pastikan Anda memiliki mysql bersih dari mysql (instal dmg yang diunduh dari mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), itu (SANGAT SANGAT PENTING) belum pernah dijalankan.

Salin isi / var / lib / mysql / folder dari mesin ubuntu di atas / usr / local / mysql / data / content pada mac. Untuk mendapatkan akses untuk mendapatkan folder di mesin ubuntu saya harus menggunakan sudo yaitu:

sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder

Saya menyalin folder menggunakan scp.

Sebelum Anda mulai mengambil salinan folder mysql di mac untuk memastikan Anda tidak mengacaukan apa pun.

Setelah menyalin folder, lakukan hal berikut pada mesin 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/

Mulai server mysql untuk pertama kalinya (dari panel preferensi di bawah System Preferences-> mysql). Semua pengguna dan basis data sekarang harus diatur dengan benar.

Ini bekerja dengan mysql 5.1.61 di ubuntu 64 bit 11.10 dan mysql 5.1.63 di osx lion (macbook pro).

paalvibe
sumber
4

Saya pikir semua jawaban sebelumnya mungkin bekerja dengan baik, tetapi jangan benar-benar mengatasi masalah pengaturan nama database selama transfer.

Beginilah cara saya melakukannya dengan bash:

Anda mungkin lebih baik menggunakan rsyncdaripada scp, dan tidak memampatkan file jika Anda sering melakukannya.

Di server sumber saya:

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

Di server tujuan saya:

me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip |  mysql $d2

Di kedua mesin untuk melihat kemajuan:

me@sandbox:~$ ls *.gz 
me@sandbox:~$ cat $d.sql.gz | gunzip |  less

Ini semua menganggap Anda memiliki file konfigurasi MySQL di direktori home Anda di kedua mesin dan mengatur izin:

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

apakah Anda memindahkannya ke server mysql db lain? jika demikian gunakan, lakukan ekspor di atasnya

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

sumber
Mysqldump? Saat itulah Anda berurusan dengan sejumlah kecil data?
Oh Chin Boon
2
Saya pikir kecil / besar sangat subjektif hari ini. Ketika saya melihat judul pertanyaan, saya mengharapkan database menjadi jauh lebih besar dari 20GB untuk dianggap "besar" ...
Aaron Bertrand
3

Metode linux umum:

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

edit datadir (dan soket) untuk mysqld dan mysqld_safe (jika ada) untuk menunjuk ke lokasi baru, lalu

/etc/init.d/mysql start

Saya memposting ini karena sepertinya tidak ada yang hanya daftar langkah paling sedikit untuk melakukan ini dan saya merasa ini adalah cara paling sederhana secara pribadi.

seeafish
sumber
2

Mungkin ini cara yang lebih baik untuk melakukannya:

Versi 1 : menyalin file data (hanya MYISAM)

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

layanan ssh server2 me-restart mysql

  • Jika file database Anda hanya dibaca Anda dapat melewati menghentikan server.

Versi 2 : mysqldump

Instal pigz - pada prosesor Xeon atau Opteron modern, terutama ketika Anda memiliki 2 CPU atau lebih, itu JAUH lebih cepat daripada 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 ..

Versi 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

naskah:

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:

untuk menyalin tabel kecil gunakan:

ssh server1 tabel skema mysqldump | skema ssh server2 mysql

parf
sumber
2

Saya akan menyarankan dua langkah sederhana untuk mentransfer seluruh database dari satu server ke yang lain.

Langkah 1 : Lakukan pencadangan penuh database di server sumber menggunakan mysqldump .

Langkah 2 : Anda dapat menggunakan perintah rsync untuk mentransfer seluruh database ke server tujuan.

Rudra
sumber