mysql8源码编译_MySQL代码学习第一——MySQL8.0.15源码编译

有日子没看MySQL源码了,不能再这样放纵自己了,让我们从8.0开始吧。

先看文档2.9 Installing MySQL from Source​dev.mysql.com2.9.2 Installing MySQL Using a Standard Source Distribution​dev.mysql.com4 Building MySQL Server with CMake​dev.mysql.com

我的Linux环境

[root@localhost ~]# uname -a

Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

安装高版本GCC

看到文档里需要GCC5.3以上版本,yum源里没有这么高版本的,编译一套吧。

先学习如何编译GCC,需要先安装一个GCC,然后编译高版本的GCC,有点先有鸡还是先有蛋的意思。

[root@localhost ~]# yum install -y gcc

下了5.5.0的GCC源码包,解压,进目录

一系列需要安装的包,中间由于缺包导致的cmake或者编译错误就不列了。

[root@localhost gcc-5.5.0]# yum install -y libmpc

[root@localhost gcc-5.5.0]# yum install -y gmp-devel

[root@localhost gcc-5.5.0]# yum install -y mpfr-devel

[root@localhost gcc-5.5.0]# yum install -y libmpc-devel

[root@localhost gcc-5.5.0]# yum install glibc 不确认这个需要不需要

[root@localhost gcc-5.5.0]# ./configure --prefix=/usr/local/gcc-5.5.0 --disable-multilib

[root@localhost gcc-5.5.0]# make

[root@localhost gcc-5.5.0]# make install

两个小时,比编译MySQL8.0时间长多了。

--prefix=/usr/local/gcc-5.5.0 指定了安装目录,不想和系统已有的gcc有冲突。

可以准备编译MySQL了

下载的是mysql-boost-8.0.15.tar.gz,包含了boost头文件的包。不然还得单独下载boost。

装个cmake

[root@localhost ~]# yum install -y cmake

建个编译用的目录,注意不要建在源码包解压后的目录下,否则cmake会报错。

[root@localhost source]# mkdir mysql8.0.15bld_debug

[root@localhost source]# cd mysql8.0.15bld_debug/

[root@localhost mysql8.0.15bld_debug]# yum install -y openssl-devel

[root@localhost mysql8.0.15bld_debug]# yum install -y ncurses-devel

设置环境变量,以便在编译的时候使用GCC5.5.0及其lib

[root@localhost mysql8.0.15bld_debug]# CC=/usr/local/gcc-5.5.0/bin/gcc

[root@localhost mysql8.0.15bld_debug]# CXX=/usr/local/gcc-5.5.0/bin/g++

[root@localhost mysql8.0.15bld_debug]# export CC CXX

[root@localhost mysql8.0.15bld_debug]# export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64

用cmake进行编译配置。

../mysql-8.0.15/ 是我源码解压后的目录;

-DCMAKE_BUILD_TYPE=Debug 是指明编译出一个用来debug(跟踪代码)的版本;

-DWITH_BOOST=../mysql-8.0.15/boost/boost_1_68_0/ 指明boost头文件在哪;

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql80 指明将来make install的时候,把MySQL软件安装在哪里,不设置的话,缺省是/usr/local/mysql;

[root@localhost mysql8.0.15bld_debug]# cmake ../mysql-8.0.15/ -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=../mysql-8.0.15/boost/boost_1_68_0/ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql80

[root@localhost mysql8.0.15bld_debug]# make

没报错就是成功了,再安装。

[root@localhost mysql8.0.15bld_debug]# make install

看一下结果

[root@localhost mysql8.0.15bld_debug]# ls -l /usr/local/mysql80/

total 808

drwxr-xr-x. 2 root root 4096 Apr 10 16:55 bin

drwxr-xr-x. 2 root root 4096 Apr 10 16:55 docs

drwxr-xr-x. 3 root root 4096 Apr 10 16:55 include

drwxr-xr-x. 5 root root 4096 Apr 10 16:55 lib

-rw-r--r--. 1 root root 335812 Jan 26 06:33 LICENSE

-rw-r--r--. 1 root root 101810 Jan 26 06:33 LICENSE.router

-rw-r--r--. 1 root root 335812 Jan 26 06:33 LICENSE-test

drwxr-xr-x. 4 root root 4096 Apr 10 16:55 man

drwxr-xr-x. 10 root root 4096 Apr 10 16:55 mysql-test

-rw-r--r--. 1 root root 687 Jan 26 06:33 README

-rw-r--r--. 1 root root 700 Jan 26 06:33 README.router

-rw-r--r--. 1 root root 687 Jan 26 06:33 README-test

drwxrwxr-x. 2 root root 4096 Apr 10 16:55 run

drwxr-xr-x. 28 root root 4096 Apr 10 16:55 share

drwxr-xr-x. 2 root root 4096 Apr 10 16:55 support-files

drwxr-xr-x. 3 root root 4096 Apr 10 16:55 var

大功告成,编译安装MySQL8.0成功了。

现在要把数据库初始化和启动起来

为Linux创建MySQL所使用的用户组和用户,并且更改datadir的属主和属组,此目录用来存放数据文件、日志、socket等。

[root@localhost ~]# groupadd mysql

[root@localhost ~]# useradd -g mysql mysql

[root@localhost ~]# mkdir /data/mysql8015

[root@localhost ~]# mkdir /data/mysql8015/datadir

[root@localhost ~]# chown mysql:mysql /data/mysql8015/datadir/

写个最简单的配置文件,测试环境,尽量不要放在缺省位置。

user:mysqld启动用的Linux用户

basedir:MySQL软件安装目录

datadir:数据文件所在目录

socket:mysql.socket 文件(用于本地socket方式登录)

mysqls.sock:mysqlx.sock 文件

这两个socket如果不指定,会放在/tmp/下面。

log-error:mysqld 日志文件,启动日志、错误日志,都要到这里看

[root@localhost ~]# vim /data/mysql8015/my.cnf

[root@localhost ~]# cat /data/mysql8015/my.cnf

[mysqld]

user = mysql

basedir = /usr/local/mysql80

datadir = /data/mysql8015/datadir

socket = /data/mysql8015/datadir/mysql.sock

mysqlx_socket = /data/mysql8015/datadir/mysqlx.sock

log-error = /data/mysql8015/datadir/mysqlerror.log

可以初始化数据库了。

export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64 就是前面源码安装gcc的恶果了,后面每次启动都少不了了,跟踪代码时启动也需要了。

--defaults-file=/data/mysql8015/my.cnf 是指定配置文件,依据这个文件进行初始化,创建系统表、InnoDB需要的文件等等。

[root@localhost ~]# cd /usr/local/mysql80/

[root@localhost mysql80]# export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64

[root@localhost mysql80]# bin/mysqld --defaults-file=/data/mysql8015/my.cnf --initialize --user=mysql

[root@localhost mysql80]# ls -l /data/mysql8015/datadir/

total 155716

-rw-r-----. 1 mysql mysql 56 Apr 11 10:29 auto.cnf

-rw-------. 1 mysql mysql 1680 Apr 11 10:29 ca-key.pem

-rw-r--r--. 1 mysql mysql 1112 Apr 11 10:29 ca.pem

-rw-r--r--. 1 mysql mysql 1112 Apr 11 10:29 client-cert.pem

-rw-------. 1 mysql mysql 1676 Apr 11 10:29 client-key.pem

-rw-r-----. 1 mysql mysql 5750 Apr 11 10:29 ib_buffer_pool

-rw-r-----. 1 mysql mysql 12582912 Apr 11 10:29 ibdata1

-rw-r-----. 1 mysql mysql 50331648 Apr 11 10:29 ib_logfile0

-rw-r-----. 1 mysql mysql 50331648 Apr 11 10:29 ib_logfile1

drwxr-x---. 2 mysql mysql 4096 Apr 11 10:29 #innodb_temp

drwxr-x---. 2 mysql mysql 4096 Apr 11 10:29 mysql

-rw-r-----. 1 mysql mysql 438 Apr 11 10:29 mysqlerror.log

-rw-r-----. 1 mysql mysql 25165824 Apr 11 10:29 mysql.ibd

drwxr-x---. 2 mysql mysql 4096 Apr 11 10:29 performance_schema

-rw-------. 1 mysql mysql 1680 Apr 11 10:29 private_key.pem

-rw-r--r--. 1 mysql mysql 452 Apr 11 10:29 public_key.pem

-rw-r--r--. 1 mysql mysql 1112 Apr 11 10:29 server-cert.pem

-rw-------. 1 mysql mysql 1680 Apr 11 10:29 server-key.pem

drwxr-x---. 2 mysql mysql 4096 Apr 11 10:29 sys

-rw-r-----. 1 mysql mysql 10485760 Apr 11 10:29 undo_001

-rw-r-----. 1 mysql mysql 10485760 Apr 11 10:29 undo_002

看一下日志,有什么问题一般都在日志里提示

[root@localhost mysql80]# more /data/mysql8015/datadir/mysqlerror.log

2019-04-11T02:29:28.656728Z 0 [System] [MY-013169] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server in progress as process 35097

2019-04-11T02:29:33.955250Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: o2gR?o)&zAxo

2019-04-11T02:29:40.976791Z 0 [System] [MY-013170] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server has completed

里面提示的临时密码,要在初次登录mysqld时使用。

可以启动了

[root@localhost mysql80]# bin/mysqld_safe --defaults-file=/data/mysql8015/my.cnf --user=mysql &

[1] 35152

[root@localhost mysql80]# 2019-04-11T02:30:18.585133Z mysqld_safe Logging to '/data/mysql8015/datadir/mysqlerror.log'.

2019-04-11T02:30:18.604090Z mysqld_safe Starting mysqld daemon with databases from /data/mysql8015/datadir

看看进程和日志

[root@localhost mysql80]# ps -ef|grep mysql[d]

root 35152 34026 0 10:30 pts/0 00:00:00 /bin/sh bin/mysqld_safe --defaults-file=/data/mysql8015/my.cnf --user=mysql

mysql 35301 35152 32 10:30 pts/0 00:00:02 /usr/local/mysql80/bin/mysqld --defaults-file=/data/mysql8015/my.cnf --basedir=/usr/local/mysql80 --datadir=/data/mysql8015/datadir --plugin-dir=/usr/local/mysql80/lib/plugin --user=mysql --log-error=/data/mysql8015/datadir/mysqlerror.log --pid-file=localhost.localdomain.pid --socket=/data/mysql8015/datadir/mysql.sock

[root@localhost mysql80]# more /data/mysql8015/datadir/mysqlerror.log

2019-04-11T02:29:28.656728Z 0 [System] [MY-013169] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server in progress as process 35097

2019-04-11T02:29:33.955250Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: o2gR?o)&zAxo

2019-04-11T02:29:40.976791Z 0 [System] [MY-013170] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server has completed

2019-04-11T02:30:18.951460Z 0 [System] [MY-010116] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) starting as process 35301

2019-04-11T02:30:21.044850Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2019-04-11T02:30:21.176105Z 0 [System] [MY-010931] [Server] /usr/local/mysql80/bin/mysqld: ready for connections. Version: '8.0.15-debug' socket: '/data/mysql8015/datadir/mysql.sock' port: 3306 Source distribution.

2019-04-11T02:30:21.286433Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/data/mysql8015/datadir/mysqlx.sock' bind-address: '::' port: 33060

登录,输入前面日志中记录的临时密码。然后把密码改成“最强”密码,空的,测试环境嘛,没必要给自己制造麻烦。

[root@localhost ~]# /usr/local/mysql80/bin/mysql -S /data/mysql8015/datadir/mysql.sock -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 8

Server version: 8.0.15-debug

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> alter user root@localhost identified by '';

Query OK, 0 rows affected (0.00 sec)

mysql> exit

Bye

不用密码登录,测试一下

[root@localhost ~]# /usr/local/mysql80/bin/mysql -S /data/mysql8015/datadir/mysql.sock -uroot

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 9

Server version: 8.0.15-debug Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.01 sec)

这下环境都好了,终于可以开始跟踪代码的工作了。

官方文档写得非常好,上面的工作看文档都可以做出来了,赞一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值