Mysql 主从数据库配置手记
Mysql 主从数据库配置
❝mysql数据库进行主从配置后,可以实现数据库的备份、同时应用也可以实现读写分离,提高应用的并发量。
❞
主从原理
主从原理的体现分为三个步骤
-
在主数据库上把数据更改记录到二进制日志中(Binary Log)中,这些记录称为二进制日志事件。 -
从数据库通过IO线程将主库上的日志复制到自己的中继日志(Relay Log)中。 -
从数据库通过SQL线程读取中继日志中的事件,将其重放到自己数据上。
过程图如下:
主从配置
❝这个步骤总是出一些问题,和你的配置环境以及版本都有关。
❞
环境配置
-
IP 和 主从库名称
名称 | ip |
---|---|
mysql-test(主库) | 39.104.67.142 |
some-mysql(从库) | 82.157.53.229 |
-
宿主机还是docker容器?
我选择的docker ,分别在两个服务器上新建了mysql的容器。
-
选用docker遇到的问题
-
进入容器更改root和slave为可远程访问。 slave是等到下边主数据库上创建给从服务器上访问的用户名
。
先进入mysql数据库中,用use mysql;命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'chaiyinlei';
下边的这个命令在下边配置中创建slave用户之后再运行。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'chaiyinlei';
-
修改主和从数据库的配置文件 再容器中的 /etc/mysql/my.cnf;
[mysqld]
#添加这个skip_ssl
skip_ssl
配置开始
配置主库
-
修改my.cnf文件,在[mysqld]加入下面的内容:
# 服务的唯一编号
server-id = 1
# 开启mysql binlog功能
log-bin = mysql-bin
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为test
binlog-do-db = test
-
修改好配置文件,重启mysql服务
docker restart mysql-test
-
创建从库同步数据的账号
CREATE USER 'slave'@'%' IDENTIFIED BY 'chaiyinlei';
grant all privileges on *.* to slave@'%';
grant REPLICATION SLAVE ON *.* TO slave@'%';
然后执行下边这个
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'chaiyinlei';
「注意」:上面这些命令是在mysql的终端执行的。
-
查看主库的状态
mysql的终端执行:
show master status\G;
返回和下边类似信息
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 2380
Binlog_Do_DB: test
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
配置从库
-
修改my.cnf文件,在[mysqld]加入下面的内容:
# 服务的唯一编号
server-id = 2
# 开启mysql binlog功能
log-bin = mysql-bin
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为test
replicate-do-db = test
-
修改好配置文件,重启mysql服务
docker restart some-mysql
-
执行同步命令
mysql的终端执行:
# 设置主服务器ip,同步账号密码,同步位置
change master to master_host='39.104.67.142',master_user='slave',master_password='chaiyinlei',master_logster_log_file='mysql-bin.000008',master_log_pos=156;
# 开启同步功能
start slave;
-
查看从库的状态
mysql的终端执行:
show slave status\G;
显示下边的内容
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 39.104.67.142
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 156
Relay_Log_File: b37a6c5d56d3-relay-bin.000002
Relay_Log_Pos: 325
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
其中下边的这两个为YES就配置成功了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试
-
主库上创建test库
create database test;
-
在主库上创建数据表
CREATE TABLE `person` (
`id` int NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
-
在person中插入一条记录
INSERT INTO `test`.`person` (`id`, `name`) VALUES (1, '12');
-
在从库上查看模式,即:
show schemas;
已经同步过去了