DOCKER安装mysql实现主从复制

环境信息

centos7.2

安装目录

DOCKER实现mysql主从复制


DOCKER实现mysql主从复制

1. 安装前工作

①:首先进行DOCKER安装
②:在docker上安装mysql或者直接下载一个mysql镜像
③:本次mysql实现的主从复制是单项复制(即主库可以让从库复制,从库不可以进行操作,因为操作了主库可能在执行二进制文件导致数据同步错误,而导致主从复制失效)
④:双向复制即是相对主从库都开启二进制文件即可

注意:
宿主机的一个端口只能映射到容器内部的某一个端口上,比如:8080->80之后,就不能8080->81
容器内部的某个端口可以被宿主机的多个端口映射,比如:8080->80,8090->80,8099->80


2. 安装DOCKER步骤

  1. mysql的安装(直接下载mysql镜像的直接跳过)
    mysql安装的步骤
  2. 修改mysql的配置,打开mysql的通道
	主:修改配置my.conf
		# 主从复制打开的二进制文件
		server_id = 1
		log-bin = mysql-master-log	
	从:修改配置my.conf
		# 单向复制,从不需要开启二进制(如需双向复制需要从库开启二进制日志)
		server_id = 2

3.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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值