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

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

2.配置my.cnf文件

  1. [root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3306/my.cnf
  2. log-bin = /mysql_multi_case/3306/mysqld-bin
  3. server-id = 1
  4. [root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3307/my.cnf
  5. log-bin = /mysql_multi_case/3307/mysqld-bin
  6. log_slave_updates = 1
  7. server-id = 2
  8. [root@qiuhom 3306]# egrep "log-bin|log_slave_update|server-id" ../3308/my.cnf
  9. #log-bin = /mysql_multi_case/3308/mysqld-bin
  10. 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同步权限。

  1. mysql> grant replication slave on *.* to 'rep'@'10.0.0.39' identified by 'admin';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> select user,host,password from mysql.user where user='rep';
  5. +------+-----------+-------------------------------------------+
  6. | user | host | password |
  7. +------+-----------+-------------------------------------------+
  8. | rep | 10.0.0.39 | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
  9. +------+-----------+-------------------------------------------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> show grants for rep@'10.0.0.39';
  13. +------------------------------------------------------------------------------------------------------------------------+
  14. | Grants for rep@10.0.0.39 |
  15. +------------------------------------------------------------------------------------------------------------------------+
  16. | GRANT REPLICATION SLAVE ON *.* TO 'rep'@'10.0.0.39' IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441' |
  17. +------------------------------------------------------------------------------------------------------------------------+
  18. 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)

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

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

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

  1. [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;

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

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

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

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

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

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

  1. CHANGE MASTER TO
  2. MASTER_HOST='10.0.0.39',
  3. MASTER_PORT=3306,
  4. MASTER_USER='rep',
  5. MASTER_PASSWORD='admin',
  6. MASTER_LOG_FILE='mysqld-bin.000001',
  7. MASTER_LOG_POS=653;

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

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

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

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

  1. mysql> show slave status\G;
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: 10.0.0.39
  5. Master_User: rep
  6. Master_Port: 3306
  7. Connect_Retry: 60
  8. Master_Log_File: mysqld-bin.000001
  9. Read_Master_Log_Pos: 653
  10. Relay_Log_File: relay-bin.000002
  11. Relay_Log_Pos: 647
  12. Relay_Master_Log_File: mysqld-bin.000001
  13. Slave_IO_Running: Yes
  14. Slave_SQL_Running: Yes
  15. Replicate_Do_DB:
  16. Replicate_Ignore_DB: mysql
  17. Replicate_Do_Table:
  18. Replicate_Ignore_Table:
  19. Replicate_Wild_Do_Table:
  20. Replicate_Wild_Ignore_Table:
  21. Last_Errno: 0
  22. Last_Error:
  23. Skip_Counter: 0
  24. Exec_Master_Log_Pos: 653
  25. Relay_Log_Space: 797
  26. Until_Condition: None
  27. Until_Log_File:
  28. Until_Log_Pos: 0
  29. Master_SSL_Allowed: No
  30. Master_SSL_CA_File:
  31. Master_SSL_CA_Path:
  32. Master_SSL_Cert:
  33. Master_SSL_Cipher:
  34. Master_SSL_Key:
  35. Seconds_Behind_Master: 0
  36. Master_SSL_Verify_Server_Cert: No
  37. Last_IO_Errno: 0
  38. Last_IO_Error:
  39. Last_SQL_Errno: 0
  40. Last_SQL_Error:
  41. Replicate_Ignore_Server_Ids:
  42. Master_Server_Id: 3
  43. 1 row in set (0.00 sec)

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

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

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

  1. mysql> show processlist;
  2. +----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
  3. | Id | User | Host | db | Command | Time | State | Info |
  4. +----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
  5. | 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 |
  6. | 23 | root | localhost | NULL | Query | 0 | NULL | show processlist |
  7. +----+----------+-----------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+
  8. 2 rows in set (0.00 sec)

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

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

  1. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "show databases;"
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | mysql |
  7. | performance_schema |
  8. +--------------------+
  9. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "show databases;"
  10. +--------------------+
  11. | Database |
  12. +--------------------+
  13. | information_schema |
  14. | mysql |
  15. | performance_schema |
  16. +--------------------+
  17. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "create database abcd;use abcd;create table test(id int);"
  18. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3306/mysql.sock -e "show databases;"
  19. +--------------------+
  20. | Database |
  21. +--------------------+
  22. | information_schema |
  23. | abcd |
  24. | mysql |
  25. | performance_schema |
  26. +--------------------+
  27. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "show databases;"
  28. +--------------------+
  29. | Database |
  30. +--------------------+
  31. | information_schema |
  32. | abcd |
  33. | mysql |
  34. | performance_schema |
  35. +--------------------+
  36. [root@qiuhom ~]# mysql -uroot -padmin -S /mysql_multi_case/3307/mysql.sock -e "use abcd;show tables;"
  37. +----------------+
  38. | Tables_in_abcd |
  39. +----------------+
  40. | test |
  41. +----------------+

  可以看出我们在主库上创建库表能及时的同步到从库上,说明主从复制是配置成功的。说下原理吧,主从复制首先它是异步处理的过程,怎么说呢,从上面我们查看线程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. Springboot 系列(十四)迅速启用 HTTPS 加密你的网站

    1. 获取 HTTPS 证书 正常情况下 HTTPS 证书需要从证书授权中心获得,这样获得的证书才具有公信力,也会被各种浏览器客户端所认可.常见的证书品牌如 Symantec,GeoTrustm,Tr ...

  2. 攻防世界(XCTF)WEB(进阶区)write up(四)

    ics-07  Web_php_include  Zhuanxv Web_python_template_injection ics-07 题前半部分是php弱类型 这段说当传入的id值浮点值不能为1 ...

  3. Cobalt Strike之信息收集、木马钓鱼

    System Profiler使用 System Profiler 模块,搜集目标的各类机器信息(操作系统版本,浏览器版本等) Attacks->web drive-by->System ...

  4. Kubernetes1-K8s的简单介绍

    一.简介 1.什么是Kubernetes 简称K8s,用8代替8个字符“ubernerte”而成的速写,K8s是一个开源的容器编排平台,它是一个跨主机集群的开源容器调度平台,用于管理云平台中多个主机上 ...

  5. vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)

    _ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...

  6. PHP spl_autoload和class_exsits使用技能

    本文章的PHP使用版本:5.4.7 PHP建议使用: spl_autoload_register 那么写了一种实现 文件路径 core core.php ChildrenClass.php Paren ...

  7. 基于 HTML5 + Canvas 实现的 PID 可视化系统

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...

  8. Java多线程编程(七)线程状态、线程组与异常处理

    一.线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 调用与线程有关的方法后,会进入不同的线程状态,这些状态之间某些是可双向切换的,比如WAITING和RUNNI ...

  9. 替换dom操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 条件渲染vue

    v-if:只渲染一次的情况下,性能更好v-show:频繁切换性能更好 vue虚拟DOM技术 浏览器:渲染引擎(慢)+JS引擎(快) 用1个JS对象来充当DOM对象,因为JS对象性能比较快,所以用虚拟D ...