mysql主从 机器名_mysql主从之主机名导致主从机制失败的问题

一 主库

mysql主服务器的正确配置需要指定log-bin、log-bin-index

server-id = 1

log-bin=master-bin

log-bin-index = master-bin.index

如果使用正确的配置,主机名改变后,即使mysql重启了,主从同步是能够照常进行的。

如不指定的话,binlog文件名就会依赖于主机名,如下配置

server-id = 1

log-bin

例如配置变为:

[mysqld]

bind-address=0.0.0.0port=3306datadir=/data/mysql

socket=/data/mysql/mysql.sock

user=mysql

skip-name-resolve

slow_query_log=on

long_query_time=1slow_query_log_file=/data/mysql/mysql-slow.log

innodb-file-per-table=1innodb_flush_log_at_trx_commit= 2log_warnings= 1connect_timeout= 60net_read_timeout= 120performance_schema_max_table_instances= 400server-id = 1log-bin #之开启斌log日志,不指定日志名

[mysqld_safe]

log-error=/data/mysql/mysqld.log

pid-file=/data/mysql/mysqld.pid

主机名改变会导致binlog文件名改变,binlog文件名改变,主从同步会出问题,多台从库的话,所有从库都会出问题

[root@master mysql]# vim /etc/my.cnf

[root@master mysql]# hostnamectl set-hostname mater1

[root@master mysql]# hostname

mater1

[root@master mysql]# systemctl restart mysqld

[root@master mysql]# ll

-rw-r-----. 1 mysql mysql 56 Jul 3 11:37auto.cnf-rw-r-----. 1 mysql mysql 304 Jul 4 10:27ib_buffer_pool-rw-r-----. 1 mysql mysql 12582912 Jul 4 10:27ibdata1-rw-r-----. 1 mysql mysql 50331648 Jul 4 10:27ib_logfile0-rw-r-----. 1 mysql mysql 50331648 Jul 3 11:37ib_logfile1-rw-r-----. 1 mysql mysql 12582912 Jul 4 10:27ibtmp1-rw-r-----. 1 mysql mysql 1984 Jul 4 10:25 master-bin.000001

-rw-r-----. 1 mysql mysql 177 Jul 4 10:27 master-bin.000002

-rw-r-----. 1 mysql mysql 40 Jul 4 10:25 master-bin.index-rw-r-----. 1 mysql mysql 154 Jul 4 10:27 mater1-bin.000001 #改变之后的日志名

-rw-r-----. 1 mysql mysql 20 Jul 4 10:27 mater1-bin.index

drwxr-x---. 2 mysql mysql 4096 Jul 3 11:37mysql-rw-r-----. 1 mysql mysql 890 Jul 4 10:27 mysql-slow.log

srwxrwxrwx.1 mysql mysql 0 Jul 4 10:27mysql.sock-rw-------. 1 mysql mysql 6 Jul 4 10:27mysql.sock.lock

drwxr-x---. 2 mysql mysql 8192 Jul 3 11:37performance_schema

drwxr-x---. 2 mysql mysql 8192 Jul 3 11:37 sys

查看slave的状态

mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State:

Master_Host:192.168.132.121Master_User: replication

Master_Port:3306Connect_Retry:60Master_Log_File: master-bin.000002Read_Master_Log_Pos:154Relay_Log_File: relay-log.000005Relay_Log_Pos:369Relay_Master_Log_File: master-bin.000002Slave_IO_Running: No

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:154Relay_Log_Space:737Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: NULL

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno:1236Last_IO_Error: Got fatal error1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' #错误信息Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:1Master_UUID: 77278e78-9da8-11e9-bc6c-000c2991dd19

Master_Info_File:/data/mysql/master.infoSQL_Delay:0SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waitingfor moreupdates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:190704 10:28:05Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

主端创建库

mysql>create database darren;

Query OK,1 row affected (0.00sec)

mysql>use darren;

Database changed

mysql> create table test (id int);

Query OK,0 rows affected (0.01 sec)

测试shell脚本,一直在主库插入数据

[root@master mysql]# while true ;  do mysql -uroot -p123456  -e 'use darren;insert into test values (1);'; sleep 1; done

演示主从同步失败

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

处理方法

stop slave; #停止同步

reset slave; #重置slave,这个操作会使用slave的配置丢失,由于binlog文件名改变了,所以slave得重新配置

#从新binlog的第一个binlog文件+第一个位置

主端信息:

mysql>show master logs;+-------------------+-----------+

| Log_name | File_size |

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

| mater1-bin.000001 | 10330 |

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

1 row in set (0.00sec)

mysql> show binlog events in 'mater1-bin.000001';+-------------------+-------+----------------+-----------+-------------+------------------------------------------+

| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |

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

| mater1-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.26-log, Binlog ver: 4 |

| mater1-bin.000001 | 123 | Previous_gtids | 1 | 154 | |

| mater1-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |

......

| mater1-bin.000001 | 10136 | Query | 1 | 10210 | BEGIN |

| mater1-bin.000001 | 10210 | Table_map | 1 | 10259 | table_id: 108 (darren.test) |

| mater1-bin.000001 | 10259 | Write_rows | 1 | 10299 | table_id: 108 flags: STMT_END_F |

| mater1-bin.000001 | 10299 | Xid | 1 | 10330 | COMMIT /*xid=209*/ |

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

196 rows in set (0.00 sec)

日志的第一个位置4

从端配置

mysql>stop slave;

Query OK,0 rows affected (0.00sec)

mysql>reset slave;

Query OK,0 rows affected (0.01sec)

mysql> change master to master_host='192.168.132.121',master_port=3306,master_user='replication',master_password='1234567',master_log_file='mater1-bin.000001',master_log_pos=4;

Query OK,0 rows affected, 2 warnings (0.01sec)

mysql>start slave;

Query OK,0 rows affected (0.00sec)

mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingformaster to send event

Master_Host:192.168.132.121Master_User: replication

Master_Port:3306Connect_Retry:60Master_Log_File: mater1-bin.000001Read_Master_Log_Pos:10330Relay_Log_File: relay-log.000002Relay_Log_Pos:10545Relay_Master_Log_File: mater1-bin.000001Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:10330Relay_Log_Space:10746Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert: No

Last_IO_Errno:0Last_IO_Error:

Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:1Master_UUID: 77278e78-9da8-11e9-bc6c-000c2991dd19

Master_Info_File:/data/mysql/master.infoSQL_Delay:0SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waitingfor moreupdates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:1 row in set (0.00 sec)

验证数据

mysql>show databases;+--------------------+

| Database |

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

| information_schema |

| darren |

| mysql |

| performance_schema |

| sys |

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

5 rows in set (0.00sec)

mysql>use darren;

Database changed

mysql>show tables;+------------------+

| Tables_in_darren |

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

| test |

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

1 row in set (0.00sec)

mysql> select *from test;+------+

| id |

+------+

| 1 |

| 1 |

| 1 |

| 1 |

| 1 |

| 1 |

验证成功

二 从库

mysql从库正确的配置需要指定relay-log、relay-log-index

server-id = 2

relay-log = relay-log

relay-log-index = relay-log.index

如果是使用正确的配置,从库重启的话,主从同步能够照常进行。

没指定relay-log、relay-log-index

默认依赖于主机名,主机名改变,有发生mysql重启,重启后主从同步失败

配置如下:

[mysqld]

bind-address=0.0.0.0port=3306datadir=/data/mysql

socket=/data/mysql/mysql.sock

user=mysql

skip-name-resolve

slow_query_log=on

long_query_time=1slow_query_log_file=/data/mysql/mysql-slow.log

innodb-file-per-table=1innodb_flush_log_at_trx_commit= 2log_warnings= 1connect_timeout= 60net_read_timeout= 120performance_schema_max_table_instances= 400server-id = 2[mysqld_safe]

log-error=/data/mysql/mysqld.log

pid-file=/data/mysql/mysqld.pid

[root@slave ~]# hostnamectl set-hostname slave1

[root@slave ~]# hostname

slave1

[root@slave ~]# systemctl start mysqld

[root@slave ~]# cd /data/mysql/

[root@slave mysql]# ll

-rw-r-----. 1 mysql mysql 56 Jul 3 11:56auto.cnf

drwxr-x---. 2 mysql mysql 52 Jul 4 10:41darren-rw-r-----. 1 mysql mysql 416 Jul 4 10:58ib_buffer_pool-rw-r-----. 1 mysql mysql 12582912 Jul 4 11:00ibdata1-rw-r-----. 1 mysql mysql 50331648 Jul 4 11:00ib_logfile0-rw-r-----. 1 mysql mysql 50331648 Jul 3 11:56ib_logfile1-rw-r-----. 1 mysql mysql 12582912 Jul 4 11:00ibtmp1-rw-r-----. 1 mysql mysql 139 Jul 4 11:00 master.infodrwxr-x---. 2 mysql mysql 4096 Jul 3 11:56mysql-rw-r-----. 1 mysql mysql 530 Jul 4 11:00 mysql-slow.log

srwxrwxrwx.1 mysql mysql 0 Jul 4 11:00mysql.sock-rw-------. 1 mysql mysql 5 Jul 4 11:00mysql.sock.lock

drwxr-x---. 2 mysql mysql 8192 Jul 3 11:56performance_schema-rw-r-----. 1 mysql mysql 201 Jul 4 10:41 relay-log.000001

-rw-r-----. 1 mysql mysql 10568 Jul 4 10:58 relay-log.000002

-rw-r-----. 1 mysql mysql 38 Jul 4 10:41 relay-log.index-rw-r-----. 1 mysql mysql 58 Jul 4 10:58 relay-log.info

-rw-r-----. 1 mysql mysql 177 Jul 4 11:00 slave1-relay-bin.000001 #新的日志名

-rw-r-----. 1 mysql mysql 26 Jul 4 11:00 slave1-relay-bin.index

drwxr-x---. 2 mysql mysql 8192 Jul 3 11:56 sys

进入数据库

mysql>start slave;

ERROR1872 (HY000): Slave failed to initialize relay log infostructure from the repository

mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State:

Master_Host:192.168.132.121Master_User: replication

Master_Port:3306Connect_Retry:60Master_Log_File: mater1-bin.000001Read_Master_Log_Pos:10330Relay_Log_File: relay-log.000002Relay_Log_Pos:10545Relay_Master_Log_File: mater1-bin.000001Slave_IO_Running: No

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:1872Last_Error: Slave failed to initialize relay loginfostructure from the repository

Skip_Counter:0Exec_Master_Log_Pos:10330Relay_Log_Space:0Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: NULL

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno:0Last_IO_Error:

Last_SQL_Errno:1872Last_SQL_Error: Slave failed to initialize relay loginfostructure from the repository

Replicate_Ignore_Server_Ids:

Master_Server_Id:0Master_UUID: 77278e78-9da8-11e9-bc6c-000c2991dd19

Master_Info_File:/data/mysql/master.infoSQL_Delay:0SQL_Remaining_Delay: NULL

Slave_SQL_Running_State:

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:190704 11:02:52Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:1 row in set (0.00 sec)

Last_Errno: 1872

Last_Error: Slave failed to initialize relay log info structure from the repository

解决方案

需要记录当前主从同步的位置信息,一定得记录,不然同步的数据就会不全

Master_Log_File: mater1-bin.000001

Read_Master_Log_Pos: 10330

模拟主库正在写数据

[root@master mysql]# while true ;  do mysql -uroot -p123456  -e 'use darren;insert into test values (1);'; sleep 1; done

从库修复

mysql> change master to master_host='192.168.132.121',master_port=3306,master_user='replication',master_password='1234567',master_log_file='mater1-bin.000001',master_log_pos=10330;

mysql>start slave;

Query OK,0 rows affected (0.01sec)

mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingformaster to send event

Master_Host:192.168.132.121Master_User: replication

Master_Port:3306Connect_Retry:60Master_Log_File: mater1-bin.000001Read_Master_Log_Pos:31050Relay_Log_File: slave1-relay-bin.000002Relay_Log_Pos:21041Relay_Master_Log_File: mater1-bin.000001Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:31050Relay_Log_Space:21249Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert: No

Last_IO_Errno:0Last_IO_Error:

Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:1Master_UUID: 77278e78-9da8-11e9-bc6c-000c2991dd19

Master_Info_File:/data/mysql/master.infoSQL_Delay:0SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waitingfor moreupdates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

验证数据一致性

主库:

mysql> select *from darren.test;118 rows in set (0.00sec)

从库:

mysql> select *from darren.test;118 rows in set (0.00 sec)

实验完成,回复原有正确配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值