玩转mysql主从和主主

时间:2022-09-14 15:04:08

++++++++++++++++++++++++ 在master上处理 ++++++++++++++++
#1 配置文件中添加并保证唯一
 server-id=1
 log-bin=/var/lib/mysql/mysql-bin

#2 重启
 /etc/init.d/mysqld restart

#3 建立用于同步的账号rep
 grant replication slave on *.* to 'rep'@'192.168.11.%' identified by '123456';
 flush privileges;
 show grants for rep@'192.168.11.%’;
 注意: replication slave 为mysql 同步的必须权限,此处不要授权all容易被黑客攻击。

#4 进行导库操作(对数据库锁表只读) 当前窗口不要关闭
   注意:生产环境时,操作主从复制,需要申请停机时间。数据量很大锁表会影响业务。

   flush table with read lock;
   提示: 这个锁表命令的时间,在不同的引擎的情况,会受下面参数控制,锁表时,如果超过设置时间不操作会自动解锁。
   受二参数限制:interactive_timeout = 60  wait_timeout = 60
   默认情况下时长: show variables like '%timeout%';

#5 查询bin-log日志在哪里 查询主库状态
   show master status;
   查询主库状态,即当前binlog日志文件名和二进制binlog日志偏移量。
   表示我现在主库往bin-log里写数据写到了 000001这个文件的342位置点
   
#6 备份所有库 即导出数据库所有数据
   mysqldump -u root -p123456 --events --compact --default-character-set=utf8  -A -B -F |gzip >  mysql_all_$(date +%F).sql.gz

#7 解锁
   unlock table
++++++++++++++++++++++++ 在slave上处理 ++++++++++++++++
#1 配置文件中设置server-id 并关闭bin-log参数配置
   server-id=2
   #log-bin=/var/lib/mysql/mysql-bin
#2 重启
   /etc/init.d/mysqld restart

#3 将主库的数据库拉取到本地导进数据库
 scp root@192.168.11.16:/home/yeqing/mysql_all_2017-01-18.sql.gz .
 gzip -d mysql_all_2017-01-18.sql.gz
 
注意: 有外键的表不好导,mysql等系统表不要导

#4 配置同步参数(根据show master status设置)
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.11.16',
    -> MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=342;
Query OK, 0 rows affected (0.11 sec)

#5 检查是否有master.info
   cat /var/lib/mysql/master.info

#6 执行同步开关啦
   slave start;

#7 检查是否已经同步
  show slave status\G;

  io和sql进程要yes:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
  延迟要为0
    Seconds_Behind_Master:0

#8 如果遇到IO进程和sql进程有不是YES,进行如下处理:

方案1:
    1. 在master上
        清除bin-log: reset master;
        重新查看位置点:show master status;
    2. 在slave上
        关闭同步:slave stop
        清除bin-log: rester
        对照master位置点重新进行配置同步参数
        重新开启同步: slave start;
        再次查看是否同步: show slave status\G;
方案二:
   差异小的情况下直接通过navicat的数据对比功能 找出来 给从库补上
   关闭同步:slave stop
   清除bin-log: rester
    重新开启同步: slave start;

方案三:
   差异大的情况下,直接重新做主从同步。

#9 测试同步
 在master上:
    create table test_2(id int);
    mysqlbinlog mysql-bin.*|egrep -v '#|*!'

  在slave上:
     show tables;

+++++++++++++++++++++++++++++++++++ 主主配置++++++++++

master-1:

relay_log_info_file=/var/lib/mysql/relay-log.info
relay-log-purge = 1
log-slave-updates
relay-log-recovery =1
auto_increment_offset = 1
auto_increment_increment = 2

master-2:

relay_log_info_file=/var/lib/mysql/relay-log.info
relay-log-purge=1
relay-log-recovery=1
log-slave-updates
auto_increment_offset = 2
auto_increment_increment = 2

分别重启mysql 并 slave stop /start

本文出自 “开发与运维” 博客,谢绝转载!