1、搭建说明

准备工作:主从库已安装mysql软件以及xtracbackup备份工具。具体操作可参见mysql rpm安装文档。

介质

版本

操作系统

Red Hat Enterprise Linux Server release 6.8 (Santiago)

数据库

MySQL-5.6.30

角色

IP

主库

172.16.81.90

从库

172.16.81.76

2、主库操作

2.1 创建复制用户

mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO repl@'172.16.81.76' IDENTIFIED BY 'r1234';
mysql> flush privileges;

2.2 开启binlog(若已开启则不需要操作)

# vi /usr/my.cnf
#增加以下内容
[mysqld]
log-bin=mysqlbin
expire_logs_days=7
 
重启数据库
# service mysql restart

2.3主库备份

创建备份目录
# mkdir  /data/backup/
全库备份
# innobackupex  --defaults-file=/etc/my.cnf --user=root  --password="ni" --socket=/var/lib/mysql/mysql.sock  /data/backup/  --no-timestamp 
单库备份
# innobackupex  --user=root  --password="ni" --socket=/var/lib/mysql/mysql.sock --defaults-file=/usr/my.cnf /data/backup/  --no-timestamp  --database=wjf
打包备份,传到从库(临时存放在/tmp目录下)
# cd /data/
# tar -cvzf backup_master.tar.gz backup/
# scp backup_master.tar.gz  root@172.16.81.76:/tmp/

2.4 参数配置

# vi /usr/my.cnf

#增加如下内容
[mysqld]
server-id=129
relay-log=mymaster-relay-bin
# binlog-do-db=wjf
# binlog-ignore-db=test
replicate_do_db=wjf
#replicate-ignore-db=test

log-slave-updates=1
replicate-same-server-id=0

master_info_repository=TABLE  
relay_log_info_repository=TABLE 
relay_log_purge=1  
relay_log_recovery=1

server-id 是必须的,而且需唯一。

对于mysql 5.6,更新5张系统表的默认存储引擎为innodb。(changer master时报错才操作)

mysql> ues mysql;
mysql> show tables;
删除表
drop table if exists innodb_index_stats;
drop table if exists innodb_table_stats;
drop table if exists slave_master_info;
drop table if exists slave_relay_log_info;
drop table if exists slave_worker_info;
进入datadir,删除对应文件
cd /var/lib/mysql/mysql

rm innodb_index_stats.ibd
rm innodb_table_stats.ibd
rm slave_master_info.ibd
rm slave_relay_log_info.ibd
rm slave_worker_info.ibd

重建以上表
mysql> use mysql;
mysql> source /usr/share/mysql/mysql_system_tables.sql
mysql> show tables;
确认表是否新建成功。

查看配置

mysql> show master status \G;

3、从库操作

3.1 备份恢复

# mkdir /data/
# mv /tmp/backup_master.tar.gz /data/
# tar -xvzf backup_master.tar.gz
# cd /data/backup/
恢复备份文件至可用状态
# innobackupex --apply-log --user=root --password=ni --port=3606 /data/backup/
停止mysql服务
# service mysql stop
重命名原datadir目录
# mv /data/mysql /data/mysql_bak
恢复数据到datadir
# innobackupex  --copy-back  --user=root  --password=ni /data/backup/
170610 18:25:11 completed OK!
修改恢复后datadir目录权限
# chown -R mysql:mysql  /data/mysql/

3.2 参数配置

# vi /etc/my.cnf

#添加如下配置
#add for slave
server-id=230
log-slave-updates=1
replicate-same-server-id=0

log-bin=myslavebin
expire-logs-days=7
relay-log=myslave-relay-bin
replicate_do_db=wjf
#replicate-ignore-db=test

master_info_repository=TABLE  
relay_log_info_repository=TABLE 
relay_log_purge=1  
relay_log_recovery=1 

read-only=1

对于mysql 5.6,更新5张系统表的默认存储引擎为innodb。(若表当前引擎为innodb,可以不操作)

mysql> ues mysql;
mysql> show tables;
删除表
drop table if exists innodb_index_stats;
drop table if exists innodb_table_stats;
drop table if exists slave_master_info;
drop table if exists slave_relay_log_info;
drop table if exists slave_worker_info;
进入datadir,删除对应文件
cd /var/lib/mysql/mysql

rm innodb_index_stats.ibd
rm innodb_table_stats.ibd
rm slave_master_info.ibd
rm slave_relay_log_info.ibd
rm slave_worker_info.ibd

重建以上表
mysql> use mysql;
mysql> source /usr/share/mysql/mysql_system_tables.sql
mysql> show tables;
确认表是否新建成功。

重启服务器

<span style="color:#aa5500"># service mysql restart</span>

配置change master to

提取MASTER_LOG_FILE、MASTER_LOG_POS参数。
# cd /data/backup/
# more xtrabackup_binlog_info 
mysqlbin.000004 211678

配置

mysql>  CHANGE MASTER TO MASTER_HOST='172.16.81.90',
MASTER_USER='repl',
MASTER_PASSWORD='r1234',
MASTER_LOG_FILE='mysqlbin.000004',
MASTER_LOG_POS=211678;

3.3 启停从库

启动从库
mysql> start slave;
停止从库
mysql> stop slave;
从库状态确认
mysql> show slave status \G;


(额外部分)
从库的IO_thread、sql_thread可以单独启停。命令如下:
mysql> start slave io_thread;
mysql> start slave sql_thread;

4、主从切换

4.1 切换前状态检查

#----主库操作
锁定所有表为只读模式。
mysql> flush tables with read lock;
状态查看
mysql> show processlist;
传输线程显示Master has sent all binlog to slave; waiting for binlog to be updated

#----从库操作
mysql> show processlist;
显示Slave has read all relay log; waiting for the slave I/O thread to update it

4.2 切换

原从库(81.76)操作

#-----原从库(81.76)操作
mysql> stop slave;
mysql> reset master;
mysql> reset slave all;
#-----切换后检查
mysql> show master status\G;
#-----创建复制用户
mysql>  GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO repl@'172.16.81.90' IDENTIFIED BY 'replpwd';
mysql> flush privileges;
#-----注释掉read_only参数
# vi /etc/my.cnf
#read-only=1
#-------重启数据库
# service mysql restart

记录一下两个位置参数,用于主库变从库时的change master to设置。

MySQL 增加从库对主库的影响 mysql新建从库_sql

原主库(81.90)操作

#-------原主库(81.90)操作
mysql> CHANGE MASTER TO MASTER_HOST='172.16.81.76',
MASTER_USER='repl',
MASTER_PASSWORD='replpwd',
MASTER_LOG_FILE='mysqlbin.000001',
MASTER_LOG_POS=638;
#------启动从库
mysql> start slave;
#------查看从库状态
mysql> show slave status;
#------解锁表
mysql> unlock tables;

若需要设置从库只读,还需要修改/usr/my.cnf文件
添加参数后重启。
read-only=1