因為init_command 導致的 mysql 5.6 主從連線失敗的案例一則。

babyyellow發表於2018-09-17

mysql  5.6 從庫主機安排了計劃性重啟,  重啟主機後, 問題來了。
例項 無法連線master 了。 

報錯如下:

[code]
2018-09-17 12:21:50 28554 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='192.168.8.42', master_port= 3307, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='192.168.8.42', master_port= 3307, master_log_file='', master_log_pos= 4, master_bind=''.2018-09-17 12:21:58 28554

 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended.

 Please consider using the USER and PASSWORD connection options for START SLAVE; 

see the 'START SLAVE Syntax' in the MySQL Manual for more information.2018-09-17 12:21:58 28554

[Note] Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './relay-bin.000001' position: 42018-09-17 12:21:58 28554

 [Note] Slave I/O thread: connected to master 'repl@192.168.8.42:3307',replication started in log 'FIRST' at position 42018-09-17 12:21:58 28554

 [Warning] "SELECT UNIX_TIMESTAMP()" failed on master, do not trust column Seconds_Behind_Master of SHOW SLAVE STATUS. Error: Aborted connection 12505106 to db: 'unconnected' user: 'repl' host: '192.168.8.43' (init_connect command failed) (1184)2018-09-17 12:21:58 28554 [ERROR] Slave I/O: The slave I/O thread stops because a fatal error is encountered  when it tries to SET @master_heartbeat_period on master. Error: , Error_code: 15932018-09-17 12:21:58 28554 

[Note] Slave I/O thread exiting, read up to log 'FIRST', position 4
[/code]

咋回事呢, 同事重置了slave 還是報錯。 

因為啟用了gtid  , 兩邊對照了gtid 的各個引數都是一致的。 也排除了gtid 的故障。 

因為重啟之前都是OK 的, 也不存資料問題。 納悶了。 

看日誌就上上面這樣了。 

一時沒明白過來。 去主庫上看看 。 

問題找到了。 

#init_connect='set names gbk;insert into db_monitor.accesslog(thread_id,log_time,localname,matchname) values(connection_id(),now(),user(),current_user());commit;'

主庫上的init_command  引數 加了一條sql 語句。 

對應到了日誌裡的 init_command 的報錯。 

看看許可權 

[code]

mysql.sock@(none)> use mysql 

Database changed

mysql.sock@mysql> select * from  tables_priv   ;

+------+------------+--------------+------------+----------------+---------------------+------------+-------------+

| Host | Db         | User         | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |

+------+------------+--------------+------------+----------------+---------------------+------------+-------------+

| %    | db_monitor | user_app | accesslog  | root@localhost | 0000-00-00 00:00:00 | Insert     |             |

+------+------------+--------------+------------+----------------+---------------------+------------+-------------+

1 row in set (0.02 sec)

mysql.sock@mysql> 

[/code]

把init_command   註釋掉後,  一切都ok 了。 

原來之前因為某個事件 , 增加了一點審計功能, 就用init_command  實現了。 

原來是忘記給repl 授權了。  

導致  repl 再次登入的時候, 無權操作這個insert 語句報錯。退出了。無法連線master . 

此則 案例記錄之。 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2214315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章