1.复制准备

操作系统 centOS

主库(mysql master):  ip为123.56.94.1   port为3306  mysql 版本 5.7.16
从库(mysql slave):    ip为123.56.94.2   port为3306   mysql 版本 5.7.16    如果版本不一致可能造成字符集不支持的情况例如 5.1 不支持utf8mb4,在迁移时就悲剧了
 
 
2.主库上执行操作
2.1设置server-id值并开启binlog参数
根据mysql的同步原理,我们知道复制的关键因素就是binlog日志.
执行vim /etc/my.cnf编辑my.cnf配置文件,按如下两个参数内容修改:
[mysqld]
server-id = 1
log-bin = mysql-bi
提示:
1.上面两参数放在my.cnf中的[mysqld]模块下,否则会出错;
2.要先在my.cnf文件中查找相关参数,并按要求修改,不存在时在添加参数,切记,参数不能重复;
3.修改my.cnf配置后需要重启数据库命令为: service mysqld  restart
补充:如果按照以上my.cnf配置会把所有数据库都同步,如果只想同步czjmove3而不想同步mysql和test增加如下配置
binlog-do-db=czjmove3
# 忽略的数据库
binlog-ignore-db=mysql
binlog-ignore-db=test
检查配置后的结果(这是一个好的习惯):
grep  -E  "server-id|log-bin" /etc/my.cnf          # 查看/etc/my.cnf文件配置是否有重复
没有问题的话重启服务:service mysqld  restart
mysql -uroot -p'123123' -e "show variables like 'server_id'"          # 查看实际mysql配置有没有成功
 
2.2建立用于同步的账号rep
登陆mysql 3306实例主数据库
mysql  -uroot  -p'123123'
mysql>select user();    查看用户
mysql>grant  replication  slave  on  *.*  to  'rep'@'123.56.94.2'  identified  by  "123456";  建立用于库复制的账号rep
提示:
#replication  slave为mysql同步的必须权限,此处不要授权all
#*.*表示所有库所有表,库也是可以指定具体的库和表进行复制,如test.test1(test库的test1表);
#'rep'@'123.56.94.%' rep为同步账号,123.56.94.%为授权主机,使用了%表示允许整个123.56.94.0网段以rep用户访问 此处123.56.94.2只开通这一个IP;
#identified  by  "123456" , 123456为密码,实际环境时复杂一点为好。
再次检查创建的rep账号
select distinct concat ('user:', user, '@', host) as users from mysql.user;
select  user.host  from  mysql.user;
mysql>show  grants  for  rep@'123.56.94.2';    查看用户权限   
 
2.3对数据库锁表只读(当前窗口不要关闭)
生产环境时,操作主从复制,需要申请停机时间,锁表会影响业务。
mysql>flush  tables  with  read  lock;
提示:
这个锁表命令的时间,在不同引擎的情况,会受下面参数的控制,锁表时,如果超过设置时间不操作会自动解锁;
interactive_timeout = 60
wait_timeout = 60
默认情况下的时长为:
mysql>show  variables  like  "%timeout%";  可以查看到默认值很大
完成后测试下是否锁表,打开另一窗口创建一test1表,是不会执行的,证明锁表不能更新,但可读,不可写,因为是read读锁,锁表主要是为了导出数据库文件,从而取得正确的偏移量的值,保证导入从数据库,数据一致。
 
2.4查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
show  master  status;命令显示的信息要记录在案,后面的从库复制时是从这个位置开始的。
 
2.5导出数据库数据
单开新窗口,导出数据库数据,如果数据库量很大(100G+),并且允许停机可以,可以直接停库打包数据文件迁移。
mkdir  /server/backup/  -p
mysqldump  -uroot  -p"123123"   -A  -B  | gzip  > /server/backup/mysql_bak.$(date  +%F).sql.gz
#注意,-A表示备份所有库, -B表示增加user  DB和drop等参数(导库时会直接覆盖所有的)。
ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
为了确保导库期间,数据库没有数据插入,可以再检查下主库状态信息
mysql  -uroot  -p"123123"   -e  "show  master  status"
提示,无特殊情况,binlog文件及位置点是保持不变的。
导库后,解锁主库,恢复可写;
mysql>unlock  tables;
特别提示,有读者这里犯迷糊,实际上做从库的,无论主库更新多少数据了,最后从库都会从上面show  master  status  的位置很快赶上主库的位置进度的。
 
2.6把主库备份的mysql数据迁移到从库
这步常用命令有scp,rsync等。
ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
 
 

3.从库上执行操作

3.1 设置server-id值并关闭binlog设置

数据库的server-id一般在LAN内是唯一的,这里的server-id要和主库及其他从库不同,并注释掉从库的binlog参数配置;

执行vi  /etc/my.cnf  编辑my.cnf配置文件,按如下两个参数内容修改;

[mysqld]

server-id = 2

#log-bin = mysql-bin

补充:以下5行我实际项目中没有添加也没测过应该没问题

master-connect-retry=60     # 预设重试间隔60秒

replicate-do-db=vbb     # 告诉slave只做vbb数据库的更新

replicate-ignore-db=mysql     # 不同步的数据库

replicate-ignore-table=vbb.users    # 不同步vbb数据库的users表

log-slave-updates=1

检查配置后的结果

grep  -E  "server-id|log-bin"  /etc/my.cnf

#log-bin = mysql-bin   log-bin后面也可以不带等号内容,mysql会使用默认日志。

重启从数据库

/etc/init.d/mysql  restart

3.2还原主库导出的数据到从库

cd  /server/backup/ &&  ls -l

然后解压刚才备份的

gzip  -d  mysql_bak.2017-07-25.sql

恢复命令

mysql  -uroot  -p"123123"  <  mysql_bak.2017-07-25.sql

3.2登陆从库配置同步参数

mysql  -uroot  -p"123123"

CHANGE  MASTER  TO   连接主数据库

MASTER_HOST="123.56.94.1",    这里是主库的ip

MASTER_PORT=3306,   这里是主库的端口,从库的端口可以和主库不同

MASTER_USER="rep",   这里是主库上建立的用于复制的用户rep

MASTER_PASSWORD="123456",   这里是rep的密码

MASTER_LOG_FILE="mysql-bin.000004",   这里是show  master  status时查看到的二进制日志文件名称,注意:1.不能多空格;2.主数据库导出数据前的值,不是现在再执行的。

MASTER_LOG_POS=1273;    这里是show  master  status时查看到的二进制日志偏移量,注意不能多空格。

不登陆数据库,在命令行快速执行change  master的语句(适合在脚本中批量建slave库用)

cat  | mysql  -uroot -p"oldboy"  <<EOF

CHANGE  MASTER  TO

MASTER_HOST="123.56.94.1",

MASTER_PORT=3306,

MASTER_USER="rep",

MASTER_PASSWORD="123456",

MASTER_LOG_FILE="mysql-bin.000004",

MASTER_LOG_POS=1273;

EOF

3.2启动从库同步开关

启动从库同步开关,并查看同步状态

mysql  -uroot  -p"123123"   -e  "start  slave;"

mysql  -uroot  -p"123123"  -e  "show  slave  status\G;"

也可登陆数据库里面执行下面两个命令:

start   slave

show  slave  status\G;

判断搭建是否成功就看如下IO和SQL两个线程是否显示为yes状态

Slave_to_Running: Yes  #负责从库去主库读取binlog日志,并写入从库中继日志中

Slave_SQL_Running: Yes   #负责读取并执行中继日志中的binlog,转换sql语句后应用到数据库汇总

也可以执行命令过滤查看如下

mysql  -uroot  -p"123123"    -e "show  slave  status\G;" | egrep "IO_Running|SQL_Running"

3.3测试复制结果

主库创建一数据库,看从库是否有.

mysql  -uroot -p"123123"    -e "create  database  diablo4;"

mysql  -uroot -p"123123"  -e  "show  databases  like  'diablo4';"

 
 
 

mysql 数据库的主从同步的更多相关文章

  1. mysql数据库的主从同步,实现读写分离 g

    https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...

  2. MySQL数据库的主从同步复制配置

    一.主从同步机制原理 MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态), ...

  3. mysql数据库的主从同步,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...

  4. MySQL数据库的主从同步

    什么要进行数据库的主从同步? 防止单点故障造成的数据丢失 主从复制的原理 MySQL从数据库开启I/O线程,向主服务器发送请求数据同步(获取二进制日志) MySQL数据库开启I/O线程回应从数据库 从 ...

  5. MySQL数据库的主从同步实现及应用

    >>主从同步机制及应用 读写分离(Read/Write Splitting)让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),从数据库处理SELECT查询操作 ...

  6. MySQL Replication 详解MySQL数据库设置主从同步的方法

    MySQL同步的流程大致如下:  1.主服务器(master)将变更事件(更新.删除.表结构改变等等)写入二进制日志(master log). 2.从服务器(slave)的IO线程从主服务器(binl ...

  7. Zabbix检测Mysql数据库的主从同步

    在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成检测网站正常运行的重要环节 ...

  8. mysql数据库配置主从同步

    MySQL主从同步的作用 .可以作为一种备份机制,相当于热备份 .可以用来做读写分离,均衡数据库负载 MySQL主从同步的步骤 一.准备操作 .主从数据库版本一致,建议版本5.5以上 .主从数据库数据 ...

  9. MySQL数据库设置主从同步

    MySQL主从同步的机制: MySQL同步的流程大致如下: 1.主服务器(master)将变更事件(更新.删除.表结构改变等等)写入二进制日志(master log). 2.从服务器(slave)的I ...

随机推荐

  1. metamask的使用

    Metamask 我是在火狐浏览器安装它的,所以一开始安装了Firefox:http://www.firefox.com.cn/ 然后是下载metamask,它的官方网站是https://metama ...

  2. 利用BBED恢复数据文件头

    转载请注明出处:http: @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED block block ) Block: Dba:0x01400001 ---------------- ...

  3. P1865 A % B Problem

    (一道很水的题) (反正我第一眼看的时候也是这么想的) 题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接 ...

  4. redis学习(三)——List数据类型

    一.概述      在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,R ...

  5. Linux系统文件和目录管理

    Linux系统文件和目录管理 相关命令的解析 1.pwd:显示用户当前的工作目录 2.ls: -a:显示所有文件,包括隐藏文件 -l:显示文件的详细信息 3.设备文件统一存放在/dev 设备文件 块设 ...

  6. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

    原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP ...

  7. SQLServer 存储过程+定时任务发邮件

    SQLServer 代理发邮件需要开启SQL Server 代理服务器,然后,在[管理]-[数据库邮件]中,右键点击配置数据库邮件. 我用的是腾讯的企业邮箱,个人的163邮箱略微不同.下图是相关邮件的 ...

  8. 字符串的查找KMP

    基本思想,当出现不匹配的时候,就知晓一部分文本内容(因为在匹配失败前已经发生匹配) P[0 ~ k-1] == P[j-k ~ j-1] //KMP #include<iostream> ...

  9. 小P的字符串

    题目描述 小P最近在研究字符编码,给出一串由0.1组成的字符串,从中任意进行截取,如果截取的字符串对应一个英文字母的ASCII值,小P就把这个0.1串叫字母子串,问给定的字符串最多能截取出多少个字母子 ...

  10. scrapy框架原理学习

    Scrapy框架原理: 参考出处:https://cuiqingcai.com/3472.html 整个Scrapy的架构图: Scrapy Engine: 这是引擎,负责Spiders.ItemPi ...