MySQL主从配置

Wesley13
• 阅读 791

本文索引:

  • MySQL主从介绍
  • 准备工作
  • 配置主
  • 配置从
  • 测试主从同步

MySQL主从介绍

MySQL主从又叫做Replication、AB复制。简单将就是A/B两个服务器做主从后,在A上写数据,B也会跟着写数据,两者数据是实时同步的。

MySQL主从是基于binlog的,主服务器需要开启binlog才能进行主从配置。

主从配置大致有3个步骤:

  1. 主服务器将更改操作记录到binlog里;
  2. 从服务器将主服务器的binlog事件(sql语句)同步到本机并极力到relaylog里;
  3. 从服务器根据relaylog里面的sql语句按顺序执行;

主服务器上有一个log dump线程,用来和从服务器的I/O线程传递binlog。

从服务器上有两个线程,其中I/O线程用来同步主服务器的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的SQL语句落地。

应用场景:

  • 数据备份,在主服务器出现故障时,从服务器代替主服务器提供读取服务;
  • 备份的同时web服务器会到从服务器上读取数据,减轻主服务器的数据读取压力;

MySQL安装

在测试主从的2台服务器上都安装上MySQL,具体操作步骤如下:

# 2台服务器配置相同,这里只写出其中一台
[root@master src]# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
[root@master src]# tar zxf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz 
[root@master src]# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
[root@master src]# cd /usr/local/mysql/
[root@master mysql]# useradd mysql
[root@master mysql]# mkdir /data
[root@master mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
[root@master mysql]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
# 修改配置文件内basedir和datadir参数
[root@master mysql]# vi /etc/my.cnf
修改[mysqld]内的2行即可
 basedir = /usr/local/mysql
 datadir = /data/mysql
保存退出

[root@master mysql]# cp support-files/mysql.server /etc/init.d/mysqld
# 修改mysqld配置文件,
[root@master mysql]# vi /etc/init.d/mysqld 
同样要修改一下参数
basedir=/usr/local/mysql
datadir=/data/mysql

[root@master mysql]# chmod 755 /etc/init.d/mysqld 
[root@master mysql]# chkconfig --add mysqld
  • 启动MySQL

    [root@master mysql]# /etc/init.d/mysqld start Starting MySQL.Logging to '/data/mysql/localhost.localdomain.err'. .. SUCCESS!

    [root@master mysql]# ps aux | grep mysqld root 2856 0.0 0.1 113264 1616 pts/0 S 13:52 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/localhost.localdomain.pid mysql 2990 8.5 45.0 1308984 450220 pts/0 Sl 13:52 0:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/localhost.localdomain.err --pid-file=/data/mysql/localhost.localdomain.pid root 3019 0.0 0.0 112676 972 pts/0 R+ 13:53 0:00 grep --color=auto mysqld


配置主服务器:192.168.65.133

log_bin参数只在主服务器上设置

修改my.cnf,增加server_id=133,log_bin=test1,修改后重启MySQL

会在/data/mysql目录下生成以test1前缀的多个文件

[root@master ~]# mysqldump -uroot -p1 test > /tmp/test.sql
[root@master ~]# mysql -uroot -p1 -e "create database test1"
[root@master ~]# mysql -uroot -p1 test1 < /tmp/test.sql 

[root@master ~]# ls -l /data/mysql/test1.*
-rw-rw----. 1 mysql mysql 425 1月  15 19:39 /data/mysql/test1.000001
-rw-rw----. 1 mysql mysql  15 1月  15 19:36 /data/mysql/test1.index

创建用作同步数据的用户

mysql> grant replication slave on *.* to 'repl'@'192.168.65.134' identified by 'test2';
Query OK, 0 rows affected (0.00 sec)

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.05 sec)

mysql> show master status;
+--------------+----------+--------------+------------------+-------------------+
| File         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------+----------+--------------+------------------+-------------------+
| test1.000001 |      636 |              |                  |                   |
+--------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

可选操作:

将/data/mysql下的除mysql外的库都进行备份(如果有其他库的话)
例如:mysqldump -uroot -p1 zrlog > /tmp/zrlog.sql

在配置时最好也放开mysql通信端口3306,防止主从无法通信。


配置从服务器:192.168.65.134

修改my.cnf,增加server_id=134。重启服务

[root@backup ~]# vi /usr/local/mysql/my.cnf 
[root@backup ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

同步备份的数据库

[root@backup ~]# scp 192.168.65.133:/tmp/*.sql /tmp
The authenticity of host '192.168.65.133 (192.168.65.133)' can't be established.
ECDSA key fingerprint is 42:50:a7:09:91:db:af:77:a5:3a:b3:67:1c:8a:5b:99.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.65.133' (ECDSA) to the list of known hosts.
root@192.168.65.133's password: 
test.sql                   100% 1258     1.2KB/s   00:00  

创建主服务器同名用户

[root@backup ~]# mysql -uroot -p1

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

恢复数据

# 同步过来的有多少个数据库就做多少个恢复
[root@backup ~]# mysql -uroot -p1 test < /tmp/test.sql 

登录mysql,执行从配置

[root@backup ~]# mysql -uroot -p1
//master_log_file填主服务器show master status;显示的file内容  
//master_log_pos填主服务器show master status;显示的position内容
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.65.133', maste_user='repl', master_password='test2', master_log_file='test1.000001', master_log_pos=636;
Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看是否连接成功

mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Connecting to master
                 Master_Host: 192.168.65.133
                 Master_User: repl
                 Master_Port: 3306
               Connect_Retry: 60
             Master_Log_File: test1.000001
         Read_Master_Log_Pos: 636
              Relay_Log_File: server-relay-bin.000001
               Relay_Log_Pos: 4
       Relay_Master_Log_File: test1.000001
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
           ...
           
下列2行都为Yes即成功连接
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

完成后到主服务器上执行解锁命令

mysql> unlock tables;

测试主从同步

常用参数分析

主服务器上

binlog-do-db=   //仅同步主服务器上指定的库,多个库用逗号分隔
binlog-ignore-db=   //忽略指定库

从服务器上

指定同步从服务器上的库、表
replicate_do_db=
replicate_ignore_db=
replicate_do_table=
replicate_ignore_table=
replicate_wild_do_table=    //支持通配符%,例如test.%(库.表)
replicate_wild_ignore_table=

测试

  1. 创建操作

    主服务器上新建一个db库

    mysql> create database db; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)

    #从上也创建了一个数据库db mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)

  2. 删除操作

    主服务器上

    删除表

    mysql> drop table wp_user;

    从服务器上

    从上的表也被删了

    mysql> select * from wp_user; ERROR 1146 (42S02): Table 'mysql.wp' doesn't exist

如果在从服务器上先误删了数据库,主服务器上再去删时,从服务器将会报错,连接会down掉。

在数据一致的前提下重连主从:

主上:
mysql> show master status\G

从上:
mysql> stop slave;
mysql> change master to master_host='192.168.65.133', master_user='repl', master_password='test2', master_log_file='', master_log_pos=新id;
mysql> start slave;

数据不一致: 需要重新配置主从:先将主服务器上的数据库重新备份,再在从服务器上重新配置。


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql主从同步问题梳理
前言:MySQL主从复制故障机延迟原因有很多,之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常。以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是MySQL数据库主从同步延迟MySQL数据库slave服务器延迟的现象是非常普遍的,MySQ
Wesley13 Wesley13
3年前
MYSQL主从同步故障解决(主键重复)
MYSQL主从同步故障解决(主键重复)转载2010年04月05日18:52:00标签:mysql(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%2Fs.do%3Fq%
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这