引
很多情况下需要在客户端发布时发布 MySQL 数据库,这种发布方式虽然存在文件资源较大、易出错等缺点,但是却可以让桌面产品的发布更加完整。
本文将阐述如何使用一个脚本启动并初始化 MySQL 8.0 的方法,涵盖数据库下载、脚本源码、测试及可能遇到的问题等。
步骤
1、下载 MySQL 8.0.xx 绿色版
官网下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-winx64.zip
在官网下载后将其解压,目录结构如下:
2、初始化脚本
准备初始化数据库脚本如下:
-- 删除原数据库
DROP DATABASE IF EXISTS xzbd;
-- 创建数据库 xzbd , IF NOT EXISTS 可以不写
CREATE DATABASE IF NOT EXISTS xzbd;
-- 使用数据库 xzbd
USE xzbd;
-- 创建表(初始化表)
CREATE TABLE IF NOT EXISTS customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(255)
);
-- 插入数据
INSERT INTO customers(id, name, email) VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com'),
(3, 'Carol', 'carol@example.com');
将上述脚本命名为 init.sql ,放在MySQL解压后的根目录(bin 目录同级的目录)
3、启动脚本
@echo off
rem 设置 MySQL 用户名和密码
set MYSQL_USERNAME=root
set MYSQL_PASSWORD=123456
rem 设置 MySQL 端口号,默认为 3306
set MYSQL_PORT=3306
rem 设置 MySQL 根目录路径,根据实际情况调整路径
set MYSQL_HOME=%cd%
rem 设置 SQL 初始化文件的路径
set SQL_INIT_FILE=%~dp0init.sql
rem 初始化 数据存储目录
"%MYSQL_HOME%\bin\mysqld" --initialize-insecure
rem 启动 MySQL 服务
echo Starting MySQL server...
"%MYSQL_HOME%\bin\mysqld" --port=%MYSQL_PORT% --console --user=%MYSQL_USERNAME% --bind-address=127.0.0.1 --datadir="%MYSQL_HOME%\data" --shared-memory --init-file="%SQL_INIT_FILE%"
echo
if %errorlevel% neq 0 (
echo Failed to start MySQL server.
exit /b %errorlevel%
)
echo MySQL server started successfully and new database created.
exit /b 0
脚本中定义了用户名、密码、端口和初始化脚本等信息。
将上述脚本命名为 start.bat ,放在MySQL解压后的根目录(bin 目录同级的目录)。
最终的文件目录结构如下所示:
启动
双击 start.bat
即可打开一个窗口,开始启动数据库
上图中看到 ready for connections. Version: '8.0.33' socket: '' port: 3306 MySQL Community Server - GPL.
表示,数据库启动成功。
连接测试
本章将使用 CMD 命令行工具和 DbEaver 两种方式测试 MySQL 的连接。
1、命令行工具测试
新开一个窗口,进入到数据库的 bin 目录中执行下列命令
mysql -u root -p
效果如下:
2、客户端工具测试
使用 DbEaver 连接测试
1、编辑连接
2、测试连接
3、连接并查看信息
遇到的问题
1、start.bat 脚本执行后,MySQL 启动成功了,但是被挂起了,并没有执行到后面的部分。
该问题暂时没有解决,将持续更新。
2、MySQL 启动成功了,并不能使用指定的密码登录,使用密码会报 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
该问题暂时没有解决,将持续更新。
3、 [ERROR] [MY-000061] [Server] 1062 Duplicate entry '1' for key 'customers.PRIMARY'.'
该问题已解决,原因是 init.sql 执行前没有清除数据,多次尝试启动时会报这个错误。
解决方案:在 init.sql 脚本中使用清除历史数据,如加入以下语句。
-- 删除原数据库
DROP DATABASE IF EXISTS xzbd;
-- 创建数据库 xzbd , IF NOT EXISTS 可以不写
CREATE DATABASE IF NOT EXISTS xzbd;
4、[ERROR] [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
该问题已解决。
解决方案在 bat 脚本中增加参数 --shared-memory
。
5、MySQL 启动成功了,但是3306端口连接不上
原因是启动脚本中添加了 --skip-grant-tables
参数,根据官方文档,加了该参数后,mysql 启动后的端口默认为 0 ,经测试,确实如此。从启动时Console 中打印的日志 [System] [MY-010931] [Server] D:\apps\mysql\mysql-8.0.33-winx64\bin\mysqld: ready for connections. Version: '8.0.33' socket: '' port: 0 MySQL Community Server - GPL.
,也可以看到 prot:0
该问题已经解决。其中原因详情可查看官方文档。
解决方案: 去掉启动参数 --skip-grant-tables