msyql 25day 数据库主从 主从复制 读写分离 master slave 有数据如何增加

环境介绍

将一个数据库的数据 复制到另外一个 或者多个

master 主库

slave 从库
在这里插入图片描述
在这里插入图片描述

主库开了一个二进制日志

从库开了两个线程

LO可以是多线程(快) 请求二进制文件

SQL 线程 执行sql 语句

读写分离

所有写入的数据 在主库上写 所有读取在从库上读取

纵向扩展

一台不行 用两台

横向扩展

提升一台服务器的配置

数据库主从

准备环境

  • 关闭防火墙
  • 关闭selinx
  • 固定IP
  • 配置dns 在目录 /etc/hosts 文件中
  • 开启 bin_log 咱文件 /etc/my.cnf
  • 在主库中授权用户
# 防火墙
systemctl stop firewalld

# 关闭selinx
getenforce
setenforce 0


# 固定IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33 

rm -rf /etc/sysconfig/network-scripts/.cfg-ens33.swp
修改参数
BOOTPROTO=static
----------------------------------------------------------------
IPADDR={ip}
PREFIX=24
GATEWAY={网关地址}
DSN1={dns地址}
DSN1={dns地址}
----------------------------------------------------------------
参考
IPADDR=10.12.155.146
PREFIX=24
GATEWAY=10.12.155.254
DNS1=223.5.5.5
DNS2=223.6.6.6


----------------------------------------------------------------
# 参考实例
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.203
PREFIX=24
GATEWAY=192.168.100.2
DNS1=223.5.5.5
DNS2=223.6.6.6
----------------------------------------------------------------


# 重启
systemctl restart network

# 修改主机名
hostnamectl set-hostname  master


# 主机名解析
涉及到几个ip  就要写多少个
实例
vim  /etc/host
192.168.100.203 master
192.168.100.203 slave

10.12.155.146 master
10.12.155.120 slave


# 清理环境
# 卸载包
yum -y erase `rpm -qa | egrep "mysql|mariadb"`

# 删除配置文件
rm -rf /etc/my* && rm -rf /var/lib/mysql && rm -rf /usr/bin/mysql

# 检查
[[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "环境已经清理完成" || echo "环境未清理"



# 安装mysql
yum -y install mysql-server...
## 本地安装
cd  解压包路径 
yum -y localinstall  *

# 修改密码
## 查看密码
awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log
## 修改密码为@Baipiao123
mysqladmin -uroot -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password '@Baipiao123'

主库环境(master)

## 创建二进制文件目录
mkdir /data
chown mysql.mysql /data



# 开启二进制日志
vim /etc/my.cnf
写在[mysqld] 标识下边 写道其他表示下边 就不生效了
server-id=203
log-bin=/data/mysql-bin

systemctl restart mysqld

# 授权一个账号(开启一个复制权限)

msyql> grant replication slave on *.* to 'master'@'%' identified by '{密码}'
msyql> grant replication slave on *.* to 'master'@'%' identified by '@Baipiao123';
mysql> flush privileges;
# 查看当前binlog 日志文件用的哪个 以及post 
msyql> show master status\G

## 重新设置 设置轮转日志
mysql> reset master;

在这里插入图片描述

从库配置(slave)

# 从库配置
vim /etc/my.cnf
server-id=204
# 重启数据
systemctl restart mysqld

# 主机名解析
10.12.155.146 master
10.12.155.120 slave



可以使用 ? change master to  来查看语法
# 配置信息
change master to
master_host ={解析的dns名},
master_port=3306,   // 这里是端口号
master_user='{刚刚授权的用户名}', 
master_password='{刚刚授权的密码}',
master_log_file=mysql-bin.000001,  //bin_log 文件名字 不懂请看下图
master_pos=154;   //二进制日志 开始位置
master_connect_retry=10;  //十秒刷新


## 实例
CHANGE MASTER TO
  MASTER_HOST='master',
  MASTER_USER='king',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=145,
  MASTER_CONNECT_RETRY=10;

# 启动slave
msyql> start slave;


# 产看状态
msyql>show slave status\G

LO 和 SQL 都是yes  则说明配置成功

# 如果uuid 一样的话
cat /var/lib/mysql/auto.cnf

在这里插入图片描述

状态分析

## 14 15行。两个YES表示主从成功
## 关注39-42的信息
## 38行表示主从复制延迟时间
## 46 行UUID要不一致


mysql> show slave status\G 
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: relication
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 527
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 203
                  Master_UUID: 6f6d0551-a073-11ee-9f28-000c298a6e96
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

重新配置

如果配置出错了 才需要从这里开始 重新配置

mysql>stop slave;
mysql> reset slave;
mysql>CHANGE MASTER TO
  MASTER_HOST='master',
  MASTER_USER='master',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
## 启动slave
mysql>start slave;
# 产看状态
msyql>show slave status\G;

在这里插入图片描述

问题分析 报错解决

  • ip 地址 错误
  • dns 没有配置
  • ip配置
  • 用户名密码
  • 二进制文件配置
  • UUID 一样 也会导致 失败

从库验证

最好在主库中写一下 再去 从库中看一下

# master_sql 在主库中写入如下内容
create database king;
create table king.t1(id int,myname varchar(40));
insert into king.t1 values (1,"king");




# clave_sql 在从库中查看写入的内容
show databases;

use king;

select * from king.t1;



要往主库(master)里边写,如果写在从库,则会导致主键冲突

有数据的情况下 去做主从

清理环境

此步骤是测试步骤 实战请跳过此处

yum -y erase `rpm -qa | egrep "mysql|mariadb"`

# 删除配置文件
rm -rf /etc/my* && rm -rf /var/lib/mysql && rm -rf /usr/bin/mysql

rm -rf /data/*

# 检查
[[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "环境已经清理完成" || echo "环境未清理"





# 安装mysql
yum -y install mysql-server...
## 本地安装
cd  解压包路径 
yum -y localinstall  *

## 启动数据库
systemctl start mysqld


# 修改密码
## 查询密码
awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log

## 修改密码
mysqladmin -uroot -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password '@Baipiao123'

## 登录数据库
mysql -p"@Baipiao123"

环境准备

这里是模拟数据库中原有的数据

create database king;

create table king.t1(id int, myname varchar(40));

insert into king.t1 values (1,"aaa"),(2,"bbb"),(3,"cccc"),(4,"dddd"),(5,"eee");

select * from king.t1;

数据库中的锁的机制

读锁

​ 可以查询。

写锁

​ 读写都不能执行。

主库配置

# 锁表备份

## 备份文件为 all.sql
mysqldump -uroot -p{密码} -A > all.sql
mysqldump -uroot -p"@Baipiao123" -A > all.sql
 
## 配置主从
### 创建必要目录
mkdir /data
chown mysql.mysql /data

### 修改配置文件
vim /etc/my.cnf
server-id = 203
log-bin= /data/mysql-bin

### 重启数据库
systemctl restart mysqld


### 授权slave 用户
mysql> grant replication slave on {}.{} to "{用户名}"@"%" identified by "{密码}"
#### 实例
mysql> grant replication slave on *.* to "king"@"%" identified by "@Baipiao123";


## 上一个读锁 ()  到这里之后就不要动了  把这个窗口挂在这里

mysql> flush tables with read lock;

-----------------------------------------------------------------------------------------------
# 再重新开一个窗口进行如下操作

### 重置bin_log
mysql> flush  privileges;
### 查看主库 信息 已经bin_log 位置
mysql> show master status\G;

在这里插入图片描述
在这里插入图片描述

从库配置

## 传输数据
scp  {备份文件.sql} {从库服务器}

## 导入数据
mysql -uroot -p{密码} < {备份文件}

mysql -uroot -p"@Baipiao123" < all.sql

#配置从
vim /etc/my.cnf
在文件中写入下方内容 号码随意 不是1 就行
server-id = 204

# 重启数据库
systemctl restart mysqld

# 主机名解析
vim  /etc/host
{主库服务器ip} master
{从库服务器ip} slave

##实例
192.168.100.203 master
192.168.100.203 slave



# 进入数据库 配置从库
mysql -uroot -p"@Baipiao123"

## 查看格式 (show master to;)

CHANGE MASTER TO
  MASTER_HOST='master',
  MASTER_USER='king',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=720,
  MASTER_CONNECT_RETRY=10;

## 启动从库
mysql> start slave; 
## 查看主从信息
mysql>  show slave status\G;

最后给主库解锁

配置完成之后 我们的主数据库 还是锁着的
这个时候就需要 给主数据库解锁了 (就是哪个 刚开始 主服务器 挂在哪里的窗口)

可以直接退出数据库

也可以使用命令来解锁

unlock tables;

在这里插入图片描述

常见错误

如果出现这些错误编号则可能是如下错误

1062 主从重复, 也就是说 从库插入了重复的数据 则可以跳过 具体还是需要做好分析 
vim /etc/my.cnf
slave-skip-errors=1062

1053  主服务器宕机

1045  账号密码错误 导致的链接错误

完结撒花
🌸🌸🌸 自强不息,不忘初心🌸🌸🌸
🌸🌸🌸 承蒙厚爱,不负佳人🌸🌸🌸

  • 44
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白嫖一茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值