Loading

docker安装mysql主从

docker安装mysql

只有一台服务器资源,分别以不通端口启动多个mysql
3306、3307、3308

启动docker

systemctl  start docker.service

拉取mysql镜像

docker pull mysql:5.7

创建相关目录

mkdir /usr/local/docker
cd /usr/local/docker

创建主库文件夹

mkdir mysql_master_3306
cd mysql_master_3306
mkdir conf data log sql
cd ..

创建从库文件夹(复制主库)

cp -r mysql_master_3306/ mysql_slave_3307/ 
cp -r mysql_master_3306/ mysql_slave_3308/ 

配置master主库

cd /usr/local/docker/mysql_master_3306/conf/

编辑配置文件vim my.cnf

[client]
 
default-character-set=utf8mb4
 
 
[mysqld]
 
character-set-client-handshake = FALSE
 
character-set-server = utf8mb4
 
collation-server = utf8mb4_unicode_ci
 
server-id=1        # 数据库唯一 ID,主从的标识号绝对不能重复。
 
log-bin=/var/log/mysql/binlog    # 开启 bin-log,并指定文件目录和文件名前缀
 
binlog-do-db=masterSlaveDB  # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
 
binlog-ignore-db=mysql  # 不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
 
sync_binlog = 1      # 确保 binlog 日志写入后与硬盘同步
 
binlog_checksum = none  # 跳过现有的采用 checksum 的事件,mysql5.6.5 以后的版本中 binlog_checksum=crc32,而低版本都是 binlog_checksum=none
 
binlog_format = mixed   # bin-log 日志文件格式,设置为 MIXED 可以防止主键重复。
 
[mysql]
default-character-set=utf8mb4

配置slave从库(从库3307和3308只有server-id不同)

cd /usr/local/docker/mysql_slave_3307/conf/
vim my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=2        # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog    # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB  # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql  # 不同步 mysql 系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
slave-skip-errors = all   # 跳过所有的错误错误,继续执行复制操作
[mysql]
default-character-set=utf8mb4

复制3307配置文件到3308

cp /usr/local/docker/mysql_slave_3307/conf/my.cnf /usr/local/docker/mysql_slave_3308/conf/
sed -i '7 c\server-id=3' /usr/local/docker/mysql_slave_3308/conf/my.cnf

初始化sql文件

master库

vim /usr/local/docker/mysql_master_3306/sql/init.sql
-- 创建数据库
DROP database IF EXISTS `masterSlaveDB`;
CREATE DATABASE `masterSlaveDB` default character set utf8mb4 collate utf8mb4_unicode_ci;
 
-- 切换数据库
USE masterSlaveDB;
 
-- 创建表
DROP TABLE IF EXISTS `masterSlaveTable` ;
CREATE TABLE `masterSlaveTable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `type` varchar(2) DEFAULT NULL COMMENT '生活用品类别:1. 家电类 2. 厨具',
        `name` varchar(50) DEFAULT NULL COMMENT '生活用品名称',
        `description` varchar(200) DEFAULT NULL COMMENT '生活用品描述',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='MySQL 主从同步测试表';
 
INSERT INTO masterSlaveTable ( type , name , description )
VALUES ('1','电饭煲','用来蒸饭'),('1','电热壶','用来烧水'),('1','空调','用来制冷或制热'),('2','菜刀','用来切菜'),('2','刨子','用来剥皮'),('2','打蛋器','用来搅拌鸡蛋');

slave从库

cp /usr/local/docker/mysql_master_3306/sql/init.sql /usr/local/docker/mysql_slave_3307/sql/
cp /usr/local/docker/mysql_master_3306/sql/init.sql /usr/local/docker/mysql_slave_3308/sql/

配置log目录权限

chmod -R 777 /usr/local/docker/mysql_master_3306/log/ /usr/local/docker/mysql_slave_3307/log/ /usr/local/docker/mysql_slave_3308/log/

运行MySQL容器

docker images

启动master库

docker run -p 3306:3306 --name mysql-master-3306 -v /usr/local/docker/mysql_master_3306/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_master_3306/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_master_3306/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_master_3306/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
-p:端口映射(宿主机端口:容器端口)
--name:启动后的容器名称
-v:第一个 -v 为映射配置文件(宿主机目录:容器目录)
-v:第二个 -v 为映射数据目录,相当于把容器中的数据备份到宿主机指定的目录(宿主机目录:容器目录)
-v:第三个 -v 为初始化 sql 目录(宿主机目录:容器目录)
-v:第四个 -v 为日志目录(宿主机目录:容器目录)
-e MYSQL_ROOT_PASSWORD=123456:设置 root 连接密码
映射实际上是把宿主机和容器相连通
容器中映射目录的文件发生改变时,宿主机中映射目录的文件也发生变化
-d:后台启动
mysql:5.7:启动的镜像

slave从库启动

docker run -p 3307:3306 --name mysql-slave-3307 -v /usr/local/docker/mysql_slave_3307/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3307/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3307/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3307/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 3308:3306 --name mysql-slave-3308 -v /usr/local/docker/mysql_slave_3308/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3308/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3308/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3308/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入master库容器

docker ps -a
docker exec -it CONTAINER ID bash
mysql -u root -p123456

授权远程同步用户

grant all privileges on *.* to root@'%' identified by '123456';
flush privileges;
show master status;

宿主机查看master库ip地址

docker inspect e5c27579d909 | grep IPAddress

进入slave库容器

docker ps -a
docker exec -it CONTAINER ID bash
mysql -u root -p123456
stop slave;
change  master to master_host='172.17.0.2',master_user='root',master_password='123456',master_log_file='binlog.000003',master_log_pos=150;
master_host:主库服务器 ip 地址
master_user:主库 MySQL 用户名
master_password:主库 MySQL 密码
master_log_file:为上面查询的主库 File 值 -> binlog.000003
master_log_pos:为上面查询的主库 Position 值 -> 150
start slave;
show slave status\G;   #Slave_IO_Running: Yes  Slave_SQL_Running: Yes

docker命令

docker rm  CONTAINER ID  #删除容器
docker ps -a -> 查看容器运行情况
posted @ 2021-09-30 17:35  萝卜青菜~  阅读(75)  评论(0编辑  收藏  举报