linux 下MySQL主从搭建

什么是主从复制

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数 据库上对这些日志进行重新执行,从而使从数据库和主数据库的数据保持一致。

主从复制的原理

  • MySql主库在事务提交时会把数据变更作为事件记录在二进制日志Binlog中;
  • 主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay
    Log中,之后从库根据中继日志重做数据变更操作,通过逻辑复制来达到主库和从库的数据一致性;
  • MySql通过三个线程来完成主从库间的数据复制,其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑着从库上;
  • 当在从库上启动复制时,首先创建I/O线程连接主库,主库随后创建Binlog
    Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志Relay
    Log中去,之后从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用,如下图所示。

linux 下MySQL主从搭建_第1张图片

一、安装mysql

1、检查是否安装

切换到root权限
	sudo -s

检查服务器状态:
检查是否安装mysql
	rpm -qa | grep mysql

如果你系统有安装,那可以选择进行卸载:
	* 普通删除模式
		rpm -e mysql
	* 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
		rpm -e --nodeps mysql

检查是否有卸载残余
	find -name mysql

如果有,可以根据显示的文件名将其删除
	rm -rf 残余文件名

查看当前Linux 默认的mysql版本
	yum list | grep mysql
	版本显示为mysql 5.1 故需要我们自行下载mysql5.7版本

2、 安装mysql

在 /usr/local/下创建mysql文件夹
	mkdir /usr/local/mysql
	cd /usr/local

将mysql设置为所有用户可写,方便上传压缩包
	chmod 777 mysql

通过XFtp上传压缩包(安装包 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz)
	tar -zxyz  mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
	mv mysql-5.7.28-linux-glibc2.12-x86_64/* .

检查是否是否安装成功
	rpm -qa |grep -i mysql

创建用户组和用户
	groupadd mysql

第一个mysql为用户组,第二个mysql为用户
	useradd -r -g mysql mysql
	或
	chown -R mysql:mysql /usr/local/mysql/*
	
为避免数据分散,统一在mysql文件内管理数据库
	cd /usr/local/mysql
	# mysql文件下若无data文件夹或者data权限不足 则命令失败
	./bin/mysqld --initialize 
	--datadir=/usr/local/mysql/data --user=mysql 
	--basedir=/usr/local/mysql
	#最后一行末尾将会有密码
	A temporary password is generated for root@localhost: wJhdRy9Yyg#/

将Mysql的服务脚本移至系统服务中
	cp -a ./support-files/mysql.server /etc/init.d/mysqld

创建软链接
	ln -s /usr/local/mysql/bin/mysql /usr/bin/

启动服务
	service mysqld start
  • 配置MySQL数据库
编辑配置文件
vi /etc/profile

在最下面添加
export PATH=$PATH:/usr/local/mysql/bin

生效配置
source /etc/profile

mysql自启动
	vim /etc/rc.local
	# 在下面添加
	service mysqld start

修改密码
	在mysql系统外,使用mysqladmin
	1 mysqladmin -u root -p password "修改后的密码"
	2 Enter password: 【输入原来的密码】

二、搭建mysql主从

1、主服务器搭建

准备两台服务器,一主一从

  • 在主服务器master的mysql配置my.cnf
#在[mysqld]下添加如下配置
# 服务的唯一编号
server-id=1
# 开启mysql binlog功能 slave会基于此log-bin来做replication
log-bin=master-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M

### 一主一从一备时加入
	## 二进制日志过期清理时间。默认值为0,表示不自动清理。
	# expire_logs_days=7
	# log-bin-index=master-bin.index
	# binlog记录内容的方式,记录被操作的每一行
	# 设置使用的二进制日志格式(mixed,statement,row)
	# binlog_format=ROW
	# 减少记录日志的内容,只记录受影响的列
	#binlog_row_image=minimal
	# 指定需要复制的数据库名
	# 如果没有指定会监听复制所有的库,新建库操作也会复制,反之只监听复制指定的库
	# binlog-do-db= db_name
	# 指定不需要同步的数据库名称
	# binlog_ignore_db=mysql 
	# binlog_ignore_db=information_schema

  • 授权
# 需要给slave配置一个用户/密码的权限
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'slave数据库的IP地址' IDENTIFIED BY '密码';

# 例如:
# 只读赋权
# GRANT SELECT ON *.* TO 'user'@'ip' IDENTIFIED BY 'pwd';
# 从权限 赋权
# GRANT REPLICATION SLAVE ON *.* TO 'user'@'ip' IDENTIFIED BY 'pwd';

# 刷新权限
FLUSH PRIVILEGES

重启mysql
service mysql restart;
  • 查看主服务器状态
# 注意!更改配置或者数据库重启,主库日志的Position会改变,从库需要重新配置
mysql -u root -p

# 确保主从库数据库结构一致
# 查看server-id 是否和配置一致,从服务器id需要大于主服务器id
show variables like '%server_id%'

# 将下列结果中 File和 Position 记录后交给从服务器搭建人员
show master status\G;

2、从服务器搭建

  • 在从服务器slave下找到mysql配置文件my.cnf
# 在[mysqld]下添加如下配置
log-bin=relay-bin
#先全局查找注释原来的server-id
server-id=2
#保存配置进行重启查看server-id
show variables like '%server_id%';
  • 进入slave的mysql命令行 执行
CHANGE MASTER TO
#MASTER_HOST填主库所在的服务器IP
MASTER_HOST='master所在服务器的IP',
MASTER_USER='master授权的账号',
MASTER_PASSWORD='master授权的密码',
#MASTER_LOG_FILE填主库中FILE的值
MASTER_LOG_FILE='master的日志文件名',
#MASTER_LOG_POS填主库中的Position的值
MASTER_LOG_POS='master的日志所在位置';

主从复制命令参数说明:

  • master_host:主数据库的IP地址;
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒
  • 执行服务 并查看状态
# 关闭防火墙或者打开端口权限
# 查看server-id 是否和配置一致,从服务器id需要大于主服务器id
show variables like '%server_id%'
start slave;
show slave status\G;

# 请确认 Master_Log_File = 主服务器的File, Read_Master_Log_Pos = 主服务器的Position
# 请确认 Slave_IO_Running = Slave_SQL_Running = yes

# 如果Slave_SQL_Running = No,说明从库执行了错误操作,请进行回滚:
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;

  • 注意
注意,为了避免主键id冲突,需要加入如下配置
主服务器1 在/etc/my.cnf下[mysqld]加入如下语句,使得新增id全为奇数
# 自增id起始值
auto_increment_offset=1
# 每次自增数字
auto_increment_increment=2
主服务器2 在/etc/my.cnf下[mysqld]加入如下语句,使得新增id全为偶数
# 自增id起始值
auto_increment_offset=2
# 每次自增数字
auto_increment_increment=2

你可能感兴趣的:(#,mysql)