MySQL主从复制

原理

  MySQL主从复制通过两台机器,实现一台机器数据的变化在另一台机器上实时同步的过程。

  首先开启master数据库和slave的binlog文件,再给master创建slave允许复制的用户。当master数据库获取到更改数据库的SQL语句时,master数据库会将更改数据库的SQL保存至binlog文件,运行在slave数据库上的IO Thread线程根据position位置记录读取binlog文件,从而写入relay log文件,之后再由slave的SQL Thread线程读取relay log文件并执行SQL以达到数据同步。

最佳实践

  在生产环境下的单数据库在不关闭服务下做主从复制。

1、首先需要将单数据库修改为master库

[root@localhost ~]# vi /etc/my.cnf    #追加一下内容到my.cnf并保存
server-id=1
log-bin=/var/lib/mysql/mysql-bin
[root@localhost ~]# service mysqld restart
  • server-id:表示数据库的标识
  • log-bin:表示binlog文件存放地址

2、将master库的数据备份

[root@localhost ~]# mysqldump -uroot -p --single-transaction --master-data=2 --triggers --routines --all-databbases > ~/master.sql
  • mysqldump:数据库备份工具,由MySQL提供
  • uroot:表示用户为root
  • p:表示密码
  • single-transaction:表示设置事务的隔离级别为可重复读,也就是MySQL数据库的默认级别
  • master-data:表示binlog信息,1为记录binlog和pos点  2为记录binlog和pos点,但注释这行
  • triggers:表示保存触发器
  • routines:表示保存存储过程和自定义函数
  • all-databases:表示导出所有的库
  • master.sql:表示导出文件名

3、拷贝SQL文件到从服务器

[root@localhost ~]# scp root@172.16.68.109:/root/abc.sql ~

4、导入slave中

[root@localhost ~]# mysql -uroot -p < ~/abc.sql

5、在master库中授复制的权限给slave

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaverepl'@'192.168.1.124' IDENTIFIED BY 'slave';
mysql> FLUSH PRIVILEGES;

6、查看master状态,并记录binlog文件名和pos位置

mysql> SHOW MASTER STATUS;

7、接下来设置slave的配置

[root@localhost ~]# vi /etc/my.cnf    #追加一下内容到my.cnf并保存
server-id=2
log-bin=/var/lib/mysql/mysql-bin
[root@localhost ~]# service mysqld restart

8、如果这台机器之前做过主从复制,清理一下relay-log文件

mysql> RESET SLAVE;

9、在slave中执行change master语句

mysql> CHANGE MASTER TO master_to='192.168.1.125',master_user='slaverepl',master_password='slave',master_log_file='mysql-bin.000001',master_log_pos=154;

这里的master_log_file就是上面记录的binlog文件名,master_log_pos就是上面记录的pos值。

10、启动slave,并查看状态

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;

如果看到IO Thread的值和SQL Thread的值都为Yes就说明主从复制成功。

接下来在master库添加一条数据,在slave库也同时可以看见这条数据。

posted @ 2017-12-24 18:20  huanStephen  阅读(174)  评论(0编辑  收藏  举报