码迷,mamicode.com
首页 > 数据库 > 详细

MySQL(十四)

时间:2015-09-06 07:27:57      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:mysql、数据库

一、MySQL复制概述

1、复制进程

   Mysql的复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(SQL进程和IO进程),另外一个进程在 Master(IO进程)上。 要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。同时Slave还要开启中继日志,用来从Master同步二进制日志。

复制的基本过程如下:

  • Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; 

  • Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置; 

  • Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”; 

  • Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。 


2、复制实现级别

   Mysql的复制可以是基于一条语句(Statement level),也可以是基于一条记录(Row level),可以在Mysql的配置参数中设定这个复制级别,不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。

  • Row Level:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。

优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及 trigger的调用和触发无法被正确复制的问题。

缺点:row level下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update product set owner_member_id = ‘b’ where owner_member_id = ‘a’,执行之后,日志中记录的不是这条update语句所对应额事件(mysql以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候,产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。

  • Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。

优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能。因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。

缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于Mysql现在发展比较快,很多的新功能不断的加入,使mysql得复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能真确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。

  • Mixed:混合模式

   Mysql提供了除Statement Level和Row Level之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在Mixed模式下,Mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。


3、复制常用架构

  • 一主一从

   Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要master和slave的压力不是太大(尤其是slave端压力)的话,异步复制的延时一般都很少很少。尤其是自slave端的复制方式改成两个进程处理之后,更是减小了slave端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用,只需要通过廉价的pc server来扩展slave的数量,将读压力分散到多台slave的机器上面,即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。

技术分享

  • 一主多从

   一个Master带多个slave的架构实施非常简单,多个slave和单个slave的实施并没有太大区别。在Master端并不care有多少个 slave连上了master端,只要有slave进程通过了连接认证,向他请求binlog信息,他就会按照连接上来的io进程的要求,读取自己的 binlog信息,返回给slave的IO进程。对于slave的配置细节,在Mysql的官方文档上面已经说的很清楚了,甚至介绍了多种实现slave 的配置方法。 

技术分享

为减低主服务器的复制压力,还可以使用级联复制的方式工作,下图就是其工作原理:

技术分享


  • 双主模型

   Mysql也可以搭建成dual master模式,也就是说两个Mysql instance互为对方的Master,也同时为对方的Slave。不过一般这种架构也是只有一端提供服务,避免冲突问题。因为即使在两边执行的修改有先后顺序,由于复制的异步实现机制,同样会导致即使在晚做的修改也可能会被早做的修改所覆盖,就像如下情形:

时间点 Mysql A Mysql B

1 更新x表y记录为10

2 更新x表y记录为20

3 获取到A日志并应用,更新x表的y记录为10(不符合期望)

4 获取B日志更新x表y记录为20(符合期望)

   这样,不仅在B库上面的数据不是用户所期望的结果,A和B两边的数据也出现了不一致的情况。除非能将写操作根据某种条件固定分开在A和B两端,保证不会交叉写入,才能够避免上面的问题。

技术分享

  • 双主带从服务器的Master-Master结构(Master-Master with Slaves) 

这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。

技术分享


二、一主一从环境配置

   实验前关于数据库版本的说明:双方的MySQL要一致,如果不一致:主的要低于从的,同时两台机器上的时间必须一致。

主从服务器数据的起始点:

  • 双方都从0开始做主从复制,若数据量较小可以使用此类操作,若数据很大就用下面的方法。

  • 主服务器已经运行一段时间,并且存在不小的数据集。方法是把主服务器备份,然后在从服务恢复,从主服务器上备份时所处的位置开始复制;


1、实验环境


hostnameIP数据库版本Linux
masterexample.com192.168.1.8MariaDB-10.0.21CentOS 6.6
slaveSlave192.168.1.9MariaDB-10.0.21CentOS 6.6


2、从0开始做主从复制

主机器的实验环境准备:

[root@example.com ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@example.com ~]# vim /etc/my.cnf
log-bin=/data/binlog/master-bin    //正常中一定要将文件放在与数据文件不同的物理设备。
server-id       = 1
sync_binlog  = 1   //启用一旦有事务提交时立即将缓冲区的内容同步到二进制日志。
[root@example.com ~]# mkdir /data/binlog
[root@example.com ~]# chown -R mysql.mysql /data/binlog
[root@example.com ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

我们还可以手动设置同步二进制日志,这样做会损失一定的写性能:

MariaDB [(none)]> set global sync_binlog=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show global variables like ‘sync_binlog‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)

建议在设置前最好将自动提交的功能给关闭:

MariaDB [(none)]> set global autocommit=0;
Query OK, 0 rows affected (0.17 sec)

MariaDB [(none)]> show global variables like ‘autocommit‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

从机器的实验环境准备:

[root@Slave ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@Slave ~]# vim /etc/my.cnf 
#log-bin=mysql-bin    //一定要将从的二进制日志文件取消
#binlog_format=mixed
server-id       = 2    //server-id一定不能和主的相同
relay_log       = /data/relaylog/relay-bin   //正常中一定要将文件放在与数据文件不同的物理设备。
read_only         = 1   //限制从服务器只读
[root@Slave ~]# mkdir /data/relaylog
[root@Slave ~]# chown -R mysql.mysql /data/relaylog
[root@Slave ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

设置从服务器为只读的方法也可以使用在命令行手动配置:

MariaDB [(none)]> show global variables like ‘read_only‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+
1 row in set (0.08 sec)

MariaDB [(none)]> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

注意:read_only仅能限制那不具有SUPER权限用户无法执行写操作;

主机器的数据库授权等操作:

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO ‘repluser‘@‘192.168.1.9‘ IDENTIFIED BY ‘redhat‘;     //创建有复制权限的帐号
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+---------
| Id | User | Host      | db   | Command | Time | State | Info             | Progress
+----+------+-----------+------+---------+------+-------+------------------+---------
|  4 | root | localhost | NULL | Query   |    0 | init  | show processlist |    0.000
+----+------+-----------+------+---------+------+-------+------------------+---------
1 row in set (0.00 sec)

MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      639 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

从服务器连接主服务器:

MariaDB [(none)]> show global variables like ‘%relay%‘;   //查看中继日志是否启用
+-----------------------+--------------------------+
| Variable_name         | Value                    |
+-----------------------+--------------------------+
| max_relay_log_size    | 1073741824               |
| relay_log             | /data/relaylog/relay-bin |
| relay_log_index       |                          |
| relay_log_info_file   | relay-log.info           |
| relay_log_purge       | ON                       |
| relay_log_recovery    | OFF                      |
| relay_log_space_limit | 0                        |
| sync_relay_log        | 0                        |
| sync_relay_log_info   | 0                        |
+-----------------------+--------------------------+
9 rows in set (0.01 sec)

MariaDB [(none)]> change master to master_host=‘192.168.1.8‘,master_user=‘repluser‘,master_password=‘redhat‘;  //连接主服务器
Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> start slave;   //启动从服务器
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show slave status\G;   //查看是否启动
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.8                  #Master服务器地址
                  Master_User: repluser                       #连接Master服务器用户名
                  Master_Port: 3306                             #Master服务器监听端口
                Connect_Retry: 60                               #重试时间间隔
              Master_Log_File: master-bin.000001   #I/O线程读取的二进制日志文件
          Read_Master_Log_Pos: 639                      #I/O线程读取的二进制日志文件事件位置
               Relay_Log_File: relay-bin.000002        #SQL线程正在读取的中继日志文件
                Relay_Log_Pos: 927                            #SQL线程读取和执行的中继日志文件事件位置
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes                         #Slave服务器IO线程状态
            Slave_SQL_Running: Yes                        #Slave服务器SQL线程状态
              Replicate_Do_DB:                                #下面Replicate开头的表示用来指明哪些库或者表在复制时不需要同步
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0                                    #SQL线程读取日志参数的错误数量
                   Last_Error:                                        #SQL线程读取日志参数的错误消息
                 Skip_Counter: 0                                #最近被用于SQL_SLAVE_SKIP_COUNTER的值
          Exec_Master_Log_Pos: 639
              Relay_Log_Space: 1218                        #所有原有中继日志的总大小
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No                    #是否允许对Master服务器进行SSL连接
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0                    #落后于Master服务器的时间
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
               Master_SSL_Crl:
           Master_SSL_Crlpath:
                   Using_Gtid: No
                  Gtid_IO_Pos:
1 row in set (0.00 sec)

验证是否能够达到主从复制:

查看从服务器的线程。

MariaDB [testdb]> show processlist;
+----+----------+-------------------+--------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
| Id | User     | Host              | db     | Command     | Time | State                                                                 | Info             | Progress |
+----+----------+-------------------+--------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
|  4 | root     | localhost         | testdb | Query       |    0 | init                                                                  | show processlist |    0.000 |
|  5 | repluser | 192.168.1.9:50797 | NULL   | Binlog Dump | 1253 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |    0.000 |
+----+----------+-------------------+--------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
2 rows in set (0.00 sec)

在主服务器上创建数据。

MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+---------------------+
| Database            |
+---------------------+
| #mysql50#lost+found |
| information_schema  |
| mysql               |
| performance_schema  |
| test                |
| testdb              |
+---------------------+
6 rows in set (0.01 sec)

MariaDB [(none)]> use testdb
Database changed

MariaDB [testdb]> create table tt(name char(30));
Query OK, 0 rows affected (0.05 sec)

MariaDB [testdb]> insert into tt values (‘bols‘);
Query OK, 1 row affected (0.01 sec)

从服务器查看主从是否同步:

MariaDB [(none)]> show databases;
+---------------------+
| Database            |
+---------------------+
| #mysql50#lost+found |
| information_schema  |
| mysql               |
| performance_schema  |
| test                |
| testdb              |
+---------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> use testdb
Database changed

MariaDB [testdb]> select * from tt;
+------+
| name |
+------+
| bols |
+------+
1 row in set (0.00 sec)

3、半路复制

环境的搭建和前面的 一样就不介绍了,下面就关于两者不同的地方做下演示,下面添加新的数据。:

MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use testdb
Database changed

MariaDB [testdb]> create table tt(name char(20));
Query OK, 0 rows affected (0.11 sec)

MariaDB [testdb]> insert into tt values(‘bols‘),(‘longls‘);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

备份数据并传送到从服务器上:

[root@example.com ~]# mysqldump -uroot -hlocalhost -p --all-databases --flush-logs --master-data=2 --lock-all-tables > /tmp/all.sql
Enter password: 
[root@example.com ~]# scp /tmp/all.sql root@192.168.1.9:/root
导入数据:
[root@Slave ~]# mysql < all.sql 
[root@Slave ~]# head -30 all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=‘master-bin.000002‘, MASTER_LOG_POS=367;

MariaDB [mysql]> show slave status\G;   //一定要将从服务器的服务给关闭了。
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.1.8
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 1057
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 1345
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
MariaDB [mysql]> change master to master_host=‘192.168.1.8‘,master_user=‘repluser‘,master_password=‘redhat‘,master_log_file=‘master-bin.000002‘,master_log_pos=367;
Query OK, 0 rows affected (0.04 sec)

MariaDB [mysql]> start slave;
Query OK, 0 rows affected (0.00 sec)

查看信息是否同步:

MariaDB [hellodb]>  select * from testdb.tt;
+--------+
| name   |
+--------+
| bols   |
| longls |
+--------+
2 rows in set (0.00 sec)

三、基于半同步方式工作的一主多从架构

   前面我们已经说到了,在使用主从架构时为了提高性能故其是基于异步通信方式进行工作的,这种方式工作有种致命缺陷就是有有长时间的工作,从服务器上的数据和主服务器上的数据极有可能不一致,我们可以使用一些工具进行强行同步数据,也可以手动同步数据,下面介绍一个有谷歌提供的能让其能基于半同步状态工作的插件。semi-synchronously,这种插件只能工作唉MySQL5.5版本以上的数据库。而实际工作中若一旦某次等待超时,会自动降级为异步;

查看数据库是否支持半同步:

[root@example.com ~]# ls /usr/local/mysql/lib/plugin/semisync_*
/usr/local/mysql/lib/plugin/semisync_master.so
/usr/local/mysql/lib/plugin/semisync_slave.so

主服务器上安装master插件:

MariaDB [(none)]> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
Query OK, 0 rows affected (0.09 sec)

MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> set global rpl_semi_sync_master_timeout=2000;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show global variables like ‘%semi%‘;
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 2000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
4 rows in set (0.00 sec)

rpl_semi_sync_master_enabled:主节点是否启动

rpl_semi_sync_master_timeout:等待超时时间,单位ms

从服务安装插件:

MariaDB [(none)]>  install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.08 sec)

MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show global variables like ‘%semi%‘;
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

MariaDB [(none)]> stop slave io_thread;
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)

测试半同步是否工作:

MariaDB [testdb]> create table t1(name char(20));
Query OK, 0 rows affected (0.12 sec)

MariaDB [testdb]> create table t2(name char(20));
Query OK, 0 rows affected (0.04 sec)

MariaDB [testdb]> show global status like ‘%semi%‘;  //第一项为1说明已工作
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 390   |
| Rpl_semi_sync_master_net_wait_time         | 781   |
| Rpl_semi_sync_master_net_waits             | 2     |
| 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      | 324   |
| Rpl_semi_sync_master_tx_wait_time          | 648   |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)


四、主从复制的复制过滤器

   在使用复制过滤器时虽然在主上设置会有好的性能,但是其有一个致命缺陷就是造成数据的缺失,而一般使用还是在从服务器上设置,虽然有一定的性能损失,但是数据得到可保障。

1、主上参数设置

  • binlog_do_db=     //数据库白名单

  • binlog_ignore_db=    //数据库黑名单


2、从上参数设置

  • replicate_do_db=    //数据库白名单

  • replicate_ignore_db=   //数据库黑名单

  • replicate_do_table= db_name.table_name    //表的白名单

  • replicate_ignore_table=db_name.table_name    //表的黑名单

  • replicate_wild_do_table=      //基于通配符来指定表的白名单

  • replicate_wild_ignore_table=   //基于通配符来指定表的黑名单


五、双主模型

在IP为192.168.1.8的主机做以下配置:

[root@example.com ~]# /etc/init.d/mysqld stop
Shutting down MySQL... SUCCESS!
[root@example.com ~]# vim /etc/my.cnf
log-bin=/data/binlog/master-bin
binlog_format=mixed
relay_log = /data/relaylog/relay-bin
auto-increment-offset = 1    //起始值
auto-increment-increment = 2   //步长
skip_slave_start    //跳过自动启动slave,从而手动启动slave
[root@example.com ~]# mkdir /data/relaylog
[root@example.com ~]# chown -R mysql.mysql /data/relaylog
[root@example.com ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

IP为192.168.1.9的主机做以下设置:

[root@Slave ~]# /etc/init.d/mysqld stop
Shutting down MySQL... SUCCESS! 
[root@Slave ~]# vim /etc/my.cnf
log-bin=/data/binlog/master-bin
binlog_format=mixed
server-id       = 2
auto-increment-offset = 2  
auto-increment-increment = 2
relay_log       = /data/relaylog/relay-bin
skip_slave_start
[root@Slave ~]# mkdir /data/binlog
[root@Slave ~]# chown -R mysql.mysql /data/binlog
[root@Slave ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

登录192.168.1.8的mysql做以下设置:

MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 |      327 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> select User,Host,Password from mysql.user;
+----------+-------------+-------------------------------------------+
| User     | Host        | Password                                  |
+----------+-------------+-------------------------------------------+
| root     | localhost   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | example.com | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | 127.0.0.1   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | ::1         | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| repluser | 192.168.1.9 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+----------+-------------+-------------------------------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> change master to master_host=‘192.168.1.9‘,master_user=‘repluser‘,master_password=‘redhat‘,master_log_file=‘master-bin.000001‘,master_log_pos=649;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.08 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.9
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 649
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 536
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

IP为192.168.1.9的主机做以下设置:

MariaDB [(none)]>  grant replication slave,replication client on *.* to ‘repluser‘@‘192.168.1.8‘ identified by ‘redhat‘;
Query OK, 0 rows affected (0.11 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select User,Host,Password from mysql.user;
+----------+-------------+-------------------------------------------+
| User     | Host        | Password                                  |
+----------+-------------+-------------------------------------------+
| root     | localhost   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | example.com | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | 127.0.0.1   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root     | ::1         | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| repluser | 192.168.1.8 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+----------+-------------+-------------------------------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> change master to master_host=‘192.168.1.8‘,master_user=‘repluser‘,master_password=‘redhat‘,master_log_file=‘master-bin.000004‘,master_log_pos=327;
Query OK, 0 rows affected (0.12 sec)

MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      649 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.8
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 327
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 536
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

验证是否同步:

192.168.1.8的服务器做以下操作:

MariaDB [newdb]> create table tt(id int unsigned not null primary key auto_increment,name char(20));
Query OK, 0 rows affected (0.09 sec)

MariaDB [newdb]> insert into tt(name) values(‘longls‘),(‘bols‘);
Query OK, 2 rows affected (0.13 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [newdb]> select * from tt;
+----+--------+
| id | name   |
+----+--------+
|  1 | longls |
|  3 | bols   |
+----+--------+
2 rows in set (0.00 sec)

192.168.1.9的服务器做以下操作:

MariaDB [newdb]> insert into tt(name) values(‘xiaozels‘),(‘cangls‘);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [newdb]> select * from tt;
+----+----------+
| id | name     |
+----+----------+
|  1 | longls   |
|  3 | bols     |
|  4 | xiaozels |
|  6 | cangls   |
+----+----------+
4 rows in set (0.07 sec)

六、知识点

1、复制相关的文件:

  master.info: 文本文件,保存从服务器连接至主服务时所需要的信息,每行一个值;

  relay-log.info: 文本文件,保存了复制位置:包括二进制日志和中继日志的文件及位置;

2、为了复制的安全性可以做以下操作,但是会损失一定的性能

   sync_master_info = 1    

   sync_relay_log = 1  

   sync_relay_log_info = 1

3、percona-toolkit工具

   这是有percona提供的一款工具包,能执行很多命令,其中当从服务器意外崩溃时,建议使用pt-slave-start命令来启动slave。

评估主从服务表中的数据是否一致:pt-table-checksum。


4、如果数据不一致,解决办法

  • 重新备份并在从服务器导入数据;

  • 使用pt-table-sync工具同步数据

5、为了提高复制时的数据安全性,在主服务器上的设定

   sync_binlog = 1

   innodb_flush_log_at_trx_commit = 1

   此参数的值设定为1,性能下降会较严重;因此,一般设定为2等,此时,主服务器崩溃依然有可能导致从服务器无法获取到全部的二进制日志事件;

6、如果master意外崩溃导致二进制日志中的某事件损坏,可以在从服务器使用如下参数忽略:

   sql_slave_skip_counter = 0




本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1691666

MySQL(十四)

标签:mysql、数据库

原文地址:http://cuchadanfan.blog.51cto.com/9940284/1691666

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!