Mysql.zip版环境搭建
准备工作
首先去官方下载mysql.zip文件。
下载地址:https://dev.mysql.com/downloads/mysql/5.7.html
安装
将下载好的zip文件进行解压,这里我的解压环境为D:\Program\
文件夹名称为mysql-5.7.35-winx64
。
以下是目录结构:
mysql-5.7.35-winx64
├─bin
├─data
├─docs
├─include
├─lib
└─share
默认解压后没有data
文件夹,需要手动创建data
文件夹。
创建好后再创建一个叫my.ini
的文件,并在里面增加如下内容:
[mysql]
# 设置mysql客户端默认字符集
default-character-set = utf8mb4
[mysqld]
#允许客户端通过内存共享连接
shared-memory
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir = E:\\Temp\\.mysql
# 设置mysql数据库的数据的存放目录
datadir = E:\\Temp\\.mysql\\data
# 允许最大连接数
max_connections = 100
# 服务端使用的字符集默认为UTF8
character-set-server = utf8mb4
# 排序规则
collation-server = utf8mb4_general_ci
# 大小写是否敏感
lower_case_table_names = 1
# 创建新表时将使用的默认存储引擎
default-storage-engine = INNODB
# INNODB语法检查
innodb_strict_mode = OFF
# INNODB日志设置
innodb_log_file_size = 30M
innodb_log_buffer_size = 512M
# 内存设置
## 指定MySQL最小内存
#key_buffer_size=5M
## 包大小限制
max_allowed_packet = 2000M
wait_timeout=2880000
interactive_timeout = 2880000
## 指定服务器每个连接可使用的最大排序空间
sort_buffer_size=2M
# INNODB内存配置
innodb_page_size = 32K
innodb_buffer_pool_size = 2048M
# INNODB事务锁超时时长
innodb_lock_wait_timeout = 1500
# binlog日志
disable-log-bin
# 信任生成函数
log_bin_trust_function_creators = 1
explicit_defaults_for_timestamp = true
# 解决Group By的报错
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
注意:这里的路径需要与自己设置的路径相匹配。
windows服务安装
接下来安装服务,在cmd中输入mysqld install [服务名]
安装服务。需要管理员权限
在5.7.6版本开始需要执行初始化mysqld --initialize
命令。
若已经执行了安装操作,可以使用mysqld -remove
删除之前安装的服务,再执行初始化操作。
安装完成后,今后启动就可使用net start [服务名]
指令去启动mysql了,例如:net start mysql
顺便一提,停止服务可使用net stop [服务名]
。
密码设置
首先要启动服务,输入mysqld --initialize --console
,注意输出数据中会存在类似这样一行的数据:
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: rI5rvf5x5G,E
其中root@localhost:
后面的rI5rvf5x5G,E
就是初始密码(不含首位空格)。在没有更改密码前,需要记住这个密码,后续登录需要用到。
执行mysql -u root -p
回车然后输入密码,即可登录mysql
现在就可以通过密码更新的指令进行数据库密码修改了,完成后记得刷新缓存即可。
MySQL版本5.7.6版本以前用户可以使用如下命令:
SET PASSWORD = PASSWORD('root');
MySQL版本5.7.6版本开始的用户可以使用如下命令:
ALTER USER USER() IDENTIFIED BY 'root';
环境变量设置
scriptsetx "Path" "%path_%;newpath1;newpath2" /m
版本选择
在实际线上使用过程中发现,用同一个SQL查询相同的数据,返回的时间有很大的差异:
- 在
8.0.13
版数据库中查询:15.32 sec - 在
8.0.32
版数据库中查询:0.04 sec
所以在选择数据库版本时,需要进行详细的调查,目前在本地使用8.0.32
版本较为高效,可参考使用该版本!
因存在拒绝服务漏洞,建议选择8.0.35
及以上版本进行安装!!!
Linux版安装脚本
所需环境:
wget
#!/bin/bash
# Function to get user input with a default value
get_input() {
local prompt="$1"
local default="$2"
read -p "$prompt [$default]: " input
echo "${input:-$default}"
}
# Function to install Mysql Server
install_mysql() {
# Prompt user for MySQL version
MYSQL_VERSION=$(get_input "Enter MySQL version to install" "8.0.36")
# Prompt user for installation directory
INSTALL_DIR=$(get_input "Enter installation directory" "/usr/local/mysql")
# Prompt user for data directory
DATA_DIR=$(get_input "Enter data directory" "/var/lib/mysql")
# Prompt user for glibc version
GLIBC_VERSION=$(get_input "Enter glibc version" "2.28")
# Determine the download URL and checksum URL
MYSQL_TAR="mysql-${MYSQL_VERSION}-linux-glibc${GLIBC_VERSION}-${ARCH}.tar.xz"
MYSQL_URL="https://dev.mysql.com/get/Downloads/MySQL-$MYSQL_VERSION/$MYSQL_TAR"
CHECKSUM_URL="https://dev.mysql.com/get/Downloads/MySQL-$MYSQL_VERSION/${MYSQL_TAR}.md5"
# Download MySQL tarball and checksum
echo "Downloading MySQL $MYSQL_VERSION..."
if [ ! -f "${MYSQL_TAR}" ];then
wget -q --show-progress $MYSQL_URL
fi
if [ ! -f "${CHECKSUM_URL}" ];then
wget -q --show-progress $CHECKSUM_URL
fi
# Verify checksum
echo "Verifying checksum..."
md5sum -c ${MYSQL_TAR}.md5
if [ $? -ne 0 ]; then
echo "Checksum verification failed. Exiting."
exit 1
fi
# Extract MySQL tarball
echo "Extracting MySQL package..."
tar -xf $MYSQL_TAR
# Move MySQL to the installation directory
sudo mv mysql-${MYSQL_VERSION}-linux-glibc${GLIBC_VERSION}-${ARCH} $INSTALL_DIR
# Create data directory
sudo mkdir -p $DATA_DIR
sudo chown -R mysql:mysql $DATA_DIR
# Install necessary dependencies
if [ "$OS" == "ubuntu" ]; then
sudo apt-get update
sudo apt-get install -y libaio1 libncurses5
elif [ "$OS" == "centos" ]; then
sudo yum install -y libaio ncurses-libs
elif [ "$OS" == "arch" ]; then
sudo pacman -S --noconfirm libaio ncurses
fi
# Initialize MySQL
sudo $INSTALL_DIR/bin/mysqld --initialize-insecure --user=mysql --basedir=$INSTALL_DIR --datadir=$DATA_DIR
# Create MySQL service file
sudo bash -c 'cat > /etc/systemd/system/mysql.service <<EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
ExecStart='$INSTALL_DIR'/bin/mysqld --basedir='$INSTALL_DIR' --datadir='$DATA_DIR'
User=mysql
Group=mysql
Restart=on-failure
LimitNOFILE=5000
[Install]
WantedBy=multi-user.target
EOF'
sudo systemctl enable mysql
sudo systemctl start mysql
echo "MySQL $MYSQL_VERSION has been installed successfully!"
}
# supported OS array
SUPPORTED_OS=("ubuntu" "centos" "arch")
# Determine the OS type
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VERSION_ID=$VERSION_ID
ARCH=$(uname -m)
else
echo "Unsupported operating system."
exit 1
fi
if [[ "${SUPPORTED_OS[@]}" =~ "$OS" ]] ; then
install_mysql
else
echo "The current script does not support your system."
exit 1
fi
拓展知识: Mysql通信协议

Mysql 通信协议主要有这几种:Unix套接字、内存共享、命名管道、TCP/IP套接字…
绝大部分情况下,我们使用的是TCP/IP套接字进行通信的,这种方式最通用,但也会带了通信方面的性能瓶颈。
若是本地通信,Windows建议使用内存共享,Unix/Linux建议使用Unix套接字
交互过程
其交互过程主要分为两个部分:握手认证和指令执行
这里用TCP/IP协议模式进行讲解:
三次握手建立 TCP 连接。
建立 MySQL 连接,也就是认证阶段。
服务端 -> 客户端:发送握手初始化包 (Handshake Initialization Packet)。
客户端 -> 服务端:发送验证包 (Client Authentication Packet)。
服务端 -> 客户端:认证结果消息。认证通过之后,客户端开始与服务端之间交互,也就是命令执行阶段。
客户端 -> 服务端:发送命令包 (Command Packet)。
服务端 -> 客户端:发送回应包 (OK Packet, or Error Packet, or Result Set Packet)。断开 MySQL 连接。
客户端 -> 服务器:发送退出命令包。四次握手断开 TCP 连接。
