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)

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

相关推荐
惜.己2 分钟前
Linux常用命令(十四)
linux·运维·服务器
喝醉的小喵1 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
linkingvision1 小时前
H5S 视频监控AWS S3 对象存储
linux·运维·aws·视频监控s3对象存储
doupoa1 小时前
Fabric 服务端插件开发简述与聊天事件监听转发
运维·python·fabric
BillKu1 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar
付出不多1 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆2 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams2 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
QQ2740287562 小时前
BlockMesh Ai项目 监控节点部署教程
运维·服务器·web3
源码云商2 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot