docker mysql 无权限_mysql主从复制详解

概念

Mysql主从工作示意图:

5319a51fec2f553653154dc9490f9ed8.png

实施

  1. 在每台服务器添加复制账号
  2. 配置主库和从库,配置二进制文件地址等。
  3. 同志备库连接连接到主库并启用复制

环境

mysql版本8.0.5,使用docker模拟,docker-compose配置如下:

mysql_master:
      image:  mysql:latest
      ports:
        - "3306:3306"
# hostname 当前容器内可使用        
      hostname: msmaster
      volumes:
        - /data/conf/mysql/conf:/etc/mysql/conf.d
        - /data/conf/mysql/data:/var/lib/mysql
      environment:
            MYSQL_ROOT_PASSWORD: 123456
 mysql_slave:
      image:  mysql:latest
# links 当前容器与mysql_master建立连接,容器内/etc/hosts,可以查看到mysql_master的ip配置
      links:
         - mysql_master:mysql_master
      ports:
        - "3307:3306"
      hostname: msslave
      volumes:
        - /data/conf/mysql_slave/conf:/etc/mysql/conf.d
        - /data/conf/mysql_slave/data:/var/lib/mysql
      environment:
            MYSQL_ROOT_PASSWORD: 123456

创建复制账号

#创建账户 为了方便,没有填从库具体域名,%任意
CREATE USER 'repl'@'%' IDENTIFIED BY 'p4ssword';

#编码方式
alter user 'repl'@'%' IDENTIFIED with mysql_native_password  by 'p4ssword';

#分配权限 *.* 代表 库名.表名(*代表全部)
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'msslave';

mysql从服务器为主库创建账户

#创建账户
CREATE USER 'repl'@'mysql_master' IDENTIFIED BY 'p4ssword';

alter user 'repl'@'mysql_master' IDENTIFIED with mysql_native_password  by 'p4ssword';

#分配权限 *.* 代表 库名.表名(*代表全部)
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'msmaster';

从库配置账号的目的,为方便提供主从切换。

配置主库从库

配置文件下 /mysql/conf/ /mysql_slave/conf/

master

[mysqld]
log_bin      = mysql-bin
server_id    = 10  #设置server-id,必须唯一

slave

log_bin           = mysql-bin
server_id         = 2
# 中继日志的位置和命名
relay_log         = /var/lib/mysql/mysql-relay-bin
# 允许备库将其重放的事件也记录到自身二进制文件中
log_slave_updates = 1
# 阻止任何没有特权权限的线程修改数据
read_only         = 1

启动复制

CHANGE MASTER TO MASTER_HOST='mysql_master',
MASTER_USER='repl',
MASTER_PASSWORD='p4ssword',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;    #设置0,从日志开头读起

查看从库状态:
SHOW SLAVE STATUSG;

1821cf18241281961ee60e6248a78c0f.png

Slave_IO_Running Slave_SQL_Running Slave_IO_State 三列显示还未开始备库复制

开启复制:

START SLAVE;

再次 SHOW SLAVE STATUSG; 查看 Slave_IO_Running Slave_SQL_Running Slave_IO_State 可看出IO线程、SQL线程已经开启;

查看线程列表:

SHOW PROCESSLISTG;

*************************** 3. row ***************************
     Id: 9
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 328
  State: Connecting to master
   Info: NULL
*************************** 4. row ***************************
     Id: 10
   User: system user
   Host: 
     db: NULL
Command: Query
   Time: 328
  State: Slave has read all relay log; waiting for more updates
   Info: NULL

备库的IO线程和SQL线程状态;

切换到主库查看

*************************** 2. row ***************************
     Id: 7
   User: repl
   Host: 172.17.0.6:51074
     db: NULL
Command: Binlog Dump
   Time: 2978
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL

配置成功!

从另一个服务器开始复制

主从复制已经配置好,主库修改数据,从库拉去二进制文件发生错误: Last_SQL_Error: Error executing row event: 'Unknown database 'jump'',原因在复制之前主从数据库数据不一致。

需要初始化备库,或者从其他服务器克隆数据到备库。

(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;

(2)查看主数据库状态
mysql> show master status;

(3)记录下 FILE 及 Position 的值。
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。

(4)取消主数据库锁定
mysql> UNLOCK TABLES;

遇到问题

1) mysql8 root无grant权限,必须先建账户,再赋权限

CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

2) Last_IO_Error: error connecting to master 'repl@mysql_master:3306' - retry-time: 60 retries: 1


网络不通,检查hosts是否存在

以上内容希望帮助到大家,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文可以关注公众号:PHP开源社区,或者访问:

精华PHP技术文章整理合集——PHP框架篇

精华PHP技术文合集——微服务架构篇

精华PHP技术文合集——分布式架构篇

精华PHP技术文合集——高并发场景篇

精华PHP技术文章整理合集——数据库篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值