Ini adalah prosedur langkah-demi-langkah lengkap untuk melakukan sinkronisasi ulang replikasi master-slave dari awal:
Di master:
RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Dan salin nilai hasil dari perintah terakhir di suatu tempat.
Tanpa menutup koneksi ke klien (karena itu akan melepaskan kunci baca) mengeluarkan perintah untuk mendapatkan dump master:
mysqldump -u root -p --all-databases > /a/path/mysqldump.sql
Sekarang Anda dapat melepaskan kunci, bahkan jika dump belum berakhir. Untuk melakukannya, lakukan perintah berikut di klien MySQL:
UNLOCK TABLES;
Sekarang salin file dump ke slave menggunakan scp atau alat pilihan Anda.
Di budak:
Buka koneksi ke mysql dan ketik:
STOP SLAVE;
Muat dump data master dengan perintah konsol ini:
mysql -uroot -p < mysqldump.sql
Sinkronkan slave dan master log:
RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
Di mana nilai dari bidang di atas adalah yang Anda salin sebelumnya.
Akhirnya, ketikkan:
START SLAVE;
Untuk memeriksa apakah semuanya berfungsi kembali, setelah mengetik:
SHOW SLAVE STATUS;
Anda harus melihat:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Itu dia!
--opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases
RESET_SLAVE
perlu? Perhatikan bahwa petunjuk ini mengatur ulang pengguna dan kata sandi replikasi, jadi Anda harus memasukkannya kembali denganCHANGE MASTER TO...
Dokumentasi untuk ini di situs MySQL sangat ketinggalan zaman dan penuh dengan senjata kaki (seperti interactive_timeout). Mengeluarkan FLUSH TABLES DENGAN READ LOCK sebagai bagian dari ekspor master Anda umumnya hanya masuk akal ketika dikoordinasikan dengan snapshot penyimpanan / sistem file seperti LVM atau zfs.
Jika Anda akan menggunakan mysqldump, Anda harus mengandalkan opsi --master-data untuk menjaga dari kesalahan manusia dan melepaskan kunci pada master secepat mungkin.
Asumsikan masternya adalah 192.168.100.50 dan budaknya adalah 192.168.100.51, masing-masing server memiliki server-id yang berbeda yang dikonfigurasi, master memiliki pencatatan biner dan budak memiliki read-only = 1 di my.cnf
Untuk menjalankan slave agar dapat memulai replikasi tepat setelah mengimpor dump, jalankan perintah CHANGE MASTER tetapi hilangkan nama file log dan posisi:
Keluarkan GRANT pada master untuk digunakan budak:
Ekspor master (di layar) menggunakan kompresi dan secara otomatis menangkap koordinat log biner yang benar:
Salin file replication.sql.gz ke slave dan kemudian impor dengan zcat ke instance MySQL yang berjalan di slave:
Mulai replikasi dengan mengeluarkan perintah ke slave:
Secara opsional perbarui /root/.my.cnf pada slave untuk menyimpan kata sandi root yang sama dengan master.
Jika Anda menggunakan 5.1+, yang terbaik adalah terlebih dahulu mengatur binlog_format master ke MIXED atau ROW. Berhati-hatilah bahwa acara yang dicatat baris lambat untuk tabel yang tidak memiliki kunci utama. Ini biasanya lebih baik daripada konfigurasi alternatif (dan default) dari binlog_format = statement (on master), karena kecil kemungkinannya untuk menghasilkan data yang salah pada slave.
Jika Anda harus (tetapi mungkin tidak boleh) menyaring replikasi, lakukan dengan opsi slave replikasi-wild-do-table = dbname.% Atau replikasi-wild-ign-table = badDB.% Dan gunakan hanya binlog_format = baris
Proses ini akan menahan kunci global pada master selama durasi perintah mysqldump tetapi tidak akan berdampak pada master.
Jika Anda tergoda untuk menggunakan mysqldump - master-data --all-databases --single-transaction (karena Anda hanya menggunakan tabel InnoDB), Anda mungkin lebih baik menggunakan MySQL Enterprise Backup atau implementasi open source yang disebut xtrabackup (milik Percona)
sumber
zcat
. Pertanyaan 2: Bagaimanamysqldump
tarif ini dengan database besar dalam hal kinerja? Adakah cara untuk menggunakanSELECT INTO OUTFILE
danLOAD DATA
dengan lancar dalam proses yang Anda sarankan? (Karena mereka umumnya melakukan lebih cepat)STOP SLAVE
suatu tempat dalam proses?Kecuali Anda menulis langsung ke slave (Server2), satu-satunya masalah adalah Server2 tidak memiliki pembaruan apa pun yang telah terjadi sejak terputus. Cukup mulai ulang budak dengan "MULAI BUDAK;" harus mendapatkan semuanya kembali dengan kecepatan.
sumber
Saya pikir, memanfaatkan Maatkit membantu untuk Anda! Anda dapat menggunakan mk-table-sync. Silakan lihat tautan ini: http://www.maatkit.org/doc/mk-table-sync.html
sumber
Saya sangat terlambat untuk pertanyaan ini, namun saya memang menghadapi masalah ini dan, setelah banyak mencari, saya menemukan informasi ini dari Bryan Kennedy: http://plusbryan.com/mysql-replikasi-without-downtime
Pada Master, ambil cadangan seperti ini:
mysqldump --skip-lock-tables --single-transaction --flush-logs - hex-blob - master-data = 2 -A> ~ / dump.sql
Sekarang, periksa kepala file dan catat nilai-nilai untuk MASTER_LOG_FILE dan MASTER_LOG_POS. Anda akan membutuhkannya nanti: head dump.sql -n80 | grep "MASTER_LOG"
Salin file "dump.sql" ke Slave dan kembalikan: mysql -u mysql-user -p <~ / dump.sql
Sambungkan ke Slave mysql dan jalankan perintah seperti ini: CHANGE MASTER TO MASTER_HOST = 'master-server-ip', MASTER_USER = 'pengguna-replikasi', MASTER_PASSWORD = 'kata sandi server-budak', MASTER_LOG_FILE = 'nilai dari atas', MASTER_LOG_POS = nilai dari atas; MULAI BUDAK;
Untuk memeriksa kemajuan Slave: SHOW SLAVE STATUS;
Jika semuanya baik-baik saja, Last_Error akan kosong, dan Slave_IO_State akan melaporkan "Menunggu master untuk mengirim acara". Cari Seconds_Behind_Master yang menunjukkan seberapa jauh di belakangnya. YMMV. :)
sumber
--master-data=1
(atau adil--master-data
).Inilah yang biasanya saya lakukan ketika seorang budak mysql keluar dari sinkronisasi. Saya telah melihat mk-table-sync tetapi berpikir bagian Risiko itu tampak menakutkan.
Tentang Guru:
Kolom yang dihasilkan (File, Posisi) akan berguna bagi kita dalam sedikit.
Pada Budak:
Kemudian buang master db dan impor ke slave db.
Kemudian jalankan yang berikut ini:
Di mana [File] dan [Posisi] adalah nilai-nilai yang dikeluarkan dari "SHOW MASTER STATUS" yang dijalankan di atas.
Semoga ini membantu!
sumber
FLUSH TABLES WITH READ LOCK;
sebelum AndaSHOW MASTER STATUS
dan membuang database master. Saya pikir ini mungkin menghasilkan misalnya kesalahan duplikat kunci pada slave karena Anda secara efektif mengatur status master ke titik waktu sebelum dump diambil, jadi Anda akan memutar ulang sejarah yang sudah termasuk dalam dump. (Jika Anda melakukan hal-hal sesuai dengan urutan yang Anda jelaskan.)Menindaklanjuti jawaban David ...
Menggunakan
SHOW SLAVE STATUS\G
akan memberikan output yang dapat dibaca manusia.sumber
terkadang Anda hanya perlu memberi tendangan pada budak juga
mencoba
cukup sering, hamba, mereka hanya macet :)
sumber
Position
pada master yang digunakanshow master status;
melawanExec_Master_Log_Pos:
pada Slave menggunakanshow slave status \G
. Budak harus mengejar master. Bekerja untuk saya menggunakan mysql 5.6 sekarang setelah pemadaman jaringan singkat.Berikut ini adalah jawaban lengkap yang diharapkan akan membantu orang lain ...
Saya ingin mengatur replikasi mysql menggunakan master dan slave, dan karena satu-satunya yang saya tahu adalah menggunakan file log untuk menyinkronkan, jika slave offline dan keluar dari sinkronisasi, secara teori seharusnya hanya perlu menyambung kembali untuk masternya dan terus membaca file log dari tempat terakhir, seperti yang disebutkan pengguna malonso.
Jadi di sini adalah hasil tes setelah mengkonfigurasi master dan slave sebagaimana disebutkan oleh: http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html ...
Asalkan Anda menggunakan konfigurasi master / slave yang disarankan dan tidak menulis ke slave, ia dan saya berada di tempat yang benar (sejauh menyangkut mysql-server 5.x). Aku bahkan tidak perlu menggunakan "MULAI BUDAK;", itu hanya sampai ke tuannya. Tapi ada 88000 default coba lagi setiap 60 detik jadi saya kira jika Anda kehabisan tenaga, Anda mungkin harus memulai atau memulai kembali slave. Ngomong-ngomong, bagi mereka seperti saya yang ingin tahu apakah memiliki budak akan offline dan mencadangkan lagi memerlukan intervensi manual .. tidak, tidak.
Mungkin poster aslinya mengalami kerusakan pada log-file? Tetapi kemungkinan besar bukan hanya server yang offline selama sehari.
ditarik dari /usr/share/doc/mysql-server-5.1/README.Debian.gz yang mungkin masuk akal juga ke server non debian:
Anda dapat menggunakan sesuatu seperti sql: tampilkan variabel seperti 'tmpdir'; untuk mencari tahu.
sumber
Menambahkan ke jawaban populer untuk memasukkan kesalahan ini:
Replikasi dari slave dalam satu tembakan:
Dalam satu jendela terminal:
Setelah menghubungkan,
Statusnya muncul sebagai berikut: Perhatikan bahwa nomor posisi bervariasi!
Ekspor dump mirip dengan bagaimana dia menggambarkan " menggunakan terminal lain "!
Keluar dan sambungkan ke DB Anda sendiri (yang merupakan budak):
Ketik perintah di bawah ini:
Impor Dump seperti yang disebutkan (di terminal lain, tentu saja!) Dan ketik perintah di bawah ini:
Setelah masuk, setel parameter server_id (biasanya, untuk DB baru / non-replikasi, ini tidak disetel secara default),
Sekarang, mulai budak itu.
Outputnya harus sama dengan yang dia jelaskan.
Catatan: Setelah direplikasi, master dan slave membagikan kata sandi yang sama!
sumber
Membangun kembali budak menggunakan LVM
Berikut adalah metode yang kami gunakan untuk membangun kembali budak MySQL menggunakan Linux LVM. Ini menjamin snapshot yang konsisten sambil membutuhkan downtime yang sangat minimal pada master Anda.
Atur innodb max halaman kotor persen ke nol pada server master MySQL. Ini akan memaksa MySQL untuk menulis semua halaman ke disk yang secara signifikan akan mempercepat restart.
Untuk memantau jumlah halaman kotor, jalankan perintah
Setelah angka berhenti menurun, Anda telah mencapai titik untuk melanjutkan. Selanjutnya, atur ulang master untuk menghapus log tempat sampah / log relai lama:
Jalankan lvdisplay untuk mendapatkan LV Path
Output akan terlihat seperti ini
Matikan database master dengan perintah
Selanjutnya, ambil snaphot, mysql_snapshot akan menjadi nama volume logis baru. Jika binlog ditempatkan pada drive OS, maka perlu snapshot juga.
Mulai master lagi dengan perintah
Kembalikan pengaturan halaman kotor ke default
Jalankan lvdisplay lagi untuk memastikan snapshot ada dan terlihat
Keluaran:
Pasang snapshot
Jika Anda memiliki slave MySQL yang ada, Anda harus menghentikannya
Selanjutnya Anda perlu menghapus folder data MySQL
Kembali ke master. Sekarang rsync snapshot ke slave MySQL
Setelah rsync selesai, Anda dapat melepas dan menghapus snapshot
Buat pengguna replikasi pada master jika pengguna replikasi lama tidak ada atau kata sandi tidak diketahui
Verifikasi bahwa file data / var / lib / mysql dimiliki oleh pengguna mysql, jika demikian Anda dapat menghilangkan perintah berikut:
Selanjutnya, rekam posisi binlog
Anda akan melihat sesuatu seperti
Di sini file master log adalah nomor file tertinggi secara berurutan dan posisi log bin adalah ukuran file. Catat nilai-nilai ini:
Selanjutnya jalankan slave MySQL
Jalankan perintah perubahan master pada slave dengan menjalankan yang berikut:
Akhirnya mulai budak
Periksa status budak:
Pastikan Slave IO berjalan dan tidak ada kesalahan koneksi. Semoga berhasil!
BR, Juha Vehnia
Saya baru-baru ini menulis ini di blog saya yang ditemukan di sini ... Ada beberapa detail lagi di sana tetapi ceritanya sama.
http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html
sumber
Saya membuat repo GitHub dengan skrip untuk menyelesaikan masalah ini dengan cepat. Ubah saja beberapa variabel dan jalankan (Pertama, skrip membuat cadangan dari database Anda).
Saya harap ini membantu Anda (dan orang lain juga).
Cara Mengatur Ulang (Sinkronisasi Ulang) Replikasi MySQL Master-Slave
sumber
Kami menggunakan teknik replikasi master-master dari MySQL dan jika satu server MySQL mengatakan 1 dihapus dari jaringan, koneksi itu akan terhubung kembali setelah koneksi dipulihkan dan semua catatan yang dilakukan di dalam server 2 yang berada di jaringan ditransfer ke server 1 yang telah kehilangan koneksi setelah pemulihan. Slave thread di MySQL mencoba untuk terhubung ke masternya setelah setiap 60 detik secara default. Properti ini dapat diubah karena MySQL memiliki flag "master_connect_retry = 5" di mana 5 berada dalam detik. Ini berarti bahwa kami ingin mencoba lagi setelah setiap 5 detik.
Tetapi Anda perlu memastikan bahwa server yang kehilangan koneksi menunjukkan tidak membuat komit dalam database saat Anda mendapatkan duplikat Kunci kesalahan Kode kesalahan: 1062
sumber
Master :
scp master:/tmp/dump.sql.gz slave:/tmp/
Pindahkan file dump ke server slaveBudak:
zcat /tmp/dump.sql.gz | mysql -u root -p
CATATAN :
Pada master Anda dapat menjalankan
SET GLOBAL expire_logs_days = 3
untuk menyimpan binlog selama 3 hari jika terjadi masalah slave.sumber