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

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

一、主从复制简介:

1、mysql主从复制原理:

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

2. MySQL二进制复制类型

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

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

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

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

1)、每台mysql上都要有唯一的server_id,而且主服务器的id要比所有的从服务器的id要小。

2)、Master 可以有很多 Slave,但每个 Slave 只能有一个 Master

二、mysql主从复制实现

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

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

2、主库查看二进制:

先做一个全备份

# 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)

3、主库创建同步用户

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

4、主库上查看数据结点

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)

5、从库上面同步

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模式

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

mysql>  show slave status\G

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

Slave_IO_State: Waiting for master to send event

Master_Host: 10.200.6.51

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说明主从复制配置成功

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

1、 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的文件名,看看是否是你在连接的时候多加了个空格。

2、 Slave_SQL_Running为No

错误分析:一般是slave机器重起后,事务回滚造成的。

解决办法:

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

四、添加备份脚本

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

#!/bin/bash 
Mysqldump() {
mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /var/lib/mysql/`date +%F"-%H:%M"`.sql
 }
Mysql (){
mysqladmin -uroot -p123456  flush-logs
}
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 "  
  if [ $? -eq 0 ]; then
     echo "The port test has been written to the time task, and 00:00 will perform the task"
  else
     echo "0 0 1-5 * *  bash $0 Mysql " >> /etc/crontab
  fi
     
} crontab_ mysqladmin
##执行脚本后就基本实现了二进制+增备+全备

五、总结

以上就是我的实现过程,以及遇到问题的解决方法,也许你会认为很简单,但是但你配置到时候,总是会出现一些小问题,原因就是自己还不够小心严谨。所以以后要多注意才行。

原文地址:http://blog.51cto.com/xiaozhagn/2063693

时间: 2024-08-09 00:34:43

Mysql主从复制以及常见错误问题分析的相关文章

MySQL主从复制中常见的3个错误及填坑方案

一.问题描述 主从复制错误一直是MySQL DBA一直填不完的坑,如鲠在喉,也有人说mysql主从复制不稳定云云,其实MySQL复制比我们想象中要坚强得多,而绝大部分DBA却认为只要跳过错误继续复制就好啦,接下来不发生错误就好了,其实跳过错误就会有数据不一致的风险,数据不一致可能还会越来越严重,而我就复制错误中反复出现的1045.1032和1062错误引起的数据库主从不一致的的现象进行深入分析及给出一套完善的解决方案. (1) [ERROR]1452:无法在外键的表插入参考主键没有的数据 (2)

MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结

一.主从复制搭建方法参考 1.MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解请参考: http://blog.csdn.net/xlgen157387/article/details/51331244#comments 2.使用mysqlreplicate命令快速搭建 Mysql 主从复制: http://blog.csdn.net/xlgen157387/article/details/52452394 二.Mysql 主从复制的常用拓扑结构 2.1.一主一从 是最

(转)MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总

二.Mysql 主从复制的常用拓扑结构 2.1.一主一从 是最基础的复制结构,用来分担之前单台数据库服务器的压力,可以进行读写分离.<喎?"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMiBpZD0="22一主多从">2.2.一主多从 一台 Slave 承受不住读请求压力时,可以添加多台,进行负载均衡,分散读压力. 还可以对多台 Slave 进

mysql主从复制跳过错误

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续跳过错误有两种方式:1.跳过指定数量的事务:mysql>slave stop;mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1        #跳过一个事务mysql>slave start 2.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误vi /etc/my.cnf[mysqld]#slave

mysql主从复制跳过错误项

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续 1 跳过错误有两种方式: 1.1 跳过指定数量的事务: mysql>stop slave; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; #跳过一个事务 mysql>start slave; 1.2 修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误 vi /etc/my.cnf [mysql

Mysql 启动失败常见错误

各位可以按照顺序逐条拍错. mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql-master/data/mysql.pid) 的解决方法: 1.可能是/opt/mysql-master/data/数据目录mysql用户没有权限(修改数据目录的权限) 解决方法 :给予权限,执行  "chown -R mysql.mysql /opt/mysql-master/data&q

MySQL主从复制遇到的错误及解决方法

MySQL在主从复制的时候经常遇到错误而导致Slave复制中断,这个时候就需要人工干涉,来跳过这个错误,才能使Slave端的复制,得以继续进行: 错误示例: 直接跳过一个事物,从而恢复正常主从同步. 1 mysql> show slave status \G 2 *************************** 1. row *************************** 3 Slave_IO_State: Waiting for master to send event 4 Ma

MySQL Backup--Xtrabackup备份常见错误

1.DDL操作与Xtrabackup备份冲突 当MySQL使用xrabckup进行备份时,如果执行DDL进行表修改,会导致xrabckup备份失败. 错误类似于: InnoDB: Last flushed lsn: 3375345258517 load_index lsn 3379255303757 InnoDB: An optimized (without redo logging) DDLoperation has been performed. All modified pages may

mysql / mysqld_safe / mysqld 常见错误处理

1. FATAL ERROR: Could not find ./bin/my_print_defaults [root@localhost scripts]# ./mysql_install_db --user=mysql --datadir=/var/lib/mysql FATAL ERROR: Could not find ./bin/my_print_defaults If you compiled from source, you need to run 'make install'