精华内容
下载资源
问答
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...当一master挂了,则将slave切换为master,继续工作。好,给定两台机器主机A:192.168.1.201主机B:192.168.1.202一、互为主从1...

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/socho/article/details/51804720

    解决Master单点问题,两台mysql互为主备,双向replication。当一master挂了,则将slave切换为master,继续工作。好,给定两台机器

    主机A:192.168.1.201

    主机B:192.168.1.202

    一、互为主从

    1.配置

    主机A上,vim /etc/my.cnf,添加:

    [mysqld]

    log-bin=mysql-bin

    server-id=1 #服务id要和B不同

    binlog_do_db=db1

    master-host = 192.168.1.202 #目标机器是B的地址

    master-user = user1

    master-password = pass1

    master-port = 3306

    master-connect-retry = 5

    主机B上,vim /etc/my.cnf,添加:

    [mysqld]

    log-bin=mysql-bin

    server-id=2 #服务id要和A不同

    binlog_do_db=db1

    master-host = 192.168.1.201 #目标机器是A的地址

    master-user = user1

    master-password = pass1

    master-port = 3306

    master-connect-retry = 5

    在A上开启binlog,创建复制帐号

    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO user1@'%' IDENTIFIED BY 'pass1';

    在B上开启binlog,创建复制帐号

    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO user1@'%' IDENTIFIED BY 'pass1';

    为了方便,我们将用户名和密码两台机器都设成一致的。

    在A上

    我们先在A上创建数据库db1,里面的表内容随便写点啥就行了:

    CREATE DATABASE db1;

    USE db1;

    CREATE TABLE `tb_2` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `name` varchar(64) DEFAULT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    INSERT INTO `tb_2` VALUES ('1', 'Michael');

    查看下信息

    mysql> show variables like 'ser%';

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

    | Variable_name | Value |

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

    | server_id | 1 |

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

    mysql> show master status;

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

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

    | mysql-bin.000001 | 447 | db1 | |

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

    可以看到A要同步的是db1数据库,当前bin-log编号是000001,位置是447。

    查看A的数据

    mysql> select * from tb_2;

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

    | id | name |

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

    | 1 | Michael |

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

    A有一条数据。

    在B上

    mysql> show variables like 'ser%';

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

    | Variable_name | Value |

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

    | server_id | 2 |

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

    mysql> show master status;

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

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

    | mysql-bin.000001 | 106 | db1 | |

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

    查看B的数据

    mysql> select * from tb_2;

    Empty set (0.00 sec)

    B还没有数据,目前未同步。位置是000001:106,一会从A上同步过来。

    2.开始同步

    配置中已有replication的配置了,只要两个机器重启就行了,自动相互复制。

    在A上

    service mysqld restart

    在B上

    service mysqld restart

    再在A上执行

    mysql> show slave status\G

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

    Slave_IO_State: Waiting for master to send event

    Master_Host: 192.168.1.202

    Master_User: user1

    Master_Port: 3306

    Connect_Retry: 5

    Master_Log_File: mysql-bin.000008

    Read_Master_Log_Pos: 106

    Relay_Log_File: mysqld-relay-bin.000001

    Relay_Log_Pos: 251

    Relay_Master_Log_File: mysql-bin.000008

    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: 106

    Relay_Log_Space: 552

    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:

    A中的Slave_IO_Running 和 Slave_SQL_Running两个值都是YES,说明配置成功了。

    B的配置就不贴了,也是配置成功的。

    如果同步不成功:

    用命令行的方式手动复制,比如在B上输入命令

    change master to

    master_host='192.168.1.201',

    master_port=3306,

    master_user='user1',

    master_password='pass1';

    然后使用start slave;开启从A向B的复制。

    还有指定从某个地址开始复制的话,加两个参数

    master_log_file='mysql-bin.000001',

    master_log_pos=106;

    反过来,要从B同步到A,就要在A上执行

    change master to

    master_host='192.168.1.202',

    master_port=3306,

    master_user='user1',

    master_password='pass1';

    同步好了之后,查看B的数据

    mysql> select * from tb_2;

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

    | id | name |

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

    | 1 | Michael |

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

    好的,现在A和B数据一致了。

    再看看A和B的状态

    A机器

    mysql> show master status;

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

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

    | mysql-bin.000001 | 447 | db1 | |

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

    B机器

    mysql> show master status;

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

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

    | mysql-bin.000001 | 106 | db1 | |

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

    B的bin-log位置没有变,还是000001:106,但是数据确实已经到了。

    3.在A和B上操作

    1.先把A当作Master,在A上操作数据

    从A上删除数据

    mysql> delete from tb_2 where name='Michael';

    Query OK, 1 row affected (0.00 sec)

    此时A的bin-log位置是000001:546,而到B查看数据

    mysql> select * from tb_2;

    Empty set (0.00 sec)

    确实已经同步删除了,不过B的bin-log位置依然是000001:106

    2.再把B当作Master,在B上操作数据

    INSERT INTO `tb_2`(name) VALUES ('Michael');

    Query OK, 1 row affected (0.00 sec)

    成功后,到A上去查

    mysql> select * from tb_2;

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

    | id | name |

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

    | 2 | Michael |

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

    A也同步到了数据,至此说明A和B互为主从,在一个上面修改数据,就会同步到另外一个机器上是可行的。

    查看下两机器状态

    这次A的bin-log地址没有变化,还是000001:546,而变的是B,成了000001:239了,说明从机只有变成主机数据被修改的时候,才会改变自己的bin-log地址,同步是不会改变bin-log地址的。

    接下来配置keepalived。

    二、KeepAlived

    上一步确保了互为主从设置成功后,接下来安装

    yum install keepalived

    看下版本

    [root@localhost ~]# keepalived -v

    Keepalived v1.2.13 (03/19,2015)

    1.配置

    然后在A服务器编辑KeepAlived的配置文件

    vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived

    global_defs {

    router_id HA_MySQL #标识,双主相同

    }

    vrrp_instance VI_1 {

    state BACKUP #注意,主从两端都配置成了backup,因为使用了nopreempt,即非抢占模式

    interface eth0

    virtual_router_id 51 #分组,主备相同

    priority 100 #优先级,这个高一点则先把它作为master

    advert_int 1

    nopreempt #不主动抢占资源,设置非抢占模式

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    virtual_ipaddress {

    192.168.1.199

    }

    }

    virtual_server 192.168.1.199 3306 {

    delay_loop 2

    lb_algo wrr #带有权重的轮询

    lb_kind DR

    persistence_timeout 60 #同一IP的连接60秒内被分配到同一台真实服务器

    protocol TCP

    real_server 192.168.1.201 3306 {

    weight 3 #权重为3

    notify_down /data/keepalived_shutdown.sh #当mysq服down时,执行此脚本,杀死keepalived实现切换, 自杀脚本.

    TCP_CHECK {

    connect_timeout 10

    nb_get_retry 3

    delay_before_retry 3

    connect_port 3306

    }

    }

    }

    然后编辑B的配置文件

    vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived

    global_defs {

    router_id HA_MySQL

    }

    vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 90 #优先级,这个低一点

    advert_int 1

    nopreempt

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    virtual_ipaddress { #虚拟IP (VIP)

    192.168.1.199

    }

    }

    virtual_server 192.168.1.199 3306 {

    delay_loop 2 #每2秒检查一次real_server存活

    lb_algo wrr

    lb_kind DR

    persistence_timeout 60

    protocol TCP

    real_server 192.168.1.202 3306 {

    weight 3

    notify_down /data/keepalived_shutdown.sh

    TCP_CHECK {

    connect_timeout 10 #连接超时时间

    nb_get_retry 3 #重连次数

    delay_before_retry 3 #重连间隔时间

    connect_port 3306 #健康检查端口,配置自己mysql服务端口

    }

    }

    }

    有一点要注意的是,主从两端的state,都配置成了backup,因为使用了nopreempt,即非抢占模式。

    举个例子,当主端先启动mysql实例和keepalived后,如果此时从端也启动了mysql实例和keepalived,那么vip不会跳到从端上去,即使它的优先级为100,要大于主端的90

    而如果不设置nopreempt,那么这个时候,又分2种情况:

    1.state相同,即都是master或都是backup

    优先级高的,会占有vip,和角色无关

    2.state不同,即master->backup或backup->master

    优先级高的,会占有vip,和角色无关

    前提不同,结果都是一样的,即优先级是主导,谁的优先级高,vip就漂到谁那里

    可以看到A和B配置的共同点,就是virtual_ipaddress都是,这样当我们使用mysql的时候,就连接到这个虚拟ip上,由它进行转发到实体机。priority值高的先被访问,作为Master。这样实体机mysql的down机重启和转换主从角色则由keepalived来完成,对应用层透明,让应用无法感知。两台机器要通局域网,虚拟IP会被设置在他们共有的局域网内,不通的话两台机器各设置各的虚拟IP。

    杀死keepalived的脚本

    vim /data/keepalived_shutdown.sh

    #!/bin/bash

    #kill掉keepalived进程,以防止脑裂问题。

    pkill keepalived

    2测试

    先给个图说下目前的状况,应用程序连接VIP,VIP连接到A机器,从A向B执行Replication同步。

    1509f88b05dabcbbd8ce25d383355f79.png

    1.连接虚拟ip

    先查看下虚拟ip有没有,在设置的priority值高,也就是主机的那台机器上,这里是A机器,调用如下命令

    [root@localhost data]# ip addr

    1: lo: mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

    valid_lft forever preferred_lft forever

    2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 08:00:27:eb:92:52 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.201/24 brd 192.168.1.255 scope global eth0

    inet 192.168.1.199/32 scope global eth0

    inet6 fe80::a00:27ff:feeb:9252/64 scope link

    valid_lft forever preferred_lft forever

    可以看到已经有虚拟ip了,被绑定到了eth0上了。同时在B上面执行,则发现没有虚拟ip,说明现在A机器被选择了承担虚拟ip。接下来ping下它

    [root@localhost data]# ping 192.168.1.199

    PING 192.168.1.199 (192.168.1.199) 56(84) bytes of data.

    64 bytes from 192.168.1.199: icmp_seq=1 ttl=64 time=0.104 ms

    可以ping通哦,可以连接了!

    用客户端连接共同的入口,虚拟ip

    myslq -uroot -h192.168.1.119 -p

    OK,连接上了,查下当前后端接入的是哪个实体机

    mysql> show variables like 'server_id';

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

    | Variable_name | Value |

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

    | server_id | 1 |

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

    server_id=1是A机器。此时两台机器上的数据都是

    mysql> select * from tb_2;

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

    | id | name |

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

    | 2 | Michael |

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

    2.修改数据

    好,我们修改下数据看看

    update tb_2 set name='andy' where name='Michael';

    Query OK, 1 row affected (0.00 sec)

    Rows matched: 1 Changed: 1 Warnings: 0

    然后查看

    mysql> select * from tb_2;

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

    | id | name |

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

    | 2 | andy |

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

    单独开个客户端去查看A和B的机器,得到同样的效果,数据得到了同步

    mysql> select * from tb_2;

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

    | id | name |

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

    | 2 | andy |

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

    3.制造down机

    把mysql进程直接杀掉,类似于机器down的情况。

    ps -ef|grep mysql

    分析结果,得到两个mysql的进程id,都给它杀掉

    kill -9 7282

    kill -9 7408

    或者直接执行killall mysqld

    然后再次查看server_id,短暂的失去连接,即使毫秒就恢复了

    mysql> show variables like 'server_id';

    No connection. Trying to reconnect...

    Connection id: 751

    Current database: *** NONE ***

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

    | Variable_name | Value |

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

    | server_id | 2 |

    看样子是虚拟ip迁移了,在B上ip addr下

    1: lo: mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

    valid_lft forever preferred_lft forever

    2: eth0: mtu 1500 qdisc mq state UP qlen 1000

    link/ether dc:85:de:9f:f3:27 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.202/24 brd 192.168.1.255 scope global wlan0

    inet 192.168.1.199/32 scope global wlan0

    inet6 fe80::de85:deff:fe9f:f327/64 scope link

    valid_lft forever preferred_lft forever

    server_id=2,并且B机器加载上了虚拟ip,同时我们在A机器上使用ip addr看到虚拟ip已经不存在了,A机器的keepalived进程也死了。充分证明了现在虚拟ip迁移到了B机器上。当然要让A机器复活,自己另外写脚本重启吧。现在的情况变成了应用程序连接VIP,VIP连接到B机器,从B向A执行Replication同步。

    d3521cd177f61229230d51c0a0d604ae.png

    3.复活机器

    重启A机器上的mysql和keepalived

    service mysqld start

    service keepalived start

    再次查看server_id,发现还是2,说明虚拟ip没有迁移回到A机器,这样就避免了脑裂问题

    mysql> show variables like 'server_id';

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

    | Variable_name | Value |

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

    | server_id | 2 |

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

    ---------------------

    展开全文
  • 一.Mysql复制配置双机互为主从 AB为两台Mysql服务器,均开启二进制日志,数据库版本Mysql5.6在两台服务器上编辑配置文件,以下配置添加到/usr/local/server/mysql/my.cnfA服务器[21.114.11.58]server-id = 1binlog-...

    一.Mysql复制配置双机互为主从 AB为两台Mysql服务器,均开启二进制日志,数据库版本Mysql5.6

    在两台服务器上编辑配置文件,以下配置添加到/usr/local/server/mysql/my.cnf

    A服务器[21.114.11.58]

    server-id = 1

    binlog-do-db = cmstop

    binlog-ignore-db = mysql

    replicate-do-db = cmstop

    replicate-ignore-db = mysql

    sync-binlog = 1

    B服务器[21.114.11.90]

    server-id = 2

    binlog-do-db = cmstop

    binlog-ignore-db = mysql

    replicate-do-db = cmstop

    replicate-ignore-db = mysql

    sync-binlog = 1

    二、操作步骤

    # A B 服务器停止同步

    STOP SLAVE;

    # A B 服务器清空MASTER日志

    RESET MASTER;

    # A B 服务器清空SLAVE日志

    RESET SLAVE;

    # A 服务器授权同步账户 (我们会同步一次复制数据库文件,所以授权为21.114.11.%)

    GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'21.114.11.%' IDENTIFIED BY 'master_slave123!@#';

    FLUSH PRIVILEGES;

    # A 服务器锁表(锁表状态下不能终止mysql进程,否则会失败)

    FLUSH TABLES WITH READ LOCK;

    #如果使用SSH,需要重新开启,复制数据库文件,需要修改auto.cnf中的uuids值,不能相同

    tar -cvf /tmp/mysql-data.tar /data/mysql/

    tar -xvf /tmp/mysql-data.tar -C /

    # 查看 A 服务器主机状态(记录二进制开始文件,位置)

    SHOW MASTER STATUS\G

    # B 服务器锁表(锁表状态下不能终止mysql进程,否则会失败)

    FLUSH TABLES WITH READ LOCK;

    # 修改 B 服务器配置 (修改为A服务器的主机状态,注:MASTER_LOG_FILE,MASTER_LOG_POS两个值查看A)

    CHANGE MASTER TO MASTER_HOST='21.114.11.58',MASTER_USER='master_slave', MASTER_PASSWORD='master_slave123!@#',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=1108;

    # 开启 B 服务器同步进程

    START SLAVE;

    # 查看 B 服务器同步状态是否正常

    SHOW SLAVE STATUS\G

    # 查看 B 服务器主机(记录二进制开始文件,位置)

    SHOW MASTER STATUS\G

    # B 服务器授权同步账户 (我们会同步一次复制数据库文件,所以授权为21.114.11.%)

    GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'21.114.11.%' IDENTIFIED BY 'master_slave123!@#';

    FLUSH PRIVILEGES;

    # 修改 A 服务器配置 (修改为B服务器的主机状态)

    CHANGE MASTER TO MASTER_HOST='21.114.11.90',MASTER_USER='master_slave',MASTER_PASSWORD='master_slave123!@#',MASTER_LOG_FILE='binlog.000005',MASTER_LOG_POS=573;

    # 开启 A 服务器同步进程

    START SLAVE;

    # 分别查看 A B 服务器同步状态,确定是否成功

    SHOW SLAVE STATUS\G

    # 解锁 A B 服务器

    START SLAVE;UNLOCK TABLES;

    # 数据测试分别在 A B 服务器上创建表插入数据测试

    DROP TABLE IF EXISTS `test`;CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`value` varchar(100) DEFAULT '0',PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO `test` VALUES ('2', 'Hello2’);

    注意:

    1. 数据库目录下的master.info

    的内容会覆盖命令行或my.cnf中指定的部分选项,更改配置需删除master.info

    2. my.cnf中的master配置在MySQL 6.0以后会取消,官方建议使用动态的CHANGE MASTER

    3. 如果只指定ignore-db而不指定do-db。则新创建数据库的操作也会同步。

    互为同步配置实例:

    1. A B 互为主从同步test, 不同步mysql:两个数据库配置中均设置:binlog-do-db=test, binlog-ignore-db=mysql,replicate-do-db=test,replicate-ignore-db=mysql

    2. A B 互为主从只同步test,不同步其他数据库,新创建的也不会同步两个数据库配置中均设置:binlog-do-db=test,replicate-do-db=test

    3. A B 互为主从不同步mysql, 同步其他数据库,譬如创建的新数据库也会同步两个数据库配置中均设置:binlog-ignore-db=mysql,replicate-ignore-db=mysql

    4. A B 互为主从同步所有数据库,包括新建的数据库

    两个数据库配置中均不设置上述四项。

    三、从数据库配置

    配置文件:

    db_slaves.php

    配置说明:

    从数据库配置文件以二维数组形式配置,查询数据时系统随机选择一个服务器配置。请自行做好主从数据同步。

    return array(

    array(

    'driver' => 'mysql', //数据库驱动类型

    'host' => '21.114.11.90', //从数据库服务器1

    'port' => 3306, //数据库服务器端口

    'username' => 'cmstop', //数据库帐号

    'password' => '**********************', //数据库密码

    'dbname' => 'cmstop', //数据库名称

    'prefix' => 'cmstop_', //数据表前缀

    'pconnect' => 0, //是否持久连接

    'charset' => 'utf8' //数据编码

    ),

    );

    一键复制

    编辑

    Web IDE

    原始数据

    按行查看

    历史

    展开全文
  • mysql互为主从配置.txt

    2020-04-30 20:11:48
    mysql互为主从配置
  • 我搭建的是mysql 互为主从 复制两台机器的mysql环境完全相同第一部分测试:B为master A为slave的同步测试在B上创建表lian,并插入数据mysql> create table lian (a int,b char(10));mysql> insert into lian ...

    我搭建的是mysql 互为主从 复制

    两台机器的mysql环境完全相同

    第一部分测试:

    B为master  A为slave的同步测试

    在B上创建表lian,并插入数据

    mysql> create table lian (a int,b char(10));

    mysql> insert into lian (a,b)values(22,'hahah');

    mysql> show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | lian           |

    +—————-+

    mysql> select * from lian;

    +——+——-+

    | a    | b     |

    +——+——-+

    |   22 | hahah |

    +——+——-+

    查看一下master-B的binlog日志,查看以上操作是否记录了日志:

    cat mysql-bin.000002

    .?Nh?@stdtestcreate table lian (a int,b char(10))Nl>@stdtestinsert into lian (a,b)values(22,'hahah')

    现在查看slave-A的relay日志,发现日志已经同步了

    [root@XKWB5510 var]# cat XKWB5510-relay-bin.000003

    .?Nh?@stdtestcreate table lian (a int,b char(10))Nl>@stdtestinsert into lian (a,b)values(22,'hahah')

    再在slave-A上看一下数据库是不是存在lian这个表:

    mysql> use test;

    Database changed

    mysql> show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | aniya          |

    | lian           |

    +—————-+

    2 rows in set (0.00 sec)

    现在说明数据B A 主 从 同步成功

    —————————————————————————

    第二部分测试:

    A为master  B为slave的同步测试

    在A上创建表From246,并插入数据

    mysql> use test;

    mysql> show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | A246           |

    | aniya          |

    | lian           |

    +—————-+

    3 rows in set (0.00 sec)

    mysql> create table From246(Name varchar(255),Sex varchar(255),Age int(10));

    mysql> show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | A246           |

    | From246        |

    | aniya          |

    | lian           |

    +—————-+

    4 rows in set (0.00 sec)

    mysql> insert into From246 (Name,Sex,Age)values('Zhaoyj','Girl',24);

    mysql> select * from From246;

    +——–+——+——+

    | Name   | Sex  | Age  |

    +——–+——+——+

    | Zhaoyj | Girl |   24 |

    +——–+——+——+

    1 row in set (0.00 sec)

    查看master-A的binlog日志,证明上述操作成功

    [root@XKWB5510 var]# tail -1  mysql-bin.000002

    testcreate table From246(Name varchar(255),Sex varchar(255),Age int(10))?N?R@stdtestinsert into From246 (Name,Sex,Age)values('Zhaoyj','Girl',24)

    查看master-A的日志状态

    [root@XKWB5510 var]# /usr/local/mysql/bin/mysqlbinlog mysql-bin.000003 |tail -15

    ;

    # at 702

    #110926 14:01:51 server id 1  end_log_pos 838  Query thread_id=5 exec_time=0 error_code=0

    SET TIMESTAMP=1317016911;

    create table From246(Name varchar(255),Sex varchar(255),Age int(10))

    ;

    # at 838

    #110926 14:02:05 server id 1  end_log_pos 966  Query thread_id=5 exec_time=0 error_code=0

    SET TIMESTAMP=1317016925;

    insert into From246 (Name,Sex,Age)values('Zhaoyj','Girl',24)

    ;

    DELIMITER ;

    # End of log file

    ROLLBACK ;

    ;

    create table From246(Name varchar(255),Sex varchar(255),Age int(10))

    ;

    # at 853

    #110926 14:02:05 server id 1  end_log_pos 966  Query thread_id=5 exec_time=0 error_code=0

    SET TIMESTAMP=1317016925;

    insert into From246 (Name,Sex,Age)values('Zhaoyj','Girl',24)

    ;

    DELIMITER ;

    # End of log file

    ROLLBACK ;

    /*!50003 SET ;

    但是数据却没有插入到relay-B的

    > show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | lian           |

    +—————-+

    1 row in set (0.00 sec)

    当我删除master-A上的表时,relay-B日志也同步了

    [root@XKWB5705 var]# tail -4 XKWB5705-relay-bin.000005

    NS?@stdtestdrop table A246NT@stdtestdrop table aniyaNSd@stdtestdrop table lianNV?@stdtestdrop table From246

    这是什么奇怪问题 ??

    ——————————————————————————

    问题排查:

    首先在Master-A上用

    show processlist; 查看下进程是否Sleep太多。发现很正常

    show master status; 也正常

    再跑到Slave上查看 show slave status; 也正常

    当我手动从A导入B数据时,发现一个问题:

    mysql> load table From246 from master;

    ERROR 1115 (42000): Unknown character set: 'gbk'

    怀疑:难道是因为字符串的问题导致AB主从复制失败 ?

    通过show character set 命令查看到

    master-A有gbk字符集而slave-B没有

    mysql> show character set;

    +———-+—————————–+———————+——–+

    | Charset  | Description                 | Default collation   | Maxlen |

    +———-+—————————–+———————+——–+

    | dec8     | DEC West European           | dec8_swedish_ci     |      1 |

    | cp850    | DOS West European           | cp850_general_ci    |      1 |

    | hp8      | HP West European            | hp8_english_ci      |      1 |

    | koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |

    | latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |

    | latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |

    | swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |

    | ascii    | US ASCII                    | ascii_general_ci    |      1 |

    | hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |

    | koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |

    | greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |

    | cp1250   | Windows Central European    | cp1250_general_ci   |      1 |

    | gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |

    | latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |

    | armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |

    | utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |

    | cp866    | DOS Russian                 | cp866_general_ci    |      1 |

    | keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |

    | macce    | Mac Central European        | macce_general_ci    |      1 |

    | macroman | Mac West European           | macroman_general_ci |      1 |

    | cp852    | DOS Central European        | cp852_general_ci    |      1 |

    | latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |

    | cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |

    | cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |

    | cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |

    | binary   | Binary pseudo charset       | binary              |      1 |

    | geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |

    +———-+—————————–+———————+——–+

    27 rows in set (0.00 sec)

    那现在应该是在启动mysql的时候统一他们的字符集

    master-A : [root@XKWB5510 var]# /usr/local/mysql/bin/mysqld_safe –default-character-set=latin1 &

    slave-B   : [root@XKWB5705 var]# /usr/local/mysql/bin/mysqld_safe –default-character-set=latin1 &

    再次在B上从A导入数据:

    mysql> show tables;

    Empty set (0.00 sec)

    mysql> load table From246 from master;

    Query OK, 0 rows affected (0.01 sec)

    mysql> show tables;

    +—————-+

    | Tables_in_test |

    +—————-+

    | From246        |

    +—————-+

    1 row in set (0.00 sec)

    现在字符集的问题解决了

    —————————————————————

    现在手动启动一下“将日志应用于数据库”的线程:SLAVE start SQL_THREAD

    和“把master段的日志写到本地”的线程:SLAVE start IO_THREAD

    发现同步数据还是失败,那说明不是线程的问题

    如果发现 Seconds_Behind_Master 为 (null)

    解决:

    stop slave;

    set global sql_slave_skip_counter=1 ;

    start slave;

    之后Slave会和Master去同步 主要看Seconds_Behind_Master是否为0,直到为0时就已经同步了。。

    ———————————–

    slave B机器上master.info信息,与master A上的信息是否是同步的

    mater A:

    mysql> show master status\G;

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

    File: mysql-bin.000004

    Position: 808

    Binlog_Do_DB: test

    Binlog_Ignore_DB: mysql

    1 row in set (0.00 sec)

    slave B:

    [root@XKWB5705 var]# cat master.info

    15

    mysql-bin.000004

    808

    211.100.97.246

    repl2

    123456

    3306

    60

    0

    从以上可以看到是同步的

    作者“ANLJF的专栏”

    展开全文
  • mysql主从配置小记:共有...配置后结果:A-C互为主从,B为A的slave,D为C的slave。0)准备工作在四台机器上面安装好mysql后,创建用于同步的账号。添加账户:INSERT INTO user (Host,User, Password,Select_priv,Ins...

    mysql主从配置小记:

    共有四台机器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。

    配置后结果:A-C互为主从,B为A的slave,D为C的slave。

    0)准备工作

    在四台机器上面安装好mysql后,创建用于同步的账号。

    添加账户:

    INSERT INTO user (Host,User, Password,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','test',password('test'),'Y','Y','Y','Y','Y','Y');

    刷新数据库:

    FLUSH PRIVILEGES;

    1)配置A-C互为主从

    修改A配置文件为:

    server-id = 1

    replicate-do-db=test

    replicate-do-db=test_admin

    log-bin=mysql-bin

    log-slave-updates

    replicate-wild-do-table=test.%

    replicate-wild-do-table=test_admin.%

    binlog-ignore-db=mysql

    slave-skip-errors=all

    修改C配置文件为:

    server-id = 3

    binlog-do-db=test

    binlog-do-db=test_admin

    log-bin=mysql-bin

    log-slave-updates

    replicate-wild-do-table=test.%

    replicate-wild-do-table=test_admin.%

    binlog-ignore-db=mysql

    slave-skip-errors=all

    重启mysql是配置生效

    将A设置为主:

    停止同步:

    slave stop;

    清空服务器master日志:

    reset master;

    授权同步账号:

    GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

    刷新授权:

    flush privileges;

    锁定数据库:

    flush tables with read lock;

    将C设置为从:

    停止同步:

    slave stop;

    配置同步信息:

    CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

    将C设置为主:

    停止同步:

    slave stop;

    清空服务器master日志:

    reset master;

    授权同步账号:

    GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

    刷新授权:

    flush privileges;

    锁定数据库:

    flush tables with read lock;

    将A设置为从:

    停止同步:

    slave stop;

    配置同步信息:

    CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

    2)将B设置为A的从

    server-id = 2

    replicate-do-db=test

    replicate-do-db=test_admin

    log-bin=mysql-bin

    log-slave-updates

    replicate-wild-do-table=test.%

    replicate-wild-do-table=test_admin.%

    binlog-ignore-db=mysql

    slave-skip-errors=all

    重启mysql服务

    停止同步:

    slave stop;

    配置同步信息:

    CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

    启动同步:

    slave start;

    3)将D设置为C的从

    server-id = 4

    replicate-do-db=test

    replicate-do-db=test_admin

    log-bin=mysql-bin

    log-slave-updates

    replicate-wild-do-table=test.%

    replicate-wild-do-table=test_admin.%

    binlog-ignore-db=mysql

    slave-skip-errors=all

    重启mysql服务

    停止同步:

    slave stop;

    配置同步信息:

    CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

    启动同步:

    slave start;

    完成之后可以创建添加数据测试一下是否可以。

    下面是常见错误处理:

    1)

    change master导致的:

    Last_IO_Error: error connecting to master 'repl1@IP:3306' - retry-time: 60 retries

    2)

    在没有解锁的情况下停止slave进程:

    mysql> stop slave;

    ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

    3)

    change master语法错误,落下逗号

    mysql> change master to

    -> master_host='IP'

    -> master_user='USER',

    -> master_password='PASSWD',

    -> master_log_file='mysql-bin.000002',

    -> master_log_pos=106;

    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 'master_user='USER',

    master_password='PASSWD',

    master_log_file='mysql-bin.000002' at line 3

    4)

    在没有停止slave进程的情况下change master

    mysql> change master to master_host=‘IP', master_user='USER', master_password='PASSWD', master_log_file='mysql-bin.000001',master_log_pos=106;

    ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first

    5)

    A B的server-id相同:

    Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;

    these ids must be different for replication to work (or the --replicate-same-server-id option must be used on

    slave but this does not always make sense; please check the manual before using it).

    查看server-id

    mysql> show variables like 'server_id';

    手动修改server-id

    mysql> set global server_id=2; #此处的数值和my.cnf里设置的一样就行

    mysql> slave start;

    6)change master之后,查看slave的状态,发现slave_IO_running 为NO

    展开全文
  • 我搭建的是mysql 互为主从 复制两台机器的mysql环境完全相同第一部分测试:B为master A为slave的同步测试在B上创建表lian,并插入数据mysql> create table lian (a int,b char(10));mysql> insert into lian ...
  • 其次要解决延迟问题:log-slave-updates 互为主从需要加入这一行skip-name-resolve 跳过名称解析可以提高远程访问速度接来要解决日志同步失败问题:skip-slave-start 手动启动从服务比较安全,可避免突然宕机导致的...
  • 在使用双主互为主从的模式前提是互为主从的两个数据库,表的主键必须是自增的。实验步骤是在主从复制已经配置好的两台数据库上配置。说下思想吧,其实很简单就是把原来的从库当主库,把原来的主库当从库。按照主从...
  • 一、互为主从配置1.1、资源情况192.168.11.177 server1192.168.11.180 server2192.168.11.210 VIP1.2、server1配置# vi /etc/my.cnf[mysqld]server-id=1log-bin=mysql-binrelay_log=mysql-realy-binrelay_log_index=...
  • 由于业务需要,需要做主从同步,互为主从等的mysql设置。主从设置主要涉及主从同步时使用的账号密码配置,my.cnf的配置,进入数据库进行master,slave配置。主要是这四个配置。1,账号密码配置,例如GRANT ...
  • 其次要解决延迟问题:log-slave-updates 互为主从需要加入这一行skip-name-resolve 跳过名称解析可以提高远程访问速度接来要解决日志同步失败问题:skip-slave-start 手动启动从服务比较安全,可避免突然宕机导致的...
  • MySQL 5.6中如何通过Keepalived+互为主从实现高可用架构发布时间:2020-05-26 17:37:24来源:51CTO阅读:175作者:三月不知道大家之前对类似MySQL 5.6中如何通过Keepalived+互为主从实现高可用架构的文章有无了解,...
  • mysql互为主从

    2020-06-14 21:38:12
    mysql互为主从 主机 A 1.下载数据库 centos6 为mysql centos7 为mariadb yum -y install mariadb mariadb-server 2.修改mysql的配置文件 server_id=1 #后面的数字为n 但是不要重复,以免冲突 log_bin=wendi # 后面...
  • mysql复制实现互为主从双机热备A B 为两台MySQL服务器,均开启二进制日志,数据库版本 5.5.2一、服务器参数[A 服务器]server-id = 1binlog-do-db = testbinlog-ignore-db = mysqlreplicate-do-db = testreplicate-...
  • 共有四台机器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。配置后结果:A-C互为主从,B为A的slave,D为C的slave
  • MySQL互为主从

    千次阅读 2020-01-09 15:39:35
    **MySQL互为主从 Mysql-A:192.168.189.140 Mysql-B:192.168.189.141 在A、B上操作:** #安装: [root@ localhost ~]# yum -y install mysql mysql-server #修改配置文件: [root@ localhost ~]# vim /etc/my.cnf #...
  • MySQL互为主从配置

    2021-01-26 16:22:39
    master slave互为主从 思路:hive客户端及元数据库 mysql安装在一台服务器上(master),为防止单点故障,选取slave作为备份节点,作为小spark集群的master节点,安装hive客户端及元数据库 master节点与slave节点均...
  • centos6 多机互为主从配置,keepalived+mysql实现双主高可用配置
  • 1)规则:1) db-51 192.168.4.51 Mysql 5.72) db-52 192.168.4.52 Mysql 5.7vip: 192.168.4.502)创建Mysql互为主从:1、在192.168.4.51 (db-51)安装Mysql,创建同步复制用户(用于192.168.4.52(db-52)主机同步数据...
  • 3)现在db-51与db-52 的Mysql已互为主从,现在要实现高可用性,需要安装keepalived服务,并设置vip地址。db-51 192.168.4.51 Mysql 5.7db-52 192.168.4.52 Mysql 5.7vip: 192.168.4.501.在192.168.4.51 (db-51)...
  • windows下mysql互为主从(主主复制)

    千次阅读 2016-08-17 19:26:26
    windows下mysql互为主从 mysql主主复制 mysql互为主从
  • mysql互为主从配置

    2021-03-26 11:22:47
    1.修改mysql配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf,这部分一定要配置在[mysqld]后面,配置完成如下(因我们配置为互为主从故DB配置中也包含从配置项) 2. 重启数据库:命令行中输入 /etc/init.d/mysql ...
  • Mysql互为主从

    2019-03-14 19:29:00
    Mysql互为主从环境:系统环境:centos6.5_x64Mysql-A:172.18.49.10Mysql-B:172.18.49.2Mysql安装已经完成。两台mysql上时间同步: ntpdate pool.ntp.org 在A上操作: vi /etc/my.cnf 添加:log-bin=mysql-bin //...
  • 我搭建的是mysql 互为主从 复制两台机器的mysql环境完全相同第一部分测试:B为master A为slave的同步测试在B上创建表lian,并插入数据mysql> create table lian (a int,b char(10));mysql> insert into lian ...
  • mysql的互为主从

    2020-06-14 22:01:47
    mysql 互为主从 一:安装部署mysql主从复制环境: 使用yum安装部署mysql两台 yum -y install mariadb-server systemctl start mariadb vim /etc/my.cnf server-id=1 log-bin=qi relay-log=wang systemctl ...
  • 在使用双主互为主从的模式前提是互为主从的两个数据库,表的主键必须是自增的。 环境不多说了 ,多台mysql单实例或单台多实例都可以。多实例的配置请参考:https://www.cnblogs.com/qiuhom-1874/p/9757061.html ...
  • MySQL互为主从复制以及主主互备 2015/5/8 10:14:22 实验环境: 主机名 ip地址 操作系统 应用角色 mysql-master 192.168.1.87 Centos 6.6 Master mysql-slave 192.168.1.198 Centos 6.6 Slave 192.168...
  • MySQL-互为主从

    2019-12-30 21:02:26
    MySQL互为主从 Mysql-A:192.168.189.140 Mysql-B:192.168.189.141 在A、B上操作: #安装: yum -y install mysql mysql-server #修改配置文件: vim /etc/my.cnf #添加二进制日志: log-bin=mysql-bin /...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,389
精华内容 555
关键字:

互为主从