1.准备两台数据库环境,或者单台多实例环境,能正常启动和登录。

数据库的安装和多实例配置请参考https://www.cnblogs.com/qiuhom-1874/p/9757061.html

2.配置my.cnf文件

[root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3306/my.cnf
log-bin = /mysql_multi_case/3306/mysqld-bin
server-id = 1
[root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3307/my.cnf
log-bin = /mysql_multi_case/3307/mysqld-bin
log_slave_updates = 1
server-id = 2
[root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3308/my.cnf
#log-bin = /mysql_multi_case/3308/mysqld-bin
server-id = 3

主库配置log-bin和server-id参数,从库配置server-id,不能和主库相同以及其他从库相同,一般不开启log-bin功能。除非从库级联要开启log-bin,从库级联除了开启log-bin 还需要开启log-slave-updates = 1

注意:更改my.cnf配置,需要重启服务才生效。

3.登录主库增加用于从库连接主库同步的账号,例如rep,并授权replication slave同步权限。

mysql> grant replication slave on *.* to 'rep'@'10.0.0.39' identified by 'admin';
Query OK, 0 rows affected (0.00 sec) mysql> select user,host,password from mysql.user where user='rep';
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| rep | 10.0.0.39 | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec) mysql> show grants for rep@'10.0.0.39';
+------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@10.0.0.39 |
+------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'10.0.0.39' IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441' |
+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

  说明:有关mysql数据库创建用户和授权请参考:https://www.cnblogs.com/qiuhom-1874/p/9741166.html

4.登录主库,整库锁表flush table with read lock。(窗口关闭即失效,超时参数到了也失效),然后show master status;查看binlog日志文件名和位置状态。(mysql5.1 锁库是 flush tables with read lock多个s)

mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec) mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 | 653 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

  说明:锁表的目的是防止我们查看binlog日志文件和位置点时,数据还在往库里写。锁表能更好的,更准确的记录binlog日志文件和位置点。同时为备份做好了准备,锁表能准确的记录备份时binlog的文件和位置点。这里还是要说下binlog二进制日志文件,这个文件主要记录着对mysql数据库的数据有更新的操作的语句(增删改),千万记住查询它不记录,所以我们锁表的目的就在这里,防止我们在查看binlog日志文件和位置点时,写入数据导致我们找到文件和位置点和实际的不同。

5.新开窗口,Linux 命令行备份和导出原有的数据库数据

[root@qiuhom ~]# mysqldump -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -A --events > /work/bak/all.sql

  说明:有关mysql备份请参考:https://www.cnblogs.com/qiuhom-1874/p/9747219.html   这里要说下 --master-data=1 这个选项的主要作用是我们备份的时候在备份sql语句里记录binlog日志文件和位置点,这个选项有个很好的好处就是我们不用锁表就能准确的拿到备份是的binlog日志文件名和位置点,同时我们在做主从的时候从库不需要指定binlog日志文件和位置的,因为备份出来sql语句有告诉从库binlog日志和位置点。--master-data=2 这个和等于1的选项只有一个区别就是等于2是把binlog日志和位置点的语句给注释了的,等于1的是没有注释的,推荐备份使用这个选项。

如果数据量很大,我们建议申请停机备份时间,直接打包数据文件。

6.解锁主库,unlock tables;

mysql> unlock table;
Query OK, 0 rows affected (0.00 sec)

  提示:如果备份用--master-data选项锁表和解锁这两步都可以省略。

7.把主库导出的原有数据恢复到从库。

[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock </work/bak/all.sql

  提示:因为是全备  所有不需要指定库。

8.根具主库的show master status;查看binlog的位置状态,在从库执行change master to ...语句

CHANGE MASTER TO
MASTER_HOST='10.0.0.39',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='admin',
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=653;

  提示:如果全备是有给定选项--master-data=1 那么我们在从库可以不用写MASTER_LOG_FILE='mysqld-bin.000001',和MASTER_LOG_POS=653;这两参数。

9.从库开启同步开关,start slave;

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

10.从库检查同步状态,并在主库进行更新测试。show slave status\G;

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.39
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 653
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 647
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 653
Relay_Log_Space: 797
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 3
1 row in set (0.00 sec)

  提示:我们可以从返回的信息看到Slave_IO_Running: Yes和Slave_SQL_Running: Yes。io和sql线程已经启动了,说明主从已经配置好了。当然我们也可以看线程状况。

mysql> show processlist;
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
| 4 | system user | | NULL | Connect | 29932 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 2584 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 11 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)

  我们可以看到当前两个线程的状态。

mysql> show processlist;
+----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
| 5 | rep | 10.0.0.39:36750 | NULL | Binlog Dump | 30068 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 23 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

  在主库上看有个我们创建的用户连到主库上,也可看到当前io线程的状态。

接下来我们就可以在主库上测试创建库,看在从库上是否同步成功

[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "create database abcd;use abcd;create table test(id int);"
[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| abcd |
| mysql |
| performance_schema |
+--------------------+
[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| abcd |
| mysql |
| performance_schema |
+--------------------+
[root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "use abcd;show tables;"
+----------------+
| Tables_in_abcd |
+----------------+
| test |
+----------------+

  可以看出我们在主库上创建库表能及时的同步到从库上,说明主从复制是配置成功的。说下原理吧,主从复制首先它是异步处理的过程,怎么说呢,从上面我们查看线程list可以看出主库上有一个io线程,从库上有一个io线程和sql线程,首先从库会对master-info里的用户名和密码并向向主库发送连接同步认证,主库主进程收到认证消息,它就把这个任务直接转交给主库的io线程,认证成功后从库的io线程就会去读master-info里的记录的binlog文件名和对应的位置点发给主库的io线程,主库收到这个信息后就把对应的日志文件和位置点以下的内容发给从库的io线程,从库io线程收到数据后就把收到的数据写进中继日志文件relay-log,同时也会更新master-info里的binlog文件名和位置点,到此从库的io就不管了,它主要的作用就是把主库io线程发过来的binlog日志写进中继日志和更新master-info。接下来sql线程就来读中继日志relay-log里的内容,sql线程它会做两个事情,一是把读到的sql语句在本地执行并生成数据文件。第二件事就是他会把它执行的sql语句位置点记录到relay-info的文件,relay-info记录sql线程把binlog应用到本地数据库里的位置点,sql线程会不断的去读relay-info里记录的binlog文件名和位置点,并拿着这些信息去relay-log里找对应的位置的sql语句,并把这些sql语句执行生成数据文件。sql线程每读一次relay-log,它就会往relay-info里记录它读到什么位置,然后执行sql语句生成数据文件。

mysql主从复制的原理大概主要有以下几点:

1.异步方式同步。(slave端的io线程不会等sql线程把语句执行了后再向master端发送binlog位置点,slave端的io线程会不断的读master-info里的binlog文件名和位置点发送给master端,至于sql线程他们俩不是同步处理的)
2.逻辑同步模式。多种模式,默认是通过sql语句执行。
3.主库通过记录binlog实现对从库的同步。binlog记录数据库更新语句(增删改)。
4.主库1个线程,从库2个线程来完成的。(主io,从io,sql)
5.从库关键文件master.info(记录change master 信息) ,relay-log(中继日志,记录主库io线程发过来的binlog日志),relay-info(记录sql线程把binlog应用到本地数据库里的位置点)功能。
6.如果从库级联,需要打开log-bin和log-slave-updates选项

Linux下mysql的主从复制配置的更多相关文章

  1. Linux下MySQL安装和配置

    --Linux下MySQL安装和配置 ---------------------------2014/05/18 Linux下MySQL的配置和安装 本文的安装采用 rpm 包安装 1.首先在官网下载 ...

  2. Linux 下 mysql的基本配置

    Linux 下 mysql的基本配置 2013年02月27日 ⁄ MySQL ⁄ 共 3000字 ⁄ 暂无评论 ⁄ 被围观 2,483 views+ 1. Linux mysql安装:    $ yu ...

  3. Linux下MySQL安装及配置

    Linux下MySQL安装及配置 安装MySQL Ubuntu系统中,直接使用apt install的方式去安装MySQL的服务端和客户端,MySQL的客户端必须安装,否则无法通过命令连接并操作MyS ...

  4. Linux下Mysql的odbc配置

    在安装配置之前,需要先大概了解一下MyODBC的架构. MyODBC体系结构建立在5个组件上,如下图所示: Driver Manager: 负责管理应用程序和驱动程序间的通信,主要功能包括:解析DSN ...

  5. linux 下 mysql安装和配置

    最近在学习R语言,看到R与数据库交互这一部分,就自己动手实践了一下,数据库选择的是mysql,主要记录下linux下怎么安装mysql. 网上的很多资料都有相关的文章,这里只是记录下自己安装过程中遇到 ...

  6. (0.2)linux下Mysql的安装配置与管理入门(目录篇)

    本章学习内容: 1.基于Linux平台的Mysql项目场景介绍 1.1.互联网各类网站.购物网站.门户网站.博客系统.IDC,云平台,VPS,虚拟主机空间,论坛,嵌入式. 2.mysql数据库运行环境 ...

  7. Linux下MySQL主从同步配置

    Centos6.5 MySQL主从同步 MySQL版本5.6.25 主服务器:centos6.5 IP:192.168.1.101 从服务器:centos6.5 IP:192.168.1.102 一. ...

  8. Linux下MySQL远程链接配置

    配置步骤: 1).首先进入数据库,使用系统数据库mysql mysql -u root -p mysql 2).接着对系统数据库的root账户设置远程访问的密码,与本地的root访问密码并不冲突 gr ...

  9. linux 下mysql/php编译配置参数

    mysql cmake 编译参数 cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \-DSYSCONFDIR=/opt/mysql/etc \-DMYSQL_DATAD ...

随机推荐

  1. 数据存储检索之B+树和LSM-Tree

    作为一名应用系统开发人员,为什么要关注数据内部的存储和检索呢?首先,你不太可能从头开始实现一套自己的存储引擎,往往需要从众多现有的存储引擎中选择一个适合自己应用的存储引擎.因此,为了针对你特定的工作负 ...

  2. MYSQL事件隔离级别以及复读,幻读,脏读的理解

    一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2 ...

  3. django渲染高阶

    08.16自我总结 django渲染高阶 一.利用母版渲染 1.创建母版文件 如:stamper.html <!DOCTYPE html> <html lang="en&q ...

  4. Java学习笔记之Object常用方法

    Object:万类之祖   == : 比较的是是否是同一个对象,比较的是地址   equals: 是Object里面的方法,默认的是==,比较的是地址,但在String类型里重写为比较内容 一般我们在 ...

  5. PHP array_shift

    1.函数的作用:删除数组的头个元素并返回 2.函数的参数: @params array  &$array 3.需要注意的例子: <?php /** * http://php.net/ma ...

  6. 前端模块化(CommonJs,AMD和CMD)

    前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境 AMD 是 RequireJS 在推广过程中对模块定义的规范化产出. CMD 是 S ...

  7. [51nod1670] 打怪兽

    lyk在玩一个叫做“打怪兽”的游戏.游戏的规则是这样的.lyk一开始会有一个初始的能量值.每次遇到一个怪兽,若lyk的能量值>=怪兽的能量值,那么怪兽将会被打败,lyk的能量值增加1,否则lyk ...

  8. Https工作流程图

  9. 一文详解CentOS6.5搭建DNS服务

    本文详细介绍DNS服务在Linux Operation System 中的搭建过程 一.DNS服务器的工作原理 客户机提出域名解析请求,并将该请求发送给本地的域名服务器.当本地的域名服务器收到请求后, ...

  10. .NET Framework概述

    1.NET Framework是为其运行的应用程序提供各种服务的托管执行环境,它包括两个主要组件:(1).公共语言运行时 (CLR),(2)..NET Framework 类库: 2.NET Fram ...