it-swarm.asia

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

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?

142
John

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 basis data 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 tabel demi tabel atau metode lain yang disebutkan di bawah ini.

84
David Hall

Saya baru-baru ini 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)
  • pindahkan 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
67
Derek Downey

Menurut Panduan Studi Sertifikasi MySQL 5. , Bab 32 Bagian 32.3.4, Halaman 456.457 menggambarkan Ketentuan untuk Portabilitas Biner yang bawa yang 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 lainnya 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 mengonfigurasi 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 bernama mydb
  3. tabel di mydb database bernama 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 saling tergantung untuk mewakili tabel dari sudut pandang logis di mysql. Karena file-file ini tidak memiliki asosiasi logis lebih lanjut melampirkannya, memigrasi tabel dari satu server DB ke yang lain. Anda bahkan dapat melakukan ini dari server Windows ke Server Linux 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 dump point-in-time 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 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) Di ServerA, jalankan SET GLOBAL innodb_max_dirty_pages_pct = 0; dari mysql dan sekitar 10 menit (Ini membersihkan halaman-halaman kotor dari Pool Buffer InnoDB. Ini juga membantu melakukan shutdown mysql lebih cepat) Jika database Anda semua adalah 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 stop di ServerA

Langkah 06) Lakukan satu lagi rsync

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

Langkah 08) service mysql start di ServerB

Langkah 08) service mysql start di ServerA (opsional)

Cobalah !!!

CAVEAT

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

34
RolandoMySQLDBA

Anda bahkan tidak perlu 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 di mana 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 cara lebih cepat daripada melakukan dump & menjalankannya. Saya hanya akan menggunakan itu 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 versin mysql utama (tetapi Saya pikir saya sudah melakukan ini antara 4 & 5, meskipun)

29
Joe

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.

12
StanleyJohns
  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 ekspor/impor
  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), tetapi saya tidak benar-benar tahu bagaimana ia akan bertindak/bekerja.

7
poelinca

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 mendapatkan pengaturan 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.

5
randomx

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 rsync daripada scp, dan tidak mengompres file jika Anda sering melakukan ini.

Di server sumber saya:

[email protected]:~$ d=members
[email protected]:~$ mysqldump $d | gzip > $d.sql.gz
[email protected]:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

Di server tujuan saya:

[email protected]:~$ d1=members
[email protected]:~$ d2=members_sb
[email protected]:~$ mysqladmin create $d2
[email protected]:~$ cat $d1.sql.gz | gunzip |  mysql $d2

Di kedua mesin untuk melihat kemajuan:

[email protected]:~$ ls *.gz 
[email protected]:~$ cat $d.sql.gz | gunzip |  less

Ini semua menganggap Anda memiliki konfigurasi MySQL file 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
4
ErichBSchulz

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

Untuk menyalin semua basis data tanpa harus melakukan dumping atau 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 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 i.e .:

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).

4
paalvibe

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

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

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 cukup daftar langkah-langkah paling sedikit untuk melakukan ini dan saya merasa ini adalah cara paling sederhana secara pribadi.

3
seeafish

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

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

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

2
Rudra

Mungkin ini cara yang lebih baik untuk melakukannya:

Versi 1: menyalin data-file (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: 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

2
parf