MySQL之主从复制

Posted 李凯的编程历程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之主从复制相关的知识,希望对你有一定的参考价值。

 |  复制的原理

slave会从master读取binlog来进行数据同步


|  三步骤

1、master将改变记录到二进制日志(binary log),这个记录过程叫做二进制日志事件(binary log events);

2、slave将master的binarylog events 拷贝到它的中继日志(relay log);

3、slave重做中继日志的事件,将改变应用到自己的数据库中;

 

|  复制的基本原则

1、每个slave只有一个master

2、每个slave只能有一个唯一的服务器ID

3、每个master可以有多个slave

 

|  一主一从的配置

主机修改my.ini配置文件:
1、主服务器ID:server-id=1

2、启用二进制日志:log-bin=自己本地的路径/data/mysqlbin

3、设置不要复制的数据库:binlog-ignore-db=mysql

4、设置需要复制的数据库:binlog-do-db=需要复制的主数据库名字

5、设置logbin格式:binlog_format=STATEMENT(默认)


从机配置文件修改my.cnf的[mysqld]:

1、从机服务器ID:server-id = 2

2、relay-log=mysql-relay

3、启用二进制日志:log-bin=mysql-bin

4、设置logbin格式:binlog_format=STATEMENT(默认)


在Windows主机上建立帐户并授权slave:

1、GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'从机器数据库IP'IDENTIFIED BY '123456';

2、查询master的状态:show masterstatus;

3、执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化


在Linux从机上配置需要复制的主机:

1、CHANGE MASTER TO MASTER_HOST='主机IP',MASTER_USER='zhangsan',MASTER_PASSWORD='123456',MASTER_LOG_FILE='File名字',MASTER_LOG_POS=Position数字;

2、启动从服务器复制功能:start slave;

3、show slave status\G:

下面两个参数都是Yes,则说明主从配置成功!

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

4、如何停止从服务复制功能

stop slave;

5、如何重新配置主从

reset master;

 

|  实践

| 环境

 mysql 5.7

Linux(3.10.0-1160.15.2.el7.x86_64)

docker

192.168.43.62(从)、192.168.43.51(主)


|  主服务器的配置


分别在主从服务器上创建test数据库

mysql> create database test;


配置my.cnf

[mysqld] log-bin=mysq1-bin #日志文件名称binlog-format=ROW  # 二进制日志的格式,有row、statement和mixed三种类型server-id=1  # 要求各服务器的这个id必须不一样binlog-do-db=test  # 同步的数据库名称


授权

mysql> grant replication slave on *.* to 'root'@'从服务器ID'identified by '密码';Query OK, 0 rows affected, 1 warning (0.00 sec)


刷新

mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)


|  从服务器的配置

 配置my.cnf

[mysqld]log-bin=mysql-bin #日志文件名称binlog-format=ROW # 二进制日志的格式server-id=2 


配置完从服务器后重启主服务器

[root@localhost ~]# docker restart mysql03mysql> show master status;


查看主服务器状态

mysql> show master status;

MySQL之主从复制


 重启从服务器

// 重启[root@localhost ~]# docker restart mysql01
// 配置读取位置// tomaster_host:主服务器IP// master_user:主服务器用户名// master_password:密码// master_port:端口号// master_log_file:对应上面 show master status 的 File 字段// master_log_pos:对应上面 show master status 的 Position 字段mysql> change master tomaster_host='192.168.43.51',master_user='root',master_password='root0831',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=154;
//开启复制mysql> start slave;Query OK, 0 rows affected (0.01 sec)


查看状态

mysql> show slave status \G;当下面两个参数为Yes是则表明主从复制配置是成功的。

MySQL之主从复制

 

|  测试

在主服务器创建user表并插入两行数据

MySQL之主从复制


查看从服务器的test数据库

MySQL之主从复制

可以看出从服务器已经成功复制到了我们在主服务器创建的表以及添加的数据。


停止复制

mysql> stop slave;Query OK, 0 rows affected (0.05 sec)
// 重新配置reset master;


|  遇到的问题

root@1c8da890b2b7:/# vim /etc/mysql/my.cnfbash: vim: command not found

原因:vim没有安装

解决方法:

第一步

root@93b94cd1142b:/# apt-get install vim

     

执行后一般会出现

root@93b94cd1142b:/# apt-get install vimReading package lists... DoneBuilding dependency tree      Reading state information... DoneE: Unable to locate package vim


继续执行

root@93b94cd1142b:/# apt-get update


最后执行

root@93b94cd1142b:/# apt-get install vim


|  拓展

MySQL binlog的三种格式:

1、Statement:每一条会修改数据的sql都会记录在binlog中。

优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)

缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).


2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。


3.Mixedlevel: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。


END



有问题请联系小凯
微信ID:j2020723

以上是关于MySQL之主从复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库在线热备(主从复制之AB复制)

MySQL数据库在线热备(主从复制之AB复制)

MySQL之主从复制

Mysql之取消主从复制

mysql数据库之——主从复制读写分离的实验操作

160525高并发之mysql主从复制(linux)