主从复制原理

  1. 当 master 主服务器上的数据发生改变时,则将其改变写入二进制日志文件中
  2. salve 从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测,探测其是
    否发生过改变
  3. 如果探测到 master 主服务器的二进制日志发生了改变,则开始一个 I/O Thread 请求
    master 二进制日志
  4. 同时 master 主服务器为每个 I/O Thread 启动一个 dump Thread,用于向其发送二进制日
  5. slave 从服务器将接收到的二进制事件保存至自己本地的中继日志文件中
  6. salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据
    和主服务器保持一致
  7. 最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒;
    MySQL 主从复制原理图

 

mysql多源 归集到 一个库_mysql多源 归集到 一个库

多实例概述

  1. MySQL多实例是指安装MySQL之后,我们可以在一台Linux服务器上同时启动多个MySQL数据库(实例),不需要安装多个MySQL
  2. 如果是有多台Linux服务器,那么我们需要每台服务器都分别安装MySQL
  3. 在一台Linux服务器上启动多个MySQL数据库(实例),通过为各个数据库实例配置独立的配置文件来实现,即每个数据库实例有自己单独的配置文件

多实例配置

  1. 在MySQL安装主目录下创建/data/3307, /data/3308/两个目录
  2. 执行数据库初始化,在MySQL的/usr/local/mysql-5.7.18/bin目录下执行命令
1. ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3307 --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3308 --user=mysql
  1. 其中 initialize-insecure 表示不生成MySQL数据库root用户的随机密码,即root密码为空
  2. 在/data/3307, /data/3308/两个目录下分别创建一个my.cnf文件
  3. 配置两个MySQL数据库服务的my.cnf文件
1. [client]
port        = 3307
socket      = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8
 
[mysqld]
port    = 3307
socket  = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid
 
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
  1. 多数据库实例就搭建好了

多实例启动多实例启动

  1. 切换到/usr/local/mysql-5.7.18/bin目录下,使用 msyqld_safe 命令指定配置文件并启动MySQL服务
  2. ./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
    ./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &

启动后配置

  1. 登录进入mysql,在mysql-5.7.18/bin目录下执行命令
  2. ./mysql -uroot -p -S /usr/local/mysql-5.7.18/data/3307/mysql.sock
  3. 其中 -p 是指定密码,如果没有密码则可以不写 -p,-S是指定sock文件,mysql.sock文件是服务器与本机客户端进行通信的ip与端口文件
    或者使用用端口、主机登录 ./mysql -uroot -p -P3307 -h127.0.0.1 登录进入MySQL
  4. 修改mysql的密码,执行:
  5. alter user 'root'@'localhost' identified by '123456';
    (其中123456是我们设置的密码)
  6. 授权远程访问,执行命令:(这样远程客户端才能访问)
  7. grant all privileges on *.* to root@'%' identified by '123456';
  8. 其中*.* 的第一个*表示所有数据库名,第二个*表示所有的数据库表;
    root@'%' 中的root表示用户名,%表示ip地址,%也可以指定具体的ip地址,比如root@localhost,root@192.168.10.129
  9. 执行以下如下命令刷新权限:
  10. 执行以下如下命令刷新权限:
  11. Tip:修改密码,授权远程访问,刷新权限三行命令一起执行
    alter user 'root'@'localhost' identified by '123456';
    grant all privileges on *.* to root@'%' identified by '123456';
    flush privileges;

多实例关闭

  1. 切换到/usr/local/mysql-5.7.18/bin目录下,使用 mysqladmin 命令 shutdown
  2. 方式一: ./mysqladmin -uroot -p -S /usr/local/mysql-5.7.18/data/3307/mysql.sock shutdown
  3. 方式二:./mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown
  4. 方式三: 如果已经进入到了MySQL的命令行,可以直接执行 shutdown;
  5. 退出MySQL命令行,执行: exit

一主多从环境搭建,一主多从和一主一从只是从机器多配置了几个,其他都是一样的

mysql多源 归集到 一个库_服务器_02

环境配置

  1. 配置主从MySQL配置文件my.cnf
  2. 主(3307)里面加入
  3. log-bin=mysql-bin   #表示启用二进制日志
  4. server-id=3307        #表示server编号,编号要唯一,可以是数字1,2,3......,但是不能重复,一般用端口号表示
  5. 从(3308)里面加入
    server-id=3308        #表示server编号,编号要唯一
  6. *****************************************************************************
  7. 配置主服务器 3307 my.cnf
1. [client]
port        = 3307
socket      = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8
 
[mysqld]
port    = 3307
socket  = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid
 
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
 
### Master Slave ###
log-bin=mysql-bin
server-id=3307
  1. *****************************************************************************
  2. 配置从服务器 3308 my.cnf
1. [client]
port        = 3308
socket      = /usr/local/mysql-5.7.18/data/3308/mysql.sock
default-character-set=utf8
 
[mysqld]
port    = 3308
socket  = /usr/local/mysql-5.7.18/data/3308/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3308
log-error = /usr/local/mysql-5.7.18/data/3308/error.log
pid-file = /usr/local/mysql-5.7.18/data/3308/mysql.pid
 
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
 
### Master Slave ###
server-id=3308
  1. *****************************************************************************

服务启动

  1. 进入/usr/local/mysql-5.7.18/bin目录,重启两个MySQL服务,启动时指定配置文件启动:
1. ./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &

设置主从关系

  1. 在主服务器上创建复制数据的账号并授权:
  2. grant replication slave on *.* to 'copy'@'%' identified by '123456';
  3. 建议重置一下主服务状态,执行命令:reset master;
  4. 要不要重置,你可以查看一下master的状态
    show master status; 命令查看master的状态
  5. mysql多源 归集到 一个库_mysql多源 归集到 一个库_03

  6. 如果二进制日志文件的偏移量坐标不是154,建议重置一下master的状态
  7. mysql多源 归集到 一个库_服务器_04

  8. 在主服务器上执行命令,获取主服务器二进制binlog文件名及坐标(二进制文件名和坐标值在后面会用到)
show master status;
+------------------+----------+--------------+------------------+-------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 +------------------+----------+--------------+------------------+-------------------+
 | mysql-bin.000001 |      154 |              |                  |                   |
 +------------------+----------+--------------+------------------+-------------------+

  1. 在从服务器上执行命令,设置从服务器的master
  2. 建议重置一下slave的状态
    stop slave;
    reset slave;
    你可以先查看一下slave的状态
    show slave status;  命令查看slave的状态
    如果slave的状态是空的,那可以不用重置slave的状态,否则就需要重置一下
  3. mysql多源 归集到 一个库_服务器_05

  4. 在从服务器上执行,很核心的一步,设置主从关系
    change master to master_host='master的ip',master_user='copy',
    master_port=3307,master_password='123456',
    master_log_file='mysql-bin.000001',master_log_pos=154;
  5. 在从机器上执行开始复制命令
    start slave;

主从验证

  1. 检查从服务器复制功能状态
  2. mysql> show slave status;
  3. mysql多源 归集到 一个库_mysql_06

  4. Slave_IO_Running和Slave_SQL_Running为YES,就是正常状态。
  5. mysql多源 归集到 一个库_mysql_07

  6. 在主服务器上创建数据库、表、数据,然后在从服务器上查看是否已经复制
  7. 以上操作过程显示正常,则主从服务器配置完成;
  8. 查看主从复制binlog日志文件内容:show binlog events in 'mysql-bin.000001';
  9. 配置完成