mysql的主从配置及相关问题

本文详细介绍了MySQL的主从配置步骤,包括主从数据库的版本匹配、用户权限设置、配置文件修改等,并提供了 Slave_IO_Running 和 Slave_SQL_Running 状态异常的解决方法。此外,还探讨了读写分离的配置建议,强调通过特定用户进行读写操作以实现负载均衡。
摘要由CSDN通过智能技术生成

主从配置

一、准备工作:
1.主从数据库版本要一致
2.主从数据库内数据要保持一致
主数据库:10.0.22.55 /linux
从数据库:10.0.22.56 /linux
二、主数据库master修改:
1.修改mysql配置
找到主数据库的配置文件my.cnf(或者my.ini),在/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

2.重启mysql,创建用于同步的用户账号
打开mysql会话shell>mysql -hlocalhost -uname -ppassword
创建用户并授权:用户:cluser 密码:clpass

CREATE USER 'cluser'@'10.0.22.56' IDENTIFIED BY 'clpass'; #创建用户
GRANT REPLICATION SLAVE ON *.* TO 'cluser'@'10.0.22.56'; #分配权限
flush privileges; #刷新权限

3.查看master状态,记录二进制文件名(mysql-bin.000003)和位置(73):

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

二、从服务器slave修改:
1.修改mysql配置
同样找到my.cnf配置文件,添加server-id

[mysqld]
server-id=2 #设置server-id,必须唯一

2.重启mysql,打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):

CHANGE MASTER TO
    MASTER_HOST='10.0.22.55',
    MASTER_USER='cluser',
    MASTER_PASSWORD='clpass',
    MASTER_LOG_FILE='mysql-bin.000003',
    MASTER_LOG_POS=73;

3.启动slave同步进程:

start slave;

4.查看slave状态:

show slave status\G;
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: 10.0.22.55
                 Master_User: cluser
                 Master_Port: 3306
               Connect_Retry: 60
             Master_Log_File: mysql-bin.000013
         Read_Master_Log_Pos: 11662
              Relay_Log_File: mysqld-relay-bin.000022
               Relay_Log_Pos: 11765
       Relay_Master_Log_File: mysql-bin.000013
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
             Replicate_Do_DB: 
         Replicate_Ignore_DB: 
       ...

当Slave_IO_Running和Slave_SQL_Running都为YES的时候,主从同步配置成功。

验证

在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

其他相关参数补充:

master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,可在mysql配置文件/etc/mysql/my.cnf中配置。

[mysqld]   #可添加修改如下选项:

#不同步哪些数据库  
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
  
#只同步哪些数据库,除此之外,其他不同步  
binlog-do-db = game  

问题解决

1、Slave_IO_Running状态为Connecting

错误为:IO线程处于正在连接状态
分析:网络、用户、权限

1)查看网络是否互通,端口是否互通。
ping一下IP,telnet一下端口,
参考关闭防火墙命令:systemctl stop firewalld

2)网络无问题后,主节点上查看用户cluser是否存在

select host, user from mysql.user;
+-----------------------+------+
| host                  | user |
+-----------------------+------+
| %                     | root |
| 127.0.0.1             | root |
| ::1                   | root |
| localhost             |      |
| localhost             | root |
| localhost.localdomain |      |
| localhost.localdomain | root |
+-----------------------+------+
7 rows in set (0.03 sec)

不存在,则新建用户重新配置
3)用户存在时,查看用户权限是否正确

show grants for 'user'@'host';
ERROR 1141 (42000): There is no such grant defined for user 'user' on host 'host'

用户无权限,重新赋权(先执行刷新权限试试,是不是分配权限后,忘记刷新了?)。

GRANT REPLICATION SLAVE ON *.* TO 'cluser'@'10.0.22.56'; #分配权限
flush privileges; #刷新权限

2、Slave_SQL_Running状态为No

stop slave;                                                      
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE;
start slave;                                                      
show slave status\G  

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
跳过从主节点接下来的N个事件。这个参数用来修复由SQL语句导致的复制停止。
只有当slave节点的线程没有运行的时候,这个语句才有效。否则,会产生报误。

3、Slave_IO_Running状态为No

查看主服务器上的File ,show master status\G

show master status \G;
*************************** 1. row ***************************
             File: master-bin.000004
         Position: 120
     Binlog_Do_DB: test
 Binlog_Ignore_DB: mysql,information_schema
Executed_Gtid_Set: 
1 row in set (0.00 sec)

从服务器上查看Master_Log_File, show slave status\G

show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.202.56
                  Master_User: masterbackup
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000024
          Read_Master_Log_Pos: 120
               Relay_Log_File: slave-relay-bin.000005
                Relay_Log_Pos: 284
        ...

如果Slave_IO_Running状态为No,则很可能是两个值不相同造成的。
取master的file值,在从节点上执行命令:

slave stop;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
slave start; 

mysql读写分离配置

建议:读写分离,给个用户,代码实现,读若干用户,写一个用户

补充链接:基于Atlas的分库分表操作目前还未补充,暂时缺失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值