作为程序员一定要保持良好的睡眠,才能好编程

mysql5.5数据库主从设置

发布时间:2016-11-04

需要设置mysql数据库主从,首先需要安装数据库啊


如果还没有安装:

请参考:

数据库5.5安装步骤


数据库安装好以后,看配置:


主:192.168.61.105

从:192.168.61.104


主从同步的数据可以是:

通过配置,可以复制所有库或者几个库,甚至库中的一些表

这都是可以的。


问题:当那天把主服务器的IP地址更改、或从服务器更改后,这样数据库就会不同步了。

         那么应该怎么办?

        一点一点去查询:

        从服务器:show slave status \G;

        查看从服务器的状态


        主服务器:show master status \G;


        同时查看主服务器的状态


        并修改 mysql.user 的配置,主服务器保存了从服务器访问地址,这里需要修改统一。

        


      

Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)


工程流程(见下图)

整体来说,分三步:

1). Master将改变记录到二进制日志(binary log)中.

(这些记录叫做二进制日志事件,binary log events);

2). Slave将Master的binary log events拷贝到它的中继日志(Relay log);

# 本过程由Slave的I/O线程来完成

3). Slave重做中继日志中的事件,修改Slave上的数据

# 本过程由Slave的SQL线程来完成

# 故,这里有个前提,就是在搭建环境时,Master和Slave数据一致

master_slave.jpg


这就是工作的原理。



Replication常见方案:

2、M-S-S
使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates

s1.jpg

 

5、One slave Muti master  一从对多主

好处:节省成本,将多个master数据自动化整合

缺陷:对库和表数据的修改较多


3、M-M  双主互备

很多人误以为这样可以做到MySQL负载均衡,实际什么没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性

s2.jpg
4、M-M-M

监控三台机器互相做对方的master

s3.jpg

天生的缺陷:复制延迟,slave上同步要慢于master,如果大并发的情况那延迟更严重

Mysql在5.6已经自身可以实现fail over




这是另一个版本:


部署MySQL主从同步 <M-S>

环境准备:

主机名

IP

系统 / MySQL版本

角色

xiaogan64

192.168.31.64

CentOS6.8 / 5.5.53

Master

xiaogan63

192.168.31.63

CentOS6.8 / 5.5.53

slave

模式:C/S

端口:3306

配置主数据库服务器xiaogan64

创建需要同步的数据库:

mysql> create database Test;

mysql> use Test;

mysql> create table xiaogan(id int,name varchar(20));

service mysqld stop

配置my.cnf:

vim /etc/my.cnf

log-bin=mysql-bin-master  #启用二进制日志,开启log-bin 并设置为master

server-id=1   #本机数据库ID 标示 默认就是1,这里不用改

binlog-do-db=Test #可以被从服务器复制的库。二进制需要同步的数据库名

binlog-ignore-db=mysql  #不可以被从服务器复制的库

重启mysql:

service mysqld restart

授权:

mysql> grant replication slave on *.* to slave@192.168.31.64 identified by "123456";

查看状态信息:

mysql> show master status;

showmaster.jpg

这就看到了master的详细数据


mysql>show binlog events\G

可以看看都有哪些日志文件,当然这里很多的

自己执行代码看看吧



复制前要保证同步的数据库一致

mysqldump  -uroot -p123456  Test >Test.sql  

#也可以导出数据库

将导出的数据库传给从服务器

方法一:scp Test.sql  192.168.31.63:/root

方法二:使用nc命令

NetCat,它短小精悍、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。

语法:

服务器端:nc发送数据的语法:  nc   -l  端口  < 要传输的文件

客户端:  nc接受数据的语法:  nc   远程nc服务器端IP  端口   >  文件名

开始传送:

[root@xiaogan64 ~]# nc -l 888 < test.sql

[root@xiaogan64 ~]# lsof -i :888

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nc      3464 root    3u  IPv4  18662      0t0  TCP *:cddbp (LISTEN)

开始接收:

记得清空两台服务器的iptables,要不然端口不能通信

iptables –F

/etc/init.d/iptables save




nc 192.168.31.64 888 > test.sql

wps85BB.tmp

配置从数据库服务器xiaogAN63

两台数据库服务器mysql版本要一致

mysql> show variables like '%version%';

wps85BC.tmp

测试连接到主服务器是否成功

mysql -uslave -p123456 -h 192.168.31.64

wps85BD.tmp

只有复制的权限

导入数据库,和主数据库服务器保持一致

mysql> create database Test;

mysql -uroot -p123456 Test<Test.sql

修改从服务器配置文件:

从服务器没必要开启bin-log日志

service mysqld stop

vim /etc/my.cnf

server-id=2 

#从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。

mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456'; # 注,是,号连接

mysql> start slave;

mysql> show slave status\G  查看状态

wps85CD.tmp

Slave_IO_Running :一个负责与主机的io通信

Slave_SQL_Running:负责自己的slave mysql进程


文本框是mysql5.1的配置

wps85CE.tmp

再到主服务器 xiaogan64 上查看状态:

 

mysql> show processlist \G

wps85CF.tmp

插入数据测试同步:

mysql> insert into Test.xiaogan values (11,'ganbugan');

从数据库上查看:

wps85D0.tmp

排错:

如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。

wps85D1.tmp

从服务器 xiaogan63 上执行MySQL命令:

mysql> slave stop; #先停止slave服务

mysql> change master to master_log_file='mysqllog.000004' ,master_log_pos=106;

#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果

mysql>slave start; #启动从服务器同步服务

mysql> show slave status\G; #用show slave status\G;看一下从服务器的同步情况

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果都是yes,那代表已经在同步


重启从服务器,再查看状态:

停止从服务器slave stop;

开启从服务器slave start;




五:部署MySQL主主双向主从复制  M-M

通过mysql主主:进行mysql 双向同步数据库Test的配置

mysql主:服务端:xiaogan63   IP:192.168.31.63

mysql主:服务端:xiaogan64   IP:192.168.31.64 

在上面主从的基础上进行配置

配置xiaogan63

它有两种身份:

身份1: xiaogan63的主。 身份2: xiaogan64的从。

vim /etc/my.cnf

log-bin=mysql-bin-slave

binlog-do-db=Test

binlog-ignore-db=mysql  #避免同步mysql用户 相关配置

service mysqld restart


授权:

mysql> grant replication slave on *.* to slave@'192.168.31.64' identified by '123456';

配置xiaogan64

vim /etc/my.cnf # 不用修改

wps85D2.tmp

5.1的配置

5.5上的配置:

[root@xiaogan64 ~]# mysql  -uroot -p123456

mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456';

mysql> start slave;

mysql> show slave status\G


检查:

xiaogan64上查看slave状态

mysql> show slave status \G

xiaogan63上查看slave状态

mysql> show slave status \G

插入数据测试:

xiaogan63上插入数据,xiaogan64上查看

mysql> insert into T1 values(2,'天清');


xiaogan64上插入数据,xiaogan63上查看

mysql> insert into T1 values(3,'黑客');

注意:这种M-M架构没有什么好处,他往往给我们产生一种实现了负载均衡的错觉


http://www.cnblogs.com/xiaogan/p/5994687.html

















1、One master and Muti salve  一主多备

下面我们看看 Master-slave  1主对1从:


1、主数据库设置:

登录mysql客户端终端:

#首先建立数据库

create database newsys default charset utf8;
Query OK, 1 row affected (0.05 sec)
1.png


#添加备份的用户

insert into mysql.user(Host,User,Password)values('localhost','songbak',password('123'));
Query OK, 1 row affected, 3 warnings (0.01 sec)

#刷新系统授权表

flush privileges;


#授权用户songbak只能从192.168.61.104这个IP访问主服务器192.168.61.105上面的数据库,

并且只具有数据库备份的权限

grant replication slave  on *.* to 'songbak'@'192.168.61.104' identified by '123' with grant option;


主服务器的数据库备份到从服务器上

mysqldump --opt newsys -u root -p >/home/newsysbak.sql


8.png



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

登录mysql控制端:执行锁表命令

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


这样进行备份保证数据万无一失。


备份结束后,可以解除表锁定

unlock tables;   #解除锁定

9.png

10.png


#把newsysbak.sql 文件上传到 192.168.61.104 的root目录下, 使用root 用户登录

 scp /root/newsysbak.sql root@192.168.61.104:/root

远程上传.png



2、导入到从服务器


#创建数据库

create database newsys default charset utf8;

#导入数据

use newsys;

source /root/newsysbak.sql

 11.png

在从服务器上,使用刚刚创建的用户登录一下,看看是否可以登录:

mysql -u songbak -h 192.168.61.105 -p

12.png


如果 看到以上的界面,证明能够登录成功!


3、主服务器配置:

vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容

server-id=1   #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

binlog-do-db=newsys  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行

binlog-ignore-db=mysql   #不同步mysql系统数据库

:x   #保存退出


13.png


service mysqld  restart  #重启MySQL

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

show variables like 'server_id';  #查看server-id的值是否为1


mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1             |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      107 | newsys       | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

show master status;  #查看主服务器,出现以下类似信息

 
注意:这里记住File的值:mysql-bin.000005和Position的值:107,后面会用到。


3、从服务器设置:

vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容

server-id=2   #设置服务器id,修改其值为2,表示为从数据库

log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。

replicate-do-db=newsys   #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行

replicate-ignore-db=mysql   #不同步mysql系统数据库

read_only  #设置数据库只读


#如果以上没有的就添加上。


:x    #保存退出

service mysqld restart   #重启MySQL

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

show variables like 'server_id';  #查看server-id的值,必须为上面设置的2,否则请返回修改配置文件

mysql> show variables like 'server_id';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+

| server_id     | 2            |
+---------------+-------+

1 row in set (0.01 sec)

slave stop;   #停止slave同步进程


这里需要注意的是,如果版本是5.6 那么我们使用   start slave ;  这是不一样的。

如果我们写  slave start  会sql错误。



change master to master_host='192.168.61.105',master_user='songbak',master_password='123',master_log_file='mysql-bin.000005' ,master_log_pos=107;    
#执行同步语句


#启动

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

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.61.105
                  Master_User: songbak
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 107
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: newsys
          Replicate_Ignore_DB: mysql
           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: 107
              Relay_Log_Space: 413
              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:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)


注意查看:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

以上这两个参数的值为Yes,即说明配置成功!



如果其中一台服务器是5.6 必须在mysqld 中加上 这句代码,否则同步失败

binlog-checksum=none

4). Slave can not handle replication events with the checksum that master is configured to log

  这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum。除了把master的设置从crc32改到none

6.jpg





测试:

主服务器:

14.png



从服务器:

15.png