docker mysql 主从
一般不会在一台服务器上启动两个docker做主从,因为服务器一挂,两个容器都挂了
192.168.59.102 mysql1 master
192.168.59.103 mysql2 slave
1、安装mysql
本次使用docker 安装mysql
#docker run -p 3312:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.29
#docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.29
2、开启mysql1和mysql2的navicat访问
>use mysql;
>UPDATE user SET HOST = '%' WHERE USER ='root';
失败,查看user表
>select host,user,plugin from user;
root的host已经是%,跳过
>ALTER user 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
>ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
>FLUSH PRIVILEGES;
3、配置master
选择mysql1作为master
登录容器mysql1
修改文件 /etc/mysql/my.cnf
添加以下信息
【
log-bin=master-bin
server-id=1】
登录mysql1的数据库
给mysql2(slave)配置一个用户名/密码和权限
#创建一个slave1密码123456的用户,
mysql> create user 'slave1'@'192.168.59.103' identified by '123456';
mysql>ALTER user 'slave1'@'192.168.59.103' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
#踩坑记录,如果不设置 PASSWORD EXPIRE NEVER,slave数据库连接一直提示密码无法验证
#或者slave1用户不指定IP:'slave1'@'%',就可以不设置 PASSWORD EXPIRE NEVER
mysql>ALTER user 'slave1'@'192.168.59.103' IDENTIFIED WITH mysql_native_password BY '123456';
#给slave1分配权限,所有数据库.所有表
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.59.103';
#查看slave1的权限
mysql>show grants for 'slave1'@'192.168.59.103';
重启mysql服务
再登录数据库查看master状态
mysql> show master status;
注意:master-bin.000001和157,slave配置用到
4、配置slave
选择mysql2作为slave
登录容器mysql2
修改文件 /etc/mysql/my.cnf
添加以下信息
【
log-bin=relay-bin
server-id=2】
登录mysql2的数据库,将slave指向master
mysql>CHANGE MASTER TO
>MASTER_HOST='master所在服务器的IP',
>MASTER_USER='master授权的账号',
>MASTER_PASSWORD='master授权的密码',
>MASTER_PORT=master端口号,
>MASTER_LOG_FILE='master的日志文件名',
>MASTER_LOG_POS=master的日志所在位置;
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
mysql>CHANGE MASTER TO
>MASTER_HOST='192.168.59.102',
>MASTER_USER='slave1',
>MASTER_PASSWORD='123456',
>MASTER_PORT=3312,
>MASTER_LOG_FILE='master-bin.000001',
>MASTER_LOG_POS=157;
启动slave
mysql>start slave;
查看slave
mysql>show slave status\G;
两个都为Yes,启动成功
验证:(192.168.59.102和192.168.59.103需要同步的数据库.表要一样的结构)
在192.168.59.102上插入一条信息
192.168.59.103同时同步到一条记录
注意
1)开启了主从复制,slave库如果写入数据的话,可能导致数据回滚从而主从复制线程中断
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql > SET GLOBAL server_id=2;
mysql> start slave;
2)停止slave的复制可以使用命令:
mysql>stop slave;
3)重启master服务器后,日志文件名会产生变化,如果无法同步数据,先stop slave;再CHANGE MASTER TO MASTER_LOG_FILE='master的日志文件名';来修改配置。
4)max_connection_errors数量饱和,使slave服务器无法链接master服务器
解决方法1:修改提高允许的max_connection_errors数量:(这种方法不是长期)
set global max_connect_errors = 1000; show variables like '%max_connect_errors%';
解决方法2:使用mysqladmin flush-hosts 命令清理一下hosts文件
mysqladmin --socket=/tmp/mysql.sock --port=3306 -uroot -p flush-hosts
或者 mysql> flush hosts; 也可以
最后修改my.cnf配置文件 vi /etc/my.cnf:max_connect_errors = 1000
"注:max_connect_errors相关说明
max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。如果希望重置此计数器的值,则必须重启MySQL服务器或者执行 mysql> flush hosts; 命令。当这一客户端成功连接一次MySQL服务器后,针对此客户端的max_connect_errors会清零。
如果max_connect_errors的设置过小,则网页可能提示无法连接数据库服务器;而通过SSH的mysql命令连接数据库,则会返回 ERROR 1129 (00000): Host 'gateway' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 错误。
功能与作用:一般来说建议数据库服务器不监听来自网络的连接,仅仅通过sock连接,这样可以防止绝大多数针对mysql的攻击;如果必须要开启mysql的网络连接,则最好设置此值,以防止穷举密码的攻击手段"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了