vlambda博客
学习文章列表

Mysql 主从数据库配置手记

Mysql 主从数据库配置

mysql数据库进行主从配置后,可以实现数据库的备份、同时应用也可以实现读写分离,提高应用的并发量。

主从原理

主从原理的体现分为三个步骤

  1. 在主数据库上把数据更改记录到二进制日志中(Binary Log)中,这些记录称为二进制日志事件。
  2. 从数据库通过IO线程将主库上的日志复制到自己的中继日志(Relay Log)中。
  3. 从数据库通过SQL线程读取中继日志中的事件,将其重放到自己数据上。

过程图如下:

主从配置

这个步骤总是出一些问题,和你的配置环境以及版本都有关。

环境配置

  1. IP 和 主从库名称
名称 ip
mysql-test(主库) 39.104.67.142
some-mysql(从库) 82.157.53.229
  1. 宿主机还是docker容器?

我选择的docker ,分别在两个服务器上新建了mysql的容器。

  1. 选用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

配置开始

配置主库

  1. 修改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

  1. 修改好配置文件,重启mysql服务

docker restart mysql-test

  1. 创建从库同步数据的账号
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的终端执行的。

  1. 查看主库的状态

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)

配置从库

  1. 修改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

  1. 修改好配置文件,重启mysql服务

docker restart some-mysql

  1. 执行同步命令

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;
  1. 查看从库的状态

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

测试

  1. 主库上创建test库
create database test;
  1. 在主库上创建数据表
CREATE TABLE `person` (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
  1. 在person中插入一条记录
INSERT INTO `test`.`person` (`id`, `name`) VALUES (1, '12');
  1. 在从库上查看模式,即:
show schemas;
已经同步过去了