MySQL 基于主主备份

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:

在两个服务器上都要开启二进制日志和中继日志

如果两个服务器的数据库id启动自动增长功能,要在配置文件中设置一个的id为奇数,另外一个的id为偶数,或者一个的id为偶数,另外一个的id为奇数,因为如果不这样设置,有可能两个服务器上同时都有用户在写的时候会产生相同的id号造成冲突,所以一般情况下不建议数据库的id号启用自动增长功能,或者用id生成器进行生成。

 

一、环境说明:

192.168,47.179 (ip)----mariadb01(主机名)-------server01(连接用户)------server01(密码)

192.168,47.178 (ip)----mariadb02(主机名)-------server02(连接用户)------server02(密码)

二、搭建步骤

2.1 创建数据的连接用户

Mariadb01上面创建连接用户server01,并且只能通过192.168.47.178进行连接;

脚本:mariadb[none]> GRANT REPLICATION SLAVE ON*.* TO'server01'@'192.168.47.178' IDENTIFIED BY 'server01';

Mariadb02上面创建连接用户server02,并且只能通过192.168.47.149进行连接;

脚本:mariadb[none]> GRANT REPLICATION SLAVE ON*.* TO'server02'@'192.168.47.179'IDENTIFIED BY 'server02';

mariadb[none]> select user,password,host from mysql.user;  ---查看一下是否有授权的用户用于主从复制

 

2.2 修改mysql的参数文件

修改Mariadb01的参数文件,在MySQL的主配置文件默认为/etc/my.cnf,修改/添加如下内容

[mysql]

 skip_name_resolve = on
innodb_file_per_table = on
max_connections = 20000
log_bin = bin-log  ---开启二级制日志
relay_log = relay-log  ---开启中继日志
server_id = 1
auto_increment_offset = 1  ---表示id号从1开始
auto_increment_increment = 2 ---表示以2为步进,即为奇数

修改之后,重启msyql生效:servicemysqld restart

修改Mariadb02的参数文件,在MySQL的主配置文件默认为/etc/my.cnf,修改/添加如下内容

[mysql]
skip_name_resolve = on
innodb_file_per_table = on
max_connections = 20000
server_id = 2
relay_log = relay-log
log_bin = bin-log
auto_increment_offset = 2
auto_increment_increment = 2

参数说明:

a、server_id数据库的进行数据同步的时候用于标识该语句最初是从哪个server写入的,在进行主主或主从的搭建中,都需要填写;

b、auto_increment_increment:在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。为避免两台主数据库生成的编码重复了,所以需要设置该值

2.3复制其中的一台服务器的数据库到另外一台服务器

因为环境是全新搭建的,所以两个的环境都是一样的,并需要进行数据的初始化工作;

需要的话可以通过以下步骤进行操作,以Mariadb01为源数据库进行同步,如下操作:

2.3.1.锁定Mariadb01数据库,查看状态

mariadb[none]> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected(0.00 sec)

 

mariadb[none]> SHOW MASTER STATUS;

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

| File | Position |Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000008 | 107| | |

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

1 row in set (0.00 sec)

显示源数据库处于8号binlog的107位置;

2.3.2.备份数据库

[root@Mariadb01~]# mysqldump--all-databases --lock-tables --flush-logs> /tmp/retail.sql

[root@Mariadb01 ~]# scp /tmp/retail.sql 192.168.47.178:/tmp/

2.3.3.在mysql02暂停二进制日志, 进行导入操作;

mariadb[none]< set @@session.sql_log_bin=0;

[root@Mariadb02 ~]# < /tmp/retail.sql#导入retail数据库

mariadb[none]< set @@session.sql_log_bin=1;

mariadb[none]> FLUSH TABLES WITH READ LOCK;

2.4.锁定mysql02数据库并查看状态

 

mysql> SHOW MASTERSTATUS;

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

| File | Position |Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000009 | 107| | |

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

1 row in set (0.00 sec)

显示备份文件位于9号binlog的107位置;

 

2.5 进行主主的通信连接;

a、在Mariadb01上面进行用户和binlog的确认

mysql> CHANGE MASTERTOMASTER_HOST='192.168.47.178',MASTER_USER='server02',MASTER_PASSWORD='server02',MASTER_LOG_FILE='mysql-bin.000008',MASTER_LOG_POS=107;

mysql>start slave;

mysql> showslave status\G

b、在Mariadb02上面进行用户和binlog的确认

mysql> CHANGE MASTERTOMASTER_HOST='192.168.47.179',MASTER_USER='server01',MASTER_PASSWORD='server01',MASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS=107;

mysql>start slave;

mysql> showslave status\G

主要这两项:

            Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

分别解锁Mariadb01Mariadb02数据库

mariadb[none]> UNLOCK TABLES;

测试

在mysql01写入在mysql02上有显示

在mysql02写入在mysql01上有显示

复制时应该注意的问题:

1、从服务设定为“只读”:在从服务器启动read_only,但仅对非SUPER权限的用户有效;

要想阻止所有用户可以申请一个全局读锁:mysql>FLUSH TABLES WITH READ LOCK;

2、尽量确保复制时的事务安全

在master节点启用参数:sync_binlog=ON,表示只要当前节点有事物提交时就立即从内存缓冲区保存到二进制日志中,避免从服务器复制时二进制日志中没有这个提交操作主服务器就坏了,这样从服务器就不知道这个事物该不该提交了

如果用到的是InnoDB存储引擎:

innodb_flush_logs_at_trx_commit=ON  ---每当事物提交时就同步到事物日志中

innodb_support_xa=ON    让innodb支持分布式事物

3、从服务器意外中止时尽量避免自动启动复制线程,假如从服务器在复制一个事件的时候复制到一半的时候从服务器意外终止了,如果重新启动,复制功能实是会自动开启的,因为在/var/lib/mysql/master.info文件中记录了连接到主服务器的信息,所以启动mariadb服务时会自动启动复制线程,这样就会造成问题,因为终止前的事物复制到一半,不知道该不该提交,为了避免这种事情发生,我们要把网断掉,查看一下是否有复制到一半的事物,如果有手动删除,然后手动加changemaster to 指向意外终止时主服务器二进制日志的位置,或者重新备份恢复后启动复制功能

4、从节点:设置参数

sync_master_info=ON

sync_relay_log_info=ON

 



本文转自 工运搬运维 51CTO博客,原文链接:http://blog.51cto.com/13157015/1981101,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
12月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
523 4
|
20天前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
110 10
|
3月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
237 36
|
6月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
166 5
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
|
5月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
258 28
|
5月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
122 15
|
10月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
595 3
|
10月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
298 3

推荐镜像

更多