大纲
一、前言
二、Mysql 基础知识
三、Mysql 复制(Replication)
四、Mysql 复制(Replication)类型
五、Mysql 主从复制基本步骤
六、Mysql 主从复制(异步)
七、Mysql 主从复制(半同步)
八、Mysql 复制工具
九、Mysql 复制注意事项
十、Mysql 复制过滤
一、前言
从这一篇博客开始我们就来学习mysql的高级课程,在前面的几篇博客我们讲解了mysql基础知识、mysql日志类型、mysql配置文件、mysql备份策略,这一篇博客中我们来讲解mysql的复制。
二、mysql基础知识
1.mysql日志类型
二进制日志
事务日志
错误日志
一般查询日志
中继日志
慢查询日志
注,有博友对mysql日志不怎么了解,可以参考这篇博客http://freeloda.blog.51cto.com/2033581/1253991
2.mysql二进制日志详解
说明:默认开启,精确的记录了用户对数据库中的数据进行操作的命令和操作的数据对象。
二进制日志文件的作用:
提供了增量备份的功能
提供了数据基于时间点的恢复,这个恢复的时间点可以由用户控制
为mysql的复制架构提供基础,将这主服务器的二进制日志复制到从服务器上并执行同样的操作,就可将数据进行同步
实现数据的高可用
分担负载
二进制日志默认存放位置:
数据目录下,以mysql-bin.XXXXXX命名的日志
二进制日志格式:
基于语句 statement
基于行 row
混合方式 mixed
二进制日志滚动方式:
重启服务
日志达到最大上限
执行flush logs
二进制日志事件:
position 基于位置,也就是offset(偏移量)
datetime 基于时间
timestamp
二进制日志的查看与删除方式:
mysql>show master status; 查看当前正在使用的二进制日志 mysql>show binlog events in'mysql-bin.000001'; 查看二进制日志记录的事件[from position] mysql>flush logs; 二进制日志滚动 mysql>show binary logs; 查看所有二进制日志 mysql>purge binary logs to 'mysql-bin.000003'; 删除二进制日志
文件系统中查看二进制日志的命令:
mysqlbinlog 相关选项, --start-position #开始位置 --stop-position #结束位置 --start-datetime 'yyyy-mm-dd hh:mm:ss'; #开始时间 --stop-datetime ''; #结束时间
配置mysql的主配置文件:
sql_log_bin = {ON|OFF} #用于控制二进制日志信息是否记录进日志文件。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限 binlog_cache_size = 32768 #默认值32768 Binlog Cache 用于在打开了二进制日志(binlog)记录功能的环境,是 MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了 binlog_stmt_cache_size = 32768 #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句 log_bin = mysql-bin #指定binlog的位置,默认在数据目录下 binlog-format= {ROW|STATEMENT|MIXED} #指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。 sync_binlog = 10 #设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步 max_binlog_cache_size = {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。 max_binlog_stmt_cache_size = {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存 expire_log_days = {0..99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时
注:一般建议将binlog日志与数据文件分开存放,不但可以提高mysql性能,还可以增加安全性!
三、Mysql 复制(Replication)
1.Mysql 复制作用
负载平衡(load balancing)
备份
高可用性(high availability)和容错
2.Mysql 复制如何工作
主要有三步(如下图):
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变反映它自己的数据。
具体说明:
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。所以slave上数据一般要慢于master上数据。即master与slave之间的数据在一定时间内会不同步。
四、Mysql 复制(Replication)类型
1.mysql复制类型有以下一些基本原则
每个slave只能有一个master;
每个slave只能有一个唯一的服务器ID;
每个master可以有很多slave;
如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新。
注,MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。
2.mysql复制类型
(1).一主多从模式
注,由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。
具体说明:
如果写操作较少,而读操作很时,可以采取这种结构。你可以将读操作分布到其它的slave,从而减小master的压力。但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:
不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎)
用一个slave作为备用master,只进行复制
用一个远程的slave,用于灾难恢复
发送复制事件到其它slave,当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。
(2).双主模式
注,Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。
具体说明:
主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:
在第一个服务器上执行:
mysql> UPDATE tbl SET col=col + 1; 在第二个服务器上执行: mysql> UPDATE tbl SET col=col * 2;
那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。
实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。
(3).主从模式
注,这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。
(4).带从服务器的Master-Master结构(Master-Master with Slaves)
注,这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。
总结:一般常用的两种复制类型一种是主从模式,另一种是一主多从模式。在这一篇博客中我们主要讲解主从模式复制。
五、Mysql 主从复制基本步骤
1.master 配置
启用二进制日志
配置一个唯一的server-id
创建具有复制权限的用户
2.slave 配置
启用中继日志
配置一个唯一的server-id
连接主服务器,并开始复制数据
启动数据复制
注,基本步骤我们就说到这里,下面我们来具体演示一下主从复制。
六、Mysql 主从复制(异步)
1.mysql异步复制
异步复制:MySQL本身支持单向的、异步的复制。异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时,最重要的是这意味着当应用系统的事务在主服务器上提交并确认时数据并不能在同一时刻拷贝或应用到从服务器上。通常这个延时是由网络带宽、资源可用性和系统负载决定的。然而,使用正确的组件并且调优,复制能做到接近瞬时完成。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。下面我们来具体演示一下mysql的异步复制。
2.实验拓扑
注,Active (master,node1) 192.168.1.201 , Passive (slave,node2)192.168.1.202
3.环境配置
时间同步
[root@node1 ~]# ntpdate 202.120.2.101 [root@node2 ~]# ntpdate 202.120.2.101
4.操作系统
CentOS 6.4 X86_64
5.软件版本
Mysql 5.5.33 (注,这里用的是mysql 5.5.33二进制通用安装包,解压就能用)
6.安装并配置mysql
master:
(1).解压并链接
[root@node1 src]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@node1 src]# cd /usr/local/ [root@node1 local]# ln -sv /usr/local/mysql-5.5.33-linux2.6-x86_64 mysql "mysql" -> "/usr/local/mysql-5.5.33-linux2.6-x86_64" [root@node1 local]# cd mysql [root@node1 mysql]# ll 总用量 200 drwxr-xr-x 2 root root 4096 8月 24 17:58 bin -rw-r--r-- 1 7161 wheel 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root root 4096 8月 24 17:58 data drwxr-xr-x 2 root root 4096 8月 24 17:58 docs drwxr-xr-x 3 root root 4096 8月 24 17:58 include -rw-r--r-- 1 7161 wheel 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root root 4096 8月 24 17:58 lib drwxr-xr-x 4 root root 4096 8月 24 17:58 man drwxr-xr-x 10 root root 4096 8月 24 17:58 mysql-test -rw-r--r-- 1 7161 wheel 2496 7月 15 20:01 README drwxr-xr-x 2 root root 4096 8月 24 17:58 scripts drwxr-xr-x 27 root root 4096 8月 24 17:58 share drwxr-xr-x 4 root root 4096 8月 24 17:58 sql-bench drwxr-xr-x 3 root root 4096 8月 24 17:58 support-files
(2).新建mysql用户
[root@node1 mysql]# groupadd -g 3306 mysql [root@node1 mysql]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 mysql]# id mysql uid=3306(mysql) gid=3306(mysql) 组=3306(mysql)
(3).修改mysql安装目录所有者与所属组
[root@node1 mysql]# chown -R root.mysql /usr/local/mysql/* [root@node1 mysql]# ll 总用量 200 drwxr-xr-x 2 root mysql 4096 8月 24 17:58 bin -rw-r--r-- 1 root mysql 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root mysql 4096 8月 24 17:58 data drwxr-xr-x 2 root mysql 4096 8月 24 17:58 docs drwxr-xr-x 3 root mysql 4096 8月 24 17:58 include -rw-r--r-- 1 root mysql 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root mysql 4096 8月 24 17:58 lib drwxr-xr-x 4 root mysql 4096 8月 24 17:58 man drwxr-xr-x 10 root mysql 4096 8月 24 17:58 mysql-test -rw-r--r-- 1 root mysql 2496 7月 15 20:01 README drwxr-xr-x 2 root mysql 4096 8月 24 17:58 scripts drwxr-xr-x 27 root mysql 4096 8月 24 17:58 share drwxr-xr-x 4 root mysql 4096 8月 24 17:58 sql-bench drwxr-xr-x 3 root mysql 4096 8月 24 17:58 support-files
(4).为mysql提供配置文件并修改
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf [root@node1 mysql]# vim /etc/my.cnf [mysqld] #增加一行 datadir = /mydata/data
(5).为mysql提供启动脚本
[root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@node1 mysql]# chmod +x /etc/init.d/mysqld
(6).初始化mysql数据库
[root@node1 ~]# mkdir -pv /mydata/data mkdir: 已创建目录 "/mydata" mkdir: 已创建目录 "/mydata/data" [root@node1 ~]# chown -R mysql.mysql /mydata/data/ [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql Installing MySQL system tables... /usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory Installation of system tables failed! Examine the logs in /mydata/data/ for more information. You can try to start the mysqld daemon with: shell> /usr/local/mysql/bin/mysqld --skip-grant & and use the command line tool /usr/local/mysql/bin/mysql to connect to the mysql database and look at the grant tables: shell> /usr/local/mysql/bin/mysql -u root mysql mysql> show tables Try 'mysqld --help' if you have problems with paths. Using --log gives you a log in /mydata/data/ that may be helpful. Please consult the MySQL manual section 'Problems running mysql_install_db', and the manual section that describes problems on your OS. Another information source are the MySQL email archives available at http://lists.mysql.com/. Please check all of the above before mailing us! And remember, if you do mail us, you MUST use the /usr/local/mysql/scripts/mysqlbug script! [root@node1 ~]# cd /mydata/data/ [root@node1 data]# ll 总用量 8 drwx------ 2 mysql root 4096 8月 24 18:21 mysql drwx------ 2 mysql root 4096 8月 24 18:21 test
(7).启动并测试
启动报错 [root@node1 data]# service mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/mydata/data/node1.test.com.pid). 查看一下错误日志 [root@node1 data]# vim node1.test.com.err 130824 18:21:44 mysqld_safe Starting mysqld daemon with databases from /mydata/data /usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 130824 18:21:44 mysqld_safe mysqld from pid file /mydata/data/node1.test.com.pid ended 注,从错误日志中我们看到差一个库文件libaio,我们用yum安装一下即可。 [root@node1 data]# yum install -y libaio 重新初始化mysql [root@node1 data]# /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql 启动mysql [root@node1 data]# service mysqld start Starting MySQL... SUCCESS! 环境变量配置 [root@node1 data]# vim /etc/profile.d/mysql.sh export PATH=$PATH:/usr/local/mysql/bin [root@node1 data]# source /etc/profile 测试一下 [root@node1 data]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.03 sec) mysql>
好了,到这里master的mysql配置完成,下面我们进行slave的mysql配置。
slave:
(1).解压并链接
[root@node2 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@node2 ~]# cd /usr/local/ [root@node2 local]# ln -sv /usr/local/mysql-5.5.33-linux2.6-x86_64 mysql "mysql" -> "/usr/local/mysql-5.5.33-linux2.6-x86_64" [root@node2 local]# cd mysql [root@node2 mysql]# ll 总用量 200 drwxr-xr-x 2 root root 4096 8月 24 18:41 bin -rw-r--r-- 1 7161 wheel 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root root 4096 8月 24 18:41 data drwxr-xr-x 2 root root 4096 8月 24 18:41 docs drwxr-xr-x 3 root root 4096 8月 24 18:41 include -rw-r--r-- 1 7161 wheel 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root root 4096 8月 24 18:41 lib drwxr-xr-x 4 root root 4096 8月 24 18:41 man drwxr-xr-x 10 root root 4096 8月 24 18:41 mysql-test -rw-r--r-- 1 7161 wheel 2496 7月 15 20:01 README drwxr-xr-x 2 root root 4096 8月 24 18:41 scripts drwxr-xr-x 27 root root 4096 8月 24 18:41 share drwxr-xr-x 4 root root 4096 8月 24 18:41 sql-bench drwxr-xr-x 3 root root 4096 8月 24 18:41 support-files
(2).新建mysql用户
[root@node2 mysql]# groupadd -g 3306 mysql [root@node2 mysql]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node2 mysql]# id mysql uid=3306(mysql) gid=3306(mysql) 组=3306(mysql)
(3).修改mysql安装目录所有者与所属组
[root@node2 mysql]# chown -R root.mysql /usr/local/mysql/* [root@node2 mysql]# ll 总用量 200 drwxr-xr-x 2 root mysql 4096 8月 24 18:41 bin -rw-r--r-- 1 root mysql 17987 7月 15 20:01 COPYING drwxr-xr-x 3 root mysql 4096 8月 24 18:41 data drwxr-xr-x 2 root mysql 4096 8月 24 18:41 docs drwxr-xr-x 3 root mysql 4096 8月 24 18:41 include -rw-r--r-- 1 root mysql 134493 7月 15 20:01 INSTALL-BINARY drwxr-xr-x 3 root mysql 4096 8月 24 18:41 lib drwxr-xr-x 4 root mysql 4096 8月 24 18:41 man drwxr-xr-x 10 root mysql 4096 8月 24 18:41 mysql-test -rw-r--r-- 1 root mysql 2496 7月 15 20:01 README drwxr-xr-x 2 root mysql 4096 8月 24 18:41 scripts drwxr-xr-x 27 root mysql 4096 8月 24 18:41 share drwxr-xr-x 4 root mysql 4096 8月 24 18:41 sql-bench drwxr-xr-x 3 root mysql 4096 8月 24 18:41 support-files
(4).为mysql提供配置文件并修改
[root@node2 mysql]# cp support-files/my-large.cnf /etc/my.cnf [root@node2 mysql]# vim /etc/my.cnf [mysqld] datadir = /mydata/data
(5).为mysql提供启动脚本
[root@node2 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@node2 mysql]# chmod +x /etc/init.d/mysqld
(6).初始化mysql数据库
先安装libaio库文件 [root@node2 mysql]# yum install -y libaio [root@node2 mysql]# mkdir -pv /mydata/data mkdir: 已创建目录 "/mydata" mkdir: 已创建目录 "/mydata/data" [root@node2 mysql]# cd /mydata/data [root@node2 data]# chown -R mysql.mysql /mydata/data/ [root@node2 data]# /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql [root@node2 data]# ll 总用量 1084 drwx------ 2 mysql root 4096 8月 24 18:49 mysql -rw-rw---- 1 mysql mysql 27698 8月 24 18:49 mysql-bin.000001 -rw-rw---- 1 mysql mysql 1061358 8月 24 18:49 mysql-bin.000002 -rw-rw---- 1 mysql mysql 38 8月 24 18:49 mysql-bin.index drwx------ 2 mysql mysql 4096 8月 24 18:49 performance_schema drwx------ 2 mysql root 4096 8月 24 18:49 test
(7).启动并测试
启动mysql [root@node2 data]# service mysqld start Starting MySQL... SUCCESS! 环境变量配置 [root@node2 data]# vim /etc/profile.d/mysql.sh export PATH=$PATH:/usr/local/mysql/bin [root@node1 data]# source /etc/profile 测试一下 [root@node2 data]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.06 sec) mysql>
好了,slave的mysql也配置完成了,下面我们来配置主从复制。
7.配置master
(1).修改配置文件
[root@node1 ~]# vim /etc/my.cnf #增加下面几行 [mysqld] log-bin=master-bin log-bin-index=master-bin.index server-id = 1 innodb_file_per_table = 1
(2).授权复制用户
mysql> grant replication slave on *.* to 'repluser'@'192.168.1.%' identified by 'replpass'; Query OK, 0 rows affected (0.61 sec) mysql> flush privileges; Query OK, 0 rows affected (0.41 sec)
(3).重启一下mysql服务
[root@node1 ~]# service mysqld restart Shutting down MySQL....... SUCCESS! Starting MySQL............. SUCCESS!
8.配置slave
(1).修改配置文件
[root@node2 ~]# vim /etc/my.cnf #增加下面几行 [mysqld] relay-log = relay-log relay-log-index = relay-log.index server-id = 10
(2).重启mysql服务
[root@node2 ~]# service mysqld restart Shutting down MySQL..... SUCCESS! Starting MySQL........... SUCCESS!
(3).连接主服务器并复制
查看master上二进制日志 mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000001 | 107 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 连接master服务器 mysql> change master to master_host='192.168.1.201',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=107; Query OK, 0 rows affected (0.07 sec) 查看一下slave状态 mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.201 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: relay-log.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 1 row in set (0.00 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 event Master_Host: 192.168.1.201 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 254 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 404 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec)
9.主从复制测试
master:
mysql> create database mydb; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
slave:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.03 sec)
好了,到这里异步的主从复制到这里配置完成。下面我们来说一下什么是半同步复制(或说是同步也行)。
七、Mysql 主从复制(半同步)
1.半同步复制
在说明半同步复制之前我们先来了解一下,什么是同步复制?同步复制:同步复制可以定义为数据在同一时刻被提交到一台或多台机器,通常这是通过众所周知的“两阶段提交”做到的。虽然这确实给你在多系统中保持一致性,但也由于增加了额外的消息交换而造成性能下降。使用MyISAM或者InnoDB存储引擎的MySQL本身并不支持同步复制,然而有些技术,例如分布式复制块设备(简称DRBD),可以在下层的文件系统提供同步复制,允许第二个MySQL服务器在主服务器丢失的情况下接管(使用第二服务器的复本)。了解了同步复制我们正下面来说一下,什么是半同步复制?
MYSQL 5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库。Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。
此外,还有一种情况会导致主备数据不一致。在某个session中,主库上提交一个事务后,会等待事务传递给至少一个备库,如果在这个等待过程中主库Crash,那么也可能备库和主库不一致,这是很致命的。如果主备网络故障或者备库挂了,主库在事务提交后等待10秒(rpl_semi_sync_master_timeout的默认值)后,就会继续。这时,主库就会变回原来的异步状态。
MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。
2.异步与半同步异同
默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。
MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。
3.具体配置
注,mysql5.5半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是master用的semisync_master.so,一个是slave用的semisync_slave.so,下面我们就来具体配置一下。
master:
(1).安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.39 sec) mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; Query OK, 0 rows affected (0.00 sec)
(2).修改配置文件
[root@node1 ~]# vim /etc/my.cnf [mysqld] rpl_semi_sync_master_enabled=1 #启用半同步 rpl_semi_sync_master_timeout=1000 #超时时间为1s
(3).重新启动服务
[root@node1 ~]# service mysqld restart Shutting down MySQL... SUCCESS! Starting MySQL.. SUCCESS!
slave:
(1).安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.38 sec) mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; Query OK, 0 rows affected (0.00 sec) mysql> STOP SLAVE IO_THREAD; Query OK, 0 rows affected (0.00 sec) mysql> START SLAVE IO_THREAD; Query OK, 0 rows affected (0.01 sec)
(2).修改配置文件
[root@node2 ~]# vim /etc/my.cnf [mysqld] rpl_semi_sync_slave_enabled=1 #启用半同步复制
(3).重新启动服务
[root@node2 ~]# service mysqld restart Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS!
4.查看一下状态
master:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec)
slave:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.01 sec)
5.测试一下
master:
mysql> create table user (id int(10)); Query OK, 0 rows affected (0.42 sec) mysql> show tables; +----------------+ | Tables_in_mydb | +----------------+ | user | +----------------+ 1 row in set (0.00 sec) mysql> insert user value (1); Query OK, 1 row affected (0.34 sec)
注,大家可以看到创建一个表的插入一个数据的时间都很长,说明半同步配置完成。
6.模拟一下故障
slave:
mysql> STOP SLAVE IO_THREAD; Query OK, 0 rows affected (0.01 sec) master: mysql> create table user1 (id int(10)); Query OK, 0 rows affected (1.03 sec)
注,大家可以看到主服务器会卡1s,我们超时时间设置的为1s。
7.查看一下状态
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 1560 | | Rpl_semi_sync_master_net_wait_time | 10920 | | Rpl_semi_sync_master_net_waits | 7 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 1 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 985 | | Rpl_semi_sync_master_tx_wait_time | 985 | | Rpl_semi_sync_master_tx_waits | 1 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 6 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) mysql> STOP SLAVE IO_THREAD; Query OK, 0 rows affected (0.01 sec) mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | OFF | +----------------------------+-------+ 1 row in set (0.00 sec)
好了,到这里我们就配置完成了半同步复制。希望大家有所收获。下面我们来简单说一下mysql复制的工具。
八、Mysql 复制工具
1.percona-toolkit简介
percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括:
检查master和slave数据的一致性
有效地对记录进行归档
查找重复的索引
对服务器信息进行汇总
分析来自日志和tcpdump的查询
当系统出问题的时候收集重要的系统信息
percona-toolkit源自Maatkit 和Aspersa工具,这两个工具是管理mysql的最有名的工具,现在Maatkit工具已经不维护了,请大家还是使用percona-toolkit吧!这些工具主要包括开发、性能、配置、监控、复制、系统、实用六大类,作为一个优秀的DBA,里面有的工具非常有用,如果能掌握并加以灵活应用,将能极大的提高工作效率。
2.安装percona-toolkit
[root@node1 ~]# wget http://www.percona.com/downloads/percona-toolkit/2.2.4/RPM/percona-toolkit-2.2.4-1.noarch.rpm [root@node1 ~]# yum install -y percona-toolkit-2.2.4-1.noarch.rpm [root@node1 ~]# pt #以pt开头命令 pt-agent pt-fingerprint pt-pmp pt-table-checksum pt-align pt-fk-error-logger pt-query-digest pt-table-sync pt-archiver pt-heartbeat pt-show-grants pt-table-usage pt-config-diff pt-index-usage pt-sift pt-upgrade pt-deadlock-logger pt-ioprofile pt-slave-delay pt-variable-advisor pt-diskstats pt-kill pt-slave-find pt-visual-explain pt-duplicate-key-checker pt-mext pt-slave-restart ptx pt-fifo-split pt-mysql-summary pt-stalk pt-find pt-online-schema-change pt-summary
3.简单使用
常用工具:
(1).服务器摘要
[root@node1 ~]# pt-summary # Percona Toolkit System Summary Report ###################### Date | 2013-08-24 15:15:14 UTC (local TZ: CST +0800) Hostname | node1.test.com Uptime | 10:37, 3 users, load average: 0.00, 0.08, 0.07 Platform | Linux Release | CentOS release 6.4 (Final) Kernel | 2.6.32-358.el6.x86_64 Architecture | CPU = 64-bit, OS = 64-bit Threading | NPTL 2.12 SELinux | Disabled Virtualized | VMWare # Processor ################################################## Processors | physical = 2, cores = 0, virtual = 2, hyperthreading = no Speeds | 2x2261.309 Models | 2xIntel(R) Core(TM) i5 CPU M 430 @ 2.27GHz Caches | 2x3072 KB # Memory ##################################################### Total | 230.8M Free | 45.5M Used | physical = 185.3M, swap allocated = 1000.0M, swap used = 40.5M, virtual = 225.9M Buffers | 4.3M Caches | 75.0M Dirty | 104 kB UsedRSS | 69.0M Swappiness | 60 DirtyPolicy | 20, 10 DirtyStatus | 0, 0 # Mounted Filesystems ######################################## Filesystem Size Used Type Opts Mountpoint /dev/sda1 194M 14% ext4 rw /boot /dev/sda2 9.7G 27% ext4 rw / /dev/sda3 4.9G 3% ext4 rw /data tmpfs 116M 0% tmpfs rw /dev/shm # Disk Schedulers And Queue Size ############################# sda | [cfq] 128 sdb | [cfq] 128 sr0 | [cfq] 128 # Disk Partioning ############################################ Device Type Start End Size ============ ==== ========== ========== ================== /dev/sda Disk 21474836480 /dev/sda1 Part 1 26 205632000 /dev/sda2 Part 26 1301 10487232000 /dev/sda3 Part 1301 1938 5239503360 /dev/sda4 Part 1938 2611 5535613440 /dev/sda5 Part 1939 2066 1044610560 /dev/sdb Disk 21474836480 /dev/sr0 Disk 4353378304 # Kernel Inode State ######################################### dentry-state | 8709 3069 45 0 0 0 file-nr | 736 0 21159 inode-nr | 9018 568 # LVM Volumes ################################################ Unable to collect information # LVM Volume Groups ########################################## Unable to collect information # RAID Controller ############################################ Controller | No RAID controller detected # Network Config ############################################# FIN Timeout | 60 Port Range | 61000 # Interface Statistics ####################################### interface rx_bytes rx_packets rx_errors tx_bytes tx_packets tx_errors ========= ========= ========== ========== ========== ========== ========== lo 0 0 0 0 0 0 eth0 225000000 225000 0 200000000 225000 0 # Network Devices ############################################ Device Speed Duplex ========= ========= ========= eth0 1000Mb/s Full # Network Connections ######################################## Connections from remote IP addresses 192.168.1.102 2 Connections to local IP addresses 192.168.1.201 2 Connections to top 10 local ports 22 2 States of connections ESTABLISHED 2 LISTEN 10 # Top Processes ############################################## PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19228 648 444 S 0.0 0.3 0:01.71 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.51 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.14 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.13 watchdog/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.17 migration/1 8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/1 9 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/1 # Notable Processes ########################################## PID OOM COMMAND 1037 -17 sshd # Simplified and fuzzy rounded vmstat (wait please) ########## procs ---swap-- -----io---- ---system---- --------cpu-------- r b si so bi bo ir cs us sy il wa st 1 0 0 1 15 15 9 15 0 0 100 0 0 0 0 0 0 0 0 1000 1000 5 18 77 0 0 0 0 0 0 0 0 10 40 0 0 100 0 0 0 0 0 0 0 0 15 40 0 0 100 0 0 0 0 0 0 0 0 15 40 0 0 100 0 0 # The End ####################################################
(2).服务器磁盘监测
[root@node1 ~]# pt-diskstats #ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime 1.0 sda 0.0 0.0 0.0 0% 0.0 0.0 2.0 6.0 0.0 33% 0.0 0.3 0% 0 2.0 0.0 0.3 1.0 sda2 0.0 0.0 0.0 0% 0.0 0.0 2.0 6.0 0.0 33% 0.0 0.3 0% 0 2.0 0.0 0.3 1.0 sda 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda2 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda2 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda2 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0 1.0 sda 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
(3).mysql服务状态摘要
[root@node1 ~]# pt-mysql-summary -- --user=root # Percona Toolkit MySQL Summary Report ####################### System time | 2013-08-24 15:16:55 UTC (local TZ: CST +0800) # Instances ################################################## Port Data Directory Nice OOM Socket ===== ========================== ==== === ====== 3306 /mydata/data 0 0 /tmp/mysql.sock # MySQL Executable ########################################### Path to executable | /usr/local/mysql/bin/mysqld Has symbols | Yes # Report On Port 3306 ######################################## User | root@localhost Time | 2013-08-24 23:16:55 (CST) Hostname | node1.test.com Version | 5.5.33-log MySQL Community Server (GPL) Built On | linux2.6 x86_64 Started | 2013-08-24 22:37 (up 0+00:39:17) Databases | 5 Datadir | /mydata/data/ Processes | 2 connected, 2 running Replication | Is not a slave, has 1 slaves connected Pidfile | /mydata/data/node1.test.com.pid (exists) # Processlist ################################################ Command COUNT(*) Working SUM(Time) MAX(Time) ------------------------------ -------- ------- --------- --------- Binlog Dump 1 1 2250 2250 Query 1 1 0 0 User COUNT(*) Working SUM(Time) MAX(Time) ------------------------------ -------- ------- --------- --------- repluser 1 1 2250 2250 root 1 1 0 0 Host COUNT(*) Working SUM(Time) MAX(Time) ------------------------------ -------- ------- --------- --------- 192.168.1.202 1 1 2250 2250 localhost 1 1 0 0 db COUNT(*) Working SUM(Time) MAX(Time) ------------------------------ -------- ------- --------- --------- NULL 2 2 2250 2250 State COUNT(*) Working SUM(Time) MAX(Time) ------------------------------ -------- ------- --------- --------- Master has sent all binlog to 1 1 2250 2250 NULL 1 1 0 0 # Status Counters (Wait 10 Seconds) ########################## Variable Per day Per second 10 secs Aborted_clients 70 Binlog_cache_use 175 Bytes_received 90000 1 200 Bytes_sent 700000 7 2000 Com_admin_commands 100 Com_change_db 70 Com_create_table 100 Com_insert 175 Com_select 400 1 Com_set_option 250 Com_show_databases 70 Com_show_status 100 Com_show_tables 70 Com_show_variables 250 Connections 350 1 Created_tmp_files 225 Created_tmp_tables 500 4 Flush_commands 35 Handler_commit 350 Handler_prepare 350 Handler_read_first 100 Handler_read_rnd_next 15000 35 Handler_write 12500 35 Innodb_buffer_pool_bytes_data 90000000 1000 Innodb_buffer_pool_pages_flushed 1500 Innodb_buffer_pool_read_requests 22500 Innodb_buffer_pool_reads 5000 Innodb_buffer_pool_write_requests 5000 Innodb_data_fsyncs 1250 Innodb_data_read 175000000 2000 Innodb_data_reads 6000 Innodb_data_writes 2500 Innodb_data_written 50000000 600 Innodb_dblwr_pages_written 1500 Innodb_dblwr_writes 150 Innodb_log_write_requests 1250 Innodb_log_writes 500 Innodb_os_log_fsyncs 700 Innodb_os_log_written 700000 7 Innodb_pages_created 500 Innodb_pages_read 5000 Innodb_pages_written 1500 Innodb_rows_inserted 175 Open_table_definitions 1250 Opened_files 3500 4 Opened_table_definitions 1250 Opened_tables 1250 Qcache_not_cached 400 1 Queries 2250 4 Questions 2250 4 Rpl_semi_sync_master_clients 35 Rpl_semi_sync_master_net_avg_wait_time 60000 Rpl_semi_sync_master_net_wait_time 400000 4 Rpl_semi_sync_master_net_waits 250 Rpl_semi_sync_master_no_times 35 Rpl_semi_sync_master_no_tx 35 Rpl_semi_sync_master_tx_avg_wait_time 35000 Rpl_semi_sync_master_tx_wait_time 35000 Rpl_semi_sync_master_tx_waits 35 Rpl_semi_sync_master_yes_tx 225 Select_scan 500 Table_locks_immediate 1500 Threads_created 70 Uptime 90000 1 1 # Table cache ################################################ Size | 256 Usage | 10% # Key Percona Server features ################################ Table & Index Stats | Not Supported Multiple I/O Threads | Enabled Corruption Resilient | Not Supported Durable Replication | Not Supported Import InnoDB Tables | Not Supported Fast Server Restarts | Not Supported Enhanced Logging | Not Supported Replica Perf Logging | Not Supported Response Time Hist. | Not Supported Smooth Flushing | Not Supported HandlerSocket NoSQL | Not Supported Fast Hash UDFs | Unknown # Percona XtraDB Cluster ##################################### # Plugins #################################################### InnoDB compression | ACTIVE # Query cache ################################################ query_cache_type | ON Size | 16.0M Usage | 0% HitToInsertRatio | 0% # Semisynchronous Replication ################################ master semisync status | master trace level | 32, net wait (more information about network waits) master timeout in milliseconds | 1000 master waits for slaves | ON master clients | master net_avg_wait_time | master net_wait_time | master net_waits | master no_times | master no_tx | master timefunc_failures | master tx_avg_wait_time | master tx_wait_time | master tx_waits | master wait_pos_backtraverse | master wait_sessions | master yes_tx | Slave | Disabled # Schema #####################################################
(4).慢查询日志分析统计
[root@node1 ~]# pt-query-digest /mydata/data/mysql-slow.log
(5).主从状态监测,提供给它一台mysql服务器的IP用户名密码,就可以分析出整个主从架构中每台服务器的信息,包括但不限于mysql版本,IP地址,server ID,mysql服务的启动时间,角色(主/从),Slave Status(落后于主服务器多少秒,有没有错误,slave有没有在运行)。
[root@node1 ~]# pt-slave-find --host=localhost --user=root Cannot connect to h=192.168.1.202,u=root localhost Version 5.5.33-log Server ID 1 Uptime 42:09 (started 2013-08-24T22:37:38) Replication Is not a slave, has 1 slaves connected, is not read_only Filters Binary logging MIXED Slave status Slave mode STRICT Auto-increment increment 1, offset 1 InnoDB version 5.5.33
(6).mysql死锁监测
[root@node1 ~]# pt-duplicate-key-checker --database=world h='127.0.0.1' --user=root --password=123456
(7).监测从库的复制延迟
[root@node1 ~]# pt-slave-delay --host 192.168.1.202 --user=root --password=123456
注,简单说明就到这里,想学习更详细的内容,命令的使用可以通过--help获知
九、Mysql 复制注意事项
注,在主-从架构上建议使用的配置
master:
sync_binlog=1 # 立刻同步binlog innodb_flush_logs_at_trx_commit=1 #立刻刷新innodb日志 slave: skip_slave_start=1 #设置开机不同步 read_only=1 #设置为只读
十、Mysql 复制过滤
master:
binlog-do-db=mydb binlog-ignore-db=mysql slave: replicate_do_db rpplicate_ignore_db replicate_do_table replicate_ignore_table replicate_wild_do_table replicate_wild_ignore_table
测试一下:
在从服务器上只复制testdb一个数据库
slave:
[root@node2 ~]# vim /etc/my.cnf [mysqld] replicate_do_db=testdb replicate_do_db=mysql [root@node2 ~]# service mysqld restart Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS!
master:
mysql> create database mydb1; Query OK, 1 row affected (0.34 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mydb1 | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec)
slave:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
注,大家可以看到没有同步mydb1,再测试一下。
master:
mysql> create database testdb; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mydb1 | | mysql | | performance_schema | | test | | testdb | +--------------------+ 7 rows in set (0.00 sec) slave: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | | testdb | +--------------------+ 6 rows in set (0.00 sec)
注,大家可以看到同步了testdb,好了到这里所有演示全部完成,希望大家有所收获。^_^……