Windows环境下部署MySQL主从并模拟升级到8.0

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

一、部署实例

1.下载2个软件

http://ftp.kaist.ac.kr/mysql/Downloads/MySQL-5.7/mysql-5.7.35-winx64.zip
http://ftp.kaist.ac.kr/mysql/Downloads/MySQL-8.0/mysql-8.0.26-winx64.zip

2.解压一下

file

3.初始化

  • 记录下密码
C:\Users\Administrator>D:\test\mysql-5.7.35-winx64\bin\mysqld --initialize --console
2022-01-20T03:37:59.769162Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2022-01-20T03:38:03.808644Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-01-20T03:38:03.901775Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-01-20T03:38:04.079914Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 5fd0428e-79a2-11ec-b336-00155d9ebf27.
2022-01-20T03:38:04.092275Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-01-20T03:38:05.824394Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-01-20T03:38:05.824844Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-01-20T03:38:05.826505Z 0 [Warning] CA certificate ca.pem is self signed.
2022-01-20T03:38:07.018691Z 1 [Note] A temporary password is generated for root@localhost: pE.Yu96:XQEp
  • 初始化数据如下图,默认是在安装程序的data目录下面

file

  • 把初始化的数据拷贝到自定义的数据目录。
  • 添加下my.ini配置
[mysqld]
port=3306
character_set_server=utf8
basedir=D:/test/mysql-5.7.35-winx64
datadir=D:/test/data3306
server-id=1
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
innodb_file_per_table = 1
log_timestamps=SYSTEM

log-error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 5
log-bin = binlog
binlog_format = row
expire_logs_days = 15
log_bin_trust_function_creators = 1

[client]   
default-character-set=utf8

4.安装服务

C:\Users\Administrator>D:\test\mysql-5.7.35-winx64\bin\mysqld --install mysql3306 --defaults-file=D:\test\data3306\my.ini
Service successfully installed.

5.开启

C:\Users\Administrator>net start mysql3306
mysql3306 服务正在启动 .
mysql3306 服务已经启动成功。

--------------------------------以上安装了一个3306,依葫芦画瓢再安装一个3307----------------------------------

D:\test\mysql-5.7.35-winx64\bin\mysqld --initialize --console
2022-01-20T05:38:55.054718Z 1 [Note] A temporary password is generated for root@localhost: E)+H2UUpeJRf
D:\test\mysql-5.7.35-winx64\bin\mysqld --install mysql3307 --defaults-file=D:\test\data3307\my.ini
mysql3307 服务正在启动 .
mysql3307 服务已经启动成功。
  • 查看服务信息

file

6.修改密码

C:\Users\Administrator>cd /d d:\test\mysql-5.7.35-winx64\bin
d:\test\mysql-5.7.35-winx64\bin>mysql -uroot -ppE.Yu96:XQEp
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35-log
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'GreatSQL';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

# 然后重新登陆一下
d:\test\mysql-5.7.35-winx64\bin>mysql -uroot -p"GreatSQL" -P3307

二、建立主从

1.主节点建表等

mysql> create table t1(id int(1) not null auto_increment , name varchar(64),primary key(id));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(1,'GreatSQL');
Query OK, 1 row affected (0.01 sec)

2.迁移数据

d:\test\mysql-5.7.35-winx64\bin>mysqldump.exe -uroot -pGreatSQL -P3306 --single-transaction --master_data=2 --set-gtid-purged=OFF --databases test > d:\test.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

d:\test\mysql-5.7.35-winx64\bin>mysql -uroot -pGreatSQL -P3307 < d:\test.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

3.主节点赋权

CREATE USER `sync`@`127.0.0.1` IDENTIFIED BY 'sync';
GRANT Replication Slave ON *.* TO `sync`@`127.0.0.1`;
flush privileges;

4.看下dump文件的pos值

d:\test\mysql-5.7.35-winx64\bin>more d:\test.sql
-- MySQL dump 10.13  Distrib 5.7.35, for Win64 (x86_64)
......
-- Current Database: `test`
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=1350;

5.从节点建立同步

change master to master_host="127.0.0.1",master_port=3306,MASTER_USER='sync',MASTER_PASSWORD='sync',MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=1350;
start slave; 

6.完成同步

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1959
               Relay_Log_File: YOS-DAAJTV9J5RF-relay-bin.000003
                Relay_Log_Pos: 926
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1959
              Relay_Log_Space: 1143
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 5fd0428e-79a2-11ec-b336-00155d9ebf27
             Master_Info_File: D:\test\data3307\master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

ERROR:
No query specified

三、升级8.0

1.署mysql8

d:\test\mysql-5.7.35-winx64\bin>D:\test\mysql-8.0.26-winx64\bin\mysqld --install
mysql8_3307 --defaults-file=D:\test\data3306\my.ini
Service successfully installed.

2.停掉原来的

d:\test\mysql-5.7.35-winx64\bin>net stop mysql3307
mysql3307 服务正在停止.
mysql3307 服务已成功停止。

3.修改下配置

[mysqld]
port=3307
character_set_server=utf8
basedir=D:/test/mysql-8.0.26-winx64  #路径改了
datadir=D:/test/data3307   
server-id=2
sql_mode=NO_ENGINE_SUBSTITUTION #sql_mode 改了
lower_case_table_names=1
innodb_file_per_table = 1
log_timestamps=SYSTEM

log-error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 5
log-bin = binlog
binlog_format = row
expire_logs_days = 15
log_bin_trust_function_creators = 1

[client]   
default-character-set=utf8

4.开启服务,会自动升级

net start mysql8_3307

5.查看日志升级成功了

2022-01-20T17:33:33.598491+08:00 2 [System] [MY-011003] [Server] Finished populating Data Dictionary tables with data.2022-01-20T17:33:37.652733+08:00 5 [System] [MY-013381] [Server] Server upgrade from '50700' to '80026' started.2022-01-20T17:33:53.602051+08:00 5 [System] [MY-013381] [Server] Server upgrade from '50700' to '80026' completed.

Enjoy GreatSQL :)

文章推荐:

GreatSQL季报(2021.12.26)
https://mp.weixin.qq.com/s/FZ_zSBHflwloHtZ38YJxbA

技术分享|sysbench 压测工具用法浅析
https://mp.weixin.qq.com/s/m16LwXWy9bFt0i99HjbRsw

故障分析 | linux 磁盘io利用率高,分析的正确姿势
https://mp.weixin.qq.com/s/7cu_36jfsjZp1EkVexkojw

技术分享|闪回在MySQL中的实现和改进
https://mp.weixin.qq.com/s/6jepwEE0DnYUpjMYO17VtQ

万答#20,索引下推如何进行数据过滤
https://mp.weixin.qq.com/s/pt6mr3Ge1ya2aa6WlrpIvQ

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili: https://space.bilibili.com/1363850082/video

微信&QQ群: 可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697 微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

<think>嗯,用户这次问的是MySQL主从同步假死的问题,结合之前提供的几个引用来看,确实都是围绕MySQL运维中的典型故障场景展开的。用户能明确提出“假死”这个现象,说明至少具备基础的数据库运维经验,可能是个中级DBA或者开发负责人。从引用来分析线索:引用1提到线上疑难杂症但没直接说内存问题;引用2详细描述了ProxySQL踢出假死主库的操作流程,这个非常关键;引用3指出MySQL读写分离的必要性问题;引用4则给出了MHA的故障处理流程。用户可能真正需要的是实战级的故障恢复方案,而非理论解释。主从假死确实是个棘手问题,常见诱因得拆开说。网络问题方面,云环境尤其容易出现瞬时丢包导致复制中断;MySQL内部原因要重点看三个点:内存不足导致复制线程崩溃、大事务阻塞复制线程、或者主从server_id冲突这种低级错误。另外用户没提版本信息,但5.6和8.0版本的复制机制差异较大需要针对性处理。解决方案需要分层设计:诊断层面最重要的是实时监控Seconds_Behind_Master状态和IO/SQL线程错误码;修复层面分为紧急操作(比如引用2里ProxySQL的HARD_OFFLINE操作)和根治措施。用户引用的MHA方案其实给出了完整的高可用架构思路,不过考虑到实施复杂度,应该先给即时可用的命令级解决方案。特别要注意的是,回复里必须警告数据一致性风险——直接resetslave虽然快,但可能造成数据错乱,这个坑很多新人会踩。最后补充的读写分离建议其实来自引用3的逻辑延伸,既解决根本问题又贴合用户提供的参考资料。关于后续问题设计,用户明显更关注实战而不是理论,所以重点延伸了状态诊断和工具集,比如pt工具链的使用场景。另外特意加了连接池配置的优化点,因为很多假死其实是应用端连接池耗尽导致的误判。</think> MySQL主从同步假死(即主从复制中断但进程未崩溃)是常见的高可用隐患。以下是常见原因及针对性解决方案,结合运维实践整理: --- ### **一、常见原因** 1. **网络问题** - 瞬时网络抖动(丢包率 > 1%) - 防火墙阻断了复制端口(默认3306) - DNS解析不稳定 2. **主库资源瓶颈** - 磁盘I/O满载(`iostat -xm 1` 显示 `%util > 90%`) - CPU持续高负载(`sysbench cpu run` 测试单核 > 80%) - 二进制日志(binlog)写入阻塞 3. **从库处理延迟** - 大事务未拆分(如单个事务更新100万行) - 长查询阻塞SQL线程(`SHOW PROCESSLIST` 观察 `State: Waiting for table metadata lock`) - 从库配置低于主库(如 `innodb_buffer_pool_size` 过小) 4. **数据一致性破坏** - 人为在从库写入数据(违反只读原则) - 主从不一致的 `server_id` 配置 - 非幂等操作(如 `INSERT IGNORE`)导致复制冲突 --- ### **二、诊断步骤** 1. **检查复制状态** ```sql SHOW SLAVE STATUS\G ``` **关键字段**: - `Slave_IO_Running`:网络/IO线程状态 - `Slave_SQL_Running`:SQL执行线程状态 - `Seconds_Behind_Master`:延迟时间(>60秒需告警) - `Last_IO_Error` / `Last_SQL_Error`:具体错误信息 2. **分析错误日志** ```bash grep "replication" /var/log/mysql/error.log ``` 常见错误类型: - `ER_MASTER_FATAL_ERROR_READING_BINLOG`(主库binlog异常) - `ER_KEY_NOT_FOUND`(从库数据缺失) --- ### **三、解决方案** #### **A. 网络问题** - **临时恢复**:重启复制线程 ```sql STOP SLAVE; START SLAVE; ``` - **根治方案**: - 主从部署专线(延迟 < 1ms) - 启用TCP Keepalive(`net.ipv4.tcp_keepalive_time=60`) #### **B. 主库性能瓶颈** 1. **优化binlog写入** ```ini [mysqld] sync_binlog = 0 # 牺牲部分安全性提升IO性能 binlog_group_commit_sync_delay = 1000 # 组提交延迟(毫秒) ``` 2. **拆分大事务** - 将 `UPDATE large_table SET ...` 改为分批更新(每批1000行) #### **C. 从库延迟** 1. **复制加速** ```ini [mysqld] slave_parallel_workers = 4 # 行线程数=CPU核心数 slave_preserve_commit_order = 1 # 保持事务顺序 ``` 2. **禁用非必要约束** ```sql SET GLOBAL foreign_key_checks=OFF; -- 需评估数据风险 ``` #### **D. 数据不一致** 1. **自动修复工具** ```bash pt-table-checksum # 校验主从数据差异 pt-table-sync --execute # 自动修复差异(生产环境模拟) ``` 2. **重建复制链路**(终极方案) ```bash mysqldump --single-transaction -uroot db | mysql -uSlave db ``` --- ### **四、预防措施** 1. **架构层面** - 部署MHA或Orchestrator实现主库故障自动切换(引用4)[^4] - 读写分离中间件(如ProxySQL)自动摘除异常节点(引用2)[^2] ```sql UPDATE mysql_servers SET status='HARD_OFFLINE' WHERE host='down_host'; LOAD MYSQL SERVERS TO RUNTIME; ``` 2. **监控体系** - 实时告警 `Seconds_Behind_Master > 30` - 定期检查 `SHOW SLAVE STATUS` 输出 > **关键建议**:当出现 `Last_SQL_Error: Could not execute Write_rows event` 等冲突时,**切勿直接跳过错误**(`SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1`),优先使用 `pt-table-sync` 修复数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值