一、创建mysql主从服务器容器
docker run -it docker run -it --name mysql_slave5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker run -it docker run -it --name mysql_master5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
二、修改账号权限
授权root用户可以从任何机器上访问服务
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword'
FLUSH PRIVILEGES;
三、查看日志文件的位置
查看日志文件和文件位置-如果需要日志挂在则需要这个地址:
show variables like '%log%'
四、配置主从同步
登陆到容器master节点上,修改主节点的配置文件:
-
安装vim :apt-get install vim
-
解决vim不能复制的问题: vim ~/.vimrc
set mouse=c
syntax on
3. 配置mysql的server-id和日志功能
[mysqld] ## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin
-
重启mysql和对应的容器
service mysql restart,
docker start mysql_master5.7
-
在主库上创建同步日志使用的账号并授予权限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-
部署slave,修改配置文件,然后重启mysql和容器
[mysqld] ## 设置server_id,注意要唯一 server-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin
7. master中执行,查看日志状态: show master status
8. 在Slave 中进入 mysql
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 154, master_connect_retry=30;
参数解析:
1 host :Master容器的独立IP,查询语句, docker inspect --format='{{.NetworkSettings.IPAddress}' mysql_master5.7 2 master_user :数据同步的用户名,在Master上自己创建的 3 master_password: 数据同步的密码,在Master上自己创建的用户带有的密码 4 master_port :Master服务器容器的端口号,指的是容器的端口号 5 master_log_file: Slave从Master的那个日志文件复制数据 ,show master status;可以查看文件名称,和position参数 6 master_log_pos:从master_log_file文件的具体那个位置开始复制文件 7 master_connect_retry:链接失败的时候重试的时间间隔,默认60s(单位秒)
9. Slave服务器上执行 show slave status 查看同步状态和配置信息,可以看到运行状态都是No
Slave_IO_Running: No
Slave_SQL_Running: No
10. 启动Slave服务:start slave;,然后在次执行 show slave status,查看同步进程是开启的了。
11. 在主库中添加数据,查看数据是否正常同步
五、问题整理
1、数据同步失败日志 : show slave statusG
2、 show slave statusG ,显示 Slave_SQL_Running: No
1)程序可能在slave上进行了写操作
2.)也可能是slave机器重起后,事务回滚造成的.
有两种解决办法:
1) slave跳过一个事务同步
mysql> stop slave ; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; //跳过一个event,如果正好落到一个事务里面则,跳过那个事务 mysql> start slave ;
2) 手动同步salve数据参数:
1 查看master中同步的日志和对应的位置: show master status; 2 停止slave, stop slave 3 slave上执行脚本,重新设置数据参数:
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 2060, master_connect_retry=30; 4 启动slave,start slave 同步过程中master不能插入数据,即日志的position不能修改
3)如果要求数据完全一致,则主库数据完全同步到从库,重新设置slave中master的信息