天天看点

mysql主从复制无忧(主从及主主配置全过程)

主从复制解决的是:让一台服务器数据与另外的服务器数据保持一致。

主从服务器的版本最好一致。(从服务器的版本也可以高于主服务器)

   主从同步的原理;

<a href="https://s5.51cto.com/wyfs02/M02/8C/D9/wKiom1h7BiCifzkEAAAvYX_FyYo375.png-wh_500x0-wm_3-wmp_4-s_3935880894.png" target="_blank"></a>

主从同步  涉及到3个 线程: 主服务器(master)I/O thread    和从服务器(slave)I/Othread  以及SQL thread

    实现mysql主从复制(同步)的本质:

        在主服务器上开启Mysql的binary-log(产生二进制日志文件)功能。

    整个复制过程:从服务器(slave)从主服务器端(master)获取该日志,然后在(slave)从服务器上将二进制文件解析成SQL语句并完全顺序地执行SQL语句所记录的各种操作。

    具体过程:

        1)从服务器上的I/O线程连接上主服务器,然后请求从指定日志文件的指定位置或者从最开始的日志位置之后的日志内容。

        2)从服务器在接收到来自从服务器的I/O线程请求后,,通过自身的I/O线程,根据请求信息读取指定日志位置之后的日志信息,

        并返回从服务器端的I/O线程,返回的信息中除了日志所包含的信息之外,还包括此次返回的信息在主服务器端对应二进制文件

        的名称以及在二进制日志中的位置。

        3)从服务器的I/O线程接收到信息后,将获取到的日志内容依次写入从服务器端的中继日志文件(relay)的最后,并且讲读取到的主服务器端的二进制日志的文件名和位置记录到一个名为master-info文件中,方便在下一次读取的时候能够迅速定位从哪个位

        置开始往后读取日志信息。

        4)从服务器的SQL线程在检测到中继日志文件中新增加了内容后,会马上解析该中继日志文件中的内容,将日志内容解析为SQL语句,然后在自身执行这些SQL,由于是在主服务器端和从服务器端执行了同样的SQL操作,所以两端的数据是完全一样的。

    实施分四步: 1.建立mysql主从服务器连接

                2.master开启 binarylog 功能

                3.master授权用户(用来在slave上面登录的)

                4.slave获取master信息。

实验过程:

    准备阶段:

        master 端

        ip :192.168.1.151   

        [root@www data]# mysqld -V   # 查看mysql版本

        mysqld  Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL)) 

        [root@www data]# uname -r

        2.6.32-642.11.1.el6.x86_64

        [root@www data]# cat /etc/issue

        CentOS release 6.8 (Final)

        slave  端

        ip ;192.168.1.123

        [root@jf6 data]# mysqld -V

        mysqld  Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL))

        [root@jf6 data]# uname -r

        [root@jf6 data]# cat /etc/issue

        统一数据库环境:(同步一个库文件 库名:swallow)

        master端

        [root@jf6 data]# service mysqld status

        SUCCESS! MySQL running (16394)

        进入数据库:

        [root@jf6 data]# mysql -uroot -p

        Enter password:

        mysql&gt;

        创建一个库名:swallow   表名  test   字段 id     插入数据  1

        mysql&gt; select * from swallow.test;

        +------+

        | id   |

        |    1 |

        复制这个库:

        [root@jf6 data]# mysqldump -uroot -p swallow &gt;mysql.sql

        Enter password: 

        将创建的数据库复制到slave端下

        [root@jf6 data]# scp mysql.sql [email protected]:/root/

                [email protected]'s password: 

                mysql.sql                                                             100% 1784     1.7KB/s   00:00 

        slave 端:

        [root@www data]# mysql -uroot -p

        mysql&gt; create database swallow;       

        mysql&gt; use swallow

        Database changed

        mysql&gt; source /root/mysql.sql;

    开启主从复制配置模式:

        master端:

        vim /etc/my.cnf

            server-id       = 1    #属于标识符,区别数据库

            log-bin=mysql-bin       #开启binarylog 功能生成 二进制文件

            binlog-do-db=swallow    # 指明要同步的库

        重启mysql。

    复制同步的第一条件:2个mysql服务器可以互通,采用授权的方式。

        mysql&gt; grant replication slave on *.* to 'slave123'@'192.168.1.123' identified by '123456';

        (  replication slave 赋予取得 二进制日志的权利         )

            server-id      =2 

        重启mysql

            测试连通性: 

            [root@www ~]# mysql -h 192.168.1.151 -u slave123 -p123456

            Welcome to the MySQL monitor.  Commands end with ; or \g.

            Your MySQL connection id is 3

            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&gt; 

            可以连接上master端。

    开启slave服务器:目的是探知 master服务器的二进制文件的名称和开始点

        首先查询 master状态:(取得二进制文件和开始点)

            master端

            mysql&gt; show master status;

            +------------------+----------+--------------+------------------+

            | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

            | mysql-bin.000002 |      107 | swallow      |                  |

            slave端

            mysql&gt; change master to \

            -&gt; master_host='192.168.1.151',              #指明master地址

            -&gt; master_user='slave123',                   #指明授权用户。可以连接master的用户

            -&gt; master_password='123456',                 #指明进入master的验证

            -&gt; master_log_file='mysql-bin.000002',       # 指明二进制文件

            -&gt; master_log_pos=107;                       #指明获取该文件的开始点

            mysql&gt; slave start;             #开启 slave  

            mysql&gt; slave start;

            Query OK, 0 rows affected (0.00 sec)

            mysql&gt; show slave status \G;

            *************************** 1. row ***************************

                           Slave_IO_State: Waiting for master to send event

                              Master_Host: 192.168.1.151     ######## master_host

                              Master_User: slave123          ######## master_user

                              Master_Port: 3306

                            Connect_Retry: 60

                          Master_Log_File: mysql-bin.000003

                      Read_Master_Log_Pos: 107               

                           Relay_Log_File: www-relay-bin.000003

                            Relay_Log_Pos: 253

                    Relay_Master_Log_File: mysql-bin.000003

                         Slave_IO_Running: Yes             ######### IOthread  正常

                        Slave_SQL_Running: Yes              ######## SQLthread  正常

        测试主从:

            master端:

                mysql&gt; use swallow

                mysql&gt; insert into test values(2);

                mysql&gt; insert into test values(3);

                mysql&gt; insert into test values(4);

            slave端:

                mysql&gt; select * from swallow.test;

                +------+

                | id   |

                |    1 |

                |    2 |

                |    3 |

                |    4 |

小贴士: 还有一种开启slave的方法:就是在mysql5.1 版本下  在配置文件中写入  master_host  master_user master_password  

        这3个参数。由于后期版本采用引擎(mysql5.5的默认存储引擎是)innodb,是不是myisam引擎(mysql5.1的版本)。

        所以,如果安装的版本高于5.1 不要这样做了。因为:引擎的变化。/etc/my.cnf主配置文件里面不支持上面3个参数。

        加入后,会造成slave服务器的mysql无法启动。

    顺手做个主主配置吧。(实质就是把刚才的配置主从交换下)

        slave端(这里沿袭上面的叫法。防止弄乱了)

            vim /etc/my.cnf

            log-bin=mysql-bin           #开启产生日志功能

            binlog-do-db=swallow        #定义同步库

            重启mysql服务

            mysql&gt; grant replication slave on *.* to 'slave151'@'192.168.1.151' identified by '123456'; 

            查看服务器状态:

            | mysql-bin.000002 |      265 | swallow      |                  |

            +------------------+----------+--------------+------------------+ 

        master端  (这里沿袭上面的叫法。防止弄乱了)

            测试连通性:

            [root@jf6 data]# mysql -h 192.168.1.123 -uslave151 -p123456

            Your MySQL connection id is 4

            mysql&gt;   

                            开启slave配置:

            -&gt; master_host='192.168.1.123', 

            -&gt; master_user='slave151', 

            -&gt; master_password='123456', 

            -&gt; master_log_file='mysql-bin.000002', 

            mysql&gt; show slave statu \G;

            ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'statu' at line 1

            ERROR: 

            No query specified

                       Slave_IO_State: Waiting for master to send event

                          Master_Host: 192.168.1.123

                          Master_User: slave151

                          Master_Port: 3306

                        Connect_Retry: 60

                      Master_Log_File: mysql-bin.000002

                  Read_Master_Log_Pos: 265

                       Relay_Log_File: jf6-relay-bin.000002

                        Relay_Log_Pos: 253

                Relay_Master_Log_File: mysql-bin.000002

                     Slave_IO_Running: Yes

                    Slave_SQL_Running: Yes

    测试方法:

        slave端:

            mysql&gt; use swallow

            mysql&gt; insert into test values(1);

            mysql&gt; insert into test values(2);

    两边交替插入数据;

        结果:

            mysql&gt; select * from test;        

            +------+

            | id   |

            |    1 |

            |    2 |

            |    3 |

            |    4 |

    这里需要注意的关键点:

        1.主服务器开启binarylog功能(log-bin=mysql-bin ),以及日志状态。

         mysql&gt; show master status;

        2.开启slave服务时:别忘了  开启slave。

        3.slave的状态监控:(如果IO 和SQL都OK 就OK了)

                   Slave_IO_Running: Yes

        如果是no:IO一般和权限之类有关系。因为IO负责2个服务之间通信

                    SQL 则是自己的原因。因为他的作用就是 从relay-log里面查看变化

                    转化成SQL  依照顺序写入 从服务器。

        4.主配置文件:  server-id  不要相同。

本文转自 swallow_zys  51CTO博客,原文链接:http://blog.51cto.com/12042068/1891922,如需转载请自行联系原作者