Mysql的安装,主从搭建,集群搭建,断开修复
一. 安装
1.添加用户
# 创建用户
useradd mysql
# 设置密码
passwd mysql
Tips: home目录下,存放的是对应用户的目录文件夹.比如 添加了
mysql
用户,在home目录下就会有一个对应的命名为mysql
的文件夹
2.下载mysql
文件
# 下载对应版本的mysql数据库
curl -O https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
# 解压文件
tar -xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
# 重命名文件夹
mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql-3306
3.复制多个数据库
# 复制 mysql-3306 文件夹, 粘贴为 mysql-3307 文件夹
cp -r mysql-3306 mysql-3307
4.配置my.cnf
在数据库目录下创建文件,命名为my.cnf
4.1 主库配置
[client]
socket=/home/mysql/mysql-3306/mysql.sock
[mysqld]
basedir=/home/mysql/mysql-3306
datadir=/home/mysql/mysql-3306/data
port = 3306
socket=/home/mysql/mysql-3306/mysql.sock
#主库配置
## 必须不一致
server-id=01
## 二进制日志
log-bin=mysql-bin
## 忽略数据库(主从复制忽略该数据库)
binlog-ignore-db=mysql
## 指定数据库
binlog-do-db=369
max_connect_errors=1000
[mysql]
socket=/home/mysql/mysql-3306/mysql.sock
[mysqldump]
socket=/home/mysql/mysql-3306/mysql.sock
[mysqladmin]
socket=/home/mysql/mysql-3306/mysql.sock
symbolic-links=0
log-error=/home/mysql/mysql-3306/log/mysqld.log
pid-file=/home/mysql/mysql-3306/mysqld.pid
4.2 从库配置
[client]
socket=/home/mysql/mysql-3306/mysql.sock
[mysqld]
basedir=/home/mysql/mysql-3307
datadir=/home/mysql/mysql-3307/data
port = 3307#必须不一致
socket=/home/mysql/mysql-3307/mysql.sock
server-id=02 #必须不一致
max_connect_errors=1000
[mysql]
socket=/home/mysql/mysql-3307/mysql.sock
[mysqldump]
socket=/home/mysql/mysql-3307/mysql.sock
[mysqladmin]
socket=/home/mysql/mysql-3307/mysql.sock
symbolic-links=0
log-error=/home/mysql/mysql-3307/log/mysqld.log
pid-file=/home/mysql/mysql-3307/mysqld.pid
注意: 主从配置的主要区别在于[mysqld]下的配置, 一定要保证端口
port
和server_id
的唯一性.不可重复
5.设置数据库的操作权限
将数据库目录设置权限为最高777
;
如 mysql-3306 ,mysql-3307目录
6.初始化数据库
在各个数据库目录下创建data文件夹(用于存放数据),和tmp 文件夹(存放临时文件);
mkdir data
mkdir tmp
注意:
- 保证
data
目录是个新的文件夹,里面不能有任何文件- 初始化完成之后一定保管好临时密码.
./mysqld --defaults-file=/home/mysql/mysql-3306/my.cnf --initialize --user=mysql
- 该命令执行完,即会产生临时密码,注意保管
- 不同的数据库,注意文件路径是否正确
# 注意路径中的文件名是否正确
./mysql_ssl_rsa_setup --defaults-file=/home/mysql/mysql-3306/my.cnf
7.启动数据库服务
./mysqld_safe --defaults-file=../my.cnf
- 该指令启动成功后,窗口便不能执行,任何指令,需要复制会话窗口,继续执行后续操作
- 如果执行失败,会出现
*****.pid end
,要去data
目录下,查看一个后缀为err
的文件,排查原因.
- 常见原因有两种
- 数据库目录的权限没有提升至
777
;在启动服务时,会在数据库目录下写入mysql.sock
的文件夹,和mysql.sock.lock
的文件,如果权限不足,会导致写入失败,从而数据库服务也启动失败- 已经存在相同的进程了.通过使用指令
ps -aux|grep mysql
来验证;如果不能解决问题,可直接执行pkill mysql
,杀死mysql
全部进程
8.登录数据库
登录数据库之后,主库和从库的操作不同,需要注意
./mysql --socket=../mysql.sock -u root -p
主库和从库都进行
# 修改临时密码 alter user 'root'@'localhost' identified by '123456'; # 切换到`mysql`数据库 use mysql; # 修改root用户在所有host地址都可连接,可简单理解为允许远程连接 update user set user.Host='%' where user.User='root'; # 设置root 用户 密码永不过期 ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 刷新权限 flush privileges; # 退出登录 quit
仅主库操作
# 创建账号,分发给从库,用于主从复制
CREATE USER '同步账号'@'%' IDENTIFIED WITH 'mysql_native_password' BY '同步密码';
# 给该账号授予权限
GRANT replication slave ON *.* TO '同步账号'@'%';
# 刷新权限
flush privileges;
二. 主从搭建
主库操作
查看主库状态
# 刷新日志
mysql> flush logs;
# 查看主库状态
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 156
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
Executed_Gtid_Set:
1 row in set (0.00 sec)
注意:主要查看两个信息
- 日志文件名称: master_log_file="mysql-bin.000001",
- 日志文件位置: master_log_pos=156;
从库操作
建立主从关系
change master to
# host 是 主库的 ip 地址
master_host="127.0.0.1*",
# 主库创建并授权分发给从库的账号
master_user="slave_user",
# 账号的密码
master_password="slave_user_password",
# 主库show master status 获取到的两个信息
master_log_file="mysql-bin.000001",
master_log_pos=156;
启动从机
start slave
查看从机状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
#### 主机的IP
Master_Host: 192.168.0.111
#### 账号
Master_User: slave_user
#### 主库端口
Master_Port: 3306
Connect_Retry: 60
#### 主库日志
Master_Log_File: mysql-bin.000103
... ... ... ... ...
#### 看到以下两个Yes 代表主从配置成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
... ... ... ... ...
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
... ... ... ... ...
Network_Namespace:
1 row in set (0.03 sec)
三.集群搭建
haproxy 是mysql数据库集群
1. 下载haproxy:
2. 解压:
tar zxvf haproxy-1.8.12.tar.gz
cd haproxy-1.8.12
3. 编译与安装:
安装
::: tip
#参数说明: #TARGET:使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26。kernel 等于2.6.28的用:TARGET=linux2628,等等。 #CPU:使用uname -r查看系统信息,如x86_64 GNU/Linux,此时该参数就为x86_64。 #PREFIX:指定haprpxy安装路径。
:::
make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haprpxy
make install PREFIX=/usr/local/haproxy
4. 设置HAProxy:
::: warning
如果要复制该段,需要将指令中的 haproxy的安装位置,改为自己系统上的位置;
每一句shell指令都要保证提示执行成功,建议一步一步操作
:::
mkdir -p /usr/local/haproxy/conf #创建配置文件目录
mkdir -p /etc/haproxy #创建配置文件目录
touch /usr/local/haproxy/conf/haproxy.cfg #创建配置文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接
cp -r /home/haproxy/haproxy-1.8.12/examples/errorfiles /usr/local/haproxy/errorfiles #拷贝错误页面
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles #添加软连接
mkdir -p /usr/local/haproxy/log #创建日志文件目录
touch /usr/local/haproxy/log/haproxy.log #创建日志文件
ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log #添加软连接
cp /home/haproxy/haproxy-1.8.12/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件
chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限
chkconfig haproxy on #设置开机启动
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin #添加软连接
5.配置haproxy.cfg参数:
::: details 点击查看
global
log 127.0.0.1 local2 # 日志定义级别(err | warning | info | debug)
chroot /usr/local/haproxy # 当前工作目录
pidfile /var/run/haproxy.pid # 进程id
maxconn 4000 # 最大连接数
user haproxy # 运行改程序的用户
group haproxy
daemon # 后台形式运行
stats socket /usr/local/haproxy/stats
defaults
mode tcp # haproxy运行模式(http | tcp | health)
log global # 采用全局定义的日志
option dontlognull # 不记录健康检查的日志信息
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 # 三次连接失败则服务器不用
timeout http-request 10s
timeout queue 1m
timeout connect 10s # 连接超时
timeout client 1m # 客户端超时
timeout server 1m # 服务器超时
timeout http-keep-alive 10s
timeout check 10s # 心跳检测
maxconn 600 # 最大连接数
listen stats # 配置haproxy状态页(用来查看的页面)
mode http
bind :8888
stats enable
stats hide-version # 隐藏haproxy版本号
stats uri /haproxyadmin?stats # 一会用于打开状态页的uri
stats realm Haproxy\ Statistics # 输入账户密码时的提示文字
stats auth admin:369Vip369.com # 用户名:密码
frontend main
bind 0.0.0.0:6603
# 使用6603端口。监听前端端口(表示任何ip访问6603端口都会将数据轮番转发到mysql服务器群组中)
default_backend mysql # 后端服务器组名
backend mysql
balance roundrobin # 使用轮询方式调度
server mysql1 188.19.96.171:3307 check port 3307 maxconn 300
server mysql2 188.19.96.171:3308 check port 3308 maxconn 300
server mysql3 188.19.96.171:3309 check port 3309 maxconn 300
server mysql4 188.19.96.171:3310 check port 3310 maxconn 300
server mysql5 188.19.96.171:3306 check port 3306 maxconn 300
:::
6.常用指令:
systemctl start haproxy
systemctl status haproxy -l
systemctl stop haproxy
systemctl restart haproxy
7.测试访问:
如果服务器是阿里云服务器,记得开放安全组端口
http://服务器ip:端口号/haproxyadmin?stats
8.配置文件地址:
/usr/local/haproxy/conf
9.日志地址:
/var/log/haproxy.log
四.断开修复
前言 实际开发中会遇到,主从断开的情况,那么该如何修复呢?其实修复的本质就是让从库和主库重新建立连接.
建议 主从的修复涉及sql导入数据,这个需要大量的时间,如果有时急需程序正常运转,可先尝试跳过当前导致主从错误的同步操作,问题解决即可.若问题没有解决,数据还是不能正常同步再进行,完全的主从重连操作.
一. 跳过错误
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ;
start slave;
::: tip 提示
sql中的数字代表跳过的事务数量. 若一个事务数量不能同步,可尝试加大数字
:::
::: warning 建议
每执行一次sql都要再查看一次主从状态,直到同步为止.
:::
二. 重新连接
1. 关闭slave
stop slave;
2. 同步数据
:::tip 提示
主库中导出数据,可借助可视化工具,如SQL_yon
,navicat
导出可执行的sql文件
:::
- 切换数据库
use database_name
- 同步数据
source sql文件位置
eg: source /123.sql # 表示根目录下的`123.sql` 文件
3. 查看主库状态
- 刷新日志
flush logs;
- 查看主库状态
show master status\G;
4. 建立主从关系
# 以下内容可供复制
change master to
master_host="127.0.0.1*",
master_user="slave_user",
master_password="slavepassword",
master_log_file="mysql-bin.000019",
master_log_pos=322;
开启slave
start slave;
查看slave状态
show slave status\G;
看到以下两个状态都为Yes
,则表示主从关系修复成功了.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes