目的 备份数据, 主库挂了从库依然可以访问
使用 docker 生成镜像 本文默认为已安装 docker 环境, ubuntu 环境
1 2 3 4 5 在本机上安装mysql5.7版本 sudo docker pull mysql:5.7 mkdir -p mysql/{master,slave}
然后在 master 和 slave 目录中写入配置文件Dockerfile
和my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # master/Dockerfile和slave/Dockerfile FROM mysql:5.7 COPY my.cnf /etc/mysql/ EXPOSE 3306 CMD ["mysqld"] # master/my.cnf, 主库和从库的server-id不能相同 [mysqld] log-bin=mysql-bin server-id=1 # slave/my.cnf log-bin=mysql-bin server-id=2
分别在目录中执行以下命令生成镜像
1 2 3 4 5 sudo docker build -t master/mysql . sudo docker build -t slave/mysql .
创建并配置容器 创建容器初始化数据库密码
1 2 sudo docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=654321 -d master/mysql sudo docker run -p 3308:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=654321 -d slave/mysql
可以通过sudo docker ps 查询
1 2 3 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b69cb0f6d536 slave/mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3308->3306/tcp mysql-slave 310f9101ef10 master/mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3307->3306/tcp mysql-master
写一个查询容器IP地址
的 sh, 把内容复制到.bashrc 中
1 2 3 function docker_ip(){ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1 }
查看两个容器服务的IP地址
, 连接数据库
1 2 3 4 5 6 7 docker_ip mysql-master docker_ip mysql-slave mysql -u root -h 172.17.0.2 -p mysql -u root -h 172.17.0.3 -p
在主库上进行配置
1 2 3 4 5 6 7 8 9 10 11 # 设置user用户并设置所有host可以访问, 访问密码654321 GRANT SELECT, REPLICATION SLAVE ON *.* to 'user'@'%' identified by '654321'; # 查看容器状态 show master status +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 1028 | | | | +------------------+----------+--------------+------------------+-------------------+
在从库上进行配置
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 34 35 36 37 38 39 40 41 42 change master to master_host='172.17.0.2', # 连接的master IP地址 master_user='user', master_log_file='mysql-bin.000003', master_log_pos=1028, master_port=3306, master_password='654321'; # 执行命令并查看连接状态 mysql > start slave; mysql > show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.17.0.2 Master_User: user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 1028 Relay_Log_File: b69cb0f6d536-relay-bin.000002 Relay_Log_Pos: 503 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1028 ... # 如果配置错误执行stop slave后重新配置 mysql > stop slave; mysql > 配置... mysql > start slave;
Slave_IO_Running
和Slave_SQL_Running
必须是 Yes, 如果是 No 和 Connecting 表示连接失败
失败原因可能有:
连接 master 的 IP 地址有误
配置密码错误
mysql_log_pos 有误
测试 在主库创建一个数据库, 在从库上查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 主库 create database abc default character set utf8; # 从库 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | abc | | mysql | | performance_schema | | sys | +--------------------+
参考地址