我刚刚设置了一台主服务器和一台从服务器,但它不工作。
在我的网站上,我连接到从属服务器并插入了一些行,但它们没有出现在主服务器上,反之亦然。这是什么问题?
这是我做的:
Master:
-> /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-master-bin
server-id=1
# bind-address = 127.0.0.1
binlog-do-db = test_db
Slave:
-> /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-slave-bin
server-id=2
# bind-address = 127.0.0.1
replicate-do-db = test_db
Slave:
terminal 0 >
mysql> STOP SLAVE; // and drop tables
Master:
terminal 1 >
mysql> CREATE USER 'repl_slave'@'slave_ip' IDENTIFIED BY 'repl_pass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_slave'@'slave_ip';
mysql> FLUSH PRIVILEGES;
mysql> FLUSH TABLES WITH READ LOCK;
-- leave terminal open
terminal 2 >
shell> mysqldump -u root -pPASSWORD test_db --lock-all-tables > dump.sql
mysql> SHOW MASTER STATUS;
Slave:
terminal 3 >
shell> mysql -u root -pPASSWORD test_db < dump.sql
terminal 0 >
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='master_ip',
mysql> MASTER_USER='repl_slave',
mysql> MASTER_PASSWORD='repl_pass',
mysql> MASTER_PORT=3306,
mysql> MASTER_LOG_FILE='mysql-master-bin.000003', // terminal 2 > SHOW MASTER STATUS
mysql> MASTER_LOG_POS=4, // terminal 2 > SHOW MASTER STATUS
mysql> MASTER_CONNECT_RETRY=10;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;
以下是从属状态:
Array
(
[Slave_IO_State] => Waiting for master to send event
[Master_Host] => xx.xx.xx.xx
[Master_User] => repl_slave
[Master_Port] => 3306
[Connect_Retry] => 10
[Master_Log_File] => mysql-master-bin.000003
[Read_Master_Log_Pos] => 106
[Relay_Log_File] => mysqld-relay-bin.000002
[Relay_Log_Pos] => 258
[Relay_Master_Log_File] => mysql-master-bin.000003
[Slave_IO_Running] => Yes
[Slave_SQL_Running] => Yes
[Replicate_Do_DB] => test_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] => 414
[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] =>
)
答案1
根据您的从属状态,复制已启动并正常运行。可能被破坏的是您的期望。MySQL 复制是从主服务器到从属服务器的单向复制,无需在从属服务器上验证一致性。第三方在从属服务器上更改的行将不是复制回主服务器,但显然会影响从服务器数据的一致性。
在大多数情况下,如果不执行额外的手动检查,你不会注意到从服务器上的数据行发生了变化 - 请查看Percona 工具包(以前称为 Maatkit)的工具确实有助于完成这项任务。
您还应该从配置中删除 replicate_do_db,因为这个过滤选项可能没有达到你想象的效果除此之外,它应该可以立即使用。如果不行,请发布用于验证数据复制的 SQL 语句。
答案2
在我的网站上,我连接到从属服务器并插入了一些行,但它们没有出现在主服务器上......
这只会在多主复制中发生。在这种设置中,两个都服务器是主服务器。这很复杂,而且很容易出错。您不会想在第一次使用多主服务器。
因此,在正常的主服务器 -> 从服务器设置下,您无法将行插入到从服务器中。从服务器对您来说是只读的。新数据进入从服务器的唯一方法是通过从主服务器复制数据。
...反之亦然。
如果您在主服务器上插入行,而这些行没有出现在从服务器上,则存在问题。在我看来,从服务器状态很好,并且没有延迟。我看不出有什么原因会导致它无法工作,除非您插入了除 之外的其他数据库test_db
。