MYSQL5.6/5.0管理之主从同步管理 及搭建主从库

MYSQL管理之主从同步管理

MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙述mysql主从的管理。

MYSQL主从同步的作用

(1)数据分布
(2)
负载平衡(load balancing)
(3)
备份
(4)
高可用性(high availability)和容错

MYSQL主从同步的原理

关于MYSQL的主从同步,最主要的是要了解MYSQL的主从同步是如何工作的也即主从同步的原理,通过下图能很明白的指导其工作的过程:

MYSQL5.6/5.0管理之主从同步管理 及搭建主从库

大致描述一下过程:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,然后通过SQL线程来在从上执行中继日志中的内容,从而使从库和主库保持一致。主从同步的详细过程如下:

1.主服务器验证连接。

2.主服务器为从服务器开启一个线程。

3.从服务器将主服务器日志的偏移位告诉主服务器。

4.主服务器检查该值是否小于当前二进制日志偏移位。

5.如果小于,则通知从服务器来取数据。

6.从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。

7.当主服务器有更新时,主服务器线程被**,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。

8.从服务器SQL线程执行二进制日志,随后进入睡眠状态。

MYSQL主从同步的搭建实战

主从同步的搭建是一项比较细的技术活,前期做好了一些事情会让你在以后的工作中减少很多工作,搭建的时候需要注意一些问题,一会搭建的时候会一边搭建一边介绍需要注意的问题,让初学者能在刚开始的时候就有效的规避掉一些潜在的问题(MYSQL安装这里不做介绍):

1.主从同步环境介绍

操作系统环境:Centos 5.5 64 bit

MYSQL版本:MYSQL 5.6.50

主服务器的IP:10.1.1.75

从服务器的IP:10.1.1.76

2.在主服务器上建立同步帐号

GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'10.1.1.%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

配置MySQL主服务器的my.cnf文件 windows下查看mysql cmd窗口属性 后的ini参数路径
vi /etc/my.cnf #编辑配置文件,在[mysqld]部分添加下面内容
server-id=1 #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
log_bin=mysql-bin #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=osyunweidb #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql #不同步mysql系统数据库
log_bin_trust_function_creators=1

修改配置时最好 stop mysql在更改my.conf
然后在启动mysql服务。
在主库配置binlog-ignore-db=mysql 在从库也要配置相应的replicate-ignore-db=mysql


注意:大家在设置权限的时候不要将密码设置过于简单!

3.从服务器配置文件的更改(加到 [mysqld] 标签下 否则可能不生效)

server-id = 2

binlog-do-db=osyunweidb #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql #不同步mysql系统数据库,如果有多个数据库,可重复此参数,每个数据库一行

replicate-wild-ignore-table=mysql.%

log-slave-updates=1#这个有需要可以开启,如果需要在当前的库下挂载其他从库就开启这个

log_bin_trust_function_creators=1

注意:

1)server-id这一项需要认真检查,一定不能和主服务器冲突了,不然到时候会出现莫民其妙的问题,因为同步的时候会会根据server-id做判断,如果server-id一样就不进行同步了,不然可能会导致死循环(主主同步或者环状同步的时候)

2)有的人会感觉奇怪我这里为什么要使用replicate-wild-ignore-table参数,而不是用replicate-do-db或者replicate-ignore-db来过滤需要同步的数据库和不需要同步的数据库。这里有几个原因:

A.replicate-wild-ignore-table参数能同步所有跨数据库的更新,比如replicate-do-db或者replicate-ignore-db不会同步类似

use mysql;

UPDATE test.aaa SET amount=amount+10;

B.replicate-wild-ignore-table=mysql.%在以后需要添加同步数据库的时候能方便添加而不需要重新启动从服务器的数据库。因为以后很可能需要同步其他的数据库。

3)auto_increment_incrementauto_increment_offset参数,这两个参数一般用在主主同步中,用来错开自增值,防止键值冲突

4)--slave-skip-errors参数,不要胡乱使用这些跳过错误的参数,除非你非常确定你在做什么。当你使用这些参数时候,MYSQL会忽略那些错误,这样会导致你的主从服务器数据不一致。

4.从主服务器得到一个快照版本

如果你的是MYISAM或者既有MYISAM又有INNODB的话就在主服务器上使用如下命令导出服务器的一个快照:

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

试过只有INNODB的话就是用如下命令:

mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

这里需要注意几个参数的使用:

--single-transaction这个参数只对innodb适用。

--databases后面跟除mysql以后的其他所有数据库的库名,我这里只有一个test库。

--master-data参数会记录导出快照时候的mysql二进制日志位置,一会会用到。

5.将快照版本还原到从服务器上

mysqldump -uroot -p -h 10.1.1.76 test < db.sql

将快照版本还原到从服务器上以后,此时从服务器上的数据和主服务器的数据是一致的。

6.在从服务器上使用change master从主服务器上同步

使用grep命令查找到二进制日志的名称以及位置

[[email protected] ~]# grep -i "change master" db.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

生成CHANGE MASTER语句,然后在从上执行

STOP SLAVE;

CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

START SLAVE;

这样就完成了主从同步的搭建,最后使用SHOW SLAVE STATUS\G;查看Slave_IO_Running和Slave_SQL_Running的状态,如果都为Yes,就大功告成了。

注意:不要将同步的信息写入配置文件中,不方便管理,尤其是有变动需要重启。

MYSQL主从同步的管理

这里介绍一些管理MYSQL主从同步的命令:

1.停止MYSQL同步

STOP SLAVE IO_THREAD;#停止IO进程

STOP SLAVE SQL_THREAD;#停止SQL进程

STOP SLAVE;#停止IO和SQL进程

2.启动MYSQL同步

START SLAVE IO_THREAD;#启动IO进程

START SLAVE SQL_THREAD;#启动SQL进程

START SLAVE;#启动IO和SQL进程

3.重置MYSQL同步

RESET SLAVE;

用于让从属服务器忘记其在主服务器的二进制日志中的复制位置,它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不需要主从的时候可以在从上执行这个操作。不然以后还会同步,可能会覆盖掉你的数据库,我以前就遇到过这样傻叉的事情。哈哈!

4.查看MYSQL同步状态

SHOW SLAVE STATUS;

这个命令主要查看Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Last_IO_Error、Last_SQL_Error这些值来把握复制的状态。

5.临时跳过MYSQL同步错误

经常会朋友mysql主从同步遇到错误的时候,比如一个主键冲突等,那么我就需要在确保那一行数据一致的情况下临时的跳过这个错误,那就需要使用SQL_SLAVE_SKIP_COUNTER =n命令了,n是表示跳过后面的n个事件,比如我跳过一个事件的操作如下:

STOP SLAVE;

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

START SLAVE;

6.从指定位置重新同步

有的时候主从同步有问题了以后,需要从log位置的下一个位置进行同步,相当于跳过那个错误,这时候也可以使用CHANGE MASTER命令来处理,只要找到对应的LOG位置就可以,比如:

CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;

START SLAVE;

MYSQL主从同步的管理经验介绍

1.不要乱使用SQL_SLAVE_SKIP_COUNTER命令。

这个命令跳过之后很可能会导致你的主从数据不一致,一定要先将指定的错误记录下来,然后再去检查数据是否一致,尤其是核心的业务数据。

2.结合percona-toolkit工具pt-table-checksum定期查看数据是否一致。

这个是DBA必须要定期做的事情,呵呵,有合适的工具何乐而不为呢?另外percona-toolkit还提供了对数据库不一致的解决方案,可以采用pt-table-sync,这个工具不会更改主的数据。还可以使用pt-heartbeat来查看从服务器的复制落后情况。具体的请查看:http://blog.chinaunix.net/uid-20639775-id-3229211.html

3.使用replicate-wild-ignore-table选项而不要使用replicate-do-db或者replicate-ignore-db

原因已经在上面做了说明。

4.将主服务器的日志模式调整成mixed

5.每个表都加上主键,主键对数据库的同步会有影响尤其是居于ROW复制模式。



参考文: 锁表等相关命令

MySQL的主从同步是一个很成熟的架构,优点为:
①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;
②在从主服务器进行备份,避免备份期间影响主服务器服务;
③当主服务器出现问题时,可以切换到从服务器。
所以我在项目部署和实施中经常会采用这种方案.

+ 数据库目录及其它
my.cnf配置文件 <wbr><wbr>/etc/my.cnf</wbr></wbr>
mysql数据库位置 <wbr><wbr>datadir=/var/lib/mysql</wbr></wbr>

主数据库:192.168.2.119
从数据库:192.168.2.220
操作系统:RHEL5.x 32位
服务器类型: 虚拟机

+ mysql5.0.77 安装:
① 配置好linux的yum服务后,直接yum -y install mysql即可
附:安装php\mysql一条命令安装:yum -y install httpd php mysql mysql-server php-mysql

② 启动MySQL
service mysqld start(restart|stop)


一、设置主库
1、修改主库my.cnf,主要是设置个不一样的id和logbin(#这部可依具体环境而定,压力大的化可采用huge.cnf)
[[email protected] etc]#vi /etc/my.cnf
# 记住这部分一定要配置在[mysqld]后面,否则无法找到从节点,各个配置项的含义可自己查阅文档
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql

2、启动主库生效
[[email protected] etc]service mysqld restart

3、登陆主库
[[email protected] etc]mysql -u root -p

4、赋予从库权限帐号,允许用户在主库上读取日志
mysql> grant all privileges on *.* to '用户名'@'%' identified by '密码';<wbr></wbr>

5、检查创建是否成功
select user,host from mysql.user;

6、锁主库表<wbr></wbr>
mysql> flush tables with read lock;<wbr></wbr>

7、显示主库信息
记录File和Position,从库设置将会用到
mysql> show master status;
+------------------+----------+--------------+------------------+
| File <wbr><wbr><wbr><wbr><wbr><wbr>| Position | Binlog_Do_DB | Binlog_Ignore_DB |</wbr></wbr></wbr></wbr></wbr></wbr>
+------------------+----------+--------------+------------------+
| mysql-bin.000001 98 <wbr>| <wbr><wbr><wbr><wbr><wbr><wbr><wbr>| <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>|<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# 说明,如果执行这个步骤始终为Empty set(0.00 sec),那说明前面的my.cnf没配置对。

8、另开一个终端登陆220,打包主库迁移数据(如果你使用的yum安装,有默认数据库并未做任何改动,则不需要进行拷贝)
目的是为了保证两台服务器的mysql数据库一致,这里可以自行tar打包或者使用mysqldump命令备份恢复的方式进行。


二、设置从库
1、传输拿到主库包、解包
# 登陆从库
从上一步中备份的数据库恢复到220服务器节点上。

2、在119节点上解锁主库表(对应第一点设置主库中第6步锁主库表的操作)<wbr></wbr>
mysql> unlock tables;<wbr></wbr>

3、在220节点上修改从库my.cnf(位置一样)
[[email protected] etc]vi my.cnf<wbr></wbr>
# 记住这部分一定要配置在[mysqld]后面,否则无法找到从节点,各个配置项的含义可自己查阅文档
[mysqld]
log-bin=mysql-bin
server-id=2
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

master-host=192.168.2.119
master-user=root
master-password=pfingo

4、在220节点上验证连接主库
[[email protected] etc]mysql -h 192.168.2.119 -u 用户名 -p<wbr></wbr>

5、在220节点从库上设置同步
#设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position
#注意下面第二条命令语句中的master_log_file='mysql-bin.000001', master_log_pos=98;对应为前面在主库中执行的show master status;结果
mysql> slave stop;
mysql> change master to master_host='192.168.2.119',master_user='root',master_password='pfingo',master_log_file='mysql-bin.000001', master_log_pos=98;
mysql> slave start;

6、启动从库服务
mysql> slave start;

7、进行测试
在主库上的test库上建立名为myTest的表
mysql> CREATE TABLE `myTest` (
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 20 ) NOT NULL ,
`password` CHAR( 32 ) NOT NULL ,
`last_update` DATETIME NOT NULL ,
`number` FLOAT( 10 ) NOT NULL ,
`content` TEXT NOT NULL ,
PRIMARY KEY ( `id` )<wbr></wbr>
) ENGINE = MYISAM ;

在从表中马上看到了效果,主从同步成功了;
为了更进一步验证在从库上输入show slave status\G;
mysql> show slave status\G;
Slave_IO_Running: Yes(网络正常);
Slave_SQL_Running: Yes(表结构正常)

进一步验证了以上过程的正确性。

更高效复杂的主从库 结构 搭建请参考另外一篇:
高性能Mysql主从架构的复制原理及配置详解

http://blog.csdn.net/truelove12358/article/details/50469188