当前位置:   article > 正文

mysql5.7主从复制、只读模式_mysql从库只读

mysql从库只读

1、主库操作

  1. 主库的my.cnf配置
  2. [client]
  3. default-character-set=utf8mb4
  4. [mysql]
  5. default-character-set=utf8mb4
  6. [mysqld]
  7. character-set-server=utf8mb4
  8. collation-server=utf8mb4_general_ci
  9. sql_mode=''
  10. server-id=100
  11. log-bin=mysql-bin
  12. # 只同步哪些数据库,除此之外,其他不同步
  13. binlog-do-db = db
  14. #同步的类型(推荐MIXED 经过验证这是目前最优选择)
  15. binlog_format=MIXED
  16. #创建同步数据用户
  17. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  18. GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  19. #修改密码语句(备用)
  20. ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  21. #主库设置为只读状态
  22. show global variables like "%read_only%";
  23. #给所有的表加读锁的命令
  24. flush tables with read lock;
  25. #设置为只读状态
  26. set global read_only=1;
  27. show global variables like "%read_only%";
  28. #查看主库状态
  29. show master status;
  30. +------------------+----------+--------------+------------------+-------------------+
  31. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  32. +------------------+----------+--------------+------------------+-------------------+
  33. | mysql-bin.001005 | 012 | db | | |
  34. +------------------+----------+--------------+------------------+-------------------+

2、从库操作

  1. #从库my.cnf
  2. [client]
  3. default-character-set=utf8mb4
  4. [mysql]
  5. default-character-set=utf8mb4
  6. [mysqld]
  7. character-set-server=utf8mb4
  8. collation-server=utf8mb4_general_ci
  9. sql_mode=''
  10. server-id=102
  11. #导出主库数据
  12. docker exec mysql mysqldump -h 172.17.xx.xx -P 3306 -uroot -p123456 --quick --events --flush-logs --max_allowed_packet=4194300 --net_buffer_length=16384 --single-transaction -R --triggers --databases db > db.sql
  13. #导入从库 mysql -u root -p之后 直接source导入(存放在docker logs映射文件中)
  14. source /logs/db.sql
  15. #配置主库关联 其中MASTER_LOG_FILE 和MASTER_LOG_POS 对应主库参数
  16. stop slave;
  17. reset slave;
  18. #复制主机的命令
  19. CHANGE MASTER TO MASTER_HOST='172.17.xx.xx',
  20. MASTER_USER='slave',
  21. MASTER_PASSWORD='123456',
  22. master_port=3306,
  23. MASTER_LOG_FILE='mysql-bin.000105',MASTER_LOG_POS=012;
  24. #给所有的表加读锁的命令
  25. flush tables with read lock;
  26. #设置为只读状态
  27. set global read_only=1;
  28. #启动从库复制功能
  29. start slave;
  30. show slave status \G;

3、主库解除锁定

  1. #主库解除只读状态
  2. unlock tables;
  3. set global read_only=0;

到这里就结束了,应用服务可以正常启动了 

命令解析

对于数据库读写状态,主要靠 “read_only”全局参数来设定;但设置 read_only=1 状态有两个需要注意的地方:
      1.read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过 show slave status\G 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致;
      2.read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作;在MySQL中设置read_only=1后,普通用户不能进行insert、update、delete等会产生数据变化的DML操作,但具有super权限的用户,例如root登录到数据库,还是可以进行数据变化的DML操作;为了确保所有用户,包括具有super权限的用户也不能进行读写操作,就需要执行给所有的表加读锁的命令 “flush tables with read lock;”


 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/514728
推荐阅读
相关标签
  

闽ICP备14008679号