环境信息
centos7.2
安装目录
DOCKER实现mysql主从复制
- 修改mysql的配置,打开mysql的通道
主:修改配置my.conf
# 主从复制打开的二进制文件
server_id = 1
log-bin = mysql-master-log
从:修改配置my.conf
# 单向复制,从不需要开启二进制(如需双向复制需要从库开启二进制日志)
server_id = 23.mysql主从复制实现步骤①:master:创建一个mysql用户
set global validate_password_policy=0; ###基于密码长度(修改为LOW方式)
set global validate_password_length=1; ###
create user 'kunzairead'@'%' identified by 'admin';
②:master:赋予一个权限
grant replication slave on *.* to 'kunzairead'@'172.18.0.3(从库ip)' identified by 'admin';
③:master:刷新权限
flush privileges;
④:master:退出,重启mysql
exit
systemctl restart mysqld
⑤:master:查询master的配置(会查询二进制文件的文件信息,和偏移量等信息)
show master status\G;
⑥:slave:先关闭slave,在进行指定master的信息(master_log_file,master_log_pos在查询master的状态时可以看见)[stop/start slave;这个操作相当于是关闭或者开启同步线程]
stop slave;
change master to master_host='172.18.0.2(主库ip)',master_port=3305,master_user='kunzairead',master_password='admin',master_log_file='mysql-master-log.000003',master_log_pos=154;
start slave;
#查看slave的状态
show slave status \G;
⑦:我们复制的master的数据库,这样有可能导致uuid的重复报错解决如下
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work
表现为:Slave_IO_Running: No
解决方案为:
查看mysql的server_id的标识:show variables like 'server_id';
find / -name "auto.cnf"
但是查看/mysql/data/auto.cnf发现里面的UUID是哦相同的。原因是mysql是直接从节点1上拷贝过来而导致。
解决:mv /mysql/data/auto.cnf /mysql/data/auto.cnf.bak 重启mysql解决
⑧:设置从库为只读模式
授权普通MySQL测试账号
set global read_only=1;
set global read_only=0; 为取消普通账号的只读模式
slave上配置只读,在配置文件/etc/my.cnf中的mysqld中配置read_only=1
grant select,insert,update,delete on s18.* to 'test'@'127.0.0.1' identified by '123456';
用测试账号登陆进行删除等操作,会提示--read-only错误
拥有super权限的
注意:set global read_only=1 对拥有super权限的账号是不生效的,所以在授权账号的时候尽量避免添加super权限
那么我们在做数据迁移的时候不想发生任何数据的修改,包括super权限修改也要限制。
可以用锁表:
mysql> flush tables with read lock;
使用root账号测试:
mysql> delete from student where sid=13;
解锁测试:
mysql> unlock tables;
我们的一般做法是,给从库分配一个普通用户。
将slave数据库read-only=1设置只读后,在master执行GRANT USAGE ON *.* TO 'user01'@'localhost' IDENTIFIED BY'123456'WITH GRANT OPTION;(这里要区别上面给从库分配复制权限的写法,这里分配的是usage权限, 后面多了with grant option)
创建一个普通用户,
然后用普通用户登录从库,执行操作会报错。切换到root用户后还是可以进行增删改查的。
如(从库操作):
在从库配置文件(my.cnf)中增加配置
read_only=1
create user 'kunzaislaveread'@'%' identified by 'admin';
GRANT USAGE ON *.* TO 'kunzaislaveread'@'%' IDENTIFIED BY'admin' WITH GRANT OPTION;
修改从库的mysql的user的表,设置用户kunzaislaveread权限Select_priv为Y就可以了mysql的max_allowed_packet属性修改后无效使用以下命令查看与my.conf设置的不一样
show VARIABLES like '%max_allowed_packet%';
set global max_allowed_packet = 1073741824;依然无效
然后通过一下命令修改权限,重启docker有效了
chmod 777 /etc/my.cnf