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. GUI篇 tkinter (Label,Button)之一

    import tkinterfrom tkinter import * # tkinter._test() # 实例化一个窗口对象base = tkinter.Tk()# 修改窗口的标题base.wm ...

  2. 易错、经典问题:return不可返回指向栈内存的指针

    预备知识:内存的分类 C/C++程序占用的内存分为两大类:静态存储区与动态存储区.其示意图如下所示: 数据保存在静态存储区与动态存储区的区别就是:静态存储区在编译-链接阶段已经确定了,程序运行过程中不 ...

  3. SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署.博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,不过静态文件还是存储 ...

  4. 小工具---将图片文件MultipartFile保存到指定目录

    import org.springframework.web.multipart.MultipartFile; import java.io.IOException; /** 保存图片 @author ...

  5. Java中package与import

    使用实例: package 一般来说,package语句必须作为源文件的第一条非注释性语句.一个java源文件只能指定一个包,即只能包含一条package语句,该源文件中可以定义多个类,则这些类将全部 ...

  6. HTML CSS整理笔记

    ——修改placeholder提示的样式: 1.除IE外通用写法 类名或标签名::placeholder {color: red;}2.加兼容前缀写法 css超出一行显示省略号:给定宽度(width: ...

  7. Vue优化:常见会导致内存泄漏问题及优化

    1. 监听在window/body等事件没有解绑2. 绑在EventBus的事件没有解绑3. 模块形成的闭包内部变量使用完后没有置成null4. 使用第三方库创建,没有调用正确的销毁函数5 . ech ...

  8. [.Net Core 3.0从入门到精通]1.笔记简介及.Net Core3.0介绍

    文章目的:.Net Core 3.0学习笔记整理与分享. 面向人群:有一定基础的C#开发人员或学习人员(C#语法一定要掌握). 笔者水平:中级C#开发攻城狮(水平有限,写的不对的地方希望大家指正). ...

  9. 回头看 vue-router

    回头看 vue-router 复习 我的github iSAM2016 目录 响应路由参数的变化 嵌套路由 函数式导航 路由的命名 示例:切换路由的时候可以修改页面的标题 导航钩子 全局钩子 实例:检 ...

  10. Kafka权威指南阅读笔记(第五章)

    Kafka Broker kafka 第一个启动的Broker在ZooKeeper中创建一个临时节点/controller,让自己成为控制器.其他Broker启动后在控制器节点上创建Watch对象,便 ...