【专研24H总结】Ubuntu 中 mysql8.0 与 Docker 中 Mysql8.0 实现主从同步

本文经本人 24H 专研总结, 按步骤一一操作, 保你成功搭建主从

声明: 本文实现主从环境介绍: 

由于 Mysql8.0 以后的版本, 安全机制配置文件 有所差异, 操作前请详阅: 

Ubuntu 版本: 16.04 LTS 64bit

Docker 版本: 18.09.7

主 Mysql 版本: 8.0.16   ------安装在 Ubuntu 虚拟机内,  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

从 Mysql 版本: 8.0.16   ------安装在 Docker 容器内,  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)


一. 搭建 从 mysql 映射目录

1. 切换到用户家目录

cd ~
2. 创建从数据库服务目录

mkdir mysql_slave
3. 切换到从数据库服务目录

cd mysql_slave
4. 创建从数据库服务映射目录

mkdir data conf logs

5. 文件夹说明

    data: 从数据库数据映射目录

    conf: 从数据库配置文件映射目录

    logs: 从数据库日志文件映射目录, 本文暂不使用

二. 在 Docker 中创建 Mysql 容器

    1. 先用基本的命令创建 mysql 容器并运行, 此操作是为了查看 docker 中 mysql8.0 的配置文件的默认路径 ( 每个版本的可能不一样, 大部分主从搭建不成功都是因为配置文件的问题, 这点很重要 ):

命令:

docker run -d -e MYSQL_ROOT_PASSWORD=mypassword --name mysql-slave  -p 8306:3306 mysql:latest

参数说明:

-d: 让创建的mysql容器后台运行

-e: 为容器设置环境变量

MYSQL_ROOT_PASSWORD: 设置密码

--name: 为创建的容器指定一个名字

-p: 表示端口映射, 这里将 docker 中从mysql 的端口 3306 映射到 宿主机 Ubuntu 对应的 8306端口上

mysql: 镜像的名字, 冒号后面指定我们拉取 mysql 镜像的版本, 这里 latest 指的是最新本, 即 8.0.16


    2. 在终端输入以下命令, 进入 docker 中刚刚创建正在运行的 mysql 容器, 并以 bash 界面进行交互

docker exec -it mysql-slave bash

进入后界面如下:

 

    3. 拷贝 Docker 中 Mysql8.0 的配置文件

a. Docker 中的 mysql8.0 一般默认是以 /etc/mysql/my.cnf 来进行启动的( 可以在终端输入mysql --help 中查看 ), 在这个目录下还有一个 conf.d 的目录, 里面有个文件名为mysql.cnf, 用来给用户自定义配置用的; 

b. 在终端输入命令 cd /etc/mysql/conf.d/ , 将该目录下的 mysql.cnf 拷贝到宿主机的 ~/mysql_slave/conf/ 目录中。拷贝方法有很多, 这里可以使用 cat mysql.cnf 查看, 再复制内容到宿主机的 ~/mysql_slave/conf 目录; 

c. 编辑刚刚复制的 mysql.cnf 配置文件, 命令: sudo  vi ~/mysql_slave/conf/mysql.cnf ( 配置文件见底部附录一 )

注意: 自定义配置文件时, 一定不要写在 [mysql] 下面, 我们手动在 [mysql] 下面添加 [mysqld] , 在 [mysqld] 这个名字下面写我们的配置。[xxxxx]: 代表 mysql 启动时客户端与服务器之间的标志


    4. 停止并删除 docker 中的 mysql-slave 容器

停止命令:

docker container stop mysql_slave

删除命令:

docker container rm mysql_slave

    

    5. 重新创建并启动 mysql-slave 容器, 同时映射数据和配置目录: ~/mysql_slave/data 和 ~/mysql_slave/conf

命令:
docker run -d --network=host --name mysql-slave -e MYSQL_ROOT_PASSWORD=mypassword -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/conf:/etc/mysql/conf.d mysql:latest

验证是否成功:

      法一: 使用命令 docker ps ( 查看刚刚创建的 mysql_slave 容器运行状态 )

      法二: 使用命令 mysql -uroot -p -h 127.0.0.1 --port=8306 登录 mysql_slave 容器, 看是否能成功访问 docker 中的 mysql

参数说明:

-d: 让创建的mysql容器后台运行

--network-host: 表示将主机的网络环境映射到容器中, 容器的网络和主机相同

--name: 为创建的容器指定一个名字

-e: 为容器设置环境变量

MYSQL_ROOT_PASSWORD: 设置密码

-v: 表示目录映射关系 ( 前者宿主机对应目录, 后者容器对应目录, 即要映射到宿主机上的目录, 这里的/home/python/mysql_slave就是我们刚刚在第一步创建的目录路径, 请根据自己的电脑路径修改 )

mysql: 镜像的名字, 冒号后面指定我们拉取 mysql 镜像的版本, 这里 latest 指的是最新本, 即 8.0.16

 

三. 数据库主从同步操作


    1. 备份主数据库数据:

mysqldump -uroot -p --all-databases --lock-all-tables > ~/master_db.sql

 

    2. 导入数据到从数据库:

mysql -uroot -p -h127.0.0.1 --port=8306 < ~/master_db.sql

 

    3. 配置主Mysql配置文件

命令:

sudo vim /etc/mysql/mysql.cnf

用vim打开配置文件后在 [mysqld] 下面, 设置 log_bin = /var/log/mysql/mysql-bin.logserver-id = 1

配置完成后 重启主 mysql 服务:

sudo service mysql restart

 

    4. 主数据库操作:

登录主mysql:

            mysql –uroot –p

创建从服务器账户: 

            CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';

对账户授权:

            GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';
        
刷新权限:

            FLUSH PRIVILEGES;

查看主数据库状态: 获取主服务器的二进制日志信息 和 记录的位置( 一会儿要用 )

            SHOW MASTER STATUS;

【专研24H总结】Ubuntu 中 mysql8.0 与 Docker 中 Mysql8.0 实现主从同步_第1张图片

 

    5. 从数据库操作:  

登录到 从数据库: (docker中的mysql)

            mysql -uroot -p -h 127.0.0.1 --port=8306
            
配置 从服务器 slave 线程: ( 注意红色文字是我们刚刚查询主mysql的状态, 见上图 )

            change master to master_host='127.0.0.1', master_user='slave', master_password='mypassword',master_log_file='mysql-bin.000055', master_log_pos=155;
        
开启从服务器slave线程:

            start slave
        
查看主数据库状态: (查看这两个参数, Yes为OK: Slave_IO_Running: Yes, Slave_SQL_Running: Yes)

            show slave status\G;

【专研24H总结】Ubuntu 中 mysql8.0 与 Docker 中 Mysql8.0 实现主从同步_第2张图片

 

附录一:

  从数据库服务端 配置文件: ( 文件名一定要是: mysql.cnf )

# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA

#
# The MySQL  Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysql]

[mysqld]
# 从服务器端口 ( 必填 )
port  =  8306
# 关闭日志
general_log  = 0
# 数据库服务端ID ( 必填 )
server-id  = 3
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

 

你可能感兴趣的:(数据库,Docker,Mysql8.0主从同步)