很多情况下需要在客户端发布时发布 MySQL 数据库,这种发布方式虽然存在文件资源较大、易出错等缺点,但是却可以让桌面产品的发布更加完整。

本文将阐述如何使用一个脚本启动并初始化 MySQL 8.0 的方法,涵盖数据库下载、脚本源码、测试及可能遇到的问题等。

步骤

1、下载 MySQL 8.0.xx 绿色版

在官网下载后将其解压,目录结构如下:

mysql8数据库初始化 mysql初始化数据库表_sql

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 目录同级的目录)。

最终的文件目录结构如下所示:

mysql8数据库初始化 mysql初始化数据库表_mysql_02

启动

双击 start.bat 即可打开一个窗口,开始启动数据库

mysql8数据库初始化 mysql初始化数据库表_sql_03


上图中看到 ready for connections. Version: '8.0.33' socket: '' port: 3306 MySQL Community Server - GPL. 表示,数据库启动成功。

连接测试

本章将使用 CMD 命令行工具和 DbEaver 两种方式测试 MySQL 的连接。

1、命令行工具测试

新开一个窗口,进入到数据库的 bin 目录中执行下列命令

mysql -u root -p

效果如下:

mysql8数据库初始化 mysql初始化数据库表_sql_04

2、客户端工具测试

使用 DbEaver 连接测试

1、编辑连接

mysql8数据库初始化 mysql初始化数据库表_数据库_05


2、测试连接

mysql8数据库初始化 mysql初始化数据库表_sql_06

3、连接并查看信息

mysql8数据库初始化 mysql初始化数据库表_MySQL_07

遇到的问题

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