本文经本人 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.log 和 server-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;
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;
附录一:
从数据库服务端 配置文件: ( 文件名一定要是: 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