Mysql主从复制
Linux下面安装主从复制
参考: https://blog.csdn.net/wangxy_job/article/details/106313553
数据库读写分离架构
数据库主从复制原理
主从复制主要是从服务器监控主服务器的binlog,发现有add/update/delete等进行自我更新
- 主服务器开启binlog
记录增删改操作 - 从监控主binlog日志变化
更新自己的数据
主从配置
1.创建两个mysql数据库服务,启动两个Mysql服务
购买两份百度云服务器
host1 : 106.12.57.160(主)
host2 : 106.12.11.171(从)
分别安装mysql服务
2.主从服务器基本配置
(1)主服务器配置
[mysqld]
#设置服务id,主从不能一样
server-id=1
#开启binlog日志
log-bin=/opt/logs/mysql/binlogs/mysql-bin
#记录日志模式
binlog_format=mixed
#设置binlog过期清理时间
expire_logs_days=7
#设置不需要同步的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
#设置需要同步的数据库
binlog-do-db=web_book
(2)从服务器配置
[mysqld]
#设置服务id
server-id=2
#开启binlog日志
log-bin=/opt/logs/mysql/binlogs/mysql-bin
#记录日志模式
binlog_format=mixed
#设置不需要同步的数据库
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
#设置需要同步的数据库
replicate_wild_do_table=web_book.%
3.自定义binlog添加权限
#如果自定义binlog目录需要指定权限
chown -R mysql:mysql /opt/logs/mysql/binlogs
#重启mysql
systemctl restart mysqld
4.查询验证
#查询是否配置成功
show master status;
#查询server_id
show variables like '%server_id%';
#查询日志记录使用的模式
show global variables like "%binlog_format%";
5.创建主从复制账号
#登录主库
mysql -uroot -p
#创建主从复制专用账号
grant replication slave on *.* to 'db_sync'@'%' identified by 'db_sync_123';
#刷新权限
flush privileges;
6.主从数据同步配置
切换到从库
#先停止同步
stop slave;
#修改从库指向主库,使用主库记录的binlog日志名mysql-bin.000001
change master to
master_host='106.12.57.160',
master_user='db_sync',
master_password='db_sync_123',
master_log_file='mysql-bin.000001',
master_log_pos=592
#启动同步
start slave;
7.查看主从库状态
#查询主库状态(切换主库)
show master status;
#查询从库状态(切换从库)
show slave status\G;
主库状态:
从库状态:
注意:当Slave_IO_Running和Slave_SQL_Running都为Yes说明同步成功
FAQ
1.重启mysql报错?
执行:systemctl restart mysqld.service
报错:mysqld: File '/opt/logs/mysql-bin.index' not found (Errcode: 13 - Permission denied)
问题解析:
由于yum安装权限属于mysql用户
解决:chown -R mysql:mysql /opt/logs/mysql-bin
2.Check that you do not already have another mysqld process using the same Inn
原因:存在多个运行的mysql进程
解决:ps -ef|grep mysql
kill -9 pid
3.Could not open unix socket lock file /var/lib/mysql/mysql.sock.lock.
原因:/var/lib/mysql存在锁文件
解决:cd /var/lib/mysql
rm -f mysql.sock.lock
4.Your password does not satisfy the current policy requirements.
原因:设置主从复制账号的时候密码太弱
解决:修改密码强弱规定
set global validate_password_policy=LOW;
set global validate_password_length=11;
5.如果之前已经有从库指向主库的,需要先清除
stop slave io_thread for channel '';
reset slave all;
6.从库同步失败:Slave_SQL_Running:No
方法一、跳过错误行
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;
方法二、手动同步数据
先把数据手动同步
#进入master
show master status;
记录下position = [newPosition]
#进入slave
stop slave;
change master to...master_log_pos=[newPosition]
start slave;
7.从库同步失败?
#replicate-ignore-db = test
#replicate-do-db = abc
以上方式会出现问题,建议使用replicate_wild_*来设置同步