2016-09-01 8 views
13

간단한 MySQL 복제 마스터 - 슬레이브 구성에서 마스터가 재부팅시 슬레이브로 자체 연결을 시도 할 때 문제가 발생합니다.왜 Master는 재부팅시 슬레이브라고 생각합니까?

따라서 Master에서 MySQL을 다시 시작하면 동일한 서버가 자체적으로 복제하려고하는 것과 관련된 오류가 발생하고 MySQL을 다시 시작할 때마다 수동으로 mysql -e "STOP 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 사용자가 표시되지 않습니다.

하지만, 내가 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    | 

여기에 내가 다시 부팅에 표시되는 오류의 예 (나는 마스터에 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 '[email protected]: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.) 

이 외에도 복제가 정상적으로 실행 중입니다. 마스터에게 쓰기는 실제의 읽기 전용 슬레이브에 완벽하게 표시됩니다. 전체 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 | 
+------------------------+-------+ 
+0

전체 my.cnf를 추가 할 수 있습니까? –

+0

@NorbertvanNobelen, 예. 나는 당신이 그것을보고있는 동안'my.cnf'에 대한 다른 최적화 피드백을 환영 할 것입니다. – Ryan

+0

'binlog-do-db's에서 두번 이상 해 보입니다. 마스터와 슬레이브가 모두'binlog-do-db'와 일치해야합니까? – Ryan

답변

1

내가 MHA 관리자를 사용하는 것이 좋습니다 설정의이 종류를 관리하십시오. 이 특정 상황에서는 master_info_repository (기본적으로 master.info에 있음)을 정리할 수 있습니다. 또한 장애 조치 후이 상황을 피하기 위해 마스터 호스트에서 --skip-slave-start을 사용할 수 있습니다.

1

마스터 서버에서 마스터 정보를 설정 했어야합니다 (어쩌면 슬레이브 였거나 슬레이브 였을 수도 있습니다). 실행

SHOW SLAVE STATUS 

항목이 모두 비어 있지 않으면 원인이되고 다시 부팅 할 때 (skip-slave-start이 설정되지 않은 경우) MySQL이 슬레이브를 시작하려고 시도합니다.

RESET SLAVE ALL 

마스터 설정을 취소하면 아직 작성하지 않은 경우, 슬레이브를 중지 마스터에,이 문제를 해결하고 실행 - 당신이 ALL을 떠나 높은 그렇지 않으면 5.5.16를 사용하거나된다고 가정 .

이것은 SHOW SLAVE STATUS으로 확인할 수 있으며 모든 항목이 비어 있어야합니다.

이제 재부팅 할 때 슬레이브는 시작하지 않습니다.

마스터 설정을 그대로 유지하려면 my.cnfskip-slave-start[mysqld] 아래에 추가하면 시작시 설정이 무시됩니다.