mysql主从复制-简单模式

mysql主从复制-简单模式

月光魔力鸭

2023-11-11 14:53 阅读 201 喜欢 0 主从复制

学习研究一下关于mysql的主从复制。

准备

通过docker创建两个mysql实例 。 docker-compose.yml

version: "3.7"
services:
  mysql3:
    image: mysql:8.0
    container_name: mysql81
    restart: always
    privileged: true
    ports:
      - 3310:3306
    volumes:
      - ./mysql81:/var/lib/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    command:
      --default-time-zone="+8:00"
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --max_connections=1000
      --innodb_lock_wait_timeout=500

另一个换下端口和service即可。

启动两个mysql实例

配置复制

创建复制帐号

先查看下对应的ip地址.

docker exec -it mysql81 /bin/bash
cat /etc/hosts

查看IP地址

进入mysql创建 slave帐号

create user repl@'172.30.0.%' identified by 'Password4';

grant replication slave,replication client on *.* to repl@'172.30.0.%';

flush privileges;

两个实例都执行一下。

配置主库和备库

log_bin = mysql-bin
server_id = 10

通过docker-compose.yml 指定 my.cnf , docker-compose81.yml

...
volumes:
      - ./my81.cnf:/etc/my.cnf
      - ./mysql81:/var/lib/mysql

然后重新启动,检查下二进制日志文件是否已经创建

show master status

检查二进制日志文件是否启动

log_bin = mysql-bin
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1

实际上 relay_log log_slave_updates read_only并不是必须的,根据实际情况来进行选择。read_only`如果需要在备库上建表的话,这个就不需要了。

change master to master_host = '172.30.0.2',master_user = 'repl',master_password='Password4',master_log_file='mysql-bin.000001',master_log_pos=0;

检查是否正确执行,执行show slave status\G .

连接主库

start slave;

检查状态如下:

检查状态

做测试

... 悲催的是,做测试的时候发现是失败的,查看了slave 状态,竟然无法连接...

 Error connecting to source 'repl@172.30.0.2:3306'. This was attempt 4/86400, with a delay of 60 seconds between attempts. Message: Can't connect to MySQL server on '172.30.0.2:3306' (110)

原来是docker网络的问题.. 重启后IP会发生变化.. 这就尴尬了,重新设置下固定IP,然后重做配置,再测试。

docker network create --subnet=172.30.0.0/16 repl
version: "3.7"
services:
  mysql3:
    image: mysql:8.0
    container_name: mysql81
    restart: always
    privileged: true
    ports:
      - 3310:3306
    volumes:
      - ./my81.cnf:/etc/my.cnf
      - ./mysql81:/var/lib/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    command:
      --default-time-zone="+8:00"
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --max_connections=1000
      --innodb_lock_wait_timeout=500
    networks:
      repl2:
          ipv4_address: 172.30.0.2
networks:
  repl2:
    external:
      name: repl2

两个都指定后,重启查看IP没有变化。

再次尝试后还是报错...

Error connecting to source 'repl@172.30.0.2:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection

参考 https://blog.csdn.net/u010953609/article/details/130237868

最后还需要注意的问题是,表及数据要一致,

报错2

Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000002, end_log_pos 418. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if an

这个是更改了master_log_pos 后,与 master 的一致。

show master status

查看。

成功

成功后多次测试增加数据就会有如下,pos会发生变更,并且数据一致。

从一个已有的数据库开始复制

实际上有很多都是已经有正在运行的服务器了,因为业务或性能需要做备库。

mysqldump --single-transaction --all-databases --master-data=1--host=server1 | mysql --host=server2

转载请注明出处: https://chrunlee.cn/article/mysql-replication-single.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
上一章,我们学习和了解了websocket 是什么以及初始搭建,接下来,我们继续了解,如何进行广播以及对应的私聊呢。
通过registry 自建 dockerhub
本篇文章以一个实际的小项目为主题进行从头到尾的讲解实现,该项目总计开发时长约6小时,主要是有很多页面或功能都是现成的,直接复制过来的,剩下的就调整下样式、字段内容等。
mysql数据库插入double类型确没有小数点
昨天客户发现了个小BUG,文章发布使用的ueditor, 上传视频的时候当时好好的,后来怎么就是播放不了?
小程序需要用到用户的手机号码,看了下API 以及相关的demo,基本都是服务端进行解密的,问题是需要的参数并没有用到secret,只需要 session_key / iv /encryptedData 即可,那完全可以在客户端进行处理啊。
docker build 执行yum失败,找不到repo
最近有个小功能需要一些基础数据,找了一下在小程序上有发现,暂时还没找到他的网站,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到微信变更了加密方式,以前反编译的路子走不通了。