请教TP使用mysqlmysql 主从数据库库

西西软件下载最安全的下载网站、值得信赖的软件下载站!
您的位置:
→ 利用percona-toolkit工具检查MySQL数据库主从一致性及修复
利用percona-toolkit工具检查MySQL主从复制数据的一致性,以及修复。一、pt-table-checksum检查主从库数据的一致性pt-table-checksum在MASTER上校验指定库、表,将结果存在一个库表里,复制进程将检验sql传递到slave上再执行一次。通过比较M/S的检验值确定数据是否一致。利用主从复制做检验,不需要在检验期间对主从数据库同时锁表,可以控制校验的数据和速度,不影响到正常服务。安装:#依赖包
perl-DBD-MySQL
perl-TermReadKey
#percona-toolkit包
wget /downloads/percona-toolkit/LATEST/percona-toolkit-2.2.4.tar.gz
tar xzvf percona-toolkit-2.2.4.tar.
cd percona-toolkit-2.2.4 ;
perl Makefile.pl && make && make install使用方法:pt-table-checksum [OPTIONS] [DSN]pt-table-checksum:在主&M&上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误,更多信息请见官网。不指定任何参数,会直接对本地的所有数据库的表进行检查。pt-table-checksum CS /tmp/mysqld.sock u=root,p=123456环境:#主库:
mysql& select * from t1;
+----+------+
| id | name |
+----+------+
+----+------+
5 rows in set (0.00 sec)
mysql& select * from t1;
+----+------+
| id | name |
+----+------+
+----+------+
4 rows in set (0.00 sec)注意:1、& 根据测试,需要一个技能登录主库,也能登录从库,而且还能同步数据库的账号;2、& 只能指定一个host,必须为主库的IP;3、& 在检查时会向表加S锁;4、& 运行之前需要从库的同步IO和SQL进程是YES状态。可以用该语句授权用户,这里为了方便直接用root用户了GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO ‘checksums’@’x.x.x.x’ IDENTIFIED BY ‘xxxx’;执行检测(MASTER上):pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table
CHUNKS SKIPPED
TIME TABLE
09-18T12:03:16
0.018 test.t1参数说明:TS&&&&&&&&&&& :完成检查的时间。ERRORS&&&&&&& :检查时候发生错误和警告的数量。DIFFS&&&&&&&& :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。ROWS&&&&&&&&& :表的行数。CHUNKS&&&&&&& :被划分到表中的块的数目。SKIPPED&&&&&& :由于错误或警告或过大,则跳过块的数目。TIME&&&&&&&&& :执行的时间。TABLE&&&&&&&& :被检查的表名。参数意义:--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。--no-check-binlog-format&&&&& : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。--replicate-check-only :只显示不同步的信息。--replicate=&& :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。--databases=&& :指定需要被检查的数据库,多个则用逗号隔开。--tables=&&&&& :指定需要被检查的表,多个用逗号隔开h=127.0.0.1&&& :Master的地址u=root&&&&&&&& :用户名p=123456&&&&&& :密码P=3306&&&&&&&& :端口更多的参数请见官网,上面指出来的是常用的,对该场景够用的参数。通过DIFFS是1可以看出主从的表数据不一致。通过查看从库上的test.checksum表可以看到主从库的检验信息。 mysql& select * from checksum\G;
*************************** 1. row ***************************
chunk_time: 0.001604
chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
this_crc: 13fa7d9d
#从的校验值
this_cnt: 4
master_crc: aa7a56c3
#主的校验值
master_cnt: 5
1 row in set (0.00 sec)通过上面的 this_crc && master_crc 更能清楚的看出他们的不一致了,通过chunk知道是这个张表的哪个块上的记录出现不一致。要是主的binlog模式是Row 则会报错:Replica db2 has binlog_format ROW which could cause pt-table-checksum to break replication.&Please read &Replicas using row-based replication& in the LIMITATIONS section of the tool's documentation.&If you understand the risks, specify --no-check-binlog-format to disable this check.从错误信息得出,要是不改binlog模式的话,则在执行上面的命令时候要指定:--no-check-binlog-format,即:pt-table-checksum
--nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1
h=127.0.0.1,u=root,p=123,P=3306指定--replicate-check-only参数会在前一次pt-table-checksum检验的数据之上比较(不会再执行计算),显示出数据不一致的SLAVE主机名:[root@host125 ~]# pt-table-checksum
--nocheck-replication-filters --no-check-binlog-format --replicate-check-only --replicate=test.checksum --databases=test --tables=t1
h=127.0.0.1,u=root,p=123456,P=3306
[root@host125 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=192.168.68.235,u=root,p=123 --empty-replicate-table --create-replicate-table --replicate-check-only
Differences on host122
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t1 1 -1 1数据不一致的SLAVE和表都找出来了,下面就用pt-table-sync来修补数据。二、pt-table-sync修复从库不一致的数据使用方法:pt-table-sync [OPTIONS] DSN [DSN]pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。继续上面的复制环境,主和从的t1表数据不一致,需要修复,执行:[root@host125 ~]# pt-table-sync --print --replicate=test.checksum h=192.168.68.235,u=root,p=123,P=3306 h=192.168.68.232,u=root,p=123,P=3306
#先MASTER的IP,再SLAVE的IP
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee')
/*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:test.checksum replicate:test.checksum bidirectional:0 pid:24763 user:root host:host125*/;参数的意义:--replicate=& :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。--databases=& : 指定执行同步的数据库,多个用逗号隔开。--tables=&&&& :指定执行同步的表,多个用逗号隔开。--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。h=127.0.0.1&& :服务器地址,命令里有2个ip,第一次出现的是M的地址,第2次是Slave的地址。u=root&&&&&&& :帐号。p=123456&&&&& :密码。--print&&&&&& :打印,但不执行命令。--execute&&&& :执行命令。更多的参数请见官网,上面指出来的是常用的,对该场景够用的参数。和上面的命令一样效果的命令:[root@host125 ~]# pt-table-sync --print --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1
#用一个IP (SLAVE)就可以了。
REPLACE INTO `test`.`t1`(`id`, `name`) VALUES ('5', 'ee') /*percona-toolkit src_db:test src_tbl:t1 src_dsn:P=3306,h=192.168.68.235,p=...,u=root dst_db:test dst_tbl:t1 dst_dsn:P=3306,h=192.168.68.232,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:24798 user:root host:host125*/;还可以让它自己执行修复数据的SQL语句,但是这样就没有输出了:[root@host125 ~]# pt-table-sync --execute --sync-to-master h=192.168.68.232,u=root,p=123,P=3306 --databases test --tables t1数据已经修复完成了:mysql& select * from t1;
+----+------+
| id | name |
+----+------+
+----+------+
5 rows in set (0.00 sec)建议还是用--print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下。不然直接执行了,出现问题之后更不好处理。总之还是在处理之前做好数据的备份工作。注意:要是表中没有唯一索引或则主键则会报错:Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.补充:要是从库有的数据,而主库没有,那这个数据怎么处理?会给出删除SLAVE多余数据,和修复SLAVE缺失数据的SQL语句。如果在shell窗口不想显示输入密码则可以添加:--ask-pass 参数,如:[root@host125 ~]# pt-table-sync --print --ask-pass --sync-to-master h=192.168.68.232,u=root,P=3306 --databases test --tables t1
Enter password for 192.168.68.232:如果使用--ask-pass,报错:C is Term::ReadKey installed? Can't locate Term/ReadKey.pm in @INC安装Term/ReadKey.pm模块:[root@host125 ~]# perl -MCPAN -e &shell&
cpan[1]& install Term::ReadKey总结:该工具执行检查表动作,检查连接的帐号需要有很高的权限,在一般权限上需要加SELECT, PROCESS, SUPER, REPLICATION SLAVE等权限。pt-table-checksm 配合pt-table-sync使用,在执行pt-table-sync数据同步之前,一定要执行pt-table-checksm命令检查。
阅读本文后您有什么感想? 已有
人给出评价!
访问量多的Advertisement
如何监控MySQL数据库主从之间的延时
导读:本文介绍了如何使用seconds_behind_master和mk-heartbeat 检查MySQL数据库主从延时的问题,我们要保证复制的整体结构是否正常,需要检查主从数据是否保持一致。关键词:&&&&
  日常工作中,对于MySQL主从复制检查,一方面我们要保证复制的整体结构是否正常,另一方面需要检查主从数据是否保持一致。对于前者我们可以通过监控复制线程是否工作正常以及主从延时是否在容忍范围内,对于后者则可以通过分别校验主从表中数据的md5码是否一致,来保证数据一致,可以使用Maatkit工具包中的mk-table-checksum工具去检查。在这里,我只想讨论下关于如何检查主从延时的问题。  判断主从延时,通常有两个方法:1. Seconds_Behind_Master vs 2. mk-heartbeat,下面具体说下两者在实现功能的差别。  方法1. 通过监控show slave status\G命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。其值有这么几种:  NULL — 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes。  0 — 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为lag不存在。  正值 — 表示主从已经出现延时,数字越大表示从库落后主库越多。  负值 — 几乎很少见,我只是听一些资深的DBA说见过,其实,这是一个BUG值,该参数是不支持负值的,也就是不应该出现。  show slave status\G,该命令的输出结果非常丰厚,给我们的监控提供了很多有意义的参数,比如:Slave_IO_Running该参数可作为io_thread的监控项,Yes表示io_thread的和主库连接正常并能实施复制工作,No则说明与主库通讯异常,多数情况是由主从间网络引起的问题;Slave_SQL_Running该参数代表sql_thread是否正常,具体就是语句是否执行通过,常会遇到主键重复或是某个表不存在。下面就说到今天的重点Seconds_Behind_Master,该值作为判断主从延时的指标,那么它又是怎么得到这个值的呢,同时,它为什么又受到很多人的质疑?  Seconds_Behind_Master是通过比较sql_thread执行的event的timestamp和io_thread复制好的event的timestamp(简写为ts)进行比较,而得到的这么一个差值。我们都知道的relay-log和主库的bin-log里面的内容完全一样,在记录sql语句的同时会被记录上当时的ts,所以比较参考的值来自于binlog,其实主从没有必要与NTP进行同步,也就是说无需保证主从时钟的一致。你也会发现,其实比较真正是发生在io_thread与sql_thread之间,而io_thread才真正与主库有关联,于是,问题就出来了,当主库I/O负载很大或是网络阻塞,io_thread不能及时复制binlog(没有中断,也在复制),而sql_thread一直都能跟上io_thread的脚本,这时Seconds_Behind_Master的值是0,也就是我们认为的无延时,但是,实际上不是,你懂得。这也就是为什么大家要批判用这个参数来监控数据库是否发生延时不准的原因,但是这个值并不是总是不准,如果当io_thread与master网络很好的情况下,那么该值也是很有价值的。(就好比:妈–儿子–媳妇的关系,妈与儿子亲人,媳妇和儿子也亲人,不见得媳妇与妈就很亲。开个玩笑:-)之前,提到Seconds_Behind_Master这个参数会有负值出现,我们已经知道该值是io_thread的最近跟新的ts与sql_thread执行到的ts差值,前者始终是大于后者的,唯一的肯能就是某个event的ts发生了错误,比之前的小了,那么当这种情况发生时,负值出现就成为可能。  方法2. mk-heartbeat,Maatkit万能工具包中的一个工具,被认为可以准确判断复制延时的方法。  mk-heartbeat的实现也是借助timestmp的比较实现的,它首先需要保证主从服务器必须要保持一致,通过与相同的一个NTP server同步时钟。它需要在主库上创建一个heartbeat的表,里面至少有id与ts两个字段,id为server_id,ts就是当前的时间戳now(),该结构也会被复制到从库上,表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这个周期默认为1秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期去比较,复制过来记录的ts值与主库上的同一条ts值,差值为0表示无延时,差值越大表示延时的秒数越多。我们都知道复制是异步的ts不肯完全一致,所以该工具允许半秒的差距,在这之内的差异都可忽略认为无延时。这个工具就是通过实打实的复制,巧妙的借用timestamp来检查延时,赞一个!
原文出处:/2011/06/two-methods-of-monitoring-slavelag-seconds_behind_master-or-mk-heartbeat.html
来自甲骨文的声音:在未来很长一段时间里,关系型数据库在企业中所发挥的作用仍将不可替代。
甲骨文近日宣布推出最新MySQL 5.7开发里程碑版本,同时宣布发布其他几种MySQL产品及前期功能,并在上提供MySQL源代码
在5.7这个版本中,主要工作集中在read+write(RW)上,RW依赖RO下,能够再次提高速度。InnoDB团队通过不断的改进,强烈的推进优化着5.7这个版本的每秒的性能。
在2013甲骨文全球大会期间举办的第二届MySQL Connect启动大会上,甲骨文宣布为MySQL 5.7推出第二个开发里程碑版本,继续推动MySQL 的技术创新。
本文介绍了MySQL数据库产品开发的整个流程,其中包括了不同阶段,如功能开发、实验室版本、里程碑版本以及GA版本。
TechTarget中国官方微信
要成为一名DBA,你需要具备哪些素质?DBA的薪酬待遇如何?DBA的职业道路究竟可以走向何方?我们将在本次的技术手册中为您一一解答。
TechTarget数据库网站每两年就会进行一次“数据库工程师薪酬调查”,对不同行业、不同层次的数据库技术从业者的薪酬待遇情况进行一次摸底。
新年干货大放送。TechTarget数据库网站总结了过去一年最实用、最受欢迎的十大SQL Server技巧,分享给各位DBA。预祝DBA们马年“马上有成功”!
很多企业关系自己是否应该从传统数据库转到NoSQL数据库,应该选择什么样的数据库?本书详列了相应的技巧和案例,供您参考。
本专题为QL&SELECT语句基础。侧重概述了如何使用SELECT来访问SQL数据库中所有内容以及组成SELECT语句的许多子句名称和功能;同时还阐述了如何使用DISTINCT关键字消除重复的行,以及如何正确使用ORDER&BY子句来排序数据。使用xtrabackup实现MySQL主从复制 - code06网itwork 的BLOG
用户名:itwork
文章数:39
评论数:180
访问量:571953
注册日期:
阅读量:3626
阅读量:1739
阅读量:2758
51CTO推荐博文
15705人学习
4167人学习
3486人学习
mysql主从复制
(超简单)
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:
1、主从服务器分别作以下操作:
& 1.1、版本一致
& 1.2、初始化表,并在后台启动mysql
& 1.3、修改root的密码
2、修改主服务器master:
&&&&&& [mysqld]
&&&&&& log-bin=mysql-bin&& //[必须]启用二进制日志
&&&&&& server-id=222&&&&&& //[必须]服务器唯一ID,默认是1,一般取IP最后一段
3、修改从服务器slave:
&&&&&& [mysqld]
&&&&&& log-bin=mysql-bin&& //[必须]启用二进制日志
&&&&&& server-id=226&&&&&& //[必须]服务器唯一ID,默认是1,一般取IP最后一段
4、重启两台服务器的mysql
&& /etc/init.d/mysql restart
5、在主服务器上建立帐户并授权slave:
&& #/usr/local/mysql/bin/mysql -uroot -pmttang&&
&& mysql&GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,&%&表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
6、登录主服务器的mysql,查询master的状态
&& +------------------+----------+--------------+------------------+
&& | File&&&&&&&&&&&& | Position | Binlog_Do_DB | Binlog_Ignore_DB |
&& +------------------+----------+--------------+------------------+
&& | mysql-bin.000004 |&&&&& 308 |&&&&&&&&&&&&& |&&&&&&&&&&&&&&&&& |
&& +------------------+----------+--------------+------------------+
&& 1 row in set (0.00 sec)
&& 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
&& mysql&change master to aster_host='192.168.145.222',master_user='tb',master_password='q123456',
&&&&&&&& master_log_file='mysql-bin.,000004',master_log_pos=308;&& //注意不要断开,&308&无单引号。
&& Mysql&&&& //启动从服务器复制功能
8、检查从服务器复制功能状态:
&& mysql& show slave status\G
&& *************************** 1. row ***************************
&&&&&&&&&&&&&&& Slave_IO_State: Waiting for master to send event
&&&&&&&&&&&&&&&&&& Master_Host: 192.168.2.222& //主服务器地址
&&&&&&&&&&&&&&&&&& Master_User: myrync&&&&&&&& //授权帐户名,尽量避免使用root
&&&&&&&&&&&&&&&&&& Master_Port: 3306&&&&&&&&&& //数据库端口,部分版本没有此行
&&&&&&&&&&&&&&&& Connect_Retry: 60
&&&&&&&&&&&&&& Master_Log_File: mysql-bin.000004
&&&&&&&&&& Read_Master_Log_Pos: 600&&&&&&& //#同步读取二进制日志的位置,大于等于&=Exec_Master_Log_Pos
&&&&&&&&&&&&&&& Relay_Log_File: ddte-relay-bin.000003
&&&&&&&&&&&&&&&& Relay_Log_Pos: 251
&&&&&&&& Relay_Master_Log_File: mysql-bin.000004
&&&&&&&&&&&&& Slave_IO_Running: Yes&&&&&& //此状态必须YES
&&&&&&&&&&&& Slave_SQL_Running: Yes&&&&&& //此状态必须YES
&&&&&&&&&&&&&&&&&&& ......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。
9、主从服务器测试:
主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:
& mysql& create database hi_
& Query OK, 1 row affected (0.00 sec)
& mysql& use hi_
& Database changed
& mysql&& create table hi_tb(id int(3),name char(10));
& Query OK, 0 rows affected (0.00 sec)
& mysql& insert into hi_tb values(001,'bobu');
& Query OK, 1 row affected (0.00 sec)
&& +--------------------+
&& | Database&&&&&&&&&& |
&& +--------------------+
&& | information_schema |
&& | hi_db&&&&&&&&&&&&& |
&& | mysql&&&&&&&&&&&&& |
&& | test&&&&&&&&&&&&&& |
&& +--------------------+
&& 4 rows in set (0.00 sec)
从服务器Mysql查询:
&& +--------------------+
&& | Database&&&&&&&&&& |
&& +--------------------+
&& | information_schema |
&& | hi_db&&&&&&&&&&&&& |&&&&&&&&& //I'M here,大家看到了吧
&& | mysql&&&&&&&&&&&&& |
&& | test&&&&&&&&&&&&&& |
&& +--------------------+
&& 4 rows in set (0.00 sec)
&& mysql& use hi_db
&& Database changed
&& mysql& select * from hi_&&& //可以看到在主服务器上新增的具体数据
&& +------+------+
&& | id&& | name |
&& +------+------+
&& |&&& 1 | bobu |
&& +------+------+
&& 1 row in set (0.00 sec)
10、完成:
&&& 编写一shell脚本,用nagios监控slave的两个&yes&,如发现只有一个或零个&yes&,就表明主从有问题了,发短信警报吧。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
10:18:19 11:31:40 14:39:09 17:20:30 17:48:28 14:38:26 11:20:32 11:52:06 11:43:17 08:33:58 17:14:04}

我要回帖

更多关于 查看数据库主从 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信