活动介绍
file-type

MySQL Master-Slave配置与常见问题解决

下载需积分: 13 | 2KB | 更新于2024-08-07 | 102 浏览量 | 0 下载量 举报 收藏
download 立即下载
"MySQL Master-Slave Replication指南" MySQL Master-Slave复制是一种常见的数据库复制技术,它允许一个主数据库服务器(Master)将更改同步到一个或多个从属数据库服务器(Slaves)。这项技术在提高数据冗余、负载均衡和故障恢复等方面具有重要意义。 Master配置步骤: 1. 首先,找到my.cnf配置文件,通常位于`/etc/mysql/my.cnf`。定位到[mysqld]部分。 2. 在[mysqld]下添加以下配置: - `server-id=1`: 为主服务器设置唯一的标识符,确保每个服务器的ID不同。 - `log-bin=master-bin`: 启用二进制日志记录,这是Master向Slave传输更改的基础。 3. 重启MySQL服务,然后登录到MySQL。 4. 创建一个用户,用于访问Master的日志文件: ```sql CREATE USER 'sree'@'%' IDENTIFIED BY 'sree'; ``` 5. 授予权限,让新用户可以复制所有库中的所有表: ```sql GRANT REPLICATION SLAVE ON *.* TO 'sree'@'%'; ``` 6. 刷新权限使更改生效: ```sql FLUSH PRIVILEGES; ``` 7. 检查主服务器的状态: ```sql SHOW MASTER STATUS; ``` 这将显示最新的binlog文件名和位置,如`master-bin.000004`,以及对应的偏移量120。 Slave配置步骤: 1. 修改slave配置文件,将`server-id`设置为与主服务器不同的值,比如2。 2. 登录到MySQL并执行以下命令,配置Slave指向Master: ```sql CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=120, MASTER_HOST='192.168.249.130', MASTER_USER='sree', MASTER_PASSWORD='sree'; ``` 3. 启动Slave: ```sql SHOW SLAVE STATUS\G; ``` 如果返回`Slave_IO_Running: Yes`和`Slave_SQL_Running: Yes`,表示连接成功并且复制正在运行。 常见问题及解决方法: - 错误1:主机IP错误 - 检查`MASTER_HOST`是否正确设置为主服务器的IP地址。 - 防火墙问题 - 在CentOS 7中,关闭firewalld以确保网络通信畅通:`systemctl stop firewalld`。 - 密码错误 - 确保用于连接的用户名和密码是正确的。 - MySQL UUID冲突 - 如果遇到"Master I/O线程停止,因为Master和Slave有相同的MySQL服务器UUID"错误,这可能是由于在克隆Master时未处理好。删除`auto.cnf`文件后重启服务可解决此问题。 通过以上步骤,您可以配置和管理MySQL的Master-Slave复制,但请根据实际情况调整配置,并注意保持网络连接的稳定性和安全。在实际部署中,可能还需要监控和调整复制性能以满足业务需求。

相关推荐

filetype
filetype
filetype
filetype

docker run -d --name mysql_slave \ > --net=mysql-net1 \ > -p 3307:3306 \ > -v /data/mysql_slave/log:/var/log/mysql \ > -v /data/mysql_slave/data:/var/lib/mysql \ > -v /data/mysql_slave/conf:/etc/mysql/conf.d \ > -e MYSQL_ROOT_PASSWORD=slavepassword \ > mysql:5.7 27236ea7a922162f053110c1108d96f7eb3058aef57609464545084ba41a8a92 [root@23121242-c2 ~]# cd cd /data/mysql_slave/conf -bash: cd: 参数太多 [root@23121242-c2 ~]# cd /data/mysql_slave/conf [root@23121242-c2 conf]# ls [root@23121242-c2 conf]# vi my.cnf [root@23121242-c2 conf]# docker restart mysql_slave mysql_slave [root@23121242-c2 conf]# docker exec -it mysql_slave mysql -uroot -pslavepassword mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) [root@23121242-c2 conf]# docker exec -it mysql_slave mysql -uroot -pslavepassword mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) [root@23121242-c2 conf]# [root@23121242-c2 conf]# [root@23121242-c2 conf]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 27236ea7a922 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 25 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp mysql_slave 562746f21263 mysql:5.7 "docker-entrypoint.s…" 35 minutes ago Up 23 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql_master 13b167b6cb3d nginx:alpine "/docker-entrypoint.…" 2 months ago Exited (255) 2 months ago 0.0.0.0:80->80/tcp, [::]:80->80/tcp web-deploy-nginx-1

filetype

2025-03-14T04:16:16.840338Z 2104 [ERROR] [MY-010584] [Repl] Replica SQL for channel '': Worker 1 failed executing transaction '03a14348-ffa8-11ef-91d7-7e26f3dacf54:382003' at source log mysql-bin.000022, end_log_pos 214644112; Could not execute Delete_rows event on table topology.elements; Can't find record in 'elements', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's source log mysql-bin.000022, end_log_pos 214644112, Error_code: MY-001032 2025-03-14T04:16:16.840416Z 2103 [Warning] [MY-010584] [Repl] Replica SQL for channel '': ... The replica coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: MY-001756 2025-03-14T04:16:17.513919Z 2124 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the connection metadata repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START REPLICA; see the 'START REPLICA Syntax' in the MySQL Manual for more information. 2025-03-14T04:16:17.525724Z 2124 [System] [MY-014001] [Repl] Replica receiver thread for channel '': connected to source '[email protected]:3306' with server_uuid=03a14348-ffa8-11ef-91d7-7e26f3dacf54, server_id=1. Starting replication from file 'mysql-bin.000022', position '215943569'.

filetype

## 阶段 0 环境确认(学生自己验证) 1. 确认能登录 MySQL ```bash mysql -uroot -p # 键入自己的密码 ``` 2. 确认 Discuz 库存在 ```sql SHOW DATABASES LIKE 'dz2%'; ``` ──────────────────── ## 阶段 1 删除索引(自己找表、自己删) 1. 列出所有索引 ```sql USE dz2_discuz; SHOW INDEX FROM pre_forum_post\G ``` 2. 手工删除你认为影响查询的 **3 个索引**(比如 tid、authorid、dateline)。 ```sql ALTER TABLE pre_forum_post DROP INDEX idx_xxx; ``` ──────────────────── ## 阶段 2 生成 50 万帖子(自选方法) 思路 A:纯 SQL 循环 ```sql -- 先准备一条模板 INSERT INTO pre_forum_post (tid, authorid, subject, message, dateline) VALUES (1, 1, 'test', 'content', UNIX_TIMESTAMP()); ``` 然后自己想循环脚本(shell `for`、Python、或存储过程)。 思路 B:自定义脚本 - 语言不限(bash / Python / Go …) - 必须最终执行 `mysql -u... < your_data.sql` 把行数刷到 **500000**。 检查行数 ```sql SELECT COUNT(*) FROM pre_forum_post; ``` ──────────────────── ## 阶段 3 无索引慢查询(自己设计、自己执行) 1. 打开慢日志 ```sql SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 0.2; ``` 2. 自己写 **3 条** 典型慢 SQL(示例供思路) - 按作者查最新 20 帖 - 统计某主题回复数 - 模糊搜索标题 3. 记录 **耗时** 和 **EXPLAIN rows** 截图。 ──────────────────── ## 阶段 4 加索引(自己决定加什么) 1. 观察阶段 3 的 `EXPLAIN`,自己设计 **复合索引**(如 `(authorid, dateline DESC)`)。 2. 执行 ```sql ALTER TABLE pre_forum_post ADD INDEX idx_xxx (...); ``` 3. 再次跑 **同一条 SQL** 记录耗时。 ──────────────────── ## 阶段 5 主从复制(自己搭) 步骤清单(仅提示,不复制粘贴) 1. 编辑 **主库** `/etc/mysql/my.cnf` → `server-id=1`, `log-bin=` 2. 编辑 **从库** 新文件 `/etc/mysql/my.cnf.slave` → `server-id=2`, `port=3307` 3. 主库授权复制账号 ```sql CREATE USER 'repl'@'%' IDENTIFIED BY '...'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` 4. 从库执行 `CHANGE MASTER TO ...` 并 `START SLAVE;` 5. 自己验证 ```sql SHOW SLAVE STATUS\G ``` ──────────────────── ## 阶段 6 读写分离(自己选型) 提示 3 种方案(任选其一) - **ProxySQL**(最推荐) - **Nginx upstream 按 SQL 拆分** - **应用层分库** 必须满足: - 读请求 → 从库 - 写请求 → 主库 - 用 `mysqlslap` 或浏览器压测,截图 QPS 提升。 ──────────────────── ## 阶段 7 容灾演练(自己删、自己救) 1. 手动删除一个业务表 ```sql DROP TABLE pre_forum_post; ``` 2. 自己找 **最近 binlog** 路径 ```bash mysqlbinlog --start-datetime="..." --stop-datetime="..." \ /var/lib/mysql/mysql-bin.0000xx > rollback.sql ``` 3. 自己执行 ```bash mysql -uroot -p'...' dz2_discuz < rollback.sql ``` 4. 自己验证行数恢复到 **50 万**

tech_dba
  • 粉丝: 0
上传资源 快速赚钱