一,mysql主从复制原理介绍:

  mysql的复制是基于二进制日志实现的,二进制日志记录的是一切可能引起数据库发生改变的操作,因此,二进制日志对mysql十分重要,利用它可以实现数据库的即时点还原,对于备份恢复数据库意义重大。

  mysql复制中,主服务器的事务操作提交后,会将事件记录到二进制日中去,这时从服务器会启动IO_Thread来与主服务器通信,将主服务器中的二进制日志中的事件复制到本地并保存在本地的中继日志中,而后,从服务器会通过SQL_Thread将中继日志中的事件提取出来在数据库中进行重放,以此来与主服务器保持同步。


二,实验规划:

系统平台:rhel6.5 x86_64

mysql版本为5.5.42

主服务器地址:192.168.1.30

从服务器地址:192.168.1.65


三,实验步骤:

1,主服务器配置:

 (1)编辑mysql的配置文件

# vim /etc/my.cnf
 [mysqld]
innodb_file_per_table = 1
log-bin = master-bin  #启用二进制日志,必须启用!
log-bin-index = master-bin.index  #二进制日志的索引文件
server-id = 1 #设置一个全局唯一的server id用以标示各服务器,范围是0-(2^32-1)
sync-binlog = ON # 用于事务安全


 (2)创建一个具有复制权限的用户

mysql> GRANT REPLICATION SLAVE ON *.* TO 'testuser'@'192.168.1.%' IDENTIFIED BY '111111';


2,从服务器配置: 

 (1)编辑mysql的配置文件

# vim /etc/my.cnf
[mysqld]
relay-log = relay-log #开启中继日志
relay-log-index = relay-log.index #中继日志的索引文件
server-id = 2 # 全局唯一的server-id 
read-only = YES #从服务器为只读


 (2)连接到主服务器,开始复制数据

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.30',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_FILE_POS=107,MASTER_USER='testuser',MASTER_PASSWORD='111111';
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.1.30
                  Master_User: testuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: relay-log.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 107
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
1 row in set (0.00 sec)
ERROR: 
No query specified

启动IO_Thread和SQL_Thread

mysql> START SLAVE;

再次查看

...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

3,测试复制

在主服务器上创建testdb数据库

mysql> CREATE DATABASE testdb;
mysql> USE testdb;
mysql> CREATE TABLE numbers(ID INT);
mysql> INSERT INTO numbers VALUES (1), (2), (3);


在从服务器上查看:

mysql> SHOW SLAVE STATUS\G;
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 473
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 620
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |               
| mysql              | 
| performance_schema | 
| testdb             | 
+--------------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM testdb.numbers;
+------+
| id   |
+------+
|    1 | 
|    2 | 
|    3 | 
+------+
3 rows in set (0.00 sec)

可以看到,数据库已从主服务器复制到从服务器,至此mysql的主从复制完成了。