Mysql主从同步配置小记

来源:互联网 发布:网红淘宝店推荐 编辑:程序博客网 时间:2024/06/05 04:11

       本文是自己在工作过程中参考网络上大神们的经验记录下来的,为图省事,文中很大部分是属于别人的东西。

 

操作系统

     ip

  Mysql版本

主机(master

debian 6 

192.168.33.196

  5.1.49

从机(slave

centos 6.2 

172.22.22.219 

  5.1.67

  

  1.  原理

       将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

 

整体上来说,复制有3个步骤: 

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary   

   log events);
(2) slavemasterbinary log events拷贝到它的中继日志(relay log)
(3) slave重做中继日志中的事件,将改变反映它自己的数据。

   

        该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
       下一步就是slavemasterbinary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump processBinlog dump processmaster的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。    

        SQL slave threadSQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slavemaster中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。


2. 配置

      

1)主机配置

A. 知道数据库的my.cnf文件,一般这个文件在/etc/mysql下或者直接就在/etc目录下。比如centos就在/etc目录下

B. 用编辑器打开,在[mysqld]项目下加入以下行

server-id = 1
log-bin=mysql-bin
binlog-do-db=mysql1  #需要备份的数据库名,如果备份多个数据库,重复设置这个选项 即可
binlog-ignore-db=mysql2  #不需要备份的数据库名,如果备份多个数据库,重复设置这 个选项即可
log-slave-updates=1   #这个参数一定要加上,否则不会给更新的记录些到二进制文件
slave-skip-errors=1     #是跳过错误,继续执行复制操作(可选)

  然后保存退出。

C. 进入数据库建立从机用户

       mysql> grant replication slave on *.* to haitao@172.22.22.219 identified by 'pht';

此时,你可在Slave上做连接测试: mysql -h 主机ip -u haitao -p,如果输入密码”pht”后能够进入则表示用户已经创建成功。如果登陆后能看到的数据库跟主机的不一样,那么可能是用户权限不够,最简单的办法是在mysql的管理平台phpmyadmin里把mysql库里的userhaitao相应的各个权限按需更改NY即可。现在重启下Mysql吧,以确保更改的配置生效。

 D.锁定主库表   mysql> FLUSH TABLES WITH READ LOCK; 

 E.查看主库信息 mysql> SHOW MASTER STATUS;

正常情况效果应该如下(前两列数据不一定与下表相同)  

 ------------- +- ---------+------------------+---------------------+
| File           | Position | Binlog_do_db | Binlog_ignore_db |
+------------------+----------+--------------+------------------+---------+
| mysql-bin.000001 | 107   |    mysql1   |      mysql2    |
+------------------+----------+--------------+------------------+---------+
     F.将主库的现有数据拷贝到从库下,这是为了保证时间点之前的数据完全一致,且由于我们之前已经锁定表,所以也能保证不再配置过程中发生数据丢失或者冲突。复制用简单是scp即可。

 

 

引用别人说的,如下截图,说得更清楚些。

     

好啦,master端配置告一段落。

 (2)从机配置

      A. 打开从机配置my.cnf,[mysqld]下加入如下行并保存
     server-id=2

log-bin=mysql-bin

master-host=192.168.33.196

master-user=haitao

master-password=pht

replicate-ignore-db=mysql

master-connect-retry=60

log-slave-updates=1

    B. 重启mysql确保配置生效

C.进入mysql,然后关闭slave:  mysql>stop slave;

D.配置记录点以及主机的log文件

Mysql>CHANGE   MASTER   TO        

MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107; 

 

E. 打开slave: mysql>start slave;

    并查看slave状态 mysql> SHOW SLAVE STATUS\G



在这里主要是看:
 Slave_IO_Running=Yes
 Slave_SQL_Running=Yes

你可查看masterslave上线程的状态。在master上,你可以看到slaveI/O线程创建的连接:master上输入show processlist\G;

    

到目前为止已经完成了配置,你可以在主库中添加删除数据,看看从库是不是跟着发生变化了呢。

 

本文多段文字引自下文:http://blog.csdn.net/hguisu/article/details/7325124


0 0
原创粉丝点击