Mysql主从配置

271 阅读2分钟
MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一,但比较适合在新实例中实施,对于较大的数据库则存在停机等不可接受的问题,所以该方式并非理想的选择。使用innobackupex 则可以快速轻松的构建或修复mysql主从架构,该方式的好处是对主库无需备份期间导致的相关性能压力及锁表的问题

配置环境

主服务器:
IP地址:    192.168.198.150
Mysql版本: 5.5.64-MariaDB
数据库引擎:InnoDB(通过show engines;查看)
从服务器:
IP地址:    192.168.198.151
Mysql版本: 5.5.64-MariaDB
数据库引擎:InnoDB(通过show engines;查看)

主库操作

保证两个数据库中的数据表一致
编辑主配置文件my.cnf
[mysqld]
# 设定serverid,注意此ID唯一
server-id=1
# 自动清除7天前的logbin文件
expire_logs_days = 7
# 启用二进制文件
log-bin=mysql-bin

# 检查数据库状态
show global variables like 'server_id';
show global variables like 'log_bin';

备份与恢复(具体安装xtrabackup教程暂不提供)
通常一般都直接使用innobackupex,因为它能同时备份InnoDB和MyISAM引擎的表
重点关注Slave_IO_Running和Slave_SQL_Runningd的状态是否为YES
# 备份
innobackupex --socket=/var/lib/mysql/mysql.sock --user=root --password=111111 --defaults-files=/etc/my.cnf ./backup/
# 保持事务一致性
innobackupex --socket=/var/lib/mysql/mysql.sock --user=root --password=111111 --defaults-files=/etc/my.cnf --apply-log ./backup/2020-04-03_21-04-24/
# 传输
scp -r ./backup/2020-04-03_21-04-24/ 192.168.198.151:/tmp/backup/
# 查询当前mysql账号
SELECT DISTINCT concat('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
# 授权同步账号
grant replication slave on *.* to 'master'@'192.168.198.151' identified by '000000';
flush privileges;

从库操作

编辑主配置文件
[mysqld]
# 设定serverid
server_id=100

检查mysql状态
show global variables like 'server_id';

# 恢复
innobackupex --socket=/var/lib/mysql/mysql.sock --user=root --password=111111 --defaults-files=/etc/my.cnf --copy-back ./backup/2020-04-03_21-04-24/
# 还原权限
chown -R mysql.mysql /var/lib/mysql
# 开启同步
cat /tmp/backup/2020-04-03_21-04-24/xtrabackup_binlog_info
mysql-bin.000001        1192

CHANGE MASTER TO
MASTER_HOST='192.168.198.150',
MASTER_USER='master',
MASTER_PASSWORD='000000',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1192;

# 开启主从同步
start slave;

# 查看从库状态
show slave status\G;
--------------------------
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
--------------------------

Mysql主从搭建成功

Mysql主从切换

在原从库上操作
[mysqld]
# 开启二进制文件
log-bin=mysql-bin

停止IO_THREAD线程
stop slave IO_THREAD;
show processlist;

# 切换为主库
stop slave;
reset master;
reset slave all;
show master status\G;
mysql-bin.000001                245

# 激活账户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
grant replication slave on *.* to 'master'@'192.168.198.150' identified by '000000';
flush privileges;

在原主库上操作
reset master;
reset slave all;

CHANGE MASTER TO
MASTER_HOST='192.168.198.151',
MASTER_USER='master',
MASTER_PASSWORD='000000',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;

# 检测主库
show processlist;
show master status\G;

# 启用从库
start slave;

常见问题

Slave_SQL_Running:No

#一般是事务回滚造成的
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;