MySQL主从复制实践与部署

本文主要介绍在单机单数据库多实例的环境下,实现MySQL主从复制功能


基本流程:

1.MySQL主从复制介绍

2.主从复制数据库实战环境准备

3.在主库Master上执行操作配置

4.在MySQL从库上执行的操作过程

5.启动从库同步开关,测试主动复制配置情况

6.MySQL主从复制配置步骤总结



流程一:MySQL主从复制介绍

Mysql数据库的主从复制方案,与使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过Mysql的主从复制是其自带的功能,无需借助第三方工具,而且,Mysql的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句,重新应用到Mysql数据库中。

Mysql的主从复制是一个异步的过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master和Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在Slave端,另外一个线程(I/O线程)在Master端。要实现Mysql的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现,要打开MySQL的binlog记录功能,可通过在MySQL的配置文件my.cnf中mysqld模块([mysqld]标识后的参数部分)增加“log-bin”参数选项来实现。因为整个复制过程实际上就是Slave端从Master端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作。

MySQL主从复制原理的重点总结:

#主从复制是异步的逻辑的SQL语句级的复制。

#复制时,主库有一个I/O线程,从库有两个线程,即I/O和SQL线程。

#实现主从复制的必要条件是主库要开启记录binlog功能。

#作为复制的所有MySQL节点的server_id都不能相同。

#binlog文件只记录对数据库有更改的SQL语句(来自主数据库内容的变更),不记录任何查询(如select,show)语句。



流程二:主从复制数据库实战环境准备

1)主从复制实践准备

本文以单机数据库多实例的环境为例讲解。配置MySQL多实例可参考http://blog.51cto.com/13707680/2112502

实例端口信息如下:

[[email protected] 3308]# netstat -tnlp | grep 330

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      8675/mysqld

tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      8271/mysqld

tcp        0      0 0.0.0.0:3308                0.0.0.0:*                   LISTEN      9256/mysqld

2)定义主从复制的服务器角色

主库(mysql master): 【ip为192.168.1.72  port 为 3306】

从库(mysql slave)   : 【ip为192.168.1.72  port 为 3307】

从库(mysql slave)   : 【ip为192.168.1.72  port 为 3308】



流程三:在主库Master上执行操作配置

1)设置server_id值并开启binlog功能参数

[[email protected] 3306]# egrep "server_id|log_bin" /data/3306/my.cnf

log_bin=/data/3306/mysql-bin

server_id=3306   #用于同步的每台机器或实例server_id都不能相同

上面这个两个参数一定在放在mysqld模块下,否则会出错。

2)重启主库MySQL服务,命令如下:

[[email protected] 3306]# /data/3306/mysqld restart

mysqladmin: connect to server at 'localhost' failed

error: 'Access denied for user 'root'@'localhost' (using password: NO)'

这里报错说要密码,修改下启动脚本文件

[[email protected] 3306]# grep Stop= /data/3306/mysqld

Stop='mysqladmin -uroot -pywxi123 -S /data/3306/mysql.sock shutdown'

[[email protected] 3306]# /data/3306/mysqld  restart

MySQL already Stoped                                       [  OK  ]

MySQL 3306 Starting                                        [  OK  ]

3)登录数据库,检查参数的更改情况,如下:

[[email protected] 3306]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.32-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like 'server_id';

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

| Variable_name | Value |

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

| server_id     | 3306  |

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

1 row in set (0.01 sec)

mysql> show variables like 'log_bin';

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

| Variable_name | Value |

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

| log_bin       | ON    |

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

1 row in set (0.00 sec)

#这样binlog功能就正常开启了。

4)在主库上建立用于主从复制的账号

mysql -uroot -pywxi123 -S /data/3306/mysql.sock

grant replication slave on *.* to 'rep'@'192.168.1.%' identified by 'ywxi123';   #rep为同步账号,*.*为所有库所有表,192.168.1.%为授权的主机网段。使用%表示允许整个网段

flush privileges;   #刷新权限,是授权的权限生效

检查主库创建的rep复制账号命令及结果如下:

mysql> select user,host from mysql.user where user='rep';

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

| user | host        |

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

| rep  | 192.168.1.% |

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

1 row in set (0.00 sec)

mysql> show grants for [email protected]'192.168.1.%';

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

| Grants for [email protected]%                                                                                               |

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

| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.1.%' IDENTIFIED BY PASSWORD '*1CDCFBE8F2B7FACC6BF289A82F072AB9A2D90844' |

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

1 row in set (0.00 sec)

5)实现对主数据库锁表只读

mysql> flush table with read lock;

Query OK, 0 rows affected (0.00 sec)

锁表后查看主库状态:

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000006 |      334 |              |                  |

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

1 row in set (0.00 sec)

#锁表这个操作就是为了更好的导出和备份数据

[[email protected] 3307]# mkdir -p /server/backup

[[email protected] 3307]# mysqldump -uroot -p'ywxi123' -S /data/3306/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

#导出数据完毕后,解锁主库,恢复可写,命令如下:

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)



流程四:在MySQL从库上执行的操作过程

1)设置server_id值并关闭binlog功能参数

如果从库不做级联复制,并且不做复制用,就不要开启binlog,开启了反而会增加从库磁盘I/O等的压力。

[[email protected] 3306]# egrep "server_id|log_bin" /data/3307/my.cnf

#log_bin=/data/3307/mysql-bin

server_id=3307   #ID是唯一的

2)重启3307的从数据库

[[email protected] 3307]# /data/3307/mysqld stop

[[email protected] 3307]# /data/3307/mysqld start

3)登录数据库检查参数的改变情况

mysql> show variables like 'log_bin';

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

| Variable_name | Value |

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

| log_bin       | OFF   |

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

1 row in set (0.00 sec)

mysql> show variables like 'server_id';

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

| Variable_name | Value |

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

| server_id     | 3307  |

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

1 row in set (0.00 sec)

4)把从主库mysqldump导出的数据恢复到从库

操作命令如下:

cd /server/backup/

mysqldump -uroot -p'ywxi123' -S /data/3307/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

5)在3307从库上配置复制参数

[[email protected] backup]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock -e "show master status"

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000006 |      334 |              |                  |

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

[[email protected] backup]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock <<EOF

CHANGE MASTER TO

MASTER_HOST='192.168.1.72',

MASTER_PORT=3306,

MASTER_USER='rep',

MASTER_PASSWORD='ywxi123',

MASTER_LOG_FILE='mysql-bin.000006',

MASTER_LOG_POS=334;

EOF

#这个步骤的参数一定不能错,否则,数据库复制配置会失败



流程五:启动从库同步开关,测试主动复制配置情况

1)启动从库主从复制开关,并查看复制状态

[[email protected] data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "start slave;"

[[email protected] data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

#这是最关键的三个状态参数,一定要跟上面一致,不然测试就会出错

2)测试主从复制结果,再加一台3308从库

在主库上写入数据,然后观察从库的数据状况。

[[email protected] data]# mysql -uroot -p'ywxi123' -S /data/3306/mysql.sock -e "create database ywxi;"

[[email protected] data]# mysql -uroot -p'ywxi123' -S /data/3307/mysql.sock -e "show databases like 'ywxi'"

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

| Database (ywxi) |

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

| ywxi            |

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

[[email protected] data]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock -e "drop database ywxi;"

[[email protected] data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "show databases like 'ywxi';"

[[email protected] data]#

#根据测试可以判断,主从库是同步的。

快速加一台从库3308命令集如下:

sed  /log_bin/'s/.*/#&1/g' /data/3308/my.cnf -i

mysql -uroot -S /data/3308/mysql.sock -e "show variables like 'log_bin';"

mysql -uroot -S /data/3308/mysql.sock -e "show variables like 'server_id';"

cd /server/backup/

mysqldump -uroot  -S /data/3308/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

mysql -uroot  -S /data/3308/mysql.sock <<EOF

> CHANGE MASTER TO

> MASTER_HOST='192.168.1.72',

> MASTER_PORT=3306,

> MASTER_USER='rep',

> MASTER_PASSWORD='ywxi123',

> MASTER_LOG_FILE='mysql-bin.000006',

> MASTER_LOG_POS=334;

> EOF

mysql -uroot -S /data/3308/mysql.sock -e "start slave;"

mysql -uroot  -S /data/3308/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"



流程六:MySQL主从复制配置步骤总结

MySQL主从复制配置完整步骤如下:

1)准备两台数据库或者单台多实例环境,确定能正常启动和登录即可

2)配置my.cnf文件:主库配置log_bin和server_id参数;从库配置server_id,这个值不能与主库一样是唯一的,一般不建议开启log-bin功能。配置参数后一定要重启服务生效

3)登录主库,增加从库连接主库同步的账户,例如:rep,并授权replication slave同步的权限

4)登录主库,整库锁表flush table with read lock (窗口关闭后即失效,超时参数设置的时间到了,锁表也失效),然后show master status 查看binlog的位置状态

5)新开窗口,在linux命令行备份导出原有的数据库数据,并拷贝到从库所在的服务器目录。如果数据库数据量很大,并且允许停机,可以停机打包,而不用mysqldump

6)导出主数据后,执行unlock tables解锁主库

7)把主库导出的数据恢复到从库

8)根据主库的show master status 查看到的binlog的位置状态,在从库执行change master to.....语句。

9)从库开启复制开关,即执行start slave;(要在change语句之后执行,不然插入不了语句)

10)从库show slave status\G,检查同步状态,并在主库进行更新测试。

原文地址:http://blog.51cto.com/13707680/2112509

时间: 2024-10-10 19:53:49

MySQL主从复制实践与部署的相关文章

mysql主从复制实践之单数据库多实例

1.主从复制数据库实战环境准备 MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器之间,每台服务器都部署一个独立的数据库的环境.本文以单机数据库多实例的环境进行实践. 2.主从复制服务器角色定义 序号 数据库角色 数据库IP信息 数据库port信息 数据库配置路径 1 master 192.168.1.20 3306 /data/3306 2 slave1 192.168.1.20 3307 /data/3307 3 slave2 192.168.1.

mysql 主从复制 实践

异步主从复制   主从部署步骤: 备份还原 使用mysqldump或者xtrabackup 把主库现有基础数据还原到从库 授权 grant replication slave on *.* 给从库一个复制binlog的账号 配置复制,并启动 从库上配置复制信息,并指向master 查看主从复制信息 show slave status \G 1)备份还原 主:101 从:100 a)主库备份 [email protected]untu:~$ mysqldump -uroot -p --socket

单服务器MySQL主从复制实践

一.先配置好两个MySQL实例并可以正常启动 1. 首先在Linux上先安装好MySQL数据库,此处省略详细的安装步骤(可以使用yum安装) yum -y install mysqld mysql 2. 在/usr/local目录下新建目录mysqls/mysql1, mysqls/mysql2 分别作为我们的主数据和从数据库目录,新建mysqls/run作为MySQL PID存放目录,新建mysqls/log作为MySQL日志目录 mkdir -p /usr/local/mysqls/mysq

MySQL主从复制介绍

1.1 MySQL主从复制原理介绍 MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(我们称之为Master)复制到另一个MySQL数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的,其中有两个线程(SQL线程和IO线程)在Slave端,另外一个线程(I/O线程)在Master端. 要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现.因为整个复制过

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

http://heylinux.com/archives/1004.html MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy

MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

Technorati 标签: 那你魔鬼 一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读

【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构 一、业务发展驱动数据发展

一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业务中断,给公司和用户造成双重损失.那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的. 目前,大部分的主流关系型数据库都提供了主从热备功能,通过配置

MySQL 主从复制 + MySQL Router 部署测试

4个节点 1.MySQLDB1  192.168.1.41  (MySQL 主节点) 2.MySQLDB2  192.168.1.42  (MySQL从节点) 3.MySQLDB3  192.168.1.43  (MySQL从节点) 4.MySQLRouter  192.168.1.47  (MySQLRouter服务节点) 软件版本说明: 1.操作系统  CentOS6.6_x86_64 2.MySQLServer  5.7.16 3.MySQLRouter  2.0.4 一.部署MySQL主

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的. 如下图所示: 下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考. 一.MySQL的安装与