mysql一主两从
首先是安装mysql
下载
二、安装
- 创建mysql安装包放置目录并上传安装包
- 使用xshell工具上传下载的mysql安装包到software目录
- 解压安装包
tar -xzvf /data/software/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
- 移动并修改文件名
- 创建数据仓库目录 mkdir /usr/local/mysql5.7
- 新建mysql用户和用户组以及目录
groupadd mysql
useradd -r -s /sbin/nologin -g mysql mysql -d /usr/local/mysql5.7
groups mysql #查询是否创建成功
- 赋予权限,改变目录所有者
cd /usr/local/mysql5.7
chown -R mysql:mysql /data/mysql
- 初始化MySQL
- ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql5.7/data --basedir=/usr/local/mysql5.7
此处需要注意记录生成的临时密码,如上文结尾处的:V39Og4fzms-
#bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql5.7/data
- 修改系统配置文件
cp mysql.server /etc/init.d/mysql
vim /etc/my.cnf
输入一下代码
#[可选]设置binlog格式
binlog_format=STATEMENT
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=binlog
# 作用是禁止域名解析:在mysql的授权表中就不能使用主机名了,只能使用IP
skip-name-resolve
# 设置3306端口
port = 3306
#设置远程访问ip
bind-address=0.0.0.0
# 设置mysql的安装目录
basedir=/usr/local/mysql5.7
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql5.7/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#设置查询操作等不区分大小写
lower_case_table_names=1
# vim /etc/init.d/mysql
增加以下内容:
basedir=/usr/local/mysql
datadir=/data/mysql
启动mysql
/usr/local/mysql/bin
service mysql start
- 登录MySQL并修改root密码
1)# mysql -hlocalhost -uroot -p
--如果出现:-bash: mysql: command not found
--执行:# ln -s /usr/local/mysql/bin/mysql /usr/bin --没有出现就不用执行
--输入第6步生成的临时密码
登录mysql成功页面
2)修改root密码
set global validate_password_policy=0; #修改validate_password_policy参数的值
set global validate_password_length=1; #修改密码长度参数
alter user 'root'@'%' identified by '123456'; #设置root账号的密码
grant all privileges on *.* to 'root'@'%' identified by '123456'; #设置所有远程都可以连接数据库
flush privileges; #刷新mysql的系统权限
搭建一主两从
一、准备工作
1 、准备 3 台CentOS 虚拟机
2 、每台虚拟机上需要安装好MySQL (可以是MySQL8.0 )
说明:前面我们讲过如何克隆一台CentOS。大家可以在一台CentOS上安装好MySQL,进而通过克隆的方 式复制出 1 台包含MySQL的虚拟机。
注意:克隆的方式需要修改新克隆出来主机的:① MAC地址 ② hostname ③ IP 地址 ④ UUID。
此外,克隆的方式生成的虚拟机(包含MySQL Server),则克隆的虚拟机MySQL Server的UUID相同,必 须修改,否则在有些场景会报错。比如:show slave status\G,报如下的错误:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have
equal MySQL server UUIDs; these UUIDs must be different for replication to work.
修改MySQL Server 的UUID方式:
vim /usr/local/mysql5.7/data/auto.cnf
systemctl restart mysqld
二、主机配置文件
#[必须]主服务器唯一ID
server-id= 1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=atguigu-bin
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
#[必须]主服务器唯一ID
server-id= 2
#[可选]设置binlog格式
binlog_format=STATEMENT
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
relay-log=mysql-relay
# 作用是禁止域名解析:在mysql的授权表中就不能使用主机名了,只能使用IP
skip-name-resolve
# 设置3306端口
port = 3306
#设置远程访问ip
bind-address=0.0.0.0
# 设置mysql的安装目录
basedir=/usr/local/mysql5.7
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql5.7/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#设置查询操作等不区分大小写
lower_case_table_names=1
binlog格式设置:
格式 1 :STATEMENT模式(基于SQL语句的复制(statement-based replication, SBR))
binlog_format=STATEMENT
每一条会修改数据的sql语句会记录到binlog中。这是默认的binlog格式。
- SBR 的优点:
- 历史悠久,技术成熟
- 不需要记录每一行的变化,减少了binlog日志量,文件较小
- binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
- binlog可以用于实时的还原,而不仅仅用于复制
- 主从版本可以不一样,从服务器版本可以比主服务器版本高
- SBR 的缺点:
- 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
- 使用以下函数的语句也无法被复制:LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非启动时启用了 --sysdate-is-now 选项)
- INSERT ... SELECT 会产生比 RBR 更多的行级锁
- 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
- 对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
- 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
- 执行复杂语句如果出错的话,会消耗更多资源
- 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
② ROW模式(基于行的复制(row-based replication, RBR))
binlog_format=ROW
5.1.5版本的MySQL才开始支持,不记录每条sql语句的上下文信息,仅记录哪条数据被修改了,修改成什么样了。
- RBR 的优点:
- 任何情况都可以被复制,这对复制来说是最安全可靠的。(比如:不会出现某些特定情况下的存储过程、function、trigger的调用和触发无法被正确复制的问题)
- 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
- 复制以下几种语句时的行锁更少:INSERT ... SELECT、包含 AUTO_INCREMENT 字段的 INSERT、没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
- 执行 INSERT,UPDATE,DELETE 语句时锁更少
- 从服务器上采用多线程来执行复制成为可能
- RBR 的缺点:
- binlog 大了很多
- 复杂的回滚时 binlog 中会包含大量的数据
- 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
- 无法从 binlog 中看到都复制了些什么语句
③ MIXED模式(混合模式复制(mixed-based replication, MBR))
binlog_format=MIXED
从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog。如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog。
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
三、 从机配置文件
要求主从所有配置项都配置在my.cnf的[mysqld]栏位下,且都是小写字母。
必选
#[必须]从服务器唯一ID
server-id= 2
可选
#[可选]启用中继日志
relay-log=mysql-relay
重启后台mysql服务,使配置生效。
注意:主从机都关闭防火墙
service iptables stop #CentOS 6
systemctl stop firewalld.service #CentOS 7
四、 主机:建立账户并授权
#在主机MySQL里执行授权主从复制的命令
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'从机器数据库IP' IDENTIFIED BY 'abc123';
#5.5,5.
注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
#此语句必须执行。否则见下面。
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
注意:在从机执行show slave status\G时报错:
Last_IO_Error: error connecting to master 'slave1@192.168.1.150:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
查询Master的状态,并记录下File和Position的值。
show master status;
- 记录下File和Position的值
注意:执行完此步骤后 不要再操作主服务器MySQL ,防止主服务器状态值变化。
五、从机:配置需要复制的主机
步骤 1 : 从机上复制主机的命令
CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
举例:
CHANGE MASTER TO
MASTER_HOST='192.168.221.132',
MASTER_USER='slave1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=808;
步骤 2 :
#启动slave同步
START SLAVE;
如果报错:
可以执行如下操作,删除之前的relay_log信息。然后重新执行 CHANGE MASTER TO ...语句即可。
mysql> reset slave; #删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件
接着,查看同步状态:
SHOW SLAVE STATUS\G;
上面两个参数都是Yes,则说明主从配置成功!
显式如下的情况,就是不正确的。可能错误的原因有:
- 网络不通
- 账户密码错误
- 防火墙
- mysql配置文件问题
- 连接服务器时语法
- 主服务器mysql权限

浙公网安备 33010602011771号