replikasi mysql berhasil tetapi budak tidak mereplikasi

8

Saya telah membuat konfigurasi master-slave mysql dan semuanya terlihat baik-baik saja. "tampilkan status master;" pada slave tidak menunjukkan kesalahan. ini adalah output

 Slave_IO_State: Waiting for master to send event
                  Master_Host: 109.123.100.58
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 106
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 106
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

Namun pada replikasi pada slave sepertinya tidak terjadi ketika master mengalami perubahan

Pada tuan. TAMPILKAN STATUS MASTER

+------------------+----------+--------------+-------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB        |
+------------------+----------+--------------+-------------------------+
| mysql-bin.000001 |   639495 |              | mysql,informationschema |
+------------------+----------+--------------+-------------------------+

pada hasil SHOW PROCESSLIST

+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
| Id  | User        | Host      | db   | Command | Time  | State                                                                 | Info             |
+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
| 174 | system user |           | NULL | Connect | 25777 | Waiting for master to send event                                      | NULL             |
| 175 | system user |           | NULL | Connect | 25777 | Has read all relay log; waiting for the slave I/O thread to update it | NULL             |
| 199 | root        | localhost | NULL | Query   |     0 | NULL                                                                  | show processlist |
+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)

Apakah saya melewatkan sesuatu

Kedelai
sumber
Dua pertanyaan. Apakah Anda memiliki versi MySQL yang sama yang berjalan pada master dan slave? Apakah Anda memiliki id server yang berbeda di konfigurasi untuk master / slave? sunting: bisakah kita melihat penuh SHOW MASTER STATUSjuga, bit atas hilang saya pikir.
maaf kesalahan saya bit atas adalah output untuk SHOW SLAVE STATUS \ G. tampilkan status master pada hasil budak + ------------------ + ---------- + ------------- - + ------------------------- + | File | Posisi | Binlog_Do_DB | Binlog_Ignore_DB | + ------------------ + ---------- + -------------- + ---- --------------------- + | mysql-bin.000004 | 106 | | mysql, informationchema | + ------------------ + ---------- + -------------- + ---- --------------------- +
Kedelai
Jangan melihat SHOW MASTER STATUSpada budak . Informasi ini tidak relevan kecuali budak juga melayani sebagai tuan bagi budak lain di hilir.
Michael - sqlbot
Jika Anda SHOW PROCESSLISTdi master, apakah Anda melihat koneksi yang masuk dari budak? Kamu harus Juga, saya akan mencoba STOP SLAVE IO_THREAD;kemudian START SLAVE IO_THREAD;pada slave dan melihat bagaimana output SHOW SLAVE STATUS(pada slave) berubah, jika sama sekali.
Michael - sqlbot

Jawaban:

5

Output yang Anda presentasikan sangat membingungkan. Di satu sisi, master menunjukkan:

mysql-bin.000001   639495 

Budak PROCESSLISTmenunjukkan bahwa replikasi bekerja (utas IO terhubung ke master, utas SQL sedang menunggu).

SHOW SLAVE STATUSLagi - lagi budak itu mengklaim semuanya baik-baik saja, tetapi posisi tuannya adalah 106.

Apakah semua keluaran ini dikeluarkan pada waktu yang bersamaan? Jika tidak, maka mereka tidak berharga.

Saya akan memeriksa yang berikut:

  • Yang jelas: 109.123.100.58benarkah tuanmu?
  • Apakah SHOW PROCESSLISTpada master daftar koneksi yang dibuat oleh budak di bawah replicapengguna?
  • Apakah Anda memiliki server-idpengaturan yang berbeda untuk master dan slave?
  • Apakah Anda memiliki replicate-do-*atau replicate-ignore-*pengaturan dalam Anda mysql.cnfberkas?
Shlomi Noach
sumber
ya hasilnya pada saat yang sama. 1. ya 109.123.100.58 adalah tuannya. 2. tidak 3. ya 4. tidak. Tampilkan daftar proses pada acara utama '+-------+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+------+---------+------+-------+------------------+ | 23243 | root | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST | +-------+------+-----------+------+---------+------+-------+------------------+
Kedelai
3
2-tidak ?? Lebih aneh lagi demi menit. Saya sangat tidak yakin bahwa budak Anda sebenarnya terhubung ke master yang tepat.
Shlomi Noach
1
Terima kasih atas tipnya! Dalam kasus saya, saya memiliki replikasi M-> S1-> S2, dan S2 server-id saya cocok dengan M server-id saya.
Aaron R.
1

Lebih baik daripada menggunakan binlog-ign-db adalah menggunakan penyaringan sisi-slave Saya terjebak dalam situasi yang sama, ya, saya butuh satu hari penuh untuk mencari tahu:

Saya melewatkan sesuatu yang besar !!!

Perbedaan antara

--replicate-do-db=
--replicate-do-table=

Di sisi budak. Dan

--replicate-do-table='mydb.%'

tidak bekerja untuk saya di meja. Saya harus menggunakan

--replicate-do-db='mydb'

Saya kira ini akan berhasil untuk wildcard

--replicate-wild-do-table='mydb.%'

... Sekarang untuk mencari tahu bagaimana mereplikasi tabel yang sama dari banyak master. Oke, saya sudah tahu, MySQL tidak mendukungnya secara asli; MariaDB 10 tidak.

Saya juga punya masalah lain pada awalnya: Kata sandi saya lebih panjang dari 32 karakter. Boo!

Dagelf
sumber
1

Saya juga menemukan masalah ini. Akar penyebabnya adalah memiliki master server_id=0. MariaDB memiliki perilaku khusus untuk server_id=0yang tidak akan memungkinkan replikasi bekerja.

Server_id harus unik untuk setiap server dalam grup replikasi. Jika dibiarkan pada 0, default hingga MariaDB 10.2.1, seorang budak tidak akan terhubung ke master, dan master akan menolak semua koneksi budak.

Ketika saya mulai mengindeks berdasarkan pada 1 semuanya bekerja dengan baik.

Ryan Goodfellow
sumber
-2

Anda tidak memberi tahu slave DB mana yang akan ditiru: variabel Replicate_Do_DB kosong.

Coba tambahkan baris

replicate-do-db = name_of_db (di mana "name_of_db" adalah nama basis data yang akan ditiru)

di my.cnf Anda (di slave) dan restart server slave.

EDIT: Saya tidak berpikir jawaban saya adalah solusi yang tepat, sementara ;-)

Mungkin melihat halaman ini sebagai gantinya: http://dev.mysql.com/doc/refman/5.1/en/replication-problems.html

Chris
sumber
Saya pikir itu tidak benar. Anda dapat melihat bahwa 639495 bytes telah masuk ke binlog master
Pertanyaannya adalah mengapa replikasi tidak berfungsi - tidak jika ada sesuatu yang ditulis ke binlog. Biasanya perintah SHOW MASTER STATUS tidak menampilkan info lebih lanjut.
maaf bad saya .. tampilkan hasil status master+------------------+----------+--------------+-------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+-------------------------+ | mysql-bin.000004 | 106 | | mysql,informationschema | +------------------+----------+--------------+-------------------------+
Kedelai
juga saya diberitahu bahwa jika saya tidak bermaksud mereplikasi-do-db itu mereplikasi semua database. sebagai gantinya saya punyaentry binlog_ignore_db = mysql binlog_ignore_db = informationschema
Kedelai
1
Jangan ikuti saran dalam jawaban ini, karena Anda tidak perlu memberi tahu basis data skema mana yang akan ditiru (standar untuk semua skema), dan ini sangat mungkin akan merusak replikasi Anda, dan kemungkinan besar bukan yang Anda cari. Anda ingin (99,999%) untuk mereplikasi semua skema.
Shlomi Noach