MySQL主从复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制相关的知识,希望对你有一定的参考价值。

描述:针对生产环境数据库热备,搭建以下mysql主从复制环境

搭建环境描述:
系统版本:
Linux Test2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
下载链接:http://mirror.nsc.liu.se/centos-store/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso
MySQL数据库版本:
mariadb-10.0.33-linux-x86_64.tar.gz
下载链接:http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.0.33/bintar-linux-x86_64/mariadb-10.0.33-linux-x86_64.tar.gz

Mariadb安装步骤

#新建用户
useradd -s /sbin/nologin -M mysql
mkdir /data
#安装包放在/data 目录下解压
tar -zxvf mariadb-10.0.33-linux-x86_64.tar.gz
#改一下名字
mv mariadb-10.0.33-linux-x86_64 mariadb-10.0.33
#进入到mariadb-10.0.33目录
cd mariadb-10.0.33
#执行安装脚本
./scripts/mysql_install_db --basedir=/data/mariadb-10.0.33/ --datadir=/data/mariadb-10.0.33/data/ --user=mysql
#拷贝配置文件
cp support-files/my-innodb-heavy-4G.cnf /etc/my.cnf
#打开配置文件
vim /etc/my.cnf
#添加以下两行
basedir=/data/mariadb-10.0.33
datadir=/data/mariadb-10.0.33/data
#更新授权
chown -R mysql:mysql /data/mariadb-10.0.33/
#拷贝MySQLD到初始化目录 方便使用service启动
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#拷贝mysql mysqldump 到/usr/bin目录下
cp bin/mysql /usr/bin
cp bin/mysqldump /usr/bin
#mysql的root用户授权:

mysql> grant all privileges on . to ‘root‘@‘%‘ identified by ‘tongda666‘;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

需要支持MySQL主从复制需要按照实际要求在my.cnf中添加以下文件

配置(主库)

配置(从库)

主库(my.cnf)
log-bin=master-bin? #主服务器二进制日志文件前缀名??
log-bin-index=master-bin.index?? #索引文件??
innodb_file_per_table=?1????? #开启innodb的一表一个文件的设置??
server-id??=?IP地址?????????? #必须是唯一的??
datadir?=/mydata/data???????? #数据目录路径??
binlog_format=mixed? #从复制的格式
expire_logs_days=7? #二进制日志自动删除
slave_skip_errors=1062 #如:1062错误是指一些主键重复
binlog-do-db= #指定binlog日志记录那些库的二进制日志
binlog-ignore-db= #不需要复制的库

从库(my.cnf)
relay-log-index?=?relay-log.index?? #中继日志索引
innodb_file_per_table?=?1?? #开启innodb的一表一个文件的设置??
server-id???????=?IP地址???? #id不要和主服务器的一样??
datadir?=?/mydata/data? #mysql的数据目录?
relay-log?=?relay-log??? #设置中继日志??
slave_skip_errors=1062 #如:1062错误是指一些主键重复
replicate-do-table=wishrp.sku_ma #库名。表名
replicate_do_db= #需要复制库名
replicate_ignore_db= #不需要复制的数据库

操作(主库)

CREATE USER ‘slave‘@‘从库IP地址‘ IDENTIFIED BY ‘slavepass‘; #创建用户
GRANT REPLICATION SLAVE ON . TO ‘slave‘@‘从库IP地址‘; #分配权限
flush privileges; #刷新权限
SHOW MASTER STATUS; #查看master状态
show processlist \G #查看连接
flush tables with read lock; #锁定所有的表

unlock tables #解锁所有表

操作(从库)

CHANGE MASTER TO MASTER_HOST=‘182.92.172.80‘,MASTER_USER=‘主库创建的用户‘,MASTER_PASSWORD=‘密码‘,MASTER_LOG_FILE=‘mysql-bin.000003‘, MASTER_LOG_POS=73; #连接主库
stop slave; #停止同步
start slave; #开始同步
reset slave; #删除master.info和relay-log.info文件;
stop?slave; #停止同步
change?master?to?master_heartbeat_period?=?10; #设置发送心跳包间隔
set?global?slave_net_timeout?=?25;? #设置无数据网络超时检测间隔
start?slave;? #开启复制
show?status?like?‘slave%‘; #显示从库心跳状态
show slave status\G #查看从库连接状态
show slave status\G 查看Seconds_Behind_Master项参数 数值越大延时越多 #查看主从复制延时

percona-toolkit介绍

1)pt-table-checksum 负责监测mysql主从数据一致性
2)pt-table-sync 负责当主从数据不一致时修复数据,让它们保存数据的一致性
3)pt-heartbeat 负责监控mysql主从同步延迟

依赖包
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
下载链接:https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm

第一次使用

使用之前注意
在主库执行授权(一定要对主库ip授权,授权的用户名和密码可以自行定义,不过要保证这个权限能同时登陆主库和从库)
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON . TO ‘root‘@‘主库IP地址‘ identified by ‘123456‘;
mysql> flush privileges;
在从库上执行授权
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO ‘root‘@‘主库IP地址‘ IDENTIFIED BY ‘123456‘;
mysql> flush privileges;
没有唯一索引或者主键时也会报错

检测同步-使用示例
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --create-replicate-table?--databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

常用参数解释:
(别忘了第一次运行的时候需要添加--create-replicate-table参数创建表名为checksum的表?,后续再运行时就不需要加了)
--nocheck-replication-filters?:不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format?: 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only?:只显示不同步的信息。
--replicate=?:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases=?:指定需要被检查的数据库,多个则用逗号隔开。
--tables=?:指定需要被检查的表,多个用逗号隔开
h=?:Master的地址
u=?:用户名
p=:密码
P=?:端口

执行结果
解释:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。

修复同步-使用示例
pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print

参数解释:
--replicate= :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
--databases= : 指定执行同步的数据库。
--tables= :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h= :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
u= :帐号。
p= :密码。
--print?:打印,但不执行命令。
--execute?:执行命令。

#自动检测数据是否一致脚本
#!/bin/bash
NUM=$(/usr/bin/pt-table-checksum?--nocheck-replication-filters --no-check-binlog-format?--replicate=huanqiu.checksums --databases=huanqiu? h=192.168.1.101,u=root,p=123456,P=3306|awk?-F" "?‘{print $3}‘|sed?-n?‘2p‘)
if?[ $NUM -eq?1 ];then
??/usr/bin/pt-table-sync?--replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
??/usr/bin/pt-table-sync?--replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
??echo?"data is ok"
fi

整体操作流程

开始

配置从库my.cnf

     配置主库my.cnf

创建主从复制用户

从库连接主库配置
CHANGE MASTER TO MASTER_HOST=‘182.92.172.80‘,
MASTER_USER=‘主库创建的用户‘,
MASTER_PASSWORD=‘密码‘,
MASTER_LOG_FILE=‘mysql-bin.000003‘,
MASTER_LOG_POS=73;

创建percona-toolkit
用户

开启复制
start slave;

锁定主库所有表写操作

flush tables with read lock;

查看连接状态
show slave status\G

查看主库binlog状态
SHOW MASTER STATUS;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

     解锁表

unlock tables
技术分享图片

以上是关于MySQL主从复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 主从复制与读写分离(原理深刻,过程详细,值得一看)

MySQL主从复制与读写分离

MySQL主从复制及读写分离实际部署与验证

MySQL主从复制及读写分离实际部署与验证

mysql实现主从复制/主从同步

MySQL主从复制以及读写分离(❤❤❤❤含理论和实验❤❤❤❤大家中秋快乐!㊗)