MySQL单机及主从搭建


MySQL单机搭建

MySQL下载

这里使用的版本是mysql-8.0.20-linux-glibc2.12-x86_64

MySQL下载有多种方式,可以选择官网也可以选择镜像

安装之前卸载mariadb

## 查看mariadb信息
rpm -qa | grep mariadb
## 卸载
sudo rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps
## 再次查看
rpm -qa | grep mariadb

下载安装包

## 下载
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
## 解压
tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz  -C /
## 软链接
ln -s /mysql-8.0.20-linux-glibc2.12-x86_64/ /mysql

新建一个存放数据的文件夹data

cd /mysql
## 创建data目录
mkdir data

创建mysql用户组和 mysql 用户

groupadd mysql
useradd -r -g mysql mysql
chown -R mysql .

初始化数据库

mkdir mysql_install_db
chmod 777 ./mysql_install_db
bin/mysqld --initialize --user=mysql --basedir=/mysql --datadir=/mysql/data

执行完后记住初始密码

配置文件

vim  /etc/my.cnf

my.cnf

[mysqld]
   # 设置连接端口
   port = 3306
   # 设置mysql的安装目录
   basedir = /mysql
   # 设置mysql数据库的数据的存放目录
   datadir = /mysql/data
   socket = /mysql/mysql.sock
   # 允许最大连接数
   max_connections=200
   # 允许连接失败的次数。
   max_connect_errors=10
   # 服务端使用的字符集默认为UTF8
   character-set-server=utf8
   # 创建新表时将使用的默认存储引擎
   default-storage-engine=INNODB
   sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
   socket = /mysql/mysql.sock
   default-character-set=utf8

建立系统服务

cp /mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
## 检查系统服务是否有mysqld服务
chkconfig  --list mysqld

配置环境变量

vim /etc/profile

## 刷新环境变量生效
source /etc/profile

启动服务

service mysql start
## 用之前的初始密码登录
mysql -uroot -p

连接mysql后一些命令

/* 修改密码 */
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
/* 远程登录 */
use mysql;
update user set host='%' where user='root' limit 1;
flush privileges;

MySQL主从搭建

主从搭建主要是改写配置

首先先于上面的方式搭建2台Mysql服务

192.168.186.131–主机器

192.168.186.132–从机器

修改主服务配置

/etc/my.cnf的[mysqld]下面增加以下配置

#服务节点的唯一标识。需要给集群中的每个服务分配一个单独的ID。
server-id=42
#开启binlog
#打开Binlog日志记录,并指定文件名
log_bin=master-bin
#Binlog日志文件
log_bin-index=master-bin.index

重新启动,连接客户端,给root用户分配一个replication slave的权限

mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
#查看主节点同步状态:
show master status;

结果中的File和Position记录的是当前日志的binlog文件以及文件中的索引。
而后面的Binlog_Do_DB和Binlog_Ignore_DB这两个字段是表示需要记录binlog文件的库以及不需要记录binlog文件的库。my.cnf配置指定

修改从服务配置

/etc/my.cnf的[mysqld]下面增加以下配置

#主库和从库需要不一致
server-id=43
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1

重新启动,连接客户端,执行分配主节点命令

MASTER_LOG_FILE和MASTER_LOG_POS必须与主服务中查到的保持一致

CHANGE MASTER TO
MASTER_HOST='192.168.186.131',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=535,
GET_MASTER_PUBLIC_KEY=1;

还是在客户端执行

#开启slave
start slave;
#查看主从同步状态
show slave status \G;

测试主从搭建是否成功

主节点创建一个数据库并插入一条数据

create database testMasterSlave;

use testMasterSlave;

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into t_user(name) values('aa');

成功创建!!!!

其他

这时候主从数据时全部同步,如果我们只想要一部分数据库同步该怎么配呢

修改主服务/etc/my.cnf

#需要同步的二进制数据库名
binlog-do-db=masterdemo
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys

修改从服务/etc/my.cnf

#如果salve库名称与master库名相同,使用本配置
replicate-do-db = masterdemo
#如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = masterdemo -> masterdemo01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=masterdemo01.t_dict
replicate-wild-do-table=masterdemo01.t_num

配置完成了之后,在show master status指令中,就可以看到Binlog_Do_DB和Binlog_Ignore_DB两个参数的作用了

注意点

数据只能从主服务同步到从服务,不能从从服务同步到主服务。为了保证数据一致,通常会需要保证数据只在主服务上写,而从服务只进行数据读取。mysql主从本身是无法提供读写分离的服务的,需要由业务自己来实现


文章作者: dm
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dm !
评论
 上一篇
Netty线程模型初探和Netty的常见问题 Netty线程模型初探和Netty的常见问题
前言Netty是现在比较流行的NIO框架。它的健壮性、可扩展性、性能方面都得到了很多项目的验证。 要想了解Netty,首先得了解IO模型。Java支持三种IO模型分别是BIO,NIO,AIO。 BIO:同步阻塞模型,连接一个请求就会有一个
2022-06-20
下一篇 
SpringBoot自动装配原理以及自定义starter SpringBoot自动装配原理以及自定义starter
前言大家都知道一个Spring项目的搭建是及其繁琐的,需要写很多xml配置文件,集成一个框架进Spring都需要增加一个xml配置文件。即使我们可以使用javaConfig的方式减少xml的配置,其实也是没有更加方便,也是要建立很多的con
2022-05-25
  目录