【问题标题】:Why does Master think it's a Slave on Reboot?为什么Master认为它是一个Slave on Reboot?
【发布时间】:2017-01-09 14:11:40
【问题描述】:

在一个简单的 MySQL 复制 Master-Slave 配置中,我遇到了一个问题,即 Master 在重新启动时尝试将自己作为从属设备连接。

因此,当我在 Master 上重新启动 MySQL 时,我看到与试图复制到自身的同一台服务器相关的错误,我必须在每次重新启动 MySQL 时手动运行 mysql -e "STOP SLAVE;"。

如何永久禁用 master 上的 slave?

这是my.cnf的相关部分:

## Logging
binlog_format                   = mixed
log_bin                         = /var/log/mysql/mysql-bin.log
sync_binlog                     = 1
pid_file                        = /var/run/mysqld/mysqld.pid
log_error                       = /var/log/mysql/error.log
#general_log                     = 0
#general_log_file                = /var/log/mysql/general.log
slow_query_log                  = 1
slow_query_log_file             = /var/log/mysql/slow.log
long_query_time                 = 3
expire_logs_days                = 14

sql_mode                        = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# sql_mode                        = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

## Replication
server_id                       = 200

## Master Configuration
binlog-do-db                    = my_db_1
binlog-do-db                    = my_db_2
binlog-do-db                    = my_db_3
binlog-do-db                    = my_db_4
binlog-do-db                    = my_db_5
binlog-do-db                    = my_db_6

另外,当我运行 SELECT * FROM mysql.user; 时,我看不到 repl 用户据称是 Master 上的“奴隶”。

但是,我确实看到 localhost 有复制授权:

mysql> select Host, User, grant_priv, Repl_slave_priv, Repl_client_priv from mysql.user;
+-----------------+---------------+------------+-----------------+------------------+
| Host            | User          | grant_priv | Repl_slave_priv | Repl_client_priv |
+-----------------+---------------+------------+-----------------+------------------+
| localhost       | root          | Y          | Y               | Y                |
| localhost       | mysql.sys     | N          | N               | N                |

这是我在重新启动时看到的错误示例(在我在​​ Master 上运行 STOP SLAVE; 之前):

2016-09-01T15:22:23.845505Z 384 [Note] Access denied for user 'repl'@'192.168.100.200' (using password: YES)
2016-09-01T15:22:23.845761Z 1 [ERROR] Slave I/O for channel '': error connecting to master 'repl@192.168.100.200:3306' - retry-time: 30  retries: 8, Error_code: 1045
2016-09-01T15:22:50.191636Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 6843ms. The settings might not be optimal. (flushed=15210 and evicted=0, during the time.)

除此之外,复制运行良好。对 Master 的写入完美地显示在真实的只读 Slave 上。


完整的my.cnf:

[mysql]
default_character_set           = utf8

[mysqld]
datadir                         = /var/lib/mysql
socket                          = /var/lib/mysql/mysql.sock

symbolic-links                  = 0

## Custom Configuration
skip_external_locking           = 1
skip_name_resolve
open_files_limit                = 20000

## Cache
thread_cache_size               = 16
query_cache_type                = 1
query_cache_size                = 256M
query_cache_limit               = 4M

## Per-thread Buffers
sort_buffer_size                = 32M
read_buffer_size                = 4M
read_rnd_buffer_size            = 8M
join_buffer_size                = 2M

## Temp Tables
tmp_table_size                  = 1024M
max_heap_table_size             = 1024M

## Networking
back_log                        = 250
max_connections                 = 512
max_connect_errors              = 100000
max_allowed_packet              = 128M
interactive_timeout             = 1800
wait_timeout                    = 1800
character_set_client_handshake  = FALSE
character_set_server            = utf8mb4
collation_server                = utf8mb4_unicode_ci

### Storage Engines
default_storage_engine          = InnoDB
innodb                          = FORCE

## MyISAM
key_buffer_size                 = 128M
myisam_sort_buffer_size         = 16M

## InnoDB
innodb_buffer_pool_size         = 46G
innodb_buffer_pool_instances    = 64
innodb_log_files_in_group       = 2
innodb_log_buffer_size          = 32M
innodb_log_file_size            = 64M
innodb_file_per_table           = 1
innodb_thread_concurrency       = 0
innodb_flush_log_at_trx_commit  = 1

## Logging
binlog_format                   = mixed
log_bin                         = /var/log/mysql/mysql-bin.log
sync_binlog                     = 1
pid_file                        = /var/run/mysqld/mysqld.pid
log_error                       = /var/log/mysql/error.log
#general_log                     = 0
#general_log_file                = /var/log/mysql/general.log
slow_query_log                  = 1
slow_query_log_file             = /var/log/mysql/slow.log
long_query_time                 = 3
expire_logs_days                = 14

sql_mode                        = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# sql_mode                        = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

## Replication
# Master Server ID:
server_id                       = 200
# Slave Server ID:
# server_id                       = 300

## Master Configuration
# Comment out on Slave
binlog-do-db                    = db_1
binlog-do-db                    = db_2
binlog-do-db                    = db_3
binlog-do-db                    = db_4
binlog-do-db                    = db_5
binlog-do-db                    = db_6

## Slave Configuration
# Uncomment the following on Slave
# relay-log                       = /var/log/mysql/mysql-relay-bin.log
# binlog-do-db                    = db_1
# binlog-do-db                    = db_2
# binlog-do-db                    = db_3
# binlog-do-db                    = db_4
# binlog-do-db                    = db_5
# binlog-do-db                    = db_6
# log_slave_updates               = 1
# read_only                       = 1
# slave_skip_errors               = 1062

[mysqld_safe]
datadir                         = /var/lib/mysql
socket                          = /var/lib/mysql/mysql.sock
symbolic-links                  = 0
pid_file                        = /var/run/mysqld/mysqld.pid
log_error                       = /var/log/mysql/error.log

还有:

mysql> SHOW GLOBAL VARIABLES LIKE '%master_info_repository%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| master_info_repository | FILE  |
+------------------------+-------+

【问题讨论】:

  • 可以添加完整的 my.cnf 吗?
  • @NorbertvanNobelen,是的。欢迎您在查看 my.cnf 时提供任何其他优化反馈。
  • 我在binlog-do-dbs 上加倍似乎有点奇怪。 Master 和 Slave 都应该有匹配的binlog-do-dbs 吗?
  • @NorbertvanNobelen,我看到localhost 有复制授权。这可能是原因吗?请参阅上面的更新信息。
  • 授权无关紧要,它们仅用于复制,但不会触发复制。主要问题似乎是服务器 ID。请把 server-id 设置为 1 看看能不能解决这个问题。

标签: mysql replication database-replication


【解决方案1】:

我认为您必须在主服务器上设置了主信息(也许这在某些时候是从服务器或从一个刷新)。运行

SHOW SLAVE STATUS

在主人身上。如果条目不是全部为空,那么这就是原因,并且在重新启动时(没有设置 skip-slave-start)MySQL 将尝试启动从属服务器。

要解决这个问题,在主服务器上,如果你还没有停止从服务器并运行

RESET SLAVE ALL

清除主设置 - 假设您使用的是 5.5.16 或更高版本,否则请不要使用 ALL。

这可以通过另一个SHOW SLAVE STATUS 来确认,它应该将所有条目显示为空。

当您现在重新启动时,从站将不会尝试启动。

如果您出于某种原因希望保留主设置,请将skip-slave-start 添加到您的my.cnf 下的[mysqld],然后这些设置将在启动时被忽略。

【讨论】:

    【解决方案2】:

    为了管理这种设置,我建议使用 MHA 管理器。对于这种特定情况,您可能需要清理 master_info_repository(默认位于 master.info)。此外,您可以在主控主机上使用--skip-slave-start 来避免故障转移后出现这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 2011-11-17
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多