文章目录

  • 基于Mysql版本5.7
  • 一:一主一从
  • 0.赋予用户权限
  • 1.主节点开启binlog日志
  • 1.1修改my.cnf配置文件
  • 1.2重启数据库
  • 1.3查看状态
  • 2.从节点开启IO线程和sql线程
  • 2.1修改my.cnf配置文件
  • 2.2重启数据库
  • 2.3建立主从关系
  • 2.4.开启复制
  • 2.5查看状态
  • 可能出现问题
  • 二:主主复制
  • 1.修改从节点
  • 1.1修改my.cnf
  • 1.2重启数据库
  • 1.3创建用户,赋予权限
  • 2.修改主节点
  • 2.1建立连接
  • 2.2开启复制
  • 2.3查看状态
  • 三:复制延迟怎么解决
  • 四:mycat和sharding-jdbc


基于Mysql版本5.7

一:一主一从

0.赋予用户权限

只有复制权限

grant replication slave on *.* to '用户名'@'可以复制的ip(不填就是所有).%' identified by '密码'

通用权限

grant all on *.* to 'root'@'%' identified by '12345678'

刷新权限

flush privileges

1.主节点开启binlog日志

1.1修改my.cnf配置文件
#节点的唯一Id
server-id=1
#binlog日志的存放目录
log-bin=/var/lib/mysql/mysql-bin
#binlog的二进制日志格式,有row、statement、mixed三种格式
binlog-format=ROW
#同步的数据库名称(不填就是全部都复制)
binlog-do-db=test
#不同步的数据库名称
binlog_ignore_db=mysql

binlog-do-db和Replicate_Do_DB介绍

#在master上配置
binlog-do-db=指定mysql的binlog日志记录哪个db
binlog-ignore-db=不需要复制的数据库,如果复制多个数据库,重复设置这个选项即可
#在slave上配置
Replicate_Do_DB=指定slave要复制哪个库
replicate-ignore-db=指定slave不需要要复制哪个库
1.2重启数据库
service mysqld restart
#停止数据库
service mysqld stop
#启动数据库
service mysqld start

查看logbin状态

show variables like '%log_bin%';
1.3查看状态

mysql 主从 组复制 mysql主从复制过程_SSL

show master status;

File : binlog日志的文件,其中000001是索引

Position: 事件节点

2.从节点开启IO线程和sql线程

IO线程读主节点binlog的数据,再又sql线程执行

2.1修改my.cnf配置文件
#节点的唯一Id
server-id=2
#读取主节点binlog后数据存放目录
relay-log=/var/lib/mysql/relay-bin
#为上面的文件配置索引,可以省略
relay-log-index=/var/lib/mysql/relay-bin.index
#binlog格式
binlog-format=ROW
2.2重启数据库
service mysqld restart
#停止数据库
service mysqld stop
#启动数据库
service mysqld start
2.3建立主从关系
change master to master_host='主节点Ip',master_port=3306,master_user='用户名',master_password='密码',master_log_file='主节点binlog日志文件名',master_log_pos=偏移量;
change master to master_host='主节点ip',master_port=3306,master_user='root',master_password='12345678',master_log_file='mysql-bin.000003',master_log_pos=2322;
2.4.开启复制
start slave;
#停止复制
stop slave;
#重启复制
reset slave;
2.5查看状态
show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 从节点ip
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_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: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 521
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 9b4d4e6b-92e3-11ec-acd8-00163e160614
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql>

主要看这俩个参数

#io线程
Slave_IO_Running: Yes
#sql线程
Slave_SQL_Running: Yes

可能出现问题

1.防火墙端口号没开放
2.修改完配置没有重启mysql
3.server-id重复
4.数据不一致导致,sqlIO为No
	可以尝试: 
	1.删掉从库脏数据
	2. 停止备份 stop slave;
    3.重新连接 change master to ...master_log_pos=pos节点指向最新的;

二:主主复制

两个节点相互主从,把上面的配置给对方在来一遍就行了

1.修改从节点

1.1修改my.cnf
#添加binlog的存放目录,有了这个就会开启binlog
log-bin=/var/lib/mysql/mysql-bin
1.2重启数据库
service mysqld restart

查看binlog是否开启

show variables like '%log_bin%';
1.3创建用户,赋予权限
...

2.修改主节点

2.1建立连接
change master to master_host='主节点ip',master_port=3306,master_user='root',master_password='12345678',master_log_file='mysql-bin.000001',master_log_pos=154;
2.2开启复制
start slave;
2.3查看状态
show slave status\G;

三:复制延迟怎么解决

主库和从库的数据IO复制是需要一个时间的,可能会出现读写不一致的问题,无法完全解决

解决方案

1.加缓存
2.待学习

四:mycat和sharding-jdbc

这俩都实现了分库分表,读写分离(基于主从复制)