win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录

本文旨在win10上搭建Ubuntu18.04虚拟机,安装MySQL的Docker服务,实现主从复制,并供win10上的程序应用调用。

目录

1.虚拟机安装

2.win10宿主机ping通ubuntu虚拟机

3.安装Docker

4.拉取MySQL5.7镜像

4.1去阿里云获取个人的镜像加速器

4.2 创建主从实例容器

4.3 修改Master容器内的my.cnf

4.4 Master数据库设置数据同步用户

4.5 设置Slave1数据库

4.6 获取所有容器的IP

4.7 主数据库设置主从同步

4.8 从数据库设置主从同步

4.9 小结

5.数据库同步演示


 

本文旨在win10上搭建Ubuntu18.04虚拟机,安装MySQL的Docker服务,实现主从复制(一主一从),并供win10连接使用。

 

1.虚拟机安装

这里强烈建议使用最新版本的VMware,本次搭建将使用15.5.2版本的,防止虚拟机再次开机时卡死,以及“虚拟机繁忙”等错误。

这里提供两个VMware虚拟机软件下载链接:

VMware Workstation Pro 15.5.2 Build 15785246:

https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.5.2-15785246.exe

 

VMware Workstation Pro 12.5.9 Build 7535481
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-12.5.9-7535481.exe

 

win10搭建Ubuntu18.04虚拟机:

参考链接:https://blog.csdn.net/qq_42372031/article/details/100588245

 

若安装vmware-tools出现"what is the location of the "ifconfig"program on your machine?"

解决方法一:直接输入“yes”,再回车即可。

解决方法二:

  • 执行sudo apt-get update
  • 执行sudo apt-get install net-tools,安装net-tools
  • 然后重新执行安装vmware-tools.pl , 成功,重启系统就可使用tools

 

2.win10宿主机ping通ubuntu虚拟机

使用命令:ifconfig 查看虚拟机ip地址

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第1张图片

设置网络:

 win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第2张图片

虚拟机内部ping:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第3张图片

宿主机ping:

 win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第4张图片

 

3.安装Docker

先安装vim:sudo apt-get install vim

 

更换阿里云镜像源:

参考链接:https://blog.csdn.net/hang916/article/details/79465458

cd /etc/apt
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo vim /etc/apt/sources.list

vim命令删除全部内容,在命令模式下,光标在首行首个字母处,输入:.,$d 一回车就全没了,表示从当前行到末行全部删除掉。

然后添加阿里云镜像地址:

deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

:wq保存退出。

执行:

sudo apt-get update
sudo apt-get upgrade

 

Ubuntu虚拟机安装Docker

官网参考链接:https://docs.docker.com/engine/install/ubuntu/

执行命令至:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第5张图片

查看docker版本:docker version

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第6张图片

 

Docker启动报错:Got permission denied……

解决:https://www.cnblogs.com/informatics/p/8276172.html

sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组
docker ps    #测试docker命令是否可以使用sudo正常使用

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第7张图片

安装成功。

# 启动docker
sudo service docker start

# 停止docker
sudo service docker stop

# 重启docker
sudo service docker restart

 

4.拉取MySQL5.7镜像

4.1去阿里云获取个人的镜像加速器

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第8张图片

逐行输入命令: 

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你的镜像地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

4.2 创建主从实例容器

然后拉取镜像:sudo docker pull mysql:5.7

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第9张图片

 

启动容器:

#Master(主):
sudo docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

#slave1(从):
sudo docker run -p 3340:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

Master对外映射的端口是3339,Slave1对外映射的端口是3340。因为docker容器是相互独立的,每个容器有独立的ip,所以不同热容器使用相同的端口并不会冲突。

这里使用MySQL默认的3306端口,否则可能会出现无法通过ip连接docker容器内MySQL的问题。
 

进入容器内部:

sudo docker exec -it mysql-master /bin/bash

在容器内部添加MySQL账号:

#fate为账户名,root为密码
CREATE USER 'fate'@'%' IDENTIFIED BY 'root';

GRANT ALL PRIVILEGES ON * .* TO 'fate'@'%';

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第10张图片

 此时新起一个终端,原先的终端不要关,输入命令:

sudo apt install mysql-client-core-5.7
sudo apt install mariadb-client-core-10.1

#登陆master
mysql -h192.168.10.10 -P3339 -u fate -proot

可能会出现错误:

ERROR 2059 (HY000):Authentication plugin 'caching_sha2_password' cannot be laoded

这时需要返回原来的终端,在容器内部设置解决报错问题:

#fate为master用户名,root为密码
ALTER USER 'fate'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

 

4.3 修改Master容器内的my.cnf

使用命令:

sudo docker exec -it mysql-master /bin/bash

进入master容器内,安装vim:

apt-get update
apt-get upgrade
apt-get install vim

进入到/etc/mysql目录下:

cd /etc/mysql
vi my.cnf

对my.cnf添加下列内容:

[mysqld]
## 同一局域网内主要要唯一
server-id=100

## 开启二进制日志功能
log-bin=mysql-bin

 

退出Master容器并重启生效:sudo docker restart mysql-master

或者:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第11张图片

 

4.4 Master数据库设置数据同步用户

重新进入Master数据库:

sudo docker exec -it mysql-master /bin/bash
#root用户密码为root
mysql -uroot -proot

授予用户slave以 PLICATION SLAVE 权限和 REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

退出重启一下:

 sudo docker restart mysql-master

 

4.5 设置Slave1数据库

进入Slave1数据库:

sudo docker exec -it mysql-slave1 /bin/bash

apt-get update
apt-get upgrade
apt-get install vim

cd /etc/mysql
vi my.cnf

类似Master,在对my.cnf添加下列内容:

[mysqld]
## 同一局域网内主要要唯一
server-id=101

## 开启二进制日志功能
log-bin=mysql-slave-bin

##relay_log配置中继日志
relay_log=edu-mysql-relay-bin

然后退出重启从节点:sudo docker restart mysql-slave1

或者:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第12张图片

 

4.6 获取所有容器的IP

 虚拟机命令行执行:

sudo docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

可能报错:

 解决办法是,将当前用户添加 docker 组:

sudo usermod -a -G docker $USER

重启虚拟机或着注销当前用户,这是必须的,否则组更改不会生效。

打开终端,重新启动主从节点:

sudo docker restart mysql-master
sudo docker restart mysql-slave1

重新执行:

sudo docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

得到结果:

/mysql-slave1 - 172.17.0.3
/mysql-master - 172.17.0.2
/serene_sinoussi - 

 

4.7 主数据库设置主从同步

从Master进入MySQL,执行命令:

sudo docker exec -it mysql-master /bin/bash
mysql -uroot -proot

#进入MySQL后:
mysql> show master status;

 结果:

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

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第13张图片

 

4.8 从数据库设置主从同步

新起一个终端,进入Slave1内部MySQL,执行命令:

sudo docker exec -it mysql-slave1 /bin/bash
mysql -uroot -proot

change master to master_host='172.17.0.2', master_user='slave',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=154,master_connect_retry=30;

 效果如下:

mysql> change master to master_host='172.17.0.2', master_user='slave',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=154,master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

 

增加从数据库连接账号:

CREATE USER 'slave2'@'%' IDENTIFIED BY 'root';
GRANT SELECT ON * .* TO 'slave2'@'%';
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

结果:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第14张图片

 

再执行效果:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第15张图片

图中两个Yes表示正常同步。

从数据库停止同步命令:

STOP SLAVE IO_THREAD FOR CHANNEL ''

 

4.9 小结

主数据库:mysql-master,从数据库:mysql-slave1

master内部数据账号"fate",相当于"user_write";slave1内部数据账号"slave2",相当于"user_read"

数据同步用户为 " slave " 。

 

另一种方案(未亲自实践):https://blog.csdn.net/big_white_py/article/details/103940139

 

5.数据库同步演示

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第16张图片

 

进入master数据库中,查看master状态:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第17张图片

 

 进入slave1节点数据库中:

#先停止slave
STOP SLAVE IO_THREAD FOR CHANNEL '';

#重新设slave同步
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='slave',MASTER_PASSWORD='root',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;

#再启动slave
start slave;

#查看slave状态
show slave status \G;

 win10主机使用数据库连接工具连接虚拟机中master主节点:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第18张图片

新建数据库:

create database test1 DEFAULT CHARACTER set utf8; 
use test1;
CREATE TABLE tbl_test(
`user` VARCHAR(64) not null, 
`age` INT(11) not null
)DEFAULT charset utf8;

 效果如下:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第19张图片

进入slave数据库查看:

 win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第20张图片

可以看到,slave数据库已经同步了master数据库中新建的数据库和表了。

接下来查看测试插入的数据:

INSERT INTO tbl_test (user,age) VALUES ('fate',18);

 win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第21张图片

 效果如下,同步插入数据没有问题:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第22张图片

 

查看slave状态:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第23张图片

查看master状态:

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第24张图片

刚刚好对上,说明基本没问题了。


如果关闭虚拟机,再重新启动时,需要启动Docker服务和两个MySQL实例:

sudo service docker start
sudo docker restart mysql-master
sudo docker restart mysql-slave1

记得拍摄虚拟机快照!!!

记得拍摄虚拟机快照!!!

记得拍摄虚拟机快照!!!

 

                               如果这篇文章帮到了你,欢迎赏杯快乐水哦~

win10搭建Ubuntu虚拟机完成MySQL主从复制踩坑记录_第25张图片

你可能感兴趣的:(mysql,ubuntu,sql,linux)