• windows docker里安装并使用mysql(内含mysql主从搭建)


    第一步,命令行拉取mysql镜像

    docker pull mysql:latest
    
    • 1

    查看是否拉取成功

    docker images mysql:latest
    
    • 1

    第二步,运行mysql镜像,启动mysql实例

    docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:latest
    
    • 1

    3306:3306前面的是mysql在windows里端口,后面的是mysql在docker里端口,如果windows外面安装了mysql,端口也是3306,那么要先关闭windows的mysql,不然会有端口冲突:
    在这里插入图片描述

    查看mysql是否启动

    docker ps
    
    • 1

    在这里插入图片描述

    第三步,进入容器实例,登录mysql

    进入容器实例:

    docker exec -it 3bac8e05792e /bin/bash
    
    • 1

    在这里插入图片描述
    退出bash命令行:

    exit
    
    • 1

    复制和粘贴命令行上的文本:
    选中文本,按一下鼠标右键即可复制,在按一下鼠标右键即可粘贴。

    然后输入mysql -uroot -p进行登录:

    mysql -uroot -p
    
    • 1

    在这里插入图片描述
    输入密码后进入mysql控制台:
    在这里插入图片描述
    查询字符集:

    show variables like 'character%';
    
    • 1

    退出mysql命令行:

    exit
    
    • 1

    第四步,在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
    
    • 1

    宿主机是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
    
    • 1

    其中,--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|数据卷名
    
    • 1

    只删除数据卷,如果还有容器引用该数据卷,则删除失败。

    docker volume rm 数据卷名
    
    • 1

    删除所有未被使用的数据卷,不指定名称。

    docker volume prune
    
    • 1

    第六步,解决乱码问题

    为了解决docker里的mysql无法存储中文问题,我百度了一番,发现有人提供的解决方案是需要修改容器创建的代码:

    docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:latest --character-set-connection=utf8 --character-set-client=utf8
    
    • 1

    如果mysql容器处于Exited状态,docker ps命令查不出来,那么可以使用:

    docker logs --tail 200 容器ID
    
    • 1

    查看错误日志,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
    
    • 1

    进入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=1062
    
    character-set-server=utf8
    init_connect='SET NAMES utf8'
    
    [mysqld_safe]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    修改完配置后重启容器实例3307

    docker restart mysql-master
    
    • 1

    降低3307实例的/etc/mysql/conf.d/my.cnf文件权限

    重启容器后/etc/mysql/conf.d/目录下会出现我们刚刚在windows上新增my.cnf文件,不过此时文件权限太高需要减低,不然mysql会拒绝读取。

    进入实例

    docker exec -it mysql-master /bin/bash
    
    • 1

    修改权限

    chmod 644 /etc/mysql/conf.d/my.cnf
    
    • 1

    再次重启

    docker restart mysql-master
    
    • 1

    my.cnf权限相关文章:https://blog.csdn.net/u012643122/article/details/107280186

    在容器实例3307内创建数据同步用户

    进入实例

    docker exec -it mysql-master /bin/bash
    
    • 1

    登录mysql:

    mysql -uroot -p
    
    • 1
    /*创建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'@'%';
    
    • 1
    • 2
    • 3
    • 4

    主机上的数据只能由指定用户来同步,避免数据泄露。

    权限相关文章: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
    
    • 1

    进入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=1
    
    
    character-set-server=utf8
    init_connect='SET NAMES utf8'
    
    [mysqld_safe]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    修改完配置后重启容器实例3308

    docker restart mysql-slave
    
    • 1

    降低3308实例的/etc/mysql/conf.d/my.cnf文件权限

    重启容器后/etc/mysql/conf.d/目录下会出现我们刚刚在windows上新增my.cnf文件,不过此时文件权限太高需要减低,不然mysql会拒绝读取。

    进入实例

    docker exec -it mysql-slave /bin/bash
    
    • 1

    修改权限

    chmod 644 /etc/mysql/conf.d/my.cnf
    
    • 1

    再次重启

    docker restart mysql-slave
    
    • 1

    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;
    
    • 1

    或者

    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;
    
    • 1

    记住这个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;
    
    • 1

    关闭主从同步:

    stop slave;
    
    • 1

    再从数据库3308中再次查看主从同步状态

    在这里插入图片描述
    如果连不上,Slave_IO_Running的值一直是Connecting,那就退出mysql命令行,在bash命令行上,使用mysql -h IP -P 端口 -u 用户名 -p命令连接master数据库试试能不能连上。
    mysql -h master_host -P 3307 -u slave -p

    添加测试数据测试主从同步是否工作

    在主数据库建库建表,查看从数据是否同步更新。

  • 相关阅读:
    银河麒麟服务器x86安装ntp客户端,并配置成功可以同步时间
    三个主要降维技术对比介绍:PCA, LCA,SVD
    HTTP1.0,1.1,2.0
    多线程概述
    推进农业水价综合改革的意见解读
    地球重力场模型EGM2008使用教程及软件
    新win7系统下载 win7优化旗舰版系统2022下载
    数据结构详细笔记——树
    C++移动构造和移动赋值函数
    关于初始化page入参的设计思路
  • 原文地址:https://blog.csdn.net/u012643122/article/details/125899829