网上资料繁多,需要跳多少坑才能实现,跳跳就知道了。
--
主从复制
如题:主数据库进行的操作,从数据库进行备份。
--
原理
有关于这方面的原理网上也是一搜一大片,去看看吧。肯定没错。
这里简单说一下数据库是如何进行复制的呢?这里做一个比喻。
例如:
你想盗一个 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、做主从后主服务器挂了怎么办?
--
参考: