概念
Mysql主从工作示意图:
实施
- 在每台服务器添加复制账号
- 配置主库和从库,配置二进制文件地址等。
- 同志备库连接连接到主库并启用复制
环境
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
创建复制账号
mysql主服务器为从库创建账户
#创建账户 为了方便,没有填从库具体域名,%任意
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 STATUS\G;
Slave_IO_Running Slave_SQL_Running Slave_IO_State 三列显示还未开始备库复制
开启复制:
START SLAVE;
再次 SHOW SLAVE STATUS\G; 查看 Slave_IO_Running Slave_SQL_Running Slave_IO_State 可看出IO线程、SQL线程已经开启;
查看线程列表:
SHOW PROCESSLIST\G;
*************************** 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是否存在