`

Mysql 主从、主主复制详解

阅读更多
Mysql 主从、主主复制详解
一、复制的介绍
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与的表所进行的更新之间的冲突。单向复制有利于健壮性、速度和系统管理:l 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。l 通过在主服从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。l 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的MySQL 使用3 个线程来执行复制功能(其中1 个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O 线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL 线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。默认中继日志使用host_name-relay-bin.nnnnnn 形式的文件名,其中host_name 是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。当SQL 线程执行完中继日志中的所有事件后,中继日志将会被自动删除。从服务器在数据目录中另外创建两个状态文件--master.info 和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。

二、实验环境
虚拟机操作系统:Centos 5.5 64bit
数据库版本:mysql 5.1.49 (参考“Centos 5使用yum安装Mysql”文档)
A: master 计算机名:beijing IP地址:192.168.20.101
B: slave 计算机名:shanghai IP地址:192.168.20.102

三、mysql的单向复制
注意 mysql 数据库的版本,两个数据库版本要相同,或者slave比master版本低!

1、在主服务器上为复制设置一个连接账户。该账户必须授予REPLICATION SLAVE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。
# mysql -uroot -p123456
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.20.%'IDENTIFIED BY '123456';

2、在主服务器上建立测试数据库test1

[code="java"]mysql> create database test1;
mysql> use test1;
mysql> create table user(id int(4),name varchar(20));
mysql> insert into user values(1,"mary");
mysql> insert into user values(2,"joe");
// 刷新权限,使设置生效
mysql>Flush privileges;



3、配置主服务器的my.cof
// mysql客户端程序不要退出,在/etc/my.cnf配置文件中添加以下内容
log-bin=mysql-bin # 启动二进制日志系统
server-id=1 # 本机数据库ID 标示为主服务器
log-bin=/var/log/mysql/updatelog # 设定生成log文件名,这里的路径没有mysql目录要手动创建并给于它mysql用户的权限。
binlog-do-db=test1 # 二进制需要同步的数据库名
binlog-ignore-db=mysql,test # 避免同步mysql用户配置,以免不必要的麻烦

// 创建更新日志的目录并给mysql用户的权限
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql

4、执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句, 并将本地需要同步数据库打包拷贝到从数据库上
mysql> FLUSH TABLES WITH READ LOCK;
// 在另一个终端对主服务器数据目录做备份
# cd /var/lib/mysql/
# tar -cvf /tmp/mysqldb.tar test1/
// 通过远程拷贝到从服务器上,通过这个拷贝的时候需要输入从服务器root密码
# scp /tmp/mysqldb.tar root@192.168.20.102:/var/lib/mysql
// 对主服务器进行解锁
mysql> UNLOCK TABLES
// 重启mysql服务
# /etc/init.d/mysqld restart


5、配置从服务器
// 配置slave服务器/etc/my.cnf 文件,添加以下内容:
server-id=2 # 从服务器ID号,不要和主ID相同
master-host=192.168.20.102 # 指定主服务器IP地址
master-user=replication # 指定在主服务器上可以进行同步的用户名
master-password=123456 # 密码
master-port=3306 # 同步所用端口
master-connect-retry=60 # 断点从新连接时间
replicate-ignore-db=mysql # 屏蔽对mysql库的同步
replicate-do-db=test1 # 同步的数据库的名称


6、从服务器上装在主服务器数据库
# cd /var/lib/mysql/
# tar xvf mysqldb.tar
# rm mysqldb.tar
# /etc/init.d/mysqld restart
// 启动从服务器线程:
# mysql -uroot -p123456
mysql> START SLAVE;


补充:如果你的数据库完全一样就没有必要去做这步了。

7、验证配置
// 主服务器:
mysql > SHOW MASTER STATUS;
+------------------+----------+---------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+---------------+------------------+
| mysql-bin.000004 | 106 | test1,netseek | mysql,test |
+------------------+----------+---------------+------------------+
//(同步之前如果怀疑主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命行
同步方法)在从服务器执行MySQL 命令下:
mysql> SLAVE STOP; #先停止slave服务
mysql> CHANGE MASTER TO MASTER_LOG_FILE='updatelog.000004',MASTER_LOG_
POS=106;
// 根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果。 [color=red]这里必须得做,否则不会同步的[/color]
mysql> SLAVE START; #启动从服务器同步服务
// 用show slave status\G;看一下从服务器的同步情况
mysql> SHOW SLAVE STATUS\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已经在同步.


8、测试
// 在主服务器上建立一个表
mysql> use test1;
mysql> create table name(id int(4),name varchar(20));
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
| user |
+-----------------+
2 rows in set (0.01 sec)
// 在从服务器上查询
mysql> use test1;
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
| user |
+-----------------+
2 rows in set (0.00 sec)
单项复制试验成功!!!!



四、双向同步配置
1、修改原slave 服务器配置
192.168.20.102
// 配置原slave服务器/etc/my.cnf文件,添加红字的内容:
server-id=2 # 从服务器ID号,不要和主ID相同
master-host=192.168.20.101 # 指定主服务器IP地址
master-user=replication # 指定在主服务器上可以进行同步的用户名
master-password=123456 # 密码
master-port=3306 # 同步所用端口
master-connect-retry=60 # 断点从新连接时间
replicate-ignore-db=mysql # 屏蔽对mysql库的同步
replicate-do-db=test1 # 同步的数据库的名称
log-bin=/var/log/mysql/updatelog # 设定生成log文件名
binlog-do-db=test1 # 设置同步数据库名
binlog-ignore-db=mysql # 避免同步mysql用户配置,以免不必要的麻烦


2、创建更新日志的目录并给mysql用户的权限
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql


3、重新启动mysql服务,创建一个同步专用账号
# service mysqld restart
//给与从服务器用户replication的同步权限
# mysql -uroot -p123456
mysql> GRANT REPLICATION SLAVE ON *.* TO
'replication'@'192.168.20.%'IDENTIFIED BY '123456';
//刷新权限,使设置生效
mysql>Flush privileges;


4、修改原master配置文件
192.168.20.101
// 配置原master务器/etc/my.cnf文件,添加红字的内容:
log-bin=mysql-bin # 启动二进制日志系统
server-id=1 # 本机数据库ID 标示为主
log-bin=/var/log/mysql/updatelog # 设定生成log文件名,这里的路径没有mysql
目录要手动创建并给于它mysql用户的权限。
binlog-do-db=test1 # 二进制需要同步的数据库名
binlog-ignore-db=mysql,test # 避免同步mysql用户配置,以免不必要的麻烦
master-host=192.168.20.102 # 设置从原slave数据库同步更新
master-user=replication # 更新用户
master-password=123456 # 密码
master-port=3306 # 端口
replicate-do-db=test1 # 需要更新的库
// 重启mysql服务
# service mysqld restart

// 在B服务器查询
192.168.20.102
# mysql -uroot -p123456
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| updatelog.000001 | 106 | test1 | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
// 在A服务器查询
192.168.20.101
# mysql -uroot -p123456
mysql> SHOW MASTER STATUS;
// 先停止slave服务
mysql> SLAVE STOP;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.20.128',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='updatelog.000001',MASTER_LOG_POS=106;
// 根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果。 [color=red](上面的必须得执行,否则不可以同步[/color])
// 启动B服务器同步服务
192.168.20.102
mysql> SLAVE START;


5、验证配置
// 在A服务器上进入mysql命令行
192.168.20.101
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步。
// 在B服务器上进入mysql命令行
192.168.20.102
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步。
6、测试
// 在A服务器上建立一个表
192.168.20.101
mysql> use test1;
mysql> create table test1(id int(4),name varchar(20));
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
| test1 |
| user |
+-----------------+
3 rows in set (0.00 sec)
// 在B服务器上查询
192.168.20.102
mysql> use test1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
| test1 |
| user |
+-----------------+
3 rows in set (0.00 sec)
// 在B服务器上建立一个表
192.168.20.102
mysql> create table test2(id int(4),name varchar(20));
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| name |
| test1 |
| test2 |
| user |
+-----------------+
4 rows in set (0.00 sec)| user |
+-----------------+
3 rows in set (0.00 sec)
// 在A服务器上查询
192.168.20.101
mysql> show tables;
+-----------------+
| Tables_in_test1 |
| name |
| test1 |
| test2 |
| user |
+-----------------+
4 rows in set (0.00 sec)
双向复制试验成功!!!


------------------------------------------------------
最终配置
mysql1: 192.168.1.141
mysql1: 192.168.1.151

1) mysql1: 192.168.1.141
# vi /etc/my.cnf
在mysqld下加入:
#master config
log-bin=mysql-bin
server-id=1
log-bin=/var/log/mysql/updatelog
binlog-do-db=css_cn
binlog-ignore-db=mysql
#
#master bisynchronous config
master-host=192.168.1.151
master-user=replication
master-password=replication
master-port=3306
replicate-do-db=css_cn
#master-connect-retry=60
#replicate-ignore-db=mysql


linux下新增目录及授权
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql


mysql下创建授权账户
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.%'IDENTIFIED BY 'replication';
FLUSH PRIVILEGES;


mysql下设置同步
CHANGE MASTER TO MASTER_HOST='192.168.1.151',MASTER_USER='replication',MASTER_PASSWORD='replication',MASTER_PORT=3306


2) mysql1: 192.168.1.151
# vi /etc/my.cnf
在mysqld下加入:
#slave config
server-id=2
master-host=192.168.1.141
master-user=replication
master-password=replication
master-port=3306
master-connect-retry=60
replicate-ignore-db=mysql
replicate-do-db=css_cn
#
#slave bisynchronous config
log-bin=/var/log/mysql/updatelog
binlog-do-db=css_cn
binlog-ignore-db=mysql


linux下新增目录及授权
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql


mysql下创建授权账户
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.%'IDENTIFIED BY 'replication';
FLUSH PRIVILEGES;


mysql下设置同步
CHANGE MASTER TO MASTER_HOST='192.168.1.141',MASTER_USER='replication',MASTER_PASSWORD='replication',MASTER_PORT=3306

分享到:
评论

相关推荐

    《深入理解MySQL主从原理32讲》推荐篇

    导读: 作者:高鹏(网名八怪),《深入理解...八怪写作风格很是严谨,几乎每篇都是从源码入手去剖析MySQL主从复制相关的知识点。 强烈推荐大家订阅本专栏 业界大咖推荐序 从2016年开始八怪(本名高鹏)经常向我请教一

    MySQL主从复制搭建从入门到掌握

    ### MySQL主从复制搭建知识点详解 #### 一、MySQL主从复制概述 MySQL主从复制是一种数据同步机制,它能够将一个MySQL服务器(主服务器)的数据自动同步到一个或多个MySQL服务器(从服务器)。这种机制不仅可以提高...

    Mysql主从、主主复制完美试验文档

    ### MySQL 主从与主主复制详解 #### 一、复制概念及原理 MySQL 支持单向、异步复制机制,这种机制下,一个服务器扮演主服务器的角色,其他一个或多个服务器作为从服务器。主服务器负责将数据更新记录到二进制日志...

    MySQL主从复制.docx

    ### MySQL 主从复制详解 #### 一、引言 MySQL 的主从复制是一种常见的数据库架构模式,它能够帮助实现数据的自动备份与读写分离,从而增强数据安全性并提高数据库性能。本文将详细介绍 MySQL 主从复制的基本概念、...

    MySQL主从配置详解.pdf

    配置MySQL主从复制可以带来许多好处,如分散查询负载、提升查询效率、数据备份和读写分离等,但同时也需要注意配置过程中的细节和可能出现的问题。掌握MySQL主从配置的知识对于维护高效、稳定和安全的数据库环境至关...

    mysql主从复制原理详解图

    详细的结构分解,可以快速了解mysql主从复制的原理和对主从更清晰的了解。

    MySQL主从安装部署

    ### MySQL主从安装部署知识点详解 #### 一、MySQL主从安装部署概述 MySQL 主从复制是一种常见的数据备份和负载均衡技术,在多个服务器之间同步数据。通过设置一个或多个从服务器来复制主服务器上的数据变更操作,...

    MySQL主从复制架构原理与配置实践

    ### MySQL主从复制架构原理与配置实践 #### 一、MySQL主从复制概述 MySQL主从复制是一种常用的技术手段,用于提高数据库系统的可用性、扩展性和数据安全性。它通过将一个MySQL实例(主服务器)的数据实时复制到一...

    mysql主从数据库的优势

    MySQL主从数据库的优势详解 MySQL主从服务器配置是数据库领域中一种常见的高可用性和高性能解决方案。这一机制允许数据从一个主服务器(Master)复制到一个或多个从服务器(Slave),以此来实现数据冗余、负载均衡...

    mysql主从库配置

    ### MySQL 主从库配置详解 #### 一、MySQL 安装与环境变量设置 在进行 MySQL 主从库配置之前,我们需要确保已经正确安装了 MySQL,并设置了相应的环境变量。以下是具体的步骤: 1. **下载 MySQL 免安装版**: - ...

    MySQL的主从复制、半同步复制、主主复制详解

    MySQL复制技术的几种主要类型包括主从复制、半同步复制和主主复制,它们在数据库架构中扮演着重要的角色。下面将对这些复制技术进行详细解释。 首先,主从复制是最常见的复制方式,它涉及一个主服务器(Master)和...

    生产环境Mysql主从复制

    #### 二、MySQL主从复制的配置步骤详解 根据给定的内容,我们将详细介绍如何在生产环境中配置MySQL的主从复制。 ##### 1. MySQL5.1.38的源码编译安装 - **系统准备**:首先确保服务器已经安装了必要的依赖,并且...

    数据库领域 MySQL 主从复制的原理与配置详解

    内容概要:本文详细介绍了MySQL主从复制的原理,包括基于二进制日志的数据同步流程。文章还涵盖了三种不同的复制方式:异步复制、半同步复制和同步复制及其各自的特性。针对MySQL主从复制的实际配置方法进行了逐步...

    mysql主从主主配置.docx

    ### MySQL 主从与主主配置详解 ...通过以上的详细步骤,您可以成功地配置MySQL的主从及主主复制环境。这种配置不仅可以提高系统的可用性和扩展性,还可以帮助实现数据的高可用性和故障转移等功能。

    linux下mysql主从复制

    ### Linux 下 MySQL 主从复制详解 #### 一、概述 MySQL 的主从复制是一种非常重要的技术,它不仅可以提高系统的可用性和扩展性,还能为数据备份提供便利。在本篇文章中,我们将详细介绍如何在 Linux 操作系统环境...

    Linux配置mysql主从同步

    ### Linux下MySQL主从同步配置详解 #### 一、引言 在数据库管理领域,MySQL主从同步是一种常见的数据复制技术,它可以帮助我们构建高可用性和数据冗余性,从而提高系统的稳定性和可靠性。本文将详细介绍如何在Linux...

Global site tag (gtag.js) - Google Analytics