MySQL 基于主主备份
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 基于主主备份相关的知识,希望对你有一定的参考价值。
在两个服务器上都要开启二进制日志和中继日志
如果两个服务器的数据库id启动自动增长功能,要在配置文件中设置一个的id为奇数,另外一个的id为偶数,或者一个的id为偶数,另外一个的id为奇数,因为如果不这样设置,有可能两个服务器上同时都有用户在写的时候会产生相同的id号造成冲突,所以一般情况下不建议数据库的id号启用自动增长功能,或者用id生成器进行生成。
一、环境说明:
IP | 主机名 | 数据库名 | 连接用户 | 密码 |
192.168.47.179 | Mariadb01 | retail | server01 | server01 |
192.168.47.178 | Mariadb02 | retail | 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.备份数据库
[[email protected]ariadb01~]# mysqldump--all-databases --lock-tables --flush-logs> /tmp/retail.sql
[[email protected]ariadb01 ~]# scp /tmp/retail.sql 192.168.47.178:/tmp/
2.3.3.在mysql02暂停二进制日志, 进行导入操作;
mariadb[none]< set @@session.sql_log_bin=0;
[[email protected] ~]# < /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
分别解锁Mariadb01、Mariadb02数据库
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
本文出自 “13147015” 博客,请务必保留此出处http://13157015.blog.51cto.com/13147015/1981101
以上是关于MySQL 基于主主备份的主要内容,如果未能解决你的问题,请参考以下文章
学一点 MYSQL 双机异地热备份—-MYSQL主从,主主备份原理及实践