Linux Mysql 5.7主从同步与问题解决详细教程

一、下载linux

跳转官方下载地址
Linux Mysql 5.7主从同步与问题解决详细教程_第1张图片

二、安装和配置

1、解压安装包

tar -zxvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
#移动解压后的目录
mv mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local/mysql
mkdir /usr/local/mysql/data

2、配置mysql用户组,此处必须设置

cd /usr/local/mysql
groupadd mysql
useradd mysql -g mysql
#后面的 . 必须要有,否侧会报错,修改不成功
chown -R mysql . 
chgrp -R mysql . 

3、安装数据库

1)初始化数据库

/usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
#最终打印出下面,冒号后面就是初始密码
A temporary password is generated for root@localhost:FCT*pV2Zk

2)配置环境变量

vi /etc/profile
export MYSQL_HOME="/usr/local/mysql"
export PATH="$PATH:$MYSQL_HOME/bin"

3)设置mysql为服务

source /etc/profile
cp  /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql
systemclt start mysql

4)修改密码

#使用初始密码登录
mysql -uroot -p
#修改密码
set password=password("123456"); 

三、配置主从同步

主从同步逻辑:从数据库会读取主数据库binlog里的二进制数据,存的就是主的操作sql,所以要开启binlog日志。

1、配置主

1)配置主my.cnf

vim /etc/my.cnf
[mysqld]
server-id=22 #主的唯一编码,不能和从一样
log-bin=mysql-bin #开启binlog日志,必须要开启才能同步数据
expire_logs_days=7 #删除超过7天的binlog日志
binlog-do-db=test #需要同步的数据库
 #不同步的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#解决group by报错问题
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1 #转为小写运行sql
basedir=/usr/local/mysql # 安装目录
datadir=/usr/local/mysql/data #数据&日志存放目录,binlog就在此处
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

#重启mysql
systemctl restart mysql

2)创建主的slave同步用户

mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* to 'replica'@'%' identified by '123456';
FLUSH PRIVILEGES;

3)查看主状态

#查看主状态,有数据则说明开启成功,file和position在从会用到
mysql> show master status;
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                                            | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+
| mysql-bin.000001 |   100    | test         | mysql,information_schema,performance_schema,sys,manufacture |                   |
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+

#查看是否开启binlog日志,ON开启,OFF关闭,为OFF重启mysql,或查看my.cnf是否开启binlog
mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

2、配置从

1)配置my.cnf

vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
log-bin=mysql-bin
server-id=125
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

!includedir /etc/my.cnf.d
#重启mysql
systemctl restart mysql

2)从数据库关联主

在从数据库运行此命令,填入在主show master status;显示的file和position值

#主服务器ip,主创建的slave账号,主状态的file和position值
change master to master_host='192.168.1.91',master_user='replica',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=100;
#开启从同步
start slave;
#查看从同步状态,最后两个都显示yes才是成功
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.91
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 211862
               Relay_Log_File: ecs-365681-0001-relay-bin.000003
                Relay_Log_Pos: 42249
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes #必须yes
            Slave_SQL_Running: Yes #必须yes

3 完成

根据上方配置,全部配置好,就可以测试主从同步了。
出现不同步问题,或者报错问题,请看查看下方的问题解决。

四、问题解决

首先主从服务器是能够ping通的,我默认你没有通信上的问题。

1、解决从同步状态为NO

#查看异常日志,找到Last_Error
mysql> show slave status \G;
 Last_Error: Could not execute Update_rows event on table test.user

解决方法:

一般是因为主和从数据不一致导致报错,比如主的表或者列数据在从找不到,如果从是一个全新的环境,而主是有数据的生产环境,这时需要把主的数据库先导入进从,导出后需要记住导出时的主状态position值。

#下方命令都是在从数据库运行
#停止从同步
stop slave;
#删除主的所有同步信息
reset slave all;
#重新配置同步,填入导出时的position,比如导出时position是200,那就是从200位置开始同步
change master to master_host='192.168.1.91',master_user='replica',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=200;
start slave;

2、主一直在写数据,从一直不能同步

如果根据第一点还是报错,–start-position=124310 可以查看主的binlog日志对应的这条报错sql是什么。
如果你只对某个特定时间范围内的SQL语句感兴趣,可以使用–stop-datetime和–start-datetime选项来限制输出的时间范围。

#切换到从
#查看报错binlog的位置
mysql> show slave status \G;
Read_Master_Log_Pos: 124310
#切换到主
#查看postion位置的报错sql
cd /usr/local/mysql/bin
./mysqlbinlog --base64-output=DECODE-ROWS --verbose  --start-position=124310 ../data/mysql-bin.000001 |head -n 100

解决方法:

知道了报错sql,那就根据报错sql来修复数据,比如更新操作,发现从没有这条数据,那就插入这条数据。
如果表数据太多了,可以用navicat对两个数据库某个表进行数据同步,此时同步的数据是最新的,所以要重新绑定主的最新position位置,重新绑定命令就是第一个问题的解决方案。

3、跳过报错

根据position跳过某次报错

#查看报错binlog的位置
mysql> show slave status \G;
找到打印:Read_Master_Log_Pos: 124310

  STOP SLAVE;
  #报错的position的位置
  SET GLOBAL sql_slave_skip_counter = 124310;
  START SLAVE;
  show slave status\G

你可能感兴趣的:(linux,adb,运维)