MySQL 内建的复制功能是构建大型,高性能应用程序的基础。将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数据复制到其它主机( Slave )上,并重新执行一遍来实现的。复制过程中一个服务器充当服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置,从服务器接收从那时起发生的任何更新,然后封锁等等主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对服务器上的表所进行的更新之间的冲突
binlog_format = 'STATEMENT'
binlog_format = 'ROW'
binlog_format = 'MIXED'
可以简化为三个步骤(如下图):
说明:
- Master 记录二进制的日志。在每个事务更新数据之前,Master 在二进制日志记录这些改变。 MySQL 将事务日志的写入二进制日志,及时事务中的语句都市交叉执行的。在事件写入二进制日志完成后,Master 通知存储引擎提交事务。
- Slave 将 Master 的 Binary log 拷贝到它自己的中继日志。首先 Slave 开始一个工作线程--I/O线程。I/O 线程在 Master 上打开一个连接,然后开始从二进制日志中读取事件,如果已经连上 Master,它会并等待master产生新的事件。I/O线程就这些事件写入中继日志。
- SQL Slave Thread ( SQL从线程)处理该过程的最后一步。SQL纯种从中继日志读取事件,并重放其中的事件而更新 Slave 的数据。使其它与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。
- 此处,在 Master 中也有一个工作线程,和其他 MySQL 的连接一样,Slave 在 Master 中打开一个连接也会使得 Master 开始一个线程。复制过程有一个很重要的限制---复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
在 Master 的数据库中建立一个复制账户,每个 Slave 使用该账户连接 Master 进行复制,需要 replication slave
和replication client
权限,Master 的连接信息会存储在文本文件 master.info 文件中。(master.info文件在 Slave 的数据目录中)
mysql>GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.5.9' IDENTIFIED BY '211212';
mysql>flush privileges;
说明:创建了一个用户名为 replication 的用户,密码为 211212,只允许在 192.168.5.9 这个 Slave 上登录。
如果是新安装的 MySQL 主从服务器,这一步不需要。如果 Master 之前有数据,需要把 Master 的数据导出并还原到 Slave 上,要保证 Master 和 Slave 服务器中的数据是一样的。建议导出 Master 库的时候进行锁表,导完后再解锁。
#在mysql-master上执行
[root@master ~]# mysql -u root -p211212
mysql>flush tables with read lock;
[root@master ~]# mysqldump --all-databases -uroot -p211212 > all_databases.sql
[root@master ~]# mysql -uroot -p211212
mysql> unlock tables;
[root@master ~]# scp all_databases.sql [email protected]:/root
#在mysql-slave 执行
[root@minion ~]# mysql -uroot -p211212 -hlocalhost -P3306 --default-character-set=utf8 < all_databases.sql
或者 mysql -uroot -p211212
mysql>source /root/all_databases.sql;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| vdevops |
| wh-test |
+--------------------+
5 rows in set (0.04 sec)
设置主从同步前,保证master和slave的数据一致。
修改配置都需要修改 MySQL 的数据库配置文件,默认是 /etc/my.cnf
log-bin=mysql-bin
改成log-bin=/var/log/mysql/master-bin
binlog_format=mixed
将 server-id=1
前面的注释去掉,如果没有,则手动添加到 mysqld 下面。
必须要配置 server-id ,server-id 的值不能和 Slave 是一样的。
在 [mysqld] 下面添加 binlog-do-db=vdevops
说明:binlog-ignore-db=test 表示不同步 test 数据库,如果有多个数据库,需要多写几行。
#mkdir -p /data/mysql/log
chown mysql.mysql -R /data/mysql/log
[root@master mysql]# /etc/init.d/mysql restart
mysql > show master status;
记录下 File 和 Postition,下面配置 Slave 的时候需要用。
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 107 | vdevops | mysql |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
#File master-bin.000001
#Position 107
修改配置都需要修改 MySQL 的数据库配置文件,默认是 /etc/my.cnf
将 server-id=1
改成 server-id=2
relay-log=/data/mysql/log/relay-log
mkdir -p /data/mysql/log
chown mysql.mysql -R /data/mysql/log
/etc/init.d/mysql restart
mysql>show global variables like '%relay%';
mysql>change master to master_host='192.168.5.5',master_user='replication',master_password='211212',master_log_file='master-bin.000001',master_log_pos=107;
选项:
说明:使用刚刚在 Master 创建的用户连接,log_file 和 log_pos 就是使用刚刚在 Master 上执行
show master status;
执行出来的结果中的File和Position
mysql> start slave;
mysql>show slave status \G;
说明:如果 Last_SQL_Error 没有错误提示以及 Salve 中的 Exec_Master_Log_Pos 值和 Master 中的 show master status; 中的 Postition 值是一样的,这样的话,MySQL 主从复制应该是成功的。
# Slave_IO_Running: Connecting
# Slave_SQL_Running: Yes
如果出现:Connecting可能是File值改变导致的,因为在master上面修改配置文件重启之后,shou master status;master bin-log参数初始值已经改变。解决:
- 1、网络不通
- 2、密码不对
- 3、pos不对
- 4、主机防火墙未关闭 #本人这个次错误就是这个原因,有点傻
.登录master,先把master锁表,flsuh tables with read lock;然后show master status;得到最新的File文件值和Position值,然后登录slave,stop slave;重新连接master:change master to master_host='192.168.5.5',master_user='replication',master_password='211212',master_log_file='master-bin.000005',master_log_pos=107;切换master,unlock tables;#service iptables stop#到此,登录slave,show slave status \G
能看到SLAVE_IO和SLAVE_SQL两个进程已经成功运行。
在 Master 数据库中执行sql语句操作,观察 Slave 是否同步,如果同步则说明配置成功。
登录master:
mysql -u root -p211212
mysql>use vdevops;
mysql>create table master_test(id int(4) not null,type char(20) not null);
mysql> insert into master_test values (001,'vdevops');
登录slave,查看数据是否已经同步
mysql -u root -p211212
mysql>use vdevops;
mysql> select * from master_test;
+----+---------+
| id | type |
+----+---------+
| 1 | vdevops |
+----+---------+
1 row in set (0.00 sec)
#可以进行删表操作查看主从同步变化
主从一致性主要是通过 Percona-Toolkit 这个工具来实现的,Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要功能包括:
现在,使用这个工具来完成一致性检查和数据同步。
官网是:https://www.percona.com/software/mysql-tools/percona-toolkit
安装的方式有多种,可以编译安装,也可以通过包管理器安装,为了方便,直接下载 rpm 包,然后yum进行安装。
文件下载地址:https://www.percona.com/doc/percona-toolkit/2.2/installation.html
wget percona.com/get/percona-toolkit.rpm
yum install percona-toolkit.rpm -y
或者
wget percona.com/get/percona-toolkit.tar.gz
tar zxvf percona-toolkit.tar.gz && cd percona-toolkit
mysql>grant select,process,super,replication slave on *.* to 'mysql_check'@'x.x.x.x' identified by '123456';
mysql>flush privileges;
pt-table-checksum --nocheck-replication-filters --databases=dy_qqopen --replicate=test.checksums --create-replicate-table --host=192.168.5.5 --port 3306 -umysql_check -pLooking_s123 --recursion-method=hosts
参数说明:
执行结果:
参数说明:
说明:如果出现不一致的情况,就需要进行修复了。
问题1: 执行命令时提示 "Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information."错误
解决方法: 在从服务器的 /etc/my.cnf
配置文件中添加两行,report_host=192.168.5.9(slave_ip) report_port=3306(slave_port)
。然后重启 MySQL 服务
使用 pt-table-sync 这个命令来修复。 pt-table-sync 命令介绍:高效的同步 MySQL 表之间的数据,他可以做单向和双向的表数据。也可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。
pt-table-sync --print --user=mysql_check --password=Looking_s123 h=192.168.5.5,D=dy_qqopen,t=qq_task h=192.168.5.9
参数说明:
解决和处理主从错误这个是最重要的,比配置更更要。提高处理问题的能力,要熟悉原理,多处理积累,多学习其他网友的处理方式。出现错误都会在 Last_SQL_Error 中显示错误,一般根据错误提示进行处理,如果不太清楚,可以谷歌查询一下,不过操作完之后,同步正常后,一定要核对一下数据是否一致。
以下是收集的几个处理主从问题的链接: