首页 > 数据库 >mysql主从复制

mysql主从复制

时间:2024-09-09 11:07:07浏览次数:4  
标签:主库 主从复制 log -- master mysql 日志

mysql主从复制

描述:MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。

MySQL数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),接收来自Master上binlog文件的日志内容,解析出SQL,重新更新到Slave,使得主从服务器数据达到一致。

好处:在生产环境中,MySQL主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。
MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

主从复制实现原理

img

三步:

  1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
  2. slave将master的binary log events拷贝到它的中继日志(relay log);
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

操作步骤

1. 进行主库配置

设置server-id以及log-bin日志启动

```shell
    # 寻找配置文件位置,如果是自己设置就是你的启动my.ini或者my.conf.
    # 否则则在/etc/my.conf类似的位置
    # 找[mysqld]的配置内容
    [mysqld]
    # 设置主从库标识符,主从要不一样
  server-id=1
    # 设置开启binlog日志,名称为mysql-bin
  log-bin=mysql-bin

    # 最后记得重启mysql
    # 自己开的mysql的话,进入mysql运行shutdown就可以停止服务
    mysqld_safe --defaults-file=/opt/mysql8/conf/my.conf &
    # yum或者apt安装,运行重启命令就行
    systemctl restart mysql
```

如何去检查

 # 重新启动后,跑服务器检查两个配置是否成功,注意log_bin为NO才是已启动
 mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3306  |
+---------------+-------+
1 row in set (0.00 sec)

创建普通用户登录主库

一般不使用root用户进行主从同步


    # 进入数据库,这个不过多提及
    mysql -uroot -p
    # 进入mysql数据库,在user表里创建新用户(特别注意,ip一定要是从库能登录的ip)
    use mysql;
    create user 'chaoge'@'192.168.178.130' identified by 'redhat';
    # 然后给赋予复制权限(切记一定要在创建之后直接给权限,不然不能临时授权。得删用户重新创建)replication slave复制权限
    grant replication slave on *.* to 'chaoge'@'192.168.178.130';

验证是否成功

    -- 主库检查账户是否存在
    select user,host from mysql.user;
    -- 检查账户权限
    show grants for chaoge@'192.168.178.130';

    -- 进入从库服务器进行登录
    mysql -uchaoge -p -h '主库ip'

img

检查binlog状态,并锁表导出数据

    -- 检查主库的状态
    show master status;

img
切记这两个值,要在从库当中使用,确保初始数据一致

    -- 导出数据,直接导出整个数据库备份,这样从库数据和主库完全一致
    -- 1. 锁表,保证状态不发生改变(sql)
    flush table with read lock;
    -- 2. 进入命令行导出数据(新建一个ssh连接)
    mysqldump -uroot -p --all-databases > /tmp/all.sql
    -- 3. 解锁(sql)
    unlock tables;

2. 接下来全部都是从库配置了。

注意确保从库能通过刚才的用户登录数据库

先把数据取过来,然后导入备份数据库

    # scp把数据复制来
    scp root@主库ip:文件位置 /opt/
    # 进行数据库数据导入(注意文件名别打错了)
    mysql -uroot -p  < /opt/all.sql 
    # 也可以在sql当中使用 source /opt/all.sql进行导入
    # 有可能数据导入报错的话,检查两边数据库的数据编码!

这个导数据基本不会有大问题。注意后面的配置

配置server-id以及log-bin日志

找到配置文件的位置,设置一个和主库不同的server-id以及关闭log-bin日志

    # 找到配置文件位置进行编辑
    vim /etc/my.cnf
    # 修改的内容为
    [mysqld]
    server-id=3
    # 注释掉binlog参数关闭log-bin日志(这个在8.0好像开着也行,所以问题不大)

记得验证一下server-id与主库不同

    mysql> show variables like 'server_id';
        +---------------+-------+
        | Variable_name | Value |
        +---------------+-------+
        | server_id     | 3     |
        +---------------+-------+
        1 row in set (0.00 sec)

进行主从配置

注意确保可以通过主库创建的用户连接主库数据库(~重要的事情说三遍)

    -- 去找到在主库运行show master status;得到的文件和位置。要用
    -- 配置连接
    mysql > change master to master_host='192.168.178.129',
        master_user='chaoge',
        master_password='redhat',
        master_log_file='mysql-bin.000001',
        master_log_pos=575;

img

报错警告

一般情况能成功最好,但是也会有报错的时候,记录一下
img

  • 给我看懵了,先去找找报错日志
    img

  • 笑死,根本看不懂,去搜索引擎帮忙,这个问题给了个解决方案(感谢大佬)

    主从备份报错error解决

        -- 去数据库运行
        RESET SLAVE;
        -- 然后再运行上方配置 好家伙成功了
            mysql > change master to master_host='192.168.178.129',
            master_user='chaoge',
            master_password='redhat',
            master_log_file='mysql-bin.000001',
            master_log_pos=575;
    

    img

从库启动备份和检查

    -- 启动从库备份功能
    start slave;
    -- 查看状态
    SHOW SLAVE STATUS\G

start报错的话一点点往上面查查哪里错了。
状态注意注意这两个参数的成功(意味着成功开了两个线程进行备份)

  1. 把binlog日志拿过来进行数据复制,将日志写入自己的中继日志(把日志拷过来)
  2. 运行中继日志以保证数据一致
    img

结束语

到这就完成了mysql的主从备份,参考于文档
https://www.cnblogs.com/pyyu/p/9276851.html

标签:主库,主从复制,log,--,master,mysql,日志
From: https://www.cnblogs.com/lmlsh/p/18341458

相关文章

  • centos7安装mysql
    centos7安装mysql8卸载MariaDBMariaDBMySQL的一个分支,主要由开源社区维护CentOS7+不再默认使用MySQL数据库,而是MariaDB数据库。直接安装MySQL会与MariaDB的文件冲突。#使用yum卸载yumremovemariadb安装mysql压缩包去官网找mysql官网wget下......
  • 以MySQL为例,来看看maven-shade-plugin如何解决多版本驱动共存的问题?
    开心一刻清明节那天,看到一小孩在路边烧纸时不时地偷偷往火堆里扔几张考试卷子边烧边念叨:爷爷呀,你岁数大了,在那边多做做题吧,对脑子好,要是有不懂的地方,就把我老师带走,让他教您!前提说明假设MySQL5.7.36的库qsl_datax有表qsl_datax_source和数据CREATETABLE`qsl_datax_source`......
  • MySQL int(10) 与 int(11) 的区别
    不知道大家是不是和我一样,每次给有个列添加 int(11) 的时候都会想,会不会是 int(10) ,偶尔也会发神经的想,如果 int(32) 这样的可否?索性,我们就先来解决这个问题吧。int 类型的底层存储采用的是 4 字节,也就是32位,这样能够存储的实际最大值为 4294967296,大家数数一下......
  • mysql数据库,外键关联删除主表数据,binlog只记主表binlog
    环境:8.0.32场景一、开启外键约束关联删除时,删除主表记录,binlog中内容解析1、写入测试数据,并删除主键id=1,子表id=1一并删除mysql>createtablet1(idintprimarykey,namevarchar(200));QueryOK,0rowsaffected(0.01sec)mysql>insertintot1select1,'zs';Que......
  • MySQL root密码忘记解决
    skip-grant-tables的解法 首先,关闭实例这里,只能通过killmysqld进程的方式。注意:不是mysqld_safe进程,也切忌使用kill-9。#ps-ef|grepmysqldroot62206171008:14pts/000:00:00/bin/shbin/mysqld_safe--defaults-file=my.cnfmysql63476220......
  • mysqldump
     MySql数据库备份与恢复——使用mysqldump导入与导出方法总结MySql数据库备份与恢复——使用mysqldump导入与导出方法总结mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个sql服务器(不一定是一个mysql服务器)。转储包含创建表和/或装载......
  • MySQL root密码忘记解决
    skip-grant-tables的解法首先,关闭实例这里,只能通过killmysqld进程的方式。注意:不是mysqld_safe进程,也切忌使用kill-9。#ps-ef|grepmysqldroot62206171008:14pts/000:00:00/bin/shbin/mysqld_safe--defaults-file=my.cnfmysql634762200......
  • MySQL零基础入门教程-8.1 表的连接\增删数据、表结构的增删改、字段约束(非空、唯一
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课收集整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第三篇目录1、表怎么进行连接的2、insert语句可以一次插入多条记录吗?可以的!3、快速创建表?【了解内容】4、将查询结果......
  • [MySQL表的增删改查-进阶]
    ......
  • MySQL---1、初始MySQL数据库
    一、什么是数据库(一)数据库简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合(二)数据库管理系统......