MySQL实现双机双向热备份的详细教程

 更新时间:2025年07月22日 08:22:59   作者:牛肉胡辣汤  
MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种备份和恢复机制来确保数据的安全性,下面我们就来看看MySQL如何实现双机双向热备份的吧

在现代企业级应用中,数据的高可用性和灾难恢复能力是至关重要的。MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种备份和恢复机制来确保数据的安全性。本文将详细介绍如何实现MySQL的双机双向热备份,以提高系统的可用性和数据的安全性。

1. 环境准备

1.1 硬件环境

两台服务器(Server A 和 Server B),建议配置相同或相似。

每台服务器至少有两个网络接口,一个用于内部通信,一个用于外部访问。

1.2 软件环境

  • 操作系统:Linux(例如 CentOS 7)
  • 数据库:MySQL 5.7 或更高版本
  • 网络:确保两台服务器之间可以互相通信

2. 配置MySQL主从复制

2.1 安装MySQL

在两台服务器上安装MySQL。假设已经安装完成,版本为5.7。

2.2 配置Server A为主服务器

编辑MySQL配置文件 ​​/etc/my.cnf​​,添加以下内容:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=mixed

重启MySQL服务:

sudo systemctl restart mysqld

2.3 配置Server B为从服务器

编辑MySQL配置文件 ​​/etc/my.cnf​​,添加以下内容:

[mysqld]
server-id=2
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1

重启MySQL服务:

sudo systemctl restart mysqld

2.4 创建复制用户

在Server A上创建一个用于复制的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

2.5 获取主服务器的二进制日志位置

在Server A上执行以下命令获取二进制日志文件名和位置:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录下 ​​File​​ 和 ​​Position​​ 的值。

2.6 备份主服务器的数据

在Server A上备份数据:

mysqldump --all-databases --master-data=2 --single-transaction --routines --events --triggers > all_databases.sql

2.7 传输备份文件到从服务器

将备份文件传输到Server B:

scp all_databases.sql user@server_b:/path/to/backup/

2.8 在从服务器上恢复数据

在Server B上恢复数据:

mysql < /path/to/backup/all_databases.sql

2.9 配置从服务器

在Server B上配置从服务器:

CHANGE MASTER TO 
MASTER_HOST='server_a_ip', 
MASTER_USER='repl', 
MASTER_PASSWORD='your_password', 
MASTER_LOG_FILE='mysql-bin.000001', 
MASTER_LOG_POS=12345;

启动从服务器:

START SLAVE;

2.10 检查复制状态

在Server B上检查复制状态:

SHOW SLAVE STATUS\G

确保 ​​Slave_IO_Running​​ 和 ​​Slave_SQL_Running​​ 均为 ​​Yes​​。

3. 配置双向复制

3.1 在Server B上创建复制用户

在Server B上创建一个用于复制的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

3.2 获取Server B的二进制日志位置

在Server B上执行以下命令获取二进制日志文件名和位置:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录下 ​​File​​ 和 ​​Position​​ 的值。

3.3 配置Server A

在Server A上配置从服务器:

CHANGE MASTER TO 
MASTER_HOST='server_b_ip', 
MASTER_USER='repl', 
MASTER_PASSWORD='your_password', 
MASTER_LOG_FILE='mysql-bin.000001', 
MASTER_LOG_POS=12345;

启动从服务器:

START SLAVE;

3.4 检查复制状态

在Server A上检查复制状态:

SHOW SLAVE STATUS\G

确保 ​​Slave_IO_Running​​ 和 ​​Slave_SQL_Running​​ 均为 ​​Yes​​。

4. 测试双向复制

4.1 在Server A上插入数据

在Server A上插入一条测试数据:

USE test;
CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100));
INSERT INTO test_table (name) VALUES ('Test Data');

4.2 在Server B上验证数据

在Server B上查询数据:

USE test;
SELECT * FROM test_table;

4.3 在Server B上插入数据

在Server B上插入一条测试数据:

INSERT INTO test_table (name) VALUES ('Test Data from B');

4.4 在Server A上验证数据

在Server A上查询数据:

SELECT * FROM test_table;

5. 注意事项

  • 双向复制可能会导致数据冲突,特别是在同一个表上同时进行写操作时。可以通过设置不同的数据库或表来避免冲突。
  • 定期检查复制状态,确保没有延迟或错误。
  • 使用监控工具(如Prometheus、Grafana)来监控MySQL的性能和复制状态。

通过以上步骤,您可以成功实现MySQL的双机双向热备份,从而提高系统的高可用性和数据的安全性。

6.方法补充

下面是一个简单的示例,展示如何设置两台MySQL服务器之间的双向热备份。假设我们有两台服务器:Server A (192.168.1.10) 和 Server B (192.168.1.11),每台服务器都运行着MySQL 5.7或更高版本。

步骤 1: 配置MySQL服务器

Server A (192.168.1.10)

编辑 MySQL 配置文件 ​​my.cnf​​ 或 ​​my.ini​​,添加以下内容:

[mysqld]
server-id=1
log_bin=mysql-bin
binlog_do_db=your_database_name
auto-increment-offset=1
auto-increment-increment=2

Server B (192.168.1.11)

编辑 MySQL 配置文件 ​​my.cnf​​ 或 ​​my.ini​​,添加以下内容:

[mysqld]
server-id=2
log_bin=mysql-bin
binlog_do_db=your_database_name
auto-increment-offset=2
auto-increment-increment=2

步骤 2: 创建复制用户

在两台服务器上分别创建一个用于复制的用户,并赋予相应的权限。

在 Server A 上执行:

CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
FLUSH PRIVILEGES;

在 Server B 上执行:

CREATE USER 'repl'@'192.168.1.10' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.10';
FLUSH PRIVILEGES;

步骤 3: 获取二进制日志文件和位置

在两台服务器上分别获取当前的二进制日志文件名和位置。

在 Server A 上执行:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记下 ​​File​​ 和 ​​Position​​ 的值,例如 ​​mysql-bin.000001​​ 和 ​​12345​​。

在 Server B 上执行:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

同样记下 ​​File​​ 和 ​​Position​​ 的值。

步骤 4: 设置从属关系

在 Server A 上执行:

CHANGE MASTER TO 
MASTER_HOST='192.168.1.11',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;
START SLAVE;

在 Server B 上执行:

CHANGE MASTER TO 
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;
START SLAVE;

步骤 5: 检查复制状态

在两台服务器上检查复制状态,确保一切正常。

在 Server A 和 Server B 上执行:

SHOW SLAVE STATUS \G

确保 ​​Slave_IO_Running​​ 和 ​​Slave_SQL_Running​​ 均为 ​​Yes​​,并且没有错误信息。

  • 双向复制可能导致数据冲突,特别是当两个服务器同时更新同一行数据时。可以通过设计应用程序逻辑来避免这种情况。
  • 使用 ​​auto-increment-offset​​ 和 ​​auto-increment-increment​​ 来防止自增列冲突。
  • 定期监控复制状态和延迟,确保系统稳定运行。

以上步骤提供了一个基本的双向热备份配置示例。在生产环境中,还需要考虑更多的安全性和性能优化措施。

方法二:

MySQL的双机双向热备份通常指的是MySQL的主从复制(Master-Slave Replication)和主主复制(Master-Master Replication)。这种配置可以确保数据在两台服务器之间同步,提高系统的可用性和数据的安全性。下面我将详细介绍如何设置MySQL的主主复制,并提供相应的SQL命令。

环境准备

假设你有两台MySQL服务器,分别命名为​​Server A​​和​​Server B​​,它们的IP地址分别为​​192.168.1.10​​和​​192.168.1.11​​。

配置文件修改

首先,需要修改两台服务器上的MySQL配置文件​​my.cnf​​或​​my.ini​​,添加或修改以下内容:

Server A (​​/etc/mysql/my.cnf​​)

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=your_database_name
relay-log=mysql-relay-bin
auto-increment-offset=1
auto-increment-increment=2

Server B (​​/etc/mysql/my.cnf​​)

[mysqld]
server-id=2
log-bin=mysql-bin
binlog-do-db=your_database_name
relay-log=mysql-relay-bin
auto-increment-offset=2
auto-increment-increment=2

重启MySQL服务

修改配置文件后,需要重启MySQL服务以使配置生效:

sudo systemctl restart mysql

创建复制用户

在两台服务器上创建一个用于复制的MySQL用户,并授予必要的权限。

在Server A上执行

CREATE USER 'replication'@'192.168.1.11' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.11';
FLUSH PRIVILEGES;

在Server B上执行

CREATE USER 'replication'@'192.168.1.10' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.10';
FLUSH PRIVILEGES;

获取二进制日志位置

在开始复制之前,需要获取当前的二进制日志文件名和位置。

在Server A上执行

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录下​​File​​和​​Position​​的值,例如:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 12345    | your_database_name |              |
+------------------+----------+--------------+------------------+

在Server B上执行

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

同样记录下​​File​​和​​Position​​的值。

配置复制

使用​​CHANGE MASTER TO​​命令配置复制。

在Server A上执行

CHANGE MASTER TO
MASTER_HOST='192.168.1.11',
MASTER_USER='replication',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;

START SLAVE;

在Server B上执行

CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='replication',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;

START SLAVE;

检查复制状态

最后,检查复制状态以确保一切正常。

在Server A上执行

SHOW SLAVE STATUS \G

确保​​Slave_IO_Running​​和​​Slave_SQL_Running​​都为​​Yes​​。

在Server B上执行

SHOW SLAVE STATUS \G

同样确保​​Slave_IO_Running​​和​​Slave_SQL_Running​​都为​​Yes​​。

测试复制

可以在任意一台服务器上创建一个测试表并插入一些数据,然后检查另一台服务器上是否也同步了这些数据。

在Server A上执行

USE your_database_name;
CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test (name) VALUES ('Test1');

在Server B上执行

USE your_database_name;
SELECT * FROM test;

如果能看到​​Test1​​这条记录,说明复制配置成功。

通过以上步骤,你就可以成功配置MySQL的主主复制,实现双机双向热备份。

到此这篇关于MySQL实现双机双向热备份的详细教程的文章就介绍到这了,更多相关MySQL热备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL关键字问题分析与解决方案

    MySQL关键字问题分析与解决方案

    在实际开发中,我们常常会遇到由于SQL语法错误导致的数据库操作应用不能正常运行的情况,其中,使用了MySQL关键字作为表名或字段名,而没有逻辑地处理,带来的问题最为常见,本文将从一个实际案例出发,深入分析关键字问题及其解决方案,并提供进一步优化与避免方案
    2024-12-12
  • 浅谈mysql双层not exists查询执行流程

    浅谈mysql双层not exists查询执行流程

    本文主要介绍了浅谈mysql双层not exists查询执行流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • mysql 复制原理与实践应用详解

    mysql 复制原理与实践应用详解

    这篇文章主要介绍了mysql 复制原理与实践应用,结合实例形式详细分析了MySQL数据库复制功能的原理、操作技巧与相关注意事项,需要的朋友可以参考下
    2020-02-02
  • mysql最左前缀法则导致索引失效的解决

    mysql最左前缀法则导致索引失效的解决

    最左前缀是在使用innodb存储引擎索引时,需要遵守的法则,本文主要介绍了mysql最左前缀法则导致索引失效的解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Linux下安装与使用MySQL详细介绍

    Linux下安装与使用MySQL详细介绍

    以下是对在Linux下安装与使用MySQL进行了详细的介绍,需要的朋友可以过来参考下
    2013-08-08
  • Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    mysql数据库和中文支持很不友好,经常见到“Illegal mix of collations for operation”错误,该如何解决呢?下面小编给大家带来了mysql数据库中涉及到哪些字符集及彻底解决中文乱码的解决方案,非常不错,一起看看吧
    2016-08-08
  • 深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制

    深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制

    本文深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制,探讨事务的原子性、一致性、隔离性和持久性,分析不同隔离级别的优劣,详解redolog、undolog、MVCC及行锁算法
    2026-01-01
  • 浅谈MySQL使用笛卡尔积原理进行多表查询

    浅谈MySQL使用笛卡尔积原理进行多表查询

    这篇文章主要介绍了浅谈MySQL使用笛卡尔积原理进行多表查询, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Navicat连接MySQL保姆级教程(含详细图文)

    Navicat连接MySQL保姆级教程(含详细图文)

    Navicat是一款支持多种主流数据库的图形化管理工具,提供可视化界面简化数据库操作,这篇文章主要介绍了Navicat连接MySQL保姆级教程的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2026-04-04
  • MySQL 数据库的临时文件究竟储存在哪里

    MySQL 数据库的临时文件究竟储存在哪里

    MySQL使用环境变量TMPDIR的值作为保存临时文件的目录的路径名。
    2009-02-02

最新评论