Mysql主从复制

来源:互联网 发布:java lucene 教程 编辑:程序博客网 时间:2024/06/05 13:35

一、主从配置的原理:
MySQL的 Replication 是一个异步的复制过程,从一个 MySQL instace(我们称之为 Master)复制到另一个MySQL instance(我们称之 Slave)。在 Master 与 Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(MySQL-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用“—log-bin” 参数选项,或者在 my.cnf 配置文件中的 MySQLd 参数组([MySQLd]标识后的参数部分)增加“log-bin” 参数项。
MySQL 复制的基本过程如下:
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 BinaryLog 中的位置;
3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的RelayLog文件(MySQL-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave端执行了同样的 Query,所以两端的数据是完全一样的。


二、设置MySQL主从配置的优点
1、解决web应用系统,数据库出现的性能瓶颈,采用数据库集群的方式来实现查询负载;一个系统中数据库的查询操作比更新操作要多得多,通过多台查询服务器将数据库的查询分担到不同的查询服务器上从而提高查询效率。
2、MySQL数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除与更新操作,而从数据库则专门用来进行数据查询操作,这样可以将更新操作和查询操作分担到不同的数据库上,从而提高了查询效率。

三、主从数据库服务器的配置 (可以设置一个或者多个从服务器)
环境:
数据库版本号: 5.5.32 MySQL
主库电脑的IP:192.168.4.15
丛库电脑的IP:192.168.4.21

1、首先查看两台机器之间的网络是否是通的
用其中的一台ping另外一台,如下用IP地址为192.168.4.21的主机ping192.168.4.15的机器,其结果如下:

如果结果如上图所示,则说明两台机器的网络是通的,否则请先检查网络。
2、打开主数据库,在主数据库里面建一个需要同步的数据库,如下 user数据库

3、配置主数据库服务器
(1)、修改MySQL的配置文件(my.ini),如下,在mysqlld里面添加:

上面的这些配置的含义:
- server-id 顾名思义就是服务器标识id号了,每一台服务器都有一个固定 的标示id。
- log-bin MySQL进行主从复制是通过二进制的日志文件来进行的,此处是 开启MySQL的日志功能
- binlog-do-db 是你需要复制的数据库名称,
- binlog-ignore-db 是不需要复制的数据库名称
(2)、重新启动主数据库,给主数据库服务器授予一个可以进行复制的用户,如下的slave,这样从服务器就能通过这个连接用户有权限来访问主数据库服务器 :
GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'slave'@'192.168.4.21' IDENTIFIED BY '123456' with grant option ;
如下:

密码 用户权限 用户名 从机IP
设置完毕以后可以通过NAVCAT查看权限:

(3)、重新启动主数据库,通过mysql>show master status;监控主服务器的状态

*记下 file 和 possion的值,这里的file,position会在从库的配置里用到。
4、从数据库服务器的配置
(1)、修改MySQL的配置文件(my.ini),如下,在mysqlld里面添加:、

#server-id = 1 ####必须把server-id = 1注释掉,
上面的这些配置的含义:
- server-id=2 从数据库的唯一标示id为2
- master-host=192.168.4.15 #主数据库的ip地址
- master-user=slave #主数据库已经授权的可以连接复制的用户的用户名
- master-password=123456 #主数据库已经授权的可以连接复制的用户的密码
- master-port=3306 #主数据库的端口号
(2)、启动从数据库
我当时遇到的情况是没有成功启动,查看error日志
发现

然后把 下面四行注释掉
master-host=192.168.4.15 #主数据库的ip地址
master-user=slave #主数据库已经授权的可以连接复制的用户的用户名
master-password=123456 #主数据库已经授权的可以连接复制的用户的密码
master-port=3306 #主数据库的端口号
再执行下面的命令。
slave stop;
change master to master_host='192.168.4.15', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=107;
slave start;
如下:

(3)、可以通过 show slave status;来看看从库的情况。不过信息太多。为了方便查看可以用下面这个命令
show slave status \G;
显示结果如下:


查看上面的Slave_IO_Running: Yes 和Slave_SQL_Running: Yes 2个都为yes则证明主从同步正常,如果有任一个显示NO,则证明同步有问题。可以查看数据库日志文件,里面基本上会显示出错误之处,根据错误一步一步排查,基本上都可以解决的。
3、在从数据库中创建一个与要备份的主数据库相同的数据库名,则配置完成。从数据库会随着主数据库的改变动态的同步数据库。如下,在主数据库的user表中创建一个user表
此时查看从数据库,可以发现:

则说明主从数据库搭建成功。

五、常见问题与解答
1、现象:修改完配置后,
重启MySQL,提示MySQL manager or server PID file could not be found
解决:查找进程中的MySQL,kill掉
> service MySQL restart
> ps -aux|grep myslq
> kill 进程号
# service MySQL start
注:MySQL.sock文件在MySQL启动后才会生成,位置为/tmp下或/var/lib/MySQL/下
2、现象:从数据库无法同步,
show slave status显示Slave_SQL_Running为No,Seconds_Behind_Master为null
原因: a.程序可能在slave上进行了写操作
b.也可能是slave机器重起后,事务回滚造成的.
解决:方法一:
MySQL> slave stop;
MySQL> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
MySQL> slave start;
解决:方法二:
Slave库,MySQL> slave stop; --停掉slave服务
Master库,MySQL> show master status;
+----------------------+----------+--------------+------------------+
|File |Position |Binlog_Do_DB |Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| MySQL-bin.000040 | 324 | | |
+----------------------+----------+--------------+------------------+
然后到slave服务器上执行手动同步
MySQL> change master to
> master_host='192.168.1.2',
> master_user='repuser',
> master_password='123456',
> master_port=3306,
> master_log_file='MySQL-bin.000040',
> master_log_pos=324;
启动slave服务,MySQL> slave start;
通过show slave status查看Slave_SQL_Running为Yes,Seconds_Behind_Master为0,即为正常。
注:手动同步需要停止master的写操作!
3、现象:从数据库无法同步,
show slave status显示Slave_IO_Running为No,Seconds_Behind_Master为null
解决:重启主数据库
service MySQL restart
MySQL> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| MySQL-bin.000001 | 98 | | |
+------------------+----------+--------------+------------------+
MySQL> slave stop;
MySQL> change master to Master_Log_File=‘MySQL-bin.000001',Master_Log_Pos=98
MySQL> slave start;



0 0
原创粉丝点击