mysql 主从复制

###############

yum install httpd mysql mysql-server

4  AB
mysql  AB复制
冷备份的时候涉及到停服务器问题,所以做AB复制
master42
安装mysql-server,
开启bin-log,
为了salve能够连接到master,所以要为salve创建账号
salve23
安装mysql-server
通过i/o线程连接到master服务器上,
读取master上二进制内容,
放到本地relay_log中,
然后通过本地的sql线程读取rela_log的内容并重新在本地执行。
两条线程是默认的
4.1 确定主副
master42:
  
  
  
  
  1. vim /etc/my.cnf

  2.    [mysqld]

  3. server_id = 1

slave23:
  
  
  
  
  1. vim /etc/my.cnf

  2.    [mysqld]

  3. server_id = 2   //大于1就可以

4.2 master上开启bin-log
master42:
  
  
  
  
  1. vim /etc/my.cnf

  2.    [mysqld]

  3. server_id = 1

  4. log-bin=binlog

  5. log-bin-index=binlog.index  //指定索引文件名字,默认就是,可以不写

4.3 设置salve的relay_log的名字
slave:
  
  
  
  
  1. vim /etc/my.cnf

  2.    [mysqld]

  3. server_id = 2

  4. relay_log = /var/lib/mysql/mysql-relay-bin

  5. relay_log_index=/var/lib/mysql/mysql-relay-bin.index

4.4  重启master和salve,否则server_id不生效
master && slave
service mysqld restart
4.5 master为salve创建账号
master42:
  
  
  
  
  1. mysql> GRANT replication slave ON *.* TO 'kyo'@'%' identified by '123';  

  2. Query OK, 0 rows affected (0.05 sec)

  3. mysql> flush privileges;

  4. Query OK, 0 rows affected (0.00 sec)

##################################################
slave:
cd /var/lib/mysql
rm -fr *
service mysqld restart
master  在master上做全备份
#mysqldump -A -x > /tmp/full.sql
AB同步之前要保证数据都一样。
#scp /tmp/full.sql [email protected]:/tmp/
slave:  在salve上将数据导入。
#mysql < /tmp/full.sql
此时两边数据一致。
********************4.6******************************
master:
mysql> flush tables with read lock; //先将表锁上,保证数据库现在没有数据写入,因为salve还没有连上master,不能同步,如果master有数据写入,则数据又不一致。
mysql> show master status; //查看二进制日志写到的位置
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000003 |      295 |              |                  |
  
  
  
  
  1. mysql>unlock tables; //此时可以解锁,两边数据可以不一致,因为知道了二进制日志写到的位置,salve向master要数据时,只要从不一致的位置起索要就可以了。

4.6
slave23:
(slave连不上master的原因:网络不通,防火墙问题)
连接测试
  
  
  
  
  1. #mysql -u kyo -p123 -h 192.168.18.42   //这个用户只要数据同步权限

  2. >exit

使用salve的root登陆
#mysql -u root
  
  
  
  
  1. mysql> change master to master_host='192.168.18.42', master_port=3306, master_user='kyo', master_password='123', master_log_file='binlog.000003',master_log_pos=295;  //bin-log与上边查看的要一致

  2. mysql> start slave;

4.7
slave23:  查看两个线程是否yes
  
  
  
  
  1. mysql> show slave status \G

  2. Slave_IO_Running: Yes

  3. Slave_SQL_Running: Yes

  4. Master_log_File:binlog.000016  //当前读取的bin-log

  5. Read_Master_log_Pos:880  //已经读取的位置。

  6. Exec_Master_Log_Pos:880  //执行到的位置

  7. (Read_Master_log_Pos:880   Exec_Master_Log_Pos:880如果不同就是延迟 问题)

mysql  AB复制如果有延迟是正常的。因为salve从master上读取和,本地sql线程执行都需要时间,或者master并发大(如master上同时处理100张表,而salve只有一个线程在处理)。
==================
假如slave23数据库停了,然后在master42上创建数据库,再次开启salve23,查看数据会自动同步
因为salve32上有master.info的文件
cat master.info


假如master42数据库停止,

将Master数据库锁表

mysql> flush tables with read lock;

查看Master数据库二进制日志写到的位置

mysql> show master status;

将Slave数据库的停止复制线程

mysql> stop slave;

在Slave数据库上重新同步

change master to master_host='192.168.18.42', master_port=3306,  master_user='kyo', master_password='123',   master_log_file='binlog.000004',master_log_pos=98;

将Slave数据库的启用复制线程

mysql> start slave;

在Slave数据库上查看同步状态

mysql> show slave status \G    

                                                                       ====================        

AB复制监控
  
  
  
  
  1. slave23#mysql -e 'show slave status \G;'

然后用awk取出这两个字段,并判断是否yes
  
  
  
  
  1. Slave_IO_Running: Yes

  2. Slave_SQL_Running: Yes  

并判断Read_Master_log_Pos:880 与 Exec_Master_Log_Pos:880 两个值相差多少,解出两个值做减法,如果差100,就有问题
结合计划任务,每隔5分钟执行一次
  
  
  
  
  1. #!/bin/bash

  2. mysql -e "show slave status\G" > /tmp/haha.sql

  3. IO=`cat /tmp/haha.sql | head -12 | tail -1 | cut -d ":" -f 2`

  4. RUN=`cat /tmp/haha.sql | head -13 | tail -1 | cut -d ":" -f 2`

  5. if [ $IO = YES ] && [ $RUN = YES ];then

  6. echo OK

  7. else

  8. echo not ok

  9. fi

  10. binlogM=`cat /var/lib/mysql/master.info | head -3 | tail -1`

  11. binlogN=`cat /var/lib/mysql/relay-log.info | head -4 | tail -1`

  12. if [ $[$binlogM-$binlogN] -ge 0 ];then

  13. echo OKAY

  14. else

  15. echo bu OK

  16. fi


你可能感兴趣的:(mysql,主从)