标签归档:slave

redis 3.2.10 安装和主从配置

1. 下载 redis

wget http://download.redis.io/releases/redis-3.2.9.tar.gz

2. 解压

tar xzf redis-3.2.9.tar.gz

3. 进入 src 目录

cd redis-3.2.9

4. make

5. make test && make install

6. 如果出现 tcl 需要安装 yum -y install tcl

7. make install

8.注意 rdb 目录 和 save 配置 ,dir 目录指定文件存档目录, bind 指定ip

9. 修改密码 requirepass 修改

10. 指定启动目录 redis-server /etc/redis.conf

11. slave 机器安装 redis

12. slave 机器 redis.conf 修改 slaveof 和  masterauth

13. 重启

14. info 查看信息

master:

slave:


./redis-cli -p <修改的端口号> -a <修改的密码> shutdown

2种方法解决mysql主从不同步

今天发现Mysql的主从数据库没有同步
 
先上Master库:
 
mysql>show processlist;   查看下进程是否Sleep太多。发现很正常。
show master status; 也正常。
 
mysql> show master status;
+——————-+———-+————–+——————————-+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)
 
再到Slave上查看
 
mysql> show slave status\G                                                
 
Slave_IO_Running: Yes
Slave_SQL_Running: No
 
可见是Slave不同步
 
下面介绍两种解决方法:
 
 
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
 
解决: 
stop slave;
 
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
 
之后再用mysql> show slave status\G  查看:
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
 
ok,现在主从同步状态正常了。。。
 
 
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
 
解决步骤如下:
 
1.先进入主库,进行锁表,防止数据写入
 
使用命令:
 
mysql> flush tables with read lock;
 
注意:该处是锁定为只读状态,语句不区分大小写
 
2.进行数据备份 
 
#把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master 状态
 
mysql> show master status;
+——————-+———-+————–+——————————-+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 |     3260 |              | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)
 
4.把mysql备份文件传到从库机器,进行数据恢复
 
#使用scp命令
[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/
 
5.停止从库的状态
mysql> stop slave;
 
 
6.然后到从库执行mysql命令,导入数据备份
 
mysql> source /tmp/mysql.bak.sql
 
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
 
change master to master_host = ‘192.168.128.100’, master_user = ‘rsync’, master_port=3306, master_password=”, master_log_file = ‘mysqld-bin.000001’, master_log_pos=3260;
 
8.重新开启从同步
mysql> start slave;
 
9.查看同步状态
mysql> show slave status\G  查看:
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
 
好了,同步完成啦。

配置mysql5.5主从服务器(转)

配置mysql5.5主从服务器

Mysql提供了主从复制的功能,作用类似oracle的dataguard,但是配置和管理远比dataguard简单,没有所谓的物理备库和逻辑备库之分,也没有提供相应的数据保护模式,只有master和slave数据库角色,这种架构广泛应用于各大门户,游戏网站中,提供数据库的读写分离功能;相比之下oracle的读写功能到了11g版本才能借助active dataguard完美实现,否则就只能用logical standby,但又有许多的数据类型和操作不被逻辑备库支持!先前使用过mysql5.1.36版本的master-slave架构做CMS数据库的读写分离,有着非常痛苦的使用经历,经常由于各种各样的原因的导致主从数据不同步,然后又没有提供额外的同步机制(确切的说是没学会),于是经常在下班时间重构主从架构;下一步将在mysql5.5平台测试mha架构,故本文记录下如何在mysql5.5平台下构建主从数据库复制环境;另外mysql的主从也可看为是mysql的实时备份,有一定的数据灾备功能,mysql本身没有提供类似oracle rman的热备份工具,因而多数场景下会使用主从对数据库做一个实时备份,以备不时只需!PS:一直比较不解的mysql如何做基于时间或者SCN的不完全恢复?难道真要一个个binlog分析过去?

一、安装MySQL

说明:在两台MySQL服务器192.168.1.2和192.168.1.3上分别进行如下操作,安装MySQL 5.5.22

 二、配置MySQL主服务器(192.168.1.2)
mysql  -uroot  -p    #进入MySQL控制台
create database osyunweidb;   #建立数据库osyunweidb
insert into mysql.user(Host,User,Password) values(‘localhost’,’osyunweiuser’,password(‘Mypasswd8800’));   #创建用户osyunweiuser

#建立MySQL主从数据库同步用户osyunweidbbak密码Mypasswd8800 

flush privileges;   #刷新系统授权表

#授权用户osyunweidbbak只能从192.168.1.3这个IP访问主服务器192.168.1.2上面的数据库,并且只具有数据库备份的权限
grant replication slave  on *.* to ‘osyunweidbbak’@’192.168.1.3’ identified by ‘Mypasswd8800’ with grant option; 

三、把MySQL主服务器192.168.1.2中的数据库osyunweidb导入到MySQL从服务器192.168.1.3中
1、导出数据库osyunweidb

mysqldump -u root -p osyunweidb > /home/osyunweidbbak.sql    #在MySQL主服务器进行操作,导出数据库osyunweidb到/home/osyunweidbbak.sql 

备注:在导出之前可以先进入MySQL控制台执行下面命令

flush tables with read lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入

unlock tables;   #解除锁定

2、导入数据库到MySQL从服务器

mysql  -u root -p  #进入从服务器MySQL控制台

create database osyunweidb;   #创建数据库

use osyunweidb    #进入数据库

source  /home/osyunweidbbak.sql  #导入备份文件到数据库

mysql -u osyunweidbbak -h 192.168.1.2 -p  #测试在从服务器上登录到主服务器
四、配置MySQL主服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=1   #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=osyunweidb  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql   #不同步mysql系统数据库
service mysqld  restart  #重启MySQL
mysql -u root -p   #进入mysql控制台
show master status;  查看主服务器,出现以下类似信息
+——————+———-+————–+——————+
| File                        | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000019 |    7131    | osyunweidb    | mysql                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
注意:这里记住File的值:mysql-bin.000019和Position的值:7131,后面会用到。
五、配置MySQL从服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=2   #配置文件中已经有一行server-id=1,修改其值为2,表示为从数据库
log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
replicate-do-db=osyunweidb   #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
replicate-ignore-db=mysql   #不同步mysql系统数据库
:wq!    #保存退出
service mysqld restart   #重启MySQL
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
mysql  -u root -p  #进入MySQL控制台
slave stop;   #停止slave同步进程
change master to master_host=’192.168.1.2′,master_user=’osyunweidbbak’,master_password=’Mypasswd8800′,master_log_file=’mysql-bin.000019′ ,master_log_pos=7131;    #执行同步语句
slave start;    #开启slave同步进程
SHOW SLAVE STATUS\G   #查看slave同步信息,出现以下内容
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.2
                  Master_User: osyunweidbbak
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 7131
               Relay_Log_File: MySQLSlave-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: osyunweidb
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
1 row in set (0.00 sec)
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上这两个参数的值为Yes,即说明配置成功!
 

六、测试MySQL主从服务器双机热备是否成功
1、进入MySQL主服务器

mysql -u root -p  #进入主服务器MySQL控制台

use osyunweidb   #进入数据库

CREATE TABLE test ( id int not null primary key,name char(20) );   #创建test表
2、进入MySQL从服务器

mysql -u root -p  #进入MySQL控制台

use osyunweidb   #进入数据库

show  tables;  #查看osyunweidb表结构,会看到有一个新建的表test,表示数据库同步成功

至此,MySQL数据库配置主从服务器实现双机热备实例教程完成

mysql slave同步错误:Last_Errno: 1062解决办法

场景重现:

      MySQL 双主实现同步之后,同步机器IP设置为:192.168.101.118和192.168.101.119

在同步数据库中创建一个表

 create table test (tno int(5),
tname char(10),
primary key(tno));

然后在118端插入数据如下:

+——-+———+
| tno   | tname   |
+——-+———+
| 10001 | liming  |
| 10002 | linxiao |

在119端实现了同步:

+——-+———+
| tno   | tname   |
+——-+———+
| 10001 | liming  |
| 10002 | linxiao |

然后把119的数据库关闭(模拟119机器环境突然宕机)

在118机器上面插入数据(10003,hanmeimei);

mysql> select * from test;
+——-+———–+
| tno   | tname     |
+——-+———–+
| 10001 | liming    |
| 10002 | linxiao   |
| 10003 | hanmeimei |
+——-+———–+

然后模拟118机器也宕机了,并恢复119的环境,然后在119库里面插入数据(10003,‘gaoyao’),,(10004, ‘chenhu’),插入成功

mysql> select * from test;
+——-+———+
| tno   | tname   |
+——-+———+
| 10001 | liming  |
| 10002 | linxiao |
| 10003 | gaoyao  |
| 10004 | chenhu  |
+——-+———+

然后恢复118机器的环境,此时问题出现,两边不能同步了,

查看记录如下:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.101.118
                  Master_User: backup
                  Master_Port: 3306
                Connect_Retry: 50
              Master_Log_File: mysql-bin.000014
          Read_Master_Log_Pos: 202
               Relay_Log_File: localhost-relay-bin.000014
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: cdn
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1062
                   Last_Error: Error ‘Duplicate entry ‘10003’ for key ‘PRIMARY” on query. Default database: ‘cdn’. Query: ‘insert into test values(10003, ‘hanmeimei’)’

                   Last_Error: Error ‘Duplicate entry ‘10003’ for key ‘PRIMARY” on query. Default database: ‘cdn’. Query: ‘insert into test values(10003, ‘gaoyao’)’
                  (红色部分为118上面的日志)

            Skip_Counter: 0
          Exec_Master_Log_Pos: 497
              Relay_Log_Space: 915
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1062
               Last_SQL_Error: Error ‘Duplicate entry ‘10003’ for key ‘PRIMARY” on query. Default database: ‘cdn’. Query: ‘insert into test values(10003, ‘hanmeimei’)’

              Last_SQL_Error: Error ‘Duplicate entry ‘10003’ for key ‘PRIMARY” on query. Default database: ‘cdn’. Query: ‘insert into test values(10003, ‘gaoyao’)’
1 row in set (0.00 sec)

原因分析:

两边数据不一致,数据库开始进行同步,但是由于在复制同步的时候,发现对方库中存在相同的主键,从而同步失败

并导致  Slave_SQL_Running: No  出现

要求:

要求模拟上述场景,并解决工作中实际出现的这种问题

即双主中有一台机器A宕机后,紧接着另一台B在插入了部分数据之后也宕机了,然后A机器先恢复启动,并在不知情的情况下也插入了相同主键但是内容不一致的数据,

然后B再启动,此时就会出现上述错误

解决(1)

此种情况下只要保证机器B先启动就不会存在此种问题,所以要解决的问题是怎么控制B先启动的问题

解决(2)

网上有其他修改参数的相关建议,但是可能场景不是很合要求

如:

修改mysql的配置文件,/etc/my.cnf,在[mysqld]下面添加一行

slave_skip_errors = 1062

保存、重启mysql服务,再次查看主从复制,问题解决。

此种方法在此场景只能保证忽略报错,在后序的数据中还能保持同步,但是对于已经不同步的数据不能恢复同步:

mysql> select * from test;    ————A
+——-+———–+
| tno   | tname     |
+——-+———–+
| 10001 | liming    |
| 10002 | hanmeimei |
| 10003 | Jimmy     |
+——-+———–+

mysql> select  * from test;            ——————B
+——-+———–+
| tno   | tname     |
+——-+———–+
| 10001 | liming    |
| 10002 | hanmeimei |
| 10003 | gaoyao    |
+——-+———–+

在A中插入一条数据(10004,’Green’), 这条数据马上能同步到B, 但是 tno = 10003的数据还是混乱的,不知道选择哪条了,所以此条记录没有同步

还有另外一种:  此种和上面方法类似,都是相当于路过了当前问题,令后面的同步

mysql> slave stop;
     mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
     mysql> slave start;