MySQL主从复制部署全流程

发布时间 2023-08-28 00:04:20作者: 似懂非懂视为不懂

MySQL主从复制部署全流程

事前准备

内容 系统软件 IP地址 备注
操作系统 CentOS Linux release 7.8.2003 (Core) 192.168.147.151
操作系统 CentOS Linux release 7.8.2003 (Core) 192.168.147.152
JDK jdk-8u381-linux-x64.tar.gz 192.168.147.151
JDK jdk-8u381-linux-x64.tar.gz 192.168.147.152
数据库 mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar 192.168.147.151
数据库 mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar 192.168.147.152

部署须知

  1. 需要用到linux的root账号,内容中有很多涉及到超管的权限
  2. JDK的下载地址:https://www.oracle.com/java/technologies/downloads/#java8
  3. MySQL的下载地址【留意操作系统的版本选择】:https://downloads.mysql.com/archives/community/
  4. 为了便于管理统一将jdk和mysql数据的安装包上传至/opt/soft目录下。
  5. 关闭服务器的防火墙避免主从一直处于connecting的状态,也可以开启防火墙的前提开启3306的端口访问【待验证】

虚拟机环境的安装部署(略)

JDK的安装部署(以151主机为例,152重复其步骤)

#以下步骤皆在192.168.147.151中完成,192.168.147.152复制该步骤
#创建jdk的安装目录
mkdir -p /usr/local/java/
#解压文件到该/usr/local/java/目录下
cd /opt/soft
tar xvf jdk-8u381-linux-x64.tar.gz -C /usr/local/java/

#修改jdk的环境的变量
vim /etc/profile

#放至在/etc/profile文件的末尾即可,wq保存退出
export JAVA_HOME=/usr/local/java/jdk1.8.0_381
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

#执行以下使其环境变量生效
source /etc/profile

#校验是否安装成功,出现安装jdk的版本号即为成功
java -version

MySQL数据的安装部署(以151主机为例,152重复其步骤)

rpm包的安装

#为了规避操作系统mariadb的干扰,安装mysql前需要将其卸载
rpm -qa | grep mariadb
#上一步输出的内容为mariadb-libs-5.5.65-1.el7.x86_64,使用以下命令卸载即可
rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64

#解压mysql安装包
cd /opt/soft
tar xvf mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar

#上一步会有非常多的rpm包被解压,现依次按照下述步骤进行部署
#注:如对此比较混乱的话,随意点击安装,过程会有提示告知哪个包需要优先被安装
#公共包
rpm -ivh mysql-community-common-8.0.32-1.el7.x86_64.rpm
#客户端插件
rpm -ivh mysql-community-client-plugins-8.0.32-1.el7.x86_64.rpm
#lib包
rpm -ivh mysql-community-libs-8.0.32-1.el7.x86_64.rpm
#mysql客户端
rpm -ivh mysql-community-client-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.32-1.el7.x86_64.rpm
#mysql服务端
rpm -ivh mysql-community-server-8.0.32-1.el7.x86_64.rpm

my.cnf

安装完毕后会发现/etc/目录下面有生成一个my.cnf的文件,该文件可以进行一些参数配置。

【注:由于版本的不同不一定都会有my.cnf这个文件,这里不用纠结,手动创建一样可以被mysql识别】

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

#指定数据目录文件
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

#mysql的一些错误日志信息将打印在这儿
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

创建mysql的用户和组

#目前创建好mysql之后,切换用户是无问题。直到数据库初始化完毕,该账号将会被禁止登录。详情可查看/etc/passwd文件。
#mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
groupadd mysql
useradd -g mysql mysql

初始化数据库

#初始化数据库,该步骤完成之后/var/lib/mysql这个目录会生成很多的文件是mysql的数据文件。 如果需要重新初始化的话,删除该目录下的所有文件,再执行如下语句即可
mysqld --initialize --console

#该步很重要也是非常容易被遗忘的步骤,改变数据目录中所有文件属组和属主
chown -R mysql:mysql /var/lib/mysql/

#开启数据库systemctl start mysqld【开启】systemctl stop mysqld【关闭】systemctl restart mysqld【重启】
systemctl start mysqld

#获取数据库初始化后的密码
cat /var/log/mysqld.log  | grep localhost

登录数据库

#登录数据库,并键入上面获取到的密码
mysql -uroot -p

修改密码复杂度

-- 该步骤视情况而定,因为在演示过程中我会使用到简单密码
set global validate_password_policy=LOW;
set global validate_password_length=6;

-- 验证是否修改成功
SHOW VARIABLES LIKE 'validate_password%';

修改数据库账号密码并配置可以远程管理

#修改登录密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '111111';
#切换到mysql数据库
use mysql;
#开启数据库远程管理
update user set Host='%' where User='root';
flush privileges;

MySQL主从配置

MySQL主节点的配置(151)

配置my.cnf文件

cat  >> /etc/my.cnf <<EOF 
#服务器 id,随意,但要唯一
server-id = 1  
#二进制文件存放路径
log-bin = mysql-bin 
#参数用于排除自带的数据库。  
binlog-ignore-db = mysql 
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#二进制日志格式,建议使用ROW格式以获得更好的兼容性和可靠性。
binlog-format = ROW 

EOF

#重启mysql服务
systemctl restart mysqld

创建复制账号权限

#登录数据库
mysql -uroot -p111111

use mysql;
#创建用户
CREATE USER 'db_sync'@'%' IDENTIFIED BY '111111';
#授权账号复制权限
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%';
#刷新配置
FLUSH PRIVILEGES;

#在主服务器上执行以下命令获取当前二进制日志文件的名称和位置
SHOW MASTER STATUS;

输出的内容项:记住File和Position这两个值后面要用

+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000001 |      157 |              | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+

MySQL主节点的配置(152)

配置my.cnf文件

cat >>/etc/my.cnf <<EOF

server-id = 2
#中继日志文件的名称,用于从主服务器接收二进制日志事件。
relay-log = mysql-relay-bin 
#从服务器的二进制日志文件的名称。
log_bin = mysql-bin 
#不同步相关的库
replicate-ignore-db = mysql 
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema

EOF

#重启mysql服务
systemctl restart mysqld

进入数据库之后,修改主从配置信息

#登录数据库
mysql -uroot -p111111

#关闭同步
STOP SLAVE;

CHANGE MASTER TO
 MASTER_HOST = '192.168.147.151',
 MASTER_USER = 'db_sync',
 MASTER_PASSWORD = '111111',
 #主服务器数据库上的file值(不能有空格)
 MASTER_LOG_FILE = 'mysql-bin.000001',
 #主服务器数据库的Position值
 MASTER_LOG_POS = 157,
 get_master_public_key=1;
 
#开启同步
START SLAVE;

查看同步状态,校验是否配置成功

在从服务器上面,查看同步状态

#在mysql命令行中执行【152的数据库】
SHOW SLAVE STATUS\G

#输出信息中包含这两个Yes即为成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes