- 查看事务的隔离级别
show variables like '%isolation%';
可以看到tx_isolation的隔离级别是REPEATABLE-READ(可重复读),也可以通过select @@tx_isolation查看事务的隔离级别。
查看系统当前隔离级别 select @@global.tx_isolation; - 修改数据库当中的值
向主库当中添加了一条数据,同时查看从库,如下图: - 使用show slave status\G;查看一下从库的复制状态,我们看到两个线程都处于运行状态
- 执行stop slave语句,停掉后再次查看slave的状态
我们看到工作的两个线程已经停止了,这时候打开/var/lib/mysql/master.info这个文件会看到记录的主从复制的一些信息 - 执行 reset slave语句这是slave信息就会被清除掉,再次查看master.info文件时发现内容已经没有了。
登录数据库再次执行show slave status\G;选项查看slave状态发现之前的信息已经没有了。说明已经被清除。 -
要保证主从数据库数据的一致性,前提是需要使用数据库的innodb这个引擎,我们可以通过show variables like
'%engine%';语句查看当前数据库的存储引擎 -
开始进行主从复制。首先备份主库当中的数据。在从库中执行如下语句:mysqldump ‐h192.168.197.131 -uroot -proot ‐‐default‐character‐set=utf8 ‐‐databases Test ‐‐single‐transaction ‐‐master‐data=2 > test.sql 会生成test.sql脚本,如下图:
注意,上面的语句必须用手敲,如果复制粘贴上面的代码则会报如下错误:
mysqldump:Got error:1049:Unknown database ...
网上查了很多解决方法,都说是因为最后增加了分号,可是我根本没加分号也出这个错误最后只有自己手动敲一遍才不会出现这个错误。
这一步是将主库当中的数据以sql脚本的形式备份到了从库,并在从库当中记录了主库当前的位置(文件名为000003,位置为154),接下来我们可以删除从库当中的数据。然后从这个sql脚本恢复数据,后面会操作这一步 -
使用cat命令打开test.sql文件,看到如下内容
我们看到CHANGE MASTER语句被注释掉了,那是因为mysqldump语句的master-data选项被设置为2,如果是1的话就不会被注释。位置是154,并且binlog文件是000003此时打开主库输入 show master status\G;可以看到文件是mysql-bin.000003,位置是154,如下图: -
这时候在主库当中输入如下数据:
-
查看一下主库日志文件的位置,发现已经到了913
-
在从库当中使用mysql -uroot -proot --default-character-set=utf8 < test.sql导入test.sql,如下图所示:
此时我们看到Test数据库当中的T1表当中还是之前的那两条数据,如下图: -
打开从库当中的test.sql文件,找到被注释的CHANGE MASTER的地方,查看被记录的文件和它的位置,如下图:
-
此时执行change master to master_host='192.168.197.131',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154; 注意这里的master_log_file和master_log_pos与刚刚看到的文件名与位置相同,表示我们要从整个地方开始进行主从复制。如下图所示:
-
此时IO线程与SQL线程全部都是停止的,我们再次执行start slave启动从库,如下图:
我们看到位置发生了变化,整个位置与主库当中的位置相同。表示从154这个位置开始同步数据。 -
再次打开从库查看数据发现数据已经与主库同步,如下图:
-
总结:
1、在从库当中使用mysqldump语句以sql脚本的形式备份主库当中的数据,这一步主要是记录主库的日志文件位置。
2、这时候可以继续对主库的数据进行增删改查的操作
3、使用stop slave和reset slave停止从库的复制, 并删除之前与主库同步的数据库。
4、在从库当中使用mysql -uroot -proot --default-character-set=utf8 < test.sql导入test.sql恢复备份的数据
5、使用change master语句从master_log_pos记录的位置开始进行数据的复制,注意执行这条语句之前必须使用stop slave停止从库的复制
6、使用start slave恢复从库的复制,我们看到已经从备份的sql脚本文件当中记录的位置开始恢复所有的数据。从而达到不影响主库业务的情况下完成与主库的同步。