mysql主从复制-简单模式

mysql主从复制-简单模式

月光魔力鸭

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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
BUG 报错Tainted canvases may not be exported 。 在通过canvas 调用 toDataURL的时候出现的问题。
上一章,我们学习和了解了websocket 是什么以及初始搭建,接下来,我们继续了解,如何进行广播以及对应的私聊呢。
与python后端进行联调,后端协议为jsonrpc ,这里简单记录下jsonrpc的通用请求函数,并附带几个栗子
最近有系统需要知道性能瓶颈,尝试使用jmeter对重要接口进行并发测试,确定能否支撑一定的用户数量。
在程序中,会有需要后台一直运行的场景。这一节我们来做一个监控某网站的运行状态,如果没有运行,则改变当前的图标。
昨天客户发现了个小BUG,文章发布使用的ueditor, 上传视频的时候当时好好的,后来怎么就是播放不了?
通过frp做穿透实现https 访问本地http项目。
登录方式现在非常多,不过像我这种小站让用户自己注册基本是不可能的了,只能依赖现有的第三方的登录来集成,之前有集成github,不过这个太过针对性,这里准备集成QQ互联登录,慢慢记录下。