mysql主从复制

266 阅读4分钟

一、什么是主从复制

至少两台数据库服务器,可以分别设置主服务器和从服务器,对主服务器的任何操作都会同步到从服务器上

二、实现原理

mysql中有一种日志,叫做bin日志(二进制日志),会记录下所有修改过数据库的sql语句。主从复制的原理实际是多台服务器都开启bin日志,然后主服务器会把执行过的sql语句记录到bin日志中,之后从服务器读取这个bin日志,把该日志的内容保存到自己中继日志里面,从服务器再把中继日志中记录的sql语句同样的执行一遍。这样从服务器上的数据就和主服务器相同了。

实现的技术是:用户的授权,和log-bin日志的开启。

三、log-bin日志

1、如何开启log-bin日志(windows下的开启log-bin日志) 打开mysql.ini的配置文件

Linux在 my.cnf配置文件中进行配置

2、如何 查看log-bin日志里面的内容。

使用一个命令, mysqlbinlog --no-defaults 日志的文件名及路径 ./mysqlbinlog --no-defaults /usr/local/mysql/var/mysql-bin.000062

3、log-bin日志相关的一些命令操作

flush logs 产生一个新的log-bin日志

reset master :清空以前的log-bin日志,并产生一个新的log-bin日志

show master status; 查看最新的一个log-bin日志,包括最新的pos位置。

4、使用bin-log日志完成一个案例,恢复数据的一个案例 步骤:

(1)新建一张表

create table nihao(id int);

(2)flush logs 产生一个新的log-bin日志文件

insert into nihao values(1000);
insert into nihao values(2000);
insert into nihao values(3000);

(3)flush logs产生一个新的log-bin日志文件。

(4)delete from nihao

(5)要求恢复数据

比如一个家公司,在上午9:00备份了一次数据。到9:30时,由于员工的误操作,则把所有的数据都给删除了。要求要恢复数据到9:30.

思路:打开log-bin日志文件,进行分析。查找insert语句的pos位置。根据pos位置来恢复数据 第一步,查看当前记录日志文件的信息

第二步,查看操作的SQL语句的位置(./mysqlbinlog --no-defaults /usr/local/mysql/var/mysql-bin.000062)

第三步,使用以下命令进行还原

mysqlbinlog --no-defaults 日志文件 --start-pos=”开始的pos点” --stop-pos=’结束的pos点’ | mysql -uroot -proot test

./mysqlbinlog --no-defaults /usr/local/mysql/var/mysql-bin.000001 --start-position=2072 --stop-position=2626 | mysql -uroot -proot test

四、主从配置

  • 1、配置主服务器:

(1)主和从服务器都要开启log-bin日志,每台服务器设置一个唯一的server-id的值。并重启服务器。

(2)要给从服务器授权一个用户,该用户授予复制权限。 grant replication slave on *.* to "root"@"%" identified by "root";

(3)要查看主服务器里面log-bin日志的名字和pos位置。(停止对主服务器的操作) show master status;

  • 2、配置从服务器

(1)执行stop slave停止从服务器: stop slave

(2)具体的配置:

change master to master_host=’主服务器的ip’,master_user=’授权的用户名’,master_password=”授权的密码”,master_log_file=’log-bin日志文件的名称’,master_log_pos=pos位置;

mysql> change master to master_host='106.15.94.201',master_user='zhu',master_pas sword='123456',master_log_file='mysql-bin.000032',master_log_pos=810;

(3)开启从服务器 start slave
(4)查看从服务器的状态: show slave status;

Slave_IO_Running:Yes

此进程负责从服务器从主服务器上读取binlog 日志,并写入从服务器上的中继日志。 Slave_SQL_Running:Yes

此进程负责读取并且执行中继日志中的binlog日志, 注:以上两个都为yes则表明成功,只要其中一个进程的状态是no,则表示复制进程停止,错误原因可以从”last_error”字段的值中看到。 如果 Slave_IO_Running:Connecting 这几个问题

一直无法进行正确的复制。查看错误日志文件显示:Connecting error_code:2003 看来是slave 没有连接上master,在网上搜索一下,网上文章大都只是指出了可能的三种错误:

  1. 网络不通

  2. 密码不对

  3. pos不对

  4. 防火墙没有关闭。

  5. 当初创建账号和给权限的时候,没有刷新权限;

    (通过 :flush privileges 命令刷新权限!)

演示效果: 主服务器插入数据,可以在从服务器上同步 主服务器

从服务器

3、如何撤销从服务器

(1)stop slave

(2)reset slave all

从服务器

主服务器