学习计划 mysql 主从复制

网上资料繁多,需要跳多少坑才能实现,跳跳就知道了。

--

主从复制

如题:主数据库进行的操作,从数据库进行备份。

--

原理

有关于这方面的原理网上也是一搜一大片,去看看吧。肯定没错。

这里简单说一下数据库是如何进行复制的呢?这里做一个比喻。

例如:

  你想盗一个 QQ 号!

  你认识了这个网吧的网管,交待他。偷偷的把账号密码记下来。

  网管蹲在他的身后,记录下了他的 QQ 账号和密码!

  你晚上找网管,拿到了QQ!  

如果我们反推我们的备份数据库呢?

  在开启一个主从后,当你的主数据发生改变。就会启动一个线程记录你在主数据的操作【二进制文件】,同时从数据会得到这个文件,并在数据库操作。

  讲的比较糙,详细的原理可以看一下原理,真的很多。

--

实践

俗话说理论指导实践,理论已经有了,那么我们开始搭建一个简单的 主从复制 !

准备两台虚拟机:

  这里推荐裸机装 mysql 【我的试验机是 ubuntu16-04;mysql 版本为 5.7】

条件

两主机一定是网络没问题的,可以 ping 通的。

--

配置主机【Master】

主要配置的参数有两个:

 

server-id  唯一性,注意这里一定要和 从机 不同【一定是唯一的】
log_bin    这里也就是记录的二进制文件,也就是上面说的小本本

添加用户,并赋予权限,也就是我们之前说的 网管

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';#创建用户
mysql> GRANT REPLICATION ALL ON *.* TO 'repl'@'%';#分配权限
mysql>flush privileges;   #刷新权限

设置好了之后,重启我们的 Mysql 服务

sudo service mysql restart

注意:这里 从机 一定要可以连接主机数据库。

如果不能连接,注释掉
#bind-address           = 127.0.0.1
再试试?

如果你的主机设置好了,并且从机也可以连接了,那么我们就可以开始设置从机了.

这里我们在主机上找到我们的文件位置和文件,在连接从机时会使用

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| wq_msg.000004 |      415 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)  

--

配置从机【Slave】

设置 server-id

[mysqld]
server-id=2 #设置server-id,必须唯一

重启mysql,打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='182.92.172.80',
    ->     MASTER_USER='rep1',
    ->     MASTER_PASSWORD='slavepass',
    ->     MASTER_LOG_FILE='wq_msg.000004',
    ->     MASTER_LOG_POS=415;

设置好之后启动我们的 slave 同步进程。

mysql>start slave;

之后我们一定要看状态

mysql> show slave statusG;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.92.172.80
                  Master_User: rep1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-.000013
          Read_Master_Log_Pos: 11662
               Relay_Log_File: mysqld-relay-bin.000022
                Relay_Log_Pos: 415
        Relay_Master_Log_File: wq_msg_000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
        ...

主要看这两个参数 Slave_IO_Running 和 Slave_SQL_Running ,都为 OK 时候说明没问题了。

如果有问题!看日志!一定看日志

--

这里我说一下我碰到的问题。

1:日志报错 UUID 错误

  在 mysql5.6 之后,虽然是以server-id 为唯一标识,但是最后是以 UUID 为标识进行处理。之前我的测试环境是拷贝了两个一样的 mysql Docker 导致UUID一样。无法同步。

  查看UUID

mysql> show variables like '%server_uuid%';

  主从一定要不同!

2:docker问题

  还是环境问题,用的 Docker 虽然端口 3306 映射了出去,但是二进制文件并未映射。导致报错。

如果还有什么问题的话。

看日志!一定日志

--

这里只说了最基本的配置怎么完成,该学习的还有很多。下面扩展一些阅读和问题。之后我也会慢慢学习。

1、主从的好处是?
2、主从的原理是?
3、从数据库的读的延迟问题了解吗?如何解决?
4、做主从后主服务器挂了怎么办?

--

参考:

MySQL主从复制(Master-Slave)实践

原文地址:https://www.cnblogs.com/25-lH/p/8781127.html