0%

mysql源码编译[windows版本]

笔记重点:

  • windows下编译mysql,主要是要注意编译过程中遇到的各种编码问题;
  • 与类unix平台不同的是可以用wolfssl代替,windows下只能使用openssl;
  • 本笔记编译的mysql版本为8.0.18,版本比较新,所涉及到的依赖库有对应的版本,如用其他版本代替可能会出现无法预料的问题.

一. 源码下载

二. 编译前准备工作

  • boost_1_70_0文件夹解压到mysql-8.0.18\boost\下
  • 按照 这个编译安装openssl库;添加OPENSSL_ROOT环境变量为openssl安装目录
  • 安装bison;这个是生成mysql的内部sql语句要用的解析器,增加bison目录到系统path中
  • sql脚本更改:
    mysql-8.0.18\scripts\fill_help_tables.sql中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- SET NAMES 'utf8';改成utf8mb4
    SET NAMES 'utf8mb4';

    -- ...
    -- 搜索PI行注释掉
    -- INSERT INTO help_topic (help_topic_id,help_category_id,name,description,example,url) VALUES (160,13,'PI',
    -- 搜索RADIANS注释掉这行
    -- INSERT INTO help_topic (help_topic_id,help_category_id,name,description,example,url) VALUES (163,13,'RADIANS',

    mysql-8.0.18\scripts\mysql_system_tables.sql中

    1
    2
    3

    -- SET @cmd = "CREATE TABLE IF NOT EXISTS help_topic 这一行的编码格式由utf8改成utf8mb4
    SET @cmd = "CREATE TABLE IF NOT EXISTS help_topic ( help_topic_id int unsigned not null, name char(64) not null, help_category_id smallint unsigned not null, description text not null, example text not null, url text not null, primary key (help_topic_id), unique index (name) ) engine=INNODB STATS_PERSISTENT=0 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin comment='help topics' ROW_FORMAT=DYNAMIC TABLESPACE=mysql";

三. 编译源码

3.1 建立源码外编译目录
1
mkdir -p mysql-8.0.18\build && mysql-8.0.18\build
3.2 使用cmake进行配置

在build目录生成MySQL.sln,以下用到的参数均可以在mysql的官方文档中找到;另外在这里没有特别配置的比较重要的选项是
DEFAULT_CHARSET默认值是utf8mb4,DEFAULT_COLLATION默认值为utf8mb4_0900_ai_ci,另外CMAKE_BUILD_TYPE的默认选项不是release,而是RelWithDebInfo.

1
2
3
4
5
6
7
8
cmake .. -DCMAKE_INSTALL_PREFIX=F:\\mysql \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_BOOST=F:\\mysql-8.0.18\\boost\\boost_1_70_0 \
-G "Visual Studio 15 2017 Win64" \
-DWITH_SSL=f:\\openssl_dev \
-DCMAKE_BUILD_TYPE=Debug
3.3 命令行编译MySQL.sln

这里需要说明的是,第一遍编译时会产生编译错误

  • mysql-8.0.18\build\scripts\sql_commands_help_data.h
  • mysql-8.0.18\sql\sql_local.cc
    他们的代码页编码格式会导致编译错误;处理方式是先找出高级保存选项;然后将代码页保存Unicode 代码页 1200;
  • mysql-8.0.18\storage\innobase\api\api0api.cc的line 3309,line 3310的strtok_r改成strtok_s

命令行编译命令如下,如果机器配置好编译时间会短点.

1
devenv.com MySQL.sln /Build "Debug|x64"

四. 安装启动

安装命令

1
devenv.com MySQL.sln /Build "Debug|x64" /project INSTALL

安装完成以后可以通过命令初始化数据库实例,使用—initialize和—initialize-insecure的区别是后者的root密码为空.

1
mysqld --initialize-insecure --console

结论:

可以参照mysqld启动流程也可以通过查看源码理解,mysql的系统表的初始化是通过内置的sql语句产生的.这个sql语句集中在build/scripts下.
比如文件sql_commands_help_data.h中,代码页中夹杂这sql语句,而sql语句又有编码格式问题,因此我不建议在windows平台下使用其他文本工具打开这个文件,通过上述提到的代码页保存方式为最保险的方式;目前mysql-8.0.18已经默认使用utf8mb4,如果使用原来的utf8(utf8mb3),插入宽字符时有可能遇到’Incorrect string value’错误.这是个非常值得注意的地方。