mysql离线安装(单节点到主从搭建),docker搭建MySQL集群

一、安装步骤:
离线版安装:
– rpm包安装 –
卸载系统自带的Mariadb

查系统mariadb文件名
rpm -qa | grep mariadb
删除mariadb文件
rpm -e --nodeps 文件名

卸载系统自带的老版本MySQL

rpm -qa | grep mysql
rpm -e --nodeps 文件名

后续补全…

– tar.gz包安装 –

https://dev.mysql.com/downloads/mysql/
mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz

卸载旧的MySQL
查询MySQL的安装文件:

find / -name mysql

把查询到的删除掉
rm -rf

删除MySQL的配置文件

删除/etc/my.cnf文件
删除/etc/init.d/下跟MySQL有关的全部文件,通常包括mysql文件或者mysqld文件

删除MySQL用户和用户组

userdel mysql

至此,卸载完成!

安装mysql

[root@www ~]# cd /usr/local/env/mysql/
[root@www mysql]# tar -zxvf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz  //解压
[root@www mysql]# mv mysql-5.7.21-linux-glibc2.12-x86_64   mysql    //重命名
[root@www mysql]# cd mysql    

添加用户组mysql和用户mysql,并将其添加到mysql用户组中

[root@www mysql]# groupadd mysql
[root@www mysql]# useradd -r -g mysql mysql

注:
useradd -r参数表示mysql用户是系统用户,不可用于登录系统。
useradd -g参数表示把mysql用户添加到mysql用户组中。

查看用户以及用户组信息:

cat /etc/passwd		# 查看所有用户信息
cat /etc/group		# 查看所有组信息
groups 用户名		# 查看当前用户所在组,以及组内其它成员的信息

检查是否安装了 libaio

[root@www mysql]# rpm -qa | grep libaio

如果没有安装,使用如下命令安装(在线版安装)

[root@www mysql]# yum search libaio
[root@www mysql]# yum install libaio
 

离线版安装
安装mysql之前检查下libaio.so.1的位置

# whereis libaio.so.1
libaio.so: /usr/lib64/libaio.so.1

**

http://www.rpmfind.net/linux/rpm2html/search.php?query=libaio(x86-64) 重要网址

**
在这里插入图片描述
安装libaio

rpm  -ivh  libaio-0.3.112-1.el8.x86_64.rpm   --nodeps --force   //强制  不需要依赖 

配置my.cnf文件

[root@www mysql]# touch /etc/my.cnf

内容如下:

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
# default-character-set=utf8mb4

socket=/usr/local/env/mysql/mysql/lib/mysql/mysql.sock

[mysqld]
# 禁用DNS解析,一般不用
#skip-name-resolve

# 设置3306端口
port=3306

# 这里的socket要和[mysql]中的socket位置一致
socket=/usr/local/env/mysql/mysql/lib/mysql/mysql.sock

# 设置mysql的安装目录
basedir=/usr/local/env/mysql/mysql

# 设置mysql数据库的数据的存放目录
datadir=/usr/local/env/mysql/mysql/data

# 允许最大连接数
max_connections=200

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
collation-server=utf8_bin
# 如果使用utf8mb4字符集就做如下两个配置
# character-set-server=utf8mb4
# collation-server=utf8mb4_unicode_ci

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 1表示数据库中的表名忽略大小写,0表示严格区分大小写
# lower_case_table_names=1

max_allowed_packet=16M

# 慢查询设置
# 是指执行超过多久的sql会被log下来,这里是2秒
# long_query_time =2
# 将查询返回较慢的语句进行记录
# log-slow-queries=/usr/local/env/mysql/mysql/logs/slow_query.log
# 就是字面意思,log下来没有使用索引的query
# log-queries-not-using-indexes=/usr/local/env/mysql/mysql/logs/no_use_index.log
# 对所有执行语句进行记录
# log=/usr/local/env/mysql/mysql/logs/mylog.log

[mysqld_safe]
log-error=/usr/local/env/mysql/mysql/logs/error.log
pid-file=/usr/local/env/mysql/mysql/data/mysqld.pid

创建mysql、data、logs文件夹

[root@www mysql]# mkdir /usr/local/env/mysql/mysql/lib/mysql
[root@www mysql]# mkdir /usr/local/env/mysql/mysql/logs
[root@www mysql]# mkdir /usr/local/env/mysql/mysql/data

创建错误日志

[root@www mysql]# cd /usr/local/env/mysql/mysql/
[root@www mysql]# touch logs/error.log

将mysql目录的所属用户和组改为mysql

[root@www mysql]# chown -R mysql.mysql /usr/local/env/mysql/mysql
或
[root@www mysql]# chown -R mysql:mysql /usr/local/env/mysql/mysql
 

注:
-R 表示对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
mysql.mysql 和 mysql:mysql 这两种写法是一样的,都是将后面指定的目录修改为mysql用户和组

初始化 mysqld 生成初始化密码

[root@www ~]# cd /usr/local/env/mysql/mysql
[root@www mysql]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/env/mysql/mysql --datadir=/usr/local/env/mysql/mysql/data 

此时,控制台打印如下:
在这里插入图片描述
二、MySQL的配置:
2.1、设置开机启动
2.1.1、复制mysql.server脚本到资源目录,并赋予执行权限:

[root@www mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@www mysql]# chmod +x /etc/rc.d/init.d/mysqld

修改 mysqld 文件,一定要修改:

[root@www mysql]# vim /etc/init.d/mysqld

因为在执行 systemctl start mysqld 的时候,执行参数 start 里面运行的是 $bindir 目录下的 /mysqld_safe 程序,而 mysqld_safe 程序是用来开启MySQL守护进程的程序,由于没有给它分配用户,所以 mysqld_safe 目前还是没有权限的状态,在守护进程没有权限的情况下直接启动MySQL必然会报错,所以要给 mysqld_safe 分配用户,用以授权。
在 $bindir/mysqld_safe 后面加上 --user=mysql ,MySQL目录的权限是什么用户就加什么用户,如果是 root 用户,就改成 --user=root ,修改后的文件如下:
在这里插入图片描述

将 mysqld 服务加入到系统服务并检测是否生效:

[root@www mysql]# chkconfig --add mysqld
[root@www mysql]# chkconfig --list mysqld
 
Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.
 
      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.
 
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

得到以上结果说明生效。

注:

查看启动项:chkconfig --list | grep -i mysqld
删除启动项:chkconfig --del mysqld
设置开机启动:chkconfig mysqld on
关闭开机启动:chkconfig mysqld off

启动mysqld:

[root@www mysql]# service mysqld start
Starting MySQL. SUCCESS!

设置开机启动:

[root@www mysql]# chkconfig mysqld on	# 设置开机启动
[root@www mysql]# chkconfig mysqld off	# 关闭开机启动

因为 mysqld 不是本地服务,是我们后加的,所以想要设置开机启动务不能用 systemctl enable mysqld ,systemctl 命令只能操作正常安装在系统的本地服务,所以要通过 chkconfig 命令来实现开机启动。

若要关闭MySQL

[root@www mysql]# service mysqld stop

2.2、配置环境变量
2.2.1、打开/etc/profile配置文件,添加如下内容:

mysql环境变量

PATH=$PATH:/usr/local/env/mysql/mysql/bin
export PATH
或:
export PATH=$PATH:/usr/local/env/mysql/mysql/bin

执行命令,使其生效:

[root@www mysql]# source /etc/profile

校验是否成功:看配置的mysql是否输出了

 [root@www mysql]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/env/jdk/jdk8/jdk1.8.0_171/bin:/root/bin:/home/env/jdk/jdk8/jdk1.8.0_171/bin:/usr/local/env/mysql/mysql/bin
 

登录:
第一次登陆的时候,使用初始化的密码:上面自动生成的

  [root@www mysql]# mysql -uroot -p
Enter password:

登录后修改密码

 mysql> SET PASSWORD = PASSWORD('123456');

允许远程访问

mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

小技巧:
假设我们下载的MySQL安装包的文件名为mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz,并将其上传到了CentOS7服务器的/opt目录下

scp mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz root@<你的服务器IP>:/opt

注意:

允许所有用户远程访问 修改用户名和密码为你自己的 mysql> grant all privileges on . to ‘root’@‘%’ identified by ‘password’ with grant option;
允许单个ip访问 修改用户名和密码为你自己的 mysql> grant all privileges on . to ‘root’@‘1.2.3.4’ identified by ‘password’ with grant option;
最后 mysql> FLUSH PRIVILEGES;

此时可以查看user表中多了一个 host 为 % 的用户:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

此时,可以使用navicat进行远程连接,或者在另外一台Linux服务器上用命令远程连接,假设
MySQL所在服务器地址为 192.168.137.10

[root@www ~]# mysql -h 192.168.137.10 -u root -p
Enter password:

使用navicate远程连接报错1045

 1045 - Access denied for user 'root'@'192.168.137.10' (using password: YES)

解决方法如下:

关闭mysql服务
 [root@www mysql]# service mysqld stop

 修改/etc/my.cnf修改为无密码登录
 在my.cnf配置文件添加如下内容:
# mysql无密码登录
skip-grant-tables

[root@www mysql]# mysql -u root

再次修改mysql密码
> mysql> use mysql; 
 Reading table information for completion of table and column names You can turn off this feature to get a quicker
 startup with -A   Database changed 
> mysql> update mysql.user set authentication_string=password('123456') where user='root' ; Query OK,
 1 row affected, 1 warning (0.00 sec) Rows matched: 2  Changed: 1  Warnings: 1


然后将my.cnf无密码登录配置去掉
退出mysql,并重启
再次使用navicat连接即可

MySQL主从搭建

在这里插入图片描述

mysql主从配置大致流程如下:
master会将变动记录到二进制文件(BinLog日志)中;
master有一个I/O线程将BinLog日志发送到slave;
slave有一个I/O线程把接受到的BinLog入职写到relay日志里面;
slave有一个sql线程,按照relay日志处理slave的数据。

搭建

要求主从所有配置项都配置在my.cnf 的[mysqld] 栏位下,且都是小写字母。
修改主机配置文件
在my.cnf配置文件输入以下内容并保存

[mysqld] 
#[必须]主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=atguigu-bin
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000
#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M
#[可选]设置不要复制的数据库
binlog-ignore-db=test
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slave
binlog-do-db=需要复制的主数据库名字
#[可选]设置binlog格式
binlog_format=STATEMENT

binlog格式设置: STATEMENT模式(基于SQL语句的复制(statement-based replication, SBR))
ROW模式(基于行的复制(row-based replication, RBR))
MIXED模式(混合模式复制(mixed-based replication, MBR))

从机配置文件

[mysqld] 
#[必须]从服务器唯一ID
server-id=2
#[可选]启用中继日志
relay-log=mysql-relay

主机:建立账户并授权
进入mysql数据库

#在主机MySQL里执行授权主从复制的命令
mysql> GRANT REPLICATION SLAVE ON *.* TO '用户名'@'从机器数据库IP' IDENTIFIED BY '密码';
#5.5,5.7

用户名可以为salve1,可以为其他
查询Master的状态,并记录下File和Position的值。

show master status\G

在这里插入图片描述

从机:配置需要复制的主机

指定前先执行 , 确保线程不在运行状态

mysql>stop slave; 

从机上复制主机的命令

CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
#启动slave同步
START SLAVE;

查看主从服务器状态

show slave status\G

在这里插入图片描述
表示状态正常,搭建成功

重启

reset slave; #删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件

1.如果Slave_IO_Running: No 则需要检查change master语句中的log位置和配置的log位置是否一样,还有log文件名是否一致。
2.在show master status\G 之前可以加锁来保证数据不被别人操作 flush tables with read lock;指定完同步位置之后再用unlock tables;来解锁

docker搭建MySQL集群

#第一个
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7
#第二个
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

第一个对外端口3307 第二个对外端口3308

配置主机
进入/mydata/mysql-master/conf目录下新建my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

重启MySQL

docker restart mysql-master

进入mysql-master容器并登录

docker exec -it mysql-master /bin/bash
mysql -uroot -proot

master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

配置从机
进入/mydata/mysql-slave/conf目录下新建my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

重启MySQL

docker restart mysql-slave

查看同步状态

查询Master的状态,并记录下File和Position的值
show master status;  

进入mysql-master容器并登录

docker exec -it mysql-master /bin/bash mysql -uroot -proot

配置主从复制

change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.查询的值', master_log_pos=固定值, master_connect_retry=30;
#启动slave同步
START SLAVE;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 准备工作 - 安装Docker - 新建两个目录:`master`和`slave`,用于存放主从数据库的数据 2. 创建MySQL容器 - 创建主库容器 ``` docker run --name mysql-master -v /path/to/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` - 创建从库容器 ``` docker run --name mysql-slave -v /path/to/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` 注意:`/path/to/master`和`/path/to/slave`是本地文件系统中的目录,用于存放主从数据库的数据。`123456`是MySQL的root密码,可以根据需要修改。 3. 配置主库 - 进入主库容器 ``` docker exec -it mysql-master /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 创建用于复制的用户 ``` CREATE USER 'replication'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; FLUSH PRIVILEGES; ``` - 查看主库状态 ``` SHOW MASTER STATUS; ``` 记录下File和Position的值,后面配置从库时需要用到。 4. 配置从库 - 进入从库容器 ``` docker exec -it mysql-slave /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 配置从库复制 ``` CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; ``` 注意:`mysql-master`是主库的容器名称,`replication`是上一步中创建的用于复制的用户,`mysql-bin.000001`和`154`分别是主库状态中的File和Position的值。 - 查看从库状态 ``` SHOW SLAVE STATUS\G ``` 如果Slave_IO_Running和Slave_SQL_Running都是`Yes`,则说明配置成功。 5. 测试主从同步 在主库中创建一个测试数据库和表,并插入一条数据: ``` CREATE DATABASE test; USE test; CREATE TABLE t (id INT, name VARCHAR(20)); INSERT INTO t VALUES (1, 'test'); ``` 在从库中查询该表: ``` USE test; SELECT * FROM t; ``` 可以看到从库中也有刚刚插入的数据,说明主从同步成功。 6. 总结 以上就是使用Docker搭建MySQL主从的步骤,需要注意的是,如果主库或从库的容器重启或者删除后再次创建,需要重新配置从库复制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值