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,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
157 4
|
7月前
|
存储 SQL 关系型数据库
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
151 3
|
2月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
68 3
|
3月前
|
安全 关系型数据库 MySQL
MySQL用户备份
【10月更文挑战第2天】MySQL用户备份
78 3
|
3月前
|
存储 关系型数据库 MySQL
MySQL如何备份?
【10月更文挑战第2天】MySQL如何备份?
232 3
|
5月前
|
SQL 关系型数据库 MySQL
在Linux中,如何备份和恢复MySQL数据库?
在Linux中,如何备份和恢复MySQL数据库?
|
5月前
|
安全 关系型数据库 MySQL
揭秘MySQL海量数据迁移终极秘籍:从逻辑备份到物理复制,解锁大数据迁移的高效与安全之道
【8月更文挑战第2天】MySQL数据量很大的数据库迁移最优方案
846 17
|
5月前
|
SQL 数据可视化 关系型数据库
MySQL 备份可视化巡检系统
MySQL 备份可视化巡检系统
|
5月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战

推荐镜像

更多