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

posted on 2024-09-09 11:06  longsihua2003  阅读(23)  评论(0编辑  收藏  举报