zoukankan      html  css  js  c++  java
  • centos8平台搭建mysql8数据库主从同步

    一,两台服务器的规划

        a服务器:主机名:yjweb  ip: 121.122.123.47        角色:主库      server-id:1
    
        j服务器:主机名: os3   ip:  121.122.123.134       角色:从库      server-id:2

    说明:1,主库上此前已经存在有数据,我们要把数据导出

              2,我们只有一个库需要同步:数据库名称:meet

              3,  mysql数据库的版本:8.0.19,

                  注意要尽量保持两台数据库的版本一致,主库尽量不要高于从库的版本

     

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

     说明:作者:刘宏缔 邮箱: 371125307@qq.com

     

    二,主库:查看配置文件,确保可以做主从同步:

    [root@yjweb ~]$ more /etc/my.cnf 

     

    有两个关键配置项:

    server-id = 1
    
    log-bin = /data/mysql/binlog/mysql-bin

    说明:主库的server-id要和从库的server-id区分开,

             主库要做log-bin,二进制日志用来供主从复制时使用

    说明:因为mysql8中,binlog_format 变量的默认值是row,

              我们不再手动声明这个配置变量

     

    三,主库:创建同步账号

    说明:这个账号是供从库从来访问主库的,所以'backup'@'121.122.123.134',ip是从库的ip

    [root@yjweb ~]# /usr/local/soft/mysql/bin/mysql -u root -p

    1,创建一个同步账号,并授权:

    mysql> create user 'backup'@'121.122.123.134' identified by 'backuppassword';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant replication slave on *.* to backup@121.122.123.134;
    Query OK, 0 rows affected (0.00 sec)

    2,检查创建是否成功?

    mysql> select * from mysql.user where User='backup';

    3,检查当前用户获得的授权

    mysql> show grants for backup@121.122.123.134;
    +--------------------------------------------------------------+
    | Grants for backup@121.122.123.134                            |
    +--------------------------------------------------------------+
    | GRANT REPLICATION SLAVE ON *.* TO `backup`@`121.122.123.134` |
    +--------------------------------------------------------------+
    1 row in set (0.00 sec)

    4,使新建账号生效

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    四,主库:导出待同步数据库中的数据

    说明:除了把数据导出,重点是记录下主库当前的日志位置

    1,加全局的读锁,避免在导数据时有写操作

    mysql> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.00 sec)

    2,查看当前的日志文件和位置,并记录下来

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

    3,另开一个终端,导出需要同步的数据库的数据

    [root@yjweb ~]# /usr/local/soft/mysql/bin/mysqldump --port=3306 -u root -prootpassword --databases meet --lock-tables=false --> /root/meet.sql

    说明:导出的数据文件需要上传到从库所在的服务器

     

    4,回到刚才所在的mysql终端:解除锁定:

    mysql> UNLOCK TABLES;
    Query OK, 0 rows affected (0.00 sec)

    五,  主库:检查防火墙配置

    [root@yjweb ~]# firewall-cmd --list-all

    检查是否已经把从库的ip加入到防火墙

    例如:

     rich rules:
            rule family="ipv4" source address="121.122.123.134" accept

    六,从库:导入数据

    1,关掉web服务,避免有访问进入

    [root@os3 ~]# systemctl stop nginx

     

    2,如果当前存在同步数据库,先删除数据

    mysql> drop database meet;
    Query OK, 19 rows affected (0.24 sec)

    3,导入数据

    把主库上导出的sql文件复制到从库上(这一步是在主库上执行)

    [root@yjweb ~]# scp ./meet.sql root@121.122.123.134:/root/ 

    从库上,执行导入

    [root@os3 conf]# /data/software/mysql/bin/mysql --host=127.0.0.1 --port=3306 -u root -prootpassword < /root/meet.sql

    七,从库:配置主从

    [root@os3 ~]# vi /etc/my.cnf

    主要配置以下各项:

    server-id = 2
    replicate-do-db = meet 
    read_only         = 1

    说明:replicate-do-db   用来指定要复制的数据库

             read_only    普通用户(非root)访问时只有只读的权限,不能做写操作

    说明:修改my.cnf配置文件完成后,不要忘记重启mysql数据库服务,

             使配置生效,否则会报如下错误:

    Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; 
    these ids must be different for replication to work
    (or the --replicate-same-server-id option must be used on slave but this does not always make sense;
    please check the manual before using it)

    八,从库:执行同步:

    停止从库同步

    mysql> stop slave;
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    配置连接到主库的信息

    mysql> change master to master_host='121.122.123.47',master_port=3306,master_user='backup',master_password='backuppassword',master_log_file='mysql-bin.000014',master_log_pos=55813;
    Query OK, 0 rows affected, 1 warning (0.03 sec)

    开启从库同步

    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)

    九,从库:检查同步情况

    1,查看从库的状态

    mysql> show slave status;

    重点看这两项:

    Slave_IO_Running | Slave_SQL_Running

    这两项必须是

     Yes              | Yes

    2,可以主库上发生update或insert修改后,在从库查看是否修改是否已生效

       

    说明:以上mysql的主从同步搭建已完成 ,后面是附加的信息

     

    十,show slave status主从同步情况的信息解读:

    1,查看主库的信息:

    Master_Host:#主库服务器地址
    Master_User:#用来访问主库的用户名
    Master_Port:#主库mysqld的端口

    2,Slave_IO_Running 和Slave_SQL_Running两个线程的状态

    Slave_IO线程负责把主库的bin日志(Master_Log)内容,投递到从库的中继日志上(Relay_Log)。

    Slave_SQL线程负责把中继日志上的语句在从库上执行一遍。

    Yes表示正常,No表示异常.

    如果两个线程的状态都是yes,表示同步正常,

    如果有一项是no,此时注意查看以下四项:

    Last_IO_Error 保存了发生io错误的原因

    Last_IO_Error_Timestamp 记录了发生io错误的时间

    Last_SQL_Error 保存了发生sql错误的原因

    Last_SQL_Error_Timestamp 记录了发生sql错误的时间

     

    3,如何判断主从同步的差距?

    Master_Log_File  # I/O线程当前正在读取的主服务器二进制额日志文件的名称

    Relay_Master_Log_File  #由SQL线程执行的同步的主服务器二进制日志文件的名称

    如果以上两个文件名相同,则表示读取和执行的是同一个二进制文件

     

    Read_Master_Log_Pos: #在当前的主服务器二进制日志中,I/O线程正在读取的位置

    Exec_Master_Log_Pos:#来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置

    如果以上两个位置的数字相同则表示读取和执行的进度完全同步

     

    4,Replicate_Do_DB :此处是同步的数据库的名字

    5,  Slave_IO_State:显示为wait ,例如:Waiting for master to send event

        表示relay日志中的sql语句已经全部执行完毕

    6,Seconds_Behind_Master:

        slave的SQL线程与I/O线程的时间差

        如果两台机器之间网络较差,有可能这个值很低,

        但从库上的同步落后主库较多,

        所以不能完全依据它来判断同步的情况

     

    十一,三种二进制日志格式的含义:

    binlog的格式有三种:STATEMENT,ROW,MIXED。

     

    1,STATEMENT模式(SBR)

    每一条会修改数据的sql语句会记录到binlog中。

    优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。

    缺点是有可能会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

     

    2,ROW模式(RBR)

    不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。

    优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。

    缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。

     

    3, MIXED模式(MBR)

    以上两种模式的混合使用,

    一般的复制使用STATEMENT模式保存binlog,

    对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,

    MySQL会根据执行的SQL语句选择日志保存方式。

     

    说明:row格式最安全,目前也是mysql8的默认格式

    十二,查看mysql数据库的版本和centos的版本:

    [root@yjweb ~]# /usr/local/soft/mysql/bin/mysqld -V
    /usr/local/soft/mysql/bin/mysqld  Ver 8.0.19 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)
    [root@yjweb ~]# cat /etc/redhat-release
    CentOS Linux release 8.0.1905 (Core) 

     

     

     

  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/architectforest/p/12579847.html
Copyright © 2011-2022 走看看