Mysql主从复制以及常见错误问题分析

                                                 Mysql主从复制以及常见错误问题分析mysql

1、主从复制简介:sql


一、mysql主从复制原理:bash

    Mysql主从复制的实现,主要依赖于二进制日志来实现,过程主要是根据把主的MySQL 的数据复制到其它主机( Slave )上。在复制过程当中,能够理解为一台mysql服充当服务器,而其余的mysql服务器充当从服务器,而这种从服务器能够是一个或者是多个。在主从复制过程当中,mysql-master会将更新写入二进制日志,并维护文件的一个索引以跟踪日志循环。开启的二进制,mysql主服务器就会安装你配置的二进制文件名生成二进制文件,而这些日志主要是用来记录发送到从服务器的更新。当一个从服务器链接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置,从服务器接收从那时起发生的任何更新。mysql要作到主从复制,实际上是把事务都记录到二进制日志上,只须要从服务拿到这份日志,照着日志上面的动做施加到本身身上就能够了。这样就实现了主从复制。服务器


2. MySQL二进制复制类型  ide

     Mysql主从的复制能够有三种复制类型,分别是:语句的复制STATEMEN,行的复制ROW和混合类型的复制MIXED,语句的复制顾名思义就是在主服务器上执行的SQL语句,在从服务器上执行一样的语句,行的复制就是把改变的内容复制过去,而不是把命令在从服务器上执行一遍。默认采用基于语句的复制,一旦发现基于语句的没法精确的复制时,就会采用基于行的复制,配置,复制类型能够经过binlog_format =在配置文件上配置spa


3. mysql实现主从复制的目的rest

     Mysql配置主从复制的目的,是为了实现数据的备份,实现数据的高可用性和容错行日志

四、实现mysql复制要注意的细节orm

    1)、每台mysql上都要有惟一的server_id,并且主服务器的id要比全部的从服务器的id要小。server

    2)、Master 能够有不少 Slave,但每一个 Slave 只能有一个 Master


2、mysql主从复制实现


一、配置主从,开启二进制:

 1)Master配置:

 #Cat /etc/my.cnf

[mysqld]
 datadir=/var/lib/mysql
 log-bin=/var/lib/mysql/log-bin
 server-id = 1
 binlog_format = 'MIXED'


重启mysql服务:

#systemctl restart mysql


 2)Slave配置:

 #Cat /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
server-id = 3
skip-grant-tables
log_slave_updates = 1
read_only = 1

##skip-grant-tables、log_slave_updates和read_only是我额外添加的,能够不添加。只要陪配置server-id就能够了。

#重启slave服务器

#systemctl restart mysql

二、主库查看二进制:

先作一个全备份

# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > xiaozhang.sql

进入master查看是否启用了日志

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

三、主库建立同步用户

mysql> GRANT  ALL  ON *.* TO 'rsync'@'%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;

四、主库上查看数据结点

mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| log-bin.000007 |      120 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

五、从库上面同步

mysql>CHANGE MASTER TO MASTER_HOST='10.100.10.10',MASTER_USER='rsync',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000007',MASTER_LOG_POS=120;
mysql>start slave;  ##开启slave模式

六、查看是否实现同步成功

mysql>  show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.100.10.10

                  Master_User: rsync

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: log-bin.000007

          Read_Master_Log_Pos: 120

               Relay_Log_File: szthdb02-relay-bin.000002

                Relay_Log_Pos: 281

        Relay_Master_Log_File: log-bin.000007

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

##能够发现Slave_IO_Running,和Slave_SQL_Running已经都为yes说明主从复制配置成功


3、配置过程常见错误分析


一、 Slave_IO_Running为No

查看日志你会发现有这个错误

[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

错误分析:

出现这个问题必定是,你的MASTER_LOG_FILE的文件名不对。

解决方法:认真核对你的MASTER_LOG_FILE的文件名,看看是不是你在链接的时候多加了个空格。


二、 Slave_SQL_Running为No

错误分析:通常是slave机器重起后,事务回滚形成的。

解决办法:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;


4、添加备份脚本


脚本的的做用是周一到周五天天作一个增量备份,一个星期作一个全备

#!/bin/bash 
Mysqldump() {
mysqldump -uroot -p123456 --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /var/lib/mysql/`date +%F"-%H:%M"`.sql
 }$0
Mysql_log (){
mysqladmin -uroot -p123456  flush-logs
}$0
crontab_dump () {
  cat /etc/crontab | grep "bash $0 Mysqldump "  
  if [ $? -eq 0 ]; then
     echo "Task was writen, it will  perform the task at 00:00"
  else
     echo "0 0 * * 6  bash $0 Mysqldump " >> /etc/crontab
  fi
     
} crontab_dump
crontab_mysqladmin () {
  cat /etc/crontab | grep "bash $0 Mysql_log "  
  if [ $? -eq 0 ]; then
     echo "Task was writen, it will  perform the task at 00:00"
  else
     echo "0 0 * * 1-5   bash $0 Mysql_log " >> /etc/crontab
  fi     
} crontab_mysqladmin
##执行脚本后就基本实现了二进制+增备+全备

5、总结


   以上就是个人实现过程,以及遇到问题的解决方法,也许你会认为很简单,可是但你配置到时候,老是会出现一些小问题,缘由就是本身还不够当心严谨。因此之后要多注意才行。

相关文章
相关标签/搜索