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 'repl_1234';
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="niwodai#2017" --socket=/var/lib/mysql/mysql.sock /data/backup/ --no-timestamp 单库备份 # innobackupex --user=root --password="niwodai#2017" --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=niwodai#2017 --port=3606 /data/backup/ 停止mysql服务 # service mysql stop 重命名原datadir目录 # mv /data/mysql /data/mysql_bak 恢复数据到datadir # innobackupex --copy-back --user=root --password=niwodai#2017 /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; 确认表是否新建成功。 重启服务器 # service mysql restart 配置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='repl_1234', 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 statusG; #-----创建复制用户 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设置。 原主库(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