KOPS - MySQL
type: channel
link: https://www.kops.cc/category/mysql/
items: MySQL误删数据不慌，还有的救
items: MySQL sql_mode
items: XtraBackup实践
items: （总结）MySQL自带的性能压力测试工具mysqlslap详解
items: 为MySQL用户设置密码
items: mysql5.5半同步复制
items: MySQL常见错误 -- update忘加where条件误操作恢复（模拟Oracle闪回功能）
items: MySQL常见错误 -- delete忘加where条件误操作恢复
items: MySQL复制常见错误 -- mysql跳过主从复制Delete_rows错误
items: MySQL复制常见错误--主键重复

MySQL误删数据不慌，还有的救
type: item
date: 2025-10-24T09:12:33+00:00
description: 在软件开发与数据库管理的日常中，程序bug或误执行SQL语句导致的数据错误更新是一个不容忽视的问题。这类问题不仅可能导致业务数据的混乱，还可能对企业造成严重的经济损失。幸运的是，数据库系统为我们提供了一种强大的数据恢复机制——binlog（Binary Log），它能够记录所有修改数据的SQL语句，为我们在数据遭遇不测时提供了一线生机。本文将详细介绍如何通过解析binlog来恢复因程序bug或误执行SQL导致的数据错误更新或删除。binlog基础什么是binlog？binlog是MySQL数据库中的一种二进制日志文件，它记录了数据库中所有修改数据的SQL语句，包括增删改操作。binlog的主要作用是用于数据库的主从复制和数据恢复。binlog的类型MySQL的binlog有三种格式：STATEMENT、ROW和MIXED。STATEMENT：记录每一条会修改数据的SQL语句本身。ROW：记录每一行数据的变化，不记录SQL语句本身。MIXED：默认情况下使用STATEMENT格式，但在某些特殊情况下会自动切换为ROW格式。通过binlog恢复数据理论基础准备工作确认binlog已开启：确保MySQL的binlog功能已开启，且binlog类型为ROW。定位问题时间点：确定误执行的时间范围，以便在binlog中找到相关的记录。误执行的SQL语句：确定误执行的SQL语句，以便在binlog中找到相关的记录。备份当前数据：在进行数据恢复前，务必备份当前的数据状态，以防恢复过程中出现意外。恢复步骤查找binlog文件：根据问题时间点，定位到包含误操作的binlog文件。解析binlog：使用MySQL提供的mysqlbinlog工具解析binlog文件，找到异常的SQL语句。mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001 > binlog.out在生成的SQL文件中搜索关键词，定位到误执行的SQL语句。编写恢复脚本：根据解析出的binlog内容，编写一个反向操作的SQL脚本，用于撤销误执行的SQL影响的数据修改。例如，如果错误地更新了某个字段的值，可以在恢复脚本中将其改回原来的值。执行恢复脚本：在确保备份了当前数据后，执行恢复脚本。验证恢复结果：检查恢复后的数据是否与预期一致，确保业务数据恢复正常。实战场景一：update语句不加where条件误操作数据恢复事件描述程序BUG导致一张表的所有数据被逻辑删除（is_deleted字段被更新为1），该程序BUG是由于执行了一条UPDATE语句，WHERE条件设置有误引起，如下：UPDATE `test`.`t1` SET is_deleted = 1;根据开发同事的反馈，该SQL是在2025-09-05 14:48左右执行的。诉求恢复程序BUG导致的错误更新is_deleted字段的值。解析binlog根据此前的理论知识，binlog记录每一行数据的变化。那么我们可以通过解析binlog，拿到这条SQL所影响的数据，它记录修改前、后的数据。获取binlog文件：如果是云数据，看不到最新的日志，需要执行：flush logs执行binlog解析命令：因为明确知道SQL的执行时间，我这里加了--start-datetime参数，减少数据量。2025-09-05 14:48左右执行的，我这里往前推了几分钟。因为时区问题，减去8小时。mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS --start-datetime="2025-09-05 06:40:00" mysqlbin.000391 > binlog.out查找关键字UPDATE `test`.`t1`# at 273068250 #250905 6:48:12 server id 414163 end_log_pos 273068548 CRC32 0x06b6ee0e Update_rows: table id 5546 flags: STMT_END_F ### UPDATE `test`.`t1` ### WHERE ### @1=5816 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=4956 /* LONGINT meta=0 nullable=1 is_null=0 */ ### @3=0 /* LONGINT meta=0 nullable=1 is_null=0 */ ### @4=0 /* LONGINT meta=0 nullable=1 is_null=0 */ ### @5='风管机' /* …

MySQL sql_mode
type: item
date: 2019-07-16T01:24:00+00:00
description: 查询sql_mode的方法#查询全局sql_mode SELECT @@GLOBAL.sql_mode; #查询当前会话sql_mode SELECT @@SESSION.sql_mode;MySQL 5.6 的默认 sql_mode：STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONMySQL 5.7 的默认 sql_mode：ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTIONMySQL 8.0 的默认 sql_mode：ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTIONsql_mode 说明ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作，如果在SELECT中的列，没有在GROUP BY中出现，那么这个SQL是不合法的，因为列不在GROUP BY从句中。 NO_AUTO_VALUE_ON_ZERO 该值影响自增长列的插入。默认设置下，插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0，该列又是自增长的，那么这个选项就有用了。 STRICT_TRANS_TABLES 在该模式下，如果一个值不能插入到一个事物表中，则中断当前的操作，对非事物表不做限制 NO_ZERO_IN_DATE 在严格模式下，不允许日期和月份为零 NO_ZERO_DATE 设置该值，mysql数据库不允许插入零日期，插入零日期会抛出错误而不是警告。 ERROR_FOR_DIVISION_BY_ZERO 在INSERT或UPDATE过程中，如果数据被零除，则产生错误而非警告。如 果未给出该模式，那么数据被零除时MySQL返回NULL NO_AUTO_CREATE_USER 禁止GRANT创建密码为空的用户 NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译，那么抛出错误。不设置此值时，用默认的存储引擎替代，并抛出一个异常 PIPES_AS_CONCAT 将"||"视为字符串的连接操作符而非或运算符，这和Oracle数据库是一样的，也和字符串的拼接函数Concat相类似 ANSI_QUOTES 启用ANSI_QUOTES后，不能用双引号来引用字符串，因为它被解释为识别符 HIGH_NOT_PRECEDENCE NOT运算符的优先级使得诸如 NOT a BETWEEN b AND c 之类的表达式被解析为NOT（a BETWEEN b AND c） mysql> SET sql_mode = ''; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 0 mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE'; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 1 IGNORE_SPACE 允许函数名和括号【（】之间的空格。这会导致内置函数名被视为保留字。 IGNORE_SPACE SQL模式适用于内置函数，而不适用于用户定义的函数或存储函数。 无论是否启用IGNORE_SPACE，始终允许在UDF或存储的函数名后面包含空格。 mysql> CREATE TABLE count (i INT); ERROR 1064 (42000): You have an error in your SQL syntax mysql> CREATE TABLE `count` (i INT); Query OK, 0 rows affected (0.00 sec)

XtraBackup实践
type: item
date: 2019-02-28T10:23:00+00:00
description: 概述关于XtraBackupXtraBackup是由Percona公司开发的一款基于InnoDB的MySQL数据库备份工具，据官方介绍，这也是世界上惟一一款开源的能够对InnoDB和XtraDB数据库进行热备的工具。其有如下特点：备份过程快速、可靠；备份过程不会打断正在执行的事务；能够基于压缩等功能节约磁盘空间和流量；自动实现备份检验；还原速度快；XtraBackup功能热备份增量备份备份到另一台MySQL服务器在MySQL服务器之间在线迁移表轻松创建新的从服务器备份时，不占用服务器资源XtraBackup工作原理XtraBackup是基于InnoDB的crash恢复功能。复制InnoDB数据文件，但是数据是不一致的，然后使用crash恢复让数据文件一致。当InnoDB启动时会去检查数据文件和日志文件，然后重做已提交事务，执行未提交事务。XtraBackup记下LSN（Log Sequence Number），然后启动，复制数据文件。同时XtraBackup启动一个后台进程用来监控日志文件，然后复制修改，这个进程在备份期间一直是运行的，因为日志文件时回绕的，避免数据被覆盖无法恢复。直到备份完成。第二阶段就是预备阶段，XtraBackup通过执行crash恢复，应用日志文件到数据文件上。等待复制InnoDB结束，然后执行FLUSH TABLES WITH READ LOCK，停止对mysql数据的修改。复制非innodb引擎表，直到复制完成，然后释放锁。这样在prepare阶段后，InnoDB和非InnoDB相互保持了一致性。InnoDB会一直redo，直到备份完成。这个时间刚刚好和FLUSH TABLES WITH READ LOCK时间一直，所以InnoDB和非InnoDB是保持同步的。工作原理图示：备份过程：恢复过程：增量备份过程：增量备份恢复过程1：增量备份恢复过程2：安装XtraBackup介绍yum的安装方法，更多安装方法参考官方文档Installing Percona XtraBackup 2.4安装Percona官方提供yum源yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm # 应该会看到以下输出： Retrieving http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm Preparing... ######################### [100%] 1:percona-release ######################### [100%]安装percona-xtrabackupyum install percona-xtrabackup-24备份前的准备权限xtrabackup需要连接到数据库和datadir操作权限。xtrabackup或者innobackupex在使用过程中设计到2类用户权限：系统用户，用来调用innobackupex或者xtrabackup数据库用户，数据库内使用的用户连接innobackupex或者xtrabackup通过--user和--password连接到数据库服务# 备份到指定目录 xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/ # 同上 innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/ # 压缩保存 innobackupex --user=LUKE --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -其他连接选项选项描述--port指定连接的端口--socket指定连接socket--host指定连接的主机3.4 MySQL账号权限RELOAD和LOCK TABLES权限为了执行FLUSH TABLES WITH READ LOCKREPLICATION CLIENT为了获取binary log 位置CREATE TABLESPACE权限为了导入表，用户表级别的恢复PROCESS 权限为了执行 SHOW ENGINE INNODB STATUSSUPER 权限在slave环境下备份用来启动和关闭slave线程CREATE权限为了创建PERCONA_SCHEMA.xtrabackup_history 数据库和表INSE…

（总结）MySQL自带的性能压力测试工具mysqlslap详解
type: item
date: 2016-06-23T01:41:00+00:00
description: PS：今天一同事问我有木有比较靠谱的mysql压力测试工具可用。其实mysql自带就有一个叫mysqlslap的压力测试工具，还是模拟的不错的。下面举例说说。mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具。通过模拟多个并发客户端访问MySQL来执行压力测试，同时详细的提供了“高负荷攻击MySQL”的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别。通过mysqlslap –help可以获得可用的选项，这里列一些主要的参数，更详细的说明参考官方手册。如果是系统自带或者使用rpm包安装的mysql，安装了MySQL-client端的包就有mysqlslap这个工具。下图是运行mysqlslap -a -c 500 -i 10 -uroot -p123456测试时mysql的连接进程数：使用语法如下：mysqlslap [options]常用参数 [options] 详细说明：--auto-generate-sql, -a 自动生成测试表和数据，表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括：read，key，write，update和mixed(默认)。--auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列，从5.1.18版本开始支持。--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列，默认1--number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列，默认1--number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)--query=name,-q 使用自定义脚本执行测试，例如可以调用自定义的一个存储过程或者sql语句来执行测试。--create-schema 代表自定义的测试库名称，测试的schema，MySQL中schema也就是database。--commint=N 多少条DML后提交一次。--compress, -C 如果服务器和客户端支持都压缩，则压缩信息传递。--concurrency=N, -c N 表示并发量，也就是模拟多少个客户端同时执行select。可指定多个值，以逗号或者--delimiter参数指定的值做为分隔符。例如：--concurrency=100,200,500。--engine=engine_name, -e engine_name 代表要测试的引擎，可以有多个，用分隔符隔开。例如：--engines=myisam,innodb。--iterations=N, -i N 测试执行的迭代次数，代表要在不同并发环境下，各自运行测试多少次。--only-print 只打印测试语句而不实际执行。--detach=N 执行N条语句后断开重连。--debug-info, -T 打印内存和CPU的相关信息。说明：测试的过程需要生成测试表，插入测试数据，这个mysqlslap可以自动生成，默认生成一个mysqlslap的schema，如果已经存在则先删除。可以用--only-print来打印实际的测试过程，整个测试完成后不会在数据库中留下痕迹。各种测试参数实例（-p后面跟的是mysql的root密码）：单线程测试。测试做了什么。mysqlslap -a -uroot -p123456多线程测试。使用–concurrency来模拟并发连接。mysqlslap -a -c 100 -uroot -p123456迭代测试。用于需要多次执行测试得到平均值。mysqlslap -a -i 10 -uroot -p123456 mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456 mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456 mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456 mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456 mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456 mysqlslap -a -e …

为MySQL用户设置密码
type: item
date: 2016-06-14T03:34:29+00:00
description: 1. 设置localhost的访问密码 $ mysqladmim -uroot -hlocalhost -p password '123456' 2. 设置已存在的用户的密码 mysql> set password for 'USERNAME'@'HOST'=password('password'); 3. 设置已存在的用户的密码 mysql> update user set Password=password(password') where User='USERNAME' and Host='HOST'; 4. 给远程用户设置密码 mysql> grant all privileges on *.* to 'root'@'192.168.31.%' identified by '123456';mysql> flush privileges;

mysql5.5半同步复制
type: item
date: 2016-06-08T09:49:00+00:00
description: 默认情况下，mysql5.1/5.5的复制功能是异步的，异步复制可以提供最佳的性能，主库把binlog日志发送给从库，这一动作就结束了，并不会验证是否接受完毕，但这同时也带来了很高的风险，这就意味着当主服务器发送故障时，有可能从机没有接受到主机发过来的binlog日志，会造成主服务器/从服务器的数据不一致，甚至在恢复时会造成数据丢失。为了解决这个问题，mysql5.5引入了一种半同步复制模式，该模式可以确保从服务器接受完主服务器发送的binlog日志并写入自己的中继日志relay log里，然后会给主服务器一个反馈，告诉对方已经接收完毕，这时主库线程才返回当前session告知操作完成。当出现超市情况时，源主服务器会暂时切换到异步复制模式，知道至少有一台设置为半同步模式的从服务器及时收到信息为止。半同步复制安装配置插件路径：/usr/local/mysql/lib/plugin/semisync_master.so、semisync_slave.somaster：1. 安装插件：mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 2. 启动模块：mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; 3. 设置超时时间：mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000； my.cnf rpl_semi_sync_master_enabled = 1 slave：1. 安装插件：msyql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 2. 启动模块：mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; 3. 重启进程使其模块生效：mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; my.cnf rpl_semi_sync_slave_enabled = 1

MySQL常见错误 -- update忘加where条件误操作恢复（模拟Oracle闪回功能）
type: item
date: 2016-06-08T09:45:00+00:00
description: 开启binlog，且binlog-format=row新建一个表[sql]CREATE TABLE student (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(10) NOT NULL DEFAULT '', class int(10), score varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (id));[/sql]插入测试数据：insert into student(name,class,score) values('a',1,56),('b',1,61),('c',2,78),('d',2,45),('e',3,76),('f',3,89),('g',4,43),('h',4,90);模拟update忘加where条件update student set score='failure';mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS bin-log.000039 | grep -B 15 'failure'/*!*/; # at 8513042 #160323 9:50:53 server id 1 end_log_pos 8513098 CRC32 0xb96214ed Table_map: `abc`.`student` mapped to number 151 # at 8513098 #160323 9:50:53 server id 1 end_log_pos 8513398 CRC32 0xf3c6e6c0 Update_rows: table id 151 flags: STMT_END_F ### UPDATE `abc`.`student` ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='a' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='56' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### SET ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='a' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='failure' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### UPDATE `abc`.`student` ### WHERE ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### @2='b' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='61' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### SET ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### @2='b' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='failure' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### UPDATE `abc`.`student` ### WHERE ### @1=3 /* INT meta=0 nullable=0 is_null=0 */ ### @2='c' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=2 /* INT meta=0 nullable=1 is_null=0 */ ### @4='78' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### SET ### @1=3 /* INT me…

MySQL常见错误 -- delete忘加where条件误操作恢复
type: item
date: 2016-06-08T09:35:00+00:00
description: 开启binlog，且binlog-format=row新建一个表CREATE TABLE `student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL DEFAULT '', `class` int(10), `score` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`));插入测试数据insert into student(name,class,score) values('a',1,56),('b',1,61),('c',2,78),('d',2,45),('e',3,76),('f',3,89),('g',4,43),('h',4,90);模拟删除mysql> delete from student; Query OK, 8 rows affected (0.00 sec) mysql> select * from student; Empty set (0.00 sec)看一下删除命令的binlog POSITIONmysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS bin-log.000039 | grep -B 10 "DELETE"# at 8515372 #160323 17:16:31 server id 1 end_log_pos 8515519 CRC32 0xb503c687 Delete_rows: table id 151 flags: STMT_END_F ### DELETE FROM `abc`.`student` ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='a' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='56' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */导出binlogmysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS bin-log.000039 | sed -n '/# at 8515372/,/COMMIT/p' > ~/delete.txtcat ~/delete.txt# at 8515372 #160323 17:16:31 server id 1 end_log_pos 8515519 CRC32 0xb503c687 Delete_rows: table id 151 flags: STMT_END_F ### DELETE FROM `abc`.`student` ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='a' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='56' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### DELETE FROM `abc`.`student` ### WHERE ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### @2='b' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=1 /* INT meta=0 nullable=1 is_null=0 */ ### @4='61' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### DELETE FROM `abc`.`student` ### WHERE ### @1=3 /* INT meta=0 nullable=0 is_null=0 */ ### @2='c' /* VARSTRING(40) meta=40 nullable=0 is_null=0 */ ### @3=2 /* INT meta=0 nullable=1 is_null=0 */ ### @4='78' /* VARSTRING(40) meta=40 nullab…

MySQL复制常见错误 -- mysql跳过主从复制Delete_rows错误
type: item
date: 2016-06-08T09:28:00+00:00
description: #!/bin/bash ######################################################################## ## ##此脚本是用来自动处理同步报错的，默认跳过10次。 ## ##只有Last_SQL_Error:Could not execute Delete_rows event on table ...;Can't find record ## in ...;Error_code:1032;handler error HA_ERR_KEY_NOT_FOUND;the event's master log ## bin-log.000001.end_log_pos ... ##这种情况才跳过，其他的情况自行处理，以免丢失数据。 ## ######################################################################### export LANG=zh_CN . /root/.bash_profile v_dir=/usr/local/mysql/bin/ v_user=root v_password= v_log=/home/logs/ v_time=10 if [ -d "${v_log}" ];then echo "${v_log} has existed before." else mkdir ${v_log} fi echo "" > ${v_log}/slave_status.log echo "" > ${v_log}/slave_status_error.log count=1 while true do Seconds_Behind_Master=$(${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" | awk -F':' '/Seconds_Behind_Master/{print $2}') if [ "$Seconds_Behind_Master" != "NULL" ];then echo "slave is ok!" ${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" >> ${v_log}/slave_status.log break else echo "" >> ${v_log}/slave_status_error.log date >> ${v_log}/slave_status_error.log echo "" >> ${v_log}/slave_status_error.log ${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" >> ${v_log}/slave_status_error.log ${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" | egrep 'Delete_rows' > /dev/null 2>&1 if [ $? = 0 ];then ${v_dir}/mysql -u${v_user} -p${v_password} -e "stop slave;set global sql_slave_skip_counter=1;start slave;" else ${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" | grep 'Last_SQL_Error' break fi let count++ if [ $count -gt "${v_times}" ];then break else ${v_dir}mysql -u${v_user} -p${v_password} -e "show slave status\G;" >> ${v_log}/slave_status_error.log sleep 2 continue fi fi done

MySQL复制常见错误--主键重复
type: item
date: 2016-06-08T09:25:00+00:00
description: 主从数据不一致时，slave上已经有该条记录，但我们又在master上插入了同一条记录，此时就会报错，报错信息如下：Last_SQL_Error:Could not execute Write_rows event on table ...;Duplicater entry '2' for key 'PRIMARY',Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;the event's master log bin-log.000006, end_log_pos 924解决方法：在slave上使用命令“desc abc.student;”先查看一下表结构，如下所示：mysql> desc abc.student; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(10) | NO | | | | | class | int(10) | YES | | NULL | | | score | varchar(10) | NO | | | | +-------+------------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)得到主键的字段名id，接着删除重复的主键，命令如下：delete from student where id=2;开启主从复制：start slave; show slave status\G;