本文共 5364 字,大约阅读时间需要 17 分钟。
MySQL主从介绍
MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步。MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程:
需要保持数据的一致性,才能复制数据
1、主服务器将更改操作记录到binlog中
2、从服务器将主服务器的binlog事件(SQL语句)同步到本机(从服务器)并记录在relaylog(中继日志)中
3、从服务器根据relaylog里面的SQL语句按顺序执行
说明: 该过程有三个线程,主上有一个log dump线程,用来和从的i/o线程传输binlog;从上有两个线程,其中i/o线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的SQL语句执行。
应用的场景:
1、备份重要的数据
2、分担主库服务器的读的压力,让从服务器读,主服务器写操作
准备工作
主服务器:192.168.3.74 安装mysql5.6
从服务器:192.168.3.83 安装mysql5.6
配置主
1、[root@centos7 system]# vi /etc/my.cnf
[mysqld]
server-id=132
log_bin=jacklinux
2、重启:
[root@centos7 system]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
[root@centos7 system]# ls -lt /data/mysql/ #二进制文件,不能查看
-rw-rw---- 1 mysql mysql 19 Nov 22 09:33 jacklinux.index
-rw-rw---- 1 mysql mysql 120 Nov 22 09:33 jacklinux.000001
3、新建一个数据库为试验做准备:
[root@centos7 mysql]# mysqldump -uroot -p123456 zrlog > /tmp/zrlog.sql
[root@centos7 mysql]# mysql -uroot -p123456 -e "create database jacktest"
[root@centos7 mysql]# mysql -uroot -p123456 jacktest < /tmp/zrlog.sql
4、创建同步账号
mysql> grant replication slave on *.* to 'repl'@'192.168.3.83' identified by '123456';
#只给复制权限,对所有库所有表,ip为从服务器的ip,账号为repl,密码:123456
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock;
#先进行锁表,等主从服务器数据保持一致,再解锁表
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| jacklinux.000001 | 10989 | | | |
+------------------+----------+--------------+------------------+-------------------+
#需要记录file、position位置
配置从
1、[root@test ~]# vim /etc/my.cnf
[mysqld]
server-id=130
#必须得和主服务器上的server-id不一样
2、[root@test ~]# scp 192.168.3.74:/tmp/*.sql .
3、mysql> create database zrlog;
4、恢复数据库
[root@test ~]# mysql -uroot zrlog < zrlog.sql
实现主从同步:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='192.168.3.74',master_user='repl',master_password='123456',master_log_file='jacklinux.000001',master_log_pos=10989;
#master_log_file、master_log_pos:主服务器上
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5、解锁主库的表(在主上操作):
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= 如aming.%,支持通配符
replicate_wild_ignore_table= 忽略
验证:
主服务器上创建表zrtest,并插入数据
mysql> use zrlog
mysql> create table zrtest(id int);
Query OK, 0 rows affected (0.02 sec)
mysql> desc zrtest;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
mysql> insert zrtest value(1);
Query OK, 1 row affected (0.01 sec)
mysql> insert zrtest value(20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from zrtest;
+------+
| id |
+------+
| 1 |
| 20 |
+------+
从服务器上查看是否有zrtest表,还有数据
mysql> use zrlog;
mysql> select * from zrtest;
+------+
| id |
+------+
| 1 |
| 20 |
+------+
验证完成,可以同步
主数据库服务器上:
1、锁表:
mysql> flush tables with read lock;
2、等还原后记得解锁
mysql> unlock tables;
断电后导致主从不一致,需要重新连接,此操作不用停服务或者锁表
准备操作:
1、需要开启gtid
[root@centos7 db_bk]# vi /etc/my.cnf
[mysqld]
server-id=133
binlog_format=mixed
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
2、重启mysqld,再表里插入几行数据
3、查看:
show global variables like '%gtid%'
从服务器上:
1、vi /etc/my.cnf
[mysqld]
server-id=130
log_bin=jacklinux
binlog_format=mixed
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
2、重启mysqld
操作:
1.安装innobackupex
yum install
yum list | grep percona
yum install percona-xtrabackup
2.数据库配置写下用户名密码
操作:
1、备份源数据库
[root@centos7 ~]# innobackupex --socket=/tmp/mysql.sock /data/db_bk/
2、查看目录
3、应用日志,使数据文件保持一致
[root@centos7 ~]# innobackupex --apply-log /data/db_bk/2018-01-03_16-39-52/
4、拷贝数据
[root@centos7 db_bk]# cd /data/db_bk/
[root@centos7 db_bk]# scp -r 2018-01-03_16-39-52/ root@192.168.3.83:/data
从数据库服务器上
停止数据库服务
[root@test data]# /etc/init.d/mysqld stop
清空文件夹数据
[root@test mysql]# rm -rf /var/lib/mysql/*
恢复数据
[root@test mysql]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/2018-01-03_16-39-52/
改权限,并启动数据库
[root@test mysql]# chown -R mysql.mysql /var/lib/mysql
/etc/init.d/mysqld start
主数据库服务器上
查看master的gtid位置:
[root@centos7 db_bk]# cat /data/db_bk/2018-01-03_16-39-52/xtrabackup_binlog_info
jacklinux.000014127744e9aeff-c530-11e7-9e06-0050562d75e7:1-4
从数据库服务器上
连接slave,设置跳过的日志文件
mysql
mysql> set global gtid_purged='44e9aeff-c530-11e7-9e06-0050562d75e7:1-4';
mysql> change master to master_host='192.168.3.74',master_user='repl',master_password='123456',master_port=3306,master_auto_position=1;
启动从库配置
> start slave;
查看状态
> show slave status\G;
报错:Slave_IO_Running: No
解决:查了很久,原来是我的change master to master_host='192.168.3.83',master_user='repl',master_password='123456',master_port=3306,master_auto_position=1;中的master_host写成本机了,应该是192.168.3.74
记得解锁
mysql> unlock tables;