欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql5.7.31 主从复制搭建

程序员文章站 2022-03-19 16:17:45
Mysql 主从复制一.检查环境机器一(192.168.0.109) centos7,mysql5.7.31开放3306端口机器二(192.168.0.111) centos7,mysql5.7.31开放3306端口需要注意 如果是通过克隆虚拟机方式搭建环境 注意坑 mysql server uuid 冲突# 找到mysql datadirmysql> show variables like 'datadir';+---------------+-------...

Mysql 主从复制

一.检查环境

  • 机器一(192.168.0.109) centos7,mysql5.7.31

    • 开放3306端口
  • 机器二(192.168.0.111) centos7,mysql5.7.31

    • 开放3306端口
  • 需要注意 如果是通过克隆虚拟机方式搭建环境 注意坑 mysql server uuid 冲突

    • # 找到mysql datadir
      mysql> show variables like 'datadir';
      +---------------+--------------+
      | Variable_name | Value        |
      +---------------+--------------+
      | datadir       | /data/mysql/ |
      +---------------+--------------+
      1 row in set (0.01 sec)
      
      ----------------------------------------------
      # 编辑 /data/mysql/ 路径下 auto.cnf 文件
      [auto]
      server-uuid=80422fd7-34a5-11eb-b54e-000c29d7a930
      
      # 将uuid修改至唯一,随便更改一位即可 保存退出 重启mysql服务
      service mysqld restart
      

二.修改 mysql配置文件

  • 新增配置文件 master-slave.cnf 位于/etc/my.cnf.d/文件夹下
# master-slave.cnf 文件内容如下 根据提示相应修改
[mysqld]
# *设置server_id,一般设置为IP 要有唯一性* 
server_id=110
# 复制过滤:需要备份的数据库,输出binlog
#binlog-do-db=roncoo
# 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
# 中继日志
relay_log=mysql-relay-bin
# 开启二进制日志功能,可以随便取,最好有含义
log-bin=mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  • /etc/my.cnf 中引入/etc/my.cnf.d/文件夹下的配置文件

    !includedir /etc/my.cnf.d 追加到/etc/my.cnf 文件末尾

    • 方式一:
    [root@192 ~]# echo '!includedir /etc/my.cnf.d' >> /etc/my.cnf
    
    • 方式二:
    vim 编辑 /etc/my.cnf 将 !includedir /etc/my.cnf.d 追加到文件末尾
    

1.修改两台机器 /etc/my.cnf 配置文件

  • 机器一 ( 192.168.0.109)
  • /etc/my.cnf
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
skip-name-resolve
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=/usr/local/env/mysql-5.7.31
# 设置mysql数据库的数据的存放目录
datadir=/data/mysql
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
symbolic-links=0
explicit_defaults_for_timestamp=true
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.log
log-error=/data/mysql/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid
pid-file=/data/mysql/mariadb.pid
!includedir /etc/my.cnf.d
  • /etc/my.cnf.d/master-slave.cnf
[mysqld]
# *设置server_id,一般设置为IP 要有唯一性* 
server_id=109
# 复制过滤:需要备份的数据库,输出binlog
#binlog-do-db=roncoo
# 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
# 中继日志
relay_log=mysql-relay-bin
# 开启二进制日志功能,可以随便取,最好有含义
log-bin=mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  • 机器二 ( 192.168.0.111)

  • /etc/my.cnf

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
skip-name-resolve
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=/usr/local/env/mysql-5.7.31
# 设置mysql数据库的数据的存放目录
datadir=/data/mysql
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
symbolic-links=0
explicit_defaults_for_timestamp=true
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.log
log-error=/data/mysql/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid
pid-file=/data/mysql/mariadb.pid
!includedir /etc/my.cnf.d
  • /etc/my.cnf.d/master-slave.cnf
[mysqld]
# *设置server_id,一般设置为IP 要有唯一性* 
server_id=111
# 复制过滤:需要备份的数据库,输出binlog
#binlog-do-db=roncoo
# 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
# 中继日志
relay_log=mysql-relay-bin
# 开启二进制日志功能,可以随便取,最好有含义
log-bin=mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

2.重启两台机器mysql服务

service mysqld restart

3.新增slave用户 配置 开始主从复制

​ 两台机器mysql服务主从配置完成后 是可以 互为主从 的, 我们先做主从模式

  • 选出一台机器做Master(192.168.0.109) 一台机器做Slave(192.168.0.111)

  • 在Master机器上新增用户,并查看Master状态;

    • 新增用户
    # 新增用户 slave 允许从ip为192.168.0.111的机器,通过密码 pwd.slave 来访问
    mysql> grant replication slave,replication client on *.* to 'slave'@'192.168.0.111' identified by 'pwd.slave';
    
    # 刷新使其生效;
    mysql> FLUSH PRIVILEGES;
    
    • 查看Master status;
    #查看Master status;
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |     1307 |              | mysql            |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    # 记住文件名 mysql-bin.000002 和 Position 1307;
    
  • 在Slave机器上 设置链接master的信息,并开始主从复制;

    • 在Slave机器上 设置链接master的信息
    # 先停止以下,避免会出错;
    mysql> stop slave;
    Query OK, 0 rows affected (0.00 sec)
    
    # 设置master服务器的一些参数 参数说明看下面的解释
    mysql> change master to master_host='192.168.0.109', master_user='slave', master_password='pwd.slave', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=1060, master_connect_retry=30;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    # start slave
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    # 查看slave status
    mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.0.109
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 30
                  Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 1307
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000002
                 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: 1307
                  Relay_Log_Space: 527
                  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: 111
                      Master_UUID: 80422fd7-34a5-11eb-b54e-0100c29da930
                 Master_Info_File: /data/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)
    
    # 当看到 以下时 说明链接成功...
                Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    master_host='192.168.0.109' 			# Master的IP地址
    master_user='slave' 					# 用于同步数据的用户(在Master中授权的用户)
    master_password='pwd.slave'				# 同步数据用户的密码
    master_port=3306						# Master数据库服务的端口
    master_log_file='mysql-bin.000002'		#指定Slave从哪个日志文件开始读复制数据(可在Master上使用show master status查看到日志文件名)
    master_log_pos=1307						# 从哪个POSITION号开始读
    master_connect_retry=30 				#当重新建立主从连接时,如果连接建立失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。
    
    # 可通过此命令查看链接状态 横向展示不便 就竖向展示了
    mysql> show processlist\G
    *************************** 1. row ***************************
         Id: 6
       User: root
       Host: 192.168.0.105:65147
         db: NULL
    Command: Sleep
       Time: 44
      State: 
       Info: NULL
    *************************** 2. row ***************************
         Id: 12
       User: slave
       Host: 192.168.0.111:56010
         db: NULL
    Command: Binlog Dump
       Time: 1067
      State: Master has sent all binlog to slave; waiting for more updates
       Info: NULL
    *************************** 3. row ***************************
         Id: 14
       User: root
       Host: localhost
         db: NULL
    Command: Query
       Time: 0
      State: starting
       Info: show processlist
    3 rows in set (0.00 sec)
    

4.测试MySQL的主从备份

测试就是在主库中进行DDL以及DML语句的执行,看从库是否会跟主库一样发生变化

master中

create database test01;
use test01;

CREATE TABLE `test01` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

insert into test01(username) values('zhangsan');

查看master与slave是否都有变化,如果数据一致,就说明配置成功

互为主从

将 新建主从用户 配置主从参数 互换着再来一次就好了 可以自己尝试

本文地址:https://blog.csdn.net/weixin_45228674/article/details/110530295