在Windows上手動安裝MySQL而不使用MySQL安裝程式
手动安装MySQL在Windows上的快速步骤
介绍
Oracle 发布了独立的 MySQL 安装程序,旨在简化在 Microsoft Windows 上安装和配置 MySQL 产品的复杂性。以下是安装程序的链接:
- https://dev.mysql.com/downloads/installer/
- https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/mysql-installer.html
- https://downloads.mysql.com/docs/mysql-installer-en.pdf
既然有一个向导式的安装程序,为什么还要手动安装呢?
- 您可以安装同一版本的 MySQL 的多个实例
- 更深入了解和洞察 MySQL 配置的工作原理
- 在配置 MySQL 时具有更好的控制和更灵活的选项
官方 MySQL 安装指南:https://dev.mysql.com/doc/refman/8.0/en/installing.html
以下是一个快速简化的安装步骤概述:
- 下载 Microsoft Visual C++ 2019 Redistributable Runtime。
- 从 MySQL 下载二进制文件。
- 存档文件通常被命名为 mysql-x.x.x-winx64.zip,其中 ‘x.x.x’ 代表版本号。例如,本文撰写时的最新版本是 mysql-8.0.35-winx64.zip。
- 官方下载 URL(适用于社区版):https://dev.mysql.com/downloads/mysql/
- 将 zip 存档文件解压到一个文件夹中,该文件夹将成为运行 MySQL 服务器的根文件夹。
- 在根文件夹中创建一个选项文件 (my.ini)。
- 初始化“Data”目录
- 安装 MySQL 服务器的 Windows 服务
- 启动/停止 MySQL 服务器的服务
- 设置/更改“root”用户的密码。
让我们开始
Windows 上的 MySQL 服务器需要 Microsoft Visual C++ 2019 Runtime。您可以在以下链接下载“Visual C++ Redistributable for Visual Studio 2015-2022”:
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
假设您将 zip 存档文件提取到以下文件夹中(可以是任何位置):
C:\mysql
根文件夹将包含以下提取内容:
C:\mysql\bin\C:\mysql\docs\C:\mysql\include\C:\mysql\lib\C:\mysql\share\C:\mysql\LICENSEC:\mysql\README
在根文件夹中创建一个选项文件,并将其命名为 my.ini。但是,如果您打算使用所有默认参数,则无需创建选项文件。
选项文件的位置:
// 默认位置<根文件夹>\my.ini// 例如C:\mysql\my.ini
您可以在此处找到有关默认位置和选项文件详细信息的文档:
- MySQL 8.0 参考手册 :: 4.2.2.2 使用选项文件
- https://dev.mysql.com/doc/refman/8.0/en/server-option-variable-reference.html
- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
选项文件可以微调MySQL服务器的行为,例如修改其内存访问限制、性能以及处理特定操作的方式。
下面是我在一个MySQL服务器中使用的选项文件的示例:
[mysqld]max_allowed_packet=1Ginnodb_buffer_pool_size=500Msql-mode="STRICT_TRANS_TABLES"authentication_policy=mysql_native_password
未在选项文件中指定的选项将适用默认值。以下是一些值得注意的默认选项:
[client]port=3306[mysqld]# 根目录: <root>basedir=C:/mysqlorbasedir=C:\\mysql# 数据目录: <root>/datadatadir=C:/mysql/dataordatadir=C:\\mysql\\dataport=3306# 默认字符编码# MySQL 8中的默认值character_ser_server=utf8mb4collation_server=utf8mb4_0900_ai_ci# MySQL 5.7及以下版本的默认值character_ser_server=latin1collation_server=latin1_swedish_ci# https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html# https://dev.mysql.com/doc/refman/8.0/en/storage-engines.htmldefault_storage_engine=InnoDB# https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size# 默认:130 MB# 用于将InnoDB表和索引数据缓存到内存中以提高性能innodb_buffer_pool_size=134217728# 单个查询的最大长度# 默认:64 MBmax_allowed_packet=67108864# 定义MySQL应支持的SQL语法和要执行的数据验证检查类型# https://dev.mysql.com/doc/refman/8.0/en/sql-mode.htmlsql-mode="ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION"# 使用与旧版MySQL 5向后兼容的MySQL传统用户密码authentication_policy=mysql_native_password# 这是MySQL 8的默认选项,提供更强的安全性authentication_policy=caching_sha2_password
在这里,我想花些时间为“sql-mode
”的默认值添加一些解释。
ONLY_FULL_GROUP_BY - 启用时=================================-- 这将导致错误select id, groupid, groupname from sales group by groupid;-- group by子句必须包含其余的列select id, groupid, groupname from sales group by groupid, id, groupname;STRICT_TRANS_TABLES - 启用时=================================-- 严格遵守表模式中定义的数据类型和值,-- 任何不正确的数据输入都会导致错误-- 示例:CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT, total INT NOT NULL, PRIMARY KEY (id));-- 这将导致错误,`total`不允许空值INSERT INTO test (total) VALUES (NULL);NO_ZERO_IN_DATE, NO_ZERO_DATE - 启用时=================================-- 不允许以下零日期值:0000-00-000000-00-00 00:00:002023-00-00ERROR_FOR_DIVISION_BY_ZERO=================================-- 无法使用零进行除法- 启用时1000 / 0 = 错误- 关闭时1000 / 0 = nullNO_ENGINE_SUBSTITUTION=================================-- 防止数据库自动将不可用的存储引擎替换为默认引擎,确保表只使用指定的引擎.- 启用时CREATE TABLE example_table ( id INT, data VARCHAR(100)) ENGINE=MERGE; -- 如果MERGE引擎不可用,将失败- 关闭时-- ENGINE=MERGE将变为Innodb
假设我们有另一个需要以特定的非正常方式运行的MySQL实例。选项文件可能如下所示:
[client]port = 4001[mysqld]port = 4001basedir = D:/database/engine/mysql/v8.0.25/datadir = E:/database/data/mysql/4001/max_allowed_packet = 1Ginnodb_buffer_pool_size = 1G# 将此MySQL实例作为复制运行# 用于复制设置的特殊选项server-id = 2master-host = 192.168.0.254master-user = replication_usermaster-password = replication_passwordmaster-port = 3306read-only = 1
如果你想知道MySQL上下文中的复制设置是什么?MySQL中的复制设置是一种配置,其中从一个MySQL服务器(主服务器)自动复制并保持另一个服务器(副本或从服务器)上的数据是最新的。
*关于复制设置的辅助提示:需要在“主”MySQL服务器上创建一个专用用户。以下是创建用户的SQL语句示例:
-- 创建用户CREATE USER 'replica_user'@'%' IDENTIFIED BY 'replica_password'; -- 授予执行复制任务的权限GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'; -- 确保更改生效FLUSH PRIVILEGES;
下一步:初始化“Data”目录
以管理员身份运行“CMD”(命令提示符)。
进入“BIN”目录并运行以下命令之一。在命令提示符中,它将类似于:
[CMD]// 进入驱动器C:// 进入BIN目录CD C:\mysql\bin
使用以下命令初始化“data”目录:
[CMD]// 方法1:// 为root用户分配空密码mysqld --initialize-insecure// 方法2:// 为root用户分配随机密码,在错误日志文件中获取密码mysqld --initialize// 如果选项文件不在默认路径上,请手动定义选项文件的位置mysqld --initialize-insecure --defaults-file=C:\other\folder\my.ini mysqld --initialize --defaults-file=C:\other\folder\my.ini
如前所述,选项文件的默认位置相对于mysqld.exe。
// mysqld.exe文件的位置: <路径>/bin/mysqld.exe// 选项文件预期位于:<路径>/my.inimysqld.exe路径示例:C:\database\mysql\v8.0.35\bin\mysqld.exe选项文件的默认预期路径:C:\database\mysql\v8.0.35\my.ini
这将在<根目录>下创建一个data目录。例如:
C:\database\mysql\v8.0.35\data// 根据上面的代码块的示例
如果使用“mysqld –initialize”命令初始化“data”目录,则可以在错误日志文件中找到密码,该文件的名称为:<计算机名称>.err
。按照上面的示例,它将类似于
C:\database\mysql\v8.0.35\data\mypcname.err
如果出现问题,您可以在错误日志文件中找到有关错误原因的提示。如果初始化成功,错误日志文件将类似于:
(假设您使用以下初始化命令:mysqld --initialize
)
2023-11-17T13:12:22.493220Z 1 [System] [MY-013576] [InnoDB] InnoDB初始化已开始。2023-11-17T13:12:23.244460Z 1 [System] [MY-013577] [InnoDB] InnoDB初始化已完成。2023-11-17T13:12:25.271888Z 6 [Note] [MY-010454] [Server]为root@localhost生成了一个临时密码:cQ<l/vxC0;P!
手动启动MySQL服务器:
// 如果选项文件位于默认位置mysqldor// 如果选项文件位于其他位置mysqld --defaults-file=C:\dbconfig\my\heavy-ram.ini
安装MySQL服务器的Windows服务
有两种方法安装用于运行MySQL服务器的Windows服务。
(安装服务)方法1:使用Windows命令提示符中的“sc
”命令。
注意:该服务将在“LocalSystem”权限下运行,非常适合MySQL服务器。
基本语法:
[CMD]sc create <service_name> binPath= "<path_of_mysqld> <path_option_file> <service_name>"start= <boot|system|auto|demand|disabled|delayed-auto>
例子:
[CMD]示例 1:sc create MySQL8.0.35 binPath= "C:\mysql\bin\mysqld.exe MySQL8.0.35" start= auto示例 2:sc create MySQL8 binPath= "C:\mysql\bin\mysqld.exe MySQL8" start= auto示例 3:sc create "MySQL 8" binPath= "C:\mysql\bin\mysqld.exe \"MySQL 8\"" start= auto
在binPath中包含选项文件(my.ini)的路径。
[CMD]// 在一行中执行示例 1:sc create MySQL8 binPath= "C:\mysql\bin\mysqld --defaults-file=C:\mysql\my.ini MySQL8" start= auto示例 2:sc create "MySQL 8" binPath= "\"C:\mysql 8\bin\mysqld\" --defaults-file=\"C:\mysql 8\my.ini\" \"MySQL 8\"" start= auto
注意:以下语法是不正确的:
[CMD]// 不正确的演示:// 等号'='后面必须有一个空格。sc create "MySQL8" binPath="C:\mysql\bin\mysqld.exe MySQL8" start=auto// binPath的末尾必须包含服务名称sc create "MySQL8" binPath= "C:\mysql\bin\mysqld.exe" start= auto// binPath中空格的服务名没有用双引号包起来sc create "MySQL 8" binPath= "C:\mysql\bin\mysqld.exe MySQL 8" start= auto
如果选项文件不在默认位置,您可以手动将路径指定为参数一起使用binPath
。以下是一个示例:
// 在单独的行中执行以下命令sc create MySQL8binPath= "\"C:\mysql\bin\mysqld.exe\" --defaults-file=\"C:\dbconfig\my-heavy-ram.ini\" MySQL8"start= auto
首次手动启动服务:
[CMD]net start MySQL8.0.35ornet start MySQL8ornet start "MySQL 8"
停止服务:
[CMD]net stop MySQL8.0.35ornet stop MySQL8ornet stop "MySQL 8"
删除服务:
[CMD]sc delete MySQL8.0.35orsc delete MySQL8orsc delete "MySQL 8"
编辑服务:
[CMD]// 更改binPathsc config MySQL8 binPath= "C:\db-engine\mysql\v8\bin\mysqld MySQL8"// 更改启动类型sc config "MySQL 8" start= auto
(安装服务)方法2:使用MySQL内置的mysqld
安装函数:
[CMD]// 安装服务mysqld --install "MySQL8"// 指定选项文件路径mysqld --install "MySQL8" --defaults-file="C:\mysql\my.ini"
将服务的启动模式从“需要/手动”更改为“自动”,然后启动服务:
// 将启动模式从 "手动" 更改为 "自动"sc config "MySQL8" start= auto// 首次手动启动服务net start "MySQL8"// 停止服务net stop "MySQL8"
无需使用Windows服务手动停止MySQL服务器:
[CMD]mysqladmin -u root -p -h localhost --port 3306 shutdown
设置/更改“root”用户的密码。
在CMD中,仍然在“BIN”文件夹中,使用程序“mysql”进入服务器:
[CMD]// 使用默认端口3306mysql -u root -p -h localhost// 如果服务器运行的端口不同,例如4001mysql -u root -p -h localhost --port 4001
- –
u
: 用户名 -p
: 提示输入密码-h
: 服务器主机位置--port
: MySQL服务器的端口号
接下来,MySQL将提示输入密码。如果你使用mysqld --initialize-insecure
进行数据初始化,密码将设置为空白。如果使用mysqld --initialize
进行初始化,则会生成一个临时的根密码,请查看错误日志文件以获取该密码。
若要设置或更改密码,请执行以下命令:
[CMD/MySQL]alter user 'root'@'localhost' identified by '在这里填写你的密码';
操作完成。MySQL服务器已经准备就绪。祝你使用愉快!
Leave a Reply