需要设置mysql数据库主从,首先需要安装数据库啊
如果还没有安装:
请参考:
数据库安装好以后,看配置:
主: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数据一致
这就是工作的原理。
Replication常见方案:
2、M-S-S
使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates
5、One slave Muti master 一从对多主
好处:节省成本,将多个master数据自动化整合
缺陷:对库和表数据的修改较多
3、M-M 双主互备
很多人误以为这样可以做到MySQL负载均衡,实际什么没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性
4、M-M-M
监控三台机器互相做对方的master
天生的缺陷:复制延迟,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;
这就看到了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
配置从数据库服务器xiaogAN63
两台数据库服务器mysql版本要一致
mysql> show variables like '%version%';
测试连接到主服务器是否成功
mysql -uslave -p123456 -h 192.168.31.64
只有复制的权限
导入数据库,和主数据库服务器保持一致
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 查看状态
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
文本框是mysql5.1的配置
再到主服务器 xiaogan64 上查看状态:
mysql> show processlist \G
插入数据测试同步:
mysql> insert into Test.xiaogan values (11,'ganbugan');
从数据库上查看:
排错:
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
从服务器 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 # 不用修改
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)
#添加备份的用户
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
备注:在导出之前可以先进入MySQL控制台执行下面命令
登录mysql控制端:执行锁表命令
flush tables with read lock; #数据库只读锁定命令,防止导出数据库的时候有数据写入
这样进行备份保证数据万无一失。
备份结束后,可以解除表锁定
unlock tables; #解除锁定
#把newsysbak.sql 文件上传到 192.168.61.104 的root目录下, 使用root 用户登录
scp /root/newsysbak.sql root@192.168.61.104:/root
2、导入到从服务器
#创建数据库
create database newsys default charset utf8;
#导入数据
use newsys;
source /root/newsysbak.sql
在从服务器上,使用刚刚创建的用户登录一下,看看是否可以登录:
mysql -u songbak -h 192.168.61.105 -p
如果 看到以上的界面,证明能够登录成功!
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 #保存退出
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
测试:
主服务器:
从服务器: