MySQL主从复制

原理

主服务器在执行写的操作后 ,会生成log dump线程 来生成binaryLog文件给从机

从机有两个线程,一个IO线程,一个SQL线程

IO 线程会主动请求大哥的日志文件 ,小弟的SQL线程会读取解析生成SQL逐一执行

注意

  1. 主机要开启binlog日志功能 ,通常为了数据安全考虑,从机也开启这个功能

  2. 从机开启IO线程 和SQL线程

  3. 尽量版本相同,要么主机的版本低于从机的

  4. 主从复制至少需要两个mysql服务

  5. 主机和从机需要时间同步

主从复制

1.一主一从

2.主主复制

3.一主多从

4.多主一从

5.联机复制

配置文件

【准备工作:所有机器安装好mysql就行了】

  1. 主(大哥的)机器

#配置vi /etc/my.cnf 复制下面放在文件最下面就行
###################################################
log-bin=master-bin #日志文件名 ,这个名字自己定义
binlog-format=ROW  #三种格式:row、statement、mixed,
#row  基于行的复制 把改变的内容复制过去,不是把命令执行一遍
#statement 基于语句的复制,效率较高
#mixed 一旦发现基于语句的无法精确的复制时,就采用基于行的复制,用的比较多
server-id=1 #要求各个服务器的id必须不一样
binlog-do-db=msb #同步的数据库名称
binlog-ignore-db=mysql #这个库过滤掉一般不用复制
expire_logs_days=7 #为避免占用磁盘,默认0不删除
#跳过复制中的错误,避免slave端复制中断
slave_skip_errors=1062 #指主键重复错误,1032错误是因为主从数据库不一致
##################################################
[root@dlb ~]# systemctl restart mysqld 重启服务  
#进入mysql 执行
mysql> show master status; #查看状态 ,看同步的数据库名称在不
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      156 | msb          |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 
####################################################
#给小弟配置下权限 进入mysql 这里可以省略,其实就是分配一个账号登录
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by 'Sony+168';
flush privileges;

 2.小弟从机的配置

##配置vi /etc/my.cnf 复制下面的
log-bin=master-bin #日志文件名 ,这个名字自己定义
binlog-format=ROW  #三种格式:row、statement、mixed,
server-id=2 #要求各个服务器的id必须不一样
binlog-ignore-db=mysql #这个库过滤掉一般不用复制
expire_logs_days=7 #为避免占用磁盘,默认0不删除
#跳过复制中的错误,避免slave端复制中断
slave_skip_errors=1062 #指主键重复错误,1032错误是因为主从数据库不一致
#配置中继日志,默认采用 主机名-relay-bin的方式保存
relay_log=liuchong-relay-bin
#从机将事件写进自己的日志
log_slave_updates=1
#防止改变数据(只读操作,除了特殊线程)
read_only=1
#####################################################
[root@iZbp1e0fmgc5gof1ly9cmlZ home]# vi /etc/my.cnf
[root@iZbp1e0fmgc5gof1ly9cmlZ home]# systemctl restart mysqld #重启服务 
[root@iZbp1e0fmgc5gof1ly9cmlZ home]# mysql -uroot -p
change master to MASTER_HOST='47.101.165.96',MASTER_USER='admin',MASTER_PASSWORD='Amanda+3213',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=156;
#################################以下为测试端口复制出来的
mysql> change master to MASTER_HOST='47.101.165.96',MASTER_USER='admin',MASTER_PASSWORD='Amanda+3213',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=156;
Query OK, 0 rows affected, 9 warnings (0.02 sec)

mysql> start slave;   #启动从机线程,此时已经能够建成一主一从
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status\G    #这里是查看信息!注意没有分号
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 47.101.165.96
                  Master_User: admin
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 156
               Relay_Log_File: iZbp1e0fmgc5gof1ly9cmlZ-relay-bin.000002
                Relay_Log_Pos: 325
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

主从复制完成

原文地址:https://www.cnblogs.com/9080dlb/p/15719453.html