windows docker里安装并使用mysql(内含mysql主从搭建)
安装请看这里:docker介绍和安装以及常用命令,现在假设已经安装好了docker。
第一步,命令行拉取mysql镜像
docker pull mysql:latest
查看是否拉取成功
docker images mysql:latest
第二步,运行mysql镜像,启动mysql实例
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:latest
3306:3306
前面的是mysql在windows里端口,后面的是mysql在docker里端口,如果windows外面安装了mysql,端口也是3306,那么要先关闭windows的mysql,不然会有端口冲突:
查看mysql是否启动
docker ps
第三步,进入容器实例,登录mysql
进入容器实例:
docker exec -it 3bac8e05792e /bin/bash
退出bash命令行:
exit
复制和粘贴命令行上的文本:
选中文本,按一下鼠标右键即可复制,在按一下鼠标右键即可粘贴。
然后输入mysql -uroot -p
进行登录:
mysql -uroot -p
输入密码后进入mysql控制台:
查询字符集:
show variables like 'character%';
退出mysql命令行:
exit
第四步,在windows上使用mysql客户端工具进行连接
第五步,解决数据备份
为了解决docker里的mysql容器删除后数据丢失问题,需要修改容器创建的代码:
宿主机是linux
docker run -d -p 3306:3306 --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD="123456" --name mysql mysql:latest
宿主机是windows
docker run -d -p 3306:3306 --privileged=true -v "C:/Users/tang8/.docker/mydata/mysql/log":"/var/log/mysql" -v "C:/Users/tang8/.docker/mydata/mysql/data":"/var/lib/mysql" -v "C:/Users/tang8/.docker/mydata/mysql/conf":"/etc/mysql/conf.d" -e MYSQL_ROOT_PASSWORD="123456" --name mysql mysql:latest
其中,--privileged=true
就是让容器拥有root权限,-v /mydata/mysql/log:/var/log/mysql
是将数据库日志从/var/log/mysql
备份到/mydata/mysql/log
容器数据卷中。
privileged详细介绍:
privileged值为true时,container内的root拥有真正的root权限。privileged为true启动的容器可以看到很多host上的设备,可以执行mount,可以在docker容器中启动docker容器。
privileged值为false时,container内的root只是外部的一个普通用户权限,默认为false。
如何删除数据卷:
删除容器时将数据卷一并删除,如果还有别的容器引用该数据卷,则删除失败。
docker rm -v 容器ID|数据卷名
只删除数据卷,如果还有容器引用该数据卷,则删除失败。
docker volume rm 数据卷名
删除所有未被使用的数据卷,不指定名称。
docker volume prune
第六步,解决乱码问题
为了解决docker里的mysql无法存储中文问题,我百度了一番,发现有人提供的解决方案是需要修改容器创建的代码:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:latest --character-set-connection=utf8 --character-set-client=utf8
如果mysql容器处于Exited状态,docker ps命令查不出来,那么可以使用:
docker logs --tail 200 容器ID
查看错误日志,200是指定只看200行。
我发现以上方式行不通,mysql根本不认unknown variable 'character-set-connection=utf8'
,还得采用原来的老办法。容器里的mysql和外面的mysql并没有本质区别,其配置文件在/etc/mysql/conf.d
,也可以再添加自己的配置文件/etc/mysql/my.cnf
。
老办法如下:
https://blog.csdn.net/u012643122/article/details/46799943
https://blog.csdn.net/u012643122/article/details/47980233
第七步,设置mysql主从数据库
新建主服务器容器实例3307
docker run -d -p 3307:3306 -v "C:/Users/tang8/.docker/mydata/mysql-master/log":"/var/log/mysql" -v "C:/Users/tang8/.docker/mydata/mysql-master/data":"/var/lib/mysql" -v "C:/Users/tang8/.docker/mydata/mysql-master/conf":"/etc/mysql/conf.d" -e MYSQL_ROOT_PASSWORD="123456" --name mysql-master mysql:latest
进入C:/Users/tang8/.docker/mydata/mysql-master/conf
目录下新建my.cnf
文件内容如下:
[client]
default-character-set=utf8[mysqld]
#服务ID,同一局域网内需要唯一
server_id=1000
#无需同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mall-mysql-bin
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#设置二进制日志过期清理时间,默认值为0,,表示不自动清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或者指定类型的错误,避免slave端的复制中断
#如1062错误是指一些主键重复,1032错误是指主从数据库的数据不一致。
slave_skip_errors=1062character-set-server=utf8
init_connect='SET NAMES utf8'[mysqld_safe]
default-character-set=utf8[mysql]
default-character-set=utf8
修改完配置后重启容器实例3307
docker restart mysql-master
降低3307实例的/etc/mysql/conf.d/my.cnf文件权限
重启容器后/etc/mysql/conf.d/
目录下会出现我们刚刚在windows上新增my.cnf文件,不过此时文件权限太高需要减低,不然mysql会拒绝读取。
进入实例
docker exec -it mysql-master /bin/bash
修改权限
chmod 644 /etc/mysql/conf.d/my.cnf
再次重启
docker restart mysql-master
my.cnf权限相关文章:https://blog.csdn.net/u012643122/article/details/107280186
在容器实例3307内创建数据同步用户
进入实例
docker exec -it mysql-master /bin/bash
登录mysql:
mysql -uroot -p
/*创建slave用户,不绑定IP(@'%'),密码为123456*/
create user 'slave'@'%' identified by '123456';
/*将replication slave权限和replication client权限授予slave用户,不限IP(@'%'),不限库(on *.*),不限表(on *.*)*/
grant replication slave,replication client on *.* to 'slave'@'%';
主机上的数据只能由指定用户来同步,避免数据泄露。
权限相关文章:https://blog.csdn.net/u012643122/article/details/52643715
新建从服务器容器实例3308
docker run -d -p 3308:3306 -v "C:/Users/tang8/.docker/mydata/mysql-slave/log":"/var/log/mysql" -v "C:/Users/tang8/.docker/mydata/mysql-slave/data":"/var/lib/mysql" -v "C:/Users/tang8/.docker/mydata/mysql-slave/conf":"/etc/mysql/conf.d" -e MYSQL_ROOT_PASSWORD="123456" --name mysql-slave mysql:latest
进入C:/Users/tang8/.docker/mydata/mysql-slave/conf
目录下新建my.cnf
文件内容如下:
[client]
default-character-set=utf8[mysqld]
#服务ID,同一局域网内需要唯一
server_id=1001
#无需同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mall-mysql-slave1-bin
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#设置二进制日志过期清理时间,默认值为0,,表示不自动清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或者指定类型的错误,避免slave端的复制中断
#如1062错误是指一些主键重复,1032错误是指主从数据库的数据不一致。
slave_skip_errors=1062
#relay_log配置中继日志
relay_log=mall-mysql-relay-bin
#将复制事件写入自己的二进制日志
log_slave_updates=1
#设置数据库数据为只读(具有super权限的用户除外)
read_only=1character-set-server=utf8
init_connect='SET NAMES utf8'[mysqld_safe]
default-character-set=utf8[mysql]
default-character-set=utf8
修改完配置后重启容器实例3308
docker restart mysql-slave
降低3308实例的/etc/mysql/conf.d/my.cnf文件权限
重启容器后/etc/mysql/conf.d/
目录下会出现我们刚刚在windows上新增my.cnf文件,不过此时文件权限太高需要减低,不然mysql会拒绝读取。
进入实例
docker exec -it mysql-slave /bin/bash
修改权限
chmod 644 /etc/mysql/conf.d/my.cnf
再次重启
docker restart mysql-slave
my.cnf权限相关文章:https://blog.csdn.net/u012643122/article/details/107280186
在主数据库3307中查看主从同步状态
1,进入实例mysql-master,省略
2,登录mysql,省略
3,show master status;
在从数据库3308中配置主数据库相关信息
1,进入实例mysql-slave,省略
2,登录mysql,省略
3,认主归从
change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_port=3306,master_log_file='mall-mysql-bin.000001',master_log_pos=157,master_connect_retry=30;
或者
change master to master_host='192.168.1.217',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=157,master_connect_retry=30;
记住这个master_host一定不可能是127.0.0.1,而是master容器的ip地址。
如何查询master容器的IP?
1,进入实例mysql-master,省略
2,cat /etc/hosts
使用容器IP的话,端口就要用3306,。也可以不使用容器的IP,使用外部宿主机器windows的IP也是可以的。不过如果使用宿主机IP的话,端口就要使用3307。
master相关关键词释义
master_host=主数据库IP
master_port=主数据端口
master_user=在主数据库创建的用于同步的用户账号
master_password=在主数据库创建的用于同步的用户密码
master_log_file=指定从主数据库复制数据的日志文件,查看主数据状态的File字段的值
master_log_pos=指定从主数据库哪个位置开始复制数据,查看主数据状态的Position字段的值
master_connect_retry=从数据库连接主数据库失败时,重新尝试连接的间隔时间,单位秒
在从数据库3308中查看主从同步状态
1,进入实例mysql-master,省略
2,登录mysql,省略
3,show slave status \G;
,\G
只是用键值对格式输出结果,方便查看数据。
主要看 Slave_IO_Running和Slave_SQL_Running的值是Yes还是No。
在从数据库3308中开启主从同步
在从数据库执行SQLstart slave;
开启主从同步:
start slave;
关闭主从同步:
stop slave;
再从数据库3308中再次查看主从同步状态
如果连不上,Slave_IO_Running的值一直是Connecting,那就退出mysql命令行,在bash命令行上,使用mysql -h IP -P 端口 -u 用户名 -p
命令连接master数据库试试能不能连上。
mysql -h master_host -P 3307 -u slave -p
Authentication plugin 'caching_sha2_password’问题
如果使用宿主windows的ip有连接错误,slave连不上master:
error connecting to master 'slave@192.168.1.217:3307' - retry-time: 30 retries: 3 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
或者使用docker的ip有连接错误,slave连不上master:
error connecting to master 'slave@172.17.0.4:3306' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
都是因为mysql8.0会默认使用caching_sha2_password
插件来校验用户slave身份,但是服务器不会将公用密钥发送给客户端,并且客户端未提供公用密钥,因此它无法加密密码并且连接失败。
解决方案一:
要从服务器请求RSA公钥,需要指定选项 --get-server-public-key ,也就是说需要在slave请求服务器公钥:
mysql -u slave -p123456 -h 192.168.1.217 -P3307 --get-server-public-key
或者设置好master的密钥路径:
mysql -u repl -p123 -h 192.168.1.217 -P3307 --server-public-key-path=/mysqldata/slave/key/public_key1.pem
在这种情况下,服务器将RSA公钥发送给客户端,后者使用它来加密密码并将结果返回给服务器。插件使用服务器端的RSA私钥解密密码,并根据密码是否正确来接受或拒绝连接。
然后重新在从库配置change masrer to并且start slave,复制可以正常启动:
stop slave;
reset slave;
change master to master_host='192.168.1.217',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=157,master_connect_retry=30;
start slave;
解决方案二:
在master中修改slave用户,使其避免使用插件caching_sha2_password。
create user 'slave'@'%' identified with 'mysql_native_password' by '123456';
grant replication slave,replication client on *.* to 'slave'@'%';
flush privileges;
select user,host,plugin,authentication_string from mysql.user;
或者:
alter user 'slave'@'%' identified with mysql_native_password BY '123456';
flush privileges;
select user,host,plugin,authentication_string from mysql.user;
Slave_SQL_Running: No,Last_Errno: 1146问题
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
Last_Errno: 1146
Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at master log mall-mysql-bin. 000004, end_log_pos 1336. See error log and/or performance_schema. replication_applier_status_by_worker table for more details about this failure or others, if any.
添加测试数据测试主从同步是否工作
在主数据库建库建表,查看从数据是否同步更新。
windows docker里安装并使用mysql(内含mysql主从搭建)相关推荐
- windows docker desktop安装mysql[有效]
windows docker desktop安装mysql 1.拉去mysql镜像 docker pull mysql:5.7 2.查看并启动镜像 #列出已下载的镜像 docker images #启 ...
- 【Docker】安装Presto连接Hive、mysql、oracle、postgresql、SQL server等7种类型数据库
目录 1.简介 2.下载安装 1)下载镜像 2)下载presto客户端jar文件 3)将hadoop配置拷贝到容器 4)新增hive.properties配置文件 5)重启容器(在linux命令行下) ...
- ubuntu安装谷歌浏览器 typora+出现编码错误‘ascii‘ codec can‘t encode character ‘\u6b66‘+docker里安装tensorrt报错
一.首先下载谷歌浏览器 https://www.google.cn/chrome/ sudo dpkg -i google-chrome-stable_current_amd64.deb 就安装好了, ...
- 53.Azure中CentOS的Docker里安装运行SQL Server容器
大家熟悉SQL Server可以安装在Windows系统上,我也介绍了SQL Server可以安装在LInux上,那么今天我将给大家介绍SQL Server安装在Docker上成为容器快速运行起来 首 ...
- 【Mysql】数据库主从搭建-基于docker
后台可回复[1024]即可获取相关宝藏内容分享 :) 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docke ...
- docker里安装部署kibana
1.拉取Kibana 例如:首先需要把Kibana从DockerHub上拉取下来:统一版本7.6.2 docker pull kibana:7.6.2 2.启动kibana容器: -e ELASTIC ...
- mysql 双节点主从搭建_MySQL Replication, 主从和双主配置
MySQL的Replication是一种多个MySQL的数据库做主从同步的方案,特点是异步,广泛用在各种对MySQL有更高性能,更高可靠性要求的场合.与之对应的另一个技术是同步的MySQL Clust ...
- mysql gtid 1236_MYSQL主从搭建GTID报错 error 1236 master has purged binary logs containing GTIDs?...
主从的版本:5.7.25-28-log 现状: 将主库的全备(innobackupex)还原作为一个从库,还原的过程正常,在设置从库报错: Got fatal error 1236 from mast ...
- Mysql集群主从搭建指定数据库同步数据
1.全库同步与部分同步 之前提到,我们目前配置的主从同步是针对全库配置的,而实际环境中,一般并 不需要针对全库做备份,而只需要对一些特别重要的库或者表来进行同步.那如何 针对库和表做同步配置呢? 首先 ...
最新文章
- 自定义分页(模块化)
- linux mariadb
- fputc会覆盖吗_深覆盖 VS 深覆合如何区分?这一篇看完就都明白了!
- 【分享】如果我没有那么优秀,我研究生阶段选择机器学习方向还有出路吗?...
- 单机俄罗斯方块游戏制作心得(四)
- webpack打包非模块化js
- Redis在Window的启动方式(包括安装包也送)
- mysql sql注入工具下载_超级SQL注入工具【SSQLInjection】
- 确定不看看我的扫雷吗(C语言)
- L1-084 拯救外星人 C语言
- DAP数据分析平台介绍
- 流放者柯南自建服务器 linux,《流放者柯南》自建服务器教程一览 服务器搭建方法介绍...
- python实现三级菜单_Python3.5实现的三级菜单功能示例
- 在金融业务中跨行清算系统的实现过程
- JavaWeb新闻发布系统案例08——完结篇
- Mac Office 2016 版安装
- 调用layoutSubviews一定要注意别忘了调用父类
- 婚礼类小程序前端界面模板源码
- 泰坦尼克号生存预测python_用Python预测泰坦尼克生存情况-附数据集
- 如何设置无需fn直接按F1~F10
热门文章
- 杰理之芯片受潮的危害【篇】
- Vuex配置及Vuex原理图分析,简单明了,一遍就明白
- g的python实现_Python flask.g方法代码示例
- 复杂指令集(CISC)和精简指令集(RISC)- 历史的产物
- JQuery checkedBox全选和全部选
- Python round()函数的严谨用法
- java 判断字符串包含几个字符_java中如何判断一个字符串包含几个指定字符
- http://与www.前缀网站有何区别
- 酷我音乐爬虫(400多行代码)
- java中将方法当作参数传递的方式