主服务器:172.16.15.20
从服务器:172.16.15.30

1、两节点分别安装mysql

  1. # pvcreate /dev/sda5   
  2. # vgcreate myvg /dev/sda5  
  3. # lvcreate -L 10G -n mydata myvg  
  4. # mkdir -p /data/mydata  
  5. # mke2fs -j /dev/myvg/mydata   
  6. # mount /dev/myvg/mydata /data/mydata/  
  7.  
  8. # tar xf mysql-5.5.24-linux2.6-i686.tar.gz  -C /usr/local/  
  9. # cd /usr/local/  
  10. # ln -s mysql-5.5.24-linux2.6-i686/ mysql  
  11. # cd mysql  
  12. # useradd -r mysql  
  13. # chown -R mysql.mysql .  
  14. # scripts/mysql_install_db --datadir=/data/mydata/ --user=mysql 
  15. # chown -R root .  
  16. # cp support-files/my-large.cnf /etc/my.cnf  
  17. # vim /etc/my.cnf   
  18. thread_concurrency = 2 
  19. datadir = /data/mydata  
  20.  
  21. # cp support-files/mysql.server /etc/rc.d/init.d/mysqld  
  22. # chmod +x /etc/rc.d/init.d/mysqld  
  23. # service mysqld start 

2、配置主服务器,添加用户

  1. mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'172.16.15.%' IDENTIFIED BY 'redhat';    
  2.  
  3. mysql>flush privileges;  
  4.  
  5. (注:一定要查看下使用的日志和日志位置,后面要用到)  
  6. mysql>show master status;  
  7. +------------------+----------+--------------+------------------+  
  8. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  9. +------------------+----------+--------------+------------------+  
  10. mysql-bin.000001 |      335 |              |                  |  
  11. +------------------+----------+--------------+------------------+  
  12. 1 row in set (0.00 sec  


3、配置从服务器

  1. # vim /etc/my.cnf  
  2. relay-log=mysql-relay   //添加中继日志  
  3. server-id       = 2    //修改ID和主的不一样  
  4.  
  5. # service mysqld restart 重启生效  
  6.  
  7. 添加以下命令  
  8. mysql> CHANGE MASTER TO MASTER_HOST = '172.16.15.20' ,  //指定主服务器  
  9.     -> MASTER_USER = 'repluser' ,   //指定用户  
  10.     -> MASTER_PASSWORD = 'redhat' ,   //密码  
  11.     -> MASTER_LOG_FILE = 'mysql-bin.000001' ,  //指定日志  
  12.     -> MASTER_LOG_POS = 355 ;    //指定日志位置  
  13.  
  14. 可以通过下面命令查看刚配置信息:  
  15. mysql> show slave status\G  
  16.  
  17. 启动从服务线程  
  18. mysql> start slave;  
  19.  
  20. 禁止从服务器写入,重启服务就失效了,应该将read_only = on 写进配置文件中:  
  21. SET GLOBAL read_only = on;  
  22.  
  23. 配置文件[mysqld]中添加如下,让从服务器的mysql服务在启动时候不要自动启动从服务线程,手动启动  
  24. skip-slave-start=1 

4、测试

  1. 主服务器上建立数据  
  2. mysql> create database tb1;  
  3. mysql> use tb1;  
  4. mysql> create table test (name varchar(10));  
  5. mysql> insert into test values ('jack'),('tom');  

查看下:

MySQL 主—从复制_MySQL

再在从服务器上看下,可以看到已经有复制过来的信息了:

MySQL 主—从复制_MySQL_02


5、下面模拟从服务的数据丢失:

删除从服务器上/data/mydata/下的所有数据


在主服务器上用之前建立的LVM通过快照在主服务其上建立物理备份:

  1. 首先锁表,之后一定不要退出,新开个终端执行物理备份  
  2. mysql> flush tables with read lock;  
  3. Query OK, 0 rows affected (0.55 sec)  
  4.  
  5. # lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata   
  6. # mount /dev/myvg/mydata-snap /mnt  
  7. # cd /mnt/  
  8. # tar jcf mysql_bak.tar.bz2 *  
  9. # scp mysql_bak.tar.bz2 172.16.15.30:/root  
  10.  
  11. 在解锁之前先看下日志位置  
  12. mysql> show master status;  
  13. +------------------+----------+--------------+------------------+  
  14. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  15. +------------------+----------+--------------+------------------+  
  16. mysql-bin.000001 |      978 |              |                  |  
  17. +------------------+----------+--------------+------------------+  
  18. 1 row in set (0.00 sec)  
  19.  
  20. 确认日志位置后解锁  
  21. mysql> unlock tables;  
  22. Query OK, 0 rows affected (0.00 sec)  
  23.  
  24. 之后插入一条数据,看一会从服务器会产生否  
  25. mysql> insert into tb1.test values ('redhat');  
  26. mysql> select * from tb1.test;  
  27. +--------+  
  28. | name   |  
  29. +--------+  
  30. | jack   |  
  31. | tom    |  
  32. | redhat |  
  33. +--------+ 


从服务器恢复:
# tar xf mysql_bak.tar.bz2 -C /data/mydata/
启动服务发现有报错

MySQL 主—从复制_MySQL_03

# ps -ef | grep mysql 发现僵死进程,杀掉重启还报错,看日志发现权限问题
# ll /data/mydata/ -d
drwxr-xr-x 7 root mysql 4096 Aug  6 14:25 /data/mydata/

# chown -R mysql .

启动OK

重新配置从服务器,指定解锁前的日志位置
 

  1. mysql> CHANGE MASTER TO MASTER_HOST = '172.16.15.20' ,    
  2.     -> MASTER_USER = 'repluser' ,     
  3.     -> MASTER_PASSWORD = 'redhat' ,     
  4.     -> MASTER_LOG_FILE = 'mysql-bin.000001' ,    
  5.     -> MASTER_LOG_POS = 978 ;      
  6.  
  7. mysql> slave start; 

再查看,发现已经有数据了,并且redhat也有,之后主再插入数据,依旧复制:

   MySQL 主—从复制_主从复制_04