MySQL是一款极其优秀的关系型数据库,本文主要介绍其在Windows和CentOS操作系统上的安装,以及基础环境的准备。
请读者注意
- 请先耐心看完全部步骤,并在脑海中有了一个较为清晰的认识,再开始操作。例如,你想要在Windows下安装,那你就先看这块的全部步骤,理解了每一步为了什么要这么做后,再开始实操。
- 请认真对待安装过程中,控制台上报的错误,建议根据关键词去网上搜索一下。
- 如果你按照本文的步骤一步一步地操作,但最终没有成功,请检查整个过程中步骤是否执行全了、控制台上是否报了一些错误而你忽略了。
- 每台机器的环境都有一定的差异,本文所介绍的内容不一定完全成功,请注意甄别。
内容导览
单机环境搭建
单机环境,区别于分布式与集群环境(例如主从环境)。指在单台机器上安装并运行MySQL Server。
Windows
以zip的方式安装,主要步骤:
- 下载:https://dev.mysql.com/downloads/。将MySQL的zip数据包,解压到你想放的位置
- 在MySQL的根目录下建立data目录,这个目录被用于存放数据库
- 在根目录建立ini文件,输入MySQL的配置
- 以管理员的权限打开cmd执行,进入bin目录:mysqld install
- 以管理员的cmd,进入根目录的bin目录,执行:mysqld --initialize-insecure;注意,如果速度较慢,则直接Ctrl+C,再执行一次
- 开启服务:net start mysql
- 连接MySQL,刚开始时密码为空,直接执行:mysql -uroot -p
- 进入到mysql后,执行:ALTER USER 'userName'@'localhost' IDENTIFIED BY 'New-Password-Here';
- 没有报错,显示“Query OK, 0 rows affected (0.06 sec)”。继续执行:FLUSH PRIVILEGES;
- 到此为止,MySQL环境搭建完毕
my.ini
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir="E:\ProgramFiles\Database\mysql-8.0.26-winx64"
# 设置mysql数据库的数据的存放目录
datadir="E:\ProgramFiles\Database\mysql-8.0.26-winx64\data"
# 临时
tmpdir="E:\ProgramFiles\Database\mysql-8.0.26-winx64\data"
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
#客户端编码方式,最好和服务端保存一致
loose-default-character-set=utf8mb4
[WinMySQLadmin]
Server = "E:\ProgramFiles\Database\mysql-8.0.26-winx64\bin\mysqld.exe"
QA
报错:服务无法启动
分析:检查mysqld的日志信息
问题定位成功:my.ini配置文件内的配置项有错误!!!
其他可能原因:
- 如果执行了netstat -ano发现端口占用,则结束掉该个程序:taskkill /f /pid 程序PID
- data目录的问题,网上有建议是先不手动创建data目录,直接执行:mysqld --initialize-insecure;
CentOS
MySQL数据包
- Compressed TAR Archive:经过压缩、打包后的源码
- rpm bundle:该个版本的所有包集合,把该个版本所需的所有组件都带上,其他的不带,尤其是开发包
- rpm package:某个特定的包,类似于绿色安装
安装方式:
- 编译好的安装包:rpm安装(mysql57-community-release-el7-10.noarch.rpm)
- 源码包安装(gz)
- 在线安装(YUM、APT等):yum安装(yum -y install mysql-server)
卸载
- rpm -e mysql
- yum -erase mysql
- yum remove mysql
依赖
- 检查依赖情况:rpm -qa | grep mysql
- 移除:rpm -e 依赖名
- 检查mariadb:rpm -qa | grep mariadb
- 卸载mariadb:
- rpm -e --nodeps mariadb-libs
- rpm -e --nodeps mariadb-devel-5.5.65-1.el7.x86_64
- 安装MySQL相关依赖:yum install libaio
源码安装
Stage1:检查是否已安装并移除:rpm -qa | grep mysql
Stage2:准备源码包
- 下载源码数据包:https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/mysql-8.0.27-el7-x86_64.tar.gz
- 安装MySQL的依赖包:yum install libaio
- 上传数据包到/opt,解压:tar -zxvf mysql-8.0.27-el7-x86_64.tar.gz
- 赋予MySQL目录777权限:chmod -R 777 /opt/mysql8.0.27
Stage3:创建相关用户
- 创建mysql组和用户:groupadd mysql
- 创建用户:useradd -r -g mysql -s /bin/false mysql
- 将用户添加到用户组:chown -R mysql:mysql ./
Stage4:添加MySQL配置文件:vi /etc/my.cnf
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/opt/mysql8.0.27
# 设置mysql数据库的数据的存放目录
datadir=/opt/mysql8.0.27/mysqldb
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
Stage5:初始化
- 进入MySQL的bin目录,安装并且初始化:./mysqld --initialize --console #记录下产生的随机密码
- 切换到support-files目录:./mysql.server start
- 如果第一次启动,当初始化执行会有报错,重新给mysql安装目录赋予一下权限后,再次执行:chmod -R 777 /opt/mysql8.0.27
- 将mysql添加到系统进程中,进入support-files目录:cp mysql.server /etc/init.d/mysqld
- 设置mysql自启动
-
- chmod +x /etc/init.d/mysqld
- systemctl enable mysqld
- systemctl start mysqld
Stage6:改密码
- 切换到bin目录:./mysql -u root -p #输入上面产生的随机密码
- 改密:alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Hackyle.1997';
- 刷新:flush privileges;
- 退出:quit
- 检查状态:systemctl status mysql
其他教程参考:https://blog.csdn.net/qq_41389482/article/details/109711389
rpm安装
YUM方式安装
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
yum -y install mysql80-community-release-el7-6.noarch.rpm
安装MySQL服务器:yum -y install mysql-community-server --nogpgcheck
启动MySQL服务:systemctl start mysqld.service
查看一下运行状态:systemctl status mysqld.service
查看一下初始密码:grep "password" /var/log/mysqld.log
登录mysql -uroot -p初始化密码
注意:如果有特殊字符(例如:!?),要加 \ 转义,写成\! \? 才能成功识别
修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'Kyle.1997';
mysql默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。
刷新,确保修改生效:FLUSH PRIVILEGES;
设置自动启动
- systemctl enable mysqld
- systemctl daemon-reload
主从环境搭建
MySQL数据的主从同步原理
主从复制过程
- master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后,master通知存储引擎提交事务。
- slave将master的binarylog拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志
- SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小
Windows
以zip的方式安装,主要步骤:
- 下载数据包:https://dev.mysql.com/downloads/mysql/
- 在一个合适的位置下,解压复制出两个副本
Master
- 在MySQL的根目录下建立data目录,这个目录被用于存放数据库
- 在根目录建立ini文件,输入MySQL的配置(注意端口号和BaseDir),见下文
- 进入MySQL所在目录的bin目录,以管理员的权限打开cmd执行:mysqld install 服务名 ‐‐defaults‐file="安装目录\my.ini"。例如:mysqld install mysql-master01 ‐‐defaults‐file="D:\ProgramFilesKS\Database\MySQL8.0.25\master01\my.ini"
- 以管理员的cmd,进入根目录的bin目录,执行:mysqld --initialize-insecure;注意,如果速度较慢,则直接Ctrl+C,再执行一次
- 启动服务:net start mysql-master01
- 连接MySQL,刚开始时密码为空,直接执行:mysql -h localhost -P 3310 -uroot -p
- 进入到mysql后,执行:ALTER USER 'userName'@'localhost' IDENTIFIED BY 'New-Password-Here'; 例如:ALTER USER 'root'@'localhost' IDENTIFIED BY 'hackyle';
- 没有报错,显示“Query OK, 0 rows affected (0.06 sec)”。继续执行:FLUSH PRIVILEGES;
- 到此为止,MySQL环境搭建完毕。再次连接测试:mysql -h localhost -P 3310 -uroot -phackyle
my.ini
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysqld]
port = 3310
# 设置mysql的安装目录
basedir="D:\ProgramFilesKS\Database\MySQL8.0.25\master01"
# 设置mysql数据库的数据的存放目录
datadir="D:\ProgramFilesKS\Database\MySQL8.0.25\master01\data"
# 临时
tmpdir="D:\ProgramFilesKS\Database\MySQL8.0.25\master01\data"
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
#客户端编码方式,最好和服务端保存一致
loose-default-character-set=utf8mb4
[WinMySQLadmin]
Server = "D:\ProgramFilesKS\Database\MySQL8.0.25\master01\bin\mysqld.exe"
Slave
- 在MySQL的根目录下建立data目录,这个目录被用于存放数据库
- 在根目录建立ini文件,输入MySQL的配置(注意端口号和BaseDir),见下文
- 进入MySQL所在目录的bin目录,以管理员的权限打开cmd执行:mysqld install 服务名 ‐‐defaults‐file="安装目录\my.ini"。例如:mysqld install mysql-slave01 ‐‐defaults‐file="D:\ProgramFilesKS\Database\MySQL8.0.25\slave01\my.ini"
- 以管理员的cmd,进入根目录的bin目录,执行:mysqld --initialize-insecure;注意,如果速度较慢,则直接Ctrl+C,再执行一次
- 启动服务:net start mysql-slave01
- 连接MySQL,刚开始时密码为空,直接执行:mysql -h localhost -P 3311 -uroot -p
- 进入到mysql后,执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'New-Password-Here'; 例如:ALTER USER 'root'@'localhost' IDENTIFIED BY 'hackyle';
- 没有报错,显示“Query OK, 0 rows affected (0.06 sec)”。继续执行:FLUSH PRIVILEGES;
- 到此为止,MySQL环境搭建完毕。再次连接测试:mysql -h localhost -P 3311 -uroot -phackyle
my.ini
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysqld]
port = 3311
# 设置mysql的安装目录
basedir="D:\ProgramFilesKS\Database\MySQL8.0.25\\slave01"
# 设置mysql数据库的数据的存放目录
datadir="D:\ProgramFilesKS\Database\MySQL8.0.25\\slave01\data"
# 临时
tmpdir="D:\ProgramFilesKS\Database\MySQL8.0.25\\slave01\data"
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
#客户端编码方式,最好和服务端保存一致
loose-default-character-set=utf8mb4
[WinMySQLadmin]
Server = "D:\ProgramFilesKS\Database\MySQL8.0.25\slave01\bin\mysqld.exe"
配置数据同步
分别连接master01和slave01,创建好需要进行主从同步的数据库:CREATE DATABASE user_db;
停止MySQL服务
- net stop mysql-master01
- net stop mysql-slave01
- 或者进入服务管理控制台(msc),选中对应的服务,选择停止
在Master的my.ini中配置主库的数据同步信息
# 开启日志
log_bin=./data
# 设置服务id,主从不能一致
server_id=3310
# 设置需要同步的数据库
binlog_do_db=user_db
# 屏蔽系统库同步
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performance_schema
在Slave的my.ini中配置从库
log_bin=./data
# 设置服务id,主从不能一致
server_id=3311
# 设置需要同步的数据库
binlog_do_db=user_db.%
# 屏蔽系统库同步
binlog_ignore_db=mysql.%
binlog_ignore_db=information_schema.%
binlog_ignore_db=performance_schema.%
重启服务
net start mysql-master01
net start mysql-slave01
授权主从复制专用账号
相关参考文档:https://blog.csdn.net/weixin_42701376/article/details/122535000
进入master01主库bin目录
- 创建一个用户用于授权slave访问master的专用账号:create user 'rootslave'@'%'; #%表示设备都可登录,其他参数:%(所有ip)、localhost(本服务器)、指定的服务器ip(如652.30.145)
- 设置密码:set password for 'rootslave'@'%'='root123';
- 授权:grant replication slave on *.* to 'rootslave'@'%'; #给rootslave用户分配‘replication slave’权限并让他可以操作所有数据库中的所有表
- 刷新权限:flush privileges;
- 检查授权情况:show grants for 'rootslave'@'%';
- 确认位点,记录下文件名以及位点:show master status;
进入从库slave01的bin目录
- 登录:mysql -P 3311 -uroot -p
- 先停止同步:STOP SLAVE;
- 设置同步信息:
CHANGE MASTER TO
master_host = 'localhost', #master服务器的IP
master_port = 3310, #master服务器的Port
master_user = 'rootslave', #master服务的slave账号
master_password = 'root123’, #master的服务器密码
master_log_file = data.000003', #这里的文件名来自【show master status;】的执行结果
master_log_pos = 1815; #这里的数字来自【show master status;】的执行结果
实例:
CHANGE MASTER TO master_host='localhost',master_port=3310,master_user='rootslave',master_password='root123',master_log_file='data.000003',master_log_pos=1815;
- 启动同步:START SLAVE;
- 查看从库状态:show slave status\G
查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,仔细检查输出的其他信息,根据报错信息来排查问题所在点
注意:如果之前此备库已有主库指向,需要先执行以下命令清空
- STOP SLAVE IO_THREAD FOR CHANNEL '';
- reset slave all;
测试
在master01上进行DML,在slave01上进行DQL,可以查询到在master01上操作过的DML
master01
CREATE TABLE user(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(16) DEFAULT NULL,
update_time DATETIME DEFAULT now() ON UPDATE now()
);
INSERT INTO user(name) VALUES ('aaa'),('bbb'),('ccc');
slave01
select * from user;
QA
执行mysqld --initialize-insecure时报错
mysqld: Can't get stat of 'D:\ProgramFilesKS\Database\MySQL8.0.25 lave01\data' (OS errno 2 - No such file or directory)
分析:根据报错信息,发现这里路径不完整,应该是路径分隔符导致的问题
解决:修改my.ini的路径
重新安装服务时报错:The service already exists!
解决方案:sc delete 服务名(例如:sc delete mysql-master01)
报错:服务无法启动
分析:检查mysqld的日志信息
问题定位成功:my.ini配置文件内的配置项有错误!!!
其他可能原因:
- 如果执行了netstat -ano发现端口占用,则结束掉该个程序:taskkill /f /pid 程序PID
- data目录的问题,先删除data目录,直接执行:mysqld --initialize-insecure;再启动:net start mysql-slave01
CentOS
请先实践CentOS环境下的单机安装,再仔细阅读Windows环境下的主从安装,一定可以实现在CentOS环境下的主从安装
Name:
Email:
Link: