2

プライマリMySQLサーバーがあり、InnoDBデータベースのレプリケーションをセットアップしようとしています。
マスターとスレーブの構成を実行し、マスターステーションDBのダンプを作成し、スレーブステーションに復元して、レプリケーションを実行します。すべてが正常に見えますが、更新はスレーブに反映されません。スレーブが実行されており、マスターとスレーブのRead_Master_Log_Posは同一です。mysql-relay-bin.00000Xファイルを検索しても、マスターからの更新があります。しかし、「SELECT*FROMdb.table;」を実行しても変更はありません。
BDエンジンをMyISAMに変更すると、すべて正常に動作します。
また、空のデータベース(InnoDBエンジン)を作成し、それをダンプしてスレーブに復元し、レプリケーションを開始してから、マスターにテーブルを作成してそれらを埋めようとしました。この場合、レプリケーションはうまく機能しています。しかし、すでに作成されていっぱいになったデータベースを複製する方法も必要です。
私は何をすべきか?

私は持っています:
マスターのmy.cnf:

[mysqld]
bind-address=0.0.0.0
port=3306
replicate-do-db=gcm_data
log-bin=/var/lib/mysql/mysql-bin
server-id=8217
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

スレーブ上のmy.cnf:

[mysqld]
bind-address=0.0.0.0
port=3306
replicate-do-db=gcm_data
relay-log-index=/var/lib/mysql/mysql-relay-bin.index
relay-log=/var/lib/mysql/mysql-relay-bin
server-id=50890
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

マスターステータスを表示\G

File: mysql-bin.000001
Position: 657
Binlog_Do_DB:
Binlog_Ignore_DB:

スレーブステータスを表示\G

Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.13.52
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 657
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: gcm_data
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 2
Exec_Master_Log_Pos: 657
Relay_Log_Space: 551
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:

マスターにプロセスリストを表示する:

| Id | User   | Host              | db   | Command     | Time | State                                                          | Info             |
| 16 | slave1 | 10.0.13.140:54683 | NULL | Binlog Dump | 2062 | Has sent all binlog to slave; waiting for binlog to be updated | NULL             |

スレーブにプロセスリストを表示する:

| Id | User        | Host      | db   | Command | Time | State                                                                 | Info             |
| 14 | system user |           | NULL | Connect | 2203 | Waiting for master to send event                                      | NULL             |
| 15 | system user |           | NULL | Connect | 2203 | Has read all relay log; waiting for the slave I/O thread to update it | NULL             |

どういうわけか重要な場合は、仮想CentOS 6.0、MySQL5.1.61からマスターステーションとスレーブステーションの両方を実行しています。

アップデート

少し動作テストを実装しました。で空のデータベースを作成しMaster、レプリケーションスクリプトを実行しました(すべてがうまくいき、実行MasterSlaveれていました)。次に、InnoDBテーブルを作成しました

CREATE TABLE tbl (id INT, data VARCHAR(10)) engine=InnoDB;

テーブルはスレーブに登場しました。次に、テーブルにデータを入力しました

INSERT tbl values (1, "1");

データはスレーブで更新されました。

次に、マスター(service mysqld stop)を停止し、スレーブIOも停止しました

SHOW SLAVE STATUS - Slave_IO_Running: No, Slave_SQL_Running: Yes

それから私はマスターでMySQLを起動し、スレーブIOもしばらくして起動しました。ただし、更新はスレーブでは利用できないため、スレーブには存在しmysql-relay-bin.00000Xます。

4

2 に答える 2

0

まあ..何とか問題を解決しました。問題は、仮想マシンからマスターとスレーブの両方を実行することにあるようです。実際のマシンで同じレプリケーション スクリプトを実行すると、すべて正常に動作します。
問題は、なぜ VM で適切に動作しないのかということです。

更新
少し前に、実機で同じ問題が発生しました。
そして最終的に、この問題の原因を突き止めました。次の
ような INSERT/SELECT コマンドを使用してレプリケーションをテストしていました。
INSERT db.table (ID, VALUE) values (ID, 2);
マスターとチェック:
SELECT * FROM db.table;
スレーブで。そして、idは更新を表示しませんでした。
しかし、私は試しました:
USE db;
INSERT テーブル (ID, VALUE) 値 (ID, 2);
そして、スレーブステーションでアップデートが利用可能でした。

于 2012-10-11T13:47:46.757 に答える