docker Mysql主从配置

docker Mysql主从配置

  • 启动Master

准备配置文件mysqld.cnf

[mysqld]

#开启 binlog
log-bin=mysql-bin
# 当前server在cluster中的id,必须保证在cluster中唯一 
server-id=1
#只保留7天的二进制日志,以防磁盘被日志占满(可选) 
# expire-logs-days=7
#不备份的数据库 (可选) 
binlog-ignore-db=information_schema 
binlog-ignore-db=performation_schema 
binlog-ignore-db=sys
docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /etc/localtime:/etc/localtime \
-v /mnt/d/wslwork/mysql/master314/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /mnt/d/wslwork/mysql/master314/datas:/var/lib/mysql \
-p 3309:3306 \
--name mysql-master314 \
mysql:5.7.16 

docker logs mysql-master314 如果出现这种情况,就需要降低配置文件权限,否在会被忽略,那么bin-log是没有开启成功的.

mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
mysqld: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored.
那是因为权限太高了,文件被忽略了,
chmod 0444 my.cnf
chmod 0444 mysqld.cnf

创建用于同步bin-log的用户

CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%'; 
#刷新权限 
FLUSH PRIVILEGES;

SHOW MASTER STATUS;
  • 启动salve节点

准备配置文件mysqld.cnf

[mysqld]

server-id=2
relay_log=relay-log
#开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
read_only=ON

docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /etc/localtime:/etc/localtime \
-v /mnt/d/wslwork/mysql/salve314/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /mnt/d/wslwork/mysql/salve314/datas:/var/lib/mysql \
-p 3310:3306 \
--name mysql-salve314 \
mysql:5.7.16 

在salve节点中,加入到master中

CHANGE MASTER TO
MASTER_HOST='192.168.1.9',
master_port = 3309,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
# 根据SHOW MASTER STATUS;查看然后赋予对应的值
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=786;


# 启动slave同步(可以在连接工具中执行)
START SLAVE;

# 查看同步状态(不能在连接工具中执行)
SHOW SLAVE STATUS\G

验证是否成功,在master中创建一个数据库,可以看到同步到salve中,这就标识成功.

<think>我们需要配置MySQL从库为只读模式,这样即使有写操作尝试(比如创建表)也会被拒绝。有两种方法可以实现:1.设置全局系统变量`read_only`为ON(这不会影响具有SUPER权限的用户,比如root)2.设置系统变量`super_read_only`为ON(这会阻止所有用户,包括具有SUPER权限的用户进行写操作)通常,在复制环境中,我们同时设置这两个变量,以确保从库完全只读。步骤:a.修改MySQL配置文件(持久化配置)b.动态设置(立即生效,无需重启)注意:在Docker环境中,我们可以通过修改配置文件或者启动命令来设置,也可以通过进入容器动态设置。下面提供详细步骤和代码:</think>### 配置 MySQL 从库为只读模式 以下是完整的解决方案,确保 MySQL 从库只能执行读操作,禁止创建表或写入数据: #### 核心配置方法 ##### 1. 设置全局只读模式(推荐) ```sql -- 在从库执行 SET GLOBAL read_only = ON; SET GLOBAL super_read_only = ON; -- 阻止超级用户写入 ``` ##### 2. 修改 MySQL 配置文件(持久化配置) 编辑从库的 `my.cnf` 文件: ```ini # /etc/mysql/my.cnf [mysqld] read_only = 1 super_read_only = 1 ``` ##### 3. 验证只读状态 ```sql SHOW GLOBAL VARIABLES LIKE 'read_only'; SHOW GLOBAL VARIABLES LIKE 'super_read_only'; -- 两个值都应为 ON ``` #### Docker 环境配置 ##### Dockerfile 配置 ```dockerfile FROM mysql:8.0.35 # 复制配置文件 COPY my.cnf /etc/mysql/conf.d/read-only.cnf # 设置权限 RUN chown mysql:mysql /etc/mysql/conf.d/read-only.cnf ``` ##### docker-compose.yml 示例 ```yaml version: '3.8' services: mysql-slave: image: mysql:8.0.35 container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_MASTER_HOST: mysql-master MYSQL_MASTER_USER: slave MYSQL_MASTER_PASSWORD: slavepass volumes: - ./slave/data:/var/lib/mysql - ./config/read-only.cnf:/etc/mysql/conf.d/read-only.cnf command: - --server-id=2 - --relay-log=mysql-relay-bin - --read-only=1 - --super-read-only=1 ``` #### 权限控制(禁止特定用户写操作) ```sql -- 创建只读用户 CREATE USER 'app_readonly'@'%' IDENTIFIED BY 'readonly_pass'; GRANT SELECT, SHOW VIEW ON *.* TO 'app_readonly'@'%'; -- 限制复制用户权限(避免通过复制用户写操作) GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; REVOKE ALL PRIVILEGES ON *.* FROM 'slave'@'%'; ``` #### 只读模式验证脚本 ```bash #!/bin/bash # 测试普通用户写操作 mysql -u app_readonly -preadonly_pass -e "CREATE TABLE test.read_only_test (id INT);" 2>&1 | grep -i "read-only" # 测试root用户写操作 mysql -u root -prootpass -e "CREATE TABLE test.root_write_test (id INT);" 2>&1 | grep -i "read-only" # 检查错误日志 docker logs mysql-slave | grep -i "read-only" ``` #### 只读模式监控方案 ```sql -- 创建监控表 CREATE DATABASE IF NOT EXISTS monitor; USE monitor; CREATE TABLE read_only_checks ( id INT AUTO_INCREMENT PRIMARY KEY, check_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, read_only_status ENUM('OK', 'FAIL') NOT NULL, error_message VARCHAR(255) ); -- 创建事件定时检查 DELIMITER $$ CREATE EVENT check_read_only ON SCHEDULE EVERY 5 MINUTE DO BEGIN DECLARE v_read_only VARCHAR(3); DECLARE v_error VARCHAR(255); SET v_error = NULL; SELECT VARIABLE_VALUE INTO v_read_only FROM information_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'read_only'; IF v_read_only != 'ON' THEN SET v_error = CONCAT('Read-only is OFF: ', v_read_only); INSERT INTO read_only_checks (read_only_status, error_message) VALUES ('FAIL', v_error); ELSE INSERT INTO read_only_checks (read_only_status) VALUES ('OK'); END IF; END$$ DELIMITER ; ``` ### 常见问题解决方案 | 问题 | 解决方案 | |------|----------| | **复制用户需要写权限** | 使用 `REVOKE` 移除非必要权限 | | **应用程序误用 root 账户** | 创建专用只读应用账户 | | **临时需要写操作** | 临时禁用只读模式:`SET GLOBAL read_only=OFF;` | | **存储过程需要写权限** | 使用主库执行存储过程 | | **系统变量未持久化** | 确保配置文件包含 `read_only=1` | ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半山猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值