MySql两台机器互为主从

1、安装MySQL(maridb)
安装的话,可以参考自己写的这篇 maridb,其实安装步骤和 MySQL 差不多

maridb 离线安装

而且我建议如上述方式安装,不要使用yml之类的安装方式,那种方式,你安装完成后,安装流程你都不清楚。

2、配置双主从
如果只是配置单个的主从,可以参考自己写的文章

MySQL主从备份

2.1 配置 /etc/my.cnf
masterA(192.168.59.132) 配置文件

[[email protected]04 mysql]# vim /etc/my.cnf

这里我建议可以设置成和服务器ip后缀一致

server-id=132 
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=1
log-slave-updates

masterA 重启mysql:

 systemctl restart mysql.server

masterB(192.168.59.133) 配置文件


server-id=133
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=2
log-slave-updates

masterB 重启mysql:

 systemctl restart mysql.server

1
auto-increment 两行的配置,使 masterA字段产生的数值是 奇数1,3,5,7 下面的masterB 产生的是 2,4,6,8 等,这样会避开双主 id 重复的问题。

2.2、添加主从同步账户
让其它主机可以使用slave这个用户账号来登陆master主机的MySQL(如果在授权的用户不存在就会自动创建),一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全

masterA上:

[root@zhdy-04 mysql]# mysql -uroot

也就是其它机器可以用 slave 这个账户登录 masterA

mysql>GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
mysql> flush privileges;

masterB上:

[root@zhdy-04 mysql]# mysql -uroot

也就是其它机器可以用 slave 这个账户登录 masterB

mysql>GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

mysql> flush privileges;

2.3、查看主库的状态
masterA上:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      208 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

masterB上:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这里需要注意的两个bin-log 的名称以及下标,这个很重要,后面需要根据这个判断你从哪里开始同步。

2.4、配置同步信息
masterA上:

MySQL 默认开启了slave 模式,我们需要先把它关掉,配置好后再开启来。(你这里不停止,就执行下面的操作,MySQL也会提示你的)

mysql> stop slave;

注意这里的bin-log 文件和 master_log_pos 即bin-log的文件下标,就是上一步masterB的状态数据

mysql> change master to master_host='192.168.59.133',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=120;

mysql> start slave;

mysql> show slave status\G


*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.59.133
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
               Relay_Log_File: zhdy-04-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

masterB上:

MySQL 默认开启了slave 模式,我们需要先把它关掉,配置好后再开启来。(你这里不停止,就执行下面的操作,MySQL也会提示你的)

mysql> stop slave;

注意这里的bin-log 文件和 master_log_pos 即bin-log的文件下标,就是上一步masterA的状态数据

mysql> change master to master_host='192.168.59.132',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=208;

mysql> start slave;

mysql> show slave status\G

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.59.132
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 208
               Relay_Log_File: zhdy-05-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

主要注意那个 change master to …语句里面的参数masterA 使用masterB的bin-log日志文件名称以及下标。而对于masterB来说也这样相反的来
还要注意 stop salve 这个命令,比如说我在masterA(192.168.59.132) 上执行这个命令,其实是停止masterA作为slave的功能,因为对于MatserB(192.168.59.133)来说masterA就是slave。我们可以使用 show slave status; 命令查看,当前机器的主是谁,如下我在2.19上面查看,可以看到对于2.19来说主就是1.19,如果我在2.19上面执行 stop salve,那么2.19就不再是1.19的slave了。其中很多数据字段都是非常重要的。

2.5、测试
在两个数据库中互相操作,则会互相同步。具体操作省略…

3、问题的解决
主从配置后,一旦主节点重启后,可能就无法同步数据,原因是因为 binlog日志不一致了,一旦无法同步 其中的 slave_sql_running,Slave_IO_Running,肯定有一个是有问题的,具体的可以看下这篇文章。

MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法

mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。

一、问题描述:
当我们配置好MySQL主主同步时,是可以实现主主同步,但是重启机器后或者其他原因导致MySQL无法同步了。

二、Slave两个关键进程
mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。

三、如果是Slave_SQL_Running:no

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.181.134
                  Master_User: master1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 822
               Relay_Log_File: mysql-slave-relay-bin.000004
                Relay_Log_Pos: 534
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 

解决办法如下:

MariaDB [(none)]> stop slave;                                                      
MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;            
MariaDB [(none)]> start slave;                                                      
MariaDB [(none)]> show slave status\G  

四、如果是slave_io_running:no

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.181.134
                  Master_User: master1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 822
               Relay_Log_File: mysql-slave-relay-bin.000004
                Relay_Log_Pos: 534
        Relay_Master_Log_File: mysql-bin.000003
             Slave_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: 

解决办法如下:

1、查看主服务器

MariaDB [(none)]> show master status\G             

2、在从服务器上查看

问题所在:发现Master_Log_File没有对应。

3、出现Slave_IO_Running: No的机器上操作

MariaDB [(none)]> slave stop;                 
MariaDB [(none)]>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;  
MariaDB [(none)]> slave start;                               
MariaDB [(none)]> show slave status\G      

到此问题就解决了!

原文链接:点这里

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值