MySQL主从复制、搭建、状态检查、中断排查及备库重做 实战手册
MySQL主从复制配置与管理教程

MySQL主从复制配置与管理教程MySQL主从复制是一种常见的数据库复制技术,它可以实现将一个MySQL服务器数据复制到其他多个MySQL服务器的功能。
在实际应用中,主从复制广泛用于分布式数据库架构、数据备份和读写分离等场景。
本文将详细介绍MySQL主从复制的配置和管理教程,帮助读者快速掌握相关知识。
一、概述MySQL主从复制是指将一个MySQL数据库服务器作为主服务器,其他MySQL服务器作为从服务器,并通过二进制日志来同步主服务器的数据更新操作到从服务器上。
主从复制的目的是实现数据的冗余备份、提高数据库的读性能以及实现高可用性。
二、环境准备在开始配置MySQL主从复制之前,我们需要确保满足以下条件:1. 在主服务器和从服务器上都已经安装了MySQL数据库软件,并且版本一致。
2. 主服务器和从服务器之间可以互相访问,并且网络连接可靠稳定。
3. 确保主服务器和从服务器的配置文件中都正确设置了主机名、IP地址和端口号等信息。
4. 主服务器上已经有需要复制的数据库,并且该数据库已经开启了二进制日志功能。
三、主从复制的基本原理MySQL主从复制的实现依赖于MySQL的二进制日志(Binary Log)和复制线程(Replication Thread)。
当在主服务器上执行一条更新操作时,会将该操作记录到主服务器的二进制日志中。
从服务器连接到主服务器,并通过复制线程将主服务器的二进制日志同步到从服务器上执行,从而实现主从数据的一致性。
四、主服务器配置1. 配置主服务器的f文件,开启二进制日志功能:在f文件中找到[mysqld]部分,在其中添加以下配置:```log-bin=mysql-binbinlog-format=ROWserver-id=1```其中,log-bin=mysql-bin表示指定二进制日志的命名前缀;binlog-format=ROW表示选择以行格式记录二进制日志;server-id=1表示主服务器的唯一标识符。
MySQL主从复制的配置和管理指南

MySQL主从复制的配置和管理指南引言MySQL是一种颇为流行的关系型数据库管理系统,广泛应用于互联网开发和企业信息化系统中。
在应用中,数据库的高可用性和读写分离是非常关键的。
而MySQL主从复制(Master-Slave Replication)则是一种常用的实现方式,通过配置和管理主从复制,可以提高数据库的可用性、负载均衡和故障恢复能力。
一、MySQL主从复制的基本原理MySQL主从复制是一种异步事件复制机制,通过将主数据库上的数据变更以事件的形式复制到从数据库上,并实时保持主从数据库之间的数据一致性。
主从复制的基本原理可以分为以下几个步骤:1. 主数据库上的Binlog日志:MySQL主数据库会将写入操作记录到二进制日志(Binlog)中,包括插入、更新和删除等操作。
2. 从数据库的IO线程:从数据库上的IO线程连接到主数据库,定期读取主数据库的Binlog日志,并将读取到的日志复制到从数据库的Relay Log中。
3. 从数据库的SQL线程:从数据库上的SQL线程负责执行Relay Log中的事件,即将主数据库上的操作在从数据库上重新执行一遍,以实现数据的复制。
4. 从数据库的复制状态:从数据库会维护一个复制状态,记录从数据库当前复制到的Binlog文件和位置,以确保数据的一致性。
二、MySQL主从复制的配置步骤配置和管理MySQL主从复制,一般需要以下几个关键步骤:1. 确认主数据库的配置:确保主数据库正确配置了Binlog日志功能,并且开启了二进制日志(log-bin)和唯一服务器ID(server-id)。
2. 配置从数据库的参数:在从数据库上设置唯一的服务器ID,并配置relay log 的位置和文件名格式等参数。
3. 设置主从数据库的连接权限:在主数据库上创建一个用于复制的用户,并为其赋予复制权限。
4. 启动从数据库的IO线程和SQL线程:在从数据库上启动IO线程和SQL线程,使其可以连接到主数据库,并实时复制数据。
MySQL怎么设置主从复制_MySQL主从复制有哪些方法

MySQL怎么设置主从复制_MySQL主从复制有哪些方法MySQL是一个关系型数据库管理系统,在WEB 应用方面,MySQL是最好的RDBMS 应用软件。
下面由店铺为大家整理的MySQL主从复制的方法,希望大家喜欢!MySQL主从复制的方法设置主从复制:1、确保在主服务器和从服务器上安装的MySQL版本相同,并且最好是MySQL的最新稳定版本。
2、在主服务器上为复制设置一个连接账户。
该账户必须授予REPLICATION SLAVE权限。
如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。
mysql> GRANT REPLICATION SLAVE ON *.*-> TO 'replication'@'%' IDENTIFIED BY 'slavepass';3、执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:mysql> FLUSH TABLES WITH READ LOCK;保持mysql客户端程序不要退出。
开启另一个终端对主服务器数据目录做快照。
shell> cd /usr/local/mysql/shell> tar -cvf /tmp/mysql-snapshot.tar ./data如果从服务器的用户账户与主服务器的不同,你可能不想复制mysql数据库。
在这种情况下,应从归档中排除该数据库。
你也不需要在归档中包括任何日志文件或者或文件。
当FLUSH TABLES WITH READ LOCK所置读锁定有效时(即mysql客户端程序不退出),读取主服务器上当前的二进制日志名和偏移量值:mysql > SHOW MASTER STATUS;+---------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+---------------+----------+--------------+------------------+ | mysql-bin.003 | 73 | test | manual,mysql |+---------------+----------+--------------+------------------+ File列显示日志名,而Position显示偏移量。
MySQL主从复制的配置和常见问题解决

MySQL主从复制的配置和常见问题解决导语:MySQL是世界上最流行的开源关系数据库管理系统之一,它提供了强大的功能和灵活性。
MySQL主从复制是MySQL中一种常用的高可用性和数据备份机制。
本文将详细介绍MySQL主从复制的配置过程,并分析常见的问题及解决方案,以帮助读者更好地理解和应用MySQL主从复制。
一、MySQL主从复制的概念和原理MySQL主从复制是指通过将一个MySQL服务器(称为主服务器)的数据复制到另一个或多个MySQL服务器(称为从服务器)上来实现数据同步的过程。
主服务器负责处理所有的写操作,而从服务器则复制主服务器上的数据,并负责读取操作。
主从复制的原理主要有以下几个核心组件:1.二进制日志(Binary Log)MySQL主从复制通过二进制日志来记录主服务器上的所有改变,包括插入、更新和删除操作。
二进制日志中的内容会通过网络传输给从服务器,实现数据的同步。
2.主服务器(Server)主服务器是负责处理所有的写操作的MySQL服务器。
它将所有的写操作记录到二进制日志中,并将二进制日志传输给从服务器。
3.从服务器(Slave)从服务器是通过复制主服务器的数据来实现数据同步的MySQL服务器。
它连接到主服务器,并从主服务器上读取二进制日志,然后将这些日志应用到自己的数据中。
4.主从复制的流程:1)主服务器上的写操作会被记录到二进制日志中;2)从服务器连接到主服务器,并请求从指定的二进制日志位置开始复制;3)主服务器将二进制日志中的内容发送给从服务器;4)从服务器将接收到的二进制日志应用到自己的数据中;5)从服务器周期性地从主服务器获取新的二进制日志内容,实现数据的持续同步。
二、MySQL主从复制的配置MySQL主从复制的配置主要包括以下几个步骤:1.确保主服务器的二进制日志开启在主服务器的配置文件f中,确保开启了二进制日志功能。
找到并修改以下参数值:```log_bin = /var/log/mysql/mysql-bin.logserver_id = 1```2.创建从服务器账号在主服务器上创建一个用于复制的账号,并分配相应的权限。
MySQL数据库中数据表(创建、查看、修改、复制、删除)

MySQL数据库中数据表(创建、查看、修改、复制、删除)查看数据库中的数据表在MySQL中创建好一个数据库后,可以使用 SHOW TABLES 语句查看当前数据库中的表,例如:查看名为onlinedb数据库下的数据表:(1)使用 USE 语句将onlinedb设为当前数据表.其中这个“ Database changed”表示数据库切换成功。
(2)查看数据表。
可以看到我这数据库中有四个数据表,如果在查看数据表示出现“Empty set”这表示这份数据库中是为一个空集,也就是没有数据表。
在数据库中创建数据表接下来使用 CREATE TABLE 语句创建数据表:格式如下:CREATE [TEMPORARY] TABLE 表名(字段定义1,字段定义2,…字段定义N);其中:TEMPORARY:使用该关键字表示创建的表为临时表。
字段定义:数据表中的字段;包括字段名,数据类型,是否允许为空,指定默认值、主键约束、唯一性约束、注释字段、是否伟外键以及字段类型的属性等‘字段定义格式:字段名数据类型 [NOT NULL | NULL] [DEFAULT 默认值] [AUTO_INCREMENT] [ UNIQUE KEY | PRIMARY KEY] [COMMENY “字符串”] [外键定义]其中:NULL (NOT NULL):表示字段是否可以为空。
DEFUALT:指定字段的默认值。
AUTO_INCREMENT:设置字段为自增,只有整型类型的字段才能设置自增。
自整默认从1开始,每个表只能有一个自增字段。
UNIQUE KEY:唯一性约束PRIMARY KEY:主键约束。
COMMENT:注释字段。
外键定义:外键约束例如:我这里创建一个叫test的数据表:然后查看成功没可以看到我们这里创建好的名为test的数据表;查看数据表结构如果想查看该数据表就使用 DESCRIBE 表名;其中:这里的DESCRIBE 也可以缩写为DESC。
MySQL的主从复制步骤详解及常见错误解决方法

MySQL的主从复制步骤详解及常见错误解决⽅法mysql主从复制(replication同步)现在企业⽤的⽐较多,也很成熟.它有以下优点:1.降低主服务器压⼒,可在从库上执⾏查询⼯作.2.在从库上进⾏备份,避免影响主服务器服务.3.当主库出现问题时,可以切换到从库上.不过,⽤它做备份时就会也有弊端,如果主库有误操作的话,从库也会收到命令.下⾯直接进⼊操作.这⾥使⽤的是debian5操作系统,mysql5.0,默认引擎innodb10.1.1.45 主库10.1.1.43 从库1.设置主库1)修改主库f,这⾥主要是server-id⼀定主从不要设置成⼀样的.打开binlog⽇志log-bin = /opt/log.bin/45server-id = 452)在主服务器上建⽴同步账号mysql> grant REPLICATION SLAVE ON *.* TO 'repl'@'10.1.1.43' IDENTIFIED BY 'replpass';注意:mysql的权限系统在实现上⽐较简单,相关权限信息主要存储在⼏个系统表中:er,mysql.db,mysql.host,mysql.table_priv,mysql.columm_priv.由于权限信息的数据量⽐较⼩,访问⼜⾮常频繁,所以mysql在启动的时候,就会将所有的权限信息都加载到内存中,并保存在⼏个特定的结构⾥.这就使得每次⼿动修改了相关权限表之后,都需要执⾏flush privileges,通知mysql重新加载mysql的权限信息.当然,如果通过grants,revoke或drop user 命令来修改相关权限,则不需要⼿动执⾏flush privileges命令.3)在主服务器上导出数据库当时的快照,传给从库上.root@10.1.1.45:mysql# mysqldump -uroot -p --single-transaction --flush-logs --master-data --all-databases > all.sql--single-transaction:这个选项能够让innoDB和Falcon数据表在备份过程中保持不变.这⼀做法的关键在于它是在同⼀个事务⾥来导⼊各有关数据表的.mysqldump使⽤repeatable read事务隔离层来⽣成⼀份稳定⼀致的转储⽂件,同时不会阻塞其他客户(对于⾮事务性表,转储过程可能有变化),它不能与--lock-all-tables选项⼀起使⽤.--flush-logs:在导出⼯作开始之前先清空mysql服务器的⽇志⽂件.这样更容易恢复操作,知道在检查点时间之后创建的⼆进制⽇志⽂件是在备份给定数据库之后完成的.结合使⽤--lock-all-tables或--master-data,只有在所有数据表都锁定之后才清除⽇志.这个选项需要具备reload权限. --master-data:使⽤后mysqldump会在dump⽂件中产⽣changer master to命令,⾥⾯记录了dump时刻所对应的详细的log position信息.root@10.1.1.45:mysql# sed -n '1,40p' all.sql-- MySQL dump 10.11---- Host: localhost Database:-- -------------------------------------------------------- Server version 5.0.51a-24+lenny1-log/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;---- Position to start replication or point-in-time recovery from--CHANGE MASTER TO MASTER_LOG_FILE='45.000064', MASTER_LOG_POS=98;---- Current Database: `bbs`--CREATE DATABASE /*!32312 IF NOT EXISTS*/ `bbs` /*!40100 DEFAULT CHARACTER SET latin1 */;USE `bbs`;---- Table structure for table `davehe`--DROP TABLE IF EXISTS `davehe`;SET @saved_cs_client = @@character_set_client;SET character_set_client = utf8;CREATE TABLE `davehe` (2.设置从库1).修改从库fserver-id = 43 #主从可1对多从各id不能相同2)将主库的快照灌⼊从库root@10.1.1.43:tmp# cat all.sql | mysql -uroot -p3)在从库上设置同步.查看从库状态.mysql> change master to master_host='10.1.1.45', master_user='repl',master_password='replpass',master_log_file='45.000064',master_log_pos=98; Query OK, 0 rows affected (0.01 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)mysql> show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 10.1.1.45Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: 45.000064Read_Master_Log_Pos: 98Relay_Log_File: mysqld-relay-bin.000002Relay_Log_Pos: 228Relay_Master_Log_File: 45.000064Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 98Relay_Log_Space: 228Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 01 row in set (0.00 sec)ERROR:No query specified测试OK当然这只是最简单的配置还有很多参数可根据环境需求变化.⽐如replicate-do-db=test 过滤拉主⽇志到从只需要这个库和下⾯的表replicate-wild-do-table=test.davereplicate-wild-do-table=test.davehemysql数据库同步跳过临时错误stop slave;set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; (事务类型,可能需要执⾏⼏次)start slave;stop slave IO_THREAD //此线程把master段的⽇志写到本地start slave IO_THREADstop slave SQL_THREAD //此线程把写到本地的⽇志应⽤于数据库start slave SQL_THREADSlave_IO_Running: No错误由于主库的主机192.168.1.1宕机,再次启来后,从库192.168.71.1连接主库发现报错. Slave_IO_Running: Noroot@192.168.71.1:~# mysql -uroot -p --socket=/opt/mysql/3399/3399.sockEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 452723Server version: 5.0.51a-24+lenny2 (Debian)Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> show slave status\G;*************************** 1. row ***************************Slave_IO_State:Master_Host: 192.168.1.1Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: 99.000302Read_Master_Log_Pos: 165112917Relay_Log_File: 3399-relay-bin.000013Relay_Log_Pos: 165113047Relay_Master_Log_File: 99.000302Slave_IO_Running: NoSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB: mysqlReplicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 165112917Relay_Log_Space: 165113047Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: NULL1 row in set (0.00 sec)查看错误⽇志mysql@192.168.71.1:/opt/mysql/3399$ cat 192.168.71.1.err140115 1:51:01 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)140115 1:51:01 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log 140115 1:51:01 [Note] Slave I/O thread exiting, read up to log '99.000302', position 165112917根据错误位置,查找主库上log ‘99.000302' 对应的位置 165112917root@192.168.1.1:mysql.bin# mysqlbinlog 99.000302 > /tmp/testroot@192.168.1.1:mysql# tail -n 10 /tmp/test#140115 0:50:25 server id 1176 end_log_pos 165111351 Query thread_id=111 exec_time=0 error_code=0SET TIMESTAMP=1389718225/*!*/;INSERT INTO user_info_db_86.region_info_table_56 (userid, region, gameflag) VALUES (563625686, 0, 2) ON DUPLICATE KEY UPDATE gameflag = (gameflag | 2)/*!*/; # at 165111351#140115 0:50:25 server id 1176 end_log_pos 165111378 Xid = 17877752COMMIT/*!*/;DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;结果发现主库上位置最后是165111351 ⽐165112917要⼩. 也就是从库同步找的位置⽐主库要⼤,故同步不成功为什么会这样,这是因为这个在sync_binlog=0的情况,很容易出现。
MySQL数据库的主备复制配置与故障处理

MySQL数据库的主备复制配置与故障处理引言:MySQL数据库的主备复制是一种常见的数据库高可用性方案,通过将主库的数据同步到备库,实现数据的故障容错和备份。
本文将介绍MySQL数据库主备复制的配置步骤以及常见的故障处理方法。
一、MySQL主备复制的配置步骤1. 确保主备服务器之间网络通畅,可以互相访问。
在进行主备复制配置之前,需要确保主备服务器之间的网络连接正常。
可以使用ping命令或者其他网络工具进行测试,确保主备服务器之间可以正常通信。
2. 配置主库的f文件在主库的f文件中,需要进行以下配置:i. 开启binlog功能:设置log_bin参数为ON,用于记录主库上的变更日志。
ii. 配置server_id:为主库设置一个唯一的server_id,用于标识主库。
iii. 配置binlog_format:设置binlog的格式,默认为ROW格式,该格式记录的是行级别的变更日志,更加详细和安全。
3. 配置备库的f文件在备库的f文件中,需要进行以下配置:i. 配置server_id:为备库设置一个唯一的server_id,用于标识备库。
ii. 配置relay_log和relay_log_index:用于记录备库上的中继日志,relay_log用于记录中继日志的内容,relay_log_index用于记录中继日志的位置。
iii. 配置read_only:将备库设置为只读模式,避免误操作。
4. 在主库上创建用于复制的账户,并授权给备库在主库上创建一个用于复制的账户,并授权给备库执行复制操作的权限。
5. 执行主备复制的相关命令在备库上执行如下命令,进行主备复制的相关配置:CHANGE MASTER TO MASTER_HOST='主库IP地址', MASTER_USER='用于复制的账户', MASTER_PASSWORD='账户密码', MASTER_PORT=主库端口号, MASTER_LOG_FILE='主库的binlog文件名', MASTER_LOG_POS=主库的binlog位置;START SLAVE;6. 验证主备复制是否配置成功可以通过SHOW SLAVE STATUS命令查看备库的复制状态,如果Slave_IO_Running和Slave_SQL_Running都为YES,则表示主备复制配置成功。
MySQL中的主备复制和故障切换技巧

MySQL中的主备复制和故障切换技巧导言数据库的高可用性是保障系统稳定运行的重要因素之一。
而主备复制和故障切换是实现数据库高可用性的常用方法之一。
MySQL作为一种流行的关系型数据库管理系统,也提供了主备复制和故障切换的功能。
本文将为读者介绍MySQL中的主备复制和故障切换技巧,帮助读者了解如何搭建一个稳定可靠的MySQL数据库系统。
一、主备复制的原理主备复制是通过将主数据库上的操作记录(二进制日志)传递给备数据库来实现数据同步的过程。
主备复制的原理可以简单概括为以下几个步骤:1. 主库记录操作日志:主库将所有的增删改操作记录在二进制日志中。
2. 备库读取并应用日志:备库通过主库的二进制日志传输工具(如binlog传输或GTID)读取主库的二进制日志,并将读取到的日志应用到备库。
3. 备库复制主库操作:备库将主库的操作应用到自身数据库中。
通过上述步骤,主备之间的数据保持同步,从而实现了主备复制的功能。
二、搭建MySQL主备复制系统1. 配置主库首先,在主库上配置二进制日志。
编辑MySQL配置文件,添加以下配置:```[mysqld]log-bin=mysql-binserver-id=1```其中,log-bin指定了二进制日志的存放位置和文件名,server-id指定了主库的标识。
然后,重启MySQL服务使配置生效。
2. 配置备库在备库上配置与主库相同的二进制日志配置,并添加以下配置:```[mysqld]log-bin=mysql-binserver-id=2relay-log=mysql-relay-binread-only=1```其中,relay-log指定了备库的中继日志的存放位置和文件名,read-only设置备库为只读模式,确保备库不处理任何写操作。
重启MySQL服务使配置生效。
3. 设置主备连接在主库上创建用于备库连接的用户,并赋予复制权限。
打开MySQL命令行,执行以下命令:```GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';```其中,slave_user为连接备库时使用的用户名,password为密码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
美河学习在线
MySQL主从复制
MySQL主从复制、搭建、状态检查、中断排查及备库重做
本文档主要对MySQL主从复制进行简单的介绍,包括原理简介、搭建步骤、状态检查、同步中断及排查、备库重建。
目录
一、MySQL主从复制概述 (2)
1、主从复制简介 (2)
2、主从复制原理、机制 (2)
3、主从复制原理图 (3)
二、MySQL主从复制搭建 (4)
1、Master端配置部署 (4)
2、Slave端配置部署 (4)
3、建立主从同步 (4)
三、主从复制状态检查及异常处理 (6)
1、主从复制状态检查 (6)
2、IO_thread异常 (7)
3、sql_thread异常 (8)
4、主从复制延迟 (9)
一、MySQL主从复制概述
1、主从复制简介
MySQL主从复制就是将一个MySQL实例(Master)中的数据实时复制到另一个MySQL实例(slave)中,而且这个复制是一个异步复制的过程。
实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(sql_thread和IO_thread),另外一个进程在 Master(IO进程)上。
2、主从复制原理、机制
要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。
因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
复制的基本过程如下:
1)、Slave上面的IO_thread连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO_thread的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO_thread。
返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log file的以及bin-log pos;
3)、Slave的IO_thread接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
4)、Slave的Sql_thread检测到relay-log中新增加了内容后,会马上解析relay-log 的内容成为在Master端真实执行时候的那些可执行的内容,并在本数据库中执行。
3、主从复制原理图
二、MySQL主从复制搭建
MySQL主从复制搭建主要步骤有:Master端配置部署、Slave端配置部署、建立主从同步
1、Master端配置部署
a、配置参数:
b、创建用户,并赋予权限:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '******';
2、Slave端配置部署
a、配置参数:
3、建立主从同步
(重建备库也是使用该方法)
建立主从同步可以从主库上导出数据,也可以从已有的从库上导出数据,然后再导入到新的从库中,change master to建立同步。
3.1 、导出数据
在主库上导出数据:
mysqldump -u*** -p*** -S /data/mysql6001/mysql.sock --default-character-set=utf8 -q
--single-transaction --master-data -A > /tmp/all_database.sql
(或者)在从库上导出数据:
mysqldump -u*** -p*** -S /data/mysql6001/mysql.sock --default-character-set=utf8 -q --single-transaction --dump-slave -A > /tmp/all_database.sql
NOTES:
--master-data和--dump-slave导出的备份中,会包含master_log_file和master_log_pos信息。
3.2 、从库导入数据
mysql -u*** -p*** --default-character-set=utf8 < all_database.sql
NOTES:
此处导入脚本,就已经在从库中执行了以下操作:
3.3 、从库与主机建立同步
指定与主库同步的基本信息后,就可以启动slave进程了:(IO_thread和sql_thread)
三、主从复制状态检查及异常处理
1、主从复制状态检查
主库查看binlog情况:
2、IO_thread异常
IO_thread异常,状态往往是Slave_IO_Running: Connecting 或NO。
IO_thread是向Master发送请求读取master binlog,如果处于Connecting状态,说明无法正确地与Master进行连接,可能的原因有:
a、网络不通(是否打开防火墙)
b、复制用户的密码不对
c、指定的master_port端口不对
d、master上的mysql-bin.xxxxxx被误删
e、主库磁盘空间满了
通过show slave status\G可以看到相关错误信息,例如:
或者通过错误日志看到相关信息,如:
3、sql_thread异常
sql_thread发生异常,状态就会变为Slave_SQL_Running: NO。
sql_thread发生异常的情况非常多,发生异常后,需要通过以下方法排查和解决:
a、对比主库和从库的二进制日志的情况:
b、通过show slave status\G查看错误信息:
c、通过错误日志查看错误信息:
根据这些报错信息,往往就能够定位到发生异常的原因。
如果我们了解产生异常的具体事件,而且能够掌控,可以通过设置sql_slave_skip_counter参数来跳过当前错误。
或者使用slave_skip_errors参数(read only variable),指定跳过某种类型的错误:
遇到错误时,不要一通百度后,然后根据看起来很类似的操作直接来进行操作。
因为网上大部分解决sql_thread异常的方法是:
a、直接set global sql_slave_skip_counter=n; (n设置很大的值,即:跳过所有错误),
b、设置slave_skip_errors=all;跳过所有类型的错误
c、直接查看主库的binlog,然后在从库上直接执行change master to。
这些方法都会导致主从数据不一致。
如果发现从库与主库差异太大,无法通过手动操作或数据修改重新建立同步。
可以参考上述"MySQL主从复制搭建" 重新搭建从库。
4、主从复制延迟
主从复制延迟,可能的原因有:
a、主从同步延迟与系统时间的关系,查看主从两台机器间系统时间差
b、主从同步延迟与压力、网络、机器性能的关系,查看从库的io,cpu,mem及网络压
力
c、主从同步延迟与lock锁的关系(myisam表读时会堵塞写),尽量避免使用myisam 表。
一个实例里面尽量减少数据库的数量。
d、主从复制发生异常而中断,过很久之后才发现复制异常。
可通过查看master与slave的status估算相差的日志。
如果相差太大,则可以考虑重做从库。