mysql的主从互备

  • 本文的两个图片参考http://www.cnblogs.com/kristain/articles/4142970.html中的文件.
  • MySQL数据库主从复制原理

mysql的主从互备_第1张图片

Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。

a) 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。

b) Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)

c) Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;

d) Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

mysql主从实战配置

 

mysql的主从互备_第2张图片

环境搭建:

yum  install -y  mysql mysql-devel mysql-server mysql-libs

1, 第一步,

在A上面创建专门用于备份的 用户: 

grant replication slave on *.* to 'user1'@'192.***.***.***' identified by 'hj34$%&mnkb';
这里的user1 和密码等会儿再slave端是需要的,

2. 开启主服务器的 binarylog。

一下是yum安装的一套标准配置文件:

[mysqld]  

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

 # Disabling symbolic-links is recommended to prevent assorted security risks  

 symbolic-links=0 

 log-bin=mysql-bin  

 server-id = 1 

 auto_increment_offset=1    

 auto_increment_increment=2

 [mysqld_safe]  

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid   

 replicate-do-db =all

01 创建/data/mysql数据目录,mkdir –p /data/mysql ;chown –R mysqld:mysqld /data/mysql 

02启动mysql即可,/etc/init.d/mysqld  restart 

3.修改slave Mysql数据库my.cnf配置文件内容如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
server-id = 2
auto_increment_offset=2

auto_increment_increment=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

先锁定master的discuz数据库:

mysql>flush tables with read lock;

导出数据库:

mysqldump -uroot -pxxx discuz >discuz.sql

在slave端创建数据库:

mysql>create database discuz;

导入数据库

mysql -uroot -pxxx discuz<discuz.sql

在Master数据库服务器上设置权限,执行如下命令:

grant  replication  slave  on *.* to  'tongbu'@'%'  identified by  '123456';

在Master 数据库执行如下命令:

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000006 |       98 |              |                  | 

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

然后在slave服务器指定master IP和同步的pos点:

change master to 

master_host='192.168.33.10',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98;

在slave启动slave start,并执行show slave status\G查看Mysql主从状态.

自此,主从同步,搭建完成.

主从同步注意事项

mysql主从同步的原理:

1、在master上开启bin-log日志功能,记录更新、插入、删除的语句。

2、必须开启三个线程,主上开启io线程,从上开启io线程和sql线程。

3、从上io线程去连接master,master通过io线程检查有slave过来的请求,请求日志、postsion位置。

4、master将这些相应的日志返回给slave,slave自己去下载到本地的realy_log里面,写入一个master-info

日志记录同步的点。

5、slave的sql线程检查到realy-log日志有更新,然后在本地去exec执行。

6、主从同步是属于异步方式。

20133

insert into table values ('wgkgood','[email protected]');

20134

insert into t1 values ('Linux系统安装方法','dsfjsdklsdfjsdlk');

20135

change master to master_host='192.168.1.12',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=272;

二、Mysql主从同步,master突然down机,如何恢复:

1、slave数据库必须启动,在slave上授权网站IP对数据库的访问权限。

2、修改网站服务器config目录下:

config_global.php config_ucenter.php 把原先master ip改成slave ip地址。

3、重启httpd服务,切换成功。

作业:

1、在master上已经创建好了discuz数据库,同时有论坛,新建从,怎么同步数据?

mysqldump >mysql.sql ;导入进去,再同步。

 主从同步错误解决方法

方法一:忽略错误后,继续同步

该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况

解决: 

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.sql

这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失

3)查看master 状态

mysql> show master status;

+-------------------+----------+--------------+-------------------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB              |

+-------------------+----------+--------------+-------------------------------+

| mysqld-bin.000001 |     272 |              |

+-------------------+----------+--------------+-------------------------------+

1 row in set (0.00 sec)

4)把mysql备份文件传到从库机器,进行数据恢复

#使用scp命令

[root@server01mysql]# scp mysql.sql [email protected]:/tmp/

5)停止从库的状态

mysql> stop slave;

6)然后到从库执行mysql命令,导入数据备份

mysql> source /tmp/mysql.sql

7)设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项

change master to master_host = '192.168.1.12', master_user = 'tongbu',master_password='123456', master_log_file = 'mysqld-bin.000001', master_log_pos=272;

8)重新开启从同步

mysql> start slave;

9)查看同步状态

mysql> show slave status\G  查看:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

10)在master上解锁:

   unlock tables;

 

数据库的使用:

每天进行增量备份,每周进行一次全部备份(企业中一般是一主一从,从上再跟两个从,主要是为了分担主数据库的读写压力,备份在第一台从上备份)

企业中有程序去控制 在哪一台数据库上写数据,哪一台数据库去读数据.

主主互备:

在slave端的my.cnf中 只需开启binarylog,server-id不变,还是2

然后在slave端给原来的master端授权

mysql> show master status;

mysql> change master to master_host = '192.168.1.12', master_user = 'tongbu',master_password='123456', master_log_file = 'mysqld-bin.000001', master_log_pos=272;

相当于是做了两个主从,用的是两个log-bin日志,互为主从

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mysql的主从互备)