mysql主从复制-简单模式

mysql主从复制-简单模式

月光魔力鸭

2023-11-11 14:53 阅读 210 喜欢 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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
最近有个小功能需要一些基础数据,找了一下在小程序上有发现,暂时还没找到他的网站,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到微信变更了加密方式,以前反编译的路子走不通了。
上一张中已经完成了比较简易的3D全景浏览,但是...这是写死在xml中的,对于我们实际的项目,这种情况是不可能适应的。所以,来了解下如何动态加载xml已经设置对应的热点。
最近一段时间想着做个资源网站,奈何没数据,准备从几个相关的站点上抓一些数据,数据量每个站点都在几千万左右,这里简单总结下最近一段时间在做的测试。
最近一直琢磨着做一个第三方统一登录的这么一个小东西,虽然网上其实也挺多的.. 不过造轮子的感觉还是很爽的。 QQ /Github 比较简单,申请下就OK 了.. 微信真不是个东西,得花钱。
功能来源于客户需求。客户有需求想把班级内所有学生的错题本生成pdf文档下载下来... 目前没有做这个功能,只有页面,还好chrome浏览器有保存pdf的功能,但是一想到这么多的学生,这么多的学科、以及这么多的参数... 还好有puppeteer
简单记录下dockerfile 以及compose配置
mysql数据库插入double类型确没有小数点
接下来,我们综合上面的配置,再加一个选项页面配置,做一个天气预报的小栗子。