MySQL之主从复制

概述:

将主库的数据 变更同步到从库,从而保证主库和从库数据一致。

它的作用是 数据备份,失败迁移,读写分离,降低单库读写压力

原理:

主服务器上面的任何修改都会保存在二进制日志( Bin-log日志) 里面。 从服务器上面启动一个I/O线程, 连接到主服务器上面请求读取二进制(Bin-log)日志,然后把读取到的二进制日志写到本地的Realy-log(中继日志)里面。 从服务器上面同时开启一个SQL线程,读取Realy-log(中继日志),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

搭建:

1.准备服务器

2.配置主库

3.配置从库

4.测试主从复制

实践

1.首先准备俩台安装MySQL的纯净服务器

主库:192.168.231.153

从库:192.168.231.136

关闭防火墙与selinux

2.配置主库:

编辑主库服务器的配置文件 /etc/my.cnf

复制代码
[mysqld]
log-bin=/var/log/mysql/mysql-bin       #启用二进制文件日志记录
server-id=1          # 服务id,保证整个集群环境唯一
read-only=0         #1是只读,0是读写

创建日志目录并赋予权限

复制代码
# mkdir /var/log/mysql
# chown mysql.mysql /var/log/mysql

重启服务

复制代码
# systemctl restart mysqld

在主库登录MySQL,创建用户

为了用户在从库中用来连接主库的账号

复制代码
mysql>  create user '用户名'@'ip' identified with mysql_native_password by '密码';

mysql>  grant replication slave on *.* to '用户名'@'ip'  
这是为用户分配主从复制的权限

查看二进制日志坐标

复制代码
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      313 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3.配置从库

编辑从库服务器的配置文件my.cnf

复制代码
[mysqld]
server-id=2
read-only=1     #普通用户一般只有只读

重启mysql服务

复制代码
# systemctl restart mysqld

登录mysql

此处登录的是你从库mysql的root用户登录的账号与密码,不是在主库创建的用户

复制代码
mysql>  change master to master_host='主库的ip',
        master_user='连接主库用户名',
        master_password='连接主库用户的密码',
        master_log_file='日志文件名',
        mastre_log_pos='日志位置';
  
日志位置就是在主库show master status查出来那个数字   ----313

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      313 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

启动:

复制代码
mysql> start slave;

查看主从同步状态:

复制代码
mysql> show slave status\G

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.231.153   -----主库的ip
                  Master_User: itcast     -----用来连接主库的用户名   
                  Master_Port: 3306  ------端口
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001          -----二进制日志名字
          Read_Master_Log_Pos: 313
               Relay_Log_File: congku-relay-bin.000002   -----中继日志名字
                Relay_Log_Pos: 479
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes         --------主要看俩个IO线程是否成功启动
            Slave_SQL_Running: Yes         --------看SQL线程是否成功启动
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 

4.测试主从复制

复制代码
主库!
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| company            |
| db1                |
| mysql              |
| performance_schema |
| school             |
| sys                |
| xian               |
+--------------------+
8 rows in set (0.00 sec)


从库:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| xian               |
+--------------------+
5 rows in set (0.00 sec)

这是因为配置主从复制是在主库已经存在这些库以后配置的

复制代码
!!!!在主库创建库,创建表,写入数据
mysql> create database db2;
mysql> create table db2.zhucong(id int,name varchar(50),age int);

mysql> insert into zhucong(id,name,age) values(1,'aaa',18),
       values(2,'bbb',19) ,(3,'ccc',20);

mysql> select * from zhucong;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | aaa  |   18 |
|    2 | bbb  |   19 |
|    3 | ccc  |   20 |
+------+------+------+
3 rows in set (0.00 sec)

!!!在从库查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db2                |
| mysql              |
| performance_schema |
| sys                |
| xian               |
+--------------------+

mysql> use db2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| zhucong       |
+---------------+
1 row in set (0.00 sec)

mysql> select * from zhucong;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | aaa  |   18 |
|    2 | bbb  |   19 |
|    3 | ccc  |   20 |
+------+------+------+

修改主库中的表数据,查看从库是否有变化

复制代码
主库:
mysql> update zhucong set age=21;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from zhucong;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | aaa  |   21 |
|    2 | bbb  |   21 |
|    3 | ccc  |   21 |
+------+------+------+
3 rows in set (0.00 sec)


查看从库:
mysql> select * from zhucong;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | aaa  |   21 |
|    2 | bbb  |   21 |
|    3 | ccc  |   21 |
+------+------+------+
3 rows in set (0.00 sec)

配置好主从复制以后,从库记录的只是主库以后的日志文件,要想从库备份主库之前的可以,先将主库之前的数据库文件备份然后拷贝到从库,然后从库在进行恢复即可。

相关推荐
2501_914245934 分钟前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
m0_514520576 分钟前
Go语言变量如何声明和使用_Go语言变量定义完整教程【通俗】
jvm·数据库·python
xuanwenchao12 分钟前
ROS2学习笔记 - 2、类的继承及使用
服务器·笔记·学习
weixin_5860614618 分钟前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
秋921 分钟前
数据库对比同步工具,快速比较开发库与生产库直接的差别,并自动生成存在差异的sql语句
数据库·oracle
HYNuyoah24 分钟前
docker 安装win10系统
运维·docker·容器
liulilittle37 分钟前
Prompt for OpenCode + CodeX-5.3:多个重型任务交付给AI自动化完成
运维·自动化·prompt
Greyson138 分钟前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
Whitemeen太白38 分钟前
查询子级分类、父级分类、叶子节点分类(MySQL / Oracle )
数据库·mysql·oracle
C#程序员一枚38 分钟前
高可用(High Availability, HA)
数据库·c#