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) 

     

     

     

  • 相关阅读:
    SharePoint Workflow出了问题, 除了ULS log还可以看什么日志?
    Kernel Mode Debugging 初步 一
    一些debug常用的"魔法"数值
    SQL Block的初级排查
    [持续更新]一些有用的PowerShell收集
    关于斜杠(slash)和反斜杠(back slash)的小知识点
    如何安全地解放C盘剩余磁盘空间?
    返璞归真asp.net mvc 1.0(3) Controller/Action【转】
    关于Oxite的教训
    [翻译ASP.NET MVC]Contact Manager开发之旅之迭代2 修改样式,美化应用 【转】
  • 原文地址:https://www.cnblogs.com/architectforest/p/12579847.html
Copyright © 2011-2022 走看看