MySQL主从复制部署全流程
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 | 从 |
部署须知
- 需要用到linux的root账号,内容中有很多涉及到超管的权限
- JDK的下载地址:https://www.oracle.com/java/technologies/downloads/#java8
- MySQL的下载地址【留意操作系统的版本选择】:https://downloads.mysql.com/archives/community/
- 为了便于管理统一将jdk和mysql数据的安装包上传至/opt/soft目录下。
- 关闭服务器的防火墙避免主从一直处于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