Fork me on GitHub

mysql一主两从

首先是安装mysql

下载

官网:https://www.mysql.com/

二、安装

  1. 创建mysql安装包放置目录并上传安装包
  2. 使用xshell工具上传下载的mysql安装包到software目录
  3. 解压安装包

tar -xzvf /data/software/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz

  1. 移动并修改文件名

  1. 创建数据仓库目录 mkdir /usr/local/mysql5.7
  2. 新建mysql用户和用户组以及目录

groupadd mysql

useradd -r -s /sbin/nologin -g mysql mysql -d /usr/local/mysql5.7

groups mysql     #查询是否创建成功

  1. 赋予权限,改变目录所有者

cd /usr/local/mysql5.7

chown -R mysql:mysql /data/mysql

  1. 初始化MySQL
  2. ./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

  1. 修改系统配置文件

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

  1. 登录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,则说明主从配置成功!

显式如下的情况,就是不正确的。可能错误的原因有:

  1. 网络不通
  2. 账户密码错误
  3. 防火墙
  4. mysql配置文件问题
  5. 连接服务器时语法
  6. 主服务器mysql权限

posted @ 2023-07-11 09:55  风をした  阅读(89)  评论(0)    收藏  举报