环境信息

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